发新话题
打印

求FC教程

是的。
性格决定命运,存在就是合理

TOP

引用:
原帖由 曹老师 于 2008-4-30 12:56 发表 ) s% ^3 s: M) b" C* n3 X0 X  `
就是让我写,也只不过是这些内容,还不如网上的信息好。不过跟网上不同的是,我们可以根据不同问题来讨论和分析。但是如果说,我没有基础,什么都不懂,那就无从讨论了。
' f! e) n( w5 ]6 g: E- e0 _
虽然这么说,当时我都找不到啊,还是曹老师写写吧,我想知道扩容后,自己导入的字怎么在游戏中显示出来。

TOP

我前面讲的内容你看的懂吗?是否说明清楚了?
性格决定命运,存在就是合理

TOP

好资料,谢谢曹老师 ) d( m8 u1 o9 h1 G2 K; i, b
ok

TOP

LF卡后,人们更不满足了,任天堂又发明了MMC3。它的功能是:
1 r$ d9 w" P: ^* @7 i# a1.程序:8000:6,8001:0-$FF               映射        CPU的  $8000-$9FFF' c; Q) |/ W* h/ x5 J9 k- k
               8000:7,8001:0-$FF                                                        $A000-$BFFF3 Y$ ^' P7 x' I
2.图象:8000:0,8001:0-$FF                                                        $000-$7FF                      背景
. J3 d( @2 X" x+ w& b) a" b5 G; h               8000:1,8001:0-$FF                                                        $800-$FFF7 P% p8 v! n% _- H* Z
               8000:2,8001:0-$FF                                                        $1000-$13FF                  动画
% J% U% W1 ~/ E+ l6 W9 ?; p+ w               8000:3,8001:0-$FF                                                        $1400-$17FF
/ c$ k/ s* f3 B1 x6 U               8000:4,8001:0-$FF                                                        $1800-$1BFF
. E4 n3 U3 u8 k) }; e3 `+ n+ h) }               8000:5,8001:0-$FF                                                        $1C00-$1FFF) K, l  z. i( i2 }1 B
- V  D9 G9 h. h$ G+ v
最重要的是C3引入了一可屏蔽中断(IRQ)。当我们执行中断程序的时候,在中断程序中写E001,和CLI,立即打开IRQ。IRQ的向量在FFFE和FFFF。这时程序执行可屏蔽中断的内容。在C3中还加入一个自动定时器。C000,C001是写定时器的时间。我们在电视上看到一幅图画,实际上电视上的图画是每秒钟24幅不断在扫描。因为眼睛的误差,看不出来。因此,我们在眼睛还没有看出来的时候,“偷偷”切换图象快(点阵)。用定时器决定在屏幕上的什么位置开始换图象。这样,我们的眼睛被骗了,屏幕的上半幅图用的是一个点阵,下半幅图用的是另一个点阵。这样当点阵不够用的时候,就可以用2个点阵来画一幅图画。我们的术语叫"开扫描线",我们最多的时候可以开5个扫描线,这样5个点阵画一幅图,这幅图可以是很漂亮的。
# {8 K. i, I( G6 q& \这就是MMC3,mapper  $41($40).我上面就是用这个技术画出来的。& t3 t3 P  T8 ~" n

( |6 \, k/ s; ~* l0 m! k[ 本帖最后由 曹老师 于 2008-8-19 13:58 编辑 ]
性格决定命运,存在就是合理

TOP

真是好东东啊........  k+ B* e5 f% X! K
研究一下!!

TOP

希望对你有帮助。不明白可以具体讨论。
性格决定命运,存在就是合理

TOP

C老师,你好,好久都没有来这里了,看到你写了这么多的好东西,真是太精彩了!基本的原理算是懂了,但是就是关于$4000~$4013 和APU通信的端口原理还不是很懂,虽说知道它有三个声部,一个噪声声部,一个三角波声道,也知道软开关$4015,但是还是不知道如何写声音的代码,上面的那些DEMO看过,不知道原理,能否说一下?

TOP

还有关于DMA传送动画的原理,也就是精灵这一部分的内容,它是用JOYPAD来控制的,256个精灵虽说用DMA方式一次可以定进动画RAM,但是怎么和JOYPAD联系起来的呢,, T0 W2 o: h. O0 a, R) B- G
在用下面的程序对JOYPAD    RESET后) w3 d  {  T/ G0 B% h
LDX #$01
6 u$ {, g1 K, v* SSTX $40166 z! z1 d3 p6 o; m& ?. }
DEX4 {4 G# s* D: H6 x
STX $4016
0 e; t/ z" F! z& X,又是如何获得A,B,SELECT,START,UP,DOWNN,LEFT,RIGHT按键值的?& Z+ |; k9 U6 F, M
我看到过一个读取任意键的程序是这样的:/ ^, ~) |/ i( I, |0 c' s4 {( h
BEEP  LDX #$01
& s+ U/ j/ p  k2 f. B) P) l      STX $4016
& w, Z: f0 m- L( j  E( d      DEX
% l6 c/ M3 U' w- O0 D! B; B      STX $4016& |( ^  p! L9 I4 I* V
      LDY #$08
$ j; K$ q, O& M4 A* i0 a" ALOOP  LDA $4016
& j3 G7 V9 Z# Y" \      AND #$01! E& R$ p1 p5 r7 u
      BNE ROUTLINE(程序开始地方)* d% M# g" K9 s% m' I2 Z
      DEY * i" N# n4 l7 T( j8 o- w; ]1 p7 C
      BNE LOOP" e7 @" V  e1 I3 m  u
      JMP BEEP7 m% S& ^$ U# O5 F' _( i; A

# F8 t/ G2 J% G2 z  n- I4 b' {& g就是不知道如何读取需要的键3 l8 r. W( Q/ {$ @8 H

6 Z) |& j8 ^$ ]精灵我也看了,也了解一些,256字节分给64个精灵,每条SCAN LINE最多允许出现8个,每4 BYTES定义一个精灵4 P7 H4 a9 C" R5 o6 z
YY  TILE NUMBER PALETTE XX
# `/ V9 a: D3 I: h8 P8 f; vYY 取值0-239( Z2 ~- A  b' o) G5 k5 c, e
TILE NUMBER 取值$0-$FF(动画图表,也就是上面说的1000-1FFF)4 J# K' T$ t8 h
...
4 o1 H/ `' a$ }. C" h& [5 t6 F' r" S7 a) CXX 取值0-255
" N- l9 \* H8 H6 a就是不知道如何把按键和精灵的动作联系起来4 d1 W9 C% \$ g% \  A
我曾看到过一个DEMO,它是在每个键读取之后用下面一段了程序:7 d7 P5 @& H6 B/ g- x
LDA #$XX$ P% Q7 V0 A7 z1 s: J8 s
STA $400X
* ?  d9 S" c$ w3 SLDA #$XX) i9 c  c+ S, R0 q6 t1 l: C% m- Q4 S
STA $400X
7 w- e4 y5 b( W! U9 N, L0 URTS& O$ F  p9 ], W; [( P! p
让精灵每次移动一次产生一个声音
" `  a0 a  `: s5 _: f7 F原理不知道如何做到的

TOP

我发现这里http://www.castledragmire.com/hynes/downloads/utils/index.html有超多好东西,大家可以去看看,CAO老师也可以下载一些回来研究一下哦,呵呵!

TOP

好,先讲讲读按键的问题。FC的按键是扫描键,就是一次只能读1bit。用4016扫描,循环8次,然后记录下每一次读到的数(0或1),这样就得到一个8位数。& _6 O; Y: G) k. ^$ K
定义:01     左键(或者相反)          0 0 0 0 0 0 0 1, [7 I& u; ^: w0 M( L  H, G3 j
      02    右键(或者相反)    0 0 0 0 0 0 1 0- Y) \: @* h7 l2 T% d, U) w
      04   向下                 0 0 0 0 0 1 0 0
" M( {7 W/ Y/ m% p  x      08  向上                 0 0 0 0 1 0 0 0& Q" {8 q6 q% p1 c* Q4 }8 w) \
      10  start                                  0 0 0 1 0 0 0 0
. a& h3 R5 p( O- z7 q: M* Y( e            20  select                               0 0 1 0 0 0 0 0
) d# H" Z: i+ A            40  B键                  0 1 0 0 0 0 0 06 K% V6 y: m) W, k& r
      80  A键                  1 0 0 0 0 0 0 0- E6 I7 C8 |) X) i0 ?% D
扫描好了,确定CPU读到的是那个按键,然后在程序里处理按键。如读到80(A键)的时候,动画的X值增加一格。这样动画就在画面上随着按A键,动一格。
性格决定命运,存在就是合理

TOP

回复 85# 的帖子

全是E文啊~~~$ T' i1 ^$ U7 K7 e
看不懂啊~~~

TOP

84楼的读键盘程序你能看的懂吗?如果这个程序看不懂,那我的解释当然看不懂。
性格决定命运,存在就是合理

TOP

不知道下面的程序我解释的对不对?0 S. B4 d4 j9 W1 i. i- F& b
BEEP  LDX #$01          ;先写01到$4016( g+ I& u; n; h* P5 f5 X
      STX $4016. G. ~4 g8 G5 E/ w
      DEX                    ;再写00到$4016$ [# N& `7 y2 |
      STX $4016        ;使内部电路RESET,为Read Bit做好准备
3 G( x' R3 D- ?4 M+ j      LDY #$08          ;执行8次,对所有的BIT进行扫描
( E. ?6 i( f: h5 ]LOOP  LDA $4016        ;如果有按键按下,则为1,否则为0- B/ q+ `$ w4 N) s7 V. b* g
      AND #$01          ;把读取的值与#$01相"与"
1 P- k" e' A' c4 I      BNE ROUTLINE  ;如果有按键按下,则执行下面的ROTLINE7 w9 d4 K. a) [; R7 b
                                      ;没有继续循环
  D' r$ M5 B5 V; u+ T* v: c      DEY                   ;Y--
$ f7 H' ~  Q4 V: Q- g/ r& j      BNE LOOP          ;执行8次循环4 i# P3 c* @* p" s: h
      JMP BEEP          ;回到BEEP复位后,继续下一轮的读键

TOP

我曾经看到过一个程序
' X! x; T5 {8 U; y  ]) \处理按键是这样的:
# K1 T0 z* ]1 T- T. w检查A:
6 x) g3 l: K* L- W! g      lda #$012 ?0 g5 C% H9 ]$ |; S
            sta $4016
7 B5 e4 H" ^' N; H6 t' Y  |, U            lda #$00$ M6 i. W; u9 E* n
            sta $40169 [. N  `9 N' M5 g
            lda $40160 {3 M$ J0 ~9 v! S, Y( ^7 z
            and #$01- t( M6 c4 I; r6 }
            bne aa(对A键的处理)' D5 H% D1 H/ O# I; N# {  u
      
" G$ t" s+ S8 N' S# l检查B:' d8 m1 S! B+ _' B
      lda #$01
1 o+ M, `. l" ~9 m            sta $4016) o! Y+ `/ J1 ?4 ]# Z
            lda #$00
/ w) t2 K, \* @( M% V* D            sta $4016
' J6 Z, q7 N/ S" R' t8 Q            lda $4016
+ |9 g7 a+ Q7 p) g6 W( m1 }; |            lda $40166 u# _, r, {6 D; I3 ?% e% g
            and #$01$ a/ R' z" Q% M4 ]7 M( Q
            bne bb(对B键的处理)/ G, R0 y  s' h( V( A

; P% S. X. Y* H$ V检查SELECT:, G3 N' U" G3 P8 Z/ {+ b
      lda #$01
* L* D$ y4 D. C7 F/ w2 x$ A2 w            sta $4016
: P0 |% Y5 y; }: p5 Q& p            lda #$00# S6 @  q" k7 z" r& g" E. A
            sta $4016
3 e3 m: d# d' \* {! d+ C9 m; }3 {            lda $4016
( l! J5 m( o7 A1 c; L4 s- V/ @            lda $4016
2 F6 x) k. I3 p            lda $4016) H6 w* c8 z3 G5 m( {# q. V9 x
            and #$01- ~, q5 k! N/ k) j0 r# }
            bne select(对SELECT键的处理)
; _+ w0 K9 V# `5 U6 l. G................
6 g* y+ r5 ~1 D! G7 Q/ G0 o% J下面依次类推,不知道是否可行?

TOP

对的,完全正确。不过这个检查的程序写的不好,用循环来写,会看的更清楚。
性格决定命运,存在就是合理

TOP

曹老师,我写了一个小程序,只是练练手,基本知道如何在屏幕上显示图像了,配色问题还不是很清楚,每个TILE有16字节,但是它本来就有四种颜色,面23C0-23FF也有色,还有3F00-3F0F也有背景配色,我有点搞胡涂了。至于那个用循环来读按键能不能给出一个例程序,有注译更好!
附件: 您所在的用户组无法下载或查看附件

TOP

我想学FC汉化教程,可以吗?

TOP

叶枫:为你的精神所感动。先说说颜色
! P2 {/ q0 x' C2 j# G* V1 d+ ?' u1.$3F00表示颜色的代码,这个你一定知道了。/ c2 ^4 E0 \! e( o" u
2.$23C0表示图像选泽那个调色盘,共有4个。
. ^. X" v! m/ x3.PPU中,每一个cell都是8X8点阵组成,可是,我们用了8x16个点来表示,16个点前面的8个点和后面的8个点,组成这个点选取调色盘中的那个颜色,每个调色盘中有3个颜色,用红,绿,蓝代表色,来代表。00 为背景色,01为红色,10为绿色,11 为蓝色。
% l; O# V) O, L6 c+ q& ?: F, l3 s
$ ^+ l" J, W" q2 w  ?, U3 \你的程序我修改了一下:
2 F; {" w+ R8 W* }- e9 k9 {: y1.在显示图象之前,要清屏幕。我的C180子程序
2 p3 C6 l$ ~, _2 l2.我把图改了一下,做到这几个字用不同的代表色,其中曹老师是0号调色盘,好和!是1号调色盘。背景是蓝色的。这样你就看到每一个字不同的颜色。
1 u" l/ m* z$ Z: z) c3.在写屏幕代码时,我用一个完整的程序来写,这样很方便。C1D0子程序。
附件: 您所在的用户组无法下载或查看附件
性格决定命运,存在就是合理

TOP

                                m
Yesterday is history.
Tomorrow is a mystery.
But today is a gift.
That is why it’s called the present.

TOP

曹老师,你好,很高兴你能在百忙中抽点时间来解决我的问题.
9 g" m7 [# H" Q* p8 L1 O- C) V4 A是不是3F00——3F0F的16字节,每四个字节组成一个调色板,
$ P  q7 @/ C& o+ B  t: c& M* Z' T其中3F00,3F04,3F08,3F0C是用于背景?# R- k1 T$ ]0 T% }
精灵动画也是如此安排呢?
) _) N3 A- k4 n7 k; P7 U看到你的程序后,我把后面的DMA精灵传送的程序补了一点,把“叶枫”用作动画,) }! p3 D6 B# K2 n* [
共用了8个拼起来的,用的是相同的调色板数据。) {/ H1 R3 L* x0 S% s
下面是我写的原程序和游戏ROM,程序写的不是很好,还有一点疑问,就是$2005
/ O# f" O; }4 Z# k2 U- @端口,不是写第一次为屏幕的X坐标,第二次写为Y坐标吗,开始那几个字用的就是屏幕
* A9 n2 o! C1 m向上滚动,实现"曹老师好!"几个字向下的,但是在精灵通地DMA写后为什么屏幕就9 x1 h1 J% w" @
偏离屏幕的第一缓冲区了呢,不知道是哪里出错了,由于手柄按键问题还没有弄懂,所以0 Z0 z2 n# Z, [4 J9 N- p
没有用手柄来控制"叶枫",老师有时间帮我写个,顺便我可以学习一下用循环如何来读1 x0 k! o* I1 F6 l% p
取按键值的,并是如何和精灵联系起来的,谢谢了!
/ x3 l, c# i& M, B5 T        .ORG $C700( c) @+ \. K5 D: Z
        LDX #$00: P6 L. `) q7 S, q1 d
aa:  B! D* U2 t( h6 Z
        LDA Spr_Data,x* K+ P5 e. Q7 L; h( u( T, c' u
        STA $0200,x
( L) Y$ o- U- }1 N        INX
0 p( |7 P5 b' Q6 p0 H9 I6 y1 ~" z6 t/ I        CPX #$20
/ n6 S( V  {% N& ^% u9 s, }        BNE aa
( o* ?  ]0 G* d/ }2 d        JSR Vblank9 s" P% M" J) @7 Y# y5 t
        ) v9 k; E7 k' h  q: u
        LDA #$3F) m/ X. V# U- @/ ]3 [2 h
        STA $2006
; u1 [- o. R* Y$ @- |0 p6 i4 d        LDA #$10& J& s2 ^% }1 d& J" P+ T  q5 z* ~
        STA $2006
7 u& K* q$ h2 J        LDX #$00
+ g& B) F% ~8 J$ @+ {LOOP        LDA Spr_plet,x
  Y' _( E) Z) c$ O        STA $2007
( G# J  G9 B7 `3 A" i0 X# i        INX
2 p/ j' I7 h+ s5 D        CPX #$10  |. |3 X# \* {- N: H
        BNE LOOP6 ^6 ^1 ^  i5 {) Z5 ^" E  @
        LDA #$00
* W) D' I, R7 |0 c" g        STA $20037 N2 x0 Q8 d7 R% N, I$ Z" w* L
        LDA #$02, y# [" B7 w+ y# b# I$ u. I
        STA $4014       
8 c, q" W3 c+ d2 {move:$ R# N7 \$ |4 g+ a/ r
        LDX $0203
1 o9 `  P9 O7 h. [8 q        DEX
6 Y" q9 ]: x+ |' @3 {0 f4 w        STX $0203
/ x9 b  J" p5 M( V        LDA #$04
) `) k' `7 @/ h6 y        STA $20& E/ P7 b' z7 V; s) X# {, P4 u
        LDY #$00
1 `* J0 ]% ~1 c8 |! m7 _; a        JSR Vblank3 _+ q( ^% T/ K7 K% G5 C
        JMP LP16 `; g  F( ?8 B! L8 E* I
LP2:" ^& G! ]! g/ u7 v" ?: B
        JSR XXX8
, n  b" ]3 d' I( m8 ILP1:
: Q: k: T: b% a5 k2 v# S1 M        LDA addr,y$ X# ?* X' U9 [6 U
        JSR put
% U# f9 d+ `1 @1 s5 }9 D! g        INY9 Z- ~5 E* {! M6 j7 D& v, c
        LDA addr,y
4 @  B8 ]0 f7 Q% S5 G. x7 [; ^        JSR put3 ~: D0 B4 s# d) z4 u2 }
        INY
4 z0 h) ^3 ~1 C6 E! e8 [% r        DEC $20
% A+ t- P8 M9 w+ S  o4 E1 Q        BNE LP2
0 ^( @9 ^1 P: J        JMP move
. Z) E1 G9 I2 A$ N       
6 F2 Y2 f9 ^: h9 Mput:
; L, w2 G7 v5 r/ U2 C1 ]' `        STA $2003
7 m8 k. R2 I) u" g0 h! D; A$ X        STX $2004
2 W; |& o0 t7 F1 G        RTS( n$ S1 u) b+ C2 x- n
XXX8:4 ]' A$ e0 z) P
        INX8 E3 i" T; D1 Y, C2 p
        INX
