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