|
|
- [code];[FC音乐][MMC3 IRQ]
4 _; e @8 \0 [7 L$ f, a2 x1 w0 g - ;FlameCyclone 20230710! A N9 g9 ~! K: v8 g( E1 m) z4 a
- 6 e" U9 U a; Y/ N ]6 P _
- ;文件头
2 G% U2 W( m' K5 i" u; _: J - ;======================================================================- \7 ?/ F( w3 W! b! X9 B. M8 t' Y
- .INESPRG 4 ;16KB PRG 数量
, o( {. i% d# x - .INESCHR 1 ;8KB CHR 数量
- z$ r; @3 g: Q7 W - .INESMAP 4 ;mapper 4
' t1 E$ L+ u5 u# G6 k% t) ` - .INESMIR 1 ;命名表镜像 0水平 1垂直2 m; |0 A A; c3 Y+ ^
& x: b, ]/ C* p0 t- ;必要条件
' L6 ^, s ?+ W8 @ - ;1.持有CHR ROM
$ Z$ a1 q* a- i+ A9 N - ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000/ d1 G# q4 E6 }, b" R
- ;3.精灵内存(OAM)不为空
( P* K- S1 ^) {( A* j - / K% z6 U: t2 F- n
- ;==================================================
- z; \/ [+ S5 T" C+ l% g5 T* e - ;NES端口常量# Q+ b: A6 X9 ~% D: v, y, {* L
- PPU_CTRL = $2000 ;PPU控制寄存器9 ?0 t( y+ Q8 K/ K, B0 |3 g, J# J
- PPU_MASK = $2001 ;PPU掩码寄存器; n# R$ }+ F% x2 k9 \5 m
- PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
4 @1 |) J8 ^- V7 w8 | - PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
1 w& ^* k2 z! z/ u9 p9 U& j - PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
: b1 N! y2 S& ~ - PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
1 z/ \! A( e5 N9 Q - PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
+ Q+ t4 h" U% \$ a. O. l- L - PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
: q: M5 j/ S$ _3 L2 V4 i! p2 E/ | - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
# {' k- ?. n$ j+ i; o+ \ - APU_STATUS = $4015 ;声音通道切换
% a& q4 R' d' F) Y: X - JOY1_FRAME = $4016 ;手柄1 + 选通
! } W7 l! \3 I3 `3 v6 S - JOY2_FRAME = $4017 ;手柄2 + 选通
$ |) ~7 E: ~9 ^% @' C - " V" d! \" e0 H+ I0 e5 P7 q$ B) s) i
- ;==================================================
& a& p; r! q, l6 ]) X - ;MMC3端口常量
8 `( y2 J6 b _$ ?; Z - MMC3_BANK_CTRL = $8000
0 i1 Z. }+ T! m `1 m6 M - MMC3_BANK_DATA = $8001. F: w8 |, X& m a4 i6 n& U9 Y- W' _
- MMC3_MIRRORING = $A000
! x$ v3 `* J' @( Q( V - MMC3_PRG_RAM_PROTECT = $A001
; d$ ^0 \ V0 y2 e) I" u - MMC3_IRQ_LATCH = $C000
; C( t. ^( C: d' F% t1 e1 D - MMC3_IRQ_RELOAD = $C001
( A9 j, ~ s, L1 ]1 G3 [ - MMC3_IRQ_DISABLE = $E000+ D& B8 m$ F& m; [0 V) j0 W; d# k
- MMC3_IRQ_ENABLE = $E001- d: ?$ t, v: s2 j# R0 q* Z7 c
- . K' J+ E8 q/ F9 H$ O
- ;==================================================
; V( H% o3 X$ t1 w9 {( L+ s - ;程序块配置
. n1 t0 I) }/ i X+ u - BANK_DATA_MASK = $07' `7 @; F6 L& Q% Q( P& p4 Y
- ;--------------------------------------------------
3 L4 X# ]* Y, E# z - RESET_BANK = $07* A H. _# w/ F+ v }
- RESET_ADDR = $FC002 ?/ {- K a( ?- m
3 {1 R; {" K4 ] g* @- ;==================================================
0 R3 @4 {( Y2 ^* T5 F - ;图像块配置
! } Y$ `. c! P - CHR_DATA_BANK = $08
8 b, X# V$ ^( w$ p - + q7 g3 Y* ~: Y+ f5 }' N: ^9 ]
- ;==================================================
: r* b; ]) T8 X/ R0 [ - ;零页内存地址配置
* [& X- `7 G1 b! e( p% ^( k - Use_Ram_Addr = $80
g6 B% T5 n u% Q1 a - PPU_Ctrl_Buf = Use_Ram_Addr0 R% g5 h9 L% g x- S) N! F- _
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01* C3 T9 P, J, C/ U6 c' R
- PPU_Scroll_H = PPU_Msak_Buf + $018 v. r) w1 b, O# E, }9 {6 ?
- PPU_Scroll_V = PPU_Scroll_H + $01
! f, h) M, N$ ?- h" d) P% G: i - FC_Data_L = PPU_Scroll_V + $01* u+ s% V* U) {5 t5 j2 B
- FC_Data_H = FC_Data_L + $01' T1 ]% p, b% R& I5 q8 F- d
- FC_Data_Buf = FC_Data_H + $01" N! n+ K W, ]0 m% L
- ;==================================================
6 f6 L; {1 r$ [! `( g0 C
$ ]* F+ F3 l% O3 n2 [7 p" E- GAMEPAD_MERGE_FLAG = $048 N: v% K& T3 |5 B2 H0 R4 f
2 T2 A9 H) m7 h, \, U9 q- Gamepad_Keep = FC_Data_Buf + 1$ Q, `/ U* o4 y" M
- Gamepad_Once = Gamepad_Keep + 2' T1 o$ b( Y1 M( X; K) W. G/ h1 M
- Gamepad_Temp = Gamepad_Once + 20 Z* y5 T8 ]1 v' T
- # v4 w/ n3 N6 h) J8 O+ i
- Gamepad_0_State = Gamepad_Temp + 2. Y9 u* }+ Y3 J! ~
- Gamepad_1_State = Gamepad_0_State + 1
0 A4 @% k1 ~& ?7 ` - Gamepad_0_Value = Gamepad_1_State + 18 t- c7 O" ?4 H
- Gamepad_1_Value = Gamepad_0_Value + 1
! G- J1 h. y2 ] - Gamepad_Port_Value = Gamepad_1_Value + 1
. B4 U, E* Z7 Y' Q - Gamepad_Merge = Gamepad_Port_Value + 1
9 ~# m' E6 n* f( a! A+ `( w2 X
' L3 j6 I7 H& J$ P+ j* P- ;==================================================
. h# k" i8 L: b) B* W" g. L; z4 d - IRQ_Index = Gamepad_Merge + $014 I, L5 _! k. w! h" Z1 t
- ;==================================================
+ o: ?$ c% Q) l. A0 p8 K4 y - : g, P, D7 K/ x6 j
- ;CHR图形数据9 B1 j: u, S) n/ v8 ~
- ;================================================== v/ o* I' ]$ k# T' [
- .BANK CHR_DATA_BANK
$ t. H) d! B* d3 Q1 w- R* C$ j/ |' P \ - .INCBIN "chr_bank/chr_data.chr"
0 P- l' e, o% J% e3 v1 h& \6 U$ l - 0 N6 G5 Z$ V5 o- E% z
- .BANK RESET_BANK & BANK_DATA_MASK
$ i( S: y9 d9 j( m2 L; F - .ORG RESET_ADDR4 Q5 }, R, \! E5 u+ |! e
-
) _/ X2 z. k! h7 H# u' L1 }6 D$ M* h- x - ;--------------------------------------------------
' q$ S1 w$ Z* ~8 }! u - Attributes_Data4 ^5 b$ T7 a4 V; Q
- ;命名表属性
1 ^0 C2 f) r. S+ M# ~ - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$001 g) o e. k3 v. {+ c' k7 k
- .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA$ o4 p) |* ^, ~9 \0 e( X
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
- D, U( J4 J. H- s* R9 D# X3 ] - .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$553 u6 t. k9 ]" N/ _3 D9 ]# Z6 b
- ;--------------------------------------------------
. ~4 `9 e0 k/ _$ @/ ~8 _; a - ;调色板数据* f+ i; J* {# B/ _/ w
- Palette_Data
9 Z" B# |1 s! i/ f( F9 b5 I/ J! D - .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F& [! x7 f5 C8 V; b) @' ?8 y$ p
- .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
0 T: |6 O3 Y* v4 q; }7 U - " l4 U7 b: a6 L7 i2 N7 K
- ;==================================================
7 [' S1 }; w- A/ o; x5 }+ q - ;命名表初始化
k7 p9 ~2 f9 c3 c" N J' ] - Init_Name_Table+ X- P8 \8 g( Q9 [' _
- LDA #$20
( T. }0 f/ i( d, S( `# ? - STA PPU_ADDRESS
, E( {. w- K t) }7 a8 p+ i E - LDA #$00- L! [8 c6 `' u! L
- STA PPU_ADDRESS% h0 U; t+ [4 l& X
- LDA #$00
/ y9 m- Q8 p% o/ h - LDY #$00" g6 \+ i: K1 Y! v. d. e
- LDX #$10: Y% S( c: b5 Q8 E$ a. v
- Init_Name_Table_Write
5 C5 c* v5 f% u9 [( d1 u - STA PPU_DATA# u- `. P v ?! G* u1 p U
- INY# `7 W% G- S& [% x* w% o# M
- BNE Init_Name_Table_Write" Y: q" f, g$ y0 Q
- DEX1 Y2 Y# ?: M* y
- BNE Init_Name_Table_Write
$ K/ U+ U1 ]6 m: L- C3 i - RTS& M; ^* n. W/ G8 `- O& C" o3 {
-
' _8 N% c! i# i - ;==================================================. U3 q) [; R5 D. c
- ;调色板初始化
' F( [# U; I/ @* q& [4 z6 h. v+ v - Init_Palette
- I5 |8 l6 w* d - BIT PPU_STATUS2 O4 k7 L; J4 R0 X2 r
- LDA #$3F
9 Y6 k: j# M* Z. j - STA PPU_ADDRESS/ X% ^ z* d6 n2 E2 Q5 s# w
- LDA #$00
) ]' i4 q: ?& B5 q% }1 h8 W - STA PPU_ADDRESS
7 }8 }# K2 m4 d* y - LDX #$00
: n1 a; B# ~) |5 d P3 x) M* R - Init_Palette_Write- I! y; |7 w6 u: s3 p8 L- L
- LDA Palette_Data,X
0 x1 Z, F$ H i/ H# T7 l& c' m8 t - STA PPU_DATA9 K% c; k) S1 Z$ n4 T# E( Z! i( F, F
- INX1 _7 W( f: ? j" k# m. A
- CPX #$20( U# l4 y0 a+ N1 i
- BCC Init_Palette_Write
% u& O |* L/ z/ H: H. Q4 B6 s - RTS
& E% T8 ~8 _4 z w -
# C3 @) A% v+ s8 f - ;==================================================
/ q/ v, [& ]/ \& F. P* _! ~ - ;设置命名表属性1 N c/ R- B/ p, Y/ U" m4 n
- Init_NameTable_Attributes' C2 |. E! H/ Z7 g8 |6 i. T
- BIT PPU_STATUS
2 G% F/ c1 D& ]' _9 | - LDA #$232 d2 {# v0 Q5 ^
- STA PPU_ADDRESS/ s6 g6 ?. n* {# J
- LDA #$C0
7 @9 i6 r7 K0 ]/ k - STA PPU_ADDRESS% H g9 k- n, h9 f( V( e9 v2 G
- LDX #$00
; G2 Z: i3 {1 T. Z - Init_NameTable_Attributes_Write
% \- S1 G. n- K0 S - LDA Attributes_Data,X
# m) j) N' W" E/ g - STA PPU_DATA6 ~' j. n: J3 e& Z: X' y r8 q
- INX, g1 |8 X$ ]3 t$ `- H0 A
- CPX #$40( b6 Q* H: X7 ^5 I( ~
- BCC Init_NameTable_Attributes_Write
2 e% F# d6 S- F$ a, A/ k: [ - RTS
: t7 m7 C: m$ |, m i5 P. z2 |
# u6 b) }0 K3 m3 v2 V* U4 _! l0 {, s9 e3 @- ;==================================================4 p5 |% Z, y; e3 Y) f
- ;初始化命名表文本) C0 Q2 S# q+ w7 Q
- Init_Name_Table_Text+ @' x! _; y8 @; d j7 y
- BIT PPU_STATUS7 Q! j. Q, `; G# M8 o# X
- LDA #$200 f8 o* {+ p3 {
- STA PPU_ADDRESS9 L8 S. w/ T6 f! n) R
- LDA #$00+ M6 }0 I% L6 L
- STA PPU_ADDRESS% `$ I) F4 ]2 u2 `9 X) [+ j
- LDA #$008 J! V( e+ B: _. p
- STA FC_Data_Buf8 x' j# @- m: v" Y( o- l# A) W
- LDY #30
# z7 u" G$ Y. Y6 B& e" }6 _6 [% x - Init_Name_Table_Text_Write
5 K1 L4 H+ Q3 b - LDX #32
0 i- o+ y* \& N8 f0 i - Init_Name_Table_Text_Write_Char0 ^3 x* \. }* q
- LDA #'0'% j% ?! w3 \) g
- CLC5 T# Z) @3 C2 Q
- ADC FC_Data_Buf( L U1 o& Y8 l& w8 [
- STA PPU_DATA
9 O5 X5 y% u; p) Z/ g5 c - DEX9 q, i. Q# H8 m6 C( }
- LDA #$14
- s# ?+ Z ^" ~- l! H* H# n - STA PPU_DATA
- Z u+ o) x, Y. d7 j6 A1 l& T' g - DEX
1 J P! V) [ ] - BNE Init_Name_Table_Text_Write_Char
+ T& J( y9 G' X$ Z# A2 G: _1 E5 t - INC FC_Data_Buf: n8 `- s7 S! t: q! \
- DEY4 W' Y: O6 Q n. z' |
- BNE Init_Name_Table_Text_Write
( x) ^6 K+ v3 W& S9 D - RTS2 ^9 b) X; \, q" x
\+ D" Z7 N4 Q7 J- y- ;==============================
) e( Q/ M6 f. U. |& x8 s - Init_OAM_Ram;初始化精灵内存
/ b* k- A7 b3 d. [* N1 Y - LDX #$00
% C5 x% I% v% D - LDA #$00
& _3 X) B3 }5 ~2 t3 `3 ~& D - STA PPU_OAM_ADDR
6 }1 Y Y& W6 { - LDA #$F88 H2 L, d$ R; C6 `; P
- Init_OAM_Ram_Write: V( M! R7 y- _2 w
- STA PPU_OAM_DATA& C/ z: F' e) e) k% W4 P* I) }$ \
- INX+ Q6 x$ G: R" T9 F0 d
- BNE Init_OAM_Ram_Write
% a# B' U9 |% d+ H - RTS: {- C9 g- I8 z$ o, f6 J
- 1 Y( V: ?+ |: t) l$ Z% a3 P( o
- GamepadProcess;手柄处理! K. b! M# h# k' ?( @; `
- JSR GamepadDatacan
7 F2 b& e2 k3 t" ?0 l - LDA <Gamepad_0_Value5 J. C' ? W, |0 G
- STA <Gamepad_0_State
; H( M6 z0 P- C8 J. Z* a( J C - LDA <Gamepad_1_Value
5 N" @0 U* V( _% e* G5 M - STA <Gamepad_1_State; f1 q. U0 {% ? T+ b4 a+ z
- JSR GamepadDatacan+ t; e! s. ~3 R' Y) P$ J& E
- LDX #$01; o0 c9 P7 ]+ ?9 q
- GamepadMergeCheck;合并手柄输入检查; E$ `. ^8 k3 N' O& D" ]0 Q' \
- LDA <Gamepad_0_Value,X
8 K- n. O" V. V8 y) c" v& `6 m4 m - CMP <Gamepad_0_State,X
. U U: ^& {5 H2 G( U+ z: A$ K - BEQ GamepadMergeInput$ |/ e5 [5 _9 D" h" v; m4 ^: {% A) {
- LDA <Gamepad_Temp,X
' B, L% f6 @6 Q4 ~ - STA <Gamepad_0_Value,X
$ e( Z5 T3 w: F - GamepadMergeInput;合并手柄输入
: m8 S0 S% m8 i# S" j: k - DEX8 z$ M, t! S5 v$ K
- BPL GamepadMergeCheck9 |1 G8 r/ J9 M6 A7 w8 J
- LDA <Gamepad_Merge# ]$ q W0 B1 {3 r
- AND #GAMEPAD_MERGE_FLAG+ d# ?- d) p; S
- BNE GamepadStateProcess
9 V0 R) \! [& p( L - LDA <Gamepad_0_Value
# [. U# O/ h; [2 I- e+ Z* W* p$ O) v - ORA <Gamepad_1_Value0 b2 R) h" d$ [ C$ d
- STA <Gamepad_0_Value
7 r, l# l1 u1 j - GamepadStateProcess;手柄状态处理
3 X2 K5 M# k' }3 M - LDX #$01, F( ?5 D2 ?2 S7 E# t7 M' \
- GamepadStateSave;手柄状态保存$ A! [3 u8 [. \- m( u
- LDA <Gamepad_0_Value,X
4 f" h2 v8 d6 {' G9 O4 {5 V1 q) @ - TAY: |, e# o" f% Q# [
- EOR <Gamepad_Temp,X
( S* m% F) b* [2 b - AND <Gamepad_0_Value,X5 ]1 d* g' S& g% h
- STA <Gamepad_Once,X
: Q9 Q1 A, j* I2 Z - STY <Gamepad_Keep,X
. K- t3 S# ~* K/ ?1 `9 g4 y) O# c - STY <Gamepad_Temp,X; H0 m6 b0 W0 s7 _" u
- DEX3 `( c/ N( Z% z2 B; ?
- BPL GamepadStateSave
% M% r8 ~0 x! G- d$ u - RTS8 \% z6 f6 [! H- {/ S* b
; `) y+ D l7 Z- _- GamepadDatacan;手柄数据扫描
0 q; h$ A) l4 }6 m$ x - LDX #$014 B! w" p) l* p& G# ] q$ f& \
- STX $4016/ _6 q5 J. Q4 D# v
- DEX
+ X1 m' t! V! A - STX $40168 I p( W2 u; i; ?
- LDY #$08
& k/ z: U; l, t - GamepadPortScan;手柄端口扫描! V4 o! f8 W* a: ~) l
- LDA $4016# m! ^ m2 Y2 V. n7 V
- STA <Gamepad_Port_Value
; H; D1 a: [4 Z/ Y) [- w" M - LSR A; V( q t2 w( ?* |' g
- ORA <Gamepad_Port_Value
) e1 `1 j$ W& ^* H [6 c - LSR A9 @. W1 u! ^' T* g3 W
- ROL <Gamepad_0_Value) i+ a% d* n. w- t
- LDA $4017
7 @7 r' c4 Q1 w - STA <Gamepad_Port_Value+ h5 {' A* P4 ~1 X; [, F
- LSR A
6 W9 Z4 k& D3 P. D# Y5 [$ w8 e - ORA <Gamepad_Port_Value
. ^3 L2 k1 x+ {. k - LSR A8 G- k# a) n9 J% A4 e$ b
- ROL <Gamepad_1_Value: P! T7 t# d" s$ I* \7 \" X. M* @2 ^
- DEY
- A) g- r9 l/ ~! J- P* b6 p - BNE GamepadPortScan" r; G) Q' N( U9 T
- RTS
4 ?8 {" r X1 i' n( U: `! f: _ - * v, U3 Y+ V# g2 O5 r9 `, `
- ;==================================================
* w+ u R: N6 \! u2 f" F; C) m3 w% r - ;PPU处理
/ K0 i/ t* S( C# W - PPU_Process6 E% ^ F d T. I+ Q
- LDA #$00
: E+ z' o3 l4 Y, h# u - STA PPU_MASK
) E+ M1 _4 `& ` S L - " h3 g+ l$ j" }5 c4 d! l% |
- BIT PPU_STATUS
' {8 U; a4 _0 ], F/ a - LDA #$20 b- ?6 J: X& S2 Q
- STA PPU_ADDRESS
3 s7 W1 ]! {9 c - LDA #$009 N2 U3 o* T6 w/ @# V, y8 V4 R. z! {
- STA PPU_ADDRESS5 t. I( B, I' Y5 _
-
' L/ ~ X8 {* O* A$ V - STA PPU_SCROLL
/ B! d1 t$ H5 ~9 K, t2 o+ L s8 N, h - STA PPU_SCROLL
; W( |+ w3 l; n/ `% x- c! E! O - ) t( v# {9 _1 c& r
- LDA PPU_Msak_Buf
7 v3 L: `% D: A; v) g - STA PPU_MASK
% ]9 j. ]* i6 j- x; V" D/ R$ |
# U0 t9 i1 j+ A8 J- RTS7 V* O O: ?( s1 V. S1 d4 \& R; ?$ i
-
; r% {9 C/ Z R4 l# K - ;==============================
7 q8 J1 ?+ j- q* ?1 b - Time_For_Vblank;延时等待% }, N8 q6 C. U. H$ F
- LDA PPU_STATUS
) D+ X' f4 O( L8 }/ Y - BPL Time_For_Vblank5 S8 y0 f! N$ D& z: q1 Z4 F% i
- RTS# a2 \/ K# X2 F
- 7 y$ l M' X+ z8 V
- ;==================================================
7 V! N4 v9 J4 a - ;初始化MMC3
( [( x5 N$ Z3 a! X# w2 q" N$ [. f2 l E - Init_MMC3
+ A1 G& d3 Q0 V - STA MMC3_IRQ_DISABLE
$ r' u% U, C9 t4 X+ }5 g - ) a& p1 S0 y# }( e( S4 U
- ;设置MMC3水平镜像" X) P9 h3 Q8 Y; d# S
- LDA #$01
( Q( c( z4 I2 M/ C - STA MMC3_MIRRORING) o' L5 K4 a2 x6 ~: [ M
- ; `# a: }+ ~% m" o3 M( _2 g
- LDX #$05
# n0 y5 X! a [( O% y - Init_MMC3_Chr_Bank_Write" q. _2 H* r" |4 z* l
- STX MMC3_BANK_CTRL
" I6 c+ o5 X6 D5 y - LDA MMC3_Chr_Bank_Data,X3 s- T+ p7 `9 r; U
- STA MMC3_BANK_DATA
9 k. w8 y5 g7 z% z - DEX1 ^# ?6 N7 ?" z* y8 g+ g ?
- BPL Init_MMC3_Chr_Bank_Write
/ D# Z7 c3 H2 b( m+ K - RTS
" A4 D3 r' o* Q3 \: L: S: v: ?! H - ;--------------------------------------------------
7 b" t$ Q( ^% b9 @8 ^: z6 n. W/ @ - MMC3_Chr_Bank_Data( V- q1 c6 h; v, ?/ N( M# F
- .DB $00,$02,$04,$05,$06,$076 V/ }5 E) z: q! F* l5 o) X* S
* o: R% z1 F$ |4 Q: s- ;==================================================" o+ _: L7 u, E: O1 s: Y
- ;重置中断处理
( E8 {+ g0 i/ a - ResetProgram
( ^0 U# c/ |( D9 R - SEI/ k# t# ~8 b& b5 {" k( d3 c8 }* ~
- CLD) S8 {" F3 i& K1 N
- LDA #$00
2 k. @; E* q- G5 M; g9 K - STA PPU_CTRL7 ?$ g; ^/ l- W" S9 W
- STA PPU_MASK: T% F6 x1 p$ h- |+ |# X8 C
- STA PPU_STATUS8 Q1 k% V x4 y0 L i
- STA JOY2_FRAME; h/ z: M0 u$ v. \
- STA APU_STATUS# \) M V& X: W- ^+ s
- ) D# ^5 F6 j; {1 W, d; t
- LDA #$C0
3 l8 n3 E& E2 F Q- A; e3 S# ^ - STA JOY2_FRAME
& K1 y$ e/ [9 Y3 f; k% h: _7 j2 d - # R$ R$ \: z' x z4 q
- ;等待vblank
4 f1 y& j5 x% e( v$ c: b& x - LDX #$02' P; _$ i4 ^9 [' D9 t& X& y
- Vblank_Wait_16 |7 a2 O6 X9 o+ q' ]! `
- BIT PPU_STATUS/ D# @- G: ]& y: F+ w5 z3 x1 d: [
- BPL Vblank_Wait_1
2 q/ e% d; f2 ^+ p$ }* \ - Vblank_Wait_2
+ }0 d2 G- H- c6 @0 H( Z' f" K$ n - BIT PPU_STATUS$ r; B; I5 s$ p- W
- BMI Vblank_Wait_2$ M, }9 j; D3 b4 y
- DEX6 J3 V% Z, o% }
- BNE Vblank_Wait_1. f! Y7 q- `; q' D, @3 }4 [! U
- & j( t6 t+ ^" o8 j F- E9 l
- LDX #$FF
1 l& f" E# V0 }1 T) H - TXS4 ^0 S! x+ A4 R
-
, Z! Q* g/ `' f: B9 \ - ;初始化MMC32 t e; }! {+ P2 }1 K
- JSR Init_MMC3
" a8 P4 d$ S8 F+ J5 D& b6 H9 U - # z7 y) n& x' A
- ;==============================
# Q- T, d0 H8 H6 k; R2 ^9 E - ;RAM初始化
4 K7 D' l0 \5 o% t+ @6 | J - Nes_Ram_Init
, U, p1 ^, m' c- C - LDY #$001 i: L1 c5 P* |2 y# k P3 I$ J0 r9 Q
- LDX #$08
! g% X- [! [2 ? - LDA #$00
5 P" f( Z& }! A2 l - STA <$00
9 F: S/ V. c: k4 T' f2 t+ W - STA <$010 ]1 @6 j8 E6 D2 q" V
- Nes_Ram_Init_Write2 \7 v# W0 |, k
- STA [$00],Y1 l; ^5 A2 e2 `4 I) k
- INY
( c6 q, O* w5 ~! U2 h) X - BNE Nes_Ram_Init_Write8 L+ A6 K$ w+ S' O
- INC <$012 M) ~+ [5 x5 M: G! s, t# F5 w1 C
- DEX
: Z9 w# u! u/ Q+ l8 K4 r3 r, } - BNE Nes_Ram_Init_Write
+ e# ?, N+ k4 \' E; T5 ], X! \3 ? - " P! C5 z3 q# @' p. k/ W
- ;初始化命名表
& x" T. l$ [6 e& b7 E- ~# _5 h5 r, e - JSR Init_Name_Table1 r- d2 F' g1 S; p! w' c
-
! K G8 O! ]0 A9 o: W1 ^ - ;初始化调色板
- V) E# Q: R' V6 s9 P+ \ - JSR Init_Palette
7 f$ r* u N" @) X' p -
, O8 a7 s! x4 E; I. b# U* h9 b - ;初始化命名表属性
) C: B2 n; u R- a* ?. a6 c( _* a/ ? - JSR Init_NameTable_Attributes) J9 D5 X) ?) [4 X
-
w7 F* h( [- @3 F0 P - ;初始化精灵内存
6 w6 [2 w: q+ D6 |' R - JSR Init_OAM_Ram
' C, R, y7 Q4 X$ o/ r$ L& } -
! d6 \/ i/ O! V6 H - ;在屏幕上写点东西) B0 y e5 V, `) v9 ?4 }. D9 Y
- JSR Init_Name_Table_Text7 _' ?0 X& r$ B, m
-
$ Z/ r0 ] {2 o& r - JSR Time_For_Vblank/ U4 }5 u; Q8 G, Z
- ;开启PPU控制
7 ~ Q7 \2 C/ C2 E' o% g - LDA #$A8: l6 n* w9 q1 k" s
- STA PPU_Ctrl_Buf
* B* K6 J0 @, K4 P4 q V - STA PPU_CTRL
* x7 K6 B7 c, c H. S - 6 X& K& i. V( d( y
- ;开启PPU显示5 e' {+ V8 {. A4 l
- LDA #$1E2 |+ e g; g( I: l
- STA PPU_Msak_Buf
3 t& Z7 s+ |$ x. M8 ` - & _5 E k# y. |, H5 u- O
- CLI+ l) G/ `* l, r$ s" c3 [3 r& I, \
- JMP Loop
1 _" k4 D; ?: u- t2 M' N - " `3 z( v, j2 @9 l- |6 i- A4 |
- ;==============================
1 R2 } K; ~& e: Q0 n F, j" X- r - ;死循环, 等待NMI中断
; B/ }. j$ a! R8 \' |; j - Loop
) r3 j4 ^+ l$ I% g$ X' r7 I! M - JMP Loop
/ ?* E* O. M+ L+ E. ~; P# ~4 m
5 `! J7 r. l& E+ n6 G: N( O- ;==================================================
d% z: [- w* Z3 P" h* F - ;NMI中断处理
6 B( O/ v2 b5 y3 A$ m. i. d - NmiProgram! K" g1 n& E% v* }( N
- PHA2 Y: b+ A) P3 t
- TXA' ~- ^4 F, h1 e7 s4 Q/ W: w
- PHA
. t/ A7 A5 K# W+ ]. ?" C3 ]4 m - TYA( z$ ~' N4 K7 i7 T" A
- PHA$ v$ q; A- I7 h9 Y: n
-
/ B2 y' j0 z7 f* C$ A% { - BIT PPU_STATUS& w- \2 B8 x6 o, ]& L2 b$ \/ m- |
- 1 ?9 s; W* P3 m. m7 U; j* Y
- ;关闭PPU控制
$ F1 ?+ z* a$ T7 f* G - LDA #$009 j% k* k! S8 T: j3 u
- STA PPU_CTRL
/ e& D7 Q" L/ e; _) l# K4 l3 E - ( Z, Y0 ]8 a: _" J$ ~ H- z
- ;处理PPU
' }3 n: Z% B e% F; R: e' e, P - JSR PPU_Process
; a) U' S8 H- Q9 c3 }* M ?6 r -
" O0 i, Y/ [: ^1 \ - ;开启PPU控制- K2 h( z* B( S% L
- LDA PPU_Ctrl_Buf
7 \1 l- d; z2 L - STA PPU_CTRL) J+ V, H3 R5 ?4 N
-
+ Z+ B9 L8 y& K3 n! |& K - ;手柄处理, `- i/ L" J s8 k
- JSR GamepadProcess- g$ u" x* N0 `; P* i8 p! U4 U) d
-
2 Z1 G0 D4 A2 R# U( l - LDA #$00
$ R3 p; k4 ]& R2 B; \0 } - STA IRQ_Index
/ K$ U( ? v# W' l& R -
) U* _2 J$ B( s/ u( k! X - ;启动IRQ中断, 第15条扫描线触发
% n$ A5 S0 J/ }; G6 ~ - LDA #15 + 14 C1 H; d3 m ]% N3 H
- STA MMC3_IRQ_LATCH
) z. p8 V) W/ } p g - STA MMC3_IRQ_RELOAD4 A1 M+ e/ {5 l% a! {
- STA MMC3_IRQ_ENABLE2 z5 @" I' c' N8 {
- CLI
3 F- `6 m' k. j4 B) j6 ` - 9 G& z3 |! ?( j3 ^. K) q
- PLA, ?* v- A" r% B. u' ^
- TAY. c7 n A+ x3 T6 r* n# w0 X
- PLA
/ X% c J+ b: ? - TAX* K1 g' z! b: P$ H
- PLA0 a( T; a1 L d/ F
- RTI/ f* W0 H- i3 F: X8 s6 z" T1 V
' |8 t9 Q! O I: @- ;==================================================1 O3 l7 L. e& q$ }" {" L
- ;IRQ中断处理
& B; q; P \/ b - IrqProgram) L; {9 L5 e" }& B' k
- PHA# L8 t8 m: a" u! }7 Y1 Y
- TXA
S4 }3 d6 N. V# z: @, d$ F4 j - PHA
% X5 j! {' m6 ^" T - TYA/ B7 v& o, \7 \9 M
- PHA
, Q: n- x. u7 _ - . b$ @3 W! w" H- C
- ;关闭IRQ
# k: w) k* ]8 K% c# e - STA MMC3_IRQ_DISABLE$ I0 w. O" ^) U
- ' l$ y: D9 Q/ G% Y. w1 D
- ;允许下个IRQ触发' J. m/ @3 }' K) {7 P5 @
- STA MMC3_IRQ_ENABLE( H. T7 v, W$ W
- % \. ~! B* T' `% K
- ;IRQ处理, 15线后继续触发2 t* S; D/ P$ {7 y+ q& S
- LDA #150 I3 S8 @1 f& z- w c
- STA MMC3_IRQ_LATCH
5 m. W w, g( [ -
; w9 \% C* w3 U5 o/ {3 R - LDA <IRQ_Index
5 R" b( G* u' K. |5 Y - BNE * + 4, _8 M- l7 @" ~4 _9 f& ~( U. ?
- INC <PPU_Scroll_H* N5 ?5 _ @/ O$ K1 D. p2 X" ?- G
-
' _1 H# g! t3 f9 W2 @+ s* j - ;设置屏幕滚动
( ^ f" a& O5 {8 Y3 ]/ Z - LDA <IRQ_Index o9 {& @! p6 q% {* E9 O
- AND #$01
( v4 j `8 m6 B( w2 ^ - BEQ Irq_Scroll_Right
2 ]# }' \9 o$ ^7 o% }, m* l/ @( R - 8 `" S# `8 c' g7 g
- Irq_Scroll_Left I% z5 o& W# C5 Y' A; k) s9 ~; G* B5 U
- BIT PPU_STATUS3 u- L+ ]! { {1 D9 m) j' [
- LDA <PPU_Scroll_H3 E) m( M5 h! I4 n- ~
- STA PPU_SCROLL7 S. K9 r( K- E
- STA PPU_SCROLL
9 Y8 a9 t* t0 f: k+ k8 N) |# J) g$ O - JMP Irq_Scroll_Over
. |: n% T- y1 Z" m! n2 n+ K -
4 w' P- [) V' C8 c- G& R - Irq_Scroll_Right
/ | R1 {5 h( t. ^9 a8 c* Z - SEC
% F; _7 Z7 C2 ^4 S& F% t3 F - SBC <PPU_Scroll_H
D. n' M7 }$ U) t, L, [ - STA PPU_SCROLL
o; F; M# ~( z# E - STA PPU_SCROLL
2 Y4 M& e* H* I/ j4 s9 k: _# | - Irq_Scroll_Over
6 v: g8 k! \! x z8 u ]' G -
8 |& S8 K# b$ f" {3 R6 ?# B - INC <IRQ_Index
9 O+ h/ ~- |0 G0 I1 j5 x3 w: V- v -
4 ?% U, p* C1 ~1 I' [$ x8 ? - LDA <IRQ_Index
' ]( A# j, G# {5 H- f# | - CMP #14, W8 _0 P' _4 h" W9 ~$ J/ R
- BCC * + 5! Z' u/ w0 p! u4 }: |
- ;关闭IRQ
" g8 I5 G/ a6 k& A5 J - STA MMC3_IRQ_DISABLE0 o. p" W2 x' T) S6 T
-
# \! P3 E, j, z# G# o - IrqProgramEnd& O9 Z" n3 r( ] b
- PLA
, @7 G% C7 z: I! X1 O8 z - TAY2 f" |9 v% R0 h8 T1 }
- PLA
% d: R( e% {6 h U7 T - TAX3 l6 v3 y. S" R& I) A
- PLA4 _' l5 m w! \' e- y+ C& U
- RTI
: n2 p" b# c7 z: H' v& j - E5 |9 v* Q, O7 I2 L/ j# ~/ T9 @
- ;==================================================
; w& W; x- w9 s }# R+ X - ;中断表' b# a' U9 C! `( b1 i
- .ORG $FFFA
* n) g% H v" V O0 b0 f8 { - .WORD NmiProgram
! g! ], W9 S ~5 \% D - .WORD ResetProgram
2 X j( Q4 \8 p5 A9 H - .WORD IrqProgram
复制代码 [/code]( { j+ ]) K" N; v# H) q B0 G
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|