|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
7 ]9 F& E- ?7 _3 G/ t1 j/ u 2 h' ^' Q( G% W8 M, ]9 }% k" a
以下是主框架代码:) ]! b- b! S8 b1 i% B( M
- ;======================================================================8 `1 a) v2 g1 a
- ;文件头
2 l2 Z/ K! N3 L1 O2 s) R - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量6 v# l8 k, q; _2 e( ^
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
" T5 q/ b: a7 b - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
) J: K; D7 G, u9 J/ q& V& R2 L$ k4 T - ;======================================================================
: c$ B; C4 c" t. V# a" Z - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2) r: s0 f1 ]7 z; ]9 h& [% G
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
6 g+ i+ i+ r' F# u1 L; s - ;======================================================================. {' @; w# t: e( t
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1' m0 J5 B7 I6 u: `1 |- p
- RESET_ADDR = $E000 ;主程序起始地址
3 n) W$ j6 ~* @' C0 i% U/ @ - ;======================================================================* z* w8 {) `$ h0 y/ Z8 _: u+ ]( v
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB5 E7 a- g6 F4 _4 e6 s$ Q( R0 o
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB' w7 s% z& }% ] H3 {! a. J3 d
- .INESMAP 4 ;Mapper号 (0-4095). z# ~. d" I3 K" y
- .INESSUBMAP 0 ;子Mapper号 (0-15). u. Z8 `* y& h% d! ~
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
! R. e$ O% m+ o! g O - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
% _; n- s, a9 P" |* M - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
. ?& i! U6 Q- P4 ~5 t - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)( K: {) w: R$ ~- v3 P7 D, i
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)' H8 `2 F9 A+ u
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)5 l' a0 x! J3 M+ f: l; C6 C' X
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
. Z+ `5 w: M4 g" e: e- d - ;======================================================================
# Q# y6 e$ [" t2 t. E - .INCLUDE "fc_demo_config.asm" ;全局配置0 v8 N# ]% i, ]; \$ `$ O) C% g
- .INCLUDE "fc_demo_constant.asm" ;NES常量
! e- o0 J& p; C7 P9 j - ;======================================================================
2 m% A( O' y: J, Z0 } - ;音乐配置5 z2 a4 T Z! K2 T- ^/ h, H
- .IF 0 = MUSIC_THEME " X5 V& ?/ z- k* H
- .INCLUDE "data/music/Gremlin 2/config.asm"
. m6 P5 k' ~0 \* x - .ENDIF8 ]& N5 P( B* Z; q: k
- 6 ^) D' t' |0 O; k \0 v$ x
- .IF 1 = MUSIC_THEME
! h. ^$ Z* }) x7 ?! K& j: c - .INCLUDE "data/music/Raf World/config.asm"
5 ]) B% b! T' h; b! ]4 K" m, X - .ENDIF U* i- I4 M c0 H' o8 g
- ; O+ y1 C: a; D- D: }# Y" M0 ]
- .IF 2 = MUSIC_THEME
: u0 x, K+ G+ ^- U/ R! D - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
! |; G2 `# b: c8 k; o$ E( h - .ENDIF+ g/ [6 s% b/ y# W* ~0 y* `' R
5 a1 @! N$ g" v+ N6 ^- ;======================================================================: A' _- k. \1 ~
- ;引用CHR图像数据
. ]# t. M4 `4 O* _. w/ { - .BANK NES_16KB_PRG_SIZE * 2
% P& I3 I9 O7 K4 b" r& w, ^ - .ORG $0000
- S- n& ~0 q" p9 z* t. g8 m6 ~6 L - .INCBIN "data/bkg.chr"
& `; l( \6 v ]5 z" {! Z( K - .INCBIN "data/sp.chr"& C1 R& \& M& e- e( l B5 c
- , P* o! \: b$ T2 s$ p) H: c0 Z! J
- ;======================================================================
8 v, N4 u0 [: U/ F - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
+ q+ C' x( W( d* A+ a9 C* z - .ORG RESET_ADDR' }7 K8 C; M, E( e. w) T+ E0 a
- ;======================================================================
& p; s" m; ]! L% q5 F+ C - ;引用其他源文件
" u$ s2 u4 K# F0 K) ?! { - .INCLUDE "fc_demo_ppu.asm" ;PPU处理, i3 f, A: y# Z: k" J" e& U
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理 O+ W& d* m! a8 V: ?
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理* v$ {9 \% d: j
- ;======================================================================
; B" w( t, B" e! h. G
5 l- A- q& w0 C. d5 O- ;======================================================================
( T. ]( W: r+ K+ j9 T - ;等待VBlank到来
1 N9 O9 s) q3 W' ~& ~2 ^ - Wait_For_VBlank. W$ n! i3 t9 m* R: j, c9 L
- LDA PPU_STATUS
6 M- L* r+ ]: M, T z! T& [ - BPL Wait_For_VBlank+ [9 g# `. \8 N0 l! E( d: H9 v- i
- RTS
5 ^4 t5 E& U M, v/ I - 0 U% `" O1 V( D* k
- ;======================================================================
$ r; O0 {- n, {! j1 ] - ;调色板初始化
; w6 B P. F" P; I' @ - Palette_Init/ R) I7 {2 T2 w6 p
- LDA #$3F
: ?7 C5 r& W- Q/ Q) j - STA PPU_ADDRESS5 i$ n! `. ?, Q
- LDA #$00
& p; J- {! T# P" ~% P, z - STA PPU_ADDRESS
. L0 _1 \7 C5 y+ }4 g7 T6 b. e - LDX #$00
7 l/ H6 o5 b/ H/ q+ W* _, {4 a7 _( \ - LDY #$20, M2 l) |; S! H8 }$ x D4 r
- .Write_Data+ |- z1 ~ P0 l) i9 k
- LDA Palette_Data,X
0 s% g4 v/ x2 M# g - STA FC_PPU_Pal_Addr,X( p2 H0 J( G r
- INX
: q; H5 |$ [% b( b2 j - DEY, O0 a+ \; Z; X$ L5 q% U
- BNE .Write_Data
) W: o; ]9 e0 Z7 C7 t- D - .End
0 h* Y A% d$ K, P' v9 v2 y - RTS; {! f7 G* N! u! ?, w' }
% Q; Z8 H$ \: i, W/ I- T! K p7 O- ;----------------------------------------
$ H) |: O$ x! r, y- Q w - ;调色板数据& E6 Z9 t/ z9 s5 d
- Palette_Data- L, N. ^9 e$ l3 W$ b9 K4 \- c
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
0 y) A' Y6 G& [: @ e& d - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22( S0 T+ C# H; D3 ^
- * X: n; M9 e9 {+ I
- ;======================================================================
9 w# y' z9 s n- \ - ;命名表清空! |: K! [4 w2 T8 R9 z
- Nametable_Clear n. o+ N: T8 P# S. y7 N
- LDA #$204 W6 [4 `! ?7 `* z8 C, R* U
- STA PPU_ADDRESS
6 y3 z5 G/ E+ [/ F! u - LDA #$006 b, g2 t3 K# w/ d
- STA PPU_ADDRESS
+ M( j r! Z1 y' W: O A, f - LDA #$00
8 L& _0 s4 w1 Z- }& |9 Q# [: A! I - LDX #$00
. h; T- u2 N- Z4 E3 M - LDY #$08/ b$ E: h+ U$ d
- .Write_Data
- i! H! S" Q; V* [$ X' [ - STA PPU_DATA
7 }5 D2 s4 ^& s+ @# { - INX
. a& c2 r3 l8 c% S - BNE .Write_Data
7 G6 p# s) @5 S - DEY1 F V' d3 a4 F" v' F$ C
- BNE .Write_Data U/ R& W3 a- y2 X% ^. @* C
- .End5 [1 A' M( a& [& W: |* z
- RTS8 B) `( n4 n/ C& e$ I9 V
. H# u: i4 p6 D- ;======================================================================
7 ?. X, h2 W. G% ~/ j3 z - ;音乐曲目切换
o+ Q3 q9 Y1 @" f( p8 k$ E7 F* A2 Y - Music_Select_Process# y- ]+ [, c/ ] w4 E- u7 s
- - {/ L7 k; t$ k% G$ ^' ]" [2 Z4 R
- .Pre_Music;上一曲9 ]+ K! o% k9 Z' g1 k! ~+ ?
- LDA FC_Gamepad_Once( D1 z9 m5 W7 u8 B
- CMP #JOY_KEY_LEFT
9 O) \+ j( T. s, V6 o) _& @' @9 [ - BNE .Next_Music
* U& I. V2 v% a) W. z, D - JSR Music_Play_Pre
6 |5 u% V$ }! Z - .Next_Music;下一曲
; j8 g. p. Z$ t2 l8 { - LDA FC_Gamepad_Once1 v6 I0 G1 X& K+ @
- CMP #JOY_KEY_RIGHT
]9 n+ g b( \ A) K - BNE .Next_10_Music* C" U7 z1 h) i& m+ N3 c9 O
- JSR Music_Play_Next) i/ w5 C0 W7 v2 Q* N! ^2 j
- .Next_10_Music;上10曲1 @( h' ?3 t9 \- R) W0 ]2 _; e$ {1 N
- LDA FC_Gamepad_Once f% h5 G. V M% G! Z. Y. F# k
- CMP #JOY_KEY_UP
! V v- z, w0 F - BNE .Pre_10_Music7 e D. E# \5 _ y$ E# k
- JSR Music_Play_Next_10
7 W0 B/ Y" v7 V - .Pre_10_Music;下10曲/ t# x# l- e3 ] [3 m3 R" f8 _
- LDA FC_Gamepad_Once. P5 f/ h7 B0 l" _5 K! {. N- k
- CMP #JOY_KEY_DOWN
N H) v9 u9 q3 s# B - BNE .Reset
) x" @+ N8 I9 w9 W - JSR Music_Play_Pre_10* r( I1 D/ |- [! K
- .Reset;重播当前曲目: R( V$ `' x7 B$ j
- LDA FC_Gamepad_Once
' {' h: @* G% Z; T: q- i% T - CMP #JOY_KEY_START. ]9 Y1 J5 S5 e" V; o9 H# Y
- BNE .End
# O% V7 B- j% s - LDA FC_Music_Index' I6 U- w, H& I, L
- JSR Music_Init_Process
( S3 W, Z& b' K# X5 j3 x( ]! ~ - .End
" T* v+ g3 d5 h: X8 ]0 | - RTS
F+ c; V$ z. D! p% ]2 S$ o - : K2 F9 x+ E) D) B
- ;----------------------------------------------------------------------0 }" c+ H1 ], v O1 m1 n+ T
- ;播放上一曲. v! V& c/ E) Q$ U6 b
- Music_Play_Pre o- N/ K2 h7 `% C7 m6 |
- LDA FC_Music_Index
8 J5 Q' Q. F- M" z - BEQ .End
3 W% [1 Q0 t8 D5 }9 x/ ? - DEC FC_Music_Index0 l0 ` f0 C$ S- t, e$ F
- LDA FC_Music_Index
1 @6 B2 y8 K) h. K8 f) x$ I - JSR Music_Init_Process
9 w, c& d a+ [9 e8 P - .End
9 h# Z# F2 Q/ d4 a P - RTS4 y/ I [) u* o1 K0 Y' [1 M* d% m t4 v
- ;----------------------------------------------------------------------0 o1 Y" V% y) \0 q6 K
- ;播放下一曲
, a7 x' ] y7 F9 c, _* c( I) f - Music_Play_Next
- g+ I* U2 y# Z$ [ F0 M - LDA FC_Music_Index
- J, @# k' m- {3 a N4 X% N - CMP FC_Music_Max_Index( p- [! ^2 I$ x; p
- BCS .End
% e& h* y1 L" i0 I& F$ q - INC FC_Music_Index# l( V' z( V5 r4 v" K4 i2 I
- LDA FC_Music_Index1 \! ^- `3 l! Y8 k8 V
- JSR Music_Init_Process. B# q) X/ B8 H4 t# v. N+ _9 ^5 c; p
- .End
2 E8 S- G1 ]3 o$ ]' d6 T+ v - RTS
* N3 O8 _4 q( Z - " l- u4 w% K" w" T
- ;----------------------------------------------------------------------
1 a6 M; h- Q Z. w! ] - ;播放上10曲; f% z- Q% Q) K7 L
- Music_Play_Pre_104 ]% K# z6 J/ `# h+ W- x4 I7 A
- LDA FC_Music_Index
9 e6 ~: x" Z+ V# I6 F - BEQ .End
1 S1 Y6 ?7 W3 J6 @% e- D6 D - SEC' P, Y2 L( H( V1 w' ^
- SBC #10
1 ?/ y/ S& c6 u' e9 t8 d - BCS .Pre_10
3 ~ Q, o& j$ N, @0 K) M6 d- y - LDA #$001 n! ^/ J6 u' u+ Y
- .Pre_10/ \0 r) O3 ?9 N% y/ Q9 H
- STA FC_Music_Index
5 C: [2 g7 |, n0 G - JSR Music_Init_Process* k" H( R" B4 Y: ?
- .End! t z' n8 C9 T( q
- RTS
& g- G7 w2 k8 W8 ? - ;----------------------------------------------------------------------
$ q+ s: a8 K4 p" ? - ;播放下10曲
6 s( T% i" F* L - Music_Play_Next_10
) s: N6 ~8 V, H3 x - LDA FC_Music_Index
: l. m6 Y/ j/ {" s0 C- n2 q - CMP FC_Music_Max_Index1 b$ y; b' t! K& \: p
- BCS .End
) \+ z. ]/ `' P* N - CLC5 d/ n/ _% W, q% w2 |! L
- ADC #10- r& s! M& O/ [
- CMP FC_Music_Max_Index+ `- E( O; q, I; U8 |9 s
- BCC .Next_105 v' J; Z+ s8 |; R) I4 n/ L; @
- LDA FC_Music_Max_Index
( D/ Z' I8 ~3 C" P/ B! N) |- \) b - .Next_10
9 Y/ g# H7 b" j- z. U0 v$ d - STA FC_Music_Index5 Q$ p/ j2 u2 Y% I' w+ W3 P) s
- JSR Music_Init_Process0 R- i5 D: c% {4 ]
- .End
0 J: ~( U+ B b: Y7 r - RTS% O) |5 w4 F, R8 Y, w4 f: c
- " u( P5 t4 s1 h; g# y* {
- ;----------------------------------------------------------------------" v; C9 z; T7 b
- ;8位十六进制转3位十进制制0 |- G9 P! }- {# [5 y. J1 z% T) }
- Hex8ToDec
: J9 N2 V1 `; \. N' a Q - STA FC_Dec_Data_1
# s" S* {4 F% O1 [0 Q/ f8 h$ |& ] - LDA #$00" M( `5 [4 S/ g/ M+ l) P
- STA FC_Dec_Data_100
( z h! X5 h2 P: J - STA FC_Dec_Data_10; N0 q& a& f3 {4 ]
- LDA FC_Dec_Data_13 C. L% a1 [9 H
- .Convert_100
+ ?. B Q' F) w1 j8 F - CMP #100
, R: m. x! I0 C% H$ h - BCC .Convert_10
7 ?0 O& ^' b Y9 }$ \ - SEC
- V% A. V8 \: {" W - SBC #100
. j* w* \. z; t( Y! s6 N4 ~ B - INC FC_Dec_Data_100
3 N9 K& `( |5 [6 u7 @9 d - BNE .Convert_100
0 w7 R1 T' [% }8 B0 v. l2 B - .Convert_10
, r' j# r3 S: R$ c - CMP #10
8 f% F- C9 F' Y8 T6 @7 A4 R/ i4 D# ` - BCC .End
$ D! [7 A q$ O+ h# _# @0 X* L - SEC: ^6 v9 \9 U0 U4 \7 l
- SBC #10% G4 @9 X5 ^; g6 c+ u- k( {' `
- INC FC_Dec_Data_10! U, j% m" c! G1 }# i/ y; N
- BNE .Convert_10
* H# i' c8 o d1 n, f# r3 | - .End
6 n8 U# _5 @, F' [3 w - STA FC_Dec_Data_1
* J3 a, d& |! d- o: Y! s - RTS
) m% y! U9 E" `- k' j8 Y" u* H* { - $ U2 _* B" O& N0 [' n; |; m
- ;----------------------------------------------------------------------+ g e L( a6 l& M1 d
- ;显示曲目信息5 ~2 r7 Q5 T- v, U! @& _
- Music_Info_Display8 b/ n6 G+ Y4 y3 u! w5 c
- LDX FC_PPU_Buf_Count
" C9 N) H4 b) @: v1 I* _ - LDA #PPU_WRITE_MODE_CNT_LINE2 J# ?9 v3 W, L) J* S% M, Y) U
- STA Use_PPU_Buffer,X
* J# A( `; t4 d/ S- Y- I- u# G - INX/ c; h3 z% {/ |) O, o# J' S
-
% D8 G) n; O4 J% @! R& t( l7 n - LDA #>MUSIC_INFO_POS
4 d! q) Y- {4 D7 ^5 `) S. l! _8 V - STA Use_PPU_Buffer,X
Y+ [& x9 H* r- W - INX" d4 n4 P+ ~7 P8 }1 |
- / G# p6 J& M" {: Q- d# d
- ;居中
, ]8 n( l. a5 h; j4 k - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
& U# b Q/ k2 f3 E. f* S6 Z - STA Use_PPU_Buffer,X
: @; C( i E A* [' H# g - INX
( L" { r" l; O( l7 F) j - ! L/ C/ B! z4 v
- LDA #$05
* N1 ~- u& x8 O0 A5 B7 B$ S E - STA Use_PPU_Buffer,X
3 w+ c! H: m9 Q3 ? Z/ e - INX' T5 q. t4 R A }& Q) V
- 7 D0 |+ p% o/ t' f+ ]9 x# p
- LDA FC_Music_Index7 q X# N7 i9 ]" x
- CLC
; Z5 O, w( Y R0 ^% K# `" h6 M - ADC #$01
! k2 A- P; N1 H; ^ - JSR Hex8ToDec
$ D! b, h1 L! E! ~ - 3 P7 N1 h/ ~/ N" s
- LDA FC_Dec_Data_10
7 `( [5 C% I9 b- ]: N* M - CLC8 P* Q+ ]& t/ B
- ADC #'0'4 q. J" j( k0 u. D4 I& q# C
- STA Use_PPU_Buffer,X
V$ K( h& ]' l8 C y - INX* @9 R& r. k- Y- \0 C A
- 1 `/ { x/ F3 V
- LDA FC_Dec_Data_1
! T3 v2 ~! `8 T( F - CLC
! A, E% J) L, `3 n: e7 G/ _ - ADC #'0'
) q- L$ A! B9 `& a& h+ l$ O - STA Use_PPU_Buffer,X
8 x: }+ i6 n/ k; w8 y - INX
' S& j# U$ ?5 N1 W7 x3 L' B5 K2 i$ X - 3 d6 N: ]' z; Q
- LDA #'/'
, O& U9 X5 z! _/ { - STA Use_PPU_Buffer,X
7 n) W7 A& a# W) l" f1 m' w - INX
' j+ w' ^# {' b& f0 V6 v - ^$ I: T! t& k% ^5 a; j) q
- LDA FC_Music_Max_Index& v! U% j P: z, J! [
- CLC
0 i" W% k. ~5 S* _* ] - ADC #$01
$ e* g9 y Q* r( ~* R$ } - JSR Hex8ToDec H% W4 I$ i: o0 C
-
$ Q3 n9 Z. H8 ~0 T- F# x6 e7 b - LDA FC_Dec_Data_101 X `, }( Q6 [4 u
- CLC
6 c* F& Y, F3 y) {0 z$ A* X% y - ADC #'0'2 ]# H6 L4 Z4 ]% [
- STA Use_PPU_Buffer,X' }8 T' l, y+ ~3 s" `$ C
- INX2 H5 Q( s6 s# V6 m* m
-
/ n- Z0 D$ o" S/ B - LDA FC_Dec_Data_17 n5 L5 W3 y" l) E$ {" u2 G
- CLC( N4 x z' R7 P" S+ T# Z
- ADC #'0'1 Y) K" @" h; S6 M, |9 b
- STA Use_PPU_Buffer,X
( I& m& _) e" P) ^+ o* o0 r - INX
- _* |/ R; j2 j4 L - 7 W2 K1 A% R& m9 }
- .End* D% q4 X$ }* |4 p
- STX FC_PPU_Buf_Count
2 z( U. i, N2 J( G6 q) d - RTS2 ]! W! d7 D. Y! r: y
1 \. o6 p, C1 y: a6 W1 p; d( \& D" ~- ;----------------------------------------------------------------------1 y. K$ I/ }8 w5 H+ G8 j' L
- ;音乐曲目初始化处理
! q+ m' R6 [$ N: p# p - Music_Init_Process: w, S; c" t6 L" r
- PHA2 u9 q _/ J# Z6 O% P& p
- JSR Music_Clear_Process5 N: P/ s7 h! s5 G2 Q3 Y
- LDA #$1F
- |' b' m, S; [( g+ S+ J8 _ - STA $4015
7 S* M& }$ R, u/ K6 u - PLA' H$ C, \* `4 z
- JSR Music_Init_Addr
5 M4 T" {6 e x' \3 u( Q, f V( U - JSR Music_Info_Display
5 A2 R" @) i/ _5 ?/ q4 M - RTS R* J) j [" r$ m' D5 Z% Y
, H- V" g$ P2 M( x( D" q, Q0 `2 h' J- ;----------------------------------------------------------------------
% {: _* [% B8 u0 P4 l; D - ;音乐播放处理/ P& }9 s* W3 f8 h
- Music_Play_Process
0 v- t+ @+ X) R" F' j2 F& P - JSR Music_Play_Addr) x! k2 x/ @) s9 _, @8 G/ H
- RTS5 R! @* F! E5 [! \9 [9 B
- ' h4 V: i0 s1 ]% Q+ Q: ?
- ;----------------------------------------------------------------------& ^; _9 h* Q2 H; r- w
- ;音乐播放处理9 k! a1 v b" D( o5 i& Q
- Music_Clear_Process
! P& ~; O1 n6 f - .IF Music_Clear_Addr7 R5 h+ @4 r" }6 ~
- JSR Music_Clear_Addr
3 v- L8 p+ ^) p9 L) `: h: K - RTS8 }, B8 s3 S' N5 a: V8 P
- .ELSE
$ j0 r( m2 q6 F- M( G+ K - LDA #$1F/ ?) x* W+ _/ E$ X2 }9 f
- STA $4015
3 G1 s4 A& E" y) i* C - LDA #$009 p6 P- \% H4 k' B
- STA $4010
$ c2 s- c$ o" k5 R8 U - LDX #$00# W% f5 F9 e& ~4 z0 s4 c
- LDA #$00; R# ~3 `9 I& c0 f' y2 k
-
2 s/ P) K% Y* D( k - .Music_Clear_Zreo_Page_0
# O1 j4 p8 y+ R7 {. J3 t3 p: Z - STA $00,X
% @+ t9 s9 d% {3 O- [9 B - INX
: a# t" K. ]; H3 A$ E6 F - CPX #Use_Zero_Page_Begin
% C! A' W- J3 ?, E - BCC .Music_Clear_Zreo_Page_0& f4 V4 N* p* \0 A( x0 |) d
-
& o+ m" A! u- f( o: b2 ^ - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size3 s# R0 ` O$ [9 W1 @- W
- .Music_Clear_Zreo_Page_1
; p8 S' ~" M% ?5 ~: {' { - STA $00,X
7 P- C1 |9 w6 O3 w. C- s* w - INX
8 E3 I2 o) e& e/ Y+ e" s - BNE .Music_Clear_Zreo_Page_1
5 u. Q% ?$ |& x9 ?0 Q2 W% \6 R& D - ! }1 L$ w! W) S! X# @
- Music_Clear_Process_1
% `( x' K# a% {3 O: [/ S9 c# I; C9 Y - STA $0600,X
8 _8 l3 v3 ?& {' Q' n% }8 o2 J - STA $0700,X+ i7 I, m$ L* z7 L& ^, |% @
- INX! `: Y$ }$ K7 n3 q
- BNE Music_Clear_Process_1& N! J8 t; c) g! r
- LDA #$109 \ R' M" J% m( W: {) u+ C0 Q
- STA $4000
# A8 [% T* h/ c - STA $4004
1 T% u T9 [& t4 ?8 d E9 V - STA $400C4 I; q' H5 v$ D# d
- LDA #$00
0 ?0 O' J' A5 W - STA $4008/ H+ Q, a8 w4 E1 C; o& L0 c. f
- LDA #$0F5 u- b8 o w$ C5 l! C4 K
- STA $4015 J4 B2 D# O E0 n5 h0 n: E
- .ENDIF
9 O2 ~. L# a) F -
% } y( C' d, M. E f7 | - RTS2 u; o! ]9 J! F- y
- $ q, |' _: j$ W0 Q' b6 e
- ;====================================================================== t# R8 ^+ `- ~5 f; a6 _/ u
- ;重启处理
* s! q* b& k+ P4 W6 F - Reset_Program2 M' r% Q. J% g' l
- SEI
/ J$ | F- j' T6 Y2 ]* @ - CLD, R+ _0 N) u) y) s/ [% m
- LDA #$000 s, Y5 O/ M) U6 @: {" y; R
- STA PPU_CTRL: m7 {( u; x- S; u" v P: F
- STA PPU_MASK
9 S+ z) ]; O* v/ a- y - STA JOY2_FRAME5 S: A8 [3 J) P
- STA APU_STATUS
6 G' H3 y3 K0 |. _& a* T -
% a# d; q2 R2 a9 Y/ e - ;等待屏幕准备完毕0 R" D. x$ q- Q8 u/ _" C5 N
- LDX #$02" P) O/ L" z1 w1 C! x) O. j
- .Wait_For_Screen_Ready
/ n2 q2 v& @' B! a3 s - LDA PPU_STATUS, J: W# ]7 J$ p0 p8 r9 S" r
- BPL .Wait_For_Screen_Ready" J# w9 K* z0 U& D2 i% c( g+ ]
- DEX
/ w. [2 I8 Z, a8 V+ C; Y1 p, x - BNE .Wait_For_Screen_Ready4 M/ k/ y' `" Y6 w$ n2 t4 q
- 0 F- ?8 O: W" ^' x. H, Z" `& e
- ;清空调色板" k3 d9 P6 O$ {/ B4 f( i9 F6 y
- Palette_Clear4 Z$ ~5 \( H7 g$ j8 J% h9 y
- LDA #$3F- I9 p$ m! _) l% H
- STA PPU_ADDRESS% ^) H1 W+ U p5 T _. j
- LDA #$002 s" ^+ N4 x& E9 D$ e" ^% K
- STA PPU_ADDRESS
9 S! R2 f- H2 i. P - LDX #$20+ W. |) ~2 U) [: s0 a. j
- LDA #$0F2 r4 Q+ \* C! q9 V) U8 h
- .Write_Data
# R/ J0 d/ L1 x - STA PPU_DATA: ]. H3 ^+ V2 F8 c: T
- DEX
% D# F4 i# R% W - BNE .Write_Data
4 G! {3 U9 w+ X+ `" e1 O - % A7 h) [/ e t
- ;清除声音 $4000-4013
' T8 y+ E- y/ X% \ - LDY #$14
% m3 J3 k8 W$ \4 N, Y3 f" Q. D - LDX #$00& R' n- f2 _- f1 g
- .Sound_Clear/ |& L: q1 l7 S2 h
- STA $4000,X
) }8 }3 I3 g1 ~! w/ d5 s' v; I - INX
7 M2 k. O, Z1 x8 f" M" I - DEY
" A/ N) s2 K6 H; ~ - BNE .Sound_Clear8 ]7 K |. U. l* J. ?
-
. G- e1 m7 Q$ ?4 e9 i; B' U - ;清除 RAM $0000-07FF
c% ?$ f; D7 F, X - LDA #$002 V& Z3 U6 [: J) U- C) b. k, p0 i
- STA $00- W: e# F" t! m& V
- STA $01
/ i& S- m- V8 d) e, M - TAY
# ]( _' j0 o! J; {. b* p - LDX #$08. k3 U1 u( ~; o0 K* _
- .Memory_Clear
- x8 H7 S+ T6 P; _0 t4 x - STA [$00],Y
* T# J. k6 C( f) N; j( v - INY0 v1 e$ W( n/ t' W# e
- BNE .Memory_Clear
( {; W' M& u& e& [ - INC $01
0 J+ P, N5 ~$ j( o- T - DEX' D# J0 U5 S1 F
- BNE .Memory_Clear
+ V( F. ~8 b/ P: S -
{; ?! v6 s0 U, A+ M3 F# Y - ;精灵缓冲初始化% x# [ F: \3 F/ b& g3 l
- LDX #$00
2 q1 U* P- }2 B; r' V: y - LDA #$F8! k. U. K) a) H! ?) c
- .OAM_Clear
! ~8 q3 d5 D* X$ S5 [+ l' { - STA OAM_DMA_Buffer,X8 l# V) Q2 y9 J+ W# b
- INX
6 k4 D/ N$ w9 E1 e$ H# h - BNE .OAM_Clear8 G; x5 H- [( [* v
- 3 A0 z& i1 D4 ]8 ]
- ;栈指针初始化
' t0 b9 a d: l# U* |" L4 f - LDX #$FF6 h& g# ^5 v$ v5 x: B
- TXS9 r8 T% {( B" q. Y j! M5 J$ @
- : k6 |( {) V9 f% e: n V
- JSR Nametable_Clear;命名表清空3 E* o3 ?. C8 [
- JSR Palette_Init;初始化调色板缓冲
. B! L& k# j7 Z+ @/ _4 R/ d$ A - JSR Static_Text_Init;初始化静态文本9 _: ?0 h5 q2 b7 H
- # d1 ~3 B# y! c( ~' Q+ ~' K
- LDA #MUSIC_ITEM_TOTAL - 1
z/ F: r6 [( w' J/ D8 P8 [ - STA FC_Music_Max_Index
4 M8 o4 f6 h' o6 q# ` - , ?/ y) D) C8 v) J+ d
- LDA #$1F% ^4 z) e0 U, z3 f2 \, g
- STA APU_STATUS
8 t; r+ l0 O+ r/ `. h - LDA #MUSIC_BGM - 1
0 q/ y& r& w; G4 b8 J7 Y/ K - STA FC_Music_Index3 Z' T6 k3 h# u# A) a7 Z
- JSR Music_Init_Process;音乐播放
9 P% o4 s6 S9 K, R) {- v -
8 L) t$ W2 P* F" F - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态) T- q/ ^/ z+ [
- LDA #$1E
" p) |, f" X& _ - STA FC_PPU_Mask_Buf6 u) T1 n0 j$ z6 M- p) X V
- 9 D- x0 d b/ D: b1 Z5 M
- ;启用NMI处理
9 r x# A6 l1 }' P; W - LDA #$804 B6 m0 m+ a6 h+ t- Q" j" X7 S' J6 i# [
- STA PPU_CTRL* m- s, Z) Z0 \" n! _8 O
-
' X( \- d; o1 j - ;程序循环, 剩余工作交给 NMI 中断处理
6 }$ R, n5 x2 S* I - .Loop
- l3 K8 M8 k+ ? - JMP .Loop
' E9 x, t. c- L& a7 G9 O' A - * b' r3 Z1 C' Y
- ;======================================================================
6 L8 u, a5 F" ?$ U0 L; ] - ;不可屏蔽中断处理
6 y3 f8 x# T: ]/ c - Nmi_Program
F: C9 ^7 m) z1 E; r1 w - PHA
& D5 f0 K( S( t& a% ~. B - TXA
5 r: w& ?, z+ B+ H0 e9 s - PHA
9 E1 u$ v' D$ ?: | - TYA$ C; u1 V, ?9 Q/ R1 L+ i# c
- PHA D' o; j/ X! J w* P3 R3 X5 u) H% h1 i
- 8 [; \( e/ a$ }" H$ ?8 K1 @
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位3 A+ H. E' Q( A, ] d
-
: w) [5 L" s- u! \ - JSR FC_PPU_Procrss;PPU处理
* Z# D# ]. y4 A& W# P6 w# T - % w" _, @+ q7 M' j2 [& W3 [
- ;精灵内存更新7 t2 ~: O/ w8 @" b+ y/ M! T
- LDA #$00' Q2 d/ ]7 `4 y/ f7 B- W- M# P
- STA PPU_OAM_ADDR
$ V$ k( H+ P. H! I( r$ ^ - LDA #OAM_DMA_Buffer / $0100
; V+ y/ R* x8 `) |7 A* @ - STA OAM_DMA1 R' y1 k% k- O( s4 m& y: g
-
& C# h2 I/ h; J* n - JSR FC_Gamepad_Process;手柄输入处理. B+ @+ T# Z- {; W3 T
- JSR Music_Select_Process;音乐选曲处理
7 z5 b0 r8 Z/ g4 k - JSR Music_Play_Process;音乐播放处理
+ w* z3 h0 M/ T( F( z8 u& \ - 3 O: g, o3 E7 Z$ y" p; O7 ^
- PLA5 ] Z3 b0 c# A- @( ~
- TAY0 I* ^ m4 B- j* x# y$ D7 Q
- PLA6 G* } m& V I
- TAX
; b- T0 e; Q6 O( ]# Y - PLA
6 x0 z, S2 [' Q% l - 6 y& S3 L9 _- P n+ X' a K& }
- RTI
/ H& f) C6 p5 K - ! O V: I, {" A. Z& w5 M; b' G
- ;======================================================================
) x6 w0 j6 K ?- \ - ;请求中断处理0 ]0 P2 K6 i- t+ P; b4 ^
- Irq_Program
5 Y1 W7 T' G3 T1 S - RTI
: O- @, v9 e3 Z; y0 t - ' ^; t1 L4 Q2 N9 F7 J/ J& V9 f
- ;======================================================================
3 ^" @$ o2 |/ \: E0 i - ;中断向量表
9 |$ ~' N: b4 G3 [7 [0 f) F4 | - .ORG $FFFA- d4 X0 M$ C: u9 F+ p
- .DW Nmi_Program ;NMI触发时执行4 R, d& P9 C& [4 _. t, m
- .DW Reset_Program ;载入ROM时最先执行
7 i* l- A* P* Y1 x z7 K# z& D - .DW Irq_Program ;IRQ触发时执行* R" ~, P7 r( ~6 N% |
复制代码
$ [' B' r8 h; e9 R* _2 g* d8 r3 O) l8 o' Q
4 a5 N! |# x: S" A8 k% a
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|