跳转到内容

Signetics 2650 & 2636 编程/对象

75% developed
来自 Wikibooks,开放的书籍,开放的世界

教程 — 对象

[编辑 | 编辑源代码]
另请参见:PVI - 对象

PVI 最强大的功能是它的四个可重编程对象。一些资料指出这款 Signetics 芯片(约 1977 年)是首个商用可用的在视频芯片上实现内存映射对象的硬件。

教程代码

[编辑 | 编辑源代码]

本教程的代码可以在 教程代码 - 对象 中找到。它生成了这里显示的静态屏幕。有四个对象,分别为 1、2、3 和 4,它们的颜色和大小各不相同。还有对象 1、2 和 4 的副本。

这是对这些对象进行编程的代码部分。它来自由 WinArcadia 汇编器创建的列表文件。

                                            ;set the colour of the four objects:
002D  0403    :        lodi,r0 %00000011
002F  CC1FC1  :        stra,r0 colours12	    ; obj 1 white, 2 red
0032  0429    :        lodi,r0 %00101001
0034  CC1FC2  :        stra,r0 colours34	    ; obj 3 green, 4 yellow

                                            ; set the size of the four objects:
0037  04E4    :        lodi,r0 %11100100
0039  CC1FC0  :        stra,r0 objectsize

                                            ; load the shape and size of the four objects:
003C  070E    :        lodi,r3 $0E
              :loopISe:                     
003E  0F4059  :        loda,r0 one,r3-
0041  CF7F00  :        stra,r0 shape1,r3
0044  0F6067  :        loda,r0 two,r3
0047  CF7F10  :        stra,r0 shape2,r3
004A  0F6075  :        loda,r0 three,r3
004D  CF7F20  :        stra,r0 shape3,r3
0050  0F6083  :        loda,r0 four,r3
0053  CF7F40  :        stra,r0 shape4,r3
0056  5B66    :        brnr,r3 loopISe	

让我们逐一看看每个部分。

黑色 111
蓝色 110
绿色 101
青色 100
红色 011
洋红色 010
黄色 001
白色 000
另请参见:教程 — 编程颜色

一个对象内的像素颜色都相同。每个对象的颜色由 PVI 寄存器 $1FC1 和 $1FC2 中的三个位设置(共有八种颜色可选)。

  7 6 5 4 3 2 1 0
$1FC1 X X R1 G1 B1 R2 G2 B2
$1FC2 X X R3 G3 B3 R4 G4 B4

程序设置
$1FC1 = 00000011 = 00 000 011 = 白色 红色
$1FC2 = 00101001 = 00 101 001 = 绿色 黄色

放大倍率 大小 MSB LSB
x1 8 x 10 0 0
x2 16 x 20 0 1
x4 32 x 40 1 0
x8 64 x 80 1 1

每个对象的大小可以独立设置为四种不同的尺寸之一。每个对象可以有 10、20、40 或 80 行的高度,宽度也按类似的方式缩放,分别为 8、16、32 或 64 个水平时钟周期。单个像素不是正方形,它们大约是高度的两倍宽,在设计形状时这一点很重要。

  7 6 5 4 3 2 1 0
1FC0 对象 4 的大小 对象 3 的大小 对象 2 的大小 对象 1 的大小

程序设置
$1FC0 = 11100100 = 11 10 01 00 = x8 x4 x2 x1

对象描述符

[编辑 | 编辑源代码]
对象描述符 1、2、3 或 4
0 对象的形状,
8 位的 10 行
1
2
3
4
5
6
7
8
9
A 对象的水平坐标
B 副本的水平坐标
C 对象的垂直坐标
D 副本的垂直偏移量

四个对象的形状和位置分别由 14 个称为对象描述符的寄存器定义,这些寄存器按顺序排列为 10 个字节的形状数据、一个水平坐标 (HC)、一个副本的水平坐标 (HCB)、一个垂直坐标 (VC) 和一个副本的垂直偏移量 (VCB)。

对这些对象进行编程的代码将来自表一、表二、表三、表四的数据块复制到对象描述符 $1F00、$1F10、$1F20 和 $1F40。寄存器 R3 用作索引寄存器,循环运行 14 次,在每次循环中设置四个对象描述符中的一个字节。

在定义形状的对象描述符的十个字节中,设置为零的位是透明的,而设置为一的位显示为已编程的颜色。

屏幕上任何主对象的坐标都由其相应的水平 (HC) 和垂直 (VC) 坐标设置,原点位于屏幕的左上角。坐标可以是任何八位值,但大于 227 的水平坐标会将对象推到屏幕的右侧,而大于 252 的垂直坐标会将对象推到屏幕的底部。

这些对象的强大功能来自这样一个事实,即它们可以在屏幕上更下方再次输出。一次又一次地……事实上,一次可以在屏幕上显示多达 80 个对象。这些被称为副本。副本对象始终位于其前一个对象的下方,它们不能重叠。副本的水平坐标只是它距屏幕左边缘的距离,与原始副本的指定方式相同。副本的垂直位置更复杂,它是相对于其前一个对象的垂直偏移量。

也可以在副本之间重新编程对象的形状、大小和颜色,但这需要一些实时编程,将在后面的教程中讨论。



对象坐标和屏幕图片供比较
对象 1 对象 2 对象 3 对象 4
HC 10 40 60 100
HCB 10 35 120 110
VC 20 60 90 0
VCB 20 10 250 255
 

对象 1 的水平坐标为 10,其副本的坐标也是如此。其垂直坐标为 20,其所有副本都相对于其前一个对象垂直偏移 20。

对象 2 的副本向左偏移了 5 个像素,并垂直偏移了 10 个像素。

对象 3 是单独的。它的副本通过将垂直偏移量设置为 250 被推到了屏幕底部。

对象 4 的副本全部紧贴在一起。这是通过将偏移量设置为 255 实现的。这可能看起来有点奇怪,但如果将 255 转换为 8 位二进制,然后将其解释为带符号的二进制补码,我们就会得到 -1。这是因为 VCB 必须设置为“要跳过的行数 - 1”。如果你想要 1 行的间隙,则将 VCB 设置为 0,依此类推。

  1. 更改对象的大小。
  2. 更改对象的形状。
  3. 更改对象的位置。
  4. 更改对象副本的位置。


华夏公益教科书