Annotation of 42BSD/ucb/lisp/liszt/io.l, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.