从“ ZX光谱增色剂”到ZX-Poly

“ ZX光谱的颜色扩展器”-这是1997年8月3日在echo fido7.zx.spectrum中发表文章的标题 。 本文介绍了解决ZX-Spectrum平台的主要问题之一- 属性冲突的想法。 该出版物当时引起了一些兴趣,我想介绍一下技术细节和问题的历史。


ZX-Poly徽标


我将不深入探讨技术细节,而仅从结构上描述想法和解决方案。


故事的非技术部分,可以跳过

有关发展的故事始于1994年初的春天,当时该国仍在经历“草案变更”,从而导致大范围推迟延期入职,并引起了职业学校和技术学校学生的呼吁。 我很幸运-去年我在列宁格勒无线电技术学院就读,以这种方式,纽约州同意在短期内延迟加快文凭的速度,用所有科目的考试代替文凭设计。 他于1994年3月1日离开军队,出任无线电技术员。


当时的军队中,中层技术水平的专家空前地涌入,尽管这在名称已经有明确等级的``祖父''的头上稍微破坏了秋天的春天的征兵制度,但他们称这种非标准的称呼为``妖精''。 在“热闹”中,有足够的人喜欢ZX-Spectrum,亚历山大·古敏(Alexander Gumin)就象我所在的部门那样(他以ANCCAN的名字在ZX-Spectrum上与Denis Markelov一起写了游戏,并因他在1997年为该平台改编了Mortal Kombat而闻名),谁来谈论编程和硬件。


1994年4月中旬,在“年轻战士课程”结束时,我和亚历山大被转移到位于圣彼得堡郊区斯特雷纳的建筑营。 在那里,我们不得不掌握了数月之久的电缆分接器这一困难的专业。 这部分的生活悠闲地流动着,学习时时穿着各种服装,这些服装大多使双手绷紧,但给了大脑思考的时间。 因此,在厨房中的一种衣服,我的地板上以及对ZX-Spectrum及其功能的思考中,我想到了一个想法-如何克服“属性冲突”。


我一直在考虑这个想法,直到服务结束为止,并越来越相信“它可以奏效”。 不幸的是,我打算将其应用到该平台本身的可行性的想法很少访问我。 但是,在俄罗斯,从1991年到1996年,ZX光谱在天空中闪烁得最为生动。 俄罗斯一些克隆人的生产商数量激增,以至于他们赞助了电视节目(例如,BiM公司赞助了“丛林之名”节目已有一段时间)。 但是在服务期间还有其他问题,所以我决定将所有与商业有关的问题推迟到我被送往储备金之前。 我不定期透露细节,对技术可行性和方法有效性的各个专家感兴趣。 他将这个想法保密了,甚至没有与亚历山大·古敏(Alexander Gumin)分享,只是隐隐地向他表明,他找到了一个非常简单的解决方案,可以增加颜色数量,同时保持向后兼容性。


在1997年进入“公民”并在圣彼得堡公司“信息技术和模型”中担任第二类软件工程师的工作后,我开始逐渐对解决方案的商业化感兴趣。 出于某种原因,我确信如果我只是暗示我找到的解决方案,那么每个人都会开始用手撕扯,金钱就会流走。 那时,我开始打电话给“频谱工程”制造商和商人领域的知名人士,例如Sergey Zonov,Vyacheslav Skutin(Nemo)等。 谢尔盖·佐诺夫(Sergey Zonov)简单地告诉我,“火车已经走了”,这项工作已不再具有任何商业意义。 Vyacheslav Skutin是一名正统派演讲家,对任何试图更改平台中某些内容的想法都怀有敌意,这也是一个完全死的版本。 我认为讨论很少,至少必须要做一些事情,最好从模拟器开始,以获取促销材料和实验数据。


1998年,我以当时以Pascal编写的开源ZX-Spectrum仿真器作为基础之一,制作了一个由四台并行工作的计算机组成的原始仿真器。 我为《战后2》改编了部分游戏,为其中的一些精灵着色。 该系统正常工作,除了享受工作原理外,我还可以使用屏幕截图确认为现有游戏着色的想法。


