|
- ;[FC音乐][MMC5 IRQ]
$ U( \- o4 s0 g- t' g' a2 d' h - ;FlameCyclone 20230710
\# {( Q' e& X/ u% L& ^* Z4 H
- d8 ^9 o: n/ a% ^/ h- ;文件头
( x8 D1 C% y2 t" H - ;======================================================================
7 d. \ v6 H" `( p. Q5 X - .INESPRG 4 ;16KB PRG 数量
& A& c3 i: L1 f8 W - .INESCHR 1 ;8KB CHR 数量2 L1 F ^' v" `* @ H8 v- I
- .INESMAP 5 ;mapper 5
+ \0 x& g6 N2 N1 J: g3 t5 I) q/ f - .INESMIR 1 ;命名表镜像 0水平 1垂直
9 p- F6 U5 m+ U - & e m/ {7 y0 x
- ;必要条件# U- w* C/ f$ }8 i) o
- ;1.持有CHR ROM8 {0 e/ Y3 K x x. p, T
- ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000& U' V( d6 {0 }( Y( r* S
- ;3.精灵内存(OAM)不为空
) D: ]2 F* s( G+ e - - Y- E' o0 W9 {3 j( c7 [! \
- ;==================================================6 J, \& }( @, ?0 h) G0 `, G
- ;NES端口常量
" m& q# l+ M) V' ^; }3 {4 s$ [ - PPU_CTRL = $2000 ;PPU控制寄存器 Z5 Z; L H8 @4 z& \
- PPU_MASK = $2001 ;PPU掩码寄存器
$ r4 p, @! H) Z- @+ c - PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
& v3 B e. I" g/ ]! V2 | - PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
- Z; V) _6 }% C6 M: H - PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1- G9 l: g, q+ N5 ]9 m* a& @
- PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 ) f' r1 V! ?, y) Q' s5 K, d8 i6 C4 `+ d
- PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加! s. B+ g+ I' [4 H
- PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
$ [) E. F4 c9 y4 h6 I# l! z - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
9 Y9 d# p2 \3 C4 D9 i - APU_STATUS = $4015 ;声音通道切换5 V9 |, _" O% s7 r' f2 j
- JOY1_FRAME = $4016 ;手柄1 + 选通9 u. g0 ]$ T0 B/ G5 l
- JOY2_FRAME = $4017 ;手柄2 + 选通
( M9 z5 }" u0 S- q* Z& w
. ?! h T# U" ~ {8 A: E- ;==================================================; \0 j3 \% @( M% v- N' a: L, j
- ;MMC5端口常量
4 n6 } u# |2 A h; \, w: a L - MMC5_PRG_MODE = $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4
- L0 g/ w9 w! Y- Y4 y2 F - MMC5_CHR_MODE = $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8. k f+ H* f8 C" f- t# j( I5 C
- MMC5_PRG_RAM_PROTECT_1 = $5102;
5 d, |6 D0 q/ c2 J8 h0 F5 \ - MMC5_PRG_RAM_PROTECT_2 = $5103;' E+ ~/ k* ?/ B" C+ q" g) ~
- MMC5_EX_RAM_MODE = $5104; 0: Write Only 1: Write Only 2: RW 3:R
2 K. z% l6 u, J( Z* b I - MMC5_NT_MAPPING = $5105;0 B! [7 z5 N' h' m7 [) u1 u" E0 }
- MMC5_FILL_MODE_TILE = $5106
% L5 f! }* `9 f2 d - MMC5_FILL_MODE_COLOR = $5107( i. \/ w- c* x% r5 U
- 0 ]: ~% T `5 N B1 [1 G+ @
- MMC5_PRG_BANK_6000 = $5113
2 s$ U: Q1 c( |, D9 m6 | - MMC5_PRG_BANK_8000 = $51143 D8 j& C' G9 B9 n4 C
- MMC5_PRG_BANK_A000 = $5115
1 a. h) y$ [, x, l( O1 K - MMC5_PRG_BANK_C000 = $51168 a$ |3 c; ^2 W0 w( o/ G: F
- MMC5_PRG_BANK_E000 = $5117: R, \+ G6 M9 T2 P" t9 h
- # J2 w2 j3 Q' y. i: ^( y
- MMC5_CHR_BANK_0000 = $5120
( f' F w) X9 o9 `$ E P2 x - MMC5_CHR_BANK_0400 = $5121
. B' ^1 ^. d6 r( J - MMC5_CHR_BANK_0800 = $5122
t( j$ H& c% g7 k) g - MMC5_CHR_BANK_0C00 = $5123& k+ M F3 P+ c. j' v/ g% X2 V
- MMC5_CHR_BANK_1000 = $5124) I( m+ h+ [) v$ x
- MMC5_CHR_BANK_1400 = $5125
& @" F- [ X+ i! Q; {" t: f% v - MMC5_CHR_BANK_1800 = $51264 B7 O- Q F, }$ _
- MMC5_CHR_BANK_1C00 = $5127
3 x* H' f/ t, n+ X! S5 s - 0 w' S! h% V& ~1 B; c7 t
- MMC5_CHR_BANK_0000_1000 = $5128
2 r/ Y1 b" f/ X; _ - MMC5_CHR_BANK_0400_1400 = $51292 j2 ~' M9 k& A/ K0 @ c0 g
- MMC5_CHR_BANK_0800_1800 = $512A
1 q+ _7 Q& [4 U7 p - MMC5_CHR_BANK_0C00_1C00 = $512B, d2 S$ h* ^. W4 W' c9 ^9 ]
- : p7 i# f+ _# ?3 G
- MMC5_CHR_BANK_UPPER = $5130; ]: f8 q! V7 u! w0 o& r& A
- MMC5_V_SPLIT_MODE = $5200* D1 F. z) z" A9 |
- MMC5_V_SPLIT_SCROLL = $5201% S; t! Y" K6 v, S$ F+ R1 D3 @# H3 D
- MMC5_V_SPLIT_BANK = $5202' q- R; B: }/ K2 F7 a8 Q- w
- 4 G- Y' _, o C. A! e: z, o5 K! C
- MMC5_IRQ_SCAN_CMP = $52038 M H7 c7 g$ b& v! A- f( Q
- MMC5_IRQ_STATUS = $5204% o V5 V; g* x
- MMC5_MULTIPLIER_A = $5205
8 o: p+ c$ m* ^3 A5 j - MMC5_MULTIPLIER_B = $52068 K: e, g" K& g7 `& a
- : @6 }, O+ e2 G6 ^! [
- MMC5A_CL3_SL3_DATA = $5207/ I+ X1 w$ n1 u5 s3 R' e
- MMC5A_CL3_SL3_STATUS = $52082 `7 m. P8 @ x; n& |! ?2 B* }
- MMC5A_IRQ_TIMER_LSB = $52092 S7 L! c: ?* B- z, i6 s G
- MMC5A_IRQ_TIMER_MSB = $520A
( D% B/ z I6 ?3 \9 {8 J( | - ' f7 q h# H4 R
- ;==================================================
$ h, q! n' Y6 U1 {4 n7 c: U# Y - ;程序块配置* }& A. B0 ^* ]
- BANK_DATA_MASK = $07
; ~; L2 u* h2 F9 ^$ d9 @$ b4 _ - ;--------------------------------------------------
* I. L# g0 n$ D* A0 z. F! d" S - RESET_BANK = $07
3 P1 O# S; u4 @' W8 Z' I( G - RESET_ADDR = $FC00" W# V" E" w6 P: y% p
5 Z( f+ i4 V/ g6 r7 u' D- ;==================================================
^- r# U l9 {1 k' P - ;图像块配置
+ H( t5 U3 b% S3 D) l - CHR_DATA_BANK = $083 Z0 |$ K5 J# B% ^
& V; f {2 \) p$ m! k9 [* z- ;==================================================8 ^# i S" z/ T3 ]' j/ n
- ;零页内存地址配置
2 F1 w: m* J& i- }3 F# Z4 ] - Use_Ram_Addr = $80+ v/ c0 |$ l6 J; k
- PPU_Ctrl_Buf = Use_Ram_Addr* y* ~- A r7 U1 m9 C( i& v5 L
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01
# q9 }7 [% t* V( v2 G - PPU_Scroll_H = PPU_Msak_Buf + $01" H( C4 @! u) b: h0 F2 [
- PPU_Scroll_V = PPU_Scroll_H + $01
# H& B, S0 A O, C) w/ }) {1 x, K - FC_Data_L = PPU_Scroll_V + $012 e; _4 ^6 @2 x: ?
- FC_Data_H = FC_Data_L + $01
- l- b" x, P0 [2 ?+ R; \) i - FC_Data_Buf = FC_Data_H + $01) }" C9 M ?! m# W/ n" q1 k: m
- ;==================================================6 o0 R7 A9 N6 S* f% j3 N9 q# D! g
3 Y: c" V& r* ?2 C- GAMEPAD_MERGE_FLAG = $04
9 g, f% j# \) t+ h
* Z- p2 T. H: q- U, E( u* d- Gamepad_Keep = FC_Data_Buf + 1
- z: g( g$ _2 t7 u5 [9 {6 F+ Q - Gamepad_Once = Gamepad_Keep + 2
- w, V$ M. F, { c* f+ a& X - Gamepad_Temp = Gamepad_Once + 2
' x( a8 @3 g& M: N - & |7 o2 `; w3 K( y
- Gamepad_0_State = Gamepad_Temp + 2
' @. k2 R! U& s" z - Gamepad_1_State = Gamepad_0_State + 1
* s: p, E8 N0 z+ L& `! d0 p, W - Gamepad_0_Value = Gamepad_1_State + 11 f, k9 _4 P) X
- Gamepad_1_Value = Gamepad_0_Value + 1
; |# U g; D, h - Gamepad_Port_Value = Gamepad_1_Value + 1; M3 K* T' i% n" T' j
- Gamepad_Merge = Gamepad_Port_Value + 1
, e r" [( Y5 H# R2 B0 I
! x2 w! \5 s0 ^2 d. O# ^6 I# M' B- ;==================================================
O9 q; {; N* n1 Q& L I. C0 t - IRQ_Index = Gamepad_Merge + $014 e1 D0 g/ ^2 k* u, @. X' ?
- ;==================================================
7 i) I! J9 M0 j& m, | - V i+ {2 p# [ A1 C/ \
- ;CHR图形数据' m8 J' P" O9 l' S+ p# E
- ;==================================================
7 ^* t9 w/ k2 N: i2 z5 u, ] - .BANK CHR_DATA_BANK4 B+ W5 s A1 u9 x/ m# e; S
- .INCBIN "chr_bank/chr_data.chr". ]& z9 l# \9 [/ U
-
+ A$ E0 \3 T v) h5 f - .BANK RESET_BANK & BANK_DATA_MASK, `- m7 m1 R: k- E9 @5 Y+ ?) k
- .ORG RESET_ADDR
9 l9 W" F" I# q3 e1 r -
4 x' Y9 {# r2 G - ;--------------------------------------------------! Q' l0 ~/ I) d- r
- Attributes_Data
: ?" P- x! k9 h8 D, }4 N - ;命名表属性
' h5 z* C% F% q# \9 R - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$001 s& [, i4 [0 ]0 J7 ?* b' ?$ B+ v
- .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA0 u0 \4 }: b! V3 H8 y
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
. j" R: o: m; a/ ^ - .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
) V0 @1 e/ D; N, \2 a - ;--------------------------------------------------$ ]4 W( f& n: C8 K3 m+ ]& ?9 B
- ;调色板数据
; m# A6 d8 G; r - Palette_Data
4 P2 s* N9 h( ~( M% _ - .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F7 V5 [# S$ {& Q
- .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
! v" z8 l8 ^- ~8 B - 1 J( `- L* A2 u' D5 x+ t4 F- V
- ;==================================================0 f- z6 _" T- r, G8 n0 O$ ~
- ;命名表初始化
- h1 S1 f! V& X6 T5 ] - Init_Name_Table
; K" ]* X0 p4 |% y J - LDA #$20
7 Y1 a3 t, K1 I% q# ~3 D; P; G w - STA PPU_ADDRESS
5 b& R4 k0 L" f# H1 Y6 p- o - LDA #$003 Y2 W- z! x6 |/ C
- STA PPU_ADDRESS
- I2 k; `3 V2 E% a0 V - LDA #$00, s$ X( m p* G, p' q
- LDY #$00) _$ Q0 b) M- h; a! C" ?
- LDX #$10
' ^" E8 L/ _, m* \ - Init_Name_Table_Write7 J z# q7 e3 V3 ~6 j1 m
- STA PPU_DATA: k, G% {8 O* ?* i$ R' n- g7 G
- INY
- P' k+ J; c6 _+ Z" D3 S - BNE Init_Name_Table_Write7 \; q- O" B- @6 u
- DEX
; R5 K6 [! i1 a- U* c - BNE Init_Name_Table_Write
; f' ^( I3 I+ _. D& K/ ~8 `% P - RTS
7 i9 f' n4 m' X - 0 U9 L* h( l! L% q0 P' r7 {. B
- ;==================================================2 H4 }! j( x- [5 X
- ;调色板初始化
/ N+ D* w6 ?7 k - Init_Palette
I- k: u% N9 n9 n# o' [) V - BIT PPU_STATUS) c- O0 R6 S) G( `# x' S& {. r
- LDA #$3F) A! T9 ^: a+ L6 `/ M$ B+ h! @ P6 j
- STA PPU_ADDRESS
* n, I" r. W/ m# u' U7 G; ] - LDA #$000 J, F4 w/ q5 g( b8 G1 D3 I
- STA PPU_ADDRESS: n9 ]& g/ d5 y+ q
- LDX #$00
2 R$ [1 ^/ ~6 w0 U+ q6 ~ - Init_Palette_Write
' Q' p$ @8 n3 y* O1 e! W - LDA Palette_Data,X" i2 K; v" V/ H5 @
- STA PPU_DATA8 W# f; }. X( P2 q* C/ |/ M
- INX
/ O" Q) |0 G7 O0 a& ? - CPX #$20; b) G1 c- c4 R3 n5 v9 t
- BCC Init_Palette_Write6 U1 g: T& _7 Y+ u0 P
- RTS
0 N: M! M, s* ]& \, J( l, ? - ' e0 v. P1 U" s5 ?+ g9 s. A8 H
- ;==================================================
. n$ o; P6 K! J, F - ;设置命名表属性
, e$ T9 j# n- B. \% _. U - Init_NameTable_Attributes2 h7 p1 k+ K1 N7 K' l6 Q# f
- BIT PPU_STATUS4 u" R* R4 W9 K% v) }! |8 R% {& ^. a
- LDA #$23
. o3 @8 j1 j: h. e - STA PPU_ADDRESS- t+ n# o. |1 ~# m. q1 s
- LDA #$C0
+ S2 E" h2 C. Z) L; Z# ^& ]2 v; d - STA PPU_ADDRESS
- ~5 j/ f1 [2 }, d. T - LDX #$00/ k# b, ^$ R9 t* O9 a
- Init_NameTable_Attributes_Write
8 u5 o0 v Q9 x0 x4 O - LDA Attributes_Data,X
7 o6 r% T" c7 w* _( N" m; t; q - STA PPU_DATA- H# T+ c0 H3 x8 W+ ?
- INX2 `) d5 x p3 w% x* E( J! z
- CPX #$408 g) ^+ ]' J! X |3 @' H, l
- BCC Init_NameTable_Attributes_Write. ]2 @5 M7 h. k n
- RTS
. _3 E1 j# X2 K3 T
5 y. F3 |5 |! K: d$ Y- ;==================================================3 c+ s$ G- b o1 a( r* G
- ;初始化命名表文本' D, m0 X, l/ X/ b: ]( |' N( G0 V
- Init_Name_Table_Text5 i4 B6 a2 j: y; ?9 ]& z
- BIT PPU_STATUS0 J+ E1 f# b/ _, j) s
- LDA #$20- [/ g0 t. v" q" v# ?8 X. E4 M
- STA PPU_ADDRESS
" l( a2 U2 a2 Q5 x - LDA #$009 C/ P- ^3 ]7 u# O- G. t: M
- STA PPU_ADDRESS3 M! R# H" V! @$ V' L/ U# S$ m
- LDA #$00
" d( Y8 @) d% u0 X - STA FC_Data_Buf- @( E; ^ b: q0 u) {2 q: w* V
- LDY #30
& k7 |# S+ I6 c7 W - Init_Name_Table_Text_Write. w1 ~" P w; X$ o. _0 A: F! Y
- LDX #32
( d: R5 B5 i+ l( v F - Init_Name_Table_Text_Write_Char3 ?0 R5 g3 @7 O8 ~ D* r
- LDA #'0' U7 t4 n+ t! t: K" l& u
- CLC
; E0 Z5 M& S( k3 ]* g - ADC FC_Data_Buf2 D4 s$ j! j; B2 ]0 N5 q0 {8 c1 N
- STA PPU_DATA2 o+ z& I3 w3 M' W9 R% L
- DEX& r" @5 D* ~' k( k. P( Y Z
- LDA #$14
( a) g# A' h( ^ - STA PPU_DATA
# x; L& ?' J7 l - DEX- {5 d' H' O! J5 i" X' G2 A' L
- BNE Init_Name_Table_Text_Write_Char
% r) I* P [0 w. e K9 v1 J, h - INC FC_Data_Buf
. H% J7 y6 _6 `* Y1 k$ Z! M - DEY
9 X* l& G+ V c& ^ - BNE Init_Name_Table_Text_Write
/ ^5 ^# b6 I1 t& D - RTS0 K& ^7 i' i) i4 h* u! ~- u, H
- * r5 T @0 p3 ]& T) h/ b
- ;==============================. ]9 c. H# p. z7 Z
- Init_OAM_Ram;初始化精灵内存; K$ r4 l5 X% u+ s/ f. Y. N
- LDX #$00; ~5 y1 g; u% [5 U8 h( ~7 {) g& }
- LDA #$004 u; c7 d% ]% \7 n4 `$ H) u
- STA PPU_OAM_ADDR; |. N0 _4 `" C+ [; q7 @3 u3 A
- LDA #$F8) ` o. [& ?8 F! M$ {! w2 [" d
- Init_OAM_Ram_Write
5 V) w5 H6 Z* | - STA PPU_OAM_DATA" P6 {* D4 C) F8 e/ D
- INX
5 r$ V+ G( E- S- Z( f$ { - BNE Init_OAM_Ram_Write) O5 l$ A i% y5 l
- RTS
8 q% O' e. ^' D# b* U6 D - " s7 F" t, g" Z2 w9 H- j
- GamepadProcess;手柄处理$ s" g: D$ z7 S @: t) o
- JSR GamepadDatacan
: Z& K7 A8 E1 i! p - LDA <Gamepad_0_Value
% ^1 T4 `/ g# H7 o - STA <Gamepad_0_State
( o" ^$ L6 E! P - LDA <Gamepad_1_Value! l2 m; A i! ~0 Q, ?! c! }
- STA <Gamepad_1_State. N! i o/ T* L7 T( V
- JSR GamepadDatacan! ]) S- v" M/ e& {, ?/ e9 y& V0 x) |
- LDX #$01
7 \* q" C! s( t$ t - GamepadMergeCheck;合并手柄输入检查
: _! L1 C5 T+ [; R- K* j0 C' C& I - LDA <Gamepad_0_Value,X. R4 z2 O' U& J1 {
- CMP <Gamepad_0_State,X/ Z! A2 n j# H: t
- BEQ GamepadMergeInput
' q. y3 a* x. C1 k, @2 w - LDA <Gamepad_Temp,X
* s- z: |6 l; U5 V- C2 n/ ^) } - STA <Gamepad_0_Value,X* G6 ^3 t2 W! n+ b" F. G/ s
- GamepadMergeInput;合并手柄输入
6 v2 t2 X% e1 r- e+ w+ J- z) ]: q* r0 } - DEX7 Q, @. {8 \7 {% ~: m& J
- BPL GamepadMergeCheck/ n" F7 j, \& n6 [ K
- LDA <Gamepad_Merge3 S/ |' e3 g7 v5 C* t' f% C
- AND #GAMEPAD_MERGE_FLAG* [1 v& K1 P; G, B
- BNE GamepadStateProcess" {& {" k- {4 j) e' A
- LDA <Gamepad_0_Value5 {0 ^# O- q2 G5 Z1 D! B9 }
- ORA <Gamepad_1_Value2 | i% |0 t H. Z
- STA <Gamepad_0_Value
8 x4 I+ D& N0 I: Y5 s$ N5 ^5 Z - GamepadStateProcess;手柄状态处理
' ? j& y; Q; _( ~ - LDX #$01 L m2 ~( `0 |
- GamepadStateSave;手柄状态保存
* K6 [2 y" J0 B; i0 R - LDA <Gamepad_0_Value,X- J* ?: N0 ^8 z, H9 h
- TAY
: d1 J# d. p4 R - EOR <Gamepad_Temp,X
5 Q! h6 V w* [ - AND <Gamepad_0_Value,X& S4 }. C& ^3 A1 I; ^
- STA <Gamepad_Once,X9 E+ w& H7 Y4 l8 W" D, v
- STY <Gamepad_Keep,X
]0 F5 P0 k4 K - STY <Gamepad_Temp,X
' n3 q% h v% G2 ]9 O - DEX9 V! {/ o% c9 v8 o C
- BPL GamepadStateSave
) o1 T/ V8 k- Q - RTS V# f; S/ f* o1 H* I5 c# D. R
- " a U8 y+ p- Y6 m* Q+ t& n2 F
- GamepadDatacan;手柄数据扫描4 e; J( a9 Y8 L7 v2 W# J
- LDX #$01* ?; v/ n7 G. z$ }
- STX $4016
; @3 x) u) B [ - DEX+ Y+ H: |3 \( `
- STX $4016- E& u \6 C+ q
- LDY #$084 G0 b* d% g6 e5 E1 O5 i) {
- GamepadPortScan;手柄端口扫描. S; Z2 _5 w0 g' f, V
- LDA $4016
: @3 L! |% _0 D( S2 S6 x2 ^ - STA <Gamepad_Port_Value" o" b# c( W) ?0 v; w
- LSR A& N" M2 w L, I* k" o
- ORA <Gamepad_Port_Value
. K2 ]/ H9 B0 e& Q - LSR A! j8 i+ j* b1 E8 x# y* @, T0 F
- ROL <Gamepad_0_Value
% l. x+ z" ^* Y5 }# D' g - LDA $4017$ v4 l! K- Z6 s& | ]
- STA <Gamepad_Port_Value
5 L- J1 w; H& c - LSR A- i2 \3 Z4 R; X+ }4 ?$ H
- ORA <Gamepad_Port_Value: }3 A1 U9 e- {
- LSR A
, ^5 Q+ a( Y2 m$ Y - ROL <Gamepad_1_Value
7 F6 x/ @0 n+ Y' H8 A; O) Y% } - DEY9 X' V7 K0 s0 R' {+ R) b1 N
- BNE GamepadPortScan
5 b4 H3 X9 A4 K. z2 G - RTS
2 H% S8 {. V) X8 O) |$ J/ P -
3 G8 R0 f& h; \: i/ Z! N' T- ? - ;==================================================
' O8 ~9 D) m, U - ;PPU处理
- i3 \4 G0 z1 F/ F7 }% \ - PPU_Process0 B( ?) P0 m7 h7 F
- LDA #$00; m2 j3 ~" Y3 E5 H' W k
- STA PPU_MASK
8 I. y; C% l! w7 d& U. ?5 a2 L, w. c -
8 _& u. @: ]% X+ _4 m1 [* v4 ~ - BIT PPU_STATUS
) w! R: }+ q2 j- |0 P - LDA #$20- J; j* \( W; b) {
- STA PPU_ADDRESS
5 \9 C' a* j) L, L' t - LDA #$002 T' {1 v, B) W6 J
- STA PPU_ADDRESS
9 Y0 l7 G3 H5 D8 u, h$ r& c - + a9 n7 x- V! y7 F3 G
- STA PPU_SCROLL7 R/ u( V1 n0 A
- STA PPU_SCROLL" ~$ y1 j# j, w5 J; G# O0 n
-
- Y' L# c# f/ ` - LDA PPU_Msak_Buf5 R- r& ]+ C/ `# Y9 F$ P
- STA PPU_MASK
0 m9 p- G% l$ d7 a# V
2 _: j' N _4 L7 m/ |0 f- RTS* s# [' D4 a6 R# n$ G b3 s9 C
- 3 Z; S- m3 H; r9 w" J# [$ n& y6 d
- ;==============================
" F. u7 L" R# V! R6 e( C0 P - Time_For_Vblank;延时等待
# k0 X4 Z1 b/ m2 J1 y0 _; N - LDA PPU_STATUS
% G2 l# ?( H+ E5 J! G - BPL Time_For_Vblank
4 E& q% m& A2 `0 I' d8 }8 I - RTS) g2 ]* ?0 U) Q; S: `* O. a
-
* I" i8 A* ^4 @ - ;==================================================$ p8 n8 z/ }0 }# D4 D+ y
- ;初始化MMC5
# [0 L5 h& E) H1 Z" G5 W0 @; b' G - Init_MMC5
* \+ A3 x d0 C- i0 k& s - " F7 ?; T; j' @9 p% y
- ;设置一下6000-7FFF的RAM* I$ P1 M# g3 k7 N; M: Y
- LDA #$002 w( `* {; E( }9 w2 }
- STA MMC5_PRG_BANK_6000
$ g5 G5 x; A8 B* @2 x5 f& n -
8 Y0 n& }( e4 t - ;开启 PRG RAM 写入
/ ?( h5 ~% Q. b( f3 N' u/ b - LDA #$02& t: B& ~! a. \# Z
- STA MMC5_PRG_RAM_PROTECT_1( b8 F" p3 Y$ [" { p. d8 i. w
- LDA #$01
" @2 [: F' J9 Y2 p. K( B - STA MMC5_PRG_RAM_PROTECT_24 ^: z7 V4 i; U p0 ~
-
3 ?! i! j% F5 H" [9 ^+ p/ p1 o - ;启用 1KB 扩展RAM ($5C00-$5FFF)% a* { |, j5 a) O. y
- LDA #$02
* j0 ~5 I; v3 D) ]& Y% Y - STA MMC5_EX_RAM_MODE# J, k* u* m& U v6 {1 t
- 5 @, P5 Y* d7 }
- ;设置 CHR! `3 o8 J: f1 \: |4 ]& ^" U) E
- LDA #$00
8 B, t0 |2 G- k& v; s8 ~$ @/ g - STA MMC5_CHR_BANK_0000
3 Z a& D D8 }9 x' ?/ N; o - LDA #$01 |- v1 @% i6 t+ h) b7 X4 U
- STA MMC5_CHR_BANK_0400& `/ \* } [( Y4 f
- LDA #$02
! k$ t3 S7 ]$ l0 ] - STA MMC5_CHR_BANK_08003 s9 r0 v' @* s2 F8 U
- LDA #$03* k; n6 Q. \6 f/ g3 l) d
- STA MMC5_CHR_BANK_0C00
3 {* \ K( J7 J4 V% {7 ?1 h* a - LDA #$04
5 ?' f0 e/ @7 t$ J, R6 J* L - STA MMC5_CHR_BANK_1000
J5 y M, [4 f% k - LDA #$05, m5 D% Q1 }- |; Q$ N/ d
- STA MMC5_CHR_BANK_1400
, S1 g* M. [8 t9 W/ O6 K - LDA #$06% @: n2 O% x3 c- v
- STA MMC5_CHR_BANK_1800+ n! @* R" x( i7 c. t/ p
- LDA #$078 C- d5 O1 F8 t/ |$ Z* O
- STA MMC5_CHR_BANK_1C00: `% D/ M/ T4 \# c( A' C2 v
- 8 J X4 H: d+ R6 t1 v6 D
- ;设置屏幕镜像
0 `/ [; R2 x2 w- q - LDA #$50/ m. P0 `0 G' x Q0 S
- STA MMC5_NT_MAPPING
, L, z% m0 g% s& \( C -
' V3 Z$ L5 x- d. l7 |( K- U/ c - ;禁用IRQ2 k: J7 [6 U' Y U; s; A
- LDA #$00, S$ }+ }" ?9 F$ ]+ X
- STA MMC5_IRQ_SCAN_CMP
; R0 L$ C4 m7 p4 ]8 V* n - STA MMC5_IRQ_STATUS
# {4 Z* |& Q* u, R - : c/ f2 v7 j: a. ?4 ^ C8 c
- RTS
1 w3 M; g& O4 T* M -
$ z+ j( X+ C2 q( E+ l6 q! y - ;==================================================# p# s$ i' c$ C
- ;重置中断处理) @6 n/ a; {& m' W" O
- ResetProgram; s8 b/ X+ e ~ v. h
- SEI
1 |* y# t; C+ n4 ?1 L5 R - CLD; M: x7 m }& A
- LDA #$00
3 a9 d0 f7 E. }4 Q - STA PPU_CTRL' e Y0 m6 J+ n/ ~# r" W
- STA PPU_MASK7 u7 P8 x3 j7 T Q
- STA PPU_STATUS( D% k6 O I# R: e5 k6 b. @
- STA JOY2_FRAME6 m$ f0 j8 @1 d$ E6 m2 M
- STA APU_STATUS
; V$ l( B; P Q; X6 N+ _0 f - ' P* R6 _. ?* ]% L5 ?0 d7 j) r
- LDA #$C0
, _/ s6 W0 Y. G) T - STA JOY2_FRAME; P- N$ G# J: q! U. R1 N' W% l
- $ b- N" O0 M+ b' u
- ;等待vblank. l3 G: J, E6 r! x3 y" D
- LDX #$02
' u$ {4 [3 j4 ~# z3 T& E" G - Vblank_Wait_1( Q' E# W* K, c& P8 C. f( c. ^( a
- BIT PPU_STATUS
# J9 o; Z; G p - BPL Vblank_Wait_1
( N/ v7 Q9 T; q* @& C' B+ a- D - Vblank_Wait_2& B* L, e6 R1 a6 C! ~
- BIT PPU_STATUS) g3 X' ]) R: {2 P6 W
- BMI Vblank_Wait_2
( b3 l* M0 Q* z& J - DEX2 Q8 p! M C# O0 y) @
- BNE Vblank_Wait_1- a0 i4 Z3 P; `
-
7 O3 y7 y& e* j. O, ~6 x; K- J - LDX #$FF, z8 H) b5 h+ Q- J6 L3 D" R2 B
- TXS- x. m( i2 I' J
- / o0 d# P7 u$ f
- ;初始化MMC5
3 u' a) o5 u5 F' {4 a0 w0 Q& K - JSR Init_MMC5
$ }- `: [ e9 u/ ^ - ! `: \% q( P f3 V" Y
- ;==============================6 R M* e7 C" `" n j: F
- ;RAM初始化
9 j0 z5 L& M- i - Nes_Ram_Init
4 j# u7 J5 ~& }, u" O - LDY #$00
& d+ v% i7 ?! g, ] - LDX #$08
: ^5 N4 n _$ k. R; L! g - LDA #$00
. e' B; Z$ s; a" V& p - STA <$00* f% ?" l3 Y0 j7 v8 r; r
- STA <$01
. S p! t/ e5 e0 c - Nes_Ram_Init_Write
' y V5 R% n4 u: k; e* g - STA [$00],Y! s" L! G9 B- c
- INY* H: n& V5 V- M, N
- BNE Nes_Ram_Init_Write' T- l2 E' M' A1 E
- INC <$01/ r" J1 H7 f1 Y. A4 ?) p! c8 ]
- DEX
$ i6 J; s. O; q$ _+ e* C/ I+ w - BNE Nes_Ram_Init_Write
( I. a. n$ z' G" |+ M - # U8 a5 F$ z( l
- ;初始化命名表
+ E J* Q( o" F- a& P$ M - JSR Init_Name_Table
3 O- ~2 r4 Z% ^ -
: \" z7 Z1 T: q& R! j5 S2 h - ;初始化调色板
. k+ [1 V5 [% Z - JSR Init_Palette* {8 u# l) D. @8 k6 n' s
-
, G% g* K2 c0 | - ;初始化命名表属性
4 v; X" ]2 O1 s! p$ I - JSR Init_NameTable_Attributes
/ J1 Z2 Z# n8 { -
$ s% L* O3 w+ }, A - ;初始化精灵内存8 M, g' n f6 ~ H2 k% L
- JSR Init_OAM_Ram2 s' y1 A% b! e0 K& R2 V- o
- , H( v# }0 A7 I6 K) i' ~; [
- ;在屏幕上写点东西
" M% x4 X* K+ _' k1 g0 G) K - JSR Init_Name_Table_Text! z8 |' c3 a) U+ b( `
-
9 u; l% c9 Q5 X$ [# S - JSR Time_For_Vblank9 ?; [% q, {3 }6 v
- ;开启PPU控制: V8 ~5 ]3 J9 h# b: `
- LDA #$88
. n6 Y3 _. b, Z' V% L - STA PPU_Ctrl_Buf
2 T; P$ z- c) r2 A% r" s) m - STA PPU_CTRL1 c; u# k4 D% c- E( u
-
+ u T3 T9 _; \' Y - ;开启PPU显示
* E8 D3 O! `' Q2 c. [/ B4 m) F - LDA #$1E: s& Y6 i; ~- D+ d5 |/ ?2 [1 v
- STA PPU_Msak_Buf7 E+ [' j9 o+ \; H
- $ n/ Z" H# h) T* K+ D' K
- CLI; K% z% e" L4 m4 ?8 ` O' c
- JMP Loop- \+ V7 M1 ]9 n4 Q2 m2 R
-
% a' F. U3 ~9 \% i# t# f) R# X - ;==============================
' {- T+ c0 [' U! N1 \. c - ;死循环, 等待NMI中断" M: E- |6 s1 P/ h" J& K/ ^
- Loop! g# }$ @3 Z& C. G7 l; n; @
- JMP Loop
4 i7 A8 j5 L. M2 d! b* F - * f( n0 C1 h- K3 H, M# I) C* @
- ;==================================================
( Q7 n* i; G( j4 X: U( ]( f1 ? - ;NMI中断处理
8 R5 K: W! F. Y2 U& y/ g5 T- P - NmiProgram
r' s: ]4 A. o* D - PHA
4 V2 u! G2 c# ~& h) u: P6 f - TXA
8 T, k6 K% } l& @ - PHA
& T( d/ U0 X+ n1 O+ @ - TYA
* X- L6 K) N. R6 l - PHA0 O) f: P7 M/ R
- {& b5 b+ H+ d3 C8 e% U- n/ z T
- BIT PPU_STATUS
3 V8 \$ `& I/ |1 N7 @9 s3 F5 ^ -
& F! j4 t; H! t [ - ;启动IRQ中断, 第16条扫描线触发
8 G. f+ I$ s3 b' ` t7 [ - LDA #16" g; @* y# v+ w% l" G" G
- STA MMC5_IRQ_SCAN_CMP
' u9 r: P6 f0 W. C$ M) O8 ~* M' E - LDA #$80: s+ \0 U; K W: q
- STA MMC5_IRQ_STATUS/ }9 }% l7 B: R
- CLI% l2 C( w! Z. q
- 8 V0 v$ Y. x. `6 T s
- ;关闭PPU控制6 b( z0 l/ z, @7 v: \
- LDA #$00
. U7 }: X8 `% F1 g - STA PPU_CTRL
8 j) D2 K8 i5 G: D, S+ B; p - : ~. y `1 t2 C- o Z# _6 H- |& A% _
- ;处理PPU
4 k! c4 s3 q2 q' l" v2 ^* g0 _ - JSR PPU_Process
* P- v4 p& i& T! O - / k6 d" x2 a; l7 Q
- ;开启PPU控制
; W- C: { Y- J, r! o - LDA PPU_Ctrl_Buf( e$ ?# I Q! `. ?( n# X( d7 R
- STA PPU_CTRL
/ ]4 [+ A! D! H- Y* h9 R2 Y - # p1 J* C2 o4 ]6 m+ O8 Q2 Z1 C
- ;手柄处理5 G( G. E/ z% }8 i# ?! ]* A6 ]- T. |
- JSR GamepadProcess) t1 `1 N/ n" _) a. a0 b, m
-
7 n9 k. n+ @" K$ h6 E - LDA #$00
J% [0 @! m3 q& N - STA IRQ_Index
# {/ l- f0 x |* m7 X* f$ z -
5 k: q' o9 M+ N% K" u. _- I - PLA
: ]% U1 F/ w# Q) B: ?3 k - TAY
" P2 |6 Q q( x# ^, W# r1 ~ - PLA
7 D3 \+ y2 V: y! d6 R; b - TAX3 A1 o9 x5 k: ?
- PLA
# [) g, d6 e1 k7 N$ M) q - RTI
1 ~# q0 d5 U' u0 a/ {5 {( q
( i$ ]9 Q; G" Q9 q) `- ;==================================================
7 V& \8 G- S/ P! C3 D" ] o6 M* M - ;IRQ中断处理
2 @7 y+ i2 Q R" Z. H! n8 T - IrqProgram
# P& Z8 }: s6 H5 { } - PHA# _. B4 n% h( Z$ f
- TXA
1 i: L N+ \! X( L - PHA# Z- n. B5 {4 M5 a
- TYA$ J9 ?2 C7 s; n+ h3 l& ]
- PHA
( u a5 M& i2 I -
( G9 h2 S2 d% B! e. ` - ;确认IRQ
6 D4 z& W$ e: i! g; h - LDA MMC5_IRQ_STATUS
* k7 }( `1 @6 I7 V9 z* b0 Y - 8 q" ]# N, K* M7 ~; X1 f8 }9 t$ z
- ;允许下个IRQ触发
4 i3 Q8 @- f ]1 Q# j0 k - LDA #$80
/ I2 C5 b, @" T( W - STA MMC5_IRQ_STATUS
3 E) B2 e( z, [; g4 J -
: |; m% c- l& I( Z3 O( i5 W) O - ;IRQ处理, 每隔16条扫描线触发
( ^2 R, r' S; T7 u8 N9 F$ \* v - LDA <IRQ_Index2 ?$ x4 c* b# M/ }
- CLC
, J/ ? }( O0 ^% P+ v9 k - ADC #$02$ j& |) I1 R5 W; k' v9 x
- ASL A1 x* ?3 V( B% B4 `1 `, ]! h
- ASL A
( J- `3 @* b1 c( l" \ - ASL A
, l1 P$ d; Z% E9 v2 m' t- q2 J9 q, ` - ASL A
K1 h1 E: R8 x2 x! i - STA MMC5_IRQ_SCAN_CMP( _- W, P/ A' Z1 e6 V9 H: ] s
-
4 a( I* T& g) b7 Z" \ - LDA <IRQ_Index8 [# N# v% d6 B: L
- BNE * + 4
+ {+ E! Q- G# t. O3 C" P0 W+ x) U - INC <PPU_Scroll_H1 C4 p7 {( l! t- Y& t
- ; d4 o7 W7 T; {: J y1 b5 u- b
- ;设置屏幕滚动- Q% _4 G0 c- b( e/ T5 h' G
- LDA <IRQ_Index3 _3 T; ^7 [. n3 o3 t
- AND #$01, g4 G5 B: Z. q
- BEQ Irq_Scroll_Right, g5 a6 T9 K4 Y" D' X+ E
$ G) e7 t0 o* b6 O- H* W- Irq_Scroll_Left
[- \# t7 }: u% t$ f K - BIT PPU_STATUS
% f$ @. Y5 }2 [$ E - LDA <PPU_Scroll_H
. V9 w1 w5 o& y2 Z - STA PPU_SCROLL6 K; N/ n' q; q
- STA PPU_SCROLL
* {! f- m: {3 l z4 _( n - JMP Irq_Scroll_Over6 b" e4 s8 P' H8 e" z v h
- ' z; J6 J1 S, R2 L2 W% H9 ^6 X
- Irq_Scroll_Right" m0 y) l: ?* W$ ? Y* y8 t, E5 |+ V
- SEC
- r( w1 D! s8 Y# K3 J! e - SBC <PPU_Scroll_H: h, C# f# A6 w5 I
- STA PPU_SCROLL& e( u7 N4 S8 b# E4 @; x
- STA PPU_SCROLL. N* P& N# Q) A- D: m0 Z" R
- Irq_Scroll_Over
; D5 [) x* I2 n b" C# G( q - $ ]# E1 b! H- c* |; x
- INC <IRQ_Index1 H( q z x$ Q& Q8 ^) V8 r
- + t r9 S% I$ z1 K+ K5 k
- LDA <IRQ_Index
& @4 s% I9 } Z j' h - CMP #14& u" w! }0 d$ t+ m8 p& n
- BCC * + 5
h4 `/ i' d9 Z' K$ S, s% K7 m - ;关闭IRQ
. [. J2 `( ]/ ]; B J: f - LDA #$00
# l& W, D4 ]2 o2 ^. o - STA MMC5_IRQ_STATUS
% Q! x, `; c" s0 H - ?) D3 R$ f6 p5 B: D
- IrqProgramEnd
6 {& I' l, y9 } - PLA
. Y$ Z8 X' R! [, u9 p& m2 e4 ^* v - TAY
4 D" c7 _6 m( Q( ~' y4 c - PLA' S9 n$ k& e# Q. U
- TAX
* y8 _' s% l5 N7 L$ T: M- M2 @/ p - PLA
. h. b) F, p1 }; Y+ B* M* ]; g - RTI! S$ `* o, D" x6 O
-
- l9 A [3 D# j2 e - ;==================================================
+ C; Z; r" ^, o5 _ - ;中断表
3 ~2 Q9 G7 J/ V' [! s5 e9 ~ - .ORG $FFFA2 p* ?& i( ]/ L* q
- .WORD NmiProgram
8 h j+ p( ]; Z - .WORD ResetProgram3 P# Y+ [ b2 a. e2 w- W; I
- .WORD IrqProgram
复制代码 7 S* D# d- ?% E q% s4 g
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|