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