-- BandBLT.mesa - Last edit by
-- Olmstead January 15, 1981 10:49 AM
-- Forrest January 21, 1981 12:48 PM
-- Karlton 19-Mar-81 13:32:50
DIRECTORY
BitBlt USING [DstFunc, SrcFunc],
Environment USING [PageNumber],
MiscAlpha USING [aBANDBLT],
Mopcodes USING [zMISC];
BandBLT: DEFINITIONS =
BEGIN
BandBLTTablePtr: TYPE = POINTER TO BandBLTTable;
BandBLTTable: TYPE = MACHINE DEPENDENT RECORD [
readLO(0): Environment.PageNumber, -- input leftover-list virtual page #
bandlist(1): LONG POINTER, -- input bandlist
writeLO(3): Environment.PageNumber, -- output leftover-list virtual page #
bandbuf(4): LONG POINTER, -- band buffer virtual address
fontPtrTbl(6): Environment.PageNumber, -- Font Pointer Table virtual page #
fontRasters(7): Environment.PageNumber, -- Font raster memory virtual page #
inkwells(8): Environment.PageNumber]; -- inkwell(s) virtual page #
BandBLT: PROC [POINTER TO BandBLTTable] RETURNS [LONG POINTER] =
MACHINE CODE {Mopcodes.zMISC, MiscAlpha.aBANDBLT};
BandBLTTableAlignment: CARDINAL = 16;
BBTableSpace: TYPE =
ARRAY [1..SIZE[BandBLTTable]+BandBLTTableAlignment) OF WORD;
AlignedBandBLTTable: PROC [
ip: POINTER TO BBTableSpace] RETURNS [b: BandBLTTablePtr] =
INLINE BEGIN
align: TYPE = MACHINE DEPENDENT RECORD [
s: [0..LAST[WORD]/BandBLTTableAlignment),
z: [0..BandBLTTableAlignment)];
b ← LOOPHOLE[ip+BandBLTTableAlignment-1];
LOOPHOLE[b, align].z ← 0;
END;
Font: TYPE = CARDINAL[0..177B];
Command: TYPE = CARDINAL[0..17B];
-- Clients are encouraged to use bound varient constructors
-- when making these guys.
-- fields named mustBeZero are required by the the BandBLT microcode to be 0.
BlItem: TYPE = MACHINE DEPENDENT RECORD[
tag(0): SELECT OVERLAID * FROM
char => [
type(0:0..0): [0..1] ← charCmd,
font(0:1..7): Font,
cc(0:8..15): [0..377B],
xloc(1:0..3): [0..17B],
yloc(1:4..15): [0..7777B]],
leftOverChar => [
type(0:0..0): [0..1] ← charCmd,
font(0:1..7): Font,
cc(0:8..15): [0..377B],
mustBeZero(1:0..3): [0..17B] ← 0,
yloc(1:4..15): [0..7777B],
alsoMustBeZero(2:0..3): [0..17B] ← 0,
scansToSkip(2:4..15): [0..7777B]],
rectangle => [
type(0:0..3): Command ← rectangleCmd,
yloc(0:4..15): [0..7777B],
mustBeZero(1:0..3): [0..17B] ← 0,
bitsPerScan(1:4..15): [0..7777B],
nScans(2:0..11): [0..7777B],
xloc(2:12..15): [0..17B]],
setLevel => [
type(0:0..3): Command ← setLevelCmd,
mustBeZero(0:4..4): [0..1] ← 0,
pad(0:5..7): [0..7B] ← 0,
levelnum(0:8..15): [0..377B]],
setInk => [
type(0:0..3): Command ← setInkCmd,
srcFunc(0:4..4): BitBlt.SrcFunc ← null,
dstFunc(0:5..6): BitBlt.DstFunc ← null,
unused(0:7..7): BOOLEAN ← NULL,
inknum(0:8..15): [0..377B]],
endOfBand => [
type(0:0..3): Command ← endOfBandCmd,
pad(0:4..15): [0..7777B] ← 0],
endOfPage => [
type(0:0..3): Command ← endOfPageCmd,
pad(0:4..15): [0..7777B] ← 0],
rulette => [
type(0:0..3): Command ← ruletteCmd,
yloc(0:4..15): [0..7777B],
length(1:0..11): [0..7777B],
xloc(1:12..15): [0..17B]],
nop1 => [
type(0:0..3): Command ← nopCmd1,
pad(0:4..15): [0..7777B] ← 0],
nop2 => [
type(0:0..3): Command ← nopCmd2,
pad(0:4..15): [0..7777B] ← 0],
ENDCASE];
BandListItemLongPointer: TYPE = MACHINE DEPENDENT RECORD [
SELECT OVERLAID * FROM
ptr => [ptr: LONG POINTER],
char => [char: LONG POINTER TO char BlItem],
leftOverChar => [leftOverChar: LONG POINTER TO leftOverChar BlItem],
rectangle => [rectangle: LONG POINTER TO rectangle BlItem],
setLevel => [setLevel: LONG POINTER TO setLevel BlItem],
setInk => [setInk: LONG POINTER TO setInk BlItem],
endOfBand => [endOfBand: LONG POINTER TO endOfBand BlItem],
endOfPage => [endOfPage: LONG POINTER TO endOfPage BlItem],
rulette => [rulette: LONG POINTER TO rulette BlItem],
nop1 => [nop1: LONG POINTER TO nop1 BlItem],
nop2 => [nop2: LONG POINTER TO nop2 BlItem],
ENDCASE];
charCmd: CARDINAL = 0;
endOfBandCmd: CARDINAL = 8;
endOfPageCmd: CARDINAL = 9;
rectangleCmd: CARDINAL = 10;
setLevelCmd: CARDINAL = 11;
setInkCmd: CARDINAL = 12;
ruletteCmd: CARDINAL = 13;
nopCmd1: CARDINAL = 14;
nopCmd2: CARDINAL = 15;
END...