|
- ;[FC音乐][MMC5 IRQ]
2 B- g- l* [9 Z7 ^* q - ;FlameCyclone 20230710. V. s$ B0 l4 W3 L
- 5 N& O9 z7 m/ ~ [( u$ e
- ;文件头
$ ?! P4 J( V! x c6 `! z - ;======================================================================) a( m7 `) K7 |5 F5 O
- .INESPRG 4 ;16KB PRG 数量
* W" Q2 a$ C+ g# f" H& E+ o - .INESCHR 1 ;8KB CHR 数量
; j5 s6 b* y4 s$ L$ k - .INESMAP 5 ;mapper 5 X4 v4 A: l* {) E7 t9 v5 ]8 |
- .INESMIR 1 ;命名表镜像 0水平 1垂直
3 G- l1 l; _* P0 u4 U
W9 K" Y: R% F2 L4 I4 k- ;必要条件$ \' G; q* z0 I6 {( ^" t/ ~
- ;1.持有CHR ROM
& x1 V8 `7 p) S% Z: A4 g% I - ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000$ W8 p& _; J; n) m* v( l2 R
- ;3.精灵内存(OAM)不为空
% c* H z- i3 e8 t) j% [$ f- w' f - & r# \5 k$ x6 c# w
- ;==================================================/ D, g1 F$ p9 Y& ?9 G
- ;NES端口常量+ o9 ^, l8 _; {* X0 o
- PPU_CTRL = $2000 ;PPU控制寄存器
& t! C7 y. ?/ K" m7 U% F - PPU_MASK = $2001 ;PPU掩码寄存器
! _! n" t) i$ p/ A! Z) ] - PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位% l! }7 h1 A/ i1 y% c
- PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
' C! Q2 W1 c0 K' C) w; A - PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
1 V& w# {! c8 u( T; q/ _3 d" b - PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 h$ G, d0 g. ^* e3 T
- PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
& }4 ]$ {6 b. R! @( R |2 q& E - PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
4 q# G8 i, k/ v! ]+ [+ Z - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存& V( B7 w8 ]3 b+ `1 s
- APU_STATUS = $4015 ;声音通道切换
$ Y5 W9 n( _) s c - JOY1_FRAME = $4016 ;手柄1 + 选通8 K5 U5 K$ A c9 m6 D
- JOY2_FRAME = $4017 ;手柄2 + 选通
; |) g5 o2 Y: l6 k! X& Q
# v; P$ z: L; _) i) ^7 p- ;==================================================
# v* B: q$ [1 o8 \) G6 J - ;MMC5端口常量5 a: z$ y* l1 m' e N3 d
- MMC5_PRG_MODE = $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4
2 ?* N3 z! ~- R+ }" R6 W - MMC5_CHR_MODE = $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8
9 M! V# _/ y# W9 D. Y7 b - MMC5_PRG_RAM_PROTECT_1 = $5102;
8 s$ u# g: x- H# h9 S - MMC5_PRG_RAM_PROTECT_2 = $5103;$ e' L0 ]- W. @4 H
- MMC5_EX_RAM_MODE = $5104; 0: Write Only 1: Write Only 2: RW 3:R
/ v, a! R1 T, L' T2 h$ [ - MMC5_NT_MAPPING = $5105;
7 d7 |$ _4 b' Q" H# s4 w - MMC5_FILL_MODE_TILE = $5106
, {8 J) E) H9 s& H3 f0 r - MMC5_FILL_MODE_COLOR = $51078 G1 d! a+ z E: E8 `& M3 E8 Q, }
4 ~0 K$ _' v& R/ ~5 L# T6 e- MMC5_PRG_BANK_6000 = $5113" y! K7 h2 g+ \: n7 V
- MMC5_PRG_BANK_8000 = $5114
D# M: N; x; G" S9 s2 U! X# b - MMC5_PRG_BANK_A000 = $5115
! U5 q3 Q+ X& x" }3 F4 B8 S - MMC5_PRG_BANK_C000 = $5116
. W8 a+ X8 G* ?2 [0 h - MMC5_PRG_BANK_E000 = $5117& V% B" e* ^+ G _
- + d4 X0 }3 R2 c" w7 V' ]$ h
- MMC5_CHR_BANK_0000 = $5120
1 a1 |) F- i0 e* _# ]/ h, r - MMC5_CHR_BANK_0400 = $5121- ~. l- T8 a- P( X9 Q# V% T5 s" F
- MMC5_CHR_BANK_0800 = $5122
. z- V0 T7 S5 v% l0 F- \ - MMC5_CHR_BANK_0C00 = $5123, E& [* } S5 l; l0 f2 W4 m, q6 m2 m
- MMC5_CHR_BANK_1000 = $5124- q" [! F7 u$ d
- MMC5_CHR_BANK_1400 = $5125# n/ B- S* X$ o5 W: \
- MMC5_CHR_BANK_1800 = $5126
" s2 Y6 F) h% K# f4 K( S) d - MMC5_CHR_BANK_1C00 = $51277 n5 }. r, i* \- T$ x/ _# s- T
- - n6 A& ]& a7 d& K
- MMC5_CHR_BANK_0000_1000 = $5128% _2 f: N% s D" G
- MMC5_CHR_BANK_0400_1400 = $5129% c. J' O4 i* H+ M7 k
- MMC5_CHR_BANK_0800_1800 = $512A9 v" i' o8 H* g' Q
- MMC5_CHR_BANK_0C00_1C00 = $512B5 |) J: V1 C- U" n. K A# A6 B6 l
-
; {; @5 a: R6 J: | - MMC5_CHR_BANK_UPPER = $51309 b' Y3 O6 M% x( U6 n' U$ x: r
- MMC5_V_SPLIT_MODE = $5200) Y3 e- O" {# x8 H. ~4 H1 X5 E* f
- MMC5_V_SPLIT_SCROLL = $5201# ^1 }$ d# Y8 B
- MMC5_V_SPLIT_BANK = $5202: o# G9 v# C( w3 z% N7 b
- 3 K! T7 i/ ^* }/ x* X4 Y# L
- MMC5_IRQ_SCAN_CMP = $52033 J# q7 _: i8 i8 F) C% [% L6 S
- MMC5_IRQ_STATUS = $5204
" V! w& K. P+ `* x2 a$ o/ k - MMC5_MULTIPLIER_A = $52052 E7 x6 B+ Z3 e
- MMC5_MULTIPLIER_B = $52064 P P2 P9 V2 ]7 j0 z. y
- , i+ j* s! V; n8 Y& A! K
- MMC5A_CL3_SL3_DATA = $5207! D4 o0 h5 ^4 i3 D8 X! A0 C
- MMC5A_CL3_SL3_STATUS = $52083 s W4 {1 \8 l: f/ g- A
- MMC5A_IRQ_TIMER_LSB = $52096 ]! ~! e. J( C' }! p" b$ `6 v
- MMC5A_IRQ_TIMER_MSB = $520A7 u6 o( P" r" |: c0 E/ _9 a- x
- 7 }5 i$ y% M) W0 V* b
- ;==================================================
- O/ h& N0 q8 ]1 q - ;程序块配置
' H; @3 F( X4 |9 M - BANK_DATA_MASK = $07
8 J$ ~- N2 m% F' o8 h, |- ] - ;--------------------------------------------------
7 K p0 n9 F0 [5 I$ G* V" Z - RESET_BANK = $07/ \1 K6 n6 F. r0 Q& K2 k7 t3 G2 ^
- RESET_ADDR = $FC006 h$ t: H3 J8 Y2 Q: O
; v) n) \6 B Y7 y; h$ H! s' D" o4 q9 d- ;==================================================) P0 x( D* w/ q# u7 \9 n
- ;图像块配置
/ j6 p" }+ E r( } - CHR_DATA_BANK = $08
1 S [4 W- ~5 B1 g% i0 _8 R/ g - ( E3 i8 s# C* O
- ;==================================================
2 s, n5 f& k# i4 R2 y, { - ;零页内存地址配置2 O) C( Z3 W' Z9 q9 T$ t0 |; e+ U
- Use_Ram_Addr = $80
+ Q* N1 h& O) j6 O4 G5 D - PPU_Ctrl_Buf = Use_Ram_Addr
6 l- {, e; s- m1 E+ } - PPU_Msak_Buf = PPU_Ctrl_Buf + $01
9 ^4 U2 V4 ^; C8 r1 I% z - PPU_Scroll_H = PPU_Msak_Buf + $01
6 ?( ~# k; P2 \6 e I" J) B - PPU_Scroll_V = PPU_Scroll_H + $010 d# K6 b, u" x, j, y2 C ^
- FC_Data_L = PPU_Scroll_V + $01
4 B1 I) f1 X7 i" g8 T - FC_Data_H = FC_Data_L + $01+ O& U& ], O. e: h A! l- o" L% Y8 k
- FC_Data_Buf = FC_Data_H + $01 I9 O. g. Q* j! ?. d
- ;==================================================
* @1 Z* c! w# K5 M* D
1 n8 Z6 D% ]" O* N2 C! Z- GAMEPAD_MERGE_FLAG = $04
0 \1 d4 I+ [ k! {8 ]9 ~5 d) z
9 T3 _! g! x: U- t9 m8 g& e- Gamepad_Keep = FC_Data_Buf + 1. ~9 D* N p5 V2 `3 e7 s; ?
- Gamepad_Once = Gamepad_Keep + 2
1 i1 |9 S7 K- R1 d7 K' ? ? - Gamepad_Temp = Gamepad_Once + 2
0 h- K+ W$ O( H* P2 V% {2 f - ; p5 @2 e( Z& w/ |; ?5 F5 a
- Gamepad_0_State = Gamepad_Temp + 2
1 I/ k0 O! B3 Z% W% n - Gamepad_1_State = Gamepad_0_State + 1
6 ?1 d3 H' b) P: a: w9 j - Gamepad_0_Value = Gamepad_1_State + 1
6 X/ l+ b* L* s! T9 I& t1 v) D - Gamepad_1_Value = Gamepad_0_Value + 1, R" z2 k8 J0 o3 M" R
- Gamepad_Port_Value = Gamepad_1_Value + 1
+ y" j9 o1 Y# c/ i7 c: Q- k8 ]" I - Gamepad_Merge = Gamepad_Port_Value + 1
- ^7 m& C, l# G, D& n# D [7 ~ _' i% h
, [* J$ Z& ]9 g( F$ Q: B- ;==================================================1 A4 n* }& \5 L* i& n% r, E
- IRQ_Index = Gamepad_Merge + $01
1 T/ e+ k/ k) P% W - ;==================================================: y7 W" C' _' f( [* N$ u s
3 P) _# |: B6 t, b2 W- ;CHR图形数据+ z6 g/ A1 X4 g0 l
- ;==================================================
$ m3 O( G. v1 l6 U - .BANK CHR_DATA_BANK
7 B: d, W& y- j( i9 s' b - .INCBIN "chr_bank/chr_data.chr"
! n }# W3 r- V ~- Z -
7 f1 E& w2 ]$ _! x: k3 q - .BANK RESET_BANK & BANK_DATA_MASK5 g: W2 w. }% {, R
- .ORG RESET_ADDR5 V1 ]4 O: {" u$ d+ r
-
) g$ z+ {5 i7 |* \$ z - ;--------------------------------------------------
* L* s% Q8 _- y - Attributes_Data
( L+ U8 M- m& ?/ J$ V Z - ;命名表属性
' d! V4 B) f+ `- R# N6 P - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00$ ?4 C# K) K: s1 Y( F
- .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA: S% p1 \# c, S/ L3 ~! y
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA' P# ]; N9 w& Q3 \! V
- .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
+ W( D4 Q3 E* f6 Z - ;--------------------------------------------------
/ s9 D/ C8 G) [ - ;调色板数据
9 w6 r+ g: L! W( \% a2 G - Palette_Data
5 v2 n2 |: W4 S3 w; k. {: |' Q - .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
( j2 Q z$ k8 n) @2 j3 }( J5 X - .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F3 j0 K, {3 [6 f/ y+ W6 n
8 F( h" m/ q2 F* L( C3 F) L* ]4 @3 C3 T- ;==================================================# {* W" C1 {* N8 w4 D; Z
- ;命名表初始化' X/ Q2 v& U, r6 l' e
- Init_Name_Table
7 @# N$ p2 F1 B+ c" N - LDA #$20
6 M9 _, m! ^/ O. _ - STA PPU_ADDRESS
8 i: K' I' N8 l1 K, F - LDA #$00
' C. g4 b( V; i4 e# Z4 {5 ?& [ - STA PPU_ADDRESS
5 }$ H2 W$ x7 q" p - LDA #$00
' H2 K9 _% _- T5 ] - LDY #$003 p0 l2 Y& i; J. ]
- LDX #$10
, w, m9 Q) Y& H - Init_Name_Table_Write# r5 D9 `) S" W6 @0 G# k# ^% Q
- STA PPU_DATA5 V7 U+ a& i# n
- INY+ ?) w! H! F0 U" ^
- BNE Init_Name_Table_Write
. T: [+ m* |$ v2 N; H - DEX
( h0 \4 f3 b8 T1 j% Y - BNE Init_Name_Table_Write- p% t- H/ V: P; m
- RTS
1 Q% w# B' O, Z& k: n. V8 [ -
& a- ?/ w3 A* y9 \. n/ J/ ~ - ;==================================================
6 R9 I, Q6 r4 F! x5 H3 E8 Y5 y - ;调色板初始化4 V, g% N! r6 `2 z; h& {( {
- Init_Palette
* I$ l9 h: F7 P# I) ^+ _9 A - BIT PPU_STATUS
3 p/ x% i6 S' h7 {# D9 ^, s: K/ p - LDA #$3F9 M% W S& @5 ]' w
- STA PPU_ADDRESS0 L* |7 e4 t; a3 B# f) ?
- LDA #$000 ]0 }& X$ M/ d
- STA PPU_ADDRESS1 R+ L2 |. c9 l7 j' U
- LDX #$00
7 J2 [, I( J# { - Init_Palette_Write8 W, M0 _! l# |0 E/ I
- LDA Palette_Data,X
* K; D4 T! r/ l. I - STA PPU_DATA7 F% G+ u0 A/ { ]" ?% ^* r% ? e
- INX, Z. T$ v8 P# ^# k; [7 B4 B
- CPX #$20- H V7 L/ O( Y# U: p7 }4 s2 R
- BCC Init_Palette_Write
) y; ?; f, E4 J+ N) Q3 ~5 u, j - RTS L X( ]8 C2 m
-
) P, B; j0 Z9 q2 a# f: y- W - ;==================================================$ _4 s" M' V i9 W3 ~5 i B3 n
- ;设置命名表属性
" j7 y1 t% b! ]( ^ - Init_NameTable_Attributes
* B. l$ Y/ p+ c2 k - BIT PPU_STATUS" H5 Y+ W2 W% W! y. h% V$ B5 N* x
- LDA #$23
' c7 o2 J4 n' C - STA PPU_ADDRESS
- v: |* y0 L2 H, u- {, [ - LDA #$C04 g- `, m+ s! V8 w4 O! l1 n4 _
- STA PPU_ADDRESS
7 m" I& K; }0 W& H4 Y" E - LDX #$00
# z. y, G( F" t' h5 W& R( J2 [ - Init_NameTable_Attributes_Write$ a- N8 f5 I# ? Q/ f$ U8 z
- LDA Attributes_Data,X
0 G$ C' Y5 f7 \- ]. Z% I - STA PPU_DATA
+ N0 J5 \2 G# D3 h - INX8 `1 I& `; C0 y3 e
- CPX #$40
, }, h2 c% j8 T n3 h& x' K - BCC Init_NameTable_Attributes_Write0 B9 Q o4 v4 D. V* h
- RTS/ W" E" g5 G+ F3 A2 F
- 4 ]9 W2 c* u% h: `3 O5 ~
- ;==================================================
& m% g: h7 S3 y: e: ]8 Q - ;初始化命名表文本
. @* X1 i- V" S' C* N! J5 n, B - Init_Name_Table_Text
, Q$ B& W! x% z6 u; u% v/ o - BIT PPU_STATUS; K& d5 Q7 \4 x* X9 X
- LDA #$20
% @$ B4 P; y3 {! c0 R - STA PPU_ADDRESS
|+ l- m' Y' v - LDA #$00! k3 k# a9 r; K( _( T4 y
- STA PPU_ADDRESS
]7 M& S& v& ?; g - LDA #$002 @! \( u0 R# e, H, g' y' }$ }
- STA FC_Data_Buf
' j# T4 ~5 h, v - LDY #30
" F* {6 r/ x# p# |( v; D! x - Init_Name_Table_Text_Write
F, l* s( d1 d$ {6 D' g" G/ ~. } - LDX #32
9 ^3 m0 U7 t8 ]. j$ F& y# B - Init_Name_Table_Text_Write_Char0 p O! }& }2 b( f8 u
- LDA #'0'
7 o- \9 f( Z. N3 Z' V3 P. P F - CLC
! L9 j. ^3 v% u& o - ADC FC_Data_Buf$ O4 y# }0 f9 Q* _
- STA PPU_DATA
% `# s) H9 A6 }2 Y* p5 o% ? - DEX
3 v2 N5 G$ ^, ~! ~& ]- i - LDA #$14
8 b" O. e9 ]2 y/ S/ H6 {8 l% g* } - STA PPU_DATA
. W! s) s7 a+ C; ~. n0 H3 @ - DEX N X' Q$ ]4 O' Q
- BNE Init_Name_Table_Text_Write_Char
7 O1 G7 m5 x7 n$ p& v" h+ R - INC FC_Data_Buf; [* Q- A1 _ p1 t+ S! B/ f$ Q* d- b
- DEY
" H, g% k1 s% E q0 e5 }7 G9 C% X - BNE Init_Name_Table_Text_Write: O' E P5 u- E, H
- RTS
( M* V( }% `- R" r - ( B( @7 X6 l8 _, `
- ;==============================
" l+ q: i- B0 w6 ^ F, W# R @( s - Init_OAM_Ram;初始化精灵内存5 U; x D/ n: T0 X
- LDX #$00
2 @' _! y+ z# u1 B - LDA #$00
" [) d8 h$ V9 n ]" m Y7 Z p - STA PPU_OAM_ADDR% T1 o* i, V t3 g
- LDA #$F8* B; \% `* c! j& b( w0 l0 M2 K
- Init_OAM_Ram_Write: {1 @+ | h- q8 Z ^: _+ U0 _0 a
- STA PPU_OAM_DATA
" m5 R9 m V" ~2 g - INX8 Z, q+ {8 I6 p
- BNE Init_OAM_Ram_Write
# ]! A! L6 V4 r - RTS% v7 J" V7 ]4 X. Y
-
' K' K! x3 d( j - GamepadProcess;手柄处理) { d/ N7 e: g1 [
- JSR GamepadDatacan9 O3 v: _$ o5 F! W0 c- I# u
- LDA <Gamepad_0_Value) J3 B( r0 j( L" K7 ~ g6 |
- STA <Gamepad_0_State6 G- s: Q8 @- i( q0 l3 O
- LDA <Gamepad_1_Value
+ o- k) c- N, [3 E" B4 b - STA <Gamepad_1_State& z, |3 V8 L- Z) Q# ` e
- JSR GamepadDatacan5 c% ?$ [+ i. \( O$ \
- LDX #$014 S J/ ^* T0 s* g3 g8 v* T ^
- GamepadMergeCheck;合并手柄输入检查
; V+ @" v2 f! P6 {8 x0 m4 M - LDA <Gamepad_0_Value,X% g$ s h6 ?: c3 G9 D
- CMP <Gamepad_0_State,X+ t4 ?/ m% C6 m. |' x- G
- BEQ GamepadMergeInput3 C# w$ M, H) o* K0 T+ i
- LDA <Gamepad_Temp,X9 e+ c' y3 O; l7 ~7 ~
- STA <Gamepad_0_Value,X
# z! ~( D% E: v+ `) \ - GamepadMergeInput;合并手柄输入( k. i) U, M; f
- DEX- V+ {' o; M H2 [
- BPL GamepadMergeCheck0 S& Y+ \6 \' H" M! y" i0 a/ J' t
- LDA <Gamepad_Merge
. X7 z4 t, Y9 X, W6 N# q - AND #GAMEPAD_MERGE_FLAG
# z. ~# O6 P$ e8 ?$ m- M+ O - BNE GamepadStateProcess$ E( q) ^& q; { {
- LDA <Gamepad_0_Value) Q$ ~9 f& V+ _5 n z/ ^
- ORA <Gamepad_1_Value1 A: k. e8 F' H
- STA <Gamepad_0_Value; ]* l/ i$ e5 G: H
- GamepadStateProcess;手柄状态处理
+ M# l( B6 S/ R! K" a4 C8 T - LDX #$01" S3 g0 g6 V3 {& m
- GamepadStateSave;手柄状态保存
' A# H8 |8 f: Z$ b7 [# s' ` - LDA <Gamepad_0_Value,X9 N H! Q/ x7 b8 q
- TAY
3 A3 _+ G( P% \9 \+ b% K, n# l1 g, d - EOR <Gamepad_Temp,X
3 k$ o2 L$ A" V0 y6 @ - AND <Gamepad_0_Value,X
% x/ d$ s* H- k, h2 l# C3 M - STA <Gamepad_Once,X* a' |1 C* q5 [- H
- STY <Gamepad_Keep,X9 _3 Q+ E4 T. \3 n/ Z6 j6 ^( \8 _7 B
- STY <Gamepad_Temp,X
, L+ j* x9 e* p3 \- @3 I - DEX* A* ]5 F$ U& @8 q4 [- W9 O! s' {" T
- BPL GamepadStateSave/ z2 F ?( O+ v+ L2 w4 N: n1 h
- RTS
* a* O5 L* x- q0 [6 T( g
: G; f, [% z. z* @1 {) o- GamepadDatacan;手柄数据扫描; }4 L: l% V" U, u" J2 O
- LDX #$01% [5 O! u( B x* n7 C
- STX $4016! }5 q' ]: j# K# b( y, H
- DEX, K; [8 z$ E$ F# E" d5 }: I
- STX $4016( q& E: X0 E) r7 v
- LDY #$08
3 i: c' i+ f. s6 f1 V - GamepadPortScan;手柄端口扫描
: }2 V$ R2 r; k4 `: C0 q2 }* j& I* E - LDA $40168 X3 o: Z6 j7 X: ~
- STA <Gamepad_Port_Value
. c" s+ z1 U' U- {7 M - LSR A) @, V4 M5 b. e; g0 U
- ORA <Gamepad_Port_Value" I' F/ Z; a6 @& P! ]2 @
- LSR A
2 m( ~4 G3 \3 p% r8 M% i - ROL <Gamepad_0_Value( ~2 x! F$ [ H0 x
- LDA $4017
5 `8 k) r9 N7 Q2 f# O/ A! w5 L# N% Y2 Y - STA <Gamepad_Port_Value" e, E: n/ V/ c ]0 I
- LSR A7 F7 n# W, w6 z/ ]
- ORA <Gamepad_Port_Value" f4 O- E) l/ m8 Z& R
- LSR A
0 W0 n; d9 ?4 I' o: b/ b - ROL <Gamepad_1_Value8 L- i8 p/ F1 X0 L- w$ Q
- DEY
+ V1 F4 q8 y" V% z - BNE GamepadPortScan
# u: a p; t ^' K) q - RTS% X: z m ?; Z/ \
- 8 C8 l5 e. B! N, Q( l/ I
- ;==================================================8 ]5 u4 b0 N) d
- ;PPU处理& t- W% m1 j' ^9 e9 T {
- PPU_Process
]) i8 G( _+ \9 L; N9 v" V7 Y - LDA #$007 Q5 ~; ~% `0 b( @; J$ Q/ x4 P
- STA PPU_MASK* x0 w2 Y8 E3 t5 a# k, k+ [2 z' d
-
4 D6 i+ X" o) z9 M$ } - BIT PPU_STATUS
3 ^$ C% b, E9 b& _" e9 L. g9 ^5 v - LDA #$206 |8 V, _8 Q( p" a( i
- STA PPU_ADDRESS
4 T% j! w. p/ n/ @, m - LDA #$00
- y" s5 l$ m6 x, p# `* s - STA PPU_ADDRESS# B$ f0 x) [! Z% H
-
" t; E( ~, _6 N$ R4 q - STA PPU_SCROLL
u6 @8 Y2 B4 G/ N: X: a6 S - STA PPU_SCROLL
( L- {1 J; o5 N8 V -
; W+ }2 w4 X, J z. P# v6 r8 N0 f( E - LDA PPU_Msak_Buf6 |# r% z' N7 p& j# W- C; N9 Y
- STA PPU_MASK: _$ z* ^* M, T' j3 I' W
- / X1 V* K3 D- c" a& ^3 @& }$ A
- RTS
' E9 e* y8 u, \. L" H ? - : U% {* v C" w$ E+ X; Y, \) V
- ;==============================
3 z$ ^( U$ p' T ^5 O; V6 n( K - Time_For_Vblank;延时等待
) a& N9 V2 u f6 L% W6 f5 }) G - LDA PPU_STATUS9 K; ^# X/ x% g9 e" K1 A
- BPL Time_For_Vblank+ H C6 o) f- T; `* x) B
- RTS
% X" [! G2 z4 t" H/ M - & i8 v5 n) Z1 o
- ;==================================================/ W8 M, V* b- C5 x9 U
- ;初始化MMC5
w' i& P- b! v - Init_MMC5
+ f' g b+ B6 o& C. K+ ] - : h9 m7 {; f- p! _: g8 V1 B- Z& b/ Z
- ;设置一下6000-7FFF的RAM
% ` w8 t1 T. ?6 u% S& V! V - LDA #$00$ R9 i1 \, l+ m/ y
- STA MMC5_PRG_BANK_6000
( s) e$ t- ?; x5 `- F: d - / @6 `# N2 Y9 O% U! [4 _/ W) q; |
- ;开启 PRG RAM 写入 b( m/ X* O+ P. u- H( ^, d
- LDA #$02; ?% O5 s3 I- \
- STA MMC5_PRG_RAM_PROTECT_1, v$ `3 I1 Q6 @. j$ Q: C- w
- LDA #$01
3 `5 Z' W( { Q/ j. ` - STA MMC5_PRG_RAM_PROTECT_2
4 y8 p) v# r D8 o - & d6 @4 H$ L$ E$ b: T
- ;启用 1KB 扩展RAM ($5C00-$5FFF)# l! @: O# r o2 l h( p
- LDA #$02
* I) E* K" b5 B, F - STA MMC5_EX_RAM_MODE
3 X1 m) k+ q8 M4 m - G0 O. e" _ h6 }) S O3 ]
- ;设置 CHR2 x6 v' h$ w; x3 f; Q1 l3 s% A' f x
- LDA #$00
+ E; ]8 b" v2 d: z& D+ l2 y - STA MMC5_CHR_BANK_0000* p3 ~5 m8 v/ H
- LDA #$01* _3 S5 Z! Q5 ^/ @& k) _; X! F
- STA MMC5_CHR_BANK_04008 w7 f3 \& l1 J: |& h" t2 {
- LDA #$02$ r% e5 c/ Z0 }: m
- STA MMC5_CHR_BANK_0800
a; H2 D0 |) {( V, Z; N - LDA #$030 t( M- E) R; y3 I5 e: T
- STA MMC5_CHR_BANK_0C004 y N; \$ t6 h. @2 M4 c/ d
- LDA #$04
* B- W* D% d5 p- R - STA MMC5_CHR_BANK_1000
5 K3 ]: w. ^' x$ F: @- p - LDA #$05
5 E% c @/ p3 }6 F% N7 v E4 o7 \ - STA MMC5_CHR_BANK_1400
$ {: V) E+ I2 k9 D - LDA #$06
# g& I0 i6 b$ C/ T8 ] - STA MMC5_CHR_BANK_18002 j( | o3 e2 H6 }+ N( G
- LDA #$075 g. P* |( Q4 J% x
- STA MMC5_CHR_BANK_1C00
) P$ ~6 j. A; O, q - , R! G. W# l7 M8 ^& y
- ;设置屏幕镜像! d+ v: N2 E. k' o
- LDA #$50, h7 }0 ?. m& o
- STA MMC5_NT_MAPPING) Z+ M/ ^* X. e- T9 _0 u7 C- [1 O
- - Y$ [" T) t6 k {6 |8 ]: X0 X2 E
- ;禁用IRQ% X/ }9 F! {. ]% D7 {
- LDA #$00 f% h/ E3 u: ^1 B9 ~" H$ y
- STA MMC5_IRQ_SCAN_CMP
0 i# B: {2 I/ {! z2 R1 O. F# s/ g: o - STA MMC5_IRQ_STATUS
- I! u, ^2 X( _$ q2 ^ - # j5 x% G9 r0 Q
- RTS. v& j5 }6 F4 y. G
-
7 T1 O+ ?+ J+ L: O" K/ f' n" g - ;==================================================' U9 b2 B" E# t* R2 h* r
- ;重置中断处理
' q7 L. b; Q4 m) s2 }* g5 I7 Q - ResetProgram, A* e# R- H0 U1 l6 w" v
- SEI- A4 L. B8 N0 K' [& Y
- CLD
4 f" o; D) z9 \' j - LDA #$00) E6 M% b) O# t
- STA PPU_CTRL
) q3 X2 c) T% i; W6 N - STA PPU_MASK
4 J2 i0 O l1 E* \ - STA PPU_STATUS
2 W9 N, I: r' {/ T: N( h6 g7 c - STA JOY2_FRAME
& q2 A+ E" F# f* @/ j - STA APU_STATUS. l: K' ]/ A# e( s" C% ^! Z
- 6 c! V. ~4 j* I4 _ {8 f
- LDA #$C07 |: K" U& @% y( V! s Y1 F, @
- STA JOY2_FRAME7 P5 ?+ ]4 G. E* g
- : t4 b" m. F# N/ R, Q2 A8 \
- ;等待vblank1 {' c9 d' [, K9 s* g. Y c
- LDX #$02
- w6 ]7 H) E- Z6 z1 a7 O8 W: g - Vblank_Wait_12 h; S. j+ h6 b3 {2 h$ M) ?. i
- BIT PPU_STATUS
. a- j8 e/ D" ]# F. G T - BPL Vblank_Wait_11 O/ G2 {( p, v, `8 O* g
- Vblank_Wait_2
. ~1 J& z$ e4 p7 [ - BIT PPU_STATUS2 f& I( V& N5 I( _+ w
- BMI Vblank_Wait_24 |, n; z; D$ n4 l1 q2 B
- DEX% t' b# d; z8 C( @: ^9 l
- BNE Vblank_Wait_15 U, I" E# l. `1 x( {7 A% v
- 6 |( M. s7 c6 }0 S. M( w0 l6 g( Q
- LDX #$FF f: [* e) g/ M; J- z
- TXS+ L" j X1 y3 j* b
-
9 }8 a- Q! w+ v6 E; N - ;初始化MMC56 Q4 ~% }! N" v) L1 `( `8 v
- JSR Init_MMC5
6 M! C& a3 `, ]5 W - * t. @) U& t# Z1 J% C
- ;==============================- |9 P3 l7 X- L. K: k# Q
- ;RAM初始化
+ r. c# P4 @# F4 I - Nes_Ram_Init5 S" T' c- K5 z3 b
- LDY #$00* S6 O$ f1 L0 m$ \& ?
- LDX #$08- J9 \( P* H% B/ Z
- LDA #$00
" O+ }5 u! l* e - STA <$00
) e0 I: c3 j; a( y4 I - STA <$01
[: c" @: A% O* Z - Nes_Ram_Init_Write, W/ m) e) Y" K, Q% @5 D3 B
- STA [$00],Y
- I( n' S/ _% ~1 P) |. M. v( T$ r - INY
" V! P) P5 `) G+ Q' b - BNE Nes_Ram_Init_Write
0 q" t; s. [- H5 ]; ~ y' m; q - INC <$01
5 s6 L: A( y& d5 h, M) T8 D - DEX
! _! o6 f! p& j - BNE Nes_Ram_Init_Write
8 S8 V/ x. Y. C* m' p -
0 k& H* [ X% p% `- a - ;初始化命名表
S& n7 F; d4 K: {; K - JSR Init_Name_Table% s/ y2 O) S+ Q3 E
-
, S; m1 v1 D- e! B; ]$ }( Y/ D# {1 y - ;初始化调色板
: u* V4 S4 l4 c, a& i" t c; d - JSR Init_Palette
" y. `- A; C* a8 V% |% \ -
0 a5 O8 X) w4 B/ w0 o# r s - ;初始化命名表属性
- u+ c1 D9 b1 H' H0 {' L0 D/ l - JSR Init_NameTable_Attributes3 [0 ]2 Q8 F9 m" P9 A: N' Y" R
- J' V. l, n- r7 Q6 E
- ;初始化精灵内存% R0 p! t6 o1 Y
- JSR Init_OAM_Ram
/ Y( s% L* \/ o5 ?: T - ) A% }2 t# _+ d* }4 X
- ;在屏幕上写点东西" \, e' n6 m6 N, \
- JSR Init_Name_Table_Text/ s3 U9 E' t2 x w( @( S
- % X1 B" D. t. \9 t
- JSR Time_For_Vblank
+ ~" E: E; a3 l5 p6 X. E, ` - ;开启PPU控制; B. |6 T# K5 T3 N3 W) Y2 Q$ |" N
- LDA #$88
' H) @3 [# {9 c# b0 X& V - STA PPU_Ctrl_Buf) W& \$ W% N7 @( W9 I
- STA PPU_CTRL$ e* F+ ?; Z, o: R' x9 Q1 `
- ' p( D- v8 v \9 }1 P/ x ^
- ;开启PPU显示" G5 C9 B/ @' X* o9 h" v
- LDA #$1E; z* H' T7 v Z1 c( j4 ^
- STA PPU_Msak_Buf
4 q/ x; W8 \. j2 i1 t4 M) m - 7 o1 m5 _) p6 E8 j& A
- CLI
1 t/ d. Z* M: e - JMP Loop' }4 r8 C1 C2 M
- & f/ G! p3 B5 @: q; R7 I9 O! k$ Q
- ;==============================
. @4 I3 h- ~, S - ;死循环, 等待NMI中断- n" \) E3 W# V9 C7 y/ y
- Loop7 Y: K& K2 D. ?
- JMP Loop3 W" E, v1 h5 Q* [9 u
$ I& H M* n' j: n; q7 v- ;==================================================
" S: i4 A. Y; i- y) B - ;NMI中断处理
4 ?% K \. e7 k% S - NmiProgram
: a% j' G' A5 t# x" \8 \( M - PHA3 k8 Y( h* H; z; ~
- TXA
+ w4 P0 _3 V! M f2 ]) e# c1 {! Q9 d - PHA
6 n. \$ b7 E N# P - TYA
$ d/ e9 u: F, }8 Y) W0 \ - PHA) H6 Z/ t/ |% K K$ F; v
-
% z% @- }/ C3 M% T - BIT PPU_STATUS
, _% D/ e% ~. t -
% ?3 c. o u- Z: _: c, p - ;启动IRQ中断, 第16条扫描线触发
: H4 E2 _* O0 K# m5 f - LDA #16/ |2 I3 a0 W* y( S* M
- STA MMC5_IRQ_SCAN_CMP6 ]& s; |, k, a C
- LDA #$80
, h: u u$ Y1 |. Y3 ]# g( n# a5 x - STA MMC5_IRQ_STATUS8 N6 @7 {! Y4 e
- CLI
! n2 X& C! N+ V. u3 u* [ -
5 T# ]9 c: Z) @8 I) h, i - ;关闭PPU控制9 T' a: x/ e0 ~" E1 `6 s y) D# K
- LDA #$00' G& b. Z# c; W9 t, B
- STA PPU_CTRL
( n' \% F+ {! o0 ~ - 6 F5 y5 C6 s8 e( K7 `) H
- ;处理PPU+ F m" F: a) H/ e
- JSR PPU_Process
2 w8 q8 O8 ]4 p; O% O7 v% t; o -
$ @* `! n- A" r7 ^& n' H5 { - ;开启PPU控制; i/ p$ ^- f' c" _ B" @
- LDA PPU_Ctrl_Buf
0 B0 \0 H' `' D1 Q: c0 {6 Z - STA PPU_CTRL6 J7 z; t. h& L7 e
-
6 O; _. p* z1 }, U) W ]0 V7 ` - ;手柄处理
: w J; ?$ h$ ]+ F C - JSR GamepadProcess
8 B% V; l3 {1 z5 a -
0 A, Q+ Z/ a% I" D$ r! i - LDA #$00
6 X& Z0 [, \5 W' X8 h6 R - STA IRQ_Index! M6 w& T0 x! { m- U& G
-
, K$ H% A. Y2 M/ S - PLA5 d, h. ~5 M l( y V" ?. C4 Y
- TAY
" r- j9 W( |' H1 D) H - PLA. w! H$ ^" d, B. M1 C: B8 O
- TAX1 F1 c, g% {1 x8 i- `: l% L+ g4 L
- PLA
: g# b% y" C% Y& ^% d9 N1 q - RTI
6 I! [- i- H1 s8 X% y# H - / l% ~) ~! _" K" s2 O6 q
- ;==================================================$ Y5 z1 p) ?( V" @# V
- ;IRQ中断处理
0 ?5 q$ n, B1 x+ G - IrqProgram
- W+ d! Q8 h9 I6 G7 [+ N) V - PHA
) c' c2 _( o# e+ w* c/ ]" p: C9 Z - TXA
7 C' l8 \7 n" [8 N1 ?; H U - PHA
' o0 L7 D2 J+ [: B1 `6 p - TYA
% S' S8 M, W7 y! \9 m _, Y - PHA: s0 u( k1 a0 J9 Y. d
- 7 n. N! Z* _, {6 p0 c5 a
- ;确认IRQ
, O5 ?! B: r8 V3 k$ @/ W+ J3 R& A - LDA MMC5_IRQ_STATUS
4 h0 w5 O! h/ b6 w3 M: E& Z$ r5 S - 1 h5 Q" p* U+ r- U' y0 x F- y
- ;允许下个IRQ触发7 P$ e# M1 {3 T; J' J2 A
- LDA #$804 {! j' f V5 U4 L
- STA MMC5_IRQ_STATUS1 Y. g& [. Q2 S
- % i" q; @) ~- m: T
- ;IRQ处理, 每隔16条扫描线触发% j2 D# @5 F# V s2 H. K
- LDA <IRQ_Index9 X1 b8 h, a6 `
- CLC- B: E0 a5 u, p' ~ v
- ADC #$025 i; o% R" i X
- ASL A
% h+ {9 B" `6 {% k - ASL A5 T& y' j: Z8 m( v
- ASL A. F9 a+ ^ u9 M3 v8 v8 ?1 V
- ASL A
: q r% s2 M% U) \+ x - STA MMC5_IRQ_SCAN_CMP
: J3 l3 k; Q8 R$ Z* x3 j -
?" }6 o4 `: B. Y. u4 N1 @ - LDA <IRQ_Index* v% _/ M' {0 p0 S
- BNE * + 4
/ C5 d0 l M5 N+ o0 ~* ^ - INC <PPU_Scroll_H
8 Z: M' T! l# K9 `- @; C - - ^$ Y% e; z5 A3 l, |+ E
- ;设置屏幕滚动$ i& ~7 v! y$ ^4 z( F/ l# U" e
- LDA <IRQ_Index
, _+ N; B5 S; z, d - AND #$015 B8 p$ o$ M* C
- BEQ Irq_Scroll_Right& G) B/ v9 `, l8 L5 O0 n' Q
- ( W' U; t( f# L, ]6 x8 m; d. D' ?
- Irq_Scroll_Left
( q* [* N( L4 K' Q1 A W - BIT PPU_STATUS9 b2 i/ ?$ k7 H. n
- LDA <PPU_Scroll_H9 x0 O1 l7 Z* {% K4 U6 C" ? q6 j! ^
- STA PPU_SCROLL
* V) p! A4 z m F& J9 C) g - STA PPU_SCROLL
9 q; R0 Y: }# i1 @3 z* ^" ` - JMP Irq_Scroll_Over- x8 D% g3 F# y( `+ a
- 9 S$ Q J) E! ]9 L$ |( o
- Irq_Scroll_Right
% G* a, C$ k2 a2 n2 z3 b( f5 U - SEC
2 l6 D9 Q9 a9 B) I - SBC <PPU_Scroll_H8 w8 q, m/ g/ V+ z
- STA PPU_SCROLL
7 A2 b' N9 |9 G* H - STA PPU_SCROLL
+ c4 W. v9 M2 a, G$ ^# R( e# c - Irq_Scroll_Over! x5 }5 ?7 v ?' ~
-
: U6 e, u$ F9 T) U$ Y! ~3 `. b1 S, f - INC <IRQ_Index
+ z0 x9 G3 T( g# w; v -
. k& D4 n( X/ m& p0 \/ H5 e( d; b - LDA <IRQ_Index
0 @' L5 s" A8 Q) ? - CMP #14
; ]" a6 L* M$ Y: v - BCC * + 5, f5 j L* W t" Y! H
- ;关闭IRQ
0 j$ z$ T3 b4 s" Y% w - LDA #$00
: O h3 j# I7 F4 \ - STA MMC5_IRQ_STATUS
+ g2 u4 k p+ ?6 p8 o9 { -
8 X) I7 {8 b7 n% j - IrqProgramEnd
# K Z1 G2 o8 N0 o* X) O$ N - PLA
$ z) \" C' d, K, g$ |0 {0 O - TAY3 H) e/ X% t# d" H$ Q
- PLA5 t* G$ o- D( |, a
- TAX
$ M! L9 I* B) r7 } - PLA+ z# M `3 C( A9 c
- RTI# I4 O9 k7 ?7 p ~
- ( c9 V5 L1 `7 t0 B
- ;==================================================
, }) `$ {2 q4 U! L - ;中断表
: g% e9 o* `+ @4 J - .ORG $FFFA4 X; a0 I8 P; d! s6 z
- .WORD NmiProgram
3 ]' P8 b7 M1 x - .WORD ResetProgram! p% Z* v9 u! D; d$ W8 R: u! [
- .WORD IrqProgram
复制代码
[; Q7 i- I, F* h; L" Y' I+ z |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|