我已经思考这个问题一段时间了。我知道现在的显卡将像素信息保存在专用内存中,并通过显卡将这些信息输出到屏幕上。但是据我所知,commodore 64 和大多数旧电脑都没有带有专用内存的显卡。我想它们可能保留了系统内存的一部分作为某种帧缓冲区。处理器可以计算像素值并将数据存储在此帧缓冲区中,然后将该信息输出到屏幕上。这些旧电脑就是这样工作的吗?还是有其他完全不同的过程?
答案1
是的,那基本上就是当时视频输出的方式。有 1 到 8 kB 的内存保留为视频缓冲区,CPU 计算输出并将其保存在 RAM 中。
然而,与现代显卡还是存在一些区别:
- 当时还没有 HDMI 或 VGA 等高分辨率接口。家用电脑与电视连接时通常使用 NTSC 或 PAL 色彩模式的复合视频。
- 对于文本模式,只将 ASCII 代码逐字节保存在内存中。视频电路有一个小型 ROM,其中包含每个字符的 5x7 点阵。这样,只需 1 kB 即可保存 40x25 个字符的屏幕。
- 有像英特尔 8275 这样的专用芯片,它集成了所有功能(访问缓冲存储器、为 NTSC 显示器生成像素时钟和同步、访问字符点矩阵 ROM 等等),但有时整个视频逻辑都是用 TTL 逻辑 IC 构建的(例如:Apple II)。
- 由于 RAM 是共享的,视频电路使用 DMA 或其他方法中断 CPU 以访问 RAM。由于没有管道来缓冲数据,并且视频信号的像素输出对时间至关重要,因此视频电路几乎总是具有更高的优先级。
答案2
我假设您说的是 20 世纪 70 年代末/80 年代初的家用电脑。这些电脑的工作方式基本符合您的猜测。虽然有一些复杂之处,例如硬件精灵、可重新定义的字符和非线性内存布局,但基本上所有这些计算机都至少有一种文本模式,其中字符以字节的形式存储在内存中;后来,更精美的计算机具有彩色和位图图形。
然而,还有一种较老的图形显示器,矢量显示,只需要计算机将可见点的坐标保存在内存中。当制造商和消费者无法负担保存甚至非常低分辨率的位图所需的内存时,这非常有利。
答案3
6502 微处理器需要在每个周期的一半时间内使用其内存总线;20 世纪 70 年代末和 80 年代初的许多计算机都利用了这一点,通过构建其内存系统,使其在周期的一半时间内将 6502 连接到内存,并在另一半时间内连接视频电路。值得注意的是,Apple II、Vic-20 和 Commodore 64 采用了不同的视频计时方法。
Apple II 每个 CPU 周期提取一个视频内存字节,以确定应显示哪个字符。字符有八条扫描线高,因此每个字符数据字节每帧将被提取八次——在八条连续的线上各提取一次。提取的字符字节的六位将与扫描线字符的底部 3 位一起用作 512x5 位 ROM 中的地址。提取的字符字节的前两位将选择正常、反向或闪烁模式。
VIC-20 使用更宽的字符,每隔一个 CPU 周期提取一个字符;在每次提取字符后的周期中,它会获取 8 位字符数据以及 3 位扫描线计数,将该值添加到寄存器中编程的值,从该地址提取一个字节,并将其显示为八个连续像素。这种方法意味着字符形状可以存储在 RAM 而不是 ROM 中,并根据需要重新编程(如果需要,字符内存地址也可以设置为 ROM,以节省 2K RAM)。
Commodore 64 需要像 VIC-20 一样获取每个字符的两个字节,但需要以两倍的速度将字符输出到屏幕(像 Apple 一样)。为了平衡这些需求,当它显示每行文本的第一个扫描行时,它会交替获取字符和获取其形状,而 CPU 不允许执行任何操作。但是,在获取字符数据时,视频芯片还会将其复制到 40 字节缓冲区。当显示接下来的七行扫描文本时,视频芯片会从该缓冲区而不是从 RAM 获取字符数据,从而让 CPU 共享其周期。这使系统能够像 Apple 一样显示更多文本,同时还允许像 VIC-20 一样重新编程字符字体。不幸的是,它每帧会使 CPU 停顿 25 次,每次共计 41-43 个周期(启动/停止 CPU 会增加 3 个周期的不确定性)——这个设计决定在当时是合理的,但却带来了一些不良后果(最糟糕的是软盘驱动器在发送每个位后要等待足够长的时间,以确保通信不会因为视频芯片 43 个周期中断 CPU 而受到破坏)。