DIRECTORY Basics USING [LongNumber], BasicTime USING [GetClockPulses, Pulses, PulsesToMicroseconds], BlockOps, PrincOpsUtils USING [LongZero], Random USING [Create, NextInt, RandomStream], VM USING [PagesForWords, AddressForPageNumber, Interval, Pin, SimpleAllocate]; BlockOpsImpl: CEDAR MONITOR IMPORTS BasicTime, PrincOpsUtils, Random, VM, BlockOps = BEGIN blkSpace64K: LONG POINTER TO BlockOps.LookupRecord _ NIL; blkSpace128K: LONG POINTER TO BlockOps.LookupRecord _ NIL; opBltSpace64K: LONG POINTER TO BlockOps.OpBltRecord _ NIL; beginPulses, stopPulses: BasicTime.Pulses; Init64K: ENTRY PROC = TRUSTED { IF blkSpace64K = NIL THEN { nPages: INT _ VM.PagesForWords[SIZE[BlockOps.LookupRecord]]; interval: VM.Interval _ VM.SimpleAllocate[nPages]; VM.Pin[interval]; blkSpace64K _ LOOPHOLE[VM.AddressForPageNumber[interval.page]]; nPages _ VM.PagesForWords[SIZE[BlockOps.OpBltRecord]]; interval _ VM.SimpleAllocate[nPages]; VM.Pin[interval]; opBltSpace64K _ LOOPHOLE[VM.AddressForPageNumber[interval.page]]; interval _ VM.SimpleAllocate[256]; VM.Pin[interval]; blkSpace64K.src _ LOOPHOLE[VM.AddressForPageNumber[interval.page]]; opBltSpace64K.srcA _ blkSpace64K.src; interval _ VM.SimpleAllocate[256]; VM.Pin[interval]; opBltSpace64K.dst _ blkSpace64K.dst _ LOOPHOLE[VM.AddressForPageNumber[interval.page]]; interval _ VM.SimpleAllocate[256]; VM.Pin[interval]; opBltSpace64K.srcB _ blkSpace64K.table _ LOOPHOLE[VM.AddressForPageNumber[interval.page]]; FOR i: CARD16 IN [0..LAST[CARD16]] DO (blkSpace64K.src+i)^ _ i; (blkSpace64K.table+i)^ _ 2*i; ENDLOOP; }; TRUSTED { PrincOpsUtils.LongZero[blkSpace64K.dst+1, LAST[CARD16]]; blkSpace64K.dst^ _ 0; }; }; Init128K: ENTRY PROC[doRand: BOOL] = TRUSTED { IF blkSpace128K = NIL THEN { nPages: INT = VM.PagesForWords[SIZE[BlockOps.LookupRecord]]; interval: VM.Interval _ VM.SimpleAllocate[nPages]; VM.Pin[interval]; blkSpace128K _ LOOPHOLE[VM.AddressForPageNumber[interval.page]]; interval _ VM.SimpleAllocate[512]; VM.Pin[interval]; blkSpace128K.src _ LOOPHOLE[VM.AddressForPageNumber[interval.page]]; interval _ VM.SimpleAllocate[512]; VM.Pin[interval]; blkSpace128K.dst _ LOOPHOLE[VM.AddressForPageNumber[interval.page]]; interval _ VM.SimpleAllocate[256]; VM.Pin[interval]; blkSpace128K.table _ LOOPHOLE[VM.AddressForPageNumber[interval.page]]; { src: LONG POINTER TO CARD16 _ blkSpace128K.src; tbl: LONG POINTER TO CARD16 _ blkSpace128K.table; IF doRand THEN { rs: Random.RandomStream = Random.Create[LONG[LAST[CARD16]]+1, 1234567]; FOR k: CARD16 IN [0..1] DO FOR i: CARD16 IN [0..LAST[CARD16]] DO ln: Basics.LongNumber = LOOPHOLE[Random.NextInt[rs]]; src^ _ ln.lo; src _ src + 1; ENDLOOP; ENDLOOP; } ELSE FOR k: CARD16 IN [0..1] DO srcV: CARD16 _ LAST[CARD16] ; FOR i: CARD16 IN [0..LAST[CARD16]] DO src^ _ srcV; src _ src + 1; srcV _ srcV - 1; ENDLOOP; ENDLOOP; FOR i: CARD16 IN [0..LAST[CARD16]] DO tbl^ _ 2*i; tbl _ tbl + 1; ENDLOOP; }; }; PrincOpsUtils.LongZero[blkSpace128K.dst+1, LAST[CARD16]]; blkSpace128K.dst^ _ 0; PrincOpsUtils.LongZero[blkSpace128K.dst+1+LAST[CARD16], LAST[CARD16] ]; (blkSpace128K.dst+LAST[CARD16]+1)^ _ 0; }; TbMc1: PROC[n: CARD16] RETURNS[INT] = TRUSTED { Init64K[]; blkSpace64K.srcSkip _ 1; blkSpace64K.dstSkip _ 1; blkSpace64K.count _ n; beginPulses _ BasicTime.GetClockPulses[]; BlockOps.TableLookup[blkSpace64K]; stopPulses _ BasicTime.GetClockPulses[]; RETURN[BasicTime.PulsesToMicroseconds[stopPulses - beginPulses]]; }; TbMc2: PROC[dstSkip, n: CARD16] RETURNS[INT] = TRUSTED { Init128K[FALSE]; blkSpace128K.srcSkip _ 1; blkSpace128K.dstSkip _ dstSkip; blkSpace128K.count _ n; beginPulses _ BasicTime.GetClockPulses[]; BlockOps.TableLookup[blkSpace128K]; stopPulses _ BasicTime.GetClockPulses[]; RETURN[BasicTime.PulsesToMicroseconds[stopPulses - beginPulses]]; }; TbMc3: PROC[dstSkip, n: CARD16] RETURNS[INT] = TRUSTED { Init128K[TRUE]; blkSpace128K.srcSkip _ 1; blkSpace128K.dstSkip _ dstSkip; blkSpace128K.count _ n; beginPulses _ BasicTime.GetClockPulses[]; BlockOps.TableLookup[blkSpace128K]; stopPulses _ BasicTime.GetClockPulses[]; RETURN[BasicTime.PulsesToMicroseconds[stopPulses - beginPulses]]; }; Tb3: PROC[dstSkip, n: CARD16] RETURNS[INT] = TRUSTED { Init128K[TRUE]; blkSpace128K.srcSkip _ 1; blkSpace128K.dstSkip _ dstSkip; blkSpace128K.count _ n; beginPulses _ BasicTime.GetClockPulses[]; BEGIN src: LONG POINTER TO CARD16 _ LOOPHOLE[blkSpace128K.src]; dst: LONG POINTER TO CARD16 _ LOOPHOLE[blkSpace128K.dst]; table: LONG POINTER TO CARD16 _ LOOPHOLE[blkSpace128K.table]; srcSkip: CARD16 = blkSpace128K.srcSkip; dstSkip: CARD16 = blkSpace128K.dstSkip; FOR i: CARDINAL IN [0..n) DO dst^ _ (table+src^)^; src _ src + srcSkip; dst _ dst + dstSkip; ENDLOOP; END; stopPulses _ BasicTime.GetClockPulses[]; RETURN[BasicTime.PulsesToMicroseconds[stopPulses - beginPulses]]; }; OpMc1: PROC[delta, count: CARDINAL, op: BlockOps.BltOp] RETURNS[INT] = TRUSTED { Init64K[]; opBltSpace64K.delta _ delta; opBltSpace64K.count _ count; opBltSpace64K.op _ op; beginPulses _ BasicTime.GetClockPulses[]; BlockOps.OpBlt[opBltSpace64K]; stopPulses _ BasicTime.GetClockPulses[]; RETURN[BasicTime.PulsesToMicroseconds[stopPulses - beginPulses]]; }; END. €BlockOpsImpl.mesa Copyright c 1987 by Xerox Corporation. All rights reserved. Willie-Sue, January 18, 1988 1:54:52 pm PST SlowTableLookup[blkSpace128K]; Κj˜šœ™Icodešœ Οmœ1™