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