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