|
- [code];[FC音乐][MMC3 IRQ]5 R6 @6 D: {0 E/ s: t1 \% R1 }+ ^( @- d
- ;FlameCyclone 20230710
( n8 J8 A3 t5 Z7 y2 D. B
/ C) z$ B o) _% f" ?- ;文件头- l& K- l! e% l5 U1 ]8 E0 h1 O
- ;======================================================================
$ }+ o3 ]( {9 f- q& ?" T" U - .INESPRG 4 ;16KB PRG 数量5 c1 N2 q, I9 ?* _
- .INESCHR 1 ;8KB CHR 数量
. ~8 F' H1 o/ A y7 S5 T - .INESMAP 4 ;mapper 4
* |/ {: W4 y3 }* k6 i - .INESMIR 1 ;命名表镜像 0水平 1垂直) b( ?% W9 f" U" V' O
Z" J/ G) g! z/ s: K6 w- ;必要条件
% b0 `) b1 V% k& @8 s2 q - ;1.持有CHR ROM
9 H9 y( t }) E' ]2 ? - ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$10002 s$ V- L# c b- U) u" Z6 B; D
- ;3.精灵内存(OAM)不为空8 \6 Z$ {9 e; |+ K) h& Z6 P
- ) N# d8 ]" a1 Y. z3 o; @. h
- ;==================================================
y U _3 x. D. g - ;NES端口常量
: w% D" |: t0 E' O- W9 { - PPU_CTRL = $2000 ;PPU控制寄存器
- u6 k' V% x3 F4 }! u5 _/ A - PPU_MASK = $2001 ;PPU掩码寄存器
* Q5 i/ Y% L* h: @1 @( E0 U/ z - PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
+ I- ^3 X# j, Z& T; ^" [ - PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
5 t& a- n6 k2 J3 q$ @& x - PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
1 T# D* b f* x( F - PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 ) ]7 ?7 K: I8 c
- PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加6 R+ h3 S" K' S6 Y1 ^ \3 T
- PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
% d/ O1 S' T! H7 V0 K" `4 d' U& F$ R - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存; ~8 u* ]. l" c- A& ^ q7 y) z( P
- APU_STATUS = $4015 ;声音通道切换9 D1 {7 z O. p9 m1 w
- JOY1_FRAME = $4016 ;手柄1 + 选通
8 ~: e! W' {& Y: t- Z# u - JOY2_FRAME = $4017 ;手柄2 + 选通
& N' n6 ~. C6 [- G( r) q2 V; v - , l8 N$ |3 P2 e7 o- o9 {
- ;==================================================
- ^4 D2 Q1 a1 j4 v% \4 E - ;MMC3端口常量" e0 ?3 f1 ]* t% d+ T
- MMC3_BANK_CTRL = $8000
- S% t8 w0 P! x% k3 L- c - MMC3_BANK_DATA = $80015 L( u7 O8 B( |$ o @9 ^: {! e
- MMC3_MIRRORING = $A000
8 b7 i4 C6 p& q* g Z x* e - MMC3_PRG_RAM_PROTECT = $A001
* `+ `% F" g* b - MMC3_IRQ_LATCH = $C000) ^$ ?% R6 n) y* z3 K
- MMC3_IRQ_RELOAD = $C001
+ v; w( M$ O9 t+ I9 _ - MMC3_IRQ_DISABLE = $E000* y) u/ `& e0 B0 e9 ^
- MMC3_IRQ_ENABLE = $E001" c( K$ b/ w3 u6 E2 m* ?8 q
- 9 Q7 P- y9 K# U! ]
- ;==================================================
3 @2 J; m; _4 | - ;程序块配置& R; T, c, a% L4 Y
- BANK_DATA_MASK = $07
. s' l$ l7 {! f - ;--------------------------------------------------
! p" |" Q' A5 ]3 X4 ]) p+ x - RESET_BANK = $07; V1 v' |) T. B4 F
- RESET_ADDR = $FC00; G* A4 H+ Z7 C- m
" W1 H, f; k( a8 c6 }6 A- ;==================================================1 s+ _0 F8 a4 h: n0 a' p/ E
- ;图像块配置
4 O4 i* }0 g# B4 Y3 b* q* Z$ Z8 f - CHR_DATA_BANK = $08
( x- `/ c) ]0 C' D# F: E
0 {# S8 C7 c2 E( N& T4 l4 H6 q- ;==================================================: ~# w) ~5 \1 z% o) ^$ ^: _! M
- ;零页内存地址配置4 P& U2 ~) f6 t7 z& L C2 z
- Use_Ram_Addr = $80$ s/ B5 w2 |% E, w# t
- PPU_Ctrl_Buf = Use_Ram_Addr
- ^9 t- u! W1 v) S - PPU_Msak_Buf = PPU_Ctrl_Buf + $01/ r+ p( [9 L) I( c0 }) \% _+ D
- PPU_Scroll_H = PPU_Msak_Buf + $015 g, X1 O2 V7 p7 B! s
- PPU_Scroll_V = PPU_Scroll_H + $01
0 O" ]! ]3 o! o' m$ t - FC_Data_L = PPU_Scroll_V + $015 F$ @( [- F) U8 p
- FC_Data_H = FC_Data_L + $01
4 K7 d: H% r, M& y& S - FC_Data_Buf = FC_Data_H + $010 H( ^2 o8 F% A4 d4 c
- ;==================================================
! g7 r, j3 ^' J0 S, h) K" G
+ M5 \8 s5 h8 y f8 E U- GAMEPAD_MERGE_FLAG = $04" I- s/ {$ l- @( F2 j
- 1 f+ p/ p* t+ {- o
- Gamepad_Keep = FC_Data_Buf + 1, v& O4 \$ ], d# ~ F/ O0 r' `6 f
- Gamepad_Once = Gamepad_Keep + 2/ _& e/ I7 e( t1 q8 y
- Gamepad_Temp = Gamepad_Once + 2 s5 i; \. m, m( m. u% ?
-
7 q, U8 L5 G) N. K+ i: ~ - Gamepad_0_State = Gamepad_Temp + 20 |* {& U# W5 X5 {" }5 r4 O9 Y
- Gamepad_1_State = Gamepad_0_State + 12 J8 r6 r/ Z. w+ o1 N
- Gamepad_0_Value = Gamepad_1_State + 19 L! D ~% Z, _( a
- Gamepad_1_Value = Gamepad_0_Value + 15 e2 a) ?7 q* N7 K# p& I
- Gamepad_Port_Value = Gamepad_1_Value + 1
S5 q/ t; _1 k - Gamepad_Merge = Gamepad_Port_Value + 1
- N; Z% d; \. \+ W. w. n& j3 N7 A - * O" A" f3 ?; }0 H# M! J
- ;==================================================
+ S$ p* R& c( L# S2 A7 ? - IRQ_Index = Gamepad_Merge + $01
" H6 n+ Y6 j; G - ;==================================================
% {0 j- ~$ N& f8 a - / U- U" ^6 m0 |2 i, G p" g
- ;CHR图形数据" a1 ~$ ~9 Z1 i/ A) r- {5 `
- ;==================================================" [; b9 [) Z( W/ U* p& z) @) R X
- .BANK CHR_DATA_BANK
3 T" z0 p3 b0 m) }! C6 T - .INCBIN "chr_bank/chr_data.chr"# M7 |3 T* a( V" z' s
- + ^) @8 G. {* B' }# t, p3 O
- .BANK RESET_BANK & BANK_DATA_MASK
. ]: U; J4 `$ u3 B4 y, Z. @ - .ORG RESET_ADDR0 l3 N: b5 M9 n1 n/ t, K
- & Y1 y) d6 w* ^
- ;--------------------------------------------------: r# R( m% z* k/ j q
- Attributes_Data1 d$ w" h# t$ M) c' E7 W( `' {0 a
- ;命名表属性
' y" |, ]" w2 S r - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
. e5 W/ W" ]+ |* E& Y% A - .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA2 ]* E2 L6 m! n8 z+ R9 t2 j( p* E9 T
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA* A& Z3 s! C8 ~7 G& P
- .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55" X5 t8 L, x8 P
- ;--------------------------------------------------% L9 u0 W& l5 J
- ;调色板数据! x. Y$ h% f P* Q1 c* o$ T8 U
- Palette_Data1 V9 R# F8 p8 g1 [" @* r% _- A3 X0 ^6 z
- .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
- t7 h4 u; N/ @. `" z, r. C8 t! d+ @! y! L - .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F* {- w3 |& v. i2 }( q
- 7 Q. w5 v; Q. }& n' S
- ;==================================================0 ?8 c+ t( `' [) E+ M
- ;命名表初始化
$ u# o, O8 ]% `/ w+ `, t2 M - Init_Name_Table
5 n' x4 n0 m1 a: N - LDA #$20
; u' E; e8 p r b$ s! L4 @8 t - STA PPU_ADDRESS
$ _/ W$ o1 s0 B: x! B9 m1 @+ Z - LDA #$00) j$ g0 G! P0 b& D; ~/ w
- STA PPU_ADDRESS
; n ^+ R! L' @) P, W - LDA #$001 m* U: x; ^5 }8 I
- LDY #$00
4 K, S6 z- f" C$ |! j' x - LDX #$10' K. R. A9 X {
- Init_Name_Table_Write) V) P- t& r( F4 y% n5 ^: N
- STA PPU_DATA8 F2 Z& f3 N O8 P. [2 n
- INY, b" \% j7 A% N/ Q5 V! z& K* ]
- BNE Init_Name_Table_Write
; W- D, p% U2 a - DEX* H' u$ [/ d0 j1 O$ A
- BNE Init_Name_Table_Write1 D; c: D. J! u* d
- RTS% Y: D# P) j* I- U3 h' b
- 8 z2 j a' c P
- ;==================================================1 c, ~) b3 O' b s; A9 D" L
- ;调色板初始化* C5 @, F) W( w* O, T
- Init_Palette
5 k9 F2 H6 D# U4 W# Q% G, t - BIT PPU_STATUS
- z) r2 U# E, g( g1 L1 b+ v* h2 _ - LDA #$3F! ^% J' K/ T+ V A
- STA PPU_ADDRESS
( c8 I" F8 h/ B. i - LDA #$002 |5 u* o& q6 h5 b
- STA PPU_ADDRESS
: Q6 N3 k9 A' i1 X: D+ t) }) D* @ - LDX #$00
' ]; `' L. T6 D" b, N - Init_Palette_Write
7 b6 P: k+ N3 e: ^9 x/ r - LDA Palette_Data,X
) C4 v4 m/ _( `/ Y$ [2 T4 q/ j - STA PPU_DATA
' A x9 ]; W* N9 a2 z; t - INX
. k- @% N4 f6 e; v6 D0 R+ w - CPX #$20
6 ^ c8 s* x; x7 C' o - BCC Init_Palette_Write
- G% z D% g$ f% ~- x - RTS0 R8 m: y! e! Y; J M9 }7 M) t8 i
- 4 g/ E6 H! K( p, l4 \1 G
- ;==================================================, a8 P9 ]9 S7 z7 {# z) b
- ;设置命名表属性
+ s. E8 N1 x, S, f - Init_NameTable_Attributes
& t: b: J4 Q; _8 \# T8 ? - BIT PPU_STATUS4 Q2 p8 Z" o; u0 [: j5 ?
- LDA #$23
! P3 ]2 j/ e4 P+ Q - STA PPU_ADDRESS& a/ U8 Q0 I# E* W$ P
- LDA #$C0
% _& d& U6 ~- Z! j2 C3 Q3 Q4 F - STA PPU_ADDRESS9 T S/ J0 R! z, T6 b
- LDX #$006 [, m4 `/ @. u o
- Init_NameTable_Attributes_Write
2 H+ F: |( S' g/ l2 a, Y - LDA Attributes_Data,X8 \1 F2 {; s- H5 |1 {$ e
- STA PPU_DATA
( U1 H7 u0 W; f/ W - INX5 k1 o, u" F: ^
- CPX #$40& q( M; a y+ T, U# r6 h- G
- BCC Init_NameTable_Attributes_Write
& S) s& ]# L. J u. G+ h l - RTS
' l' v* ~ ]5 ] - # h) `; ~% _- y x& r2 w
- ;==================================================! Y6 j4 {& |& E, M
- ;初始化命名表文本
( H, i: S0 m7 F( t: y0 m - Init_Name_Table_Text
) {2 l4 T5 z% d* n, K! p. t - BIT PPU_STATUS J1 P7 E( @% V- F/ r( N7 H
- LDA #$20+ x# t* |5 ?( q1 Z8 u
- STA PPU_ADDRESS
) i, A2 i: p; c- f2 Q- b" h - LDA #$00
/ Y* [, h7 p7 p/ r - STA PPU_ADDRESS
% F p" U G& F) _8 ~' |6 Q - LDA #$00
% v/ m$ B7 @1 h - STA FC_Data_Buf, S. B! Z5 C ~7 Z- |+ o% j% q' @) ]( D# H
- LDY #30
* v/ H: L H3 b: x, j* M - Init_Name_Table_Text_Write3 \. U& {& ~3 M) _$ V* f
- LDX #329 D0 E, W, y! D
- Init_Name_Table_Text_Write_Char: ~5 \! I, o+ O0 p3 z7 c
- LDA #'0'
3 J. ]- \3 h' H9 m4 ]6 @' O - CLC
4 e( d& [) j0 M% P& o - ADC FC_Data_Buf7 m. z/ o. U& q$ C
- STA PPU_DATA
( Z1 v' U9 a U - DEX
+ m; U6 D- i9 H* R - LDA #$14
6 S4 q [$ p# V9 U - STA PPU_DATA
# R0 q% ?, A; v/ x0 t - DEX
( W+ ^3 W5 Q5 S& {: k - BNE Init_Name_Table_Text_Write_Char
0 \4 X. {, J5 Y1 x, H4 \# P4 X3 O - INC FC_Data_Buf5 b; l8 `/ z+ l, u8 |, y
- DEY
& z" G2 l/ ]/ R* i: z' b( V! e - BNE Init_Name_Table_Text_Write( K% {. d7 ~- W! y% n1 u
- RTS
) H$ V4 H& {% J* Q& Z8 h2 ], p
; V; g7 G8 t5 g+ W, R5 M- ;==============================' q' G0 q, H* d/ U# Z- P5 ^
- Init_OAM_Ram;初始化精灵内存( `/ |9 i. ~7 Q4 \6 F4 D4 z% v- y8 }
- LDX #$00
5 h& j- }+ K! w - LDA #$00
8 T- _5 b- z v) p4 I- P# T - STA PPU_OAM_ADDR
f8 y1 S6 O' _; p - LDA #$F8( x! X' c' l" N, U5 D- E1 |7 R- c
- Init_OAM_Ram_Write
" S7 O& X: E! t3 P - STA PPU_OAM_DATA$ }3 _# \( i& `: n
- INX
( S/ ^/ t, Q% z2 y% n. [9 d0 C - BNE Init_OAM_Ram_Write0 L5 N b m6 u6 b. T/ R
- RTS; \ r0 Z' ^/ Y# o3 [% i! l3 _
-
0 d: N9 u, K" d1 v i/ j - GamepadProcess;手柄处理
" }# f- f# f& n6 J0 V* l' r - JSR GamepadDatacan; ?; m: O: m6 A8 O/ ]' Z
- LDA <Gamepad_0_Value' k- g2 m4 o d4 p7 G# H/ a8 w5 N0 s
- STA <Gamepad_0_State
8 v+ ]! `# _6 K - LDA <Gamepad_1_Value2 {& A% A! r6 u9 y* p3 H
- STA <Gamepad_1_State
1 c* y8 C7 d9 A - JSR GamepadDatacan
7 W3 {9 [3 @0 N! \: z& i - LDX #$014 t, @% h( ^# i% {) |/ H& W8 O
- GamepadMergeCheck;合并手柄输入检查
* ], D [# Y' F2 Y1 W1 |! h( Q( [ - LDA <Gamepad_0_Value,X! X5 J7 Q2 t1 M/ ^
- CMP <Gamepad_0_State,X! A0 @: e( A; v! B e9 D
- BEQ GamepadMergeInput' F2 i S( Z- m4 q |8 K
- LDA <Gamepad_Temp,X1 L# A, j( w" \2 D/ T# o1 l
- STA <Gamepad_0_Value,X' G7 ~- c6 e/ l$ c( f8 B
- GamepadMergeInput;合并手柄输入: \. p: @% T ~# ?+ o$ V
- DEX
8 z$ J, j9 T+ K6 U# p$ g - BPL GamepadMergeCheck
) d7 M- n' v: _2 _- `6 g3 `' @ - LDA <Gamepad_Merge3 z( e! g( B! Z. Q# u2 t4 Z3 b: L+ Q
- AND #GAMEPAD_MERGE_FLAG( Z* O! q, Y) L9 ^( N
- BNE GamepadStateProcess
4 K$ l4 G+ \; Q/ h. S# P; M& ^" } - LDA <Gamepad_0_Value
: G! L, d7 C8 N% W, m - ORA <Gamepad_1_Value
5 K. j5 _& t& I6 i4 Q. {; n2 { - STA <Gamepad_0_Value) L# V1 ~8 l, R/ h' X& S9 G) U
- GamepadStateProcess;手柄状态处理
) j, z; r9 C/ Y4 p' j5 b- }3 b* g - LDX #$01- i; K& v# s6 |7 k3 f; l* b. p, w
- GamepadStateSave;手柄状态保存
+ ~3 Y7 a/ F5 | - LDA <Gamepad_0_Value,X; o8 w, ?/ A( L5 A% E5 X! J
- TAY
7 G4 w( m8 E0 c; D0 o7 Z D5 @ - EOR <Gamepad_Temp,X# U, o) w4 l" ^( ~0 t
- AND <Gamepad_0_Value,X
/ b' O; {6 E$ C1 N7 G5 ]; n - STA <Gamepad_Once,X% |; B1 s( t: A8 B- p3 `$ y
- STY <Gamepad_Keep,X
. ]5 p4 q" X. O- X& R! Q: V1 W0 h - STY <Gamepad_Temp,X# D: |" z7 S; }( o# [& x
- DEX8 ]1 q& d8 Z9 x0 l' E- \( e9 r
- BPL GamepadStateSave/ S6 f, p6 Y @
- RTS
. w. V6 \5 L: b# T, p, F
/ @) \* U" K! F- `- GamepadDatacan;手柄数据扫描
. u$ U/ W% E% @ - LDX #$01/ l+ E/ M. l- P( E
- STX $4016
# @# n2 C4 Z5 n! U) e! h - DEX
9 r7 M- E& v; k* H7 ^ - STX $4016
- |* {# u- S; X- a' @; q - LDY #$08( p% E% H1 ]- a3 n4 l
- GamepadPortScan;手柄端口扫描
6 e& L8 w' ~# S/ a/ v5 G - LDA $40163 D* Q4 i1 K/ N8 Z( W' x
- STA <Gamepad_Port_Value
% ]6 I/ j& `. J/ M1 g4 \) n( |* u - LSR A* Q+ A7 [) z1 u6 d( R1 {
- ORA <Gamepad_Port_Value
: G, s% b( u' o) R! {. [ - LSR A
! g3 P7 M- k. R1 U" D [2 { - ROL <Gamepad_0_Value
- A1 H5 e% @9 v - LDA $4017! y4 N5 U3 `2 h4 G% g8 g, u. D8 D
- STA <Gamepad_Port_Value
& F# i' c$ c4 U - LSR A3 _ g$ q% {6 U$ @8 V
- ORA <Gamepad_Port_Value
1 l7 s) I6 g& h3 v2 Y - LSR A- c* }) e) I& z+ v
- ROL <Gamepad_1_Value j9 N' d: I5 W' O3 z6 j7 }
- DEY
+ s! k/ S% y" P% e9 n+ k* D2 ?1 ? - BNE GamepadPortScan B9 A- b/ {. S% [1 U' x8 ?7 ~
- RTS2 J: R' a& d, j2 J" m
-
: D F3 e+ O0 F! {3 W - ;==================================================
$ p( H+ |0 g! l# G( K0 _ - ;PPU处理
. l" ?1 ~5 }, Z* D# t' X+ ] - PPU_Process. B/ I6 d4 H6 O; s% Q# A
- LDA #$001 }8 s4 C7 _6 u% i! l2 Z
- STA PPU_MASK
& L2 R! _8 r, a -
6 W. i& i) g5 c - BIT PPU_STATUS
5 c" X' f* g. C. r - LDA #$20. _! d' |! M( G6 T
- STA PPU_ADDRESS
! u9 ^" I( Z6 x - LDA #$00! B: C- z6 A" S2 V; Q2 q2 l0 g+ _
- STA PPU_ADDRESS
2 Y* L& ^: ^7 p2 p4 P. u& Z -
8 C Q5 ~! j B% l: G - STA PPU_SCROLL- C1 `( ?8 L+ s: c
- STA PPU_SCROLL& b1 s6 n, s* x8 P) d2 Z& [: a
- + u; H/ u" J1 a. @% B- X! U1 r
- LDA PPU_Msak_Buf" X7 T! C, r; [0 X
- STA PPU_MASK
* l, N6 U+ U& q9 C# H
% ]5 v6 k u6 b- RTS! i) U4 O7 B! x- c y& Z
- 5 @- g8 B4 E; a4 m y0 d
- ;==============================' @( H- H8 R3 d
- Time_For_Vblank;延时等待" f8 e: F+ K9 K3 I) w+ Y6 K
- LDA PPU_STATUS4 c0 t6 m: A5 I% W* G# U
- BPL Time_For_Vblank
, O6 |8 U6 o* X9 r+ Q& | - RTS
, g$ \, E5 t) [8 }. p+ l+ w/ `: | -
" A; Y, Z. P3 M2 P/ Q - ;==================================================/ L# S! L8 `0 ? h! a
- ;初始化MMC3
0 v: X) g- R8 j% X8 S - Init_MMC31 P [% Y1 U* \. Q
- STA MMC3_IRQ_DISABLE) T7 A+ E8 ^3 S$ b/ H
- 9 \; _+ a3 [1 O& f
- ;设置MMC3水平镜像% c1 O* `, r$ ^: ]
- LDA #$01 E# {6 e0 k& H% @: F8 N. a# G
- STA MMC3_MIRRORING+ O( v. q; _ T, u+ g* A8 r: o4 T
-
; a- B5 C3 S& P - LDX #$05* x5 H0 A# m( J- n/ L
- Init_MMC3_Chr_Bank_Write* \2 R. H; m B! c5 H" I( `$ R
- STX MMC3_BANK_CTRL
, w8 U) W% _1 L% K9 W) R - LDA MMC3_Chr_Bank_Data,X
; b+ H0 [5 S4 O/ ~$ x( D - STA MMC3_BANK_DATA
5 j" x8 j: u# a* s1 ?; t$ d; w# P - DEX" N$ m- ~, D/ F3 f4 o
- BPL Init_MMC3_Chr_Bank_Write5 v3 ^6 o& Y9 `/ U
- RTS* x7 }2 T* A) x1 `8 | U- w
- ;--------------------------------------------------* N$ ~8 ? f# }$ U0 t' _, V5 U
- MMC3_Chr_Bank_Data) ]7 v+ G; V- C( Q! ]6 S
- .DB $00,$02,$04,$05,$06,$07
: a. q& @2 R; _$ q% F; e
0 M4 \9 E2 A# J2 J- ;==================================================8 ]( v1 U s( J! J9 B7 V8 k% h
- ;重置中断处理
; _% B" f+ A3 L, ^' G - ResetProgram
! F5 A+ J$ j; E% l - SEI
5 m5 C2 h5 W) h% h/ V - CLD) o1 Y+ W( G9 K; y: V% h- l# z. M+ }
- LDA #$00) ^2 O0 c. U3 J
- STA PPU_CTRL
$ a$ D2 G a" S; j$ z - STA PPU_MASK
8 i. b1 M& m7 P9 V' v: Z- b- D - STA PPU_STATUS0 b5 f8 e0 X2 t5 R/ [& g
- STA JOY2_FRAME
7 h8 F* j9 G! d9 ]* }, ` - STA APU_STATUS1 E1 v `+ z7 r! t& _! y
-
2 U& ~: [8 G- j6 a K' F4 g - LDA #$C0
: m3 _6 w4 B9 E7 `7 ^ - STA JOY2_FRAME
( H5 R# x4 O" C# ^ - ; ]6 g8 R* R/ F% U3 J1 Z
- ;等待vblank% k0 V1 Q* s+ v2 b! L* s1 e
- LDX #$02
& _. M ?0 W! T - Vblank_Wait_1
8 e5 n9 F3 u+ x( S - BIT PPU_STATUS2 m: d1 {3 K3 [' {! x8 K
- BPL Vblank_Wait_1# U- }( D; Y7 g- R. C4 {3 {
- Vblank_Wait_2
3 v" o0 h1 P. D- m! v2 | - BIT PPU_STATUS
+ g1 i- ?* v( B - BMI Vblank_Wait_2 |% ?/ y* {# N2 ^; @4 W& F' A
- DEX
4 W, l& U& }, d) L8 b( \ - BNE Vblank_Wait_1
, Z, R m: N! k" H -
0 I a& S. w2 E - LDX #$FF. L" W- z5 t+ J$ P4 {
- TXS$ ?3 Q( ]) W5 W8 y
-
1 H. E, m. e! A - ;初始化MMC3
, l6 }7 |. t |' t; ` - JSR Init_MMC3
7 d" b- L% a- O - % Q6 D3 [: P. H/ `5 M1 h. n
- ;==============================& l0 g0 B# y8 K$ @, T! W
- ;RAM初始化+ K: Y' Z! `% ?2 o
- Nes_Ram_Init
1 |9 f1 S$ C, r3 G/ ?0 ^ - LDY #$00& @9 G8 }& a- d
- LDX #$080 B6 C% a5 u5 v% \' j' ]6 g
- LDA #$00- `. R1 [% }0 w' L6 p
- STA <$00
5 M- n# R, a) Q - STA <$01$ s8 N* |0 Z' c5 U8 Y4 B
- Nes_Ram_Init_Write9 R2 z0 A7 ]' z
- STA [$00],Y
9 {- H1 w! s- b - INY" j( v2 l" C) n+ X* C+ G( b
- BNE Nes_Ram_Init_Write
9 E# m# q4 t/ q0 i - INC <$01% B) U' c# z; s( _
- DEX
: j- G' o9 Q% U3 N: P. f2 e - BNE Nes_Ram_Init_Write6 d9 }" _- j9 ?" u# Z
-
) p+ m- t/ P: g! u/ A/ i4 h - ;初始化命名表
, x( \, k) [1 B0 V4 d* H: T2 k - JSR Init_Name_Table# n& n0 s9 W* O% S: o+ H' ?
- ( x* j; i8 a; g9 k. r2 o
- ;初始化调色板
7 G3 U2 }0 R1 H2 q7 i) ?9 `# F - JSR Init_Palette
! b/ R( f `6 ?5 u% z0 ] -
' S2 Q) g8 L* n - ;初始化命名表属性
7 s6 U2 `1 }6 ^: M" g- i g - JSR Init_NameTable_Attributes3 i* A+ V f/ f, S* l3 L4 z2 ~
- - @( b& o+ E5 @$ ]! x/ N3 W5 ]7 W
- ;初始化精灵内存
/ j/ @9 b& l$ E% M0 F - JSR Init_OAM_Ram D |# a" d! Q' g- p/ a0 Y! o
- 9 J- w* N$ Q( a, q& h2 ^
- ;在屏幕上写点东西, i6 H! p3 x/ i& H
- JSR Init_Name_Table_Text
+ N8 l0 a g/ P; {, A/ H( s z -
b$ D8 p3 B/ a4 ^* J# z - JSR Time_For_Vblank
0 \: ~, ]" C p9 F( d/ } - ;开启PPU控制4 G3 V4 k9 O: _9 d: D- E8 Z1 _
- LDA #$A8! b$ v! Z/ o- D: z* N
- STA PPU_Ctrl_Buf
# M) v8 B) r5 s/ P. d( v- R a - STA PPU_CTRL
. k( |# N9 T# S% h Y -
, C8 B7 N- }& z9 P7 R - ;开启PPU显示
; o% p0 Q! R1 k' g. ~ - LDA #$1E
' ^# h1 Q+ M$ l$ H+ T7 X - STA PPU_Msak_Buf. x8 ?* |% D1 d1 X+ j# ^1 V# ^
- + p, X( V- e+ Q# P) Z
- CLI5 U5 y6 U- r. E; I+ C n: ^
- JMP Loop
$ f2 O5 Q6 ^/ a6 f6 H! y- a -
+ @) T- m% I' d7 P& G* r - ;==============================
9 X5 a* H/ B) [- X1 L) p - ;死循环, 等待NMI中断4 ^* e+ n, B5 q& o- A2 `
- Loop5 f- F3 h; Y9 F* p) d% g* u+ I
- JMP Loop
2 X7 s% z$ }- A - ; @& s- w9 n! Q- d. C$ w9 Z
- ;==================================================
3 I4 r) b4 u: s' l - ;NMI中断处理
/ K' n: z2 s( ^8 h) K& z9 I - NmiProgram
. g# m- [6 {) X4 G* V g+ e - PHA
+ h8 a# J- f& p' n c! z3 A - TXA
* ^8 v3 n# I* J - PHA% ~" y8 d% W* _
- TYA8 d0 i, R9 h% T1 \* m
- PHA; L/ x( j3 H8 e* F" [) U6 g
- ( ]3 c8 L9 X* U( P. T% ^
- BIT PPU_STATUS0 M) F" Y9 s& a8 C8 o
-
2 Z! k9 ^1 c: d: } k - ;关闭PPU控制7 d: ~+ [/ Q0 Y
- LDA #$00
& A+ b1 J4 Y: |1 d' z - STA PPU_CTRL
) H1 T! o* t1 L' O0 i - * M0 d( E# `! ?$ x: q4 v. l( d
- ;处理PPU
( p1 [0 Z: d+ Z! Y' x4 P - JSR PPU_Process0 V& j& Y7 \1 {5 I
- 5 n( [3 G' f+ |# H. U. P/ F' g
- ;开启PPU控制3 Q2 X5 _ k1 ]) C$ m/ f
- LDA PPU_Ctrl_Buf
! o; C) q' R% R D# Q! Q! H - STA PPU_CTRL
- I) M% g8 L$ |! V- Q+ m9 T; N2 ] - * `1 x2 o6 ? c& x1 f0 |
- ;手柄处理
$ u2 N2 O y; @4 g) Y* A - JSR GamepadProcess
$ V( G5 j' @( c* ?. L7 y -
: d" N% X9 a& [; j/ l - LDA #$00" a. [1 `) u8 F$ c h8 Z
- STA IRQ_Index
3 u! V; ^" y5 d5 Q -
# l; `, b; ~6 U: u$ c, ]1 m* ~ - ;启动IRQ中断, 第15条扫描线触发
$ i! Y- F+ G; k: [5 E1 i! S# r - LDA #15 + 1) W# u% \1 _6 l" G2 V! ~
- STA MMC3_IRQ_LATCH
; ?! V+ _7 R- k - STA MMC3_IRQ_RELOAD. X/ q4 d$ E( G; Z9 H" Z
- STA MMC3_IRQ_ENABLE. j, p& y; O* G+ p4 O
- CLI# F) M \9 D9 A6 G
-
3 D* L: e$ m! Y6 w' z7 N! j( M - PLA. T# o! U |1 m; u1 _2 _7 M
- TAY
' C) W+ v5 I2 H, ~& [; s$ A$ n2 A: j - PLA. g' W6 }7 m! Z: t% I6 Q. `3 B9 R# C2 J
- TAX' f1 o3 R9 z# C3 }$ ^% x
- PLA+ N4 p r3 X6 I, S# [- z
- RTI
1 F% f4 o: Y, _- C! c& e: V
$ e+ a* u s' q7 s1 N# O, L4 x- ;==================================================5 Y% j" L" y, ^- r* w. r
- ;IRQ中断处理
3 f, E4 c F( z1 j; ^ - IrqProgram
) k6 J7 O0 U+ G1 L+ V; ~& c3 o - PHA% j5 G% b% h( t. ^! s) x# a
- TXA
5 E& K' _8 E, h - PHA
$ Q2 [6 d. g# S, {3 ~1 u3 v - TYA
9 |1 p" [0 k0 y" f3 t0 i. v - PHA
+ z7 e1 ], ]4 j: }0 S/ Z7 V+ S% s# c -
* i( ]8 H' W6 i - ;关闭IRQ
2 Y. Y7 @3 C; ]! t0 ]# J - STA MMC3_IRQ_DISABLE
( J/ G- n7 F+ n! r+ F- ]- X - # O( Y6 `, A5 \
- ;允许下个IRQ触发6 s' g5 q1 Z: W
- STA MMC3_IRQ_ENABLE
{. `- l5 r: N - 3 o" {: t W$ M d
- ;IRQ处理, 15线后继续触发4 A- h" {4 _& n
- LDA #15' O. q4 c, {2 }" C+ @
- STA MMC3_IRQ_LATCH
/ [5 f7 u& M$ Q6 \( k -
v: `( P3 k' y* X2 K7 M5 x - LDA <IRQ_Index. R9 B+ W6 o% M
- BNE * + 41 y4 Z, F* k4 D
- INC <PPU_Scroll_H; Y0 _8 L2 f; o7 }
-
( y0 [* H2 M; k9 D; ]- Q - ;设置屏幕滚动. U5 L x0 l( `, s! x1 a/ b' [
- LDA <IRQ_Index3 N5 W8 [0 R7 p* N; [6 q
- AND #$01- K9 _0 |; j m, U
- BEQ Irq_Scroll_Right
) M6 @7 H# {% d p: P; | - 5 P( V j6 v+ A8 q6 L5 z
- Irq_Scroll_Left
* j2 u) j+ s# o( S - BIT PPU_STATUS# ^/ u: Z/ R2 l* T1 f; S
- LDA <PPU_Scroll_H
0 ]- w$ C7 U6 i - STA PPU_SCROLL
" h7 }/ Z& O7 I( G4 c - STA PPU_SCROLL) x% [4 \7 I1 j+ o0 V/ J
- JMP Irq_Scroll_Over8 ?: z: M p1 M9 s% d3 ]
-
/ ?+ I5 \1 f$ }' s& b - Irq_Scroll_Right+ D8 k- c) o' n9 r) ]+ y6 Y' G
- SEC
3 ^' J j5 D& u H$ ^ - SBC <PPU_Scroll_H
0 X- C) }/ M7 r9 \ - STA PPU_SCROLL
v: V Y2 x* V$ \- u" s - STA PPU_SCROLL8 S ~6 A) ~$ ~/ W* h" S- ?3 \
- Irq_Scroll_Over: ]2 ?8 r" j: Q& ]; R
-
, P. w5 l& z9 d' M2 g1 V2 I - INC <IRQ_Index6 J9 M$ b& `/ r- p( H$ y2 w, W% L
- + r( @4 T% \5 f
- LDA <IRQ_Index
6 g- @5 Q4 R' O5 E1 O: i - CMP #14
, h% F7 T- K8 i( r1 Y! q - BCC * + 5
& K" B% S- v5 k& G9 ^5 { - ;关闭IRQ
, \7 v( E4 O1 v7 Q+ t8 K - STA MMC3_IRQ_DISABLE
5 }; a# z- Y" F0 ^* Y& q: b - 2 B* T) M6 U3 f/ E9 p5 E$ m
- IrqProgramEnd
7 T) }) y2 a6 h: V% e! u0 b - PLA( ^( ?/ u+ j* A; I
- TAY
8 E$ T/ h4 W% h, V - PLA
9 V/ s- A7 E% L9 j0 y& I: h - TAX
) w# n6 d- N" Z. m - PLA7 v. _+ r2 c* R
- RTI
( n* g6 B l! P( D. Y: e4 y$ | -
0 M" \; t5 c7 Q5 M$ b, \/ ~ - ;==================================================
! i. r0 L5 ]' ? - ;中断表- {; d6 Z) L. i" Q$ ?' C
- .ORG $FFFA
. m! Q( r; m+ \8 K V - .WORD NmiProgram/ |; B: y8 R0 }
- .WORD ResetProgram
/ M9 m: R* i P' l' ?( ], { - .WORD IrqProgram
复制代码 [/code]/ L' X) J, s% v
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|