BSD 4_3_Net_2 release
[unix-history] / usr / src / usr.bin / lisp / liszt / io.l
CommitLineData
0f4556f1 1(include-if (null (get 'chead 'version)) "../chead.l")
e804469b 2(Liszt-file io
ca67e7b4 3 "$Header: io.l,v 1.17 87/12/15 17:03:20 sklower Exp $")
4b9ccde7
C
4
5;;; ---- i o input output
6;;;
0f4556f1 7;;; -[Fri Sep 2 21:37:05 1983 by layer]-
4b9ccde7
C
8
9
10;--- d-prelude :: emit code common to beginning of all functions
11;
12(defun d-prelude nil
ca67e7b4
C
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))
0f4556f1
C
17 #+for-68k (setq g-stackspace (d-genlab) g-masklab (d-genlab))
18 (if g-flocal
ca67e7b4
C
19 then #+for-tahoe (e-write2 '".word" '0x0)
20 (C-push '#.olbot-reg)
0f4556f1
C
21 (e-write3 loada-op
22 `(,(* -4 g-currentargs) #.np-reg) '#.olbot-reg)
23 (e-writel g-topsym)
ca67e7b4 24 else #+(or for-vax for-tahoe) (e-write2 '".word" '0x5c0)
0f4556f1
C
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
95f51977 33 then (e-write3 loada-op 'mcnts
ca67e7b4 34 #+(or for-vax for-tahoe) 'r0 #+for-68k 'a0)
0f4556f1
C
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)))))
4b9ccde7
C
80
81;--- d-fini :: emit code at end of function
0f4556f1 82;
4b9ccde7 83(defun d-fini nil
0f4556f1
C
84 (if g-flocal
85 then (C-pop '#.olbot-reg)
ca67e7b4 86 (e-write1 #+for-vax 'rsb #+for-tahoe 'ret #+for-68k 'rts)
0f4556f1
C
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)))
4b9ccde7
C
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")
ca67e7b4 99 #+(or for-vax for-tahoe)
0f4556f1
C
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)))
4b9ccde7
C
107 (do ((ll (setq g-funcs (nreverse g-funcs)) (cdr ll)))
108 ((null ll))
0f4556f1
C
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)))))
4b9ccde7
C
114 else (comp-err " bad type in lit list " (car ll))))
115
116 (e-write1 ".long -1")
0f4556f1 117 (e-writel "lit_org")
4b9ccde7 118 (d-asciiout (nreverse g-lits))
0f4556f1
C
119 (if g-tran then (d-asciiout (nreverse g-tran)))
120 (d-asciiout (mapcar '(lambda (x) (if (eq (car x) 'eval)
4b9ccde7
C
121 then (cadr x)
122 else (caddr x)))
123 g-funcs))
0f4556f1 124 (e-writel "lit_end"))
4b9ccde7
C
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))
0f4556f1 138 (if (greaterp remsiz 60) then (sfilewrite '".ascii \"")
4b9ccde7
C
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)))
0f4556f1 145 (if (eq '#.ch-newline (car curform))
4b9ccde7 146 then (sfilewrite '\\012)
0f4556f1 147 else (if (or (eq '\\ (car curform))
4b9ccde7
C
148 (eq '\" (car curform)))
149 then (sfilewrite '\\))
150 (sfilewrite (car curform)))
151 (setq curform (cdr curform))))))
152
153;--- d-autorunhead
154;
0f4556f1
C
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;
4b9ccde7 168(defun d-printautorun nil
0f4556f1
C
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"
ca67e7b4 174 #+for-tahoe "/autorun/tahoe"
0f4556f1
C
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))))
4b9ccde7 181
0f4556f1 182(defun e-cvt (arg)
ca67e7b4
C
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
0f4556f1
C
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)
ca67e7b4
C
192 elseif (eq 'unstack arg) then (progn #+for-tahoe (e-sub '($ 4) '#.np-reg)
193 '(- #.np-reg))
0f4556f1
C
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))))
4b9ccde7
C
207
208;--- e-uncvt :: inverse of e-cvt, used for making comments pretty
209;
210(defun e-uncvt (arg)
0f4556f1
C
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))
4b9ccde7
C
231
232;--- e-cvtas :: convert an EIADR to vax unix assembler fmt and print it
233; - form : an EIADR form
234;
ca67e7b4 235#+(or for-vax for-tahoe)
4b9ccde7 236(defun e-cvtas (form)
0f4556f1 237 (if (atom form)
4b9ccde7 238 then (sfilewrite form)
0f4556f1
C
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))
ca67e7b4
C
256 (sfilewrite '")")
257 #-for-tahoe (sfilewrite '"+")
0f4556f1 258 elseif (eq '- (car form))
ca67e7b4
C
259 then #-for-tahoe (sfilewrite '"-")
260 (sfilewrite '"(")
0f4556f1
C
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)))))
4b9ccde7 306
ca67e7b4
C
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
4b9ccde7
C
316;--- e-docomment :: print any comment lines
317;
318(defun e-docomment nil
0f4556f1 319 (if g-comments
4b9ccde7
C
320 then (do ((ll (nreverse g-comments) (cdr ll)))
321 ((null ll))
0f4556f1
C
322 (sfilewrite " ")
323 (sfilewrite #.comment-char)
4b9ccde7
C
324 (do ((ll (exploden (car ll)) (cdr ll)))
325 ((null ll))
326 (tyo (car ll) vp-sfile)
327 (cond ((eq #\newline (car ll))
0f4556f1 328 (sfilewrite #.comment-char))))
4b9ccde7
C
329 (terpr vp-sfile))
330 (setq g-comments nil)
0f4556f1 331 else (terpr vp-sfile)))
e804469b 332
4b9ccde7
C
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
4b9ccde7
C
352;--- e-pop :: pop the given number of args from the stack
353; g-locs is not! fixed
354;
355(defun e-pop (nargs)
0f4556f1 356 (if (greaterp nargs 0)
4b9ccde7
C
357 then (e-dropnp nargs)))
358
4b9ccde7
C
359;--- e-pushnil :: push a given number of nils on the stack
360;
0f4556f1
C
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
ca67e7b4
C
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
0f4556f1 379#+for-68k
4b9ccde7
C
380(defun e-pushnil (nargs)
381 (do ((i nargs))
382 ((zerop i))
0f4556f1
C
383 (L-push '#.nil-reg)
384 (setq i (1- i))))
e804469b 385
4b9ccde7
C
386;--- e-setupbind :: setup for shallow binding
387;
388(defun e-setupbind nil
0f4556f1 389 (e-move '#.bnp-sym '#.bnp-reg))
4b9ccde7
C
390
391;--- e-unsetupbind :: restore temp value of bnp to real loc
392;
393(defun e-unsetupbind nil
0f4556f1 394 (e-move '#.bnp-reg '#.bnp-sym))
4b9ccde7
C
395
396;--- e-shallowbind :: shallow bind value of variable and initialize it
397; - name : variable name
398; - val : IADR value for variable
399;
ca67e7b4 400#+(or for-vax for-68k)
4b9ccde7
C
401(defun e-shallowbind (name val)
402 (let ((vloc (d-loclit name t)))
0f4556f1
C
403 (e-move (e-cvt vloc) '(+ #.bnp-reg)) ; store old val
404 (e-move (e-cvt `(lbind ,@(cdr vloc)))
405 '(+ #.bnp-reg)) ; now name
4b9ccde7
C
406 (d-move val vloc)))
407
ca67e7b4
C
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
4b9ccde7
C
418;--- e-unshallowbind :: un shallow bind n variable from top of stack
419;
ca67e7b4 420#+(or for-vax for-tahoe)
4b9ccde7
C
421(defun e-unshallowbind (n)
422 (e-setupbind) ; set up binding register
423 (do ((i 1 (1+ i)))
424 ((greaterp i n))
0f4556f1
C
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"))
4b9ccde7
C
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)
0f4556f1
C
450 (if (not g-skipcode)
451 then (setq g-dropnpcnt (+ n (if g-dropnpcnt thenret else 0)))))
4b9ccde7
C
452
453;--- em-checknpdrop :: check if we have a pending npdrop
454; and do it if so.
455;
456(defmacro em-checknpdrop nil
0f4556f1
C
457 `(if g-dropnpcnt
458 then (let ((dr g-dropnpcnt))
459 (setq g-dropnpcnt nil)
460 (e-sub `($ ,(* dr 4)) '#.np-reg))))
4b9ccde7
C
461
462;--- em-checkskip :: check if we are skipping this code due to jump
463;
464(defmacro em-checkskip nil
0f4556f1 465 '(if g-skipcode then (sfilewrite #.comment-char)))
4b9ccde7
C
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)
ca67e7b4 474 (e-write2 #+(or for-vax for-tahoe) 'jbr #+for-68k 'jra l)
4b9ccde7
C
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
ca67e7b4 481 #+(or for-vax for-tahoe) (e-write1 'ret)
0f4556f1
C
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))))
4b9ccde7
C
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)
0f4556f1 495 (sfilewrite ":")
4b9ccde7
C
496 (e-docomment))
497
498;--- e-write1 :: write out one litteral
499;
500(defun e-write1 (lit)
501 (em-checkskip)
502 (em-checknpdrop)
0f4556f1 503 (sfilewrite " ")
4b9ccde7
C
504 (sfilewrite lit)
505 (e-docomment))
506
507;--- e-write2 :: write one one litteral, and one operand
508;
ca67e7b4 509#+(or for-vax for-tahoe)
4b9ccde7
C
510(defun e-write2 (lit frm)
511 (em-checkskip)
512 (em-checknpdrop)
0f4556f1 513 (sfilewrite " ")
4b9ccde7 514 (sfilewrite lit)
0f4556f1 515 (sfilewrite " ")
4b9ccde7 516 (e-cvtas frm)
ca67e7b4
C
517 (e-docomment)
518 #+for-tahoe (e-postinc frm))
4b9ccde7 519
0f4556f1
C
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
4b9ccde7
C
536;--- e-write3 :: write one one litteral, and two operands
537;
ca67e7b4 538#+(or for-vax for-tahoe)
4b9ccde7
C
539(defun e-write3 (lit frm1 frm2)
540 (em-checkskip)
541 (em-checknpdrop)
0f4556f1 542 (sfilewrite " ")
4b9ccde7 543 (sfilewrite lit)
0f4556f1 544 (sfilewrite " ")
4b9ccde7 545 (e-cvtas frm1)
0f4556f1 546 (sfilewrite ",")
4b9ccde7 547 (e-cvtas frm2)
ca67e7b4
C
548 (e-docomment)
549 #+for-tahoe (e-postinc frm1)
550 #+for-tahoe (e-postinc frm2))
4b9ccde7 551
0f4556f1
C
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
4b9ccde7
C
597;--- e-write4 :: write one one litteral, and three operands
598;
ca67e7b4 599#+(or for-vax for-tahoe)
4b9ccde7
C
600(defun e-write4 (lit frm1 frm2 frm3)
601 (em-checkskip)
602 (em-checknpdrop)
0f4556f1 603 (sfilewrite " ")
4b9ccde7 604 (sfilewrite lit)
0f4556f1 605 (sfilewrite " ")
4b9ccde7 606 (e-cvtas frm1)
0f4556f1 607 (sfilewrite ",")
4b9ccde7 608 (e-cvtas frm2)
0f4556f1 609 (sfilewrite ",")
4b9ccde7 610 (e-cvtas frm3)
ca67e7b4
C
611 (e-docomment)
612 #+for-tahoe (e-postinc frm1)
613 #+for-tahoe (e-postinc frm2)
614 #+for-tahoe (e-postinc frm3))
4b9ccde7
C
615
616
617;--- e-write5 :: write one one litteral, and four operands
618;
ca67e7b4 619#+(or for-vax for-tahoe)
4b9ccde7
C
620(defun e-write5 (lit frm1 frm2 frm3 frm4)
621 (em-checkskip)
622 (em-checknpdrop)
0f4556f1 623 (sfilewrite " ")
4b9ccde7 624 (sfilewrite lit)
0f4556f1 625 (sfilewrite " ")
4b9ccde7 626 (e-cvtas frm1)
0f4556f1 627 (sfilewrite ",")
4b9ccde7 628 (e-cvtas frm2)
0f4556f1 629 (sfilewrite ",")
4b9ccde7 630 (e-cvtas frm3)
0f4556f1 631 (sfilewrite ",")
4b9ccde7 632 (e-cvtas frm4)
ca67e7b4
C
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))
4b9ccde7 638
4b9ccde7
C
639;--- d-printdocstuff
640;
641; describe this version
642;
643(defun d-printdocstuff nil
0f4556f1
C
644 (sfilewrite (concat ".data "
645 #.comment-char
646 " this is just for documentation "))
4b9ccde7
C
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)))