// SCVTEST.Bcpl -- SCV Demonstration
// Copyright Xerox Corporation 1979
// BLDR SCVTEST SCVMAIN SCVSORT FLOAT
get "scv.dfs"
// outgoing procedures
//external
// [
// ]
// outgoing statics
//external
// [
// ]
//static
// [
// ]
// incoming procedures
external
[
SCVInit
SCVMatrix
SCVTransformF
SCVBeginObject
SCVMoveTo
SCVMoveToF
SCVDrawTo
SCVDrawToF
SCVDrawCurve
SCVEndObject
SCVReadRuns
FLD; FST; FTR; FLDI; FNEG; FAD; FSB; FML; FDV;
FCM; FSN; FLDV; FSTV; FLDDP; FSTDP; DPAD; DPSB;
InitializeZone; Allocate; Free
GetFixed
Gets; Zero; SetBlock; Ws
]
// incoming statics
external
[
keys
]
static
[
Disp
TZone
]
// File-wide structure and manifest declarations.
manifest DBptr=#420
structure DB: [
next word
resolution bit 1
background bit 1
indentation bit 6
width bit 8
bitMapAddress word
height word
]
manifest lDB = size DB/16
manifest [
DisHeight=400
DisWidthWords=36
]
// Procedures
let
Main() be [
let dc=GetFixed(DisWidthWords*DisHeight+6)
if (dc&1) ne 0 then dc=dc+1
Disp=dc+lDB //Pointer to bits.
Zero(Disp,DisWidthWords*DisHeight)
dc>>DB.resolution=0
dc>>DB.background=0
dc>>DB.indentation=0
dc>>DB.width=DisWidthWords
dc>>DB.bitMapAddress=Disp
dc>>DB.height=DisHeight/2
dc>>DB.next=@DBptr
@DBptr=dc //Linked in.
let z=GetFixed(2000) //For ALLOC
TZone=InitializeZone(z,2000)
//Now "show" goodies.
Convert(true,Triangle) //Show a triangle.
]
and
Convert(wipe,figure) be [
if wipe then Zero(Disp,DisWidthWords*DisHeight) //White screen.
SCVInit(TAlloc,TFree,Error) //Initialize SCV
FLDI(2,1)
SCVMatrix(2,0,0,2) //Set matrix.
let v=vec size SCV/16
SCVBeginObject(false) //Start an object
figure() //Call the figure.
SCVEndObject(v) //Done.
let b=vec 200
v>>SCV.Sbegin=v>>SCV.Smin //First range
[
v>>SCV.Send=v>>SCV.Smax //Assume entire range fits.
SCVReadRuns(v,b,200) //Calculate intersections.
let n=v>>SCV.IntCnt
if n eq 0 then break //All done.
let p=v>>SCV.IntPtr
for i=1 to n by 2 do //Loop for each run.
[
let S=p!0 //S value
ShowRun(S,p!1,p!3-1)
p=p+4 //Next intersection pair.
]
v>>SCV.Sbegin=v>>SCV.Send+1 //Prepare next S range.
] repeat
Gets(keys) //Wait a bit.
]
and
ShowRun(s,r1,r2) be [
//Show run on scan-line s, r1 to r2 inclusive.
unless r2 ge r1 then return
let bitpattern=-1
let r1word=r1 rshift 4
let r2word=r2 rshift 4
let r1mask=not (-1 rshift (r1 & #17))
let r2mask=not (-1 rshift ((r2 & #17)+1))
let fw=(DisHeight-s-1)*DisWidthWords+Disp
let bits=(fw!r1word & r1mask)%(bitpattern & (not r1mask))
for i=r1word to r2word-1 do [ fw!i=bits; bits=bitpattern ]
fw!r2word=(bits & r2mask)%(fw!r2word & (not r2mask))
]
and
Triangle() be [
SCVMoveTo(0,0)
SCVDrawTo(10,0)
SCVDrawTo(5,10)
]
and
Error(s) be [
Ws("Error!!!!*N")
finish
]
and
TAlloc(a) = Allocate(TZone, a)
and
TFree(a) = Free(TZone, a)