|
|
1.1 root 1: (include-if (null (get 'chead 'version)) "../chead.l")
2: (Liszt-file io
3: "$Header: io.l,v 1.17 87/12/15 17:03:20 sklower Exp $")
4:
5: ;;; ---- i o input output
6: ;;;
7: ;;; -[Fri Sep 2 21:37:05 1983 by layer]-
8:
9:
10: ;--- d-prelude :: emit code common to beginning of all functions
11: ;
12: (defun d-prelude nil
13: (let ((loada-op #+(or for-vax for-tahoe) 'movab #+for-68k 'lea)
14: (sub2-op #+(or for-vax for-tahoe) 'subl2 #+for-68k 'subl)
15: (add2-op #+(or for-vax for-tahoe) 'addl2 #+for-68k 'addl)
16: (temp-reg #+(or for-vax for-tahoe) '#.fixnum-reg #+for-68k 'a5))
17: #+for-68k (setq g-stackspace (d-genlab) g-masklab (d-genlab))
18: (if g-flocal
19: then #+for-tahoe (e-write2 '".word" '0x0)
20: (C-push '#.olbot-reg)
21: (e-write3 loada-op
22: `(,(* -4 g-currentargs) #.np-reg) '#.olbot-reg)
23: (e-writel g-topsym)
24: else #+(or for-vax for-tahoe) (e-write2 '".word" '0x5c0)
25: #+for-68k
26: (progn
27: (e-write3 'link 'a6 (concat "#-" g-stackspace))
28: (e-write2 'tstb '(-132 sp))
29: (e-write3 'moveml `($ ,g-masklab)
30: (concat "a6@(-" g-stackspace ")"))
31: (e-move '#.Nilatom '#.nil-reg))
32: (if fl-profile
33: then (e-write3 loada-op 'mcnts
34: #+(or for-vax for-tahoe) 'r0 #+for-68k 'a0)
35: (e-quick-call 'mcount))
36: (e-write3 loada-op 'linker '#.bind-reg)
37: (if (eq g-ftype 'lexpr)
38: then ; Here is the method:
39: ; We push the number of arguments, nargs,
40: ; on the name stack twice, setting olbot-reg
41: ; to point to the second one, so that the user
42: ; has a copy that he can set, and we have
43: ; one that we can use for address calcs.
44: ; So, the stack will look like this, after
45: ; the setup:
46: ;np ->
47: ;olbot -> nargs (II)
48: ; -> nargs (I)
49: ; -> (arg nargs)
50: ; -> (arg nargs-1)
51: ;...
52: ; -> (arg 1)
53: ;
54: (if (null $global-reg$)
55: then (e-move '#.np-sym '#.np-reg))
56: (e-writel g-topsym)
57: (e-move '#.np-reg temp-reg)
58: (e-write3 sub2-op
59: (if $global-reg$
60: then '#.lbot-reg
61: else '#.lbot-sym) temp-reg)
62: (e-write3 add2-op (e-cvt '(fixnum 0)) temp-reg)
63: (L-push temp-reg)
64: (e-move '#.np-reg '#.olbot-reg)
65: (L-push temp-reg)
66: else ; Set up old lbot register, base reg for variable
67: ; references, and make sure the np points where
68: ; it should since the caller might
69: ; have given too few or too many args.
70: (e-move
71: (if $global-reg$
72: then '#.lbot-reg
73: else '#.lbot-sym)
74: '#.olbot-reg)
75: #+for-68k
76: (e-write3 loada-op
77: `(,(* 4 g-currentargs) #.olbot-reg)
78: '#.np-reg)
79: (e-writel g-topsym)))))
80:
81: ;--- d-fini :: emit code at end of function
82: ;
83: (defun d-fini nil
84: (if g-flocal
85: then (C-pop '#.olbot-reg)
86: (e-write1 #+for-vax 'rsb #+for-tahoe 'ret #+for-68k 'rts)
87: else #+for-68k
88: (progn
89: (e-write3 'moveml (concat "a6@(-" g-stackspace ")")
90: `($ ,g-masklab))
91: (e-write2 'unlk 'a6))
92: (e-return)))
93:
94: ;--- d-bindtab :: emit binder table when all functions compiled
95: ;
96: (defun d-bindtab nil
97: (setq g-skipcode nil) ; make sure this isnt ignored
98: (e-writel "bind_org")
99: #+(or for-vax for-tahoe)
100: (progn
101: (e-write2 ".set linker_size," (length g-lits))
102: (e-write2 ".set trans_size," (length g-tran)))
103: #+for-68k
104: (progn
105: (e-write2 "linker_size = " (length g-lits))
106: (e-write2 "trans_size = " (length g-tran)))
107: (do ((ll (setq g-funcs (nreverse g-funcs)) (cdr ll)))
108: ((null ll))
109: (if (memq (caar ll) '(lambda nlambda macro eval))
110: then (e-write2 '".long"
111: (cdr (assoc (caar ll)
112: '((lambda . 0) (nlambda . 1)
113: (macro . 2) (eval . 99)))))
114: else (comp-err " bad type in lit list " (car ll))))
115:
116: (e-write1 ".long -1")
117: (e-writel "lit_org")
118: (d-asciiout (nreverse g-lits))
119: (if g-tran then (d-asciiout (nreverse g-tran)))
120: (d-asciiout (mapcar '(lambda (x) (if (eq (car x) 'eval)
121: then (cadr x)
122: else (caddr x)))
123: g-funcs))
124: (e-writel "lit_end"))
125:
126: ;--- d-asciiout :: print a list of asciz strings
127: ;
128: (defun d-asciiout (args)
129: (do ((lits args (cdr lits))
130: (form))
131: ((null lits))
132: (setq form (explode (car lits))
133: formsiz (length form))
134: (do ((remsiz formsiz)
135: (curform form)
136: (thissiz))
137: ((zerop remsiz))
138: (if (greaterp remsiz 60) then (sfilewrite '".ascii \"")
139: else (sfilewrite '".asciz \""))
140: (setq thissiz (min 60 remsiz))
141: (do ((count thissiz (1- count)))
142: ((zerop count)
143: (sfilewrite (concat '\" (ascii 10)))
144: (setq remsiz (difference remsiz thissiz)))
145: (if (eq '#.ch-newline (car curform))
146: then (sfilewrite '\\012)
147: else (if (or (eq '\\ (car curform))
148: (eq '\" (car curform)))
149: then (sfilewrite '\\))
150: (sfilewrite (car curform)))
151: (setq curform (cdr curform))))))
152:
153: ;--- d-autorunhead
154: ;
155: ; Here is the C program to generate the assembly language:
156: ; (after some cleaning up)
157: ;
158: ;main(argc,argv,arge)
159: ;register char *argv[];
160: ;register char **arge;
161: ;{
162: ; *--argv = "-f";
163: ; *--argv = "/usr/ucb/lisp";
164: ; execve("/usr/ucb/lisp",argv,arge);
165: ; exit(0);
166: ;}
167: ;
168: (defun d-printautorun nil
169: (let ((readtable (makereadtable t)) ; in raw readtable
170: tport ar-file)
171: (setsyntax #/; 'vsplicing-macro 'zapline)
172: (setq ar-file (concat lisp-library-directory
173: #+for-vax "/autorun/vax"
174: #+for-tahoe "/autorun/tahoe"
175: #+for-68k "/autorun/68k"))
176: (if (null (errset (setq tport (infile ar-file))))
177: then (comp-err "Can't open autorun header file " ar-file))
178: (do ((x (read tport '<eof>) (read tport '<eof>)))
179: ((eq '<eof> x) (close tport))
180: (sfilewrite x))))
181:
182: (defun e-cvt (arg)
183: (if (eq 'reg arg) then #+(or for-vax for-tahoe) 'r0 #+for-68k 'd0
184: elseif (eq 'areg arg) then #+(or for-vax for-tahoe) 'r0 #+for-68k 'a0
185: elseif (eq 'Nil arg) then #+(or for-vax for-tahoe) '($ 0)
186: #+for-68k '#.nil-reg
187: elseif (eq 'T arg)
188: then (if g-trueloc
189: thenret
190: else (setq g-trueloc (e-cvt (d-loclit t nil))))
191: elseif (eq 'stack arg) then '(+ #.np-reg)
192: elseif (eq 'unstack arg) then (progn #+for-tahoe (e-sub '($ 4) '#.np-reg)
193: '(- #.np-reg))
194: elseif (or (atom arg) (symbolp arg)) then arg
195: elseif (dtpr arg)
196: then (caseq (car arg)
197: (stack `(,(* 4 (1- (cadr arg))) #.olbot-reg))
198: (vstack `(* ,(* 4 (1- (cadr arg))) #.olbot-reg))
199: (bind `(* ,(* 4 (1- (cadr arg))) #.bind-reg))
200: (lbind `(,(* 4 (1- (cadr arg))) #.bind-reg))
201: (fixnum `(\# ,(cadr arg)))
202: (immed `($ ,(cadr arg)))
203: (racc (cdr arg))
204: (t (comp-err " bad arg to e-cvt : "
205: (or arg))))
206: else (comp-warn "bad arg to e-cvt : " (or arg))))
207:
208: ;--- e-uncvt :: inverse of e-cvt, used for making comments pretty
209: ;
210: (defun e-uncvt (arg)
211: (if (atom arg)
212: then (if (eq 'Nil arg)
213: then nil
214: else arg)
215: elseif (eq 'stack (car arg))
216: then (do ((i g-loccnt)
217: (ll g-locs))
218: ((and (equal i (cadr arg)) (atom (car ll))) (car ll))
219: (if (atom (car ll))
220: then (setq ll (cdr ll)
221: i (1- i))
222: else (setq ll (cdr ll))))
223: elseif (or (eq 'bind (car arg)) (eq 'lbind (car arg)))
224: then (do ((i g-litcnt (1- i))
225: (ll g-lits (cdr ll)))
226: ((equal i (cadr arg))
227: (cond ((eq 'lbind (car arg))
228: (list 'quote (car ll)))
229: (t (car ll)))))
230: else arg))
231:
232: ;--- e-cvtas :: convert an EIADR to vax unix assembler fmt and print it
233: ; - form : an EIADR form
234: ;
235: #+(or for-vax for-tahoe)
236: (defun e-cvtas (form)
237: (if (atom form)
238: then (sfilewrite form)
239: else (if (eq '* (car form))
240: then (if (eq '\# (cadr form))
241: then (setq form `($ ,(caddr form)))
242: else (sfilewrite "*")
243: (setq form (cdr form))))
244: (if (numberp (car form))
245: then (sfilewrite (car form))
246: (sfilewrite "(")
247: (sfilewrite (cadr form))
248: (sfilewrite ")")
249: (if (caddr form)
250: then (sfilewrite "[")
251: (sfilewrite (caddr form))
252: (sfilewrite "]"))
253: elseif (eq '+ (car form))
254: then (sfilewrite '"(")
255: (sfilewrite (cadr form))
256: (sfilewrite '")")
257: #-for-tahoe (sfilewrite '"+")
258: elseif (eq '- (car form))
259: then #-for-tahoe (sfilewrite '"-")
260: (sfilewrite '"(")
261: (sfilewrite (cadr form))
262: (sfilewrite '")")
263: elseif (eq '\# (car form)) ; 5120 is base of small fixnums
264: then (sfilewrite (concat "$" (+ (* (cadr form) 4) 5120)))
265: elseif (eq '$ (car form))
266: then (sfilewrite '"$")
267: (sfilewrite (cadr form)))))
268:
269: #+for-68k
270: (defun e-cvtas (form)
271: (if (atom form)
272: then (sfilewrite form)
273: else (if (eq '* (car form))
274: then (if (eq '\# (cadr form))
275: then (setq form `($ ,(caddr form)))))
276: (if (numberp (car form))
277: then (sfilewrite (cadr form))
278: (sfilewrite "@")
279: (if (not (zerop (car form)))
280: then (sfilewrite "(")
281: (sfilewrite (car form))
282: (sfilewrite ")"))
283: elseif (eq '% (car form))
284: then (setq form (cdr form))
285: (sfilewrite (cadr form))
286: (sfilewrite "@(")
287: (sfilewrite (car form))
288: (sfilewrite ",")
289: (sfilewrite (caddr form))
290: (sfilewrite ":L)")
291: elseif (eq '+ (car form))
292: then (sfilewrite (cadr form))
293: (sfilewrite '"@+")
294: elseif (eq '- (car form))
295: then (sfilewrite (cadr form))
296: (sfilewrite '"@-")
297: elseif (eq '\# (car form))
298: then (sfilewrite (concat '#.Nilatom "+0x1400"
299: (if (null (signp l (cadr form)))
300: then "+" else "")
301: (* (cadr form) 4)))
302: elseif (eq '$ (car form))
303: then (sfilewrite '"#")
304: (sfilewrite (cadr form))
305: else (comp-err " bad arg to e-cvtas : " (or form)))))
306:
307: ;--- e-postinc :: handle postincrement for the tahoe machine
308: ;
309:
310: #+for-tahoe
311: (defun e-postinc (addr)
312: (if (and (dtpr addr) (eq (car addr) '+))
313: (e-add '($ 4) (cadr addr))))
314:
315:
316: ;--- e-docomment :: print any comment lines
317: ;
318: (defun e-docomment nil
319: (if g-comments
320: then (do ((ll (nreverse g-comments) (cdr ll)))
321: ((null ll))
322: (sfilewrite " ")
323: (sfilewrite #.comment-char)
324: (do ((ll (exploden (car ll)) (cdr ll)))
325: ((null ll))
326: (tyo (car ll) vp-sfile)
327: (cond ((eq #\newline (car ll))
328: (sfilewrite #.comment-char))))
329: (terpr vp-sfile))
330: (setq g-comments nil)
331: else (terpr vp-sfile)))
332:
333: ;--- e-goto :: emit code to jump to the location given
334: ;
335: (defun e-goto (lbl)
336: (e-jump lbl))
337:
338: ;--- e-gotonil :: emit code to jump if nil was last computed
339: ;
340: (defun e-gotonil (lbl)
341: (e-write2 g-falseop lbl))
342:
343: ;--- e-gotot :: emit code to jump if t was last computed
344: (defun e-gotot (lbl)
345: (e-write2 g-trueop lbl))
346:
347: ;--- e-label :: emit a label
348: (defun e-label (lbl)
349: (setq g-skipcode nil)
350: (e-writel lbl))
351:
352: ;--- e-pop :: pop the given number of args from the stack
353: ; g-locs is not! fixed
354: ;
355: (defun e-pop (nargs)
356: (if (greaterp nargs 0)
357: then (e-dropnp nargs)))
358:
359: ;--- e-pushnil :: push a given number of nils on the stack
360: ;
361: #+for-vax
362: (defun e-pushnil (nargs)
363: (do ((i nargs))
364: ((zerop i))
365: (if (>& i 1)
366: then (e-write2 'clrq '#.np-plus)
367: (setq i (- i 2))
368: elseif (equal i 1)
369: then (e-write2 'clrl '#.np-plus)
370: (setq i (1- i)))))
371:
372: #+for-tahoe
373: (defun e-pushnil (nargs)
374: (do ((i nargs))
375: ((zerop i))
376: (e-write2 'clrl '#.np-plus)
377: (setq i (1- i))))
378:
379: #+for-68k
380: (defun e-pushnil (nargs)
381: (do ((i nargs))
382: ((zerop i))
383: (L-push '#.nil-reg)
384: (setq i (1- i))))
385:
386: ;--- e-setupbind :: setup for shallow binding
387: ;
388: (defun e-setupbind nil
389: (e-move '#.bnp-sym '#.bnp-reg))
390:
391: ;--- e-unsetupbind :: restore temp value of bnp to real loc
392: ;
393: (defun e-unsetupbind nil
394: (e-move '#.bnp-reg '#.bnp-sym))
395:
396: ;--- e-shallowbind :: shallow bind value of variable and initialize it
397: ; - name : variable name
398: ; - val : IADR value for variable
399: ;
400: #+(or for-vax for-68k)
401: (defun e-shallowbind (name val)
402: (let ((vloc (d-loclit name t)))
403: (e-move (e-cvt vloc) '(+ #.bnp-reg)) ; store old val
404: (e-move (e-cvt `(lbind ,@(cdr vloc)))
405: '(+ #.bnp-reg)) ; now name
406: (d-move val vloc)))
407:
408: #+for-tahoe
409: (defun e-shallowbind (name val)
410: (let ((vloc (d-loclit name t)))
411: (e-move (e-cvt vloc) '(0 #.bnp-reg)) ; store old val
412: (e-add '($ 4) '#.bnp-reg)
413: (e-move (e-cvt `(lbind ,@(cdr vloc)))
414: '(0 #.bnp-reg)) ; now name
415: (e-add '($ 4) '#.bnp-reg)
416: (d-move val vloc)))
417:
418: ;--- e-unshallowbind :: un shallow bind n variable from top of stack
419: ;
420: #+(or for-vax for-tahoe)
421: (defun e-unshallowbind (n)
422: (e-setupbind) ; set up binding register
423: (do ((i 1 (1+ i)))
424: ((greaterp i n))
425: (e-move `(,(* -8 i) #.bnp-reg) `(* ,(+ 4 (* -8 i)) #.bnp-reg)))
426: (e-sub3 `($ ,(* 8 n)) '#.bnp-reg '#.bnp-sym))
427:
428: #+for-68k
429: (defun e-unshallowbind (n)
430: (makecomment "e-unshallowbind begin...")
431: (e-setupbind) ; set up binding register
432: (do ((i 1 (1+ i)))
433: ((greaterp i n))
434: (e-move `(,(* -8 i) #.bnp-reg) `(* ,(+ 4 (* -8 i)) #.bnp-reg)))
435: (e-move '#.bnp-reg '#.bnp-sym)
436: (e-sub `($ ,(* 8 n)) '#.bnp-sym)
437: (makecomment "...end e-unshallowbind"))
438:
439: ;----------- very low level routines
440: ; all output to the assembler file goes through these routines.
441: ; They filter out obviously extraneous instructions as well as
442: ; combine sequential drops of np.
443:
444: ;--- e-dropnp :: unstack n values from np.
445: ; rather than output the instruction now, we just remember that it
446: ; must be done before any other instructions are done. This will
447: ; enable us to catch sequential e-dropnp's
448: ;
449: (defun e-dropnp (n)
450: (if (not g-skipcode)
451: then (setq g-dropnpcnt (+ n (if g-dropnpcnt thenret else 0)))))
452:
453: ;--- em-checknpdrop :: check if we have a pending npdrop
454: ; and do it if so.
455: ;
456: (defmacro em-checknpdrop nil
457: `(if g-dropnpcnt
458: then (let ((dr g-dropnpcnt))
459: (setq g-dropnpcnt nil)
460: (e-sub `($ ,(* dr 4)) '#.np-reg))))
461:
462: ;--- em-checkskip :: check if we are skipping this code due to jump
463: ;
464: (defmacro em-checkskip nil
465: '(if g-skipcode then (sfilewrite #.comment-char)))
466:
467:
468: ;--- e-jump :: jump to given label
469: ; and set g-skipcode so that all code following until the next label
470: ; will be skipped.
471: ;
472: (defun e-jump (l)
473: (em-checknpdrop)
474: (e-write2 #+(or for-vax for-tahoe) 'jbr #+for-68k 'jra l)
475: (setq g-skipcode t))
476:
477: ;--- e-return :: do return, and dont check for np drop
478: ;
479: (defun e-return nil
480: (setq g-dropnpcnt nil) ; we dont need to worry about nps
481: #+(or for-vax for-tahoe) (e-write1 'ret)
482: #+for-68k (progn (e-write1 'rts)
483: (sfilewrite
484: (concat g-masklab " = " (d-makemask) '#.ch-newline))
485: (sfilewrite
486: (concat g-stackspace " = "
487: (Cstackspace) '#.ch-newline))))
488:
489: ;--- e-writel :: write out a label
490: ;
491: (defun e-writel (label)
492: (setq g-skipcode nil)
493: (em-checknpdrop)
494: (sfilewrite label)
495: (sfilewrite ":")
496: (e-docomment))
497:
498: ;--- e-write1 :: write out one litteral
499: ;
500: (defun e-write1 (lit)
501: (em-checkskip)
502: (em-checknpdrop)
503: (sfilewrite " ")
504: (sfilewrite lit)
505: (e-docomment))
506:
507: ;--- e-write2 :: write one one litteral, and one operand
508: ;
509: #+(or for-vax for-tahoe)
510: (defun e-write2 (lit frm)
511: (em-checkskip)
512: (em-checknpdrop)
513: (sfilewrite " ")
514: (sfilewrite lit)
515: (sfilewrite " ")
516: (e-cvtas frm)
517: (e-docomment)
518: #+for-tahoe (e-postinc frm))
519:
520: #+for-68k
521: (defun e-write2 (lit frm)
522: (em-checkskip)
523: (em-checknpdrop)
524: (if (and (dtpr frm) (eq (car frm) '*))
525: then (e-move (cdr frm) 'a5)
526: (sfilewrite " ")
527: (sfilewrite lit)
528: (sfilewrite '" ")
529: (e-cvtas '(0 a5))
530: else (sfilewrite " ")
531: (sfilewrite lit)
532: (sfilewrite '" ")
533: (e-cvtas frm))
534: (e-docomment))
535:
536: ;--- e-write3 :: write one one litteral, and two operands
537: ;
538: #+(or for-vax for-tahoe)
539: (defun e-write3 (lit frm1 frm2)
540: (em-checkskip)
541: (em-checknpdrop)
542: (sfilewrite " ")
543: (sfilewrite lit)
544: (sfilewrite " ")
545: (e-cvtas frm1)
546: (sfilewrite ",")
547: (e-cvtas frm2)
548: (e-docomment)
549: #+for-tahoe (e-postinc frm1)
550: #+for-tahoe (e-postinc frm2))
551:
552: #+for-68k
553: (defun e-write3 (lit frm1 frm2)
554: (em-checkskip)
555: (em-checknpdrop)
556: (if (and (dtpr frm1) (eq (car frm1) '*)
557: (not (and (dtpr frm2) (eq (car frm2) '*))))
558: then (e-move (cdr frm1) 'a5)
559: (sfilewrite " ")
560: (sfilewrite lit)
561: (sfilewrite '" ")
562: (e-cvtas '(0 a5))
563: (sfilewrite '",")
564: (e-cvtas frm2)
565: (e-docomment)
566: elseif (and (not (and (dtpr frm1) (eq (car frm1) '*)))
567: (dtpr frm2) (eq (car frm2) '*))
568: then (e-move (cdr frm2) 'a5)
569: (sfilewrite " ")
570: (sfilewrite lit)
571: (sfilewrite '" ")
572: (e-cvtas frm1)
573: (sfilewrite '",")
574: (e-cvtas '(0 a5))
575: (e-docomment)
576: elseif (and (dtpr frm1) (eq (car frm1) '*)
577: (dtpr frm2) (eq (car frm2) '*))
578: then (d-regused 'd6)
579: (e-move (cdr frm1) 'a5)
580: (e-move '(0 a5) 'd6)
581: (e-move (cdr frm2) 'a5)
582: (sfilewrite " ")
583: (sfilewrite lit)
584: (sfilewrite '" ")
585: (e-cvtas 'd6)
586: (sfilewrite '",")
587: (e-cvtas '(0 a5))
588: (e-docomment)
589: else (sfilewrite " ")
590: (sfilewrite lit)
591: (sfilewrite '" ")
592: (e-cvtas frm1)
593: (sfilewrite '",")
594: (e-cvtas frm2)
595: (e-docomment)))
596:
597: ;--- e-write4 :: write one one litteral, and three operands
598: ;
599: #+(or for-vax for-tahoe)
600: (defun e-write4 (lit frm1 frm2 frm3)
601: (em-checkskip)
602: (em-checknpdrop)
603: (sfilewrite " ")
604: (sfilewrite lit)
605: (sfilewrite " ")
606: (e-cvtas frm1)
607: (sfilewrite ",")
608: (e-cvtas frm2)
609: (sfilewrite ",")
610: (e-cvtas frm3)
611: (e-docomment)
612: #+for-tahoe (e-postinc frm1)
613: #+for-tahoe (e-postinc frm2)
614: #+for-tahoe (e-postinc frm3))
615:
616:
617: ;--- e-write5 :: write one one litteral, and four operands
618: ;
619: #+(or for-vax for-tahoe)
620: (defun e-write5 (lit frm1 frm2 frm3 frm4)
621: (em-checkskip)
622: (em-checknpdrop)
623: (sfilewrite " ")
624: (sfilewrite lit)
625: (sfilewrite " ")
626: (e-cvtas frm1)
627: (sfilewrite ",")
628: (e-cvtas frm2)
629: (sfilewrite ",")
630: (e-cvtas frm3)
631: (sfilewrite ",")
632: (e-cvtas frm4)
633: (e-docomment)
634: #+for-tahoe (e-postinc frm1)
635: #+for-tahoe (e-postinc frm2)
636: #+for-tahoe (e-postinc frm3)
637: #+for-tahoe (e-postinc frm4))
638:
639: ;--- d-printdocstuff
640: ;
641: ; describe this version
642: ;
643: (defun d-printdocstuff nil
644: (sfilewrite (concat ".data "
645: #.comment-char
646: " this is just for documentation "))
647: (terpr vp-sfile)
648: (sfilewrite (concat ".asciz \"@(#)Compiled by " compiler-name
649: " on " (status ctime) '\"))
650: (terpr vp-sfile)
651: (do ((xx Liszt-file-names (cdr xx)))
652: ((null xx))
653: (sfilewrite (concat ".asciz \"" (car xx) '\"))
654: (terpr vp-sfile)))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.