991-ES是学生时代经典的计算器之一。许多人喜欢在计算器上用科学常数打字,事实上我们不仅可以打出任意的字符,甚至可以用用像素点拼字。
前情提要
本篇只介绍拼字的步骤而不介绍其原理,有兴趣的朋友可以前往计算器论坛或者fx-es(ms)贴吧了解更多。
拼字的步骤大概分为3步:
1.【调为线性】将991默认的自然书写公式模式调为线性算术式的模式,因为在高级嵌套下我们无法用合理的公式实现内存数组堆栈的溢出。
2.【实现溢出】通过大神们研究发现的一个求和算式把计算器搞“崩溃”来实现溢出。
3.【输入特定操作】这时候在对应位置输入的字符都会覆盖该公式存入内存,然后再输入特定操作,结果就会在在屏幕上显示字符或者点阵,同时所有键无效。
拼字的效果示意:
有几点要注意:
默认开机键永不失效,不属于讨论范围,只要有电,任何情况都可以通过开机键重置计算器。
成功显示拼字后,由于所有键无效无法输入,等同于无响应状态,计算器会在10分钟后自动关机,字符随之清空。当然也可以按开机键来重置。
请注意计算器的输入字符编码和显示字符编码标准并不一定对应,例如按键“!”输入的“!”在最后输出并不显示“!”,输入的“!”为编号第087号,对应输出显示大写字母“W”。当涉及点阵时,会按照输入字符的二进制输出显示点,例如输入的“!”为编号第087号,二进制01010111,有5个黑点。
第一步:调为线性模式
按键顺序:SHIFT
+MODE
+2
说明:这步是991计算器溢出的必须条件,991在前身82的基础上添加了自然书写功能,但是也没有限制线性模式的计算,而这是暴露计算内存的突破口。
第二步:实现基本溢出
1.实现求和公式
按键顺序:ALPHA
+X
+ALPHA
+=
+SHIFT
+Σ
+ALPHA
+X
+SHIFT
+,
+1
+,
+1
+10^x
+9
说明:这是一个Σ求和公式。
2.实现AC BREAK
按键顺序:SOLVE
+0
+=
+→
说明:相当于求解刚刚那个求和公式,由于数学上的原因,报AC BREAK。
3.修改求和公式
按键顺序:DEL
+DEL
+DEL
+2
说明:Σ求和公式中的10^9改成了2.
4.实现SY BREAK
按键顺序:SOLVE
+=
+→
说明:再对修改后的求和公式不赋值求解,导致格式错误,报SY BREAK。
经过以上四步后,我们已经实现了基本溢出,效果就是是右键失灵,不像正常情况下那样移动。
第三步:按格式输入
1.显示层介绍
首先,在线性时我们的显示屏最多可以出入256个字符的算式,溢出后,计算机记忆中的上一层256个字符为:
X=Σ(X,1,2)空空空...空空空X=Σ(X,1,2)空空空...
即将输入的字符会按顺序覆盖上一层的每一个字符。在覆盖到第二个“X”之前输入的字符都是在最后的显示上没有效果的,可以随意输入。
输入任意字符直到按着按着光标的下一位出现了那个X时,接下来输入的字符就属于有效字符,而且不同位置搭配格式会输出不一样的效果,输入后再按一系列的键就可以把这些位置上的有效字符显示在屏幕上了。
2.输入格式介绍
在前辈的实验下,大致有几种稳定的输出:单行、四行、拼字,还有其他的非拼字现象本篇就不介绍了。
991显示屏幕分辨率为64x128。在输出字符情况下,每个字符大小16x8,刚好容下4行x16个的字符,有效字符为64个;在点阵情况下,我们无法操控设计整个屏幕,只能绘制一个25x32的点阵图案,最后会输出一个由它循环平铺填满的屏幕,这25行每行的32个点对应4个8位二进制字符,也就是25行x4个字符,有效字符为100个。
接下来的输入格式中,我们定义#
为填充字符,$
为有效字符。
A.单行格式
1.单行情况下,从X开始的16个有效字符便会转换成最后的单行字,输入格式为:
16个$
+36个#
+log
+√
+log
+√
+28个#
+x
+5
+x
+5
+n个#
(其中的按键是对数、根号、乘号、数字5)
tips:在最后输入n个
#
填充字符时,整个式子字符数量快要达到最大值之前,会有提示符小“M”出现在状态栏,这表示快要到一行256个字符的结尾了。而且在快要出现小“M”之前会出现有一个位置上的字符在不断变化,我们可以称呼它神奇字符。那个位子在各种输入格式中都在填充字符的位置上,所以对最终显示没有任何影响,但是它对于我们之后提到的寻找字符很有帮助。
2.状态栏小“M”出现后,求值操作为:
AC
+←
+=
+=
B.四行格式
1.四行情况下需要先额外操作:
从X出现后反复输入-
+√
,直到小“M”出现,按=
+=
+10个CALC
,然后再重新执行一次第二步的基本溢出
2.接下来从X开始的输入格式为:
6个#
+第一行16个$
+9
+第二行16个$
+9
+第三行16个$
+9
+第四行16个$
+9
+22个#
+4
+sin
+4
+sin
(其中的按键是数字9、数字4、三角函数)
3.不用再加填充字符,也不用等到小“M”出现,求值操作为:
AC
+←
+=
+=
C.条形码拼字
tips:条形码这个命名来自实验者在最先发现时,输入的有效字符全是同一个,所以每行的点都在同一个位置,就形成了条形码的样子。
1.条形码情况下,从X开始的100个字符便对应这25行字,输入格式为:
第01行4个$
+
第18行4个$
+第10行4个$
+第2行4个$
+
第19行4个$
+第11行4个$
+第3行4个$
+
第20行4个$
+第12行4个$
+第4行4个$
+
第21行4个$
+第13行4个$
+第5行4个$
+
第22行4个$
+第14行4个$
+第6行4个$
+
第23行4个$
+第15行4个$
+第7行4个$
+
第24行4个$
+第16行4个$
+第8行4个$
+
第25行4个$
+第17行4个$
+第9行4个$
2.不用再加填充字符,不用等到小“M”出现,求值操作为:
AC
+←
+=
+MODE
+MODE
3.输入字符介绍
前面我们提到由于并不是输入什么最后显示的就是什么,所以前辈实验出了字符对应表(也是通过神奇字符得到的)
但是我们可以发现,有的输入字符在计算器键盘上我们并无法打出,可是输出结果却很需要,比如输入的“→A”在最后输出大写字母“G”,可是我们打不出“→A”,那怎么办呢?这就需要刚刚的神奇字符了。
神奇字符和X一样,在他的上一位被输入之后就会出现,默认为编号0号。随着光标每闪一下,它的内存就会加一位(且循环)。我们也可以输入字符覆盖它,这样他就会从我们输入字符的号数开始循环。但是该位置上的字符变化成下一号对应字符的效果不会立刻出现,因为计算器显示屏只会在每次光标移动时重置显示内容而不是闪烁时。
为了利用神奇字符,我们可以输入一堆填充字符来到这个快要到小“M”的位置,在这个位置上,输入号码排在想要的字符之前最近的一个可以按键按出来的字符,然后光标每闪一次移动一下光标(最好就在这个位置的左右移动,这样既看得到字符的变化,也方便后面的删除操作)。循环到自己需要的字符时,立刻把光标退到神奇字符位置的左边,快速删除几位填充字符,这样这个字符就会随着位置改变离开了神奇字符位置,不会继续循环了,但是字符就这样固定下来了,我们就得到了一个按键按不出的符号!
接下来我们需要删除填充字符、把获得的该字符一直退回到相应位置,由但是于记忆中的上一层已经被覆盖过一次,我们就不知道那个X的位置了,因此在前面输入填充字符里可以做一些标记以便识别位置,比如起始的X填充数字0,之后填充数字1。
在字符拼字的情况下,我们只需要找到最后要输出的那些字符对应的输入字符就好了。
在表中可以发现很多输入字符对应的输出字符都是“空”。当我们的输出结果需要“空”时,强烈推荐输入科学常数14,可以通过按键,不需要用到神奇字符去寻找。
而在条形码拼字的情况下,需要先自己绘制25x32点阵的效果,竖排每8个点分为4个区域,每个区域的8个点用二进制表示,然后转换成十进制找到对应的输入字符。前辈们还曾经开发过一个专门的软件,需要的人可以到贴吧里找找。
根据稳定性,其中第01行4个字符必须输入log
+√
+log
+√
。规定这一行的字符相当于规定了这一行的点必须这样画。但这基本没影响,而且完全可以当做我们一开始就只有24x32的自由绘制空间。当然你也可以在绘画时考虑 一下如何把对数和根号对应的二进制点融入图案中去,得到没有杂点的循环平铺图案。
注意也尽量保证不要出现0号00000000和255号11111111,也就是一个1x8区域内的点全满或者全空。出现全满的情况可以在边上去掉一点,例如126号01111111和254号11111110,或者设计如何添加中间空点;全空则可以使用一个点,例如31号00100000或者63号01000000。
实操演示
暂无