汇编考完了,总的来说,有点迷糊。当然上课的体验很好,还算行。

乘着记忆力的顶峰,回忆下汇编学了啥。

核心就是成就嘤特尔的8086系列CPU,和围绕CPU的存储器,外设。严格遵照冯诺依曼架构,采用存取程序的方式设计。构架了x86体系,尽管牙膏厂裹足不前,但直到今天,x86系列的老大还是嘤特尔。众多外设厂还得围绕牙膏厂和农厂转,比如今天被拉出来批判的联想,不是不想造cpu,而是壁垒太高了,差了几十年的发展,已经无法再构建一套新体系了

而古董8086,现在只存在于模拟器中了,当然还有8259a,8255,8253这些东西。

汇编是一门语言,是在机器码和高级语言的一个桥梁,串成一起,才是完整的计算机系统。

其中的核心,我觉得是数据的移动过程。

通过汇编语言操作硬件,完成数据在寄存器,总线,存储器中的移动。核心就是一个词,规则。

纷乱的数据流动有着严格的规则。由此就引申出一些问题:

流动过程中被打断了怎么办?我放一个数据,怎么找到它?要不要放一个全局的索引(GDT/LDT)?总线上两个数据会不会冲突?要不要有时钟周期同步?

围绕这一系列问题,解决这些问题才是这门课的本质。

学到最后才发现,这门课的名字,应该叫计算机的组成结构。或者说深入了解计算机系统。

前几天看到一个回答,《超级马里奥3》使用了什么样的技术可以在128KB中写进这么多东西?

128KB兄弟们,1MB是8086的寻址空间,除去接口,中断向量的地址,128KB能不能放得下还说不定呢。

声音部分: FC有两路方波生成器,一路三角波生成器,一路随机噪声,一路PCM。PCM采样可以实现很好的效果,但数据量巨大,所以大多数游戏没用。用方波/三角波来发声就类似最简单的MIDI音乐,数据量很小。

一看到方波生成器就来劲了,这不就可以通过8253的方式3来生成方波。

图形部分: 这是主要占卡带容量的部分,下面简单说一下

  • FC的图形处理单元以sprite的方式组织图像,程序能控制的最小显示单位不是一个点,而是8x8的sprite。
  • “那整个画面卷动的时候不是应该一块一块(8像素)的跳动吗?”——PPU另外有卷轴寄存器,可以按像素级指定卷动的量。也就是说sprite虽然是8x8的,但在屏幕上不见得总是对齐到8x8的格子里。
  • sprite里具体每个点的颜色也不像现在是豪华的16位或32位RGB直接指定,而是一个2bit的索引,从一个16色的调色板里选。
  • 既然是2bit的索引值,最多就只能指定4色。而且因为00固定代表透明,所以实际上最多只有3色。
  • 那为啥要用到16色的调色板?实际上是4个4色的调色板。每4个相邻的sprite(16x16)可以从这4个调色板里指定一个。所以你去数,FC的一个16x16 sprite里最多只能显示4种颜色,因此会有那种经典的单调感。
  • 16色的调色板有两个,一个背景层用,一个角色层用。调色板从FC PPU固定死的64种颜色中选取颜色。因为这64个颜色里黑色/透明重复了多次,所以实际不同的颜色只有54种。
  • 不管你看没看晕,上面的重点是,FC游戏里面一个像素只占用2bit的卡带空间。
  • 并且因为所有显示内容都按sprite组织,大大方便重复使用。要显示形状一模一样的两朵云,或者几十个砖块,只需要在显存里重复写下这些sprite的编号,而不是重复sprite的数据(8x8x2/8=16byte)
  • 因为调色板的存在,形状一样而颜色不同的图案也不需要占额外的空间,只要设置一下调色板就行了,包括变色的效果也是这样做的。红色的Mario和绿色的Luigi就是同一套Sprite。
  • 透明、滚动、前后景叠加、碰撞检测都是PPU完成,不需要另外写程序。
  • sprite的数据也不存在由CPU从卡带读入到RAM的过程(除了后期的磁碟机),而是直接由卡带映射到FC的64KB地址空间进行访问。不同的卡带硬件(所谓的mapper)支持由程序控制将卡带上的不同地址映射到FC的同一地址空间,所以尽管8位的FC只有64KB寻址能力,但卡带容量可以做到256KB甚至更大。

1 微型计算机基础概论

image-20211203182036501

2.微处理器8086和8088