(FILECREATED "16-Feb-86 00:11:13" {ERIS}<LISPCORE>LIBRARY>BUSCOLOR.;7 13251 changes to: (FNS \BUSCOLOR.UPDATEDAEMON) (VARS \BUSCOLOR.LOCKEDFNS BUSCOLORCOMS) previous date: "10-Feb-86 12:31:55" {ERIS}<LISPCORE>LIBRARY>BUSCOLOR.;4) (* Copyright (c) 1985, 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT BUSCOLORCOMS) (RPAQQ BUSCOLORCOMS ((* BUSCOLOR -- Update daemon for the BUSMASTER color cards -- By Kelly Roach and Herb Jellinek. *) (FNS \BUSCOLOR.INIT) (FNS \BUSCOLOR.STARTCOLOR \BUSCOLOR.STOPCOLOR) (FNS \REMOVE.PERIODIC.INTERRUPT \INSTALL.PERIODIC.INTERRUPT) (P (MOVD? (FUNCTION NILL) (FUNCTION \BUSCOLOR.SENDPAGE))) (FNS \BUSCOLOR.BITMAPPAGES \BUSCOLOR.BITMAPWORDS \BUSCOLOR.DIRTYPAGEP \BUSCOLOR.MAKECLEANPAGE \BUSCOLOR.MAKEDIRTYPAGE \BUSCOLOR.UPDATEDAEMON \BUSCOLOR.EVENTFN) (MACROS \BUSCOLOR.DIRTYPAGEP) (CONSTANTS \VMAP.NOTDIRTY) (PROP ARGNAMES \BUSBLTOUTBYTES) (FILES BUSMASTER COLOR) (DECLARE: DOEVAL@LOAD DONTEVAL@COMPILE DONTCOPY (FILES (LOADFROM) LLFAULT BUSMASTER)) (VARS \BUSCOLOR.LOCKEDFNS \BUSCOLOR.LOCKEDVARS) (DECLARE: DONTEVAL@LOAD DONTEVAL@COMPILE DOCOPY (P (\BUSCOLOR.INIT))))) (* BUSCOLOR -- Update daemon for the BUSMASTER color cards -- By Kelly Roach and Herb Jellinek. *) (DEFINEQ (\BUSCOLOR.INIT (LAMBDA NIL (* kbr: " 1-Jul-85 18:19") (for FN in \BUSCOLOR.LOCKEDFNS do (\LOCKFN FN)) (for VAR in \BUSCOLOR.LOCKEDVARS do (\LOCKVAR VAR)))) ) (DEFINEQ (\BUSCOLOR.STARTCOLOR (LAMBDA (FDEV) (* kbr: "10-Feb-86 12:01") (* turns on the color display and allocates color screen bitmap. *) (DECLARE (GLOBALVARS ColorScreenBitMap ColorScreenBitMapBase ColorScreenBitMapEnd ColorScreenBitMapEndPage ColorScreenBitMapBasePage ColorScreenBitMapPages \BUSCOLOR.MOVELIMIT \BUSCOLOR.LASTMOVEDPAGE \PERIODIC.INTERRUPT.FREQUENCY)) (PROG (DISPLAYSTATE WSOPS) (COND ((EQ (MACHINETYPE) (QUOTE DANDELION)) (SETQ DISPLAYSTATE (fetch (FDEV DEVICEINFO) of FDEV)) (SETQ WSOPS (fetch (FDEV WINDOWOPS) of FDEV)) (replace (DISPLAYSTATE ONOFF) of DISPLAYSTATE with (QUOTE STARTCOLOR)) (APPLY* (fetch (WSOPS STARTBOARD) of WSOPS)) (MOVD (fetch (WSOPS SENDPAGE) of WSOPS) (FUNCTION \BUSCOLOR.SENDPAGE)) (MOVD (fetch (WSOPS PILOTBITBLT) of WSOPS) (FUNCTION \SOFTCURSORPILOTBITBLT)) (* Lock down memory for the color screen bitmap. *) (SETQ ColorScreenBitMapBase (fetch (BITMAP BITMAPBASE) of ColorScreenBitMap)) (SETQ.NOREF ColorScreenBitMapEnd (\ADDBASE ColorScreenBitMapBase (\BUSCOLOR.BITMAPWORDS ColorScreenBitMap ))) (SETQ ColorScreenBitMapEndPage (fetch (POINTER PAGE#) of ColorScreenBitMapEnd)) (SETQ ColorScreenBitMapBasePage (fetch (POINTER PAGE#) of ColorScreenBitMapBase)) (SETQ ColorScreenBitMapPages (\BUSCOLOR.BITMAPPAGES ColorScreenBitMap)) (\LOCKPAGES ColorScreenBitMapBase ColorScreenBitMapPages) (SETQ \BUSCOLOR.MOVELIMIT 100) (* move no more than 100 pages per go-round of \BUSCOLOR.UPDATEDAEMON) (SETQ \BUSCOLOR.LASTMOVEDPAGE 0) (* do update every 10 / 77 of a sec) (SETQ \PERIODIC.INTERRUPT.FREQUENCY 10) (for PAGE from ColorScreenBitMapBasePage to ColorScreenBitMapEndPage do (\BUSCOLOR.MAKEDIRTYPAGE PAGE)) (\INSTALL.PERIODIC.INTERRUPT (FUNCTION \BUSCOLOR.UPDATEDAEMON)) (replace (DISPLAYSTATE ONOFF) of DISPLAYSTATE with (QUOTE ON))))))) (\BUSCOLOR.STOPCOLOR (LAMBDA (FDEV) (* kbr: "10-Feb-86 12:08") (* turns the color display off) (PROG (DISPLAYSTATE) (SETQ DISPLAYSTATE (fetch (FDEV DEVICEINFO) of FDEV)) (replace (DISPLAYSTATE ONOFF) of DISPLAYSTATE with (QUOTE STOPCOLOR)) (\REMOVE.PERIODIC.INTERRUPT (FUNCTION \BUSCOLOR.UPDATEDAEMON)) (for PAGE from ColorScreenBitMapBasePage to ColorScreenBitMapEndPage do (\BUSCOLOR.MAKEDIRTYPAGE PAGE)) (\UNLOCKPAGES ColorScreenBitMapBase ColorScreenBitMapPages) (replace (DISPLAYSTATE ONOFF) of DISPLAYSTATE with (QUOTE OFF))))) ) (DEFINEQ (\REMOVE.PERIODIC.INTERRUPT (LAMBDA (INTERRUPT) (DECLARE (GLOBALVARS \PERIODIC.INTERRUPT)) (* hdj "31-Oct-84 17:08") (PROG1 \PERIODIC.INTERRUPT (SETQ \PERIODIC.INTERRUPT NIL)))) (\INSTALL.PERIODIC.INTERRUPT (LAMBDA (INTERRUPT) (DECLARE (GLOBALVARS \PERIODIC.INTERRUPT)) (* hdj "31-Oct-84 17:08") (PROG1 \PERIODIC.INTERRUPT (SETQ \PERIODIC.INTERRUPT INTERRUPT)))) ) (MOVD? (FUNCTION NILL) (FUNCTION \BUSCOLOR.SENDPAGE)) (DEFINEQ (\BUSCOLOR.BITMAPPAGES (LAMBDA (BITMAP) (* hdj "23-Oct-84 11:47") (FOLDHI (ITIMES (fetch (BITMAP BITMAPRASTERWIDTH) of BITMAP) (fetch (BITMAP BITMAPHEIGHT) of BITMAP)) WORDSPERPAGE))) (\BUSCOLOR.BITMAPWORDS (LAMBDA (BM) (* hdj "23-Oct-84 15:56") (ITIMES (fetch (BITMAP BITMAPRASTERWIDTH) of BM) (fetch (BITMAP BITMAPHEIGHT) of BM)))) (\BUSCOLOR.DIRTYPAGEP (LAMBDA (VPAGE) (* hdj "19-Oct-84 12:31") (fetch (VMEMFLAGS DIRTY) of (\READFLAGS VPAGE)))) (\BUSCOLOR.MAKECLEANPAGE (LAMBDA (VPAGE) (* hdj "18-Oct-84 18:26") (\WRITEMAP VPAGE (\READRP VPAGE) (LOGAND \VMAP.NOTDIRTY (\READFLAGS VPAGE))))) (\BUSCOLOR.MAKEDIRTYPAGE (LAMBDA (VPAGE) (* hdj "18-Oct-84 18:27") (\WRITEMAP VPAGE (\READRP VPAGE) (LOGOR \VMAP.DIRTY (\READFLAGS VPAGE))))) (\BUSCOLOR.UPDATEDAEMON (LAMBDA NIL (* kbr: "16-Feb-86 00:04") (* Runs under periodic interrupt; flushes changed pages in local copy of PC framebuffer out to PC *) (DECLARE (GLOBALVARS \BUSCOLOR.LASTMOVEDPAGE \BUSCOLOR.MOVELIMIT)) (COND (\INTERRUPTABLE (UNINTERRUPTABLY (\REMOVE.PERIODIC.INTERRUPT (FUNCTION \BUSCOLOR.UPDATEDAEMON)) (PROG (PAGESMOVED CURRPAGE ABSCURRPAGE) (SETQ CURRPAGE \BUSCOLOR.LASTMOVEDPAGE) (SETQ PAGESMOVED 0) (until (EQ (SETQ CURRPAGE (ADD1 CURRPAGE)) ColorScreenBitMapPages) do (SETQ ABSCURRPAGE (IPLUS ColorScreenBitMapBasePage CURRPAGE)) (COND ((\BUSCOLOR.DIRTYPAGEP ABSCURRPAGE) (\BUSCOLOR.SENDPAGE (create POINTER PAGE# ← ABSCURRPAGE) CURRPAGE) (\BUSCOLOR.MAKECLEANPAGE ABSCURRPAGE) (SETQ PAGESMOVED (ADD1 PAGESMOVED)) (COND ((EQ PAGESMOVED \BUSCOLOR.MOVELIMIT) (RETURN))))) finally (SETQ CURRPAGE -1)) (SETQ \BUSCOLOR.LASTMOVEDPAGE CURRPAGE)) (\INSTALL.PERIODIC.INTERRUPT (FUNCTION \BUSCOLOR.UPDATEDAEMON))))))) (\BUSCOLOR.EVENTFN (LAMBDA (DEVICE EVENT) (* kbr: "15-Jul-85 14:34") (* * if we are about to SYSOUT, MAKESYS, SAVEVM or LOGOUT we flush all local framebuffer pages to PC and mark all pages dirty so they get written out to vmem file. We turn off the update agent for the interim to avoid creating a race condition) (* * we only want to do it if the display is turned on, and not merely extant) (COND ((EQ (fetch (DISPLAYSTATE ONOFF) of (fetch (FDEV DEVICEINFO) of DEVICE)) (QUOTE ON)) (SELECTQ EVENT ((BEFORELOGOUT BEFORESYSOUT BEFOREMAKESYS) (* turn off display since we may awake on different machine) (* will disable interrupt and thus avoid race condition) (COLORDISPLAY (QUOTE OFF))) (BEFORESAVEVM (\REMOVE.PERIODIC.INTERRUPT (QUOTE \BUSCOLOR.UPDATEDAEMON)) (for PAGE from ColorScreenBitMapBasePage to ColorScreenBitMapEndPage do (\BUSCOLOR.MAKEDIRTYPAGE PAGE))) ((AFTERLOGOUT AFTERSYSOUT AFTERMAKESYS) (* TBW: Implement these in a way that is color board and MACHINETYPE independent. Take into account that machine user has moved to may not have a color display or that the of color display has changed. Some changes may cause fields of FDEV to swap out. *) NIL) ((AFTERSAVEVM AFTERDOSAVEVM) (SCREENCOLORMAP (SCREENCOLORMAP)) (for PAGE from ColorScreenBitMapBasePage to ColorScreenBitMapEndPage do (\BUSCOLOR.MAKEDIRTYPAGE PAGE)) (\INSTALL.PERIODIC.INTERRUPT (QUOTE \BUSCOLOR.UPDATEDAEMON))) NIL))))) ) (DECLARE: EVAL@COMPILE (PUTPROPS \BUSCOLOR.DIRTYPAGEP DMACRO ((VPAGE) (fetch (VMEMFLAGS DIRTY) of (\READFLAGS VPAGE)))) ) (DECLARE: EVAL@COMPILE (RPAQQ \VMAP.NOTDIRTY -4097) (CONSTANTS \VMAP.NOTDIRTY) ) (PUTPROPS \BUSBLTOUTBYTES ARGNAMES (VMADDR BUSADDRHI BUSADDRLO NWORDS)) (FILESLOAD BUSMASTER COLOR) (DECLARE: DOEVAL@LOAD DONTEVAL@COMPILE DONTCOPY (FILESLOAD (LOADFROM) LLFAULT BUSMASTER) ) (RPAQQ \BUSCOLOR.LOCKEDFNS (\BUSCOLOR.UPDATEDAEMON \REMOVE.PERIODIC.INTERRUPT \BUSCOLOR.SENDPAGE \BUSCOLOR.MAKECLEANPAGE \INSTALL.PERIODIC.INTERRUPT PCBUS.WRITE PCBUS.WRITEHL)) (RPAQQ \BUSCOLOR.LOCKEDVARS (ColorScreenBitMapPages ColorScreenBitMapBasePage \BUSCOLOR.MOVELIMIT \BUSCOLOR.LASTMOVEDPAGE)) (DECLARE: DONTEVAL@LOAD DONTEVAL@COMPILE DOCOPY (\BUSCOLOR.INIT) ) (PUTPROPS BUSCOLOR COPYRIGHT ("Xerox Corporation" 1985 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (1782 2047 (\BUSCOLOR.INIT 1792 . 2045)) (2048 6186 (\BUSCOLOR.STARTCOLOR 2058 . 5289) ( \BUSCOLOR.STOPCOLOR 5291 . 6184)) (6187 6666 (\REMOVE.PERIODIC.INTERRUPT 6197 . 6426) ( \INSTALL.PERIODIC.INTERRUPT 6428 . 6664)) (6728 12124 (\BUSCOLOR.BITMAPPAGES 6738 . 7008) ( \BUSCOLOR.BITMAPWORDS 7010 . 7244) (\BUSCOLOR.DIRTYPAGEP 7246 . 7424) (\BUSCOLOR.MAKECLEANPAGE 7426 . 7644) (\BUSCOLOR.MAKEDIRTYPAGE 7646 . 7860) (\BUSCOLOR.UPDATEDAEMON 7862 . 10239) (\BUSCOLOR.EVENTFN 10241 . 12122))))) STOP