一台机器是如何确定显示在屏幕上的内容(具体来说是6502芯片)?

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上执行会发生什么?机器应该能够读取指令,对吧?


这不是一个编程问题,即使它是,它也与汇编语言或6502无关。 - Eight-Bit Guru
是的,我已经说过我不知道这是否是一个合适的问题,所以我还是问了,因为我认为这个网站上很多程序员可能在硬件方面有一些知识。我会记住以后不要问这种问题。 - ZimZim
我相信这个网站上很多程序员确实拥有丰富的硬件知识,但是SO关注的是编程;你的问题本质上是硬件相关的,因为将内存结构转换为显示器上的扫描线是一个特定于系统硬件的任务(这并不意味着这个问题不有趣或无效,只是它不适合在这里讨论)。 - Eight-Bit Guru
6个回答

6
图形显示的方式因计算机而异,所以没有明确的答案。例如,在C64上,图形硬件被映射到常规地址空间中,因此您必须写入内存的特定部分才能在屏幕上打印字符。如果要显示图形,则必须通过向显示硬件的寄存器写入内容切换模式,同时映射的内存也会改变。由于这个原因,C64通常可访问的内存比64KB低。不过,您可以关闭内存映射,从而访问完整的内存(即位于图形内存下方),使其成为一个无显示器的机器。
然而,在PC上,例如VGA、EGA和Hercules卡等,通过访问特定端口并通过这些端口发送命令来进行编写。这是一种完全不同的方法。但这是一个系统设计决策,与CPU无关。
实际上,如果为Apple II编译的程序在C64上执行,会发生什么?机器应该能够读取指令,对吗?
答案很清楚。它可能会崩溃,因为即使指令集可能相同(我不知道苹果机采用哪种CPU),硬件细节也会有所不同。

1
C64的例子证实了我的怀疑。谢谢。 - ZimZim

5
处理器本身并不直接处理显示。显示(如果有)的使用取决于其他硬件组件,这些组件可能因机器而异。就像你所说的NES具有PPU,C64具有VIC,模拟器可能具有其他东西。
是的,如果CPU相同,指令将是相同的,但是可执行文件格式、硬件外设、内存布局以及任何OS/ROM服务等方面将会有所不同,因此程序可能无法运行。

4
这是与系统非常相关的内容。视频卡或图形系统或其他名称,需要在某个内存中取一些位或一组位,并将其转换为视频信号。显示器接口是标准的,如电视输入、vga、dvi、hdmi等。有一些流行的视频卡和克隆品等可以让你从内存到这些视频信号,但你仍然需要弄清楚你拥有什么并进行编程。
图像的大小,X乘以Y像素,多少种颜色,每种颜色多少像素,如果可编程,则需要有人编程和/或使用默认值(如果有),等等。你使用的模拟器可能模拟了一个流行的6502视频系统,但它不一定与6502本身有关。一些6502系统具有集成或支持芯片的视频功能,但它与6502处理器本身实际上是分开的。处理器执行指令并带你到内存接口,内存和其他外围设备不是核心处理器的一部分,但是...外围设备...
因此,您需要研究特定的系统、模拟器、C64等,分别了解其视频系统、控制寄存器、视频内存如何映射到处理器地址空间等。

在模拟器的情况下,模拟器会从视频内存或模拟的视频系统中获取比特,然后为进行模拟的系统(例如您的笔记本电脑或个人电脑的视频卡)创建像素,然后基于该系统的视频卡为显示器创建信号。 - old_timer

3
当涉及到不同的硬件时,这个过程会有很大的区别,但是在某种屏幕上显示数据的常见方法是使用芯片从特定内存区域读取并在屏幕上显示。要更改显示内容,只需写入内存区域,芯片将在下一个显示周期中显示新数据。
我熟悉8位Ataris,在那里用于显示的内存区域因图形模式和可用RAM而异,因此在零页中存储了指向屏幕起始位置的指针。
由于访问不同硬件(例如屏幕和键盘)的方式在计算机品牌之间有所不同,因此一个计算机的程序无法运行在另一台计算机上。只有一个不与任何硬件交互的程序才能移植,但那将是一个相当无用的程序。

2

除了CPU,一台计算机通常还包括另一个用于处理显示的芯片,即GPU。每台计算机可能都有不同的GPU,具有不同的分辨率和色彩深度。因此,这完全取决于GPU。6502本身对显示没有任何了解。


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),事情将很快停滞。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接