|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下" S( S! N( T6 l

6 D0 v6 g' r3 `, g' a) G* c7 O, w* D# m以下是主框架代码:
8 i% P* H# c% t5 h2 Z, D4 [/ N- ;======================================================================$ e6 G7 _0 _# W
- ;文件头: X$ k& Z8 c" F/ e% L5 d- ]1 c
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
0 o- }: B$ @" j0 n - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量+ A9 `( x1 K- R2 B- {
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
& r! j: K! P1 p( ]0 c6 H - ;======================================================================) Y6 z; ~1 j) x( u0 W9 j
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
8 ^0 N5 ?4 E# f" c - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 16 T1 S3 v6 {- d: Q, K9 @* H
- ;======================================================================
- s, g7 Q( l* e/ e# n - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 17 g1 T$ e7 R( p' I
- RESET_ADDR = $E000 ;主程序起始地址% O' J; Q. g1 b; p, C' T
- ;======================================================================0 Y* Y9 V+ u4 D3 [ c# |
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
, d; y. H* M9 i+ @ - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB( ]/ a0 b, V4 T. Q) m
- .INESMAP 4 ;Mapper号 (0-4095)5 I; ~) w5 R+ z
- .INESSUBMAP 0 ;子Mapper号 (0-15)% S+ X4 ~8 ? U1 [9 C
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏). B6 ^, b4 y0 `
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
, V+ T8 [* U+ d5 a2 S - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
3 f/ ]6 ~$ x- R) Y( a - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
X5 F9 n) b. O* o: m% x - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
( D$ ?" _8 Z4 n {' J$ i - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)! G) h& [2 U4 a; c/ o) w
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
8 I( S0 H& h! C0 ] - ;====================================================================== z8 @. B2 Z" x
- .INCLUDE "fc_demo_config.asm" ;全局配置4 q; y( ?( }6 F `) G
- .INCLUDE "fc_demo_constant.asm" ;NES常量 I" B4 Q2 ^+ p8 a- v( U) c
- ;======================================================================
" f- \* @7 [1 u3 ]& i* G. i - ;音乐配置( D2 |0 l9 R2 ?# N
- .IF 0 = MUSIC_THEME H3 P& ?% g6 o
- .INCLUDE "data/music/Gremlin 2/config.asm"
+ v4 f- j2 k. ^4 | - .ENDIF! }! E4 i0 K2 g6 i7 ^$ Y k% f
-
4 v& _0 M4 W, L - .IF 1 = MUSIC_THEME; ~+ w5 o+ a! |& F7 I
- .INCLUDE "data/music/Raf World/config.asm"
- H) R4 _/ l( ?2 P - .ENDIF
: V4 l6 \8 I$ P - ) Z, x! g& P' w$ a) |! Y& `/ N c
- .IF 2 = MUSIC_THEME , K+ Z* T* s: Y+ ^' l; ?* s ~
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"5 F! h ^" _" j; t6 G
- .ENDIF; q) H; {- ]% R8 j" r
- M' o0 V6 o5 i$ J5 Z* g
- ;======================================================================, \. N3 }1 V' I. P
- ;引用CHR图像数据
! `8 M/ z; m# { - .BANK NES_16KB_PRG_SIZE * 2" m; n h# ]4 a K
- .ORG $0000( |4 W' B6 C2 {
- .INCBIN "data/bkg.chr". C7 _8 g" h* o& @( ~( ]
- .INCBIN "data/sp.chr"
# M* M- y' C. `: i* Q4 e - $ Q" w" w$ ?) p# n. f
- ;======================================================================& l+ g: w7 N* z* V$ O3 }: G
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank' ]. `! ^, Q% L* N
- .ORG RESET_ADDR1 Y+ v% [. O# E$ z, D3 {% X
- ;======================================================================
; }" Z4 |4 K! b" p/ V/ A/ g - ;引用其他源文件2 Q7 ^) h8 W' X, C9 u$ a
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理! P; X8 I' w4 J1 Y& x; L
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
3 `; p) f2 m J8 [8 ]& ` - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理6 L5 q) {, {; T& I" A
- ;======================================================================
0 `4 V1 o @' b1 h' g: E2 r! x
3 |0 m: U* t8 p) C0 _- ;======================================================================
: f; L# v7 Q; r/ w: a3 g9 | - ;等待VBlank到来
1 z# `+ r4 J8 k9 u! a - Wait_For_VBlank4 L; E' ?: b4 I" o( H9 G
- LDA PPU_STATUS$ f9 j _& M8 O2 p9 A& N, n5 k
- BPL Wait_For_VBlank
5 t5 _7 B6 q4 f) Y# @ D, s# q. [" z2 \ - RTS
; [; ~, M- D5 G8 _1 [* L0 G) }* M - 3 T$ b+ \! H$ A2 E5 ], M
- ;======================================================================' N; N: N0 s# [/ A3 a
- ;调色板初始化
* E7 Z5 O; T! z$ [: U - Palette_Init; ]* w. d) L, ^. h/ e
- LDA #$3F
& Y$ v: [4 b( h( v0 {" ` - STA PPU_ADDRESS! f6 y# }' M( N9 H
- LDA #$004 ]. R# b* C. f6 K% n3 Y; d \. C) e
- STA PPU_ADDRESS$ C3 ^3 A0 T& j' l' ~$ ^- T9 g
- LDX #$008 ?0 _" @0 X. S- g2 `, z6 z
- LDY #$20: E. d. j$ d/ E5 @5 q
- .Write_Data
1 L# q; A" U2 y+ z" i - LDA Palette_Data,X, {# U0 U$ {& f X
- STA FC_PPU_Pal_Addr,X
" N4 |1 R i. ? - INX' g ?4 k8 ]* {/ c3 I/ _3 G2 `- @
- DEY5 U" S9 b( x: }8 K5 Q2 Z$ U+ X: G) V
- BNE .Write_Data0 m, w' \- n3 G! a. g& C- x
- .End
4 O0 d% @# c2 \6 B$ K( a - RTS5 ~ P( F" i$ u" X- L* t
7 |& t5 M* \+ ?$ L+ J1 q- ;----------------------------------------, l& C4 H$ l- t$ X9 m
- ;调色板数据
9 ~$ i0 E* X4 n) }9 _0 a0 P - Palette_Data
$ R/ Q' U# t5 U0 d# r - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B! p% f7 ^4 O& \0 `, M
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22* ^+ |/ J7 t7 B) _, D9 Z z, Q3 z
- ! c! H0 X* x1 I9 ?# S4 Y4 r! ` {
- ;======================================================================
0 ]2 Q4 I; w& F& b - ;命名表清空% B1 P- I" \, E/ }3 `$ H
- Nametable_Clear* j @6 R8 m6 V2 f
- LDA #$20" s) Y' Z/ R) N, i( Z+ v
- STA PPU_ADDRESS( |! \2 j. s, l, }5 u9 g
- LDA #$005 O- u. b! B7 [2 U
- STA PPU_ADDRESS
: D) w; Q) L% q* U - LDA #$00
6 [4 H- p, L; S: `& R0 `" H - LDX #$00
$ n& `( n Q4 i' ?' r - LDY #$08
/ m4 M/ Q# m- {% d! g; l - .Write_Data
& w3 l" n. \/ ^2 w - STA PPU_DATA' I2 J6 L" s% z4 Z
- INX7 h- Y3 m% x9 d# [
- BNE .Write_Data! V+ G+ X4 A& l# X* O# }, k
- DEY1 Y7 @" ^ C: E1 \) B
- BNE .Write_Data
! W' [* R! d9 ~2 o D% t: ? }9 Y - .End% T: U% C& _( G- L" Q# J- C z* }. ^
- RTS, W( h; i. c' [& k0 d
2 |0 j( F9 Z6 X$ X* x( V* q. O& g- ;======================================================================
8 l; C3 J& u, s% K3 h - ;音乐曲目切换
( q) l- o3 ]$ z - Music_Select_Process
) F: P. }! J) l, h, \8 i8 X
9 V- [. w* P0 f+ T9 ] i, V& k) {- .Pre_Music;上一曲
; e0 h1 w3 D& ?, K( n, k8 N - LDA FC_Gamepad_Once3 v9 y3 v1 i4 }$ T* d' a9 l
- CMP #JOY_KEY_LEFT$ z- [1 V9 o( w: G* c6 d3 A
- BNE .Next_Music4 q* U5 Z% o" i5 S5 ^. I# U5 g3 x$ m
- JSR Music_Play_Pre
{- H4 t+ g) u4 Y, l# Q - .Next_Music;下一曲
6 N0 s) J1 `( Q- s" x7 P - LDA FC_Gamepad_Once
. O. Q( x0 l9 J( m* g/ M - CMP #JOY_KEY_RIGHT
( z) `* B. p: D! }2 Y6 P - BNE .Next_10_Music
T; p# N) q0 W8 w0 s& W7 C- t4 E# ] - JSR Music_Play_Next% p: i% r3 [( K2 w3 |( x
- .Next_10_Music;上10曲
$ X7 y7 A$ G R" n8 n5 c- l - LDA FC_Gamepad_Once
5 f5 ~ r% S( c2 D3 e- }' w' C$ z - CMP #JOY_KEY_UP
6 Z# i* @, I- {8 \7 Y& x6 ]. J - BNE .Pre_10_Music
. e+ M- @7 c0 E# D" J' i - JSR Music_Play_Next_10: Q. Q! S- n+ H* Y( Z% q: ?
- .Pre_10_Music;下10曲8 t& ~5 L8 y% `" h9 y& V
- LDA FC_Gamepad_Once7 V% l; G& ? r- }
- CMP #JOY_KEY_DOWN
! k+ B) c: t9 T - BNE .Reset
$ i: B1 G7 y+ i! u - JSR Music_Play_Pre_101 H- {$ V( }) Y
- .Reset;重播当前曲目8 b7 @* ^$ d2 T7 o1 _' E. e
- LDA FC_Gamepad_Once5 l; H2 J* o6 t1 f. v
- CMP #JOY_KEY_START
) S& H9 A# t9 d7 [! L$ P - BNE .End1 O, d8 I) [' _9 Q
- LDA FC_Music_Index8 E5 Z' v& R- Z; K# h; Y. q
- JSR Music_Init_Process9 q2 J2 `1 D6 G& Y& }2 K& G
- .End
; S7 D- l5 h2 [2 a - RTS) V/ c) ]" u( C& l. B8 _
- / z S/ q9 J4 ~5 |
- ;----------------------------------------------------------------------
' g* [ m, [( `; V$ x' ~ - ;播放上一曲% ]" W1 Y4 u5 f$ h+ q
- Music_Play_Pre
7 i, E7 }4 R j- v; l - LDA FC_Music_Index
1 C7 b! t( G P+ h j4 V4 h - BEQ .End
2 D' n! b1 u p' \9 C - DEC FC_Music_Index6 m- v2 G0 w# _# v. G+ M- O( m
- LDA FC_Music_Index
2 N' p6 B& f5 m: Y4 |; x n - JSR Music_Init_Process% Z( [6 U8 ~9 R4 i
- .End
: w- X( n d- N9 I) s' F) c - RTS# P5 L5 j. q8 v' y0 J
- ;----------------------------------------------------------------------
; n6 N8 }+ F6 g- o* ^$ @, ~ - ;播放下一曲
+ M" E0 S2 P! h, Q' w. J w$ | - Music_Play_Next9 Y' E* P6 ]0 R% V0 _# ^! E( n
- LDA FC_Music_Index
3 f5 V' t/ S' }" i - CMP FC_Music_Max_Index) h* e0 E8 A; W, F @! ?5 V* G
- BCS .End
) n- W8 {' w9 {' T* a1 m4 g- R6 d( M - INC FC_Music_Index8 d) ^7 X- R7 j0 `( X0 \
- LDA FC_Music_Index
c) W8 x2 _( I) Y; P0 d - JSR Music_Init_Process
: x& w3 s! ]. P4 a" H - .End7 F0 y8 [+ I( N' j" |
- RTS% e8 W- n2 _" m3 z/ @5 I
- % |% W: O) \% [3 s0 U. G
- ;----------------------------------------------------------------------& [. x$ G6 ?+ w! ^" [
- ;播放上10曲5 h, Y1 d" p7 v. q+ s# g1 ^
- Music_Play_Pre_10
- J M/ W3 B; S3 A - LDA FC_Music_Index& L) P6 |6 M7 }2 o5 Z" W
- BEQ .End
# [" _1 R+ e$ u6 U9 C - SEC
% E5 |+ A; m4 o4 h% l ? - SBC #106 e4 z7 [& C/ F0 h' s: H
- BCS .Pre_10* h+ e' D9 u0 g) I3 c
- LDA #$00
; ` B; N" C6 T) G - .Pre_10
5 g: O& K8 K; }; ?9 j9 G - STA FC_Music_Index }! T- g% F" J1 C
- JSR Music_Init_Process
, {! b' P% \6 P6 f/ H; b - .End
* Q9 q% T/ f3 N9 H - RTS
7 V2 k4 H! E0 m2 Q8 [3 U - ;---------------------------------------------------------------------- D# w o: e+ q1 P5 I8 E3 _
- ;播放下10曲
: d/ S0 q% o4 `' v( p; }. c4 D - Music_Play_Next_107 Q. }7 `$ ^- t) B1 i0 L3 y# {6 Y& J) X
- LDA FC_Music_Index
; p: F/ V8 j: U - CMP FC_Music_Max_Index
! _( ~9 R1 h9 F3 Q' U# G - BCS .End
- B% _: G; E, L! n- M - CLC
; ]8 L' E$ f8 I* i* Q# j. r - ADC #10' m5 v# ~9 i$ l3 d& Q) c
- CMP FC_Music_Max_Index% H# [% y2 B' ^/ t
- BCC .Next_108 I$ Y4 I5 n8 c$ u
- LDA FC_Music_Max_Index) D1 G u {2 _7 c# R& P V! n( @
- .Next_10
& l9 v/ r L8 G! N" I, e6 s - STA FC_Music_Index
) z: S$ S8 i. P V* J - JSR Music_Init_Process3 n( k; t" p' |$ w4 K# F
- .End T! e" @ B' d; g3 w0 h: [
- RTS4 g( @" ^9 w, Y5 z! F0 F1 i+ k
6 t( @0 s' r. u; @* D- ;----------------------------------------------------------------------7 L+ L9 Z, |& v: p1 _
- ;8位十六进制转3位十进制制6 u( N6 w1 W- a$ w- ?. E
- Hex8ToDec
& t2 B/ n) }- d- \1 t0 L7 X - STA FC_Dec_Data_1
* m6 r& p! V0 q2 T - LDA #$00
4 h8 \( F1 ?5 |1 p0 d# \4 g& Z - STA FC_Dec_Data_1006 R& r1 w$ y# x! ~
- STA FC_Dec_Data_10* V6 v9 r# k3 B1 r8 M
- LDA FC_Dec_Data_1# ~ t! n. |2 u
- .Convert_1009 ?) q! w) `3 R V2 ^; v+ j
- CMP #100
7 q1 i" F b3 P) y) J% v/ X6 A8 R/ F1 D - BCC .Convert_10$ V3 J8 Y9 a4 T4 U4 p1 E
- SEC
! E7 `$ o J9 q" E; n0 {% @ - SBC #100
) k# |4 O9 d! y: @ O - INC FC_Dec_Data_100
, u9 W3 A" i% `; [8 ^ - BNE .Convert_100
" j$ g- Y0 ^0 k, U - .Convert_10
9 b! s' A# i; |! _ - CMP #10
. A; t5 g: L, F0 I! I - BCC .End
( V9 c. N/ ~' i% ^: s- @ - SEC" j5 f" q- `0 H0 s1 c
- SBC #10; _/ N2 {- b6 z+ O
- INC FC_Dec_Data_104 v4 B; r0 O4 W
- BNE .Convert_10
" ^" c; F# o! e/ G - .End" L) {7 P! _9 r7 c O6 z
- STA FC_Dec_Data_11 v8 Z" y0 |+ M# B( ?
- RTS3 o+ I6 V4 K! Z N
& l# j( ?4 K7 d6 ` x! X- ;----------------------------------------------------------------------+ X1 _7 f X5 M
- ;显示曲目信息
3 M" d* C' ^+ V: ^7 A# L' j4 S - Music_Info_Display+ U. N4 I+ J7 H u4 ~. d+ a3 \- s0 ~
- LDX FC_PPU_Buf_Count- K: ^% p( p3 `& M
- LDA #PPU_WRITE_MODE_CNT_LINE% I0 U: ] S6 L d6 G' r
- STA Use_PPU_Buffer,X
$ E; }- W+ E' @$ |5 L8 G - INX
; N6 @: Y6 K0 _( ] -
# x' H) T# `% N+ X) _: V9 ` - LDA #>MUSIC_INFO_POS
' `6 @1 j) T0 p. ^2 q - STA Use_PPU_Buffer,X
' q1 Z5 M% i: \1 Q: } - INX
# h7 p u+ j: n8 S( m* H7 C. p - " g6 ^" {2 a+ |2 d
- ;居中
8 S3 w1 \- M, [ c' L1 r- j1 p - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/21 L4 E0 ^, [# j
- STA Use_PPU_Buffer,X
! L" G: O% r* m - INX
' e( i2 L) w; o4 Z" G7 S# B! u -
$ n: D. `9 o' A" X - LDA #$05( p N3 S! f8 `7 c9 i
- STA Use_PPU_Buffer,X
U- v R5 ^. j) ]+ R+ B9 m1 O - INX6 }+ Y/ c( {3 L& J
-
4 ~. q4 l) u2 n) v1 d - LDA FC_Music_Index- ~( Y b) E2 d* U* Z! c3 |: D; L
- CLC
5 e* E1 K& B! H+ t, S2 j0 k& Y - ADC #$01
5 |8 ]7 f! O$ J* g - JSR Hex8ToDec
2 a# A: b @: L1 |+ V2 P- E; t/ ?8 }) d -
; h4 B8 J/ G$ p" v' e - LDA FC_Dec_Data_10
0 ^3 o5 Y5 i& S2 z J/ r+ c - CLC& {4 N* ~9 h1 X2 ?: _0 i' i5 J
- ADC #'0', d0 k8 |$ r p' i5 Y( A# O [
- STA Use_PPU_Buffer,X2 O& f0 K: V! C; T3 J _; u* R
- INX6 R( L; R! u. c, K
- ) g( E/ ~7 }; x- H4 x
- LDA FC_Dec_Data_1
% o' P% Z x6 C - CLC
8 S _4 ]( V5 E4 q - ADC #'0'. d# B j& [& |, E
- STA Use_PPU_Buffer,X9 B) d; a$ ^/ x- u4 a: J7 ?2 q
- INX3 g9 Z: n: \7 h: f8 Z& t; E; m
- # E- F( ?0 s# q& I% I8 f
- LDA #'/'4 A) C* B+ ~. [) f# b
- STA Use_PPU_Buffer,X2 ^! x8 q" `( n) H, L
- INX% U3 G& o' R( a" V+ L
- $ K1 ^- J9 M4 j- L" Y, |# g r
- LDA FC_Music_Max_Index
6 a( P2 D6 J7 d - CLC
6 Y! s2 Z8 Z7 E- Y2 h$ X, V; f - ADC #$01* p8 w9 }# Q2 k: l' a
- JSR Hex8ToDec! S0 k3 C3 V3 S; Y- M
- " l0 n$ @! T; j# o) u5 W0 l5 ~: i+ t
- LDA FC_Dec_Data_107 z( I5 b- [+ V. f/ l8 \! x
- CLC
1 S7 f) r! ]. L* n. S% O% ~ - ADC #'0'
# ~/ G' X/ F9 F - STA Use_PPU_Buffer,X
5 a5 x6 B' K. \5 e9 a2 V* T - INX
4 M9 G* A# F7 h* g$ s/ ~: k -
/ c/ _: k; c5 G' s2 T - LDA FC_Dec_Data_18 x% V9 g! \9 ^3 f: E
- CLC
+ `2 B( e5 J) x/ @6 \# I# y - ADC #'0'' D$ h) Y$ Q' F) N0 u6 [5 m- I
- STA Use_PPU_Buffer,X
+ s( v5 E" W7 \; w; ]% h8 K - INX, P3 i& e& @( X, {' i F
- + [, o- Q+ h' S: g; b& c3 T
- .End
8 n6 p+ ~! e3 A0 A [2 x+ i9 c - STX FC_PPU_Buf_Count
8 [ i' n- ]. j, \ - RTS
/ G3 W& B3 M1 b* s- _% X
4 r; y; X2 X% l$ x( E7 n- ;---------------------------------------------------------------------- p; t4 V$ D. c: s& x. B
- ;音乐曲目初始化处理3 Z; F4 |; l8 _9 e2 ~, E1 }
- Music_Init_Process: E6 R# c6 W. d# ~" n+ s9 s
- PHA+ p' p+ [4 J! t: S' J H
- JSR Music_Clear_Process
; G5 o% ~$ J. p" L0 `- {- x) u - LDA #$1F- B$ x3 D( O0 I* h$ J# b3 E3 G
- STA $4015
- U1 g7 R! ~ `5 d3 q - PLA# \+ e9 I8 l# o: y3 w
- JSR Music_Init_Addr* _( R) P: g9 @6 J
- JSR Music_Info_Display% X4 v# }/ C/ e9 i/ x- K
- RTS
: n- p: U0 i/ J! B6 Y+ I - 7 n- O) |! P0 M, h* l) U2 F9 a
- ;----------------------------------------------------------------------, s: Y7 N4 b* S% B' D6 l
- ;音乐播放处理
X: l1 X, F/ k% v - Music_Play_Process7 \ h ^0 P" g, P; _# x5 R
- JSR Music_Play_Addr
3 ]. }4 v0 z0 Z/ I - RTS9 P p0 H" n% l/ ?3 E
5 S: {! d1 U$ ~4 N' _0 b- ;----------------------------------------------------------------------# S; ~' C R5 _5 J
- ;音乐播放处理$ ?) z4 N' C( d- o ?8 {
- Music_Clear_Process! ]% ]7 B& ?' E
- .IF Music_Clear_Addr5 n7 A) r' v0 B1 U" c5 z/ ^
- JSR Music_Clear_Addr
/ M+ E" D7 ^9 d1 q - RTS
$ X7 g6 d+ {6 ^ - .ELSE% j- G) M0 y C- R s6 i
- LDA #$1F
r1 I; B9 S- M7 P0 ~ - STA $4015
; f8 B1 m: n) B; m - LDA #$00
# g& v& \4 F' h: i8 |* \ - STA $4010
* [7 T2 o0 {# ~5 k9 B2 {' j: v6 P - LDX #$00
* {' R8 \2 z" k" X9 C& ^ - LDA #$00: B/ a7 K$ V) c1 b4 U
-
% G! T3 u1 a- N* N - .Music_Clear_Zreo_Page_0; W: q* j+ t$ i' @5 D7 q( o
- STA $00,X1 R1 ? v* o2 q) ?
- INX: D3 b. B) S- N# P0 E
- CPX #Use_Zero_Page_Begin- ^& ]. z: S$ ?: N7 m' `4 U$ R
- BCC .Music_Clear_Zreo_Page_0
9 z. j3 s$ @6 F" y4 `8 D -
/ E4 N' e$ o; P8 U - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
+ J* Z* O9 H/ R - .Music_Clear_Zreo_Page_1. j! d% f0 L+ K1 u- {
- STA $00,X9 }6 | g; Z+ N( W ^9 K
- INX
+ r' P1 d6 |( y7 `* T - BNE .Music_Clear_Zreo_Page_1
. }9 u3 a. S- N% _; u Z -
; }. j8 V; @9 T1 T - Music_Clear_Process_1
w1 G- _! x& p- B - STA $0600,X+ ^0 J, ^7 v# g5 A0 \9 f
- STA $0700,X% R3 \/ h2 r, j' t8 C* _! @
- INX
' q( ~) g0 s1 S( v - BNE Music_Clear_Process_1* ~9 p+ k2 Z3 C' D
- LDA #$10, w, M/ w: P- d) ^# f I' ?- k9 w. J
- STA $4000
$ Z; I& x8 |6 a* F$ W- h! [2 ~4 M - STA $4004: b" k/ |4 {, ~1 |; Z, i
- STA $400C4 l$ @, j7 s5 s2 b6 D- ]
- LDA #$00
! _# J' L! {: c% V - STA $40087 \- h N5 L$ T1 b+ `. l% }! r: D0 f( z
- LDA #$0F
8 k7 u& y7 n- Z8 J( a! |! u - STA $40156 X: I7 {" W. V: w
- .ENDIF% ~+ j; b- c9 y3 B- s
-
" f) k/ T+ p [# I- \ - RTS
, Z* u7 @: H; S, _1 r5 h - 1 w) L$ Y+ {4 } U1 C. b
- ;======================================================================9 [3 F5 Y, h i. v# H
- ;重启处理1 \9 A8 L0 l9 q6 r9 A& ~0 \( }
- Reset_Program
) i2 z1 y- n4 \ - SEI& S: n3 L+ O6 N2 w
- CLD
' k* w" @ Z# k) `" j% m4 ^5 ~* _9 R" e - LDA #$00; _% l! z0 G( r, x+ M; N
- STA PPU_CTRL
# K/ i, ?9 c( v5 d$ e - STA PPU_MASK2 @) W( O% M5 c/ Y/ \9 O, l
- STA JOY2_FRAME1 ]8 N r2 z$ K
- STA APU_STATUS3 X7 e- Y- r1 `) w/ \4 L% P
- 4 N( L5 s& V% w
- ;等待屏幕准备完毕
* S' m' ^4 s9 C, b/ Z& `( h. o8 A - LDX #$02* _; p& J' \+ z2 C; q; D
- .Wait_For_Screen_Ready
- i; }9 m) l# R+ J1 _ - LDA PPU_STATUS$ Y% q& _4 D/ ^: |8 a
- BPL .Wait_For_Screen_Ready/ r2 D9 A1 k \% G: m8 C% N
- DEX0 U( q: f2 H' {' c5 H
- BNE .Wait_For_Screen_Ready! b( C' z0 T# [- u! e
-
a. ^; Z6 k8 z" S - ;清空调色板
- t" O3 a# d) l7 e- P$ [( V1 f - Palette_Clear! J7 t1 a# @ c) J. U0 [
- LDA #$3F6 m& q3 V1 V! U! h; i5 X: E
- STA PPU_ADDRESS) z; O ]$ Q, P8 ?! K" d" v7 v# X( S
- LDA #$00
9 n' U5 z+ q1 x0 J - STA PPU_ADDRESS
. H8 @8 u4 [1 N- }* F; t - LDX #$20
2 \$ [- v! E; a: P - LDA #$0F
. D; I# F$ O9 D - .Write_Data+ b5 v0 P: F% q* O% q6 p! H( n
- STA PPU_DATA
0 V' m- d* y3 y4 l0 k$ D+ T6 J - DEX9 j, i* H; j% x7 f3 D
- BNE .Write_Data& z' _8 H; O2 \ R* C# ~; t! A
- 6 Q- j1 x4 {0 p8 E/ w: ?
- ;清除声音 $4000-4013
i: J) A) Z& B0 C. \2 g! B6 m - LDY #$14
$ f/ @: k+ }& r4 a' M - LDX #$00
& R# @2 ?) ` s( g" V - .Sound_Clear
. C! R& C/ P' Z# t) C; m# E5 v - STA $4000,X
4 r. Y5 u8 K ?/ E9 I- z1 h, ~" I - INX
/ d* u% |" J- J) ] R: G1 p - DEY0 p" ^- M7 B5 z9 Z9 i. B) J
- BNE .Sound_Clear
: z+ F4 ]6 ?& i -
- h; c% c; ]% i - ;清除 RAM $0000-07FF
' B" w# D- `* T$ T9 q) y - LDA #$00
5 y9 d8 `3 f& \- @, z$ w' ^4 e: ~ - STA $000 Z5 H9 d; w& c3 ~ `
- STA $01
! V7 b3 W9 J! c5 K! l% Z - TAY
9 y6 `; V8 l e- Y9 c7 J - LDX #$08' x% I" U$ a. N
- .Memory_Clear( X3 j% m. f& t
- STA [$00],Y
2 k: T/ D8 ?4 j g5 Z/ ^ - INY. @1 V# Z! D& s
- BNE .Memory_Clear
& d. J! N$ e5 u: x" ]5 ]% t2 m% h - INC $01: p7 l q$ V$ c) e6 Q6 h7 M8 U7 V& A
- DEX6 A8 |1 y3 e3 W0 k% _( E
- BNE .Memory_Clear
: Z9 Y5 N0 R3 x% b9 @; V& V -
) B$ O& T. r; c2 h' \; q - ;精灵缓冲初始化5 v- W6 T) e, a
- LDX #$007 J+ C9 i0 E8 E* b! a. u
- LDA #$F8
/ T; z4 N! w- x N3 ?. E - .OAM_Clear; S( |1 W% Z5 |9 q9 K+ s
- STA OAM_DMA_Buffer,X/ w8 c3 f' u7 P% C8 {& O+ ?+ ~
- INX& s( K2 s. X9 c: O1 a
- BNE .OAM_Clear$ |3 y w0 a" S! e1 E0 `5 c
-
' G% W0 ~3 P2 p5 d& K/ G) a - ;栈指针初始化3 i+ z0 q5 v+ J7 M; l
- LDX #$FF4 m$ s5 d4 F2 z+ U1 J" |' `
- TXS6 b4 {/ K1 z( Z
-
6 t3 s: t. @- P ~ - JSR Nametable_Clear;命名表清空
8 L1 T& ]7 a* K* ` S* c - JSR Palette_Init;初始化调色板缓冲 y( f4 s1 R- x/ r
- JSR Static_Text_Init;初始化静态文本$ Z" j& l$ f: x+ o
-
) P4 S8 L1 F; Y% C5 H - LDA #MUSIC_ITEM_TOTAL - 13 P. i% R9 f: D' I+ A. n
- STA FC_Music_Max_Index
& Y) d0 d5 H- Q9 { v9 n -
; [( G% H8 C; t8 o8 Q4 E - LDA #$1F& I9 K2 Y* E( l' k7 n# P
- STA APU_STATUS
) k* b4 E! Z4 ^5 k) N$ Z5 N - LDA #MUSIC_BGM - 18 W8 @4 |; @- B6 m( r
- STA FC_Music_Index
; S; P; k4 p; ], M2 c( X - JSR Music_Init_Process;音乐播放
; h4 @! T! L7 G5 w# g Y. p; C -
6 f1 K" e, Z; R0 {: T - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)7 Z) x% o! s' O, `# O1 j7 l ]+ ~
- LDA #$1E" \ S- `8 \+ y( s1 F2 M. X
- STA FC_PPU_Mask_Buf, c s$ `% P: Z8 {1 s1 y
-
& y- ?% f' _- z5 h$ Y5 y - ;启用NMI处理. d6 q. {8 M2 q' u1 i, v, v
- LDA #$80
8 t) D- S2 r7 j0 n - STA PPU_CTRL; B" D# \. |& w+ D% E0 p
-
4 O9 { s# z4 Z - ;程序循环, 剩余工作交给 NMI 中断处理
1 i8 x+ c/ v7 p4 u f( T3 B$ P - .Loop4 t# x8 d M q1 ~% u0 r
- JMP .Loop0 o2 f9 a& f- I0 K2 E9 V
- 2 j5 q7 d5 n+ I W" i
- ;======================================================================# R0 L. h& |; I; }8 A
- ;不可屏蔽中断处理3 i/ R9 ` Z/ _7 A8 Y M+ r
- Nmi_Program
) }1 O# ?& m8 r* r- J4 r) V2 n% I7 X - PHA3 G, X O, ^7 w/ r7 ? y
- TXA
) Z# i, @% B- E9 ^7 }3 p" G - PHA( p3 d3 `: ^, B9 D2 p9 r) J3 \4 g
- TYA1 _' C8 O$ Y( s) C( p5 i- z/ |
- PHA
; Y2 }: S W- M3 Q" w -
- P: `' Y( {4 k$ @1 _( ~ - LDA PPU_STATUS;读取使得 PPU状态寄存器复位3 g0 [( \# O: d$ i8 o% K2 Q
-
. {( C" r7 t Y& ~8 W8 N - JSR FC_PPU_Procrss;PPU处理( p( a5 ?2 K. E, ]2 R8 ^
-
O5 d, |- p, I/ Y9 q6 } - ;精灵内存更新5 @ k8 _ ]# s8 b) j% d
- LDA #$00
2 E3 S; q/ K4 b( Z - STA PPU_OAM_ADDR
4 U! D+ _: s* s# z; e - LDA #OAM_DMA_Buffer / $01009 t) v7 N: I# P
- STA OAM_DMA7 Q# P/ {8 k; F! [
-
2 o3 d3 o! f1 ? - JSR FC_Gamepad_Process;手柄输入处理) J7 u9 h+ ]# M7 |
- JSR Music_Select_Process;音乐选曲处理" w* F% u" K; D" }& D
- JSR Music_Play_Process;音乐播放处理# D/ i+ Y: p3 D5 |4 \
- 9 I1 I e- t0 }5 M' C
- PLA1 w: q) {$ P& e9 i0 I4 ^( j
- TAY7 V2 c$ Y3 E6 D1 b8 ~
- PLA( S6 f- ]) \1 x7 ?& C* Q
- TAX, P* D" t) W. j. m- C
- PLA
" A, R. E- u5 p; U- D2 F
D% f; A( [7 I9 `- RTI
* n) V: L+ x+ h0 Q$ x
7 j' b7 k. f9 t% }% F; v- ;======================================================================
" e! f. {/ f# ?, \ - ;请求中断处理' s M9 s5 H$ }& N( g
- Irq_Program; \5 r( H0 R! H0 c+ T7 n+ v- v# T
- RTI# E; ^7 A2 Y n4 \+ F7 {
- & {. R& E. @ u/ d
- ;======================================================================
% E% a: u8 X7 u, u - ;中断向量表
9 P! N( e7 |1 B) t% e5 G" y2 I: F - .ORG $FFFA7 W% ]6 Y& T5 G# Y
- .DW Nmi_Program ;NMI触发时执行8 i0 [$ l: u* @- X* y7 ^
- .DW Reset_Program ;载入ROM时最先执行
0 o" t) y) c) p* n4 T - .DW Irq_Program ;IRQ触发时执行& D1 {% T$ F9 v' m9 ^: a; i$ l
复制代码
. _' s( D* y7 O" W* T0 ?0 k1 ?$ m
/ _" P# k9 K# s+ c! w! ]% b: ~
% H" G. x O1 X* S& }" r3 j+ e a: khttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|