The following was a change log of the CCI "tahoe" porting. 04/27 Rewrote fixmask.c to properly preserve r6 and r7. This method used should have been used for the Vax; as it was, one had to count the number of register variables declared in a function, and fixmask rebuilt the savemask from scratch. This was a little bit kludgey; the new version simply OR's in the two registers into the mask. 04/29 Replaced assembly version of exarith() with exarith.c from the 68k port, with the call to emul() replaced my an asm(). Still slower than original vax. 05/02 Repaired fixpbig.e, the sed(1) script that replaces certain function calls with inline code and fast subroutine calls (the vax "jsb"), as well as changing all references to "np" and "lbot" to r6 and r7. The fast calls are gone, because the tahoe isn't capable of such things. The rest were changed to reflect different calling strategies. 08/29 Added an "#ifdef tahoe" to alloc.c which uses the original "ftstbit" and "setbit" macros included in the source. The vax version uses asm()'s, but I don't know the instruction set of the tahoe well enough to improve on the macros' code. 09/04-09/08 Replaced more functions from bigmath.c with C versions from the 68k port. ediv() and emul() calls were replaced with more asm's. Others were moved into their own source files and used as they were. 09/10 Replaced Pushframe() and Iretfromfr(). The original Pushframe depended on being called by a jsb. The new version makes the best of what it can get from the standard call frame, and changes it around to match what's needed (as specified in frame.h). Iretfromfr() was moved from frame.c, and had asm's added to replace the qfunction it called. This basically just undoes Pushframe(). 09/10 GOT RAWLISP RUNNING! Version as of this afternoon would print a banner and allow one to eval a few S-expressions. Problems seem to include: stringing back through the stack frames, ediv reserved opperands, who knows what else. 09/18 Ediv requires that all of its arguments be registers. (Except for the divisor, I think.) Very poorly documented. (as(1) doesn't compain. adb(1) disassembles it properly. The architecture manual gives no indication of this.) Now one can type numbers into the reader without getting a core dump, and even do simple fixnum arithmetic. 09/18 Due to a typo Iretfromfr() was putting the old value of fp into r12 and not restoring fp at all. I don't yet know what problems this was causing. 09/18 /lib/c2 is optimizing away the "fixpbig.e" substitution of calls to sp() ==> "movl sp,d0". Since "sp" is not a valid second argument to subl3 (again no assembler complaints), another illegal instruction core dump occurrs. Fixed by replacing "movl sp,d0" with "moval (sp),d0". 09/18 I can't figure out WHAT ediv's opperands are allowed to be. I'll just fix those asm()'s until everyting works. 09/18 Bignum division problems: ;; On a vax: Franz Lisp, Opus 38.79 -> (quotient 999999999999 25) 39999999999 -> ;; On the tahoe: Franz Lisp, Opus 38 -> (quotient 999999999999 25) 198085033769738295431766579 -> 09/18 /lib/c2 was optimizing away another set of asm() constructs - in this case the setting of r0 to the error frame location. "retfrom.s" is the new, replaced version of Iretfromfr(). 09/23 the ER% variables are not being correctly set to nil. Cf. "sysat.c". Created raw.l to setq them, and discovered in the process that semicolon hasn't got its readmacro properties set up right. Flonums don't print correctly (always as ".0") but seem to be capable of being added and comparred correctly. 09/24 Went through lots of code and found that the ER% variables ARE being set correctly. The garbage collector, however, seems to be trying to trash them and return them to the freelist, therefore their value cells are being turned into freelist pointers. Removing the sweep phase from gc1() seems to remove both this problem and the spontaneous readtable disappearance. The 'ftstbit' and 'setbit' macros are suspected as being the culprits. 09/24 Still suspecting something about the marking phase of gc1(). The dumps looked awfully suspicious. 09/25 The marking phase, and in particular the bitset macros, were probably indeed at fault. The macros used the ordinary Motorola-type non-reversed byte order, while the code that read the bitmaps had been rewritten since they had, and used the Vax reversed byte order. Rewrote the macros to no longer use bytes. 09/25 Created "snlisp", the totally interpreted version of Franz. Works fine except for the previously known bignum division bug and for cfasl'd functions. 09/26 Fixed cfasl'd function error. callg_() was pushing its arglist onto the stack in reverse order. 09/30 Reworked int:showstack, and added it to snlisp. A real mess (even worse than it was before for the vax). 09/30 Fixed the bignum division bug. In mlsb() a function call was incorrectly translated into an asm("ediv..."). This is the last known Franz bug as of now. 10/23 RCS'd Liszt, and conditionalized it for the tahoe. Should work identically as before, as a VAX cross-compiler. As a tahoe native compiler, it still needs some work. 11/08 Discovered that a problem with Liszt was that fixnum subtractions were not being done properly due to a ***SEVERELY BRAIN DAMAGED BROKEN EMUL INSTRUCTION***. Turned faulty emul instructions into calls to emul() which replaces the sign-extend-and-add functionality of the emul instruction with a manual 64-bit add. Bignum divisions resulting in a negative number were broken too. 11/10 Changed predecrement and postincrement modes in the compiler to make up for the lack of same in the Tahoe instruction set. 11/13 ** Found that the emul instruction problem was present only in the old WCS**. When the machine was rebooted this afternoon the problem went away. Calls to emul() will be turned back into asm's. 11/14 Changed Lfasl() so that relocation of addresses works when an address is not longword aligned. Also cleaned up the indentation. 11/16 Fixed Liszt and changed qlinker() to change the method of function linkage, again because of alignment problems. 11/18 General repairs to fasl.c, and fixed a stupid quotemark typo (on my part) in Liszt. Tried to port /usr/lib/lisp/autorun/tahoe. 12/5 Made various changes to liszt. Output works mostly most of the time, but some things (read: nliszt) dump core. 12/8 Fixed liszt and qfuncl.c to remove shal instrucitons with negative arguments, since these indescriminately mess up their opperands somehow. Also changed subl2 in /usr/lib/lisp/autorun/tahoe with destination sp, because subl2 doesn't seem to work on r14. r14 doesn't work as a source opperand to movl either. Beats me why, I just fix 'em 'till they work. 12/11 Looking for a bug which causes nliszt to bomb on any functions with more than one argument. 12/13 Above bug was caused by yet another missed postincrement instance. Moved the postincrement handling around. Also ported code to handle &form variable arguments. 12/14 Repaired code for (\\ x y)... compiled output did an ashq and an ediv on an odd register. 12/16 Fixed a missed register save mask in one of the qfuncls. Added a missed ".align" to the code that handles &forms. 12/17 Added r12 to qlinker's save mask. Added register mask for local functions since they are now being called with calls's. 12/18 Added register save masks to local functions. 01/12 The _tynames table didn't have a necessary ".align 2" before it. This was messing up compiled functions that called typep (causing align faults).