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