Lotus 1-2-3任意分辨率

2021-03-03 02:04:00

我倾向于使用大量的复古软件,部分原因是因为我是个书呆子,还因为我只喜欢在终端上工作。有大量用于MS-DOS的主要商业软件产品经过了高度抛光,并且在今天的xterm中仍然可以有效使用。

我确实喜欢使用Lotus 1-2-3,甚至还提供了最新发行的DOS版本4的盒装副本!

事实是我在作弊,确实可以,但是仅支持标准文本模式分辨率。如果您的终端不完全是80列宽,那么它将在屏幕上造成很大的丑陋混乱。

有一种解决方法,只需键入stty cols 80,它将被限制在您的终端的一部分中,看起来有些难过。没有办法显示更多的列,而最大化您的终端将无济于事。

我想知道其他人是否仍然使用123,以及他们是否找到了解决方案。我喜欢使用它,但仅限于如此小的工作区域确实是一件令人讨厌的事情。

不幸的是,答案是没有人能解决我的分辨率问题,但我确实发现了一些有趣的东西……

我在1993年的PC工作站Epson Endeavor上找到了这本旧手册,该手册声称与实用程序磁盘一起分发,该实用程序磁盘在1-2-3中启用了100x31文本模式。

我能够在旧的ftp站点上找到驱动程序。遗憾的是它们没有工作,大概需要一个真正的Cirrus Logic VGA卡,但是这些驱动程序确实存在的事实使我感到好奇。 123可以在内部生成任意大小的画布似乎是合理的,它只是问显示驱动程序它想要什么分辨率?

我知道dosemu可以模拟任意文本模式的分辨率,并且某些DOS软件可以使用它。我可以编写一个dosemu显示驱动程序,而123只能在全屏xterm中工作吗?

不幸的是,显示驱动程序API相当复杂,我认为要弄清楚反汇编程序和调试程序可能要花一些时间。更为复杂的是,123使用了一种称为覆盖的技术(例如软件库切换),该技术使我正在使用的调试器感到困惑,因为只要发生覆盖切换,它就会丢失断点!

我认为Lotus一定已经向Cirrus Logic发送了一些文档来编写驱动程序,也许该文件仍然存在,可以为我节省一些时间。

我学到了很多有关Lotus外接程序生态系统以及它们如何工作的知识。我以为我会下载所有可以找到的驱动程序和加载项,我将开始逆转最简单的驱动程序和加载项,然后继续前进,直到我足够了解自己的知识为止。

如果您想阅读可用的商业插件,则这篇文章很有趣。

信不信由你,旧的Lotus ftp站点仍然在线。我将他们必须拥有的所有内容都镜像到我的工作站上,并进行了筛选。

Lotus 1-2-3已移植到许多系统上,包括OpenVMS,Xenix甚至System / 390。 1991年,Lotus在SPARC上发布了适用于SunOS4的版本。

几年后,一位Lotus工程师上传了XALERT组件中的文件管理错误补丁,该补丁影响了1.2更新。幸运的是,他们忘记了删除STABS数据,而留下了令人难以置信的丰富调试数据。

typedef short int lmbcs_type; typedef short int平台; typedef short int memory_type; struct envblk_ {/ * size 68 id 9 * / short int envsize; / *位元大小16,bitpos 0 * / short int pfid; / *位元大小16,bitpos 16 * / short int csid; / *位元组16,bitpos 32 * / short int pad; / *位元大小16,bitpos 48 * / short int映射; / *位元大小16,bitpos 64 * / short int类型; / *位元大小16,bitpos 80 * / mptr nulh; / *位元大小32,位元组96 * / long unsigned int maxsize; / *位元组32,位元组128 * / unsigned char * applid; / *位元大小32,位元组160 * / lhdl gabinfo; / *位元大小32,位元组192 * / char * regfile; / *位元大小32,位元组224 * / mptr(* get)(/ *未知* /); / *位元大小32,位元组256 * / short int(*免费)(/ *未知* /); / *位元大小32,位元288 * / lhdl(* map)(/ *未知* /); / *位元大小32,位元组320 * / void(* unmap)(/ *未知* /); / *位大小32,位位352 * / lhdl(* alloc)(/ *未知* /); / *位大小32,位位384 * / short int(* dealloc)(/ *未知* /); / *位元大小32,位元组416 * /短uns​​igned int(* load)(/ *未知* /); / *位大小32,位位448 * /短uns​​igned int(* unload)(/ *未知* /); / *位元大小32,位元组480 * /短uns​​igned int(* syscall)(/ *未知* /); / *位元大小32,bitpos 512 * /}; typedef struct envblk_ / * id 9 * / envblk; typedef long int LpiSTATUS; ...

这是唯一一个在整个ftp上留下任何调试数据的文件(请相信我,我已全部检查了它们)!

现在,该文件用于不同的体系结构,操作系统,编译器,发行版,并且是一种过时的格式。但是,它包含的有关驱动程序API的线索非常宝贵,为我节省了很多时间。

