//CHATDISINIT.BCPL - Bob Sproull - Display protocol initialization
// Copyright Xerox Corporation 1979
// modified: April 13, 1979 6:05 PM (Taft)
get "Chat.d"
get "ChatDis.d"
get "Streams.d"
get "AltoDefs.d"
//outgoing procedure
external [
ChatDISInit
]
//incoming procedures
external [
//CHAT
BigStack
SmallStack
//CHATDIS
ChatDIS
DisTypeIn
DisTypeOut
DisDisplay
DisEvent
DisReadFont
//OS
InitializeZone
Allocate
Zero
MyFrame
CallSwat
//QUEUE
Enqueue
//CONTEXT
InitializeContext
]
//incoming statics
external [
//CHAT
ChatZone
ChatZoneSize
ScreenBuffer
ScreenBufferLength
YMax
DISSoc; DISStr
Parm
ctxQ
//CHATDIS
SS
disTypeInCtx
disTypeOutCtx
disDisplayCtx
disEventCtx
DisplayVersion
//Os
lvSysZone
sysZone
]
let ChatDISInit() be
[
ScreenBuffer=(ChatDISInit+1)&(-2)
YMax=(Parm>>PARM.YMax eq 0) ? YMaxDefault, Parm>>PARM.YMax
ScreenBufferLength=disWidth*(YMax+1)+lDCB
let zoneBot=ScreenBuffer+ScreenBufferLength
let zoneTop=MyFrame()-100 //Enough for ChatTTY
ChatZone=InitializeZone(zoneBot,zoneTop-zoneBot)
@#335=zoneTop
BigStack()
@lvSysZone=ChatZone
sysZone=ChatZone
//Check even word alignment
compileif offset REG.Function rem 32 ne 0 then [ foo=nil ]
compileif size REG rem 32 ne 0 then [ foo=nil ]
compileif offset DISV.regions rem 32 ne 0 then [ foo=nil ]
let len=Parm>>PARM.nRegions*(size REG/16)+(size DISV/16)
SS=Allocate(ChatZone, len, 0, true)
Zero(SS, len)
SS>>DISV.Version=DisplayVersion
SS>>DISV.DISVLoc=SS
SS>>DISV.ScreenBuf=ScreenBuffer
SS>>DISV.nRegions=Parm>>PARM.nRegions
SS>>DISV.YMax=YMax
SS>>DISV.EscapeChar = -1
// BitBlt control block for drawing curves
let bbc=Allocate(ChatZone, lBBC, 0, true)
SS>>DISV.CurveBbc=bbc
Zero(bbc, lBBC)
bbc>>BBC.SBMR=1
bbc>>BBC.DBCA=ScreenBuffer
bbc>>BBC.DBMR=disWidth
//Get contexts for these guys to run in:
disTypeInCtx=Allocate(ChatZone, 200)
disTypeOutCtx=Allocate(ChatZone, 200)
disDisplayCtx=Allocate(ChatZone, 200)
disEventCtx=Allocate(ChatZone, 200)
Enqueue(ctxQ, InitializeContext(disTypeInCtx, 200, DisTypeIn))
Enqueue(ctxQ, InitializeContext(disTypeOutCtx, 200, DisTypeOut))
Enqueue(ctxQ, InitializeContext(disDisplayCtx, 200, DisDisplay))
Enqueue(ctxQ, InitializeContext(disEventCtx, 200, DisEvent))
//Read in the various fonts
for i=0 to Parm>>PARM.nDisplayFonts-1 do
[
let c=DisReadFont(i, 0, (lv Parm>>PARM.DisplayFontFP)+i*lFP)
if c eq 0 then CallSwat("Cannot read some font file")
if c eq 1 then CallSwat("Cannot allocate storage for a font")
]
// Calculate screen dimensions for TTY simulation.
// Assume average character width is 2/3 * font height.
if Parm>>PARM.CalcScreenParms then
[
let f = (lv SS>>DISV.fonts)!0 // Default font
let h = f>>STRIK.ascent + f>>STRIK.descent
Parm>>PARM.ScreenLines = YMax/h
Parm>>PARM.ScreenChars = (XMax*3)/(h*2)
]
// How much storage left ?
Allocate(ChatZone, #77777, lv ChatZoneSize)
SmallStack()
ChatDIS() //Go do the work!
]