机器如何确定屏幕上显示的内容(具体为6502)?

时间:2013-06-15 17:53:02

标签: assembly cpu pixel 6502

我知道这是一个令人难以置信的模糊问题,对于程序员来说这可能不是一个好问题,因为这实际上是与硬件相关的东西,但我猜一些程序集/机器代码会起到适合这个网站的作用。

所以我想知道的是;想象一下6502处理器。它有一些寄存器,一个指令集和对一定数量内存的访问。然后想象你有一些任意分辨率的液晶屏。如何确定此屏幕上显示的内容?如何确定哪个位置的像素被赋予哪种颜色?例如,屏幕是否始终显示6502累加器中的值的像素,x位置存储在寄存器x中,y位置存储在y中?或者它是否被每台机器解释不同?

有人写了一个JavaScript 6502模拟器,设备显示一个像素,其值在某个内存位置,起价为200美元。例如:

LDA #$08 
STA $200 

将在位置x:0,y:0处显示粉红色像素。

LDA #$01
STA $205

将在位置x:5,y:0处显示白色像素。

但是,如果您查看NES,它会有一个专用的PPU,它会在屏幕的某个区域显示某些具有特定值的像素。

那它是如何运作的?它是由每台机器(即Apple II,C64,NES)进行不同的解释,还是它的解释方式有某种一致性?

事实上,如果为Apple II编译的程序以某种方式在C64上执行会发生什么?机器应该能够阅读说明书,对吗?

6 个答案:

答案 0 :(得分:5)

处理器本身并不直接处理显示事物。如何使用显示器(如果有的话)取决于可能在不同机器之间变化的其他硬件组件。正如你所说NES有一个PPU,C64有一个VIC,一个模拟器可能还有别的东西。

是的,如果cpu是相同的,说明将是相同的,但可执行文件格式,硬件外围设备,内存布局和任何OS / ROM服务等内容将不同,因此程序可能无法运行。 / p>

答案 1 :(得分:5)

图形的显示方式与机器有关,因此不能确定答案。例如,在C64上,图形硬件被映射到普通地址空间,因此您必须写入内存的特定部分才能在屏幕上打印字符。如果要显示图形,则必须通过写入显示硬件的寄存器来切换模式,并且映射的内存也可能会发生变化。因此,C64的正常可访问内存低于64KB。您可以关闭内存映射,从而可以访问图形内存下面的完整内存,因此它变成了一台没有显示的机器。

然而,在PC上你有例如VGA,EGA,Hercules卡等,通过访问特定端口并通过这些端口向其发送命令来写入。一种完全不同的方法。但这是一个系统设计决策,并不依赖于CPU。

  

事实上,如果为Apple II编译的程序以某种方式在C64上执行会发生什么?机器应该能够阅读说明书,对吗?

嗯,答案非常明确。它很可能会崩溃,因为即使指令集可能相同(我不知道苹果有哪些CPU),硬件细节也会有所不同。

答案 2 :(得分:4)

这是非常具体的系统。视频卡或图形系统或任何你想要调用它的东西需要在某个存储器中的一些位或一组位,并将其转换为视频的信号。显示器的接口是标准的,电视输入,vga,dvi,hdmi等。有流行的视频卡等流行和克隆,让你从内存到那些视频信号,但你仍然需要弄清楚你是什么有它并为它编程。

图像的大小,X乘Y像素,多少种颜色,每种颜色的像素数(如果可编程的话)是有人必须编程和/或使用默认值的东西,如果有的话,等等。您正在使用的仿真器可能正在模拟一个流行的6502视频系统,但它不一定与6502本身有任何关系。大约有6502个系统带有视频集成或支持芯片,但它实际上与6502处理器本身分开,处理器执行指令并将您带到存储器接口,内存和其他任何外围设备都不是核心处理器的一部分,但是... ...外设

因此,您需要查看特定系统,此模拟器,C64等,并分别研究每个系统,以了解其视频系统,控制寄存器,视频内存如何映射到处理器地址空间等。

答案 3 :(得分:2)

除了CPU之外,机器通常还包括用于处理显示器的另一个芯片。 GPU。每台机器可能具有不同的GPU,具有不同的分辨率和颜色深度。所以这一切都取决于GPU。 6502本身不知道显示。

答案 4 :(得分:2)

当然,这在不同硬件之间会有很大差异,但在某种屏幕上显示数据的常用方法是有一个芯片从特定的存储区域读取并在屏幕上显示。要更改显示的内容,只需写入存储区,芯片将在下一个显示周期显示新数据。

我熟悉8位Ataris,其中用于显示的内存区域因图形模式和可用内存而异,因此在零页面的某处存在指向屏幕起点的指针。

由于访问不同硬件(例如屏幕和键盘)的方式因计算机品牌而异,因此一台计算机的程序无法在另一台计算机上运行。只有一个根本不与任何硬件交互的程序才是可移植的,但这将是一个非常无用的程序。

答案 5 :(得分:1)

在此处开始浏览:http://en.wikipedia.org/wiki/Framebuffer,然后转到此处:http://en.wikipedia.org/wiki/Graphics_processing_unit

每台机器都有视频子系统,而CPU的作用通常是编程该子系统来显示程序想要显示的内容。在非常简单的系统中,CPU通常会创建将在屏幕上显示的类似矩阵的图像表示。然后,图形子系统只扫描此内存并将屏幕上的像素调整为它在此矩阵中看到的值。这可以防止CPU在发生这种情况时做更多有用的工作。在现代系统(OpenGL等)中,CPU只通过PCIe向显卡发送命令,并让它自己完成大部分工作。在其他一些机器上运行C64代码(使用相同的CPU)仍会运行6502条指令,但程序会期望外围设备的某些输出,这种情况不会发生,一旦CPU开始编程其中一个子系统,事情就会冻结不存在(如c64的VIC)。