Lotus 1-2-3

Imagine it or not, the outdated Lotus ftp site continues to be on-line. I mirrored every little thing they needed to my workstation and sifted by means of it.
Historical past
Lotus 1-2-3 was ported to a bunch of methods, together with OpenVMS, Xenix, and even System/390. In 1991, Lotus launched a model for SunOS4 on SPARC.
Just a few years later, a Lotus engineer uploaded a patch for a file administration bug within the XALERT part that affected the 1.2 replace. Fortunately, they forgot to take away the STABS knowledge, leaving extremely wealthy debugging knowledge.
typedef brief int lmbcs_type;
typedef brief int platform;
typedef brief int memory_type;
struct envblk_ { /* dimension 68 id 9 */
brief int envsize; /* bitsize 16, bitpos 0 */
brief int pfid; /* bitsize 16, bitpos 16 */
brief int csid; /* bitsize 16, bitpos 32 */
brief int pad; /* bitsize 16, bitpos 48 */
brief int maps; /* bitsize 16, bitpos 64 */
brief int kind; /* bitsize 16, bitpos 80 */
mptr nulh; /* bitsize 32, bitpos 96 */
lengthy unsigned int maxsize; /* bitsize 32, bitpos 128 */
unsigned char *applid; /* bitsize 32, bitpos 160 */
lhdl gabinfo; /* bitsize 32, bitpos 192 */
char *regfile; /* bitsize 32, bitpos 224 */
mptr (*get) (/* unknown */); /* bitsize 32, bitpos 256 */
brief int (*free) (/* unknown */); /* bitsize 32, bitpos 288 */
lhdl (*map) (/* unknown */); /* bitsize 32, bitpos 320 */
void (*unmap) (/* unknown */); /* bitsize 32, bitpos 352 */
lhdl (*alloc) (/* unknown */); /* bitsize 32, bitpos 384 */
brief int (*dealloc) (/* unknown */); /* bitsize 32, bitpos 416 */
brief unsigned int (*load) (/* unknown */); /* bitsize 32, bitpos 448 */
brief unsigned int (*unload) (/* unknown */); /* bitsize 32, bitpos 480 */
brief unsigned int (*syscall) (/* unknown */); /* bitsize 32, bitpos 512 */
};
typedef struct envblk_ /* id 9 */ envblk;
typedef lengthy int LpiSTATUS;
...
This was the one file (belief me, I checked all of them) that had any debugging knowledge left on the entire ftp!
Now, this file was for a unique structure, working system, compiler, launch and was a protracted out of date format. However, the clues it contained in regards to the driver API have been invaluable, and saved me a lot time.
$ file alert.so1
alert.so1: SPARC demand paged shared library not stripped
The file was so outdated that to learn the information I needed to discover an older model of binutils that also supported a.out-sunos-big
. Fortunately that labored and it was in a position to reconstruct a ton of helpful knowledge.
Right here is the full recovered data, should you’re .
Extra Luck
I obtained one other stroke of luck, I discovered a 3rd occasion printer driver on an outdated SUNET archive for the Siemens Highprint 7400. Remarkably, it had some historic Codeview debugging knowledge left in it.
Here’s a image of a girl printing some rorschach checks together with her new Highprint 7400, for some purpose.
The debugging knowledge was so outdated, I struggled to discover a software that would parse it. The information had a model code NB02
, which implies they in all probability used hyperlink.exe
model 5, launched round 1988. I attempted TDUMP, CVDUMP and even SYMDEB, and none acknowledged it. I did ultimately discover an sufficiently old model of Codeview that would learn it, but it surely had no option to save output to a file besides “printing” your backlog, and the backlog wasn’t sufficiently big to carry all the information!
I needed to script a DOS emulator to scrape the information out a web page at a time! I can’t let you know how a lot time I wasted getting this working, but it surely was price it, it gave some worthwhile hints about how the DEVPRIM (System Primitive) API labored.
Publics for: _DVTBL!*
Symbols for: L13PSI74!*
3CD5:016E struct psd
3CD5:006E struct GdvEntryTbl1_ pcf
3CD5:01DC unsigned int print_head_height_dots
3CD5:000A char grph_init_string[]
3CD5:0158 char gr_eol_str[]
3CD5:016C unsigned int col_res_num_pos
3CD5:0020 char start_grph_str[]
3CD5:0050 char last_grph_lf_str[]
3CB1:001C unsigned char far * graph_data_ptr
3CD5:0064 char gr_eog_str[]
3CD5:0006 unsigned lengthy graph_data_size
3CD5:0000 unsigned int scan_width
3CD5:001E unsigned int stripNum
3AC8:0006 unsigned int PROC hmu_len()
[BP+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_ptr
3AC8:0148 void PROC finish_down()
[BP+0006] unsigned int distance
3CB1:000C char max_feed[]
[BP-0006] int i
[BP-0004] unsigned char far * p
3AC8:01A4 int PROC graphics_init_printer()
Right here is the full recovered data.