5

我知道这是一个非常模糊的问题,对于程序员来说可能不是一个好问题,因为这确实是一个与硬件相关的事情,但我想一些适合这个站点的汇编/机器代码开始发挥作用。

所以我想知道的是;想象一下 6502 处理器。它有一些寄存器、一个指令集和对一定数量内存的访问。然后想象你有一些具有任意分辨率的 LCD 屏幕。如何确定此屏幕上显示的内容?它是如何确定哪个位置的哪个像素被赋予什么颜色的?例如,屏幕是否总是显示一个像素,其值在 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 上执行会发生什么?机器应该能看懂说明书吧?

4

6 回答 6

6

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

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

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

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

于 2013-06-15T22:22:09.597 回答
5

处理器本身并不直接处理显示的东西。如何使用显示器(如果有)取决于其他硬件组件,这些组件可能因不同机器而异。正如您所说,NES 有一个 PPU,C64 有一个 VIC,而仿真器可能还有其他东西。

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

于 2013-06-15T18:09:15.130 回答
4

它非常特定于系统。视频卡或图形系统或任何你想称之为的东西在某个内存的某个地方占用一个位或一组位,并将其转换为视频的信号。显示器的接口是标准的、电视输入、vga、dvi、hdmi 等。有流行的和流行的视频卡的克隆等,可以让你从内存中获取这些视频信号,但你仍然必须弄清楚你是什么拥有并为它编程。

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

所以你需要研究具体的系统,这个模拟器,一个 C64 等,并分别研究每一个,以了解它的视频系统、控制寄存器、视频内存如何映射到处理器地址空间等。

于 2013-06-15T18:09:22.803 回答
3

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

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

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

于 2013-06-15T18:10:18.230 回答
2

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

于 2013-06-15T18:08:23.090 回答
1

从这里开始冲浪:http ://en.wikipedia.org/wiki/Framebuffer ,然后去这里:http ://en.wikipedia.org/wiki/Graphics_processing_unit 。

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

于 2013-06-15T18:14:29.990 回答