1998年,我访问了Peters公司,该公司当时正在开发其新的Sprinter平台。 他试图引起他们的导演尼古拉·诺斯科夫(Nikolai Noskov)的兴趣。 他们在新开发上投入了大量资金,并且根据卑鄙的定律,Sprinter的超灵活架构能够模拟Z80上的几乎任何单处理器平台,因此无法扩展四个处理器。 但是,访问该公司非常有用,因为他会见了Sprinter平台的作者Ivan Makarchenko,并了解了FPGA开发领域的新机会。


很快,1998年的危机“枯萎了”,人们天真的希望对ZX-Spectrum的兴趣能够恢复。 1999年初,我们(当时与我的合伙人安德烈·萨维切夫(Andrei Savichev)一起)甚至计划创建“国家频谱基金”,并且在同一家彼得斯公司的新办公室中就此主题召开了一次会议。 但是他们不会两次进入同一条河,当然没有任何结果。 早在1999年,有关平台硬件实施的所有想法都已被弃用(我们与Sergey Egorov一起进行了这项开发工作,但除计划之外,我们没有做得更多)。 在2007年之前,我几乎没有使用过该平台,但是有一段时间,我决定重写仿真器并制定平台的详细信息,检查方法并“虚拟化”。


标准视频模式ZX-Spectrum显示256 x 192像素。 在单色模式下,仅需要6144字节,大约占总存储字段的10%(与BK-0010的50%相比)。 颜色信息存储在紧接像素数据之后的另外768个字节中。 调色板包含八种颜色和两种阴影。 立即针对8 x 8像素块确定照明和丢弃像素的颜色,并立即为照明和丢弃像素的颜色确定色调。


它看上去色彩丰富,并且可以非常快速地发送相对少量的数据,但是在开发彩色游戏和屏保时,需要艺术家和程序员付出巨大的努力和艺术。 图中的丝毫不一致会导致属性冲突。 大多数开发人员都在BK-0010的背景下完美地完成了工作,而BK-0010只有四种颜色(但要注意每一点!),Spectrum准颜色看起来非常有优势和新鲜。


ZX-Spectrum属性样本


随着ZX-Spectrum 128平台的开发,增加了在两页视频内存之间切换硬件的功能。 程序员迅速找到了一种方法,可以通过快速更改显示的视频页面和动态更改颜色属性来获得多种颜色。



因此,甚至可以以编程方式提高屏幕分辨率(例如,在“ Dead Morose”演示中完美展示了该演示,其中文本同时以256、512和768水平点的分辨率运行)。



但是,任何需要增加视频信息流的软件解决方案都会导致处理器消耗的增加,这在动态游戏的情况下至关重要。 系统中没有未使用的计算能力储备来源。 一切都挂在ZX-Spectrum中的处理器上,并给它带来一些负担,除了声音效果领域中的音乐处理器。


我的想法是,您可以再添加三个处理器,将每个处理器处理它们的颜色分量。 从每个处理器自己的视频存储器接收到的数据应进行集成,以形成每个像素的YRGB值。 标准颜色属性将被忽略。 信息的并行处理应确保没有下垂性能。


ZX-Poly 256x192中的配色方案


我不能说它是这个主意,因为它是受翻译书《计算机获得思想》(计算机出版社,1990年)的启发而创作的,该书描述了在卢卡斯影业开发的某种皮克斯图形平台。 根据TRIZ的说法这只是从单系统到多系统的过渡。


《计算机获得思想》一书的页面部分