该文件太旧了,以至于要读取数据,我不得不找到仍然支持a.out-sunos-big的较旧版本的binutils。幸运的是,这种方法行之有效,并且能够重建大量有用的数据。

运气还不错,我在一个旧的SUNET归档文件中为Siemens Highprint 7400找到了一个第三方打印机驱动程序。值得注意的是,其中保留了一些古老的Codeview调试数据。

这是一位女士出于某种原因用新的Highprint 7400打印一些rochschach测试的照片。

调试数据太旧了,我很难找到可以解析它的工具。数据的版本代码为NB02,这意味着它们可能使用了1988年左右发布的link.exe版本5。我尝试使用TDUMP,CVDUMP甚至SYMDEB,但没人认出。最终,我确实找到了足够旧的Codeview版本可以读取它,但是除了“打印”您的待办事项之外,它无法将输出保存到文件中,并且该待办事项还不足以容纳所有数据!

我必须编写一个DOS仿真器脚本才能一次将数据刮出一页!我无法告诉您我花了多少时间来工作,但这是值得的,它为DEVPRIM(设备基元)API的工作原理提供了一些有价值的提示。

公开对象:_DVTBL!*符号:L13PSI74!* 3CD5:016E struct psd3CD5:006E struct GdvEntryTbl1_ pcf3CD5:01DC unsigned int print_head_height_dots3CD5:000A char grph_init_string [] 3CD5_str_C in_gr_res__20_016 [] 3CD5:0050 char last_grph_lf_str [] 3CB1:001C unsigned char far * graph_data_ptr3CD5:0064 char gr_eog_str [] 3CD5:0006 unsigned long graph_data_size3CD5:0000 unsigned int scan_width3CD5:001E unsigned int stripNum3AC8:0006 unsigned int PROC hmu_len() 0008] unsigned char far * lmbcs_str_buf [BP + 0006] unsigned int lbuf_len [BP-0006] unsigned int return_hmu [BP-000A] unsigned char far * bundle_ptr [BP-0004] unsigned char far * orig_ptr3AC8:0148 void PROC finish_down() [BP + 0006] unsigned int distance3CB1:000C char max_feed [] [BP-0006] int i [BP-0004] unsigned char far * p3AC8:01A4 int PROC graphics_init_printer()

有了这些数据,以及在IDA的一个周末,我就能弄出大量的API。获得一个有效的工具链是很痛苦的,但是我最终能够生产出Lotus可以加载的东西。

我想我一定是三十年来第一个编写Lotus 1-2-3驱动程序的人!

我的驱动程序实际上没有执行任何操作,但是当我响应声称支持256列的设备信息请求时,我在日志中看到它向我发送了一个LMBCS字符串来进行解码,如下所示:

ENTER WriteLmbcsStringWithAttributes,调用方15f:6c7dlotdemu.c:291:TRACE字节长度238lotdemu.c:293:TRACE attrs 000lmbcs.c:104:TRACE translate_lmbcslmbcs.c:106:TRACE maxdst 256lmbcs.c:107:TRACE maxsrc 238000000:20 20 41 20 20 20 20 20 20 20 20 20 42 20 20 A B000010:20 20 20 20 20 20 43 20 20 20 20 20 20 20 20 20 44 C D000020:20 20 20 20 20 20 20 20 45 20 20 20 20 20 20 20 E000030:20 46 20 20 20 20 20 20 20 20 47 20 20 20 20 20 F G000040:20 20 20 48 20 20 20 20 20 20 20 20 20 49 20 20 H I000050:20 20 20 20 20 4a 20 20 20 20 20 20 20 20 4b 20 J K000060:20 20 20 20 20 20 20 20 4c 20 20 20 20 20 20 20 20 20 L000070:4d 20 20 20 20 20 20 20 20 4e 20 20 20 20 20 20 20 M N000080:20 20 4f 20 20 20 20 20 20 20 20 50 20 20 20 20 O P000090:20 20 20 20 51 20 20 20 20 20 20 20 20 52 20 20 Q R0000a0:20 20 20 20 20 20 53 20 20 20 20 20 20 20 20 54 S T0000b0:20 20 20 20 20 20 20 20 55 20 20 20 20 20 20 20 U0000c0:20 56 20 20 20 20 20 20 20 20 20 57 20 20 20 20 V W0000d0:20 20 20 58 20 20 20 20 20 20 20 20 59 20 20 20 X Y0000e0:20 20 20 20 20 5a 20 20 20 20 20 20 20 20 Z转换后的字符为238lotdemu.c:209:TRACE WriteStringToFramebuffer

大量的黑客攻击之后,我现在确实有了一个可用的driver剂量驱动程序,可以支持任意分辨率,只需查看所有这些专栏即可!

我对API足够了解,我想我可以添加libcaca支持以使文本模式图起作用,但这是另一个周末的项目!

我将所有注释和代码都放在了网上,这样即使其他人使用123 DOS的可能性极小,他们也不必重复我的所有工作!