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