对于任何开发而言,这都是一个非常痛苦的问题-谁来编写程序? (特别是Sprinter平台遇到了这个“陷阱”)。 以我为例,该软件的问题已被以下事实自动解决:很少有现有程序检查它们在视频存储器中记录的数据类型,并“像邮递员一样简单地”处理它们。 根据我的计算,事实证明,大多数现有游戏程序在不更改可执行代码的情况下,很容易在适应其视频数据的情况下幸免于难。 当然,具有在屏幕上输出的图形包或内部优化功能的游戏会被切断。 改编此类程序将需要研究和更改可执行代码。 完全不需要开发专用ROM。


我认为该概念适用于任何旧的家用平台(例如,AGAT,Radio86RK,BK-0010等),在这些平台上没有专用的视频加速器,并且处理器直接与视频内存一起构成图片。


在第一版仿真器中,我只是使四个ZX-Spectrum 48同步工作,但是在仿真器上易于模拟的操作很难在实际硬件上重复进行。 确保将数据加载到四个计算模块中并从同一地址开始同步是非常困难的。 Spec256为这种专用的虚拟64位SIMD Z80引入了类似的解决方案,该解决方案实际上并不存在。 作为更实际(且更复杂)的解决方案的一部分,ZX-Poly平台得以形成。


从“增色剂”到ZX-Poly


处理器模块


ZX-Poly是基于ZX-Spectrum 128的计算平台,其中包含四个处理器模块。 每个模块都有其自己的外部可见的可寻址系统IO端口。 尽管处理器模块共享系统控制信号(RESET,NMI,CLK和INT),但它们独立工作。


方块图


根据模块的索引有一定的排名-索引越小,排名越高,“模块0”在系统中是主模块。 仅对具有相同或更高等级的模块进行对模块系统端口的写访问,没有读取限制。 这样做是因为有人考虑开发专门的OS。


模块排名


一个非常重要的细节是,所有使用的处理器设备都必须是同一制造商的(最好有一个生产系列),因为它们内部结构或优化上的细微差别都可能破坏系统的一致性。


系统启动后,立即启动了主模块(CPU0),其余模块处于WAIT模式,因此对于用户而言,一切都不会引起注意。


在IO空间中,ZX-Poly添加了以下可用于写入和读取的端口:


  • 主配置端口$ 3D00
  • 模块0-$ 00FF,$ 10FF,$ 20FF,$ 30FF
  • 模组1-$ 01FF,$ 11FF,$ 21FF,$ 31FF
  • 模组2-$ 02FF,$ 12FF,$ 22FF,$ 32FF
  • 模组3-$ 03FF,$ 13FF,$ 23FF,$ 33FF

ZX-Poly主配置端口为$ 3D00。 只有主模块可以写入它,但是可以读取所有模块,并且返回其自己的每个专用信息。 特别是,模块可以找到其索引,其内存是否映射到主模块的IO端口,其内存在堆中的偏移量等。 另外,基本平台$ 7FFD的配置端口也进行了较小的更改,该端口使用原始端口中未使用的位。


记忆


与ZX-Spectrum 128的原始体系结构一样,有ROM和RAM。 如果ROM的组织和工作实际上没有变化,则RAM变成了512 KB的通用“堆”,其中每个处理器都具有一个专用的128 KB窗口(在ZX-Spectrum 128中为8页,每页16 KB)。 可以以64 Kb的增量更改窗口偏移量,并且可以投影所有处理器模块以与堆中完全或部分重叠的内存一起工作。 可以禁用ROM,并在其位置连接RAM0 RAM页面(这使您可以创建基本OS的“全色”版本,例如基本解释器)。 硬件复位后,所有模块都会收到自动偏移量,以使堆中的内存窗口不相交。


处理器模块主站(CPU0)能够将其他模块(CPU1-3)的地址空间映射到其IO端口的区域中。 即 他可以写入端口,更改给定模块的存储单元状态,同时可以在映射的模块上生成NMI信号。 从映射模块的存储单元读取时,可能会生成INT。 这样做是为了使用模块1-3模拟虚拟设备。


视频控制器


主要的“樱桃”当然是视频控制器,一切都为此而启动。 该平台总共支持五种视频模式。


