(FILECREATED "28-Sep-86 02:20:15" {ERIS}<LISPCORE>EVAL>DMISC.;3 55808  

      changes to:  (VARS DMISCCOMS)
                   (FNS BACKSPACEDEL PLAYTUNE)

      previous date: "13-Sep-86 14:51:00" {ERIS}<LISPCORE>EVAL>DMISC.;2)


(* "
Copyright (c) 1982, 1983, 1984, 1985, 1986 by Xerox Corporation.  All rights reserved.
The following program was created in 1982 but has not been published
within the meaning of the copyright law, is furnished under license,
and may not be used, copied and/or disclosed except in accordance
with the terms of said license.
")

(PRETTYCOMPRINT DMISCCOMS)

(RPAQQ DMISCCOMS [[COMS (FNS BACKSPACEDEL)
                        (DECLARE: DOCOPY DONTEVAL@LOAD (P (BACKSPACEDEL \ORIGTERMTABLE)
                                                          (BACKSPACEDEL NIL]
                  (COMS (* TIMEALL)
                        (FNS TIMEALL COPYMISCSTATS COPYTIMESTATS CREATEMISCSTATS DIFFMISCSTATS 
                             DIFFTIMESTATS PRINTMISCSTATS PRINTMISCSTATSITEM)
                        (DECLARE: DONTCOPY (RECORDS STATSOBJECT)))
                  [COMS (FNS PERIODICALLYRECLAIM)
                        (DECLARE: DONTEVAL@LOAD DOCOPY [INITVARS (RECLAIMWAIT 4)
                                                              (\LASTRECLAIM
                                                               (\DAYTIME0 (NCREATE (QUOTE FIXP]
                               (APPENDVARS (BACKGROUNDFNS PERIODICALLYRECLAIM)
                                      (\SYSTEMTIMERVARS (\LASTRECLAIM SECONDS]
                  (COMS (FNS \DIRTYBACKGROUND \SAVEVMBACKGROUND COPYVM)
                        (INITVARS (BACKGROUNDPAGEMIN 40)
                               (BACKGROUNDPAGECNT 0)
                               (BACKGROUNDPAGEFREQ 4))
                        (INITVARS (SAVINGCURSOR)
                               (SAVEVMMAX 600)
                               (SAVEVMWAIT 300))
                        (ADDVARS (BACKGROUNDFNS \DIRTYBACKGROUND)
                               (TTYBACKGROUNDFNS \SAVEVMBACKGROUND))
                        (GLOBALVARS BACKGROUNDPAGEMIN BACKGROUNDPAGEFREQ BACKGROUNDPAGECNT))
                  (COMS (* Setting the time)
                        (FNS SETTIME))
                  [COMS (FNS RINGBELLS FLASHWINDOW PLAYTUNE)
                        (DECLARE: EVAL@COMPILE DONTCOPY (RESOURCES \PlayTimer))
                        (INITRESOURCES \PlayTimer)
                        (DECLARE: DONTEVAL@LOAD DOCOPY (* Overrides definition in the shared MISC)
                               (P (MOVD (QUOTE RINGBELLS)
                                        (QUOTE PRINTBELLS]
                  [COMS (* Changing display)
                        (FNS DISPLAYDOWN SETDISPLAYHEIGHT VIDEORATE)
                        (INITVARS (\VIDEORATE (QUOTE NORMAL)))
                        (DECLARE: DONTEVAL@LOAD DOCOPY (ADDVARS (BREAKRESETFORMS (SETDISPLAYHEIGHT
                                                                                  T))
                                                              (RESETFORMS (SETDISPLAYHEIGHT T]
                  (DECLARE: DONTEVAL@LOAD DOCOPY (VARS (#EOLCHARS 1))
                         [P (OR (LISTP (EVALV (QUOTE EDITCHARACTERS)))
                                (RPAQ EDITCHARACTERS (QUOTE (J X Z Y N]
                         (ADDVARS (POSTGREETFORMS (CNDIR))
                                (LISPUSERSDIRECTORIES)))
                  [INITVARS (CLEANUPOPTIONS (QUOTE (RC]
                  (COMS (FNS DOAROUNDEXITFORMS)
                        (ADDVARS (AROUNDEXITFNS DOAROUNDEXITFORMS)
                               (BEFORELOGOUTFORMS)
                               (AFTERLOGOUTFORMS)))
                  (DECLARE: DONTEVAL@LOAD DOCOPY (INITVARS (ADVISEDFNS)))
                  (COMS (* Versions)
                        (FNS REALMEMORYSIZE LISPVERSION MICROCODEVERSION BCPLVERSION REQUIREVERSION))
                  (COMS (* Misc ops)
                        (FNS READPRINTERPORT WRITEPRINTERPORT \READPRINTERPORT.UFN 
                             \WRITEPRINTERPORT.UFN \MISC1.UFN \MISC2.UFN \MISC3.UFN \MISC4.UFN 
                             \MISC5.UFN \MISC6.UFN \MISC7.UFN \MISC8.UFN \MISC10.UFN)
                        (* sub-functions of floating-point ufns)
                        (FNS BLKFLOATP2COMP BLKSMALLP2FLOAT BLKMAG BLKEXPONENT)
                        (FNS BLKSEP BLKFDIFF BLKFPLUS BLKPERM BLKFTIMES \FLOATTOBYTE.UFN \BLKFMAX.UFN 
                             \BLKFMIN.UFN \BLKFABSMAX.UFN \BLKFABSMIN.UFN)
                        (FNS IBLT1 IBLT2))
                  (VARS RINGBELLS.L1 RINGBELLS.L2)
                  (LOCALVARS . T)
                  (DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA)
                                                                                      (NLAML TIMEALL)
                                                                                      (LAMA])
(DEFINEQ

(BACKSPACEDEL
  [LAMBDA (TTBL)                                             (* lmm "24-JUN-80 23:16")
          
          (* Hack for causing char-delete to backspace display.
          Also suppress ## when reach the left margin.
          -
          This should be executed after the chardelete in TTBL has been established.
          -
          ERASECHARCODE is in INITCONSTANTS on LLPARAMS)

    (DELETECONTROL (QUOTE 1STCHDEL)
           (CHARACTER ERASECHARCODE)
           TTBL)
    (DELETECONTROL (QUOTE NTHCHDEL)
           (CHARACTER ERASECHARCODE)
           TTBL)
    (DELETECONTROL (QUOTE POSTCHDEL)
           "" TTBL)
    (DELETECONTROL (QUOTE EMPTYCHDEL)
           "" TTBL)
    (DELETECONTROL (QUOTE NOECHO)
           NIL TTBL)
    (ECHOCONTROL ERASECHARCODE (QUOTE REAL])
)
(DECLARE: DOCOPY DONTEVAL@LOAD 
(BACKSPACEDEL \ORIGTERMTABLE)
(BACKSPACEDEL NIL)
)



(* TIMEALL)

(DEFINEQ

(TIMEALL
  [NLAMBDA (TIMEFORM NUMBEROFTIMES TIMEWHAT INTERPFLG SHOWCODE)
                                                             (* lmm "19-Jun-86 14:09")
          
          (* collects and prints stats on TIMEFORM.
          TIMEWHAT indicates what to collect stats on: if T, all of the system times are 
          collected; if NIL, the system times plus all data allocations are kept;
          if a list, it should be a list of DATATYPES
          (or numbers) and may include the atom TIME if system times should be included.
          This function sets the variables BEFORESTATS, AFTERSTATS and DIFFERENCESTATS to 
          the values of the stats objects before, after and the difference between them.
          These can be examined via the function PRINTMISCSTATS.)

    (DECLARE (SPECVARS LCFIL STRF LAPFLG))
    (PROG [VALUE (TIMEFLG (OR (NULL TIMEWHAT)
                              (EQ TIMEWHAT T)
                              (MEMB (QUOTE TIME)
                                    TIMEWHAT)))
                 (DATATYPES (COND
                               ((NULL TIMEWHAT)
                                (DATATYPES))
                               ((EQ TIMEWHAT T)
                                NIL)
                               (T (for X inside TIMEWHAT bind NAME
                                     join (COND
                                             ((SETQ NAME (DATATYPEP X))
                                              (CONS NAME))
                                             ((EQ X (QUOTE TIME))
                                              NIL)
                                             (T (printout T X " is not a datatype." T)
                                                NIL]         (* create all necessary storage before 
                                                             performing test form.)
          (OR (NUMBERP NUMBEROFTIMES)
              (SETQ NUMBEROFTIMES 1))
          [COND
             ([OR (NLISTP AFTERSTATS)
                  (NOT (EQUAL DATATYPES (fetch DATATYPES of AFTERSTATS]
              (SETQ DIFFERENCESTATS (CREATEMISCSTATS DATATYPES TIMEFLG))
              (SETQ BEFORESTATS (CREATEMISCSTATS DATATYPES TIMEFLG))
              (SETQ AFTERSTATS (CREATEMISCSTATS DATATYPES TIMEFLG]
          [COND
             [(OR INTERPFLG (EQ NUMBEROFTIMES 1))
              (COPYMISCSTATS BEFORESTATS DATATYPES)
              (SETQ VALUE (FRPTQ NUMBEROFTIMES (EVAL TIMEFORM]
             (T [CL:COMPILE (QUOTE TIMEDUMMYFUNCTION)
                       (BQUOTE (LAMBDA NIL
                                 (FRPTQ (\, NUMBEROFTIMES)
                                        (\, TIMEFORM]
                (COPYMISCSTATS BEFORESTATS DATATYPES)
                (SETQ VALUE (TIMEDUMMYFUNCTION]
          (COPYMISCSTATS AFTERSTATS DATATYPES T)
          (PRINTMISCSTATS (DIFFMISCSTATS BEFORESTATS AFTERSTATS DIFFERENCESTATS)
                 DATATYPES)
          (RETURN VALUE])

(COPYMISCSTATS
  [LAMBDA (STATS DATATYPES BEFOREFLG)                        (* bvm: "28-MAR-82 22:00")
          
          (* smashes the fields of STATS to be the current values of stats in the system.
          BEFOREFLG indicates whether elapsed time should be taken before or after the 
          bulk of the work.)

    (DECLARE (GLOBALVARS \MISCSTATS))
    [COND
       (BEFOREFLG (CLOCK0 (fetch ELAPSEDTIME of STATS))
              (for TYPE in DATATYPES as X on (fetch DATACOUNTERS of STATS)
                 do (RPLACA X (BOXCOUNT TYPE]
    (AND (fetch TIMEBLOCK of STATS)
         (COPYTIMESTATS \MISCSTATS (fetch TIMEBLOCK of STATS)))
    (COND
       ((NOT BEFOREFLG)
        (for TYPE in DATATYPES as X on (fetch DATACOUNTERS of STATS) do (RPLACA X (BOXCOUNT TYPE)))
        (CLOCK0 (fetch ELAPSEDTIME of STATS])

(COPYTIMESTATS
  [LAMBDA (REFSTATS STATS)                                   (* lmm " 6-Jan-85 14:52")
    (replace SWAPWAITTIME of STATS with (fetch SWAPWAITTIME of REFSTATS))
    (replace KEYBOARDWAITTIME of STATS with (fetch KEYBOARDWAITTIME of REFSTATS))
    (replace GCTIME of STATS with (fetch GCTIME of REFSTATS))
    (replace PAGEFAULTS of STATS with (fetch PAGEFAULTS of REFSTATS))
    (replace SWAPWRITES of STATS with (fetch SWAPWRITES of REFSTATS))
    (replace TOTALTIME of STATS with (fetch TOTALTIME of REFSTATS))
    (replace STARTTIME of STATS with (fetch STARTTIME of REFSTATS))
    (replace DISKIOTIME of STATS with (fetch DISKIOTIME of REFSTATS))
    (replace NETIOTIME of STATS with (fetch NETIOTIME of REFSTATS))
    (replace DISKOPS of STATS with (fetch DISKOPS of REFSTATS))
    (replace NETIOOPS of STATS with (fetch NETIOOPS of REFSTATS])

(CREATEMISCSTATS
  [LAMBDA (DATATYPES TIMEBLOCKFLG)                           (* bvm: " 6-OCT-82 15:28")
                                                             (* creates a stats object for the 
                                                             types datatypes.)
    (create STATSOBJECT
           ELAPSEDTIME ←(CLOCK 0)
           TIMEBLOCK ←(AND TIMEBLOCKFLG (create MISCSTATS))
           DATACOUNTERS ←(APPEND DATATYPES)
           DATATYPES ← DATATYPES])

(DIFFMISCSTATS
  [LAMBDA (BEFORE AFTER DIFFERENCES)                         (* bvm: " 6-OCT-82 15:30")
                                                             (* puts the differences between two 
                                                             stats objects in a third stats object.)
    [for D on (fetch DATACOUNTERS of DIFFERENCES) as B in (fetch DATACOUNTERS of BEFORE) as A
       in (fetch DATACOUNTERS of AFTER) as TYPE in (fetch DATATYPES of DIFFERENCES)
       bind (LARGECNT ← 0)
            LARGECNTTAIL do (COND
                               ((EQ TYPE (QUOTE FIXP))
                                (SETQ LARGECNTTAIL D)))
                            (OR (SMALLP (COND
                                           (LARGECNTTAIL B)
                                           (T A)))
                                (add LARGECNT 2)) 
          
          (* The BOXCOUNT in COPYMISCSTATS for this datatype came out large, and thus did 
          2 number boxes (one to fetch main count, one to add in aux cnt), counted in the 
          stats period)

                            (FRPLACA D (IDIFFERENCE A B)) finally (COND
                                                                     ((AND (IGREATERP LARGECNT 0)
                                                                           LARGECNTTAIL)
                                                             (* Adjust FIXP count to take into 
                                                             account all BOXCOUNT's that used up 
                                                             largep's)
                                                                      (FRPLACA LARGECNTTAIL
                                                                             (IDIFFERENCE
                                                                              (CAR LARGECNTTAIL)
                                                                              LARGECNT]
    (replace ELAPSEDTIME of DIFFERENCES with (IDIFFERENCE (fetch ELAPSEDTIME of AFTER)
                                                    (fetch ELAPSEDTIME of BEFORE)))
    (AND (fetch TIMEBLOCK of BEFORE)
         (fetch TIMEBLOCK of AFTER)
         (fetch TIMEBLOCK of DIFFERENCES)
         (DIFFTIMESTATS (fetch TIMEBLOCK of BEFORE)
                (fetch TIMEBLOCK of AFTER)
                (fetch TIMEBLOCK of DIFFERENCES)))
    DIFFERENCES])

(DIFFTIMESTATS
  [LAMBDA (BEFOREBLOCK AFTERBLOCK DIFFERENCESBLOCK)          (* lmm " 6-Jan-85 15:10")
                                                             (* copies the difference between two 
                                                             stats blocks into a third stats block.)
    (replace SWAPWAITTIME of DIFFERENCESBLOCK with (IDIFFERENCE (fetch SWAPWAITTIME of AFTERBLOCK)
                                                          (fetch SWAPWAITTIME of BEFOREBLOCK)))
    (replace KEYBOARDWAITTIME of DIFFERENCESBLOCK with (IDIFFERENCE (fetch KEYBOARDWAITTIME
                                                                       of AFTERBLOCK)
                                                              (fetch KEYBOARDWAITTIME of BEFOREBLOCK)
                                                              ))
    (replace GCTIME of DIFFERENCESBLOCK with (IDIFFERENCE (fetch GCTIME of AFTERBLOCK)
                                                    (fetch GCTIME of BEFOREBLOCK)))
    (replace PAGEFAULTS of DIFFERENCESBLOCK with (IDIFFERENCE (fetch PAGEFAULTS of AFTERBLOCK)
                                                        (fetch PAGEFAULTS of BEFOREBLOCK)))
    (replace SWAPWRITES of DIFFERENCESBLOCK with (IDIFFERENCE (fetch SWAPWRITES of AFTERBLOCK)
                                                        (fetch SWAPWRITES of BEFOREBLOCK)))
    (replace TOTALTIME of DIFFERENCESBLOCK with (IDIFFERENCE (fetch TOTALTIME of AFTERBLOCK)
                                                       (fetch TOTALTIME of BEFOREBLOCK)))
    (replace STARTTIME of DIFFERENCESBLOCK with (IDIFFERENCE (fetch STARTTIME of AFTERBLOCK)
                                                       (fetch STARTTIME of BEFOREBLOCK)))
    (replace DISKIOTIME of DIFFERENCESBLOCK with (IDIFFERENCE (fetch DISKIOTIME of AFTERBLOCK)
                                                        (fetch DISKIOTIME of BEFOREBLOCK)))
    (replace NETIOTIME of DIFFERENCESBLOCK with (IDIFFERENCE (fetch NETIOTIME of AFTERBLOCK)
                                                       (fetch NETIOTIME of BEFOREBLOCK)))
    (replace DISKOPS of DIFFERENCESBLOCK with (IDIFFERENCE (fetch DISKOPS of AFTERBLOCK)
                                                     (fetch DISKOPS of BEFOREBLOCK)))
    (replace NETIOOPS of DIFFERENCESBLOCK with (IDIFFERENCE (fetch NETIOOPS of AFTERBLOCK)
                                                      (fetch NETIOOPS of BEFOREBLOCK)))
    DIFFERENCESBLOCK])

(PRINTMISCSTATS
  [LAMBDA (STATS DATATYPES)                                  (* bvm: " 6-JAN-83 18:13")
                                                             (* prints the fields of MISCSTATS)
    [PROG ((CPUTIME (fetch ELAPSEDTIME of STATS)))
          (PRINTMISCSTATSITEM "Elapsed Time" CPUTIME T)
          (COND
             ((fetch TIMEBLOCK of STATS)                     (* printout time stats)
              (PROG ((STATSBLOCK (fetch TIMEBLOCK of STATS))
                     MSECS)
                    [SETQ CPUTIME (IDIFFERENCE CPUTIME (SETQ MSECS (fetch SWAPWAITTIME of STATSBLOCK]
                    (PRINTMISCSTATSITEM "SWAP time" MSECS T)
                    [SETQ CPUTIME (IDIFFERENCE CPUTIME (SETQ MSECS (fetch KEYBOARDWAITTIME
                                                                      of STATSBLOCK]
                    (PRINTMISCSTATSITEM "KEYWAIT time" MSECS T)
                    [SETQ CPUTIME (IDIFFERENCE CPUTIME (SETQ MSECS (fetch GCTIME of STATSBLOCK]
                    (PRINTMISCSTATSITEM "GC time" MSECS T)
                    [SETQ CPUTIME (IDIFFERENCE CPUTIME (SETQ MSECS (fetch DISKIOTIME of STATSBLOCK]
                    (PRINTMISCSTATSITEM "Disk i/o time" MSECS T)
                    (PRINTMISCSTATSITEM "CPU Time" CPUTIME T)
                    (PRINTMISCSTATSITEM (QUOTE PAGEFAULTS)
                           (fetch PAGEFAULTS of STATSBLOCK))
                    (PRINTMISCSTATSITEM (QUOTE SWAPWRITES)
                           (fetch SWAPWRITES of STATSBLOCK))
                    (PRINTMISCSTATSITEM (QUOTE DISKOPS)
                           (fetch DISKOPS of STATSBLOCK))
                    (PRINTMISCSTATSITEM (QUOTE NETIOTIME)
                           (fetch NETIOTIME of STATSBLOCK)
                           T)
                    (PRINTMISCSTATSITEM (QUOTE NETIOOPS)
                           (fetch NETIOOPS of STATSBLOCK]    (* construct a list of the elements 
                                                             that will fit on one line.)
    (bind PRINTABLES RESULT (COL ← 0)
          (LINELENGTH ← (LINELENGTH)) for DT in DATATYPES as DIF in (fetch DATACOUNTERS of STATS)
       unless (EQ DIF 0) do [COND
                               ((IGREATERP (SETQ COL (IPLUS COL (NCHARS DT)))
                                       LINELENGTH)           (* line break)
                                (SETQ PRINTABLES (NCONC1 PRINTABLES (DREVERSE RESULT)))
                                (SETQ RESULT)
                                (SETQ COL (NCHARS DT]
                            (SETQ RESULT (CONS (CONS (add COL 1)
                                                     (CONS DT DIF))
                                               RESULT))
       finally [COND
                  (RESULT (SETQ PRINTABLES (NCONC1 PRINTABLES (DREVERSE RESULT]
             (for LINE in PRINTABLES do (for PR in LINE do (LISPXPRIN1 (CADR PR)
                                                                  T) 
                                                             (* Print datatype names)
                                                           (LISPXTAB (CAR PR)
                                                                  NIL T))
                                        (LISPXTERPRI T)
                                        (for PR in LINE do (LISPXPRIN2 (CDDR PR)
                                                                  T) 
                                                             (* Print amount used)
                                                           (LISPXTAB (CAR PR)
                                                                  NIL T))
                                        (LISPXTERPRI T])

(PRINTMISCSTATSITEM
  [LAMBDA (STR NUM TIMEFLG)                                  (* bvm: "26-MAR-82 16:25")
    (COND
       ((NOT (EQP NUM 0))
        (LISPXPRIN1 STR T)
        (LISPXPRIN1 " = ")
        (COND
           (TIMEFLG (LISPXTAB 16 0 T)
                  (PRINTNUM (QUOTE (FLOAT 9 NIL NIL NIL 3))
                         (SETQ NUM (FQUOTIENT NUM 1000.0))
                         T)                                  (* 3 significant digits)
                  (LISPXPRIN2 NUM T T T)                     (* Record on history without printing)
                  (LISPXPRIN1 " seconds" T))
           (T (LISPXPRIN2 NUM T)))
        (LISPXTERPRI T])
)
(DECLARE: DONTCOPY 
[DECLARE: EVAL@COMPILE 

(RECORD STATSOBJECT (ELAPSEDTIME TIMEBLOCK DATACOUNTERS . DATATYPES))
]
)
(DEFINEQ

(PERIODICALLYRECLAIM
  [LAMBDA NIL                                                (* bvm: " 4-Nov-85 17:21")
    (DECLARE (GLOBALVARS \RECLAIM.COUNTDOWN \LASTUSERACTION RECLAIMWAIT \LASTRECLAIM))
    (if (AND \RECLAIM.COUNTDOWN (\SECONDSCLOCKGREATERP \LASTUSERACTION RECLAIMWAIT)
             (\SECONDSCLOCKGREATERP \LASTRECLAIM RECLAIMWAIT))
        then (RECLAIM)
             (\DAYTIME0 \LASTRECLAIM])
)
(DECLARE: DONTEVAL@LOAD DOCOPY 

(RPAQ? RECLAIMWAIT 4)

(RPAQ? \LASTRECLAIM (\DAYTIME0 (NCREATE (QUOTE FIXP))))


(APPENDTOVAR BACKGROUNDFNS PERIODICALLYRECLAIM)

(APPENDTOVAR \SYSTEMTIMERVARS (\LASTRECLAIM SECONDS))
)
(DEFINEQ

(\DIRTYBACKGROUND
  [LAMBDA NIL                                                (* lmm "14-AUG-83 16:08")
    (DECLARE (GLOBALVARS SAVEVMMAX \LASTUSERACTION SAVEVMWAIT SAVINGCURSOR \DIRTYPAGEHINT))
    (COND
       ((AND BACKGROUNDPAGEFREQ (ILEQ (add BACKGROUNDPAGECNT -1)
                                      0))
        (\WRITEDIRTYPAGE BACKGROUNDPAGEMIN)
        (SETQ BACKGROUNDPAGECNT BACKGROUNDPAGEFREQ])

(\SAVEVMBACKGROUND
  [LAMBDA NIL                                                (* bvm: "14-Feb-85 23:27")
    (COND
       ((AND (ILESSP \DIRTYPAGEHINT SAVEVMMAX)
             (NEQ (fetch (IFPAGE Key) of \InterfacePage)
                  \IFPValidKey)
             (FIXP SAVEVMWAIT)
             (\SECONDSCLOCKGREATERP \LASTUSERACTION SAVEVMWAIT))
        (COND
           ((AND (ILESSP (SETQ \DIRTYPAGEHINT (\COUNTREALPAGES (QUOTE DIRTY)))
                        SAVEVMMAX)
                 (\FLUSHVMOK? (QUOTE SAVEVM)
                        T))                                  (* Recalculate the hint before 
                                                             deciding it's okay)
            (RESETLST (AND SAVINGCURSOR (GETD (QUOTE CURSOR))
                           (RESETSAVE (CURSOR SAVINGCURSOR)))
                   (SAVEVM])

(COPYVM
  [LAMBDA (FILE)                                             (* bvm: "12-Jan-84 12:07")
    (DECLARE (GLOBALVARS \VMEM.INHIBIT.WRITE))
    (RESETVARS ((\VMEM.INHIBIT.WRITE T))
               (RETURN (COND
                          ((EQ (fetch (IFPAGE Key) of \InterfacePage)
                               \IFPValidKey)
                           (\COPYSYS FILE NIL T))
                          (T "Can't--virtual memory has been written to"])
)

(RPAQ? BACKGROUNDPAGEMIN 40)

(RPAQ? BACKGROUNDPAGECNT 0)

(RPAQ? BACKGROUNDPAGEFREQ 4)

(RPAQ? SAVINGCURSOR )

(RPAQ? SAVEVMMAX 600)

(RPAQ? SAVEVMWAIT 300)

(ADDTOVAR BACKGROUNDFNS \DIRTYBACKGROUND)

(ADDTOVAR TTYBACKGROUNDFNS \SAVEVMBACKGROUND)
(DECLARE: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS BACKGROUNDPAGEMIN BACKGROUNDPAGEFREQ BACKGROUNDPAGECNT)
)



(* Setting the time)

(DEFINEQ

(SETTIME
  [LAMBDA (DT)                                               (* bvm: "26-Jul-84 15:32")
    (if (OR (AND (NULL DT)
                 (\NET.SETTIME))
            (PROG [(IDT (AND DT (LISP.TO.ALTO.DATE (OR (IDATE DT)
                                                       (ERROR "Invalid date" DT]
              RETRY
                  [COND
                     ((NOT IDT)
                      (printout T "Enter date and time as string in double quotes: ")
                      (COND
                         ([SETQ IDT (IDATE (OR (SETQ DT (READ T T))
                                               (RETURN "time not set"]
                          (SETQ IDT (LISP.TO.ALTO.DATE IDT)))
                         (T (printout T "Sorry, couldn't parse that" T)
                            (GO RETRY]
                  (\SETDAYTIME0 (COND
                                   ((SMALLP IDT)
                                    (create FIXP
                                           HINUM ← 0
                                           LONUM ← IDT))
                                   (T IDT)))
                  (RETURN T)))
        then (DATE (DATEFORMAT TIME.ZONE])
)
(DEFINEQ

(RINGBELLS
  [LAMBDA (N)                                                (* mpl "20-Jul-85 23:58")
    (DECLARE (GLOBALVARS RINGBELLS.L1 RINGBELLS.L2))
    (OR (FIXP N)
        (SETQ N 1))
    (COND
       ((OR (EQ \MACHINETYPE \DAYBREAK)
            (EQ \MACHINETYPE \DANDELION))
        (to N do (PLAYTUNE RINGBELLS.L1)
                 (FLASHWINDOW NIL NIL 100)
                 (PLAYTUNE RINGBELLS.L2)))
       (T (FLASHWINDOW NIL N])

(FLASHWINDOW
  [LAMBDA (WIN? N FLASHINTERVAL SHADE)                       (* bvm: "16-Jul-85 12:20")
                                                             (* This is an "attention getting" 
                                                             action.)
                                                             (* rrb -
                                                             added shade argument so contrast of 
                                                             flash could be explored.)
    (OR (FIXP N)
        (SETQ N 1))
    (OR (FIXP FLASHINTERVAL)
        (SETQ FLASHINTERVAL 200))
    [COND
       ((WINDOWP WIN?)
        (SETQ WIN? (GETSTREAM WIN? (QUOTE OUTPUT]
    (for I to N bind (WHOLEP ←(NOT (DISPLAYSTREAMP WIN?)))
                     COLORP first [COND
                                     (WHOLEP (SETQ COLORP (NULL (VIDEOCOLOR]
       do (UNINTERRUPTABLY
                                                             (* Open-coded "during" loops so that 
                                                             no one else can sneak in and steal 
                                                             cycles)
              (COND
                 [WHOLEP                                     (* Flash the whole screen)
                        (VIDEOCOLOR (PROG1 (VIDEOCOLOR COLORP)
                                           (DISMISS FLASHINTERVAL NIL T]
                 (T                                          (* Although VIDEOCOLOR is nearly 
                                                             instantaneous, INVERTW may require a 
                                                             time approaching the interval time and 
                                                             thus this path could be much longer)
                    (INVERTW WIN? SHADE)
                    (DISMISS FLASHINTERVAL NIL T)
                    (INVERTW WIN? SHADE))))
          (COND
             ((NEQ I N)
              (BLOCK 250])

(PLAYTUNE
  [LAMBDA (TUNEPAIRS)                             (* ;;; "TUNEPAIRS is a list of (frequency . duration), where duration is (unfortunately) expressed in Dandelion Ticks (1/ \DLION.RCLKMILLISECOND) milliseconds")
    (SELECTQ (MACHINETYPE)
        (DOVE [RESETLST (RESETSAVE NIL (QUOTE (BEEPOFF)))
                     (for X in TUNEPAIRS
                        do (COND
                              ((CAR X)
                               (BEEPON (CAR X)))
                              (T (BEEPOFF)))
                           (LET [(\DurationLimit (SETUPTIMER (IQUOTIENT (ITIMES (CDR X)
                                                                               \DOVE.RCLKMILLISECOND)
                                                                    \DLION.RCLKMILLISECOND)
                                                        NIL
                                                        (QUOTE TICKS]
                                (until (TIMEREXPIRED? \DurationLimit (QUOTE TICKS))
                                   do (BLOCK]
              T)
        (DANDELION [RESETLST (RESETSAVE NIL (QUOTE (BEEPOFF)))
                          (for X in TUNEPAIRS do (COND
                                                    ((CAR X)
                                                     (BEEPON (CAR X)))
                                                    (T (BEEPOFF)))
                                                 (LET [(\DurationLimit (SETUPTIMER (CDR X)
                                                                              NIL
                                                                              (QUOTE TICKS]
                                                      (until (TIMEREXPIRED? \DurationLimit
                                                                    (QUOTE TICKS))
                                                         do (BLOCK]
                   T)
        NIL])
)
(DECLARE: EVAL@COMPILE DONTCOPY 
(DECLARE: EVAL@COMPILE 
[PUTDEF (QUOTE \PlayTimer)
       (QUOTE RESOURCES)
       (QUOTE (NEW (SETUPTIMER 0]
)
)
(/SETTOPVAL (QUOTE \\PlayTimer.GLOBALRESOURCE))
(DECLARE: DONTEVAL@LOAD DOCOPY 
(MOVD (QUOTE RINGBELLS)
      (QUOTE PRINTBELLS))
)



(* Changing display)

(DEFINEQ

(DISPLAYDOWN
  [LAMBDA (FORM NSCANLINES)                                  (* rrb "27-MAR-82 12:23")
                                                             (* evaluates form with the number of 
                                                             scan lines set down.)
    (RESETFORM (SETDISPLAYHEIGHT (OR (SMALLP NSCANLINES)
                                     0))
           (EVAL FORM])

(SETDISPLAYHEIGHT
  [LAMBDA (NSCANLINES)
    (DECLARE (GLOBALVARS \DisplayStarted \EM.DISPLAYHEAD))   (* MPL "28-Jul-85 01:32")
                                                             (* sets the number of scan lines to be 
                                                             displayed.)
                                                             (* returns previous setting.)
                                                             (* the number of lines in the dcb is 
                                                             1/2 of the total. High bit is on to 
                                                             indicate long pointers.)
    (COND
       ((OR (EQ \MACHINETYPE \DOLPHIN)
            (EQ \MACHINETYPE \DORADO))
        (OR \DisplayStarted (HELP "Display must be initialized."))
        (AND \EM.DISPLAYHEAD (PROG [(MAGICADDR (EMPOINTER (IPLUS (\GETBASE \EM.DISPLAYHEAD 0)
                                                                 3]
                                   (RETURN (PROG1 (ITIMES [LOGAND (\GETBASE MAGICADDR 0)
                                                                 (CONSTANT (SUB1 (EXPT 2 (SUB1 
                                                                                          BITSPERWORD
                                                                                               ]
                                                         2)  (* number of dcb lines may need to be 
                                                             even.)
                                                  (COND
                                                     (NSCANLINES
                                                      (COND
                                                         [(SMALLP NSCANLINES)
                                                          (COND
                                                             ((IGREATERP 0 NSCANLINES)
                                                              (\ILLEGAL.ARG NSCANLINES))
                                                             ((IGREATERP NSCANLINES SCREENHEIGHT)
                                                              (SETQ NSCANLINES SCREENHEIGHT]
                                                         ((EQ NSCANLINES T)
                                                          (SETQ NSCANLINES SCREENHEIGHT))
                                                         (T (\ILLEGAL.ARG NSCANLINES)))
                                                      (\PUTBASE MAGICADDR 0
                                                             (LOGOR (ITIMES (LRSH NSCANLINES 2)
                                                                           2)
                                                                    (CONSTANT (EXPT 2 (SUB1 
                                                                                          BITSPERWORD
                                                                                            ])

(VIDEORATE
  [LAMBDA (TYPE)                                             (* bvm: " 7-NOV-83 17:28")
    (DECLARE (GLOBALVARS \VIDEORATE))
    (PROG1 \VIDEORATE                                        (* Return old setting)
           (AND TYPE (SETQ \VIDEORATE (SELECTC \MACHINETYPE
                                          (\DOLPHIN (SELECTQ TYPE
                                                        ((NORMAL 77) 
                                                             (\DSPRATE 9 0 0)
                                                             (QUOTE NORMAL))
                                                        ((TAPE 60) 
                                                             (\DSPRATE 139 0 0)
                                                             (QUOTE TAPE))
                                                        (\ILLEGAL.ARG TYPE)))
                                          (\DORADO (SELECTQ TYPE
                                                       ((NORMAL 77) 
                                                            (\DSPRATE 18 14 430)
                                                            (QUOTE NORMAL))
                                                       ((TAPE 60) 
                                                            (\DSPRATE 18 14 560)
                                                            (QUOTE TAPE))
                                                       ((PHILLIPS TAPEP) 
                                                            (\DSPRATE 58 25 520)
                                                            (QUOTE PHILLIPS))
                                                       (\ILLEGAL.ARG TYPE)))
                                          (\DANDELION (SELECTQ TYPE
                                                          ((NORMAL 77) 
                                                               (\DEVICE.OUTPUT 14 7)
                                                               (QUOTE NORMAL))
                                                          ((TAPE 60) 
                                                               (\DEVICE.OUTPUT 142 7)
                                                               (QUOTE TAPE))
                                                          (\ILLEGAL.ARG TYPE)))
                                          (QUOTE NORMAL])
)

(RPAQ? \VIDEORATE (QUOTE NORMAL))
(DECLARE: DONTEVAL@LOAD DOCOPY 

(ADDTOVAR BREAKRESETFORMS (SETDISPLAYHEIGHT T))

(ADDTOVAR RESETFORMS (SETDISPLAYHEIGHT T))
)
(DECLARE: DONTEVAL@LOAD DOCOPY 

(RPAQQ #EOLCHARS 1)

[OR (LISTP (EVALV (QUOTE EDITCHARACTERS)))
    (RPAQ EDITCHARACTERS (QUOTE (J X Z Y N]


(ADDTOVAR POSTGREETFORMS (CNDIR))

(ADDTOVAR LISPUSERSDIRECTORIES )
)

(RPAQ? CLEANUPOPTIONS (QUOTE (RC)))
(DEFINEQ

(DOAROUNDEXITFORMS
  [LAMBDA (EVENT)                                            (* JonL "13-Sep-84 13:42")
                                                             (* For backward compatibility, handle 
                                                             the xxxFORMS that used to be in advise 
                                                             around LOGOUT, SYSOUT, MAKESYS)
    (for $$FORM in (SELECTQ EVENT
                       (BEFORELOGOUT BEFORELOGOUTFORMS)
                       (AFTERLOGOUT AFTERLOGOUTFORMS)
                       (BEFORESYSOUT BEFORESYSOUTFORMS)
                       (AFTERSYSOUT AFTERSYSOUTFORMS)
                       (BEFOREMAKESYS 
                            BEFOREMAKESYSFORMS)
                       (AFTERMAKESYS AFTERMAKESYSFORMS)
                       NIL) do (ERSETQ (\EVAL $$FORM])
)

(ADDTOVAR AROUNDEXITFNS DOAROUNDEXITFORMS)

(ADDTOVAR BEFORELOGOUTFORMS )

(ADDTOVAR AFTERLOGOUTFORMS )
(DECLARE: DONTEVAL@LOAD DOCOPY 

(RPAQ? ADVISEDFNS )
)



(* Versions)

(DEFINEQ

(REALMEMORYSIZE
  [LAMBDA NIL                                                (* bvm: "19-JAN-83 17:06")
    (fetch NRealPages of \InterfacePage])

(LISPVERSION
  [LAMBDA NIL                                                (* bvm: "19-JAN-83 17:07")
    (fetch LVersion of \InterfacePage])

(MICROCODEVERSION
  [LAMBDA NIL                                                (* bvm: "19-JAN-83 17:07")
    (fetch RVersion of \InterfacePage])

(BCPLVERSION
  [LAMBDA NIL                                                (* bvm: "19-JAN-83 17:07")
    (fetch BVersion of \InterfacePage])

(REQUIREVERSION
  [LAMBDA (LISP MICROCODE BCPL)                              (* bvm: "19-JAN-83 17:15")
    (PROG (TYPE NEEDED)
          (RETURN (COND
                     ([SETQ TYPE (OR (AND LISP (LESSP (fetch LVersion of \InterfacePage)
                                                      (SETQ NEEDED LISP))
                                          (QUOTE LISP))
                                     (AND MICROCODE (LESSP (fetch RVersion of \InterfacePage)
                                                           (SETQ NEEDED MICROCODE))
                                          (QUOTE MICROCODE))
                                     (AND BCPL (LESSP (fetch BVersion of \InterfacePage)
                                                      (SETQ NEEDED BCPL))
                                          (QUOTE BCPL]
                      (ERROR (CONCAT "This " TYPE 
                                    " version is too old.  The minimum version required is ")
                             NEEDED)
                      NIL)
                     (T T])
)



(* Misc ops)

(DEFINEQ

(READPRINTERPORT
  [LAMBDA NIL                                                (* bvm: "18-JAN-83 18:06")
    ((OPCODES READPRINTERPORT])

(WRITEPRINTERPORT
  [LAMBDA (DATUM)                                            (* bvm: "18-JAN-83 18:06")
    ((OPCODES WRITEPRINTERPORT)
     DATUM])

(\READPRINTERPORT.UFN
  [LAMBDA NIL                                                (* hdj "16-Sep-84 21:37")
    (if (EQ \MACHINETYPE \DANDELION)
        then (\DEVICE.INPUT 7])

(\WRITEPRINTERPORT.UFN
  [LAMBDA (DATUM)                                            (* hdj "16-Sep-84 21:45")
    (if (EQ \MACHINETYPE \DANDELION)
        then (\DEVICE.OUTPUT DATUM 14])

(\MISC1.UFN
  [LAMBDA (ARG ALPHA)                                        (* kbr: "12-Jul-85 17:14")
    (RAID "Illegal op to \MISC1.UFN -- " ALPHA])

(\MISC2.UFN
  [LAMBDA (ARG1 ARG2 ALPHA)                                  (* kbr: "12-Jul-85 17:13")
    (RAID "Illegal op to \MISC2.UFN -- " ALPHA])

(\MISC3.UFN
  (LAMBDA (ARG1 ARG2 ARG3 ALPHA)                             (* jop: "11-Sep-86 10:22")
    (SELECTQ ALPHA
        (0 (BLKEXPONENT ARG1 ARG2 ARG3))
        (1 (BLKMAG ARG1 ARG2 ARG3))
        (2 (BLKSMALLP2FLOAT ARG1 ARG2 ARG3))
        (3 (BLKFLOATP2COMP ARG1 ARG2 ARG3))
        (4 (\BLKFMAX.UFN ARG1 ARG2 ARG3))
        (5 (\BLKFMIN.UFN ARG1 ARG2 ARG3))
        (6 (\BLKFABSMAX.UFN ARG1 ARG2 ARG3))
        (7 (\BLKFABSMIN.UFN ARG1 ARG2 ARG3))
        (8 (\FLOATTOBYTE.UFN ARG1 ARG2 ARG3))
        (9 (%%SLOW-ARRAY-READ ARG1 ARG2 ARG3))
        (RAID "Illegal op to \MISC3.UFN --" ALPHA))))

(\MISC4.UFN
  (LAMBDA (ARG1 ARG2 ARG3 ARG4 ALPHA)                        (* jop: "11-Sep-86 10:22")
    (SELECTQ ALPHA
        (0 (BLKFTIMES ARG1 ARG2 ARG3 ARG4))
        (1 (BLKPERM ARG1 ARG2 ARG3 ARG4))
        (2 (BLKFPLUS ARG1 ARG2 ARG3 ARG4))
        (3 (BLKFDIFF ARG1 ARG2 ARG3 ARG4))
        (4 (BLKSEP ARG1 ARG2 ARG3 ARG4))
        (5 (\TRIPLEMATCH ARG1 ARG2 ARG3 ARG4))
        (6 (\BITMAPBIT ARG1 ARG2 ARG3 ARG4))
        (7 (%%SLOW-ARRAY-WRITE ARG1 ARG2 ARG3 ARG4))
        (RAID "Illegal op to \MISC4.UFN -- " ALPHA))))

(\MISC5.UFN
  [LAMBDA (ARG1 ARG2 ARG3 ARG4 ARG5 ALPHA)                   (* kbr: "12-Jul-85 17:05")
    (RAID "Illegal op to \MISC5.UFN -- " ALPHA])

(\MISC6.UFN
  [LAMBDA (ARG1 ARG2 ARG3 ARG4 ARG5 ARG6 ALPHA)              (* kbr: "12-Jul-85 17:04")
    (RAID "Illegal op to \MISC6.UFN -- " ALPHA])

(\MISC7.UFN
  [LAMBDA (ARG1 ARG2 ARG3 ARG4 ARG5 ARG6 ARG7 ALPHA)         (* kbr: "12-Jul-85 17:03")
    (SELECTQ ALPHA
        (0 (\PSEUDOCOLOR.UFN ARG1 ARG2 ARG3 ARG4 ARG5 ARG6 ARG7))
        (RAID "Illegal op to \MISC7.UFN -- " ALPHA])

(\MISC8.UFN
  [LAMBDA (ARG1 ARG2 ARG3 ARG4 ARG5 ARG6 ARG7 ARG8 ALPHA)    (* hdj "26-Feb-85 11:56")
    (SELECTQ ALPHA
        (0 (IBLT1 ARG1 ARG2 ARG3 ARG4 ARG5 ARG6 ARG7 ARG8))
        (1 (IBLT2 ARG1 ARG2 ARG3 ARG4 ARG5 ARG6 ARG7 ARG8))
        (RAID "Illegal op to \MISC8.UFN --" ALPHA])

(\MISC10.UFN
  [LAMBDA (ARG1 ARG2 ARG3 ARG4 ARG5 ARG6 ARG7 ARG8 ARG9 ARG10 ALPHA)
                                                             (* kbr: "12-Jul-85 17:16")
    (SELECTQ ALPHA
        (0 (\PIXELBLT.UFN ARG1 ARG2 ARG3 ARG4 ARG5 ARG6 ARG7 ARG8 ARG9 ARG10))
        (HELP "Illegal op to \MISC10.UFN -- " ALPHA])
)



(* sub-functions of floating-point ufns)

(DEFINEQ

(BLKFLOATP2COMP
  [LAMBDA (source destination kount)                         (* hdj "21-Jun-84 19:03")
          
          (* * moves the contents of a Real array into a Complex array;
          sets imaginary part to 0)
                                                             (* \CHECKARRAYINDEX destination
                                                             (SUB1 kount))
    (for sourceElt from 0 to (SUB1 kount) do (SETCOMPLEX (\ADDBASE destination (LLSH sourceElt 2))
                                                    (\GETBASEFLOATP source (LLSH sourceElt 1))
                                                    0.0])

(BLKSMALLP2FLOAT
  [LAMBDA (source destination kkount)                        (* edited: "22-Jun-84 04:21")
          
          (* * convert an array of SMALLPs to FLOATPs)
                                                             (* \CHECKARRAYINDEX destination
                                                             (SUB1 kount))
    (for NN from 0 to (SUB1 kkount) do (\PUTBASEFLOATP destination (LLSH NN 1)
                                              (FLOAT (\GETBASE source NN])

(BLKMAG
  [LAMBDA (complexArray magnitudeArray kount)                (* hdj "21-Jun-84 18:53")
                                                             (* \CHECKARRAYINDEX magnitudeArray
                                                             (SUB1 kount))
    (for magnitude from 0 to (SUB1 kount) bind complexcount real imag
       do (SETQ complexcount (LLSH magnitude 2))
          (SETQ real (\GETBASEFLOATP complexArray complexcount))
          (SETQ imag (\GETBASEFLOATP complexArray (IPLUS complexcount 2)))
          (\PUTBASEFLOATP magnitudeArray (LLSH magnitude 1)
                 (FPLUS (FTIMES real real)
                        (FTIMES imag imag])

(BLKEXPONENT
  [LAMBDA (source destination kount)                         (* edited: "24-Jun-84 23:44")
          
          (* * extract the exponent of each element of source, stick it in destination)
                                                             (* \CHECKARRAYINDEX destination
                                                             (SUB1 kount))
    (for X from 0 to (SUB1 kount) do (\PUTBASE destination X (fetch (FLOATP EXPONENT)
                                                                of (\GETBASEFLOATP source
                                                                          (LLSH X 1])
)
(DEFINEQ

(BLKSEP
  (LAMBDA (SOURCE1 SOURCE2 DEST KOUNT)                       (* hdj "12-Nov-84 16:02")
          
          (* *)

    (for ALPHAINDEX from 0 to (LLSH (SUB1 KOUNT)
                                    1) by 8 bind BETAINDEX GAMMAINDEX DELTAINDEX
       do (SETQ BETAINDEX (IDIFFERENCE KOUNT ALPHAINDEX))
          (SETQ GAMMAINDEX (IPLUS ALPHAINDEX 2))
          (SETQ DELTAINDEX (IPLUS BETAINDEX 2))
          (\PUTBASEFLOATP DEST ALPHAINDEX (FPLUS (\GETBASEFLOATP SOURCE1 ALPHAINDEX)
                                                 (\GETBASEFLOATP SOURCE2 BETAINDEX)))
          (\PUTBASEFLOATP DEST (IPLUS ALPHAINDEX 2)
                 (FDIFFERENCE (\GETBASEFLOATP SOURCE1 GAMMAINDEX)
                        (\GETBASEFLOATP SOURCE2 DELTAINDEX)))
          (\PUTBASEFLOATP DEST (IPLUS ALPHAINDEX 4)
                 (FPLUS (\GETBASEFLOATP SOURCE1 GAMMAINDEX)
                        (\GETBASEFLOATP SOURCE2 DELTAINDEX)))
          (\PUTBASEFLOATP DEST (IPLUS ALPHAINDEX 6)
                 (FDIFFERENCE (\GETBASEFLOATP SOURCE1 ALPHAINDEX)
                        (\GETBASEFLOATP SOURCE2 BETAINDEX))))))

(BLKFDIFF
  (LAMBDA (SOURCE1 SOURCE2 DEST COUNT)                       (* hdj "20-Sep-84 12:35")
    (for INDEX from 0 to (LLSH (SUB1 COUNT)
                               1) by 2 do (\PUTBASEFLOATP DEST INDEX (FDIFFERENCE (\GETBASEFLOATP
                                                                                   SOURCE1 INDEX)
                                                                            (\GETBASEFLOATP SOURCE2 
                                                                                   INDEX))))))

(BLKFPLUS
  (LAMBDA (SOURCE1 SOURCE2 DEST COUNT)                       (* hdj "20-Sep-84 12:36")
    (for INDEX from 0 to (LLSH (SUB1 COUNT)
                               1) by 2 do (\PUTBASEFLOATP DEST INDEX (FPLUS (\GETBASEFLOATP SOURCE1 
                                                                                   INDEX)
                                                                            (\GETBASEFLOATP SOURCE2 
                                                                                   INDEX))))))

(BLKPERM
  (LAMBDA (orig permutations destination kount)              (* hdj "21-Jun-84 19:26")
          
          (* * destination (x) ← orig (perm (x)))
          
          (* * args are arrays of smallps (words))
          
          (* * must fold initial into offset for compatibility with microcode)

    (for X from 0 to (SUB1 kount) do (\PUTBASE destination X (\GETBASE orig (\GETBASE permutations X)
                                                                    )))))

(BLKFTIMES
  (LAMBDA (SOURCE1 SOURCE2 DEST COUNT)                       (* hdj "21-Jun-84 19:11")
    (for INDEX from 0 to (LLSH (SUB1 COUNT)
                               1) by 2 do (\PUTBASEFLOATP DEST INDEX (FTIMES (\GETBASEFLOATP SOURCE1 
                                                                                    INDEX)
                                                                            (\GETBASEFLOATP SOURCE2 
                                                                                   INDEX))))))

(\FLOATTOBYTE.UFN
  [LAMBDA (SBASE DBASE CNT)
    (for I from 0 to (SUB1 (DIV2 CNT))
       do (\PUTBASE DBASE I (LOGOR (LLSH [FIX (FMIN 255.0 (FMAX 0.0 (\GETBASEFLOATP SBASE
                                                                           (MUL4 I]
                                         8)
                                   (FIX (FMIN 255.0 (FMAX 0.0 (\GETBASEFLOATP SBASE
                                                                     (IPLUS 2 (MUL4 I])

(\BLKFMAX.UFN
  [LAMBDA (BASE ZERO CNT)
    (LET ((IDX 0)
          (MX (\GETBASEFLOATP BASE 0)))
         [for I from 0 to (SUB1 CNT) do (if [NOT (GREATERP MX (\GETBASEFLOATP BASE (IPLUS I I]
                                            then (SETQ IDX I)
                                                 (SETQ MX (\GETBASEFLOATP BASE (IPLUS IDX IDX]
     IDX])

(\BLKFMIN.UFN
  [LAMBDA (BASE ZERO CNT)
    (LET ((IDX 0)
          (MN (\GETBASEFLOATP BASE 0)))
         [for I from 0 to (SUB1 CNT) do (if [NOT (LESSP MN (\GETBASEFLOATP BASE (IPLUS I I]
                                            then (SETQ IDX I)
                                                 (SETQ MN (\GETBASEFLOATP BASE (IPLUS IDX IDX]
     IDX])

(\BLKFABSMAX.UFN
  [LAMBDA (BASE ZERO CNT)
    (LET ((IDX 0)
          (MX (\GETBASEFLOATP BASE 0)))
         [for I from 0 to (SUB1 CNT)
            do (if [NOT (GREATERP MX (FABS (\GETBASEFLOATP BASE (IPLUS I I]
                   then (SETQ IDX I)
                        (SETQ MX (FABS (\GETBASEFLOATP BASE (IPLUS IDX IDX]
     IDX])

(\BLKFABSMIN.UFN
  [LAMBDA (BASE ZERO CNT)
    (LET ((IDX 0)
          (MN (\GETBASEFLOATP BASE 0)))
         [for I from 0 to (SUB1 CNT)
            do (if [NOT (LESSP MN (FABS (\GETBASEFLOATP BASE (IPLUS I I]
                   then (SETQ IDX I)
                        (SETQ MN (FABS (\GETBASEFLOATP BASE (IPLUS IDX IDX]
     IDX])
)
(DEFINEQ

(IBLT1
  [LAMBDA (ValueArray TextureArray XCoord BitmapAddr BitmapWidth ValHeight ValWidth Kount)
                                                             (* hdj " 2-Jul-84 17:52")
          
          (* * ValueArray -
          an array of 128 elements, 8 bits each)
          
          (* * TextureArray -
          an array of 256 elements, each a texture)
          
          (* * XCoord -
          bit offset from left of destination bitmap)
          
          (* * BitmapAddr -
          destination)
          
          (* * BitmapWidth -
          width of dest bitmap in words)
          
          (* * ValHeight -
          height of bar)
          
          (* * ValWidth -
          width of bar)
          
          (* * Kount -
          how many elements of ValueArray to graph)

    (PROG (TEXTURE (BITMAPOFFSET BitmapAddr))
          (for val from (SUB1 Kount) to 0 by -1 do (SETQ TEXTURE (\GETBASE TextureArray
                                                                        (\GETBASE ValueArray val)))
                                                   (for X from 1 to ValHeight
                                                      do (\PUTBASEBITS BITMAPOFFSET XCoord ValWidth 
                                                                TEXTURE)
                                                         (SETQ BITMAPOFFSET (\ADDBASE BITMAPOFFSET 
                                                                                   BitmapWidth])

(IBLT2
  [LAMBDA (ValueArray TextureArray XCoord BitmapAddr BitmapWidth ValHeight ValWidth Kount)
                                                             (* hdj "20-Sep-84 12:20")
          
          (* * Steps by 2, as opposed to IBLT1, which steps by 1)
          
          (* * ValueArray -
          an array of 128 elements, 8 bits each)
          
          (* * TextureArray -
          an array of 256 elements, each a texture)
          
          (* * XCoord -
          bit offset from left of destination bitmap)
          
          (* * BitmapAddr -
          destination)
          
          (* * BitmapWidth -
          width of dest bitmap in words)
          
          (* * ValHeight -
          height of bar)
          
          (* * ValWidth -
          width of bar)
          
          (* * Kount -
          how many elements of ValueArray to graph)

    (PROG (TEXTURE (BITMAPOFFSET BitmapAddr))
          (for val from (SUB1 Kount) to 0 by -2 do (SETQ TEXTURE (\GETBASE TextureArray
                                                                        (\GETBASE ValueArray val)))
                                                   (for X from 1 to ValHeight
                                                      do (\PUTBASEBITS BITMAPOFFSET XCoord ValWidth 
                                                                TEXTURE)
                                                         (SETQ BITMAPOFFSET (\ADDBASE BITMAPOFFSET 
                                                                                   BitmapWidth])
)

(RPAQQ RINGBELLS.L1 ((1000 . 1000)
                     (800 . 1000)
                     (600 . 1000)
                     (500 . 1000)
                     (400 . 1000)
                     (NIL . 500)
                     (440 . 1000)
                     (484 . 1000)
                     (540 . 1000)
                     (600 . 1000)))

(RPAQQ RINGBELLS.L2 ((2000 . 1000)
                     (1600 . 1000)
                     (1200 . 1000)
                     (1000 . 1000)
                     (800 . 1000)
                     (NIL . 500)
                     (880 . 1000)
                     (968 . 1000)
                     (1080 . 1000)
                     (1188 . 1000)))
(DECLARE: DOEVAL@COMPILE DONTCOPY

(LOCALVARS . T)
)
(DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS 

(ADDTOVAR NLAMA )

(ADDTOVAR NLAML TIMEALL)

(ADDTOVAR LAMA )
)
(PUTPROPS DMISC COPYRIGHT ("Xerox Corporation" T 1982 1983 1984 1985 1986))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (4969 5778 (BACKSPACEDEL 4979 . 5776)) (5882 21620 (TIMEALL 5892 . 8955) (COPYMISCSTATS 
8957 . 9903) (COPYTIMESTATS 9905 . 11000) (CREATEMISCSTATS 11002 . 11506) (DIFFMISCSTATS 11508 . 14130
) (DIFFTIMESTATS 14132 . 16959) (PRINTMISCSTATS 16961 . 20937) (PRINTMISCSTATSITEM 20939 . 21618)) (
21744 22184 (PERIODICALLYRECLAIM 21754 . 22182)) (22420 24218 (\DIRTYBACKGROUND 22430 . 22860) (
\SAVEVMBACKGROUND 22862 . 23738) (COPYVM 23740 . 24216)) (24634 25840 (SETTIME 24644 . 25838)) (25841 
30404 (RINGBELLS 25851 . 26328) (FLASHWINDOW 26330 . 28425) (PLAYTUNE 28427 . 30402)) (30713 36622 (
DISPLAYDOWN 30723 . 31150) (SETDISPLAYHEIGHT 31152 . 34228) (VIDEORATE 34230 . 36620)) (37063 37963 (
DOAROUNDEXITFORMS 37073 . 37961)) (38161 39931 (REALMEMORYSIZE 38171 . 38336) (LISPVERSION 38338 . 
38498) (MICROCODEVERSION 38500 . 38665) (BCPLVERSION 38667 . 38827) (REQUIREVERSION 38829 . 39929)) (
39953 43449 (READPRINTERPORT 39963 . 40111) (WRITEPRINTERPORT 40113 . 40275) (\READPRINTERPORT.UFN 
40277 . 40474) (\WRITEPRINTERPORT.UFN 40476 . 40682) (\MISC1.UFN 40684 . 40844) (\MISC2.UFN 40846 . 
41006) (\MISC3.UFN 41008 . 41661) (\MISC4.UFN 41663 . 42226) (\MISC5.UFN 42228 . 42388) (\MISC6.UFN 
42390 . 42550) (\MISC7.UFN 42552 . 42801) (\MISC8.UFN 42803 . 43112) (\MISC10.UFN 43114 . 43447)) (
43499 46128 (BLKFLOATP2COMP 43509 . 44194) (BLKSMALLP2FLOAT 44196 . 44731) (BLKMAG 44733 . 45444) (
BLKEXPONENT 45446 . 46126)) (46129 51517 (BLKSEP 46139 . 47293) (BLKFDIFF 47295 . 47859) (BLKFPLUS 
47861 . 48420) (BLKPERM 48422 . 48947) (BLKFTIMES 48949 . 49511) (\FLOATTOBYTE.UFN 49513 . 50007) (
\BLKFMAX.UFN 50009 . 50397) (\BLKFMIN.UFN 50399 . 50784) (\BLKFABSMAX.UFN 50786 . 51151) (
\BLKFABSMIN.UFN 51153 . 51515)) (51518 54819 (IBLT1 51528 . 53131) (IBLT2 53133 . 54817)))))
STOP