|
|
- ;[FC音乐][MMC5 IRQ]! v' n4 y; ~, C$ ~ ]! S' \ O
- ;FlameCyclone 20230710$ k- G1 m6 J3 A
6 _7 F9 |, Q' ?% o7 G- ;文件头: b% I% m1 u1 L+ K3 v' Z
- ;======================================================================5 _* t. c* l5 a8 G1 n) {
- .INESPRG 4 ;16KB PRG 数量
4 `$ z; t! y c - .INESCHR 1 ;8KB CHR 数量8 t. T4 R+ k+ g% W [8 u+ g
- .INESMAP 5 ;mapper 5
& Y# a" t9 k$ ?( y H. D - .INESMIR 1 ;命名表镜像 0水平 1垂直$ _; }7 ?. W$ ^' E# Z) Z& c) Z
- 9 X- l2 o7 E3 p4 w6 ]) K M
- ;必要条件
. f" u0 U+ v* m# w1 h$ J - ;1.持有CHR ROM
/ Z- R V2 T/ v9 D - ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
$ a9 n) W4 M/ s* o8 O* k - ;3.精灵内存(OAM)不为空7 v$ {, P; H# @( Q' Z* {7 Y" |& l
6 d% k. L7 y" ]$ z0 ?# C8 G- ;==================================================7 T& f! R2 n2 l0 i# V6 o
- ;NES端口常量
0 v% R7 O' o* l+ B+ { - PPU_CTRL = $2000 ;PPU控制寄存器
1 {6 r/ Z7 H/ L9 N! ` - PPU_MASK = $2001 ;PPU掩码寄存器; y/ l* |' {) F1 K+ K3 {
- PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位& t" z3 s/ {8 F0 j, M
- PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1( x, p% A% {- i5 M- ^7 Z2 `
- PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1/ u6 C# x2 _2 Z& Z( S( s6 z
- PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
8 X5 \; Z' Z$ f' Z6 r - PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加4 e/ p( G4 m7 Y; P0 D
- PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
' Z* b N( I8 Q - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存5 b( Z! E: D0 N" H2 U4 A0 Z5 g
- APU_STATUS = $4015 ;声音通道切换
, k4 |3 s* x: H; ` - JOY1_FRAME = $4016 ;手柄1 + 选通: `/ z; s" f6 o9 ^" [3 Z
- JOY2_FRAME = $4017 ;手柄2 + 选通' B* R5 {. Q- O$ v
" r a3 [9 B" Q* F! C- ;==================================================4 l3 c' Y H/ G0 `4 w# A8 u
- ;MMC5端口常量
3 l3 q7 b, y6 d* P1 N* w - MMC5_PRG_MODE = $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*49 t W; g+ V/ y
- MMC5_CHR_MODE = $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8
( S4 _5 q; g1 v; O* K6 L - MMC5_PRG_RAM_PROTECT_1 = $5102;! w# Z3 t/ m, o2 Y0 d+ p
- MMC5_PRG_RAM_PROTECT_2 = $5103;: W; E% X9 }7 C. R& T% v# e! B
- MMC5_EX_RAM_MODE = $5104; 0: Write Only 1: Write Only 2: RW 3:R
/ q( I& O4 |' z& r2 _1 X& V9 { - MMC5_NT_MAPPING = $5105;
9 ^+ J$ G9 ?1 F/ `+ B* ]: V4 h( E3 t1 I - MMC5_FILL_MODE_TILE = $5106
+ c& O0 S$ Z/ S7 \5 \0 [, i' c - MMC5_FILL_MODE_COLOR = $51075 |5 n8 h, b F% Z- F
. Q6 p# s, _6 I- MMC5_PRG_BANK_6000 = $5113
3 r- x4 N3 F$ i* C& U$ j - MMC5_PRG_BANK_8000 = $5114. U/ Y( c K8 s& Q( R: g
- MMC5_PRG_BANK_A000 = $5115
7 G, P$ A4 L G6 D" G - MMC5_PRG_BANK_C000 = $51163 O8 W5 o* }' D% h- a7 m5 O2 h- A
- MMC5_PRG_BANK_E000 = $5117
k) \; ]2 E& R8 f; j" T -
! y) }+ ~% T3 R5 ~/ a: Z - MMC5_CHR_BANK_0000 = $5120
$ x; v6 h7 c0 |( C4 ~ - MMC5_CHR_BANK_0400 = $5121, b3 j7 o# [& K: h E8 j/ V' I0 T
- MMC5_CHR_BANK_0800 = $51223 F7 X; Y! A! t4 Z: h7 w$ j5 H
- MMC5_CHR_BANK_0C00 = $5123
7 j! N4 `( A; ^* U6 h: ~ |% A - MMC5_CHR_BANK_1000 = $5124! j. }# v; V9 i; i0 \
- MMC5_CHR_BANK_1400 = $51258 Y9 P' x2 k0 `
- MMC5_CHR_BANK_1800 = $5126
" v. X; {! U; q: |$ Y1 A - MMC5_CHR_BANK_1C00 = $5127
* d8 A. J; [) {/ U! D# c- X
# J, K, J8 `" j0 t/ o- h' Y- MMC5_CHR_BANK_0000_1000 = $51281 v% c! I# ~% Y' m2 }
- MMC5_CHR_BANK_0400_1400 = $5129
, x# x v* V! R" B9 X - MMC5_CHR_BANK_0800_1800 = $512A+ m2 }! e# D( x+ o/ z' I. K% f
- MMC5_CHR_BANK_0C00_1C00 = $512B
! y) `& w5 A/ O$ F0 M& j - # V7 i6 q6 _- Z: m& w
- MMC5_CHR_BANK_UPPER = $51301 y0 `: E7 b8 s2 R6 ?+ w5 I; @
- MMC5_V_SPLIT_MODE = $5200: P' ^7 z: q+ }
- MMC5_V_SPLIT_SCROLL = $5201
# j7 p! I" P* B& \; v& t - MMC5_V_SPLIT_BANK = $52028 F% w4 D# q8 s/ h m& b. d
-
4 Q. [( x/ m3 @ - MMC5_IRQ_SCAN_CMP = $5203( E) P! a, ~$ V" Q/ v0 g
- MMC5_IRQ_STATUS = $52043 c m8 J$ h5 g- |
- MMC5_MULTIPLIER_A = $5205+ O5 ~2 U# W! v% Y4 H& g' J
- MMC5_MULTIPLIER_B = $5206' I1 j7 ]$ W4 D0 d$ g+ O; h ^
-
$ N- r; b, ` ~8 ]3 H2 @/ j% X - MMC5A_CL3_SL3_DATA = $5207
6 Z$ s& e5 f4 f( k6 e1 }) P - MMC5A_CL3_SL3_STATUS = $5208
7 ~7 M+ C! S1 X - MMC5A_IRQ_TIMER_LSB = $5209: V0 A0 T: ^3 t9 {( U! W# F' j/ L- S
- MMC5A_IRQ_TIMER_MSB = $520A! ]% S. ^' v/ q ~" V
# V4 |5 i3 [) |/ X7 b+ X- ;==================================================# K% e6 u ^/ j6 W0 P* l( |# s
- ;程序块配置
" o9 y1 m, i4 |* c3 e D6 u8 ~ - BANK_DATA_MASK = $07- h7 X4 @1 }$ x
- ;--------------------------------------------------7 {* F& S) ], P# U* ^) S5 H" E2 c$ l
- RESET_BANK = $078 i1 T) u1 o4 f/ u) x$ E1 n* `
- RESET_ADDR = $FC00& z2 h+ w b' G3 { J8 P. k/ J
- ! W8 e8 |# ?8 H6 g
- ;==================================================
2 j. p3 z5 W7 V. Q0 {2 t( s) r - ;图像块配置; A' Y9 A+ c% [0 j- P8 `
- CHR_DATA_BANK = $08% D# C0 |3 j) P! n) z
6 ~3 t, p+ l8 {( H0 @$ ^- ;==================================================
' L' k0 {! O7 V8 q - ;零页内存地址配置
: ?5 z) K5 o( v0 g - Use_Ram_Addr = $805 w5 s& P! h; R( m1 d# P" k9 c
- PPU_Ctrl_Buf = Use_Ram_Addr4 ^$ e G1 q1 B; O; C1 a) G
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01
5 Q# s! b& T$ X - PPU_Scroll_H = PPU_Msak_Buf + $01+ G7 ]* z! u# \& h |
- PPU_Scroll_V = PPU_Scroll_H + $01
. t2 G% `' N( p - FC_Data_L = PPU_Scroll_V + $013 r) z* @: X/ V ?: U3 T: O7 v
- FC_Data_H = FC_Data_L + $013 o/ r1 e( W& E
- FC_Data_Buf = FC_Data_H + $01
* p8 z7 q2 {# ^7 x2 p6 R4 u$ ~ - ;==================================================2 h) I1 p& q3 @( |
- : G* a5 N. E+ m* q
- GAMEPAD_MERGE_FLAG = $04! n/ U; n( l( S* F/ U1 H( J
9 E" P% O; \! C8 P* e+ t- Gamepad_Keep = FC_Data_Buf + 1$ z" T, Z: H' s; j; B) m8 p. T
- Gamepad_Once = Gamepad_Keep + 2
: e' ^ _& k" f - Gamepad_Temp = Gamepad_Once + 2! A2 \- Y) r* g# s7 w1 G5 i
-
9 g! W2 _, P) z* D - Gamepad_0_State = Gamepad_Temp + 2+ i6 W/ q) |( L/ L- H" ^- P
- Gamepad_1_State = Gamepad_0_State + 19 U" I* t% t* n8 p
- Gamepad_0_Value = Gamepad_1_State + 1 H0 y: f4 O# F# @4 b. a6 \/ r8 f
- Gamepad_1_Value = Gamepad_0_Value + 11 @& X/ z- S& M, e$ w+ G) ~
- Gamepad_Port_Value = Gamepad_1_Value + 1
4 p5 I, G% y* {5 {# E8 d& V* P - Gamepad_Merge = Gamepad_Port_Value + 17 w$ t! k) V. X% S5 F0 w6 T' B! X
/ {( {$ m4 i4 y- ;==================================================
- x9 u& b: H% n9 p: [# B - IRQ_Index = Gamepad_Merge + $01
3 S% U8 Q4 ^+ J9 } Q: A% |0 d - ;==================================================+ n/ g- E* O+ D' \* I3 y
9 y- ?7 C7 I' m( [8 l- B- ;CHR图形数据% X. d/ X8 j9 O; _2 k8 M* K* B7 q% S
- ;==================================================1 |( W6 Q/ A h( w; F
- .BANK CHR_DATA_BANK( w' i4 L: l) l3 e: d' [
- .INCBIN "chr_bank/chr_data.chr"
( j. x, t/ B6 j$ N, W - 4 W) E) v# M0 q9 E* h* ^
- .BANK RESET_BANK & BANK_DATA_MASK5 Z' H* Q) l# n
- .ORG RESET_ADDR8 f& U# N' F* ~% K( ^; ?
-
% v5 e( w& Q/ P8 Q - ;--------------------------------------------------
! r+ n4 I; P& } - Attributes_Data
`9 s2 w. ?5 k - ;命名表属性
V* u9 J. z4 ^' f9 @ - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
( \6 E: \% p r/ G+ V, u: s - .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
( T) U4 d) |, V% }1 X9 f$ J - .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA/ ?7 @5 ]: }2 j1 k
- .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
, I$ R8 w- h1 B& Z1 ^ - ;--------------------------------------------------
o7 \8 _" U' P- C0 P - ;调色板数据" _" [/ E; @) r: T
- Palette_Data
1 W ]! b/ K% ^9 }, P( g+ I3 } - .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
. k/ c- L& ^! G! D - .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F' u. D' r+ z3 o
- X" C1 I* G& P+ S$ Q0 h
- ;==================================================8 U5 V4 I5 A1 k/ j- G2 ^! V3 Q/ H
- ;命名表初始化- w: G' ^% v, U! M. E
- Init_Name_Table
+ ^* }8 N) E9 [1 X7 l; c - LDA #$20
. o6 c6 \: o7 m: l5 d - STA PPU_ADDRESS
. a3 n( Z4 @: A+ w3 p - LDA #$00
4 K3 \& o) T% y7 Q0 z! l# P* [+ z - STA PPU_ADDRESS
: O7 _ Y N$ v - LDA #$00
3 d' s' T8 h% z2 a9 L8 ?: T - LDY #$00
5 o0 g2 G0 I5 P7 g - LDX #$10. B( t" n+ [2 z& {7 D# \2 ]: T
- Init_Name_Table_Write9 H; n: Q u1 A- a6 _1 ?
- STA PPU_DATA
* f8 |/ f& u. V4 G( j - INY( h2 r8 F& w7 J7 v% _& w
- BNE Init_Name_Table_Write
& L# d. H- K& J9 _" ]# x - DEX
- d' v( M p! m) ~: y5 @ - BNE Init_Name_Table_Write
! z7 y9 c) Q v c% V( k0 c - RTS
" s% {5 l% M; x* n, S3 T -
. ^! \) A5 w$ d3 Z - ;==================================================, t! l; D5 f' b8 f. h& E7 I e
- ;调色板初始化+ @' X3 e: M, x& ~0 `: ~
- Init_Palette
4 t8 x1 o& `* Q9 ~% B O& k% G - BIT PPU_STATUS
8 d; n' s/ o+ X( W" v - LDA #$3F- K U% y2 h4 ~0 y+ ]5 X0 P
- STA PPU_ADDRESS
, F7 U; G/ A8 S+ K2 y1 U - LDA #$00% @2 f) [- L1 i5 h/ ~
- STA PPU_ADDRESS
4 v2 z4 b* i: `5 A - LDX #$00( A; ] o! M1 H
- Init_Palette_Write4 Q% e) z: b. K# ?
- LDA Palette_Data,X6 f4 k; n! H- {
- STA PPU_DATA! k' R. k) z' f# X' ]% W& Q
- INX
0 z8 J. @& U$ }& i3 c# i - CPX #$20
& H4 j8 q$ D1 ~+ ^! u - BCC Init_Palette_Write" f% [8 {3 }) w1 t& m" [8 {8 P1 @
- RTS {% B H. U$ W. ^2 ?8 y. K, r" B9 r
-
6 }2 E9 Z9 P' l, g: K5 h1 Y - ;==================================================4 n, t& S9 p& g% {
- ;设置命名表属性
# Z7 N$ W% M/ n; |- C3 j6 Y - Init_NameTable_Attributes
V- `: G' m* e* b4 y) @. a1 D3 \ - BIT PPU_STATUS5 I; v+ p1 [. ^# Z; U
- LDA #$23& y+ H5 v k1 {+ |
- STA PPU_ADDRESS
6 i8 J0 n4 J" e: F1 F - LDA #$C0
+ ~7 }+ R- M0 j/ |- ^2 h# N - STA PPU_ADDRESS. [* \: C- t3 p T. r! b
- LDX #$00$ P# g4 S: W3 t% S, {
- Init_NameTable_Attributes_Write
! a: q/ D! k: y1 Z - LDA Attributes_Data,X
, q9 u- c3 b. R: Y, [5 X3 e g - STA PPU_DATA
0 l6 m z" c/ o! G- o. f - INX
/ p& n5 b3 j3 [7 `" `6 S - CPX #$404 Q+ X% A E2 Y1 D* ^
- BCC Init_NameTable_Attributes_Write
- G( j5 N9 {2 H6 u9 M - RTS I4 w" q% ]) u' Q" H; ^
( o( J- K- `$ k% ]. x# H- ;==================================================
; ?2 M0 I8 F/ s N+ P& n - ;初始化命名表文本2 \5 W# s, \0 @, j r( A: i' S5 w
- Init_Name_Table_Text
+ R6 O- o7 h# ], v2 j( T+ R - BIT PPU_STATUS! A5 Z4 ]; r; J: ~9 a" j. F
- LDA #$20
6 _8 P: S3 d- c - STA PPU_ADDRESS
, ~) U% W7 k+ B1 f - LDA #$00
3 r. w% ^( {( b9 X - STA PPU_ADDRESS
6 c C- ?9 h( M9 N8 m - LDA #$003 e6 o: W8 }6 l6 x; S7 l
- STA FC_Data_Buf; N1 O3 D5 [" t2 F- v/ R; q3 Z
- LDY #30/ m' s& |2 t2 M2 P
- Init_Name_Table_Text_Write+ K& n' F% t R) m7 j' @2 e E
- LDX #328 |5 q: Y9 T4 b7 f3 n/ `& ~8 x
- Init_Name_Table_Text_Write_Char0 C( ]. }0 c! t: k. {" I
- LDA #'0'
1 L, D3 M, W7 I; U7 x3 E - CLC* d) R9 n$ X# ]" ^! R
- ADC FC_Data_Buf* G8 h# D# } b' ^* y: P4 a6 G
- STA PPU_DATA
1 u% z4 |7 X+ j+ A4 p - DEX
" J* N$ y, O4 z5 L+ ^' h+ U - LDA #$14, w9 Z, o& F3 B
- STA PPU_DATA
y" u2 j1 O, t; I# i* H - DEX
" E& D* \+ i5 R1 T$ G+ _* V - BNE Init_Name_Table_Text_Write_Char
0 C& O- ~: F9 J. ~( v - INC FC_Data_Buf
u/ M5 b* f) c' X$ n! h) H - DEY$ o; g) Z4 p) k
- BNE Init_Name_Table_Text_Write* n4 S! L8 Z2 ^* _: V* e
- RTS: M" k- y$ |# J5 H; v
/ g6 `/ ~ t* h; D. v$ U- ;==============================
2 ]: R( t) j1 R! G$ G8 n5 v - Init_OAM_Ram;初始化精灵内存
. u+ m9 E! f' Y0 u: D/ Y - LDX #$001 D+ o- U- J3 _" I. Z
- LDA #$005 |. e" f4 _+ f1 H4 s
- STA PPU_OAM_ADDR# P( z) i* h9 w5 P, G, ]
- LDA #$F8
3 b7 m. N* Q7 O5 P; f# R3 u. @ - Init_OAM_Ram_Write
8 |9 d! i; G: R1 x - STA PPU_OAM_DATA
) C, h7 Q `5 s1 ]3 g3 k5 T - INX
: u- L3 Z! d6 v: D/ R8 u - BNE Init_OAM_Ram_Write% K% j3 v9 J- c) O
- RTS
! D! p/ ?" O; O; C( f \ -
' F0 k1 }4 B3 a7 [& O: b - GamepadProcess;手柄处理! [1 O% y: N" D
- JSR GamepadDatacan
: C! C+ D- z1 D - LDA <Gamepad_0_Value
' _4 l y( J9 d3 Y6 w; [9 h# Q - STA <Gamepad_0_State
( F% |5 F/ L& q6 }9 A - LDA <Gamepad_1_Value
$ ? f& u# r/ C8 K3 V" x0 o, |+ k - STA <Gamepad_1_State
1 W& S0 m$ z+ |! Y' K - JSR GamepadDatacan1 j4 C f3 }1 O: a, ]: E
- LDX #$01: ^) X4 @' r7 R2 ~* g9 ]+ ?
- GamepadMergeCheck;合并手柄输入检查3 Q% m1 N0 e! X( E0 i* I" n+ I# `
- LDA <Gamepad_0_Value,X
) [. Y1 ?; x. s- N6 y - CMP <Gamepad_0_State,X
7 E+ w) b0 H) r% j% t$ c - BEQ GamepadMergeInput) Y B% g0 N v' r! N: Q" x
- LDA <Gamepad_Temp,X
/ L; ^' n/ P Q- P: t4 ^+ c5 B - STA <Gamepad_0_Value,X5 w, c4 p' M9 d
- GamepadMergeInput;合并手柄输入" i) k- O9 J0 I% m4 N
- DEX
. q8 E! w* N, T1 h1 { - BPL GamepadMergeCheck
4 T4 P& N$ u5 l* Z8 m5 Z c - LDA <Gamepad_Merge; D( q8 v) a: G/ x% |8 s- H5 Z$ A5 w
- AND #GAMEPAD_MERGE_FLAG7 w$ v8 ^! d5 \0 ]3 z0 V2 j
- BNE GamepadStateProcess
( _5 ^3 s* ~ m3 k7 s - LDA <Gamepad_0_Value9 v: P& Y8 p& G% K0 n
- ORA <Gamepad_1_Value
# A( c( {3 N1 h% q) N6 b0 G$ ?- ? - STA <Gamepad_0_Value
( l7 ? ^6 p8 Q/ S& u: G4 D, A - GamepadStateProcess;手柄状态处理3 f* N( G' D7 Z3 H! d
- LDX #$01
7 \+ c9 p0 ~/ A - GamepadStateSave;手柄状态保存
: d2 @: s# y# O' P$ [/ i - LDA <Gamepad_0_Value,X) l$ b! c0 A" X
- TAY
8 J1 r8 h c0 A) Y3 s - EOR <Gamepad_Temp,X( I2 N$ e. d" d1 U B
- AND <Gamepad_0_Value,X
. c9 `( t) X/ U% P Y" q, L% Q: d - STA <Gamepad_Once,X$ G' n" q/ G) h5 p
- STY <Gamepad_Keep,X
# }! U1 u8 A8 U; U - STY <Gamepad_Temp,X3 T% v# k* O2 O# X
- DEX
) |" A1 ]3 I- o - BPL GamepadStateSave2 q6 f# ^5 Z1 J2 u6 _4 G
- RTS
* B' \ n/ J- O0 w; `8 ~
4 I; q( B; l2 s! F/ p1 v5 ~- GamepadDatacan;手柄数据扫描/ _5 `! p! q. N
- LDX #$01
- ?" S- V1 h9 V. f! H% z - STX $4016
0 k7 ~) V) V7 l* u - DEX7 B- v" p1 g e' l' D( I6 w
- STX $4016
" c, r% v3 n: X" `5 |$ P' X - LDY #$08
, z3 ^& ?* B- f/ ]5 H4 q+ o - GamepadPortScan;手柄端口扫描6 F8 Q7 \% O, q- E1 x: @! R
- LDA $4016
% [4 q4 p; Q2 c9 N' k - STA <Gamepad_Port_Value% B2 |: V J3 n5 ]% p2 v' }' e3 m
- LSR A
* b. C0 g* B; O& k1 j8 e1 `; k - ORA <Gamepad_Port_Value# V- Z1 E# z& f0 e" ?3 ~0 g
- LSR A
' I3 U9 j* X' J) o7 Q7 t8 b: I - ROL <Gamepad_0_Value
# o [% I2 r% F( ~7 u0 H - LDA $40176 _/ Z: V* D1 G! _
- STA <Gamepad_Port_Value
9 D! `: {+ m7 t" v - LSR A
) E) n& C+ s3 c" p* U9 D* y. G - ORA <Gamepad_Port_Value
r% A6 w! d! Q" F3 c( d* ` - LSR A
7 z2 A% d8 W( U - ROL <Gamepad_1_Value
! ~ {4 e# n! z2 b - DEY
& Z2 e: C. v3 h2 m8 u# t) V9 |' ?( p, [6 v - BNE GamepadPortScan9 M/ p q. ~" u8 t4 d5 X; [
- RTS" U- i" c/ }" _# u O% n
- + Q* j7 [4 Z/ A; U, V5 n5 J8 L
- ;==================================================
% {1 {. y- t+ @ - ;PPU处理
" O1 i1 T2 ?- P6 { - PPU_Process& H( K/ w$ A/ \ C% N; W: ~& z4 c
- LDA #$00* g- u' o. ~9 ]2 N$ `* {! t
- STA PPU_MASK9 o. `+ Y( o. h+ l
- + _5 f4 L0 G/ l3 A
- BIT PPU_STATUS
& f- k5 y" O2 B# {8 G0 L8 a - LDA #$20
- V8 x# ]& I2 B9 [) Z0 N - STA PPU_ADDRESS9 H8 e0 j" m' V1 Y* T5 O
- LDA #$00
- |. b9 C/ o N8 G G" a - STA PPU_ADDRESS, H% F3 O# [9 X+ j
-
& k* Q! B7 B. d1 F/ g - STA PPU_SCROLL, G, X. R+ d" H/ x+ A4 U0 ^
- STA PPU_SCROLL
5 {% Z" V/ A: d. x - 6 P* A3 F0 c$ f; y+ o
- LDA PPU_Msak_Buf
9 ~7 i+ ~( L4 m' l- b3 l& W - STA PPU_MASK# I3 \ Y3 Q) D
- ]1 Y2 t% [" V& u7 W3 u
- RTS" M& n0 C0 j; j
- 7 p7 g! c8 R5 x
- ;==============================
) p; u) o# \: L* H) D - Time_For_Vblank;延时等待, R& p6 b- x: h y$ i) c- N0 S
- LDA PPU_STATUS" I6 D0 x2 O4 E
- BPL Time_For_Vblank& e" H+ m, i; ]8 o# ]6 a4 y# v1 ~
- RTS1 g% F" P" |7 C
- , C3 N: s F k
- ;==================================================6 b: R' V8 f- p! V; ~' c
- ;初始化MMC5
- x0 K- }7 d6 _ - Init_MMC5% M$ i; v: X7 }. B- G; l) D
- / n5 n; P4 z$ A( O' p' J$ B
- ;设置一下6000-7FFF的RAM
3 N9 X p2 f' w; O1 j4 H; z - LDA #$00
( L# K( K! j: z7 Y! R - STA MMC5_PRG_BANK_6000
5 ^5 \& r( t5 F: C! o - 4 u& X8 [0 e; m
- ;开启 PRG RAM 写入; u0 g8 ?5 ~& f1 t& a w! u
- LDA #$02, z' I+ h* [: `( v% [3 U! n) B
- STA MMC5_PRG_RAM_PROTECT_1
; m& O$ y0 M$ m8 |4 f - LDA #$01
/ Y( a" k$ y& t& w" g - STA MMC5_PRG_RAM_PROTECT_2
1 ~# a2 S6 \+ i9 U: V - 0 ?% U& c9 c+ i" X8 i
- ;启用 1KB 扩展RAM ($5C00-$5FFF)
$ G9 Q5 r5 j; d4 A2 v: K y* D - LDA #$02, u2 ?. T9 n, z8 A
- STA MMC5_EX_RAM_MODE
* d- b+ `: s9 G) `, c) G - : \$ Z7 ?2 c, B: y& e) W
- ;设置 CHR
+ g$ c) \0 i: n5 \# Y. S - LDA #$006 v$ `5 G& p! @) P# u7 |; h
- STA MMC5_CHR_BANK_0000
! v* u _3 w' D4 S; z - LDA #$01
4 ?. ~ Q+ X6 T. D/ ^- n' V. P: V - STA MMC5_CHR_BANK_0400
. K2 [' J& F) F K - LDA #$02
& {. v2 B6 T% v, Y3 i' N - STA MMC5_CHR_BANK_0800, h0 V' ?2 Y$ I; q, R3 F. F& \
- LDA #$031 g; G) U3 f, _: }4 n& L
- STA MMC5_CHR_BANK_0C005 y0 t' J6 D) |' Z* N# ~, F+ ]
- LDA #$042 _) C) o) P5 V
- STA MMC5_CHR_BANK_1000+ B5 ]& y# L7 q: C
- LDA #$05
% e9 B! \/ I4 l& e- A; w3 Q - STA MMC5_CHR_BANK_1400
6 Z+ @$ B7 ^* ?( j; D4 R - LDA #$06# a+ W. b( l( }) w' I5 r
- STA MMC5_CHR_BANK_1800
: K/ M) |) L6 y1 ? - LDA #$07
& U1 I2 D$ Z: r( A, B - STA MMC5_CHR_BANK_1C00* b7 v% _+ @# l/ L0 U9 }* ?
- % o7 X' e& U- z/ L& F
- ;设置屏幕镜像! K- r( W' a5 v) H: k" H8 [7 i
- LDA #$50
' R# W' [2 W) x+ n1 [8 I - STA MMC5_NT_MAPPING
8 M8 x- n* t- B" j -
; l" M0 |8 ^( T/ D5 \ - ;禁用IRQ
; Q$ D8 k, H: n, R9 o8 S - LDA #$00
Z, M7 [: `" } - STA MMC5_IRQ_SCAN_CMP6 H. G/ {2 W; E, g$ j8 R8 a6 p3 A6 O
- STA MMC5_IRQ_STATUS! h; E* {9 Y1 t4 a* h R6 K' U
- 6 Y7 `$ S6 T4 `- d! `
- RTS6 ^3 j0 Z: m. ~$ ]: }# T7 q
-
' b( X* V# H' ?8 n9 I7 T% T0 S - ;==================================================0 x* r( R- A$ G7 {4 s5 [
- ;重置中断处理
1 \$ V" e, j1 M - ResetProgram6 X3 h: c0 Z* z- d. b* R' B0 T
- SEI) a8 _7 L3 n: }# x. v; j1 D
- CLD- `8 ^4 i1 \& Z' V6 O) k
- LDA #$00
5 ^7 W& L5 Q5 S* M$ { - STA PPU_CTRL
# B o" V. b( h0 p; b% V - STA PPU_MASK
6 [+ r& A" @, T9 `9 U; q1 Q) H - STA PPU_STATUS. H' [) |% x3 G+ V
- STA JOY2_FRAME. X% W' m* ?- L! q
- STA APU_STATUS$ _2 T3 J0 F- i0 Y8 C; W
-
4 N3 e5 C& w* W+ `/ K; H" @) T - LDA #$C0
' q/ Z3 b0 A" U* ~7 P - STA JOY2_FRAME
) o8 y" |; c+ _# p l$ ]2 \ - * f" P- e' T" {; F
- ;等待vblank
" M p. W' }. c% v/ t! P - LDX #$02) z4 {' \0 i* |) Z9 Y& ^( ]
- Vblank_Wait_14 g/ z7 c4 o* n% T3 [
- BIT PPU_STATUS
9 N* v' I/ G O2 P& v - BPL Vblank_Wait_1/ d; w8 R1 n- t9 s* V
- Vblank_Wait_20 s, @9 ~6 U6 l9 k$ @
- BIT PPU_STATUS% r6 k; r: z- }! e4 M6 S: K/ E3 x
- BMI Vblank_Wait_2
; t3 g! u0 t# y, v. s: f - DEX
& b2 p8 J, J4 M/ Q b3 ]( {7 w& y - BNE Vblank_Wait_1
# k' Z2 u' _' V - ! |2 Q. @8 J: R* U& ?7 W+ W# u: n
- LDX #$FF! E" }0 ?; ~; h# o) L
- TXS) C; X5 G: d) _ [3 Y
- 3 J5 T0 ~- r+ A& D2 d( `- Z
- ;初始化MMC5
3 r+ k F4 Y+ W( b+ Z) ?( a% k - JSR Init_MMC5
$ ^- f+ H$ O9 X* @, V6 v1 T -
0 S9 d& ~. H% a2 i J; F - ;==============================' ^ l) S; J" L- W$ u
- ;RAM初始化: ] B& ]; X7 w. z5 J3 Z
- Nes_Ram_Init) y: L! |7 {7 L9 A# n* \( y- s, m
- LDY #$00
$ Q6 l( i! h. l3 g; S e - LDX #$08
1 G" |+ r( X- z# [7 ?, ~* p - LDA #$00- A I3 y4 m/ ]3 Z
- STA <$00
& Y0 j/ p& u, b, C" d8 T. Y8 C" p3 b# Z - STA <$01
: D6 m$ ?3 _5 x4 {% E# F: I - Nes_Ram_Init_Write: ^, G( P$ _/ I3 j
- STA [$00],Y% t7 t/ Y0 p0 V# }# ?
- INY' Y& e( e: n4 ?8 C! _5 m
- BNE Nes_Ram_Init_Write, S) r& g# D |# f0 k! M: z' ]% F
- INC <$01
4 H& g% ~$ ]! V0 B - DEX
6 Q+ l7 g- N! X. Y/ v# l8 T2 l - BNE Nes_Ram_Init_Write
! u' n( ]4 I4 O- A! u( [) B -
0 Q& r/ ?5 X$ v* K4 ?4 Q# z - ;初始化命名表
2 ^' @ ^" _: Z - JSR Init_Name_Table8 N1 B+ }2 ]5 v7 L8 A$ T8 w
- 2 h4 ~# h* i/ D7 o f" \
- ;初始化调色板
4 Z9 g& I; j& ]2 P& ^ - JSR Init_Palette
' |5 }, |! `( M6 | - ( f# P- Y. Y- _2 n. i
- ;初始化命名表属性' c1 K& W! ~) l! Z+ }( B
- JSR Init_NameTable_Attributes
( N n! f6 V! P2 ^! ]* N -
1 p1 J2 n* W R - ;初始化精灵内存
- V; T7 R0 B. P$ `. r$ [ - JSR Init_OAM_Ram
$ {+ u# M% k7 }2 ~, Q% { - $ T* q) s8 W H
- ;在屏幕上写点东西
; ]. h6 Y5 l. Y - JSR Init_Name_Table_Text9 D) ^ u8 k1 X$ ^
-
1 `' T3 E6 J. r - JSR Time_For_Vblank0 i" s3 L; Y1 n4 {6 y
- ;开启PPU控制
- }' f' J3 u: n8 u E - LDA #$88
9 [' P4 T/ N2 e- Z: R* a9 U - STA PPU_Ctrl_Buf
2 e% w2 t. F, G - STA PPU_CTRL* r" ~# s* i+ \9 |5 g8 ~
-
8 b |0 L+ N1 R( E/ Y# I) M - ;开启PPU显示3 M+ j6 s( y) b2 |: r) S
- LDA #$1E9 f# o" q' P. D/ p
- STA PPU_Msak_Buf
n0 ?3 a- ]; k! A& s) z; c1 W+ y -
! u8 I) N6 ]8 F3 ?1 N2 X - CLI" ]4 {% f9 Y8 b0 m2 c: l+ `
- JMP Loop
3 d! s) ?7 }* Z# {! L -
1 [6 W8 t3 X% n/ @/ n - ;==============================
* n9 Q4 _5 `2 N- |& z - ;死循环, 等待NMI中断3 p7 c; }) ?! T5 B; R$ w) ^/ l
- Loop
6 ]4 R5 }& z$ V) l& _ - JMP Loop' Q, Z) B% u9 F& y# C0 {4 F. f
) t' H) ?( h( S- ;==================================================) w% f" F5 N4 D
- ;NMI中断处理
8 Y# s! ]' [% P1 B6 T9 E0 M. e - NmiProgram# w- I7 o$ W' W$ U
- PHA
, X4 _" W0 i& H) V2 I3 L$ I - TXA
' q# Y3 L# M+ X" r: C+ M4 R/ } - PHA, |8 s. ]3 s7 F' m4 f, O# O
- TYA
& @6 H& r, T2 w4 _5 B T7 X8 B0 T - PHA, [' G: X, p' c0 Y5 t" A
- ) V: K4 M9 L' y# A- F, B
- BIT PPU_STATUS
0 a& S; c) U+ B7 u8 \2 J) N - $ r/ |$ I1 i1 R
- ;启动IRQ中断, 第16条扫描线触发6 D' E4 f$ u5 `1 [" W
- LDA #16
0 O6 q7 T+ s# N0 y& f' k& Y - STA MMC5_IRQ_SCAN_CMP8 u) Q) ^. b% b3 W; b
- LDA #$80! h0 d$ K4 h( R
- STA MMC5_IRQ_STATUS" e8 [8 J7 h4 f
- CLI
) w( N. F. r" F/ _/ E' Z; ~+ ~, U - * T) A8 y7 z- P. ~' ~+ \6 u
- ;关闭PPU控制
/ {8 s- \) H& d8 H5 |8 r% N. v - LDA #$00
2 U" B2 T# P1 R6 K - STA PPU_CTRL, D1 U) ~& O9 v. _3 t% V2 h8 V
-
; O$ g! l, W* @" ? - ;处理PPU
/ @) m! s1 |$ ^5 f4 R: J - JSR PPU_Process; i7 K. \ P' z( Q' r9 U# B
-
4 @; `. G3 j" Y' C" E - ;开启PPU控制5 _7 x9 l5 F& c/ B- ~, W- L% M1 R
- LDA PPU_Ctrl_Buf0 u. v% a5 G2 \; F& _! v3 E! C
- STA PPU_CTRL2 o2 ^) H4 c3 |; ^
-
: v4 @, N+ @" e - ;手柄处理0 C) u1 V* W i0 |' U( q
- JSR GamepadProcess
1 P4 h. X. g: p- B0 j - 7 f" ^# v! ]1 h% g- [
- LDA #$00
% O* P, Q- \# y/ z8 n% @3 U - STA IRQ_Index
2 H. s! l% U( V. D; O5 E -
8 V( b# D8 h6 Z) E% E# X0 ]" K. ^2 c6 W - PLA
1 M$ {/ m# H4 r, ^+ [, s% Z4 B& l - TAY
4 U+ ]( w6 }1 x9 y1 j - PLA
8 j! S: Q2 W" _$ S B+ ^ - TAX
/ g% y+ r, j9 w& {; u( P k. X - PLA
. j( U' {: d6 W f0 [# T( R - RTI
$ R$ W- Z8 ?+ ^3 y$ t$ Z! o: } - / M+ F7 ?- E, O: g% D0 p& ?) g% L
- ;==================================================8 S2 L, l* |: w9 ~) @
- ;IRQ中断处理
% H6 V; _, F1 @1 `: P4 ?/ U - IrqProgram) H, p( u+ c* j! K" y
- PHA
+ R2 Q+ O9 v* i ]- x4 r" `8 ? - TXA
; p9 h7 {# @' {- w9 E6 d4 B - PHA
/ Y6 o( D/ w. X2 p; G* o - TYA
" a u- L: B% g3 v8 ` - PHA5 U! c3 I$ V3 o# }& M
-
8 J8 A9 [9 ~2 Q5 P - ;确认IRQ8 G- O0 B3 g5 V) ]/ Z# q, f
- LDA MMC5_IRQ_STATUS" h; q/ G. ]. }0 R5 ~
-
6 ~2 q. P( D5 ~3 K - ;允许下个IRQ触发( W' g! c! I% }
- LDA #$80$ k- N$ G$ l8 p: R" {
- STA MMC5_IRQ_STATUS
0 P/ s/ k7 j! i - , R* k6 s* K/ y
- ;IRQ处理, 每隔16条扫描线触发% H2 [4 U7 `1 r% p
- LDA <IRQ_Index% N1 ~! K5 @7 D) J
- CLC
( @/ u1 {. e0 T4 x - ADC #$02& B* {0 n! y/ N4 M# `
- ASL A [: U2 J9 a0 P1 H3 Y
- ASL A' ?% l/ j# `& o+ ~1 F* V* m9 a
- ASL A
, K5 J* o/ ~& {3 h8 T& `: f - ASL A. R4 @3 u, l4 } t4 d* L6 t
- STA MMC5_IRQ_SCAN_CMP) r5 q7 v, A0 h8 T: W7 W* {
-
3 w" U j; d0 N$ t3 T+ ^7 a - LDA <IRQ_Index
; k8 m# i, S$ l7 [ Y - BNE * + 4
1 Z r/ h% _8 m; U* ?( v - INC <PPU_Scroll_H
6 t2 j7 ?6 y9 s3 }' J: B, s" m -
" p. f( d2 P7 ]8 ] - ;设置屏幕滚动
) {( t9 r9 p6 N$ V3 A4 d. K$ p% N - LDA <IRQ_Index/ D8 F! @1 c9 m% Q, x1 o
- AND #$01; X: \+ u) V" g" l
- BEQ Irq_Scroll_Right8 ]& a: W) h, w P5 ~
) k( O$ X G3 O% s, j/ ~- Irq_Scroll_Left
9 E) N; Z; N/ F, b - BIT PPU_STATUS7 R1 q6 k2 P' I: K8 a5 }6 ]
- LDA <PPU_Scroll_H" a5 S+ }% {" B) n7 ]. X4 L' U+ x
- STA PPU_SCROLL6 n( u/ \5 D- _7 N& l
- STA PPU_SCROLL A) @3 m1 `- \) V" Z! O( e7 T
- JMP Irq_Scroll_Over
6 {: J* Q- `1 B3 e, k; h -
) ^5 _5 B' y' S. H" T0 p" {4 k - Irq_Scroll_Right
7 D; V0 \. T$ Y. p/ l- d - SEC
0 @9 C8 w3 x3 Z: P5 G% T - SBC <PPU_Scroll_H( D# U7 N$ f! [9 u$ Q, @5 X
- STA PPU_SCROLL+ Y' ~8 W6 ]7 {, E
- STA PPU_SCROLL, q" v) V, {: d6 p
- Irq_Scroll_Over( a$ g2 w4 Z, `) `) U8 j
- ! D) m' @8 P0 I$ ^$ u c
- INC <IRQ_Index3 M9 a# F* N7 M) V/ }# l: q
- + e2 `+ j' K# C! N0 s6 u, a
- LDA <IRQ_Index2 w1 ` B: K( m T6 W0 G V
- CMP #14
. u8 P: W8 d( y+ q - BCC * + 59 _7 { i; H/ W" K4 ?! a0 L5 ]) w6 b
- ;关闭IRQ
. ]. p. u2 D2 } - LDA #$00
0 z% M B- X" p% f - STA MMC5_IRQ_STATUS' Q* v( ?0 }$ s3 C, i* l; V- z
-
7 V F6 y- P+ W3 g- R2 D0 ` - IrqProgramEnd' ]! n; j, s$ z5 g7 h! m
- PLA5 Y8 d2 f1 T! s& W5 {
- TAY
- K" n2 T G& }$ z8 t* H5 S* R - PLA" Q7 Y; v2 E! o, L9 k
- TAX. ]& O& y0 P/ i6 f) S
- PLA
% T5 l7 z" n9 S5 q2 ?3 E1 a - RTI
. m. ]* z" b' G7 ?- ? ^* C -
0 U1 `# d. \0 S9 H - ;==================================================
7 K. N ^& N; [ - ;中断表
9 j: a# d0 g; ~ - .ORG $FFFA
/ ]+ o6 L! f" X6 A# i& y - .WORD NmiProgram
) Q7 m3 `& R! ` - .WORD ResetProgram
3 c" R' ^0 k. A: m w" U - .WORD IrqProgram
复制代码 % ]/ o# n5 H) C! R5 h
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|