ZX-Spectrum 128视频模式(模式0、1、2、3)


这些视频模式不起眼,与标准的ZX-Spectrum 128视频模式完全没有区别,显示的是带有属性着色的所选处理器模块的当前视频页面。 系统启动后立即激活模式0,即 显示主模块(CPU0)的视频页面。


标准ZX模式下的ATW2


ZX-Poly 256x192(模式4)


此视频模式根本不使用属性区域中的任何数据。 每个模块的像素位与其他模块的像素数据组合在一起,生成的四个位用于生成色彩亮度YRGB信号。


每个模块负责其组件:


  • 模块0(主模块)为绿色(绿色)。
  • 红色(红色)的模块1
  • 蓝色模块2(蓝色)
  • 亮度模块3

彩色版本


如果您在这种模式下启动不适合的游戏,它将只是黑白的。
不适应的游戏


ZX-Poly 256x192,带INK + PAPER遮罩(模式6)


像上一个一样,它为每个点提供16种颜色,但是有一个“技巧”。 在某些ZX-Spectrum程序中,使用属性中相同的INK和PAPER值隐藏图形元素,尤其是在滚动游戏中。 如果删除此机会,则图形元素将开始堆积在屏幕上,从而破坏图像。 因此,将根据从视频存储器(CPU0)读取的主模块的属性来分析INK和PAPER的状态,如果它们相同,则所有点都将使用从INK / PAPER中获得的颜色突出显示(当然要考虑亮度)。



ZX-Poly 256x192,具有FLASH + INK + PAPER遮罩(模式7)


模式是模式4和模式6的组合。对于主模块(CPU0)的可读属性,将分析FLASH位,如果将其设置(在运动场上的动态游戏中很少见),则在模式6模式下显示8 x 8像素块(并使用相同的墨水和纸张进行遮罩)。 如果重置了FLASH,则该块将显示为常规ZX-Spectrum。 FLASH位没有直接作用,因此不会闪烁。
此模式非常方便,可以避免重新绘制游戏信息面板和某些游戏内效果(例如,当游戏开发人员通过属性在游戏场上闪烁时)。


动画改编的飞鲨


具有属性的ZX-Poly 512x384(模式5)


属性的使用方式与原始平台几乎相同,没有任何更改(即使是FLASH位)。 每个模块的视频像素数据都用该模块的视频存储器中的属性进行着色,并且在着色之后以棋盘状模式显示,因此一个熟悉度块是16 x 16点。


国际象棋的形成


此模式使您可以在不更改可执行代码的情况下将应用程序的分辨率提高一倍。 的确,使用同一游戏“木偶奇遇记”进行的实验表明,在具有大量细节的明亮游戏中,效果不明显。 由于这些都是虚拟像素,因此游戏对此一无所知,并且游戏元素的最小可能移动为两个虚拟像素的水平。 我认为此模式适合在熟悉的地方放置小游戏物体的游戏。


游戏“木偶奇遇记”的示例


- , ZX-Word, .


改编的ZX-Word



, , . SIMD , , "" . , " " — .



, , "". , .



RESET


RESET , . JP ADDR .


-


master- (CPU0). , ( M1), WAIT, RESET. , , 16 .



2007 JavaSE . Z80 ( -) FDD 181893. JDK 1.8+ .



ZX-Spectrum , 80% , . ZX-Spectrum 128, Options->ZX 128 Mode , ZX-Poly .


-, ZX-Spectrum — . , File->Options


ZX-Poly test ROM


如果游戏不使用任何精灵包,则仅显示一个简单的


开发了一个引导加载程序,使用了从磁盘将数据加载到模块中并同时启动。该项目中提供了TAP和TR-DOS的代码。



与仿真器一起,开发了一个为应用程序着色的小型实用程序(也用Java编写)。


ZX-Poly


整个项目GNU GPLv3许可GitHub上发布



Source: https://habr.com/ru/post/zh-CN472232/


All Articles