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