为ZX-Spectrum创建1k简介混沌


最初,我不打算在Chaos Constrictions 2018上进行演示,但是,在抄送 2-3周前, 意识到我无法空手参加演示,并决定为386 / EGA / DOS写一个简短的演示。

我在DOS下的Turbo-C中编译了我的lib AnotherGraphicsLibrary库 ,该库非常适合EGA模式的节拍计划结构,我对制动器,尤其是EGA制动器感到失望。 在这个非常有限的时期内,以我希望看到他的形式进行的演示是不可能的。

但是,我不能放弃,什么也不做。 然后我想起了很久以来我一直想参加ZX-Spectrum演示比赛。 而且由于去年我获得了两个48k雷亚尔,因此可以通过创建演示获得一些乐趣。 顺便说一句-对我来说,编写演示的最重要的事情是在现实生活中进行测试, 乳化剂不能从过程中获得如此快的乐趣,当代码下一次更改之后,将演示上传到真实环境时,当您看到真正的硬件如何对字节进行混洗时,这真是一种美妙的感觉。记忆绘图效果。

由于我只有48k实数,因此我决定为48k进行演示。 而且由于时间有限且缺乏任何开发,因此只能选择创建1k简介 (演示仅为1 KB,即1024字节)。

上一次,我在EmuZWin戳入 z80 asm是一个出色的内置汇编器模拟器。 但是不幸的是, EmuZWin不能在Windows XP或更高版本上运行 ,或者它有故障。
在研究了各种选项之后,我停了一大堆Unreal + sjAsm + Notepad ++程序,在我看来,就方便性而言,它们 EmuZWin 容易得多 ,但相比之下,它们还活着。

在撰写此简介时,我在源代码中进行了一个开发日志,并根据该日志编写了以下文本:

世界您好!

z80 asm经验几乎为零的情况下,我应该首先写什么? 没错,对于其中一种效果,5x5子画面的输出是熟悉的或40x40像素(具有讽刺意味的是,在将来,为了适应1k的效果,未完成的部分被排除在介绍之外)。

令人惊讶的是,使用Down HL使用预先生成的行地址标签,从头开始执行此操作非常容易。

哦,索引寄存器,它们有多方便,但是速度较慢,实际上消耗了条形图。 我不得不把它们的使用扔掉。

还是在这里,一开始我就遇到了令人难以置信的sjAsm故障,或者说是最新版本。 虚幻中的虚幻主义显示出绝对疯狂的命令序列。 我下载了倒数第二个版本-已经可以以某种方式使用它。



很明显,您不能将足够数量的先前绘制的精灵放入1k,所以我决定动态生成它们。 并非如此,而是使用多边形进行绘制。

因此,我编写的第二个过程是绘制三角形的过程。 在大多数情况下,这是他们自己使用C语言编写的代码的移植C版本唯一的全局差异是,首先生成多边形扫描线,然后才在这些扫描线上绘制它们。

使用高级语言后,您可以从jr aka goto获得一些乐趣:

.sort_me_please: ld de,(tr_x2) ld bc,(tr_x0) ld a,d cp b jr nc,.skip1 ld (tr_x2),bc ld (tr_x0),de .skip1: ld de,(tr_x1) ld bc,(tr_x0) ld a,d cp b jr nc,.skip2 ld (tr_x0),de ld (tr_x1),bc jr .sort_me_please .skip2: ld de,(tr_x2) ld bc,(tr_x1) ld a,d cp b jr nc,.skip3 ld (tr_x2),bc ld (tr_x1),de jr .sort_me_please .skip3: 

事实证明,它是在合理的时间在z80 asm上编写了一个有效的draw_triangle ,使我感到有些震惊,它在连接多边形时逐个像素地绘制了一个多边形并且没有孔。


你好三角形!

微粒



由于屏幕线标签生成器的存在,我使用此标签编写了一个相当弯曲且缓慢的点输出过程。 该过程有两个入口点-只是像素的逆,而像素的逆是用INK + BRIGHT +和其中一个寄存器中指定的颜色填充像素。

在用粒子创建效果的阶段,我发现维基sjAsm中具有示例结构的示例不起作用。 谷歌搜索从zx-pk.ru站点提出了一个主题,在此描述了此问题,并且没有解决方案-哈,很好-另一个故障。

我决定清楚地做所有事情-通过中断来更新坐标,而不考虑渲染。 是的...加上字节以生成中断表。

在此阶段,粒子很少,它们几乎无法放入框架中-顺便说一句,这是我输出%点的过程很慢))但是使用带有子画面的公用表并不能让我把它扔掉并准备好,因为 仅需一个表生成器,就大大节省了空间。 我也很喜欢自行车:)

粒子太少了……增加了它们的数量,但是现在渲染已经变成了两帧。


Peters WS64上进行测试,这是我上次使用cc并于今年冬天修复的:)

顺便说一下,就像在Commodore 64上一样,这些点已经在这个阶段变成了粗体的水平点2:1 。 之所以发生这种情况,是因为最初的粒子数量很少,而且我不满意这样的事实,即在现实生活中运行时它们几乎是不可见的。 通过更换盘子解决了问题

 db 128,64,32,16,8,4,2,1; 



 db 192,192,96,24,12,6,3,3; 