/ f; a5 a6 E+ g; g6 z" J" h5 |        INX
9 J! t) E/ }0 C& V6 U! p% r        INX% O9 i8 H2 q: \: l) d) ^- x& A: D
        INX
$ q$ u6 ^; H: y8 v$ B/ F        INX
: ]  O2 e: Y, P1 R+ t' h  \1 D5 V        INX
% h& j$ f( ]/ T8 t; A        INX
+ g' j) X5 }# s- ~        RTS
! c$ F$ Z1 i! G" v% G: fVblank:
' I  L0 w2 H5 T, ?% [# `        LDA $2002
+ e: j( n8 ?3 C4 u) B% h8 l" {5 f        BPL Vblank  c7 Y2 P* i% J; i, c
        RTS7 f. M5 H9 o$ t" [8 w8 b' A
       
1 S6 h7 u, |, u4 S4 o  M* V        .ORG $FF906 Y) I$ T9 w8 J, @7 x7 v
Spr_plet:8 t6 M: ]1 m1 ^: ~: R# l
        .DB $02,$27,$2a,$2c,$02,$20,$16,$08,$15,$2A,$20,$08,$15,$2A,$20,$08+ z: i. I) A, h& r% h
        .ORG $FFA0
3 \# h) |0 r" Haddr:
0 {$ B9 l; r7 C  {: c) T        .DB $03,$13,$07,$17,$0b,$1b,$0f,$1f. D9 }$ ^9 ^  `* X. b1 _% Z
        ' [* O( i1 H; p, r) l
        .ORG $FFB0% A9 W( c! I7 b) r7 J6 _9 Q$ h: u
Spr_Data:
: r8 g9 A4 o5 d/ `) e! G3 Y. S        .DB $78,$44,$03,$80,$78,$45,$03,$88,$78,$46,$03,$90,$78,$47,$03,$98
2 a$ {* Z7 R, L5 q, p        .DB $80,$54,$03,$80,$80,$55,$03,$88,$80,$56,$03,$90,$80,$57,$03,$98
附件: 您所在的用户组无法下载或查看附件

TOP

这么多DEMO..可惜没钱- -

TOP

我现在感兴趣的就是如何才能写出一个FC的游戏出来?就是最简单的hello,world也行啊

TOP

曹老师前面有显字的程序。

TOP

好,有空一定看看。
性格决定命运,存在就是合理

TOP

发新话题