Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 机器如何确定屏幕上显示的内容(具体为6502)?_Assembly_Cpu_Pixel_6502 - Fatal编程技术网

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

Assembly 机器如何确定屏幕上显示的内容(具体为6502)?,assembly,cpu,pixel,6502,Assembly,Cpu,Pixel,6502,我知道这是一个非常模糊的问题,对于程序员来说可能不是一个好问题,因为这确实是一个与硬件相关的问题,但我猜一些汇编/机器代码将适用于此站点 所以我想知道的是;想象一下6502处理器。它有一些寄存器、一个指令集和对一定数量内存的访问。然后想象你有一个任意分辨率的LCD屏幕。如何确定此屏幕上显示的内容?如何确定哪个像素在哪个位置被赋予什么颜色?例如,屏幕是否始终显示一个像素,其值在6502累加器中,x位置存储在寄存器x中,y位置存储在y中?还是每台机器对它的解释都不同 有人编写了一个JavaScrip

我知道这是一个非常模糊的问题,对于程序员来说可能不是一个好问题,因为这确实是一个与硬件相关的问题,但我猜一些汇编/机器代码将适用于此站点

所以我想知道的是;想象一下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,在屏幕上的特定区域显示具有特定值的特定像素

那么它是如何工作的呢?每台机器(即苹果II、C64、NES)对它的解释是否不同,或者对它的解释是否有某种一致性


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

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

处理器本身并不直接处理显示内容。显示器(如有)的使用方式取决于其他硬件组件,这些硬件组件在不同的机器之间可能有所不同。正如你所说的,一个NES有一个PPU,C64有一个VIC,模拟器可能还有其他的功能


是的,如果cpu是相同的,那么指令将是相同的,但是诸如可执行文件格式、硬件外围设备、内存布局和任何OS/ROM服务都将不同,因此程序可能不会运行。

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

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


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

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

我熟悉8位Ataris,其中用于显示的内存区域根据图形模式和可用ram的不同而不同,因此在zero页面的某个位置存储了指向屏幕开始的指针

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

从这里开始浏览:,然后转到这里:


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

图形的显示方式取决于机器,因此没有明确的答案。例如,在C64上,图形硬件被映射到普通地址空间,因此您必须写入内存的特定部分,以便在屏幕上打印字符。如果您想显示图形,那么您必须通过写入显示硬件的寄存器来切换模式,并且映射内存也可能会改变。因此,C64的正常可访问内存较低