这会降低定位的准确性,并使飞行过程有些生涩,但能见度却有所提高。 在这里,还起作用的是粒子从上到下掉落-它们的视线垂直涂抹。

粒子偶然以各自的随机速度掉落,两个字节用于存储Y坐标。

精灵

我扔掉了精灵部分的未完成部分,意识到自己无法适应1k

此外,空间已经不足,所以我想起了Introspek关于打包程序精彩文章 ,我选择了zx7作为打包程序,它节省了大约110个字节。 顺便说一句,也许有人知道一个更适合1k介绍的打包程序?

混沌构造



由于我已经有一个输出多边形的过程,所以将cc徽标拆分为多个多边形并逐个显示它们似乎是一个不错的主意。

我写了一些显示几个多边形的测试代码-一切都按我的预期工作-很好。

为了检查我的想法是否适合1k ,根据估计,生成了一定数量的随机多边形,并为徽标生成了足够数量的徽标,并将其带到了源头。 已编译,并确保以这种形式-出色-简介适合1024字节的限制。


生活照,您能识别桌上的设备吗? :)))

我决定再次测试半成品的介绍文件,该介绍文件已经带有多边形,并且有一个打包器,已上传到真实的文件中,并进行了重置。 首先,我开始犯了一个错误,那就是我忘记在某个地方初始化内存,从那里,在0x00仿真器上一切正常,在现实生活中存在导致重置的垃圾。

没有找到比找出问题的地方更好的方法了,我无法提出半分割法。

进行了两个小时的真实复位,无法定位故障...
事实证明,它不在我的代码中,而是在我加载WAV的电话中随附的声音增强器中 。 来自WAV文件中的位流的改进程序生成了ir妄流。

我一关掉,一切就神奇地工作了。

他在errorsoft greenpixel图形编辑器中概述了徽标,将徽标分成多个三角形,然后手动将坐标驱动到源。 将Chaos Constructions徽标完全塞满并在现实生活中运行它-我很高兴-它看起来还不错。


第一个徽标实际显示

但是,我填充的随机多边形太少了,在真实徽标上,每150个字节限制为1k 。 尽管存在粒子效果仍未完成,并且各部分之间的过渡非常尖锐的事实,但这仍然没有实现。

那天上床睡觉,由于小故障,结果早在上午8点8分)

是的,我尝试通过分别存储坐标和顶点索引来优化大小,但是打包程序不太喜欢它,这使得大小只会增加。

决赛



我想出了如何使徽标输出多样化的方法,为此,几乎只花了两个像素标签:

 fake_points1: db 1,2,4,8,16,32,64,128; 1 ch fake_points2: db 32,8,128,2,16,1,64,4; 2 ch normal_points: db 128,64,32,16,8,4,2,1; 3 ch 

这给增加了渲染徽标的细节带来了很酷的效果,或者最初缺乏细节,而清晰度逐渐提高。

最后,我制作了所有过渡的最终版本,扔掉了所有东西。 在此过程中,我在绘制三角形的过程中发现了一个小故障-如果两个顶点具有相同的Y坐标,则将三角形绘制为弯曲形状(在计算dx时看起来像除以0),并绕过了临时hack。


在列宁格勒48测试最终版本

尺寸优化


两位数字是“额外字节”

94个额外字节...

削减“文化”保存/恢复输入/输出程序的寄存器的时机已经到来,尽管这是必要的,但到处都是,但是记忆正在消耗。

86个字节...

经过实际测试-有效! 他节省了更多的内存,同时修复了0-63字节除以的错误!

57个字节...

添加循环。

 random_store: start: 

顺便说一下,循环是在拆包级别完成的,因为 作为RNG的熵源,使用了初始化代码中的几个字节(以节省空间), RNG在第一部分中破坏了这些字节。 因此,对于循环,在介绍结束之后,先进行ret ,然后再进行另一次解压缩并转换为解压缩的代码...

无法摆脱最后的4​​8个字节,我不得不删除中断处理程序,但是万岁! 塞! 甚至剩下1个额外的字节。

而且,由于没有中断,因此可以对帧进行评分,并且很难在一个像素处看到光束横截面,因此我增加了每只眼睛的粒子数量,同时在速度和娱乐性之间做出了折衷。

将代码和数据从一个地方移动到另一个地方更加困难,愚蠢,这对打包人员有所帮助。 这花了一些时间:)

这释放了大约10个字节 ,我在其中模仿了声音。 KHK,KHE,声音-在某些地方,通过插入耳朵即可:

  ifdef UseSound ld a,d and #10 out (#FE),a endif 

我没有“钉住”声音,但做了一个定义,因此获得了两种版本的简介,有声或无声。 在没有声音的情况下,“多余”字节被塞满

 db 'e','r','r','o','r' 

我收集了trd点击 ,并将其全部上传到cc网站。

Hooray-我正在参加demopati!

后记

原来,声音听起来很有趣,拍子上有人说“清晰的声音”,有人奇怪地看着我,在pouet上我发现了以下内容:



这:



总的来说,我不明白是否有人喜欢10字节的声音:)

最后一点-很遗憾,今年没有举行1k竞赛,我认为这项工作很不错,但是很难与640k竞争,但我真的很想参加比赛。

写演示,写1k!

这就是最后的结果(ps,请注意耳朵):



静默版本:

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


All Articles