修复了Commodore Basic中最古老和最具爆破的错误

2021-04-01 19:55:35

我们再次能够享受来自Bitshifter的另一个招待员,因为他修复和增强了Mega65的C65 ROM:

Ahuge部分在MEGA65上工作的,其中包含操作系统的Thisident部分和基本口译员,ISDebugging。不计算字符集,源代码编写了45gs02汇编程序,具有大约30000行,分为主机核,编辑器,DOS,基本和图形。 TheDebugging是必要的主要是有两个原因:1)程序员,开发人员,软件工程师是人类。 2)一个源代码,即不是你自己的,充满了陷阱,副作用和假设,那个人不知道。当然,我自己的代码也充满了Trapsand副作用,但我知道它们(至少在下几个月)。

虽然在ROM上工作,修复了Commodore错误,优化了代码以获得扩展的readree空间,并引入新功能(以及有时是新的错误),我在现有代码上编写了一些百分点的汇编代码和makechanges。有时这些变化似乎是workperfectly,有些结果崩溃和冻结,因为错误似乎只在我自己的测试中工作很好,但如果开发出版社“Ubik”演示了代码ancothandle的情况。好吧,我不会讲一个长篇小说,我是如何调试的,但直接到标题中提到的错误。我在VIC-20,C64和LooseTet / CBM系列中使用的基本表达到Basic 2.0,似乎从未检测到的,记录员已修复。它与临时字符串有关,临时字符串的堆栈OFESCRIPTORS,具有3的大小,以及ICALLED“垃圾收集”,其实际上没有Collectarbage,但是串通存储的碎片整理。

TheItnerPreter需要6个临时字符串,这些是字符串,依据杂志中的两个字节“垃圾”字,以创建生成的永久字符串,标记为黄色的“后链接”字。

每次,在修改字符串或新分配的情况下,它会通过替换其后链接,将旧字符串标记为“垃圾”,该链接指向垃圾字,这是垃圾字的垃圾字,这是长度该字符串,后跟$ ff(高字节$ ff永远不会显示为反向链接的一部分,因为字符串内存中的最高地址是$ f6ff,因此它是安全的,使用此值作为标志)。

具有很多字符串活动的内容,从顶部($ f6ff)到底部(阵列空间顶部)的占用字符串空间,将迅速充分,如果没有更多的空间来创建新字符串,则碎片整理例程呼叫被触发。在屏幕内存顶部的轨道,并将所有字符串复制到相邻地址,跳过GarbageStrings。执行此操作是必要的,以更新描述符的字符串指针。这是反向链接的目的:将汇集到新地址的字符串后,后退链接用于查找中文符号,并且描述符的两个指针字节获取NewAddress。 TE描述符可以驻留在标量空间中,例如,对于可行的像AB $,或在阵列空间中,例如XY $(i,j)或它可以是ZERO页面中的描述符堆栈上的ATIMPORY描述符。那是,臭虫潜伏在哪里。描述符堆栈在零页中长度为9bytes,因此为3描述符有3个描述符.Aditionally我们有一个stackpointer,它在使用中有四个有效值为0,1,2或3个描述符。我们有一个名为变量的滞留变量,这指向最后一个临时描述符,它被使用toallocate一个字符串。这是一个优化工具。当一个字符串是需要的,它是最后一个字符串,所分配的字符串,可以通过长度(背部链接的plus2)更新到使用的字符串内存的点,而不是仅将字符串标记为垃圾。这方法可以减速填充字符串记忆的速度和让碎片整理的速度不太经常发生。

因此,Thelow字节具有值,即初始化Atpower,或者具有以前使用的价值。此使用可以for表单是程序的加载,因为这涉及FileName的StringHandling,因此使用描述符。

SOIT可能发生,即流行中的例程,其中来自对齐的人堆栈的值,将当前指针与鹿茸,seesequality进行比较,并决定不将字符串标记为垃圾,而是将指针兑换为可用字符串内存。这是一个错误,如果allptvalue来自以前的用法,并且未在TheCurrent语句中设置。唉,它在99.9%的案件中没有后果,因为在一份声明结束时,无论如何,所有临时的职业标志都是释放的。在满足条件下,错误可以驱动错误的错误:

然后,真的很少会发生罕见的事件:垃圾收集在一个复杂字符串公式的中间触发了堆栈上的临时标记。垃圾收集是了解的,也了解他们的字符串并更新其字符串并更新目录,但如果由于afAlse速度比较,其中一个描述符释放了他的字符串,则他的字符串位于GarbageCollection区域之外,不会更新。这导致陌生人发生。 Descripror现在具有指针,它对有效字符串并不值。所以整个链接和返回Linksis腐败的系统。为了使错误狩猎更有趣,这种腐败点通常没有明显伤害,直到下一个垃圾收集,或者在它之后收集,但每个都会使错误更差,直接链接出现在屏幕内存中或围绕冻结或冻结的字符串。

而不是第一部分,设置低字节,被遗忘。 BTW,HOOLY字节始终为零,因为描述符堆栈驻留为零页面,因此此使用高字节是冗余的。 IFound此错误在Commodore Basic的所有版本中,即Iinvestigated,VIC-20,C64,C128,C65,Mega65。但是,它是ubik的“11个基本”预处理器/编译器,让BEG出现。并且非常困难,因为具有繁忙的弦活动的巨大节目可以激活它。

SOTHE Old Programmer的谈话是真的:您只能在程序中找到培养型错误!总是有UltimeError,它仍然未被发现。