可能重复的模拟器如何工作以及它们是如何编写的?
我想编写一个模拟器(可能是NES或C64,我还没有决定),我知道有很多这样的人可能会问为什么有人想从头做一个,但我想要包含一些特定的特性在它,也为了自己建立它.
我想阅读一个已经构建了一个并且可以传输经验的人的指南,它不必是特定于平台的(如果不是,那就更好),因为我知道如何编程,我不知道如何模仿.
我想知道NES如何显示其图形肌肉.我已经在线研究过这些东西,并通过它阅读,但我想知道最后一件事:Nametables.
基本上,根据我的阅读,NES名称表中的每个8x8块指向模式表中的一个位置,该位置保存图形内存.此外,名称表还有一个属性表,为每个16x16块设置特定的调色板.他们像这样联系在一起:
(假设16个8x8块)Nametable,ABCD =指向精灵数据的指针:
ABBB
CDCC
DDDD
DDDD
Run Code Online (Sandbox Code Playgroud)
属性表,1 2 3 =指向调色板数据的指针,<左侧引用值,上方^,左侧和上方:
1<2<
^'^'
3<3<
^'^'
Run Code Online (Sandbox Code Playgroud)
因此,在上面的示例中,块将被着色
1A 1B 2B 2B
1C 1D 2C 2C
3D 3D 3D 3D
3D 3D 3D 3D
Run Code Online (Sandbox Code Playgroud)
现在,如果我在固定的屏幕上有这个 - 它很棒!因为NES分辨率是256x240像素.现在,这些表如何调整滚动?
因为Nametable 0可以滚动到Nametable 1,如果你继续滚动Nametable 0将再次回滚.我得到了.但我没有得到的是如何滚动属性表包装.从我在网上看到的情况来看,它分配属性的16x16块会导致屏幕边缘区域的颜色失真(如左右滚动时反映,SMB3反之亦然).
我关心的是我了解如何滚动名称表,但是如何滚动属性表?对于intsance,如果我在屏幕的左侧有一个绿色块,将屏幕向右移动理论上应该使右侧的瓷砖变为绿色,直到它们移动到框架中,然后它们将恢复到他们的正常颜色.
~~~~编辑:我想指出我知道扫描线,X和Y.这个想法刚刚贯穿我的脑海.
假设我的扫描线Y为10.这意味着我正在水平地读取10个值到我的名字表中.这意味着我的第一列不在屏幕上,因为它只有8的像素宽度.但是,颜色属性保持不变,因为它的宽度为16.
假设整个列的颜色属性为绿色,我认为对用户来说是正确的,屏幕左边的前6个像素是绿色,屏幕最右边的10个也应该是绿色的?那么,根据屏幕,左边的假设我是否正确?
我只是在youtube上观看了超级马里奥兄弟-1世界故障,我真的开始怀疑这些游戏背后的代码.使用了哪种语言?视频游戏控制台的操作系统怎么样?有没有关于这个主题的资源的网站?(我是一个90年代的视频游戏玩家,所以我对这些游戏背后的编程特别感兴趣,但是如果你愿意的话,可以随意把它作为一个wiki并包含有关视频游戏编程资源的链接)
我是NES开发新手,我发现Nerdy Nights教程非常方便,但它使用了nesasm.据我了解,ASM6比nesasm要好得多.它有可比的教程,我可以查找吗?
另外,是否有正式的ASM6页面?我的ASM6版本是1.51,我不知道是否有更新的版本.
我正在阅读MIPS汇编语言编程,但现在我想为Nintendo 64构建一个简单的"游戏" .我想Hello, World在屏幕上打印一个,但是有人可以帮忙解决这个问题.因为我没有什么可以开始的.
我选择任天堂64,因为我的朋友告诉我它使用MIPS,我已经有了模拟器.
我目前正在用C#编写一个基本上可以称为我自己对NES硬件的解释,用于我正在开发的老式游戏.我已经解雇了FCE并且一直在观察NES如何显示和渲染图形.
简而言之,NES可以保存两个位图值的图形信息,每个图形信息的尺寸为128x128.这些被称为PPU表.一个用于BG瓷砖,另一个用于精灵.数据必须在此内存中才能在屏幕上绘制.现在,如果一个游戏有更多的图形数据然后这两个银行,它可以将这些新信息的一部分写入这些银行 - 在每一帧的末尾覆盖那里的东西 - 并从下一帧开始使用它.
那么,在旧游戏中,程序员的银行如何切换?我的意思是,在关卡设计中,他们是如何知道要加载哪个图形集的?当屏幕以编程方式从舞台的一部分滚动到下一部分时,我注意到Mega Man 2银行开关.但他们是如何将这些信息存储在关卡中的 - 将哪些精灵复制到PPU表中,以及在哪里写入?
另一个例子是在MM2中暂停.暂停期间BG块会被覆盖,然后在玩家取消暂停时恢复.他们是如何记住他们更换了哪些瓷砖以及如何恢复它们?
如果我是懒惰的,我可以制作一个巨大的静态位图,然后就这样获取值.但我强迫自己限制这些价值观,以创造更真实的体验.我已经阅读了有关MC Kids如何制作的精彩指南,并且我正试图成为关于我如何编程这个游戏的准系统.我仍然只是想到这些程序员如何完成他们所做的事情.
编辑:我能想到的唯一解决方案是保存单独的表,说明PPU在什么时间应该在哪些瓷砖,但我认为这将是NES无法处理的巨大内存资源.
我知道NES有4色精灵(1通常是透明的 编辑:根据zneak,1种颜色总是透明的).那么原版的最终幻想怎么会有这么多精灵有4种颜色+透明?(示例精灵表 - 特别是看底部附近的大型精灵表.)
我知道你可以分层精灵来实现额外的颜色(例如:Megaman的分层给他6种颜色:body = 3 + trans,face = 3 + trans).奇怪的是,这些FF都是4种颜色+透明.如果FF使用类似的分层,为什么他们会停在4 + 1而不是利用6 + 1?
是否有另一种显示精灵的方法可以为您提供额外的颜色?
同样有趣的是大精灵是18x26.精灵是8x8(我想我读到的地方有时是8x16)但是18和26都是[因子8] + 2.非常奇怪.
我有时会看到修改过的NES游戏,我想尝试一下.用什么工具来实现这个目标?是否有一些神奇的源代码存储库坐落在我不知道的某个地方?我的问题是,修改任意NES游戏的第一步是什么?(如果第一步是"让你的头直奔',那么请给我第一步到第三步.)
谢谢
有没有人有一个很好的起点来了解新任天堂DSi的开发?你需要什么样的硬件来开发和测试这样的东西?您可以使用标准DS开发DSi吗?你需要用什么语言?
[Bonus Question]:我还听说新的DSi将会得到一个类似于Apple的App Store - 开发人员是否能够使用这个销售游戏?
几年前,我将一个NES游戏作为一个类项目实现,用6502程序集编写.我只在NES仿真器上运行它,但我希望它能在真正的硬件上运行.有没有开发板可以做到这一点?我理解它有点棘手,有mapper芯片等,但我愿意限制只是一个普通的映射器(比如说MMC3).
可能重复:
模拟器如何工作以及它们是如何编写的?
我想尝试编写一个基本的gameboy模拟器,甚至是NES.我知道C的基础知识,而且我相当擅长Java,所以我知道编程的必要基础知识.但我不知道的是人们如何将所有数据处理成C程序并从中创建模拟器.我知道我应该从源头学习,但是很难看到一堆代码而不知道它们为什么存在以及它们应该做什么.如果我想学习如何编写这样的模拟器,我应该从哪里开始?
我搜索过互联网,但我发现不清楚的教程包含太多错误,我自己也没弄清楚.我该在哪里开始?
事先,我为这个问题的开放性和一般的清醒道歉,因为老实说,我对这个话题的了解非常不完整,我发现很难描述我的问题.我真的不想发帖,但我完全被完全卡住了.
我已经启动了NES模拟器.它被解释(所以没有动态重新编译).
它可以加载和映射roms(mapper 0 roms)并执行init代码,直到我必须处理中断和PPU.那就是我被困住的地方.
这是我的emu atm的示例输出.执行从8000开始,我在800a处无限循环,我不知道如何从那里进步.
8002: LDA #$10 ; read immediate value to set PPU control registers
8004: STA $2000 ; store value
8007: LDX #$FF ; load immediate value into X register
8009: TXS ; store X register into stack
800a: LDA $2002 ; read PPU flags into accumulator (set N flag based on bit 7)
800d: BPL ; test N flag, branch to 800a if not positive, (N is set)
800a: LDA $2002
800d: BPL
800a: …Run Code Online (Sandbox Code Playgroud) 我已经成功地模拟了任天堂娱乐系统的(稍微交替的)6502 核心,现在我在 PPU 模拟上有点卡住了。
在各种文档中,PPU 有 0x4000 (16KB) 字节的可用内存。其中只有 2KB 是内部 RAM,而其余部分在墨盒上(或类似的东西)。我不明白的是,PPU 使用了模式表、名称表、属性表、背景调色板和精灵调色板(在我的脑海中)。所有这些东西都存放在哪里?我知道一个 CHR 内存条的大小是 8KB,所以即使 ROM 有多个图形内存条,PPU 怎么知道在哪条内存条中,要找到这些表/调色板中的哪一个?而且有的游戏甚至没有CHR内存,一切都存储在PRG内存中。我怎样才能找出所有图形的存储位置以进行仿真?
编辑:我已经添加了我自己的解释作为答案,因为我现在对 NES 的内部工作有了更多的经验。