// MINIT1.BCPL Second initialization
//This overlay is loaded into the standard overlay zone constructed
//from the space occupied by the display bit buffers
get "mdecl.d"
get "streams.d"
external [
// OS
CallSwat; Endofs; Resets; Wns; Noop; Zero; SetBlock; MoveBlock
// MIDAS
ElapsedTime; TimeMRGN; TimeMAP; TimeMSYM; TimeMMPRGN
// MINIT2
DInit0; GetZStorage
// MDISP
MarkLineInUse
// MASM
GetStorage; @BlockTable; StrSize
//MRGN
RegionTable; NRegions; SelectedRegion
CharInputRoutine; EveryTimeP; EveryTimeA; EveryTimeSlot
AddToEveryTimeList; ScreenLinesDirty
//MMPRGN
MPDAs; MPDAVec; MPDVs; MPDVVec; @LongOne
MPDEveryTime; MPDlist; InitMPDispRegions
MPDrlx; MPDrcx; MPDdeSelect; SkipVEql; SkipVGr; SkipVLs
//MMENU
CreateAction; ActionBlock; ActionPtr; LastPermanentAction
MenuBlock; @ItemV; MenuTVs; ItemStream; @CurrentMDFS
PaintMenu; MenuMChange; SelectMenu; deSelectMenu; PutMenus
FormMenu
//MTV
PutTVs; ResetTVs; CloseTVs; BadTVsCall
//MTXTBUF
InputTxtRgn; InputTextBuffer; TxtBPaint; TxtBNewChar
//MSYM
@LastBlockAddr; @HeadBlock; Map
TVtoString; MakeNewBlock; GetFreeBlock; BlockUpdateRcd; UpdateRcd
@NextM; @LastM2; @LastM1
// Overlay Package
InitFmap
//MINIT0
BlockStoreFP
//Machine dependent
ScreenHeight; ScreenWidth; InitMPInterface; NHWActions
//MCMD
InitCmd; CmdMDFS; CmdConfirm; CmdReturn
CmdCommentStream; CmdCommentDirty; CmdCommentVec; PaintCmdP
ProgramVec; ProgramStream; PaintPrgP
ProgramAct; NPrograms; NMActions; MActions; RunProgram
CmdAddrEq; CmdTimeOut; CmdSkipCmd; CmdSetDisplay
CmdOpenOutput; CmdCloseOutput; CmdWriteMessage; CmdShowError
CmdFinish; CmdRunProg; CmdDoRC; CmdLoad; TextCmdOutStream
ShowActionForm; SavedLoadText; FormCmdmenuText
//MLOAD
LoadMB; LoadSyms; CompareMB
//STATE
SaveStatics
//Defined here
Init1; NewMPDispBlock; DefineRegister; DefineMemory
HWActions; DefHWAction; DefIAction; MakeTVS
]
manifest[ MaxItemsInCmdMenu = 60; StandardMenu = 1; BadValuePhase = 1 ]
static [ HWActions ]
structure TVS :
[ @ST
NoteP word
NoteArg word
]
let Init1() be
[
//MDISP
DInit0() //First part of display init only (need LCB's below)
//MRGN
RegionTable = GetZStorage(MaxNRegions)
SelectedRegion = NewRegion(size Rgn/16,0,0,ScreenHeight,ScreenWidth,
Noop,Noop,Noop,Noop)
EveryTimeP = GetZHStorage(MaxEveryTime)
EveryTimeA = GetZHStorage(MaxEveryTime)
EveryTimeSlot = GetZStorage(MaxEveryTime + 1)
ElapsedTime(lv TimeMRGN)
//MSYM
let MapSize = 2*(MaxBlockPages + 1) + 10
Map = GetStorage(MapSize)
InitFmap(Map, MapSize, BlockStoreFP)
ElapsedTime(lv TimeMAP)
BlockTable = GetZStorage(15)
BlockTable!0 = 2
HeadBlock = GetFreeBlock(MakeNewBlock(NPagesPerHeadBlock))
let CurrentBlock =
GetFreeBlock(MakeNewBlock(NPagesPerStandardBlock))
BlockTable!1 = CurrentBlock
BlockTable!2 = MakeNewBlock(NPagesPerStandardBlock)
//Initialization of other blocks saved till last to make optimal use of
//any unused storage
LastBlockAddr = CurrentBlock>>BH.BlockAddr
//Enter null & max strings in symtab to avoid end checks
unless BlockUpdateRcd(HeadBlock,-(size BH/16 - 1), "",
lv CurrentBlock>>BH.BlockAddr, 1)
& BlockUpdateRcd(CurrentBlock,-(size BH/16 - 1), "",
table [ 0 ] , 1)
& BlockUpdateRcd(CurrentBlock,-(size BH/16),
table [ 1577B; 77577B ] ,table [ 0 ] , 1)
do CallSwat("Bug in Init1 for MSYM")
ElapsedTime(lv TimeMSYM)
//MMENU
ActionBlock = GetZStorage(MaxActions*(size Action/16))
MenuBlock = GetZStorage(MaxMenus)
ItemV = GetZHStorage(ScreenWidth)
ItemStream = GetStorage(size ST/16)
SetUpStream(ItemStream,0,0,Noop,Noop,PutMenus,CallSwat,
Noop,Noop,Noop,Noop,Noop,0)
MenuTVs = MakeEmptyTVstream()
//MTXTBUF
let rcx,H,W = 0,1,ScreenWidth-1
InputTxtRgn = NewRegion(size Rgn/16,ScreenHeight-2,0,1,
W,TxtBPaint,Noop,Noop,Noop)
CharInputRoutine = TxtBNewChar
InputTextBuffer = GetZHStorage(ScreenWidth)
// Following must be last items before call on DriverLoop
//MMPRGN
InitMPDispRegions() //Create address and value actions
MakeTVS(lv MPDAs,lv MPDAVec)
MakeTVS(lv MPDVs,lv MPDVVec)
HWActions = GetStorage(NHWActions)
InitMPInterface()
DefIAction("SkipVEql",lv SkipVEql)
DefIAction("SkipVGr",lv SkipVGr)
DefIAction("SkipVLs",lv SkipVLs)
AddToEveryTimeList(MPDEveryTime,MPDlist)
ElapsedTime(lv TimeMMPRGN)
//MCMD
SavedLoadText = GetZStorage(W+1)
MakeDisplayLine(lv ProgramStream,lv ProgramVec,
CmdCommentDirty,PaintPrgP,ScreenHeight-10,H,W,rcx)
MakeDisplayLine(lv CmdCommentStream,lv CmdCommentVec,
CmdCommentDirty,PaintCmdP,ScreenHeight-8,H,W,rcx)
H = 3
InitCmd()
MActions = GetStorage(NMActions)
DefMAction(0,"Exit",lv CmdFinish,0,0,$Q)
DefMAction(1,"Run-Program",lv CmdRunProg,0)
DefMAction(2,"Read-Cmds",lv CmdDoRC,0)
DefMAction(3,"Load",lv CmdLoad,lv LoadMB,0,$L)
DefMAction(4,"LoadSyms",lv CmdLoad,lv LoadSyms)
DefMAction(5,"Compare",lv CmdLoad,lv CompareMB,0,$C)
DefIAction("Addr=",lv CmdAddrEq,0,$=)
DefIAction("DisplayOff",lv CmdSetDisplay,true,$O-100B)
DefIAction("DisplayOn",lv CmdSetDisplay,false,$D-100B)
DefIAction("TimeOut",lv CmdTimeOut)
DefIAction("Confirm",lv CmdConfirm)
DefIAction("Skip",lv CmdSkipCmd,false)
DefIAction("BackSkip",lv CmdSkipCmd,true)
DefIAction("Return",lv CmdReturn)
DefIAction("ShowError",lv CmdShowError)
DefIAction("OpenOutput",lv CmdOpenOutput)
DefIAction("CloseOutput",lv CmdCloseOutput)
DefIAction("WriteMessage",lv CmdWriteMessage)
for I = 0 to NPrograms-1 do
[ ProgramAct!I = CreateAction(ProgramAct!I,lv RunProgram,
ProgramAct!I)
]
CmdMDFS = MakeMenuRegion($X,-1,ScreenHeight-6,
0,H,W,H,W,MaxItemsInCmdMenu,0,Noop)
FormMenu(CmdMDFS,FormCmdmenuText)
LastPermanentAction = ActionPtr
//Save page zero statics
SaveStatics(lv BlockTable,lv ItemV,lv CurrentMDFS,lv LastBlockAddr,
lv HeadBlock,lv NextM,lv LastM2,lv LastM1,lv LongOne)
]
and MakeDisplayLine(lvStream,lvVector,Dirty,Paint,Line,H,W,rcx) be
[ rv lvStream = MakeEmptyTVstream()
rv lvVector = GetStorage(W+1)
Resets(rv lvStream,rv lvVector,W,Dirty,NewRegion(size Rgn/16,
Line,rcx,H,W,Paint,Noop,Noop,Noop))
]
and GetZHStorage(Size) = valof
[ let Vector = GetStorage(Size+1)
Vector!0 = 0; resultis Vector
]
and MakeEmptyTVstream(numargs NA) = valof
[ if NA ne 0 then CallSwat()
let Stream = GetStorage(size TVS/16)
SetUpStream(Stream,0,0,CloseTVs,BadTVsCall,PutTVs,ResetTVs,
BadTVsCall,BadTVsCall,BadTVsCall,BadTVsCall,0,0)
Stream>>TVS.NoteP = 0
resultis Stream
]
and MakeTVS(lvStream,lvVector) be
[ rv lvStream = MakeEmptyTVstream()
rv lvVector = GetStorage(ScreenWidth+1)
Resets(rv lvStream,rv lvVector,ScreenWidth)
]
and SetUpStream(S,xPar1,xPar2,xClose,xGets,xPuts,xResets,xPutb,
xError,xEndof,xStateof,xType,xPar3) be
[ S>>ST.par1 = xPar1; S>>ST.par2 = xPar2
S>>ST.close = xClose; S>>ST.gets = xGets
S>>ST.puts = xPuts; S>>ST.reset = xResets
S>>ST.putback = xPutb; S>>ST.error = xError
S>>ST.endof = xEndof; S>>ST.stateof = xStateof
S>>ST.type = xType; S>>ST.par3 = xPar3
]
and NewRegion(BlockSize,rlx,rcx,Height,Width,PPaint,PSelect,
PMChange,PdeSelect) = valof
[ if NRegions ge MaxNRegions then CallSwat()
if rlx+Height > ScreenHeight then CallSwat()
if rcx+Width > ScreenWidth then CallSwat()
let R = GetStorage(BlockSize)
R>>Rgn.aLineX = rlx
R>>Rgn.aCharX = rcx
R>>Rgn.Height = Height
R>>Rgn.Width = Width
R>>Rgn.Paint = PPaint
R>>Rgn.Select = PSelect
R>>Rgn.MChange = PMChange
R>>Rgn.deSelect = PdeSelect
NRegions = NRegions+1
if NRegions ne 0 do
[ for I = 0 to Height-1 do MarkLineInUse(rlx+I)
]
RegionTable!NRegions = R
resultis R
]
and MakeMenuRegion(Letter,LineN,rlx,rcx,H,W,MaxH,MaxW,MaxNItems,
Arg,PdeSelect) = valof
[ let S = NewRegion(size MDFS/16, rlx, rcx, H, W,
PaintMenu, SelectMenu, MenuMChange, deSelectMenu)
S>>MDFS.Letter = Letter
S>>MDFS.LineN = LineN & 377B
S>>MDFS.TextLines = GetZHStorage(MaxH * (MaxW+1)-1) //~76*21 words
S>>MDFS.MaxH = MaxH
S>>MDFS.MaxW = MaxW
S>>MDFS.ProcV = GetZHStorage(MaxNItems) //~4*60+60 words
S>>MDFS.ProcNMax = MaxNItems
S>>MDFS.SizeV = GetZHStorage(MaxH + MaxNItems-1) //~4*60+60 words
S>>MDFS.Arg = Arg
S>>MDFS.SelectedItem = 0
S>>MDFS.inLine = 1
S>>MDFS.deSelect = PdeSelect
S>>MDFS.mIn = 0
//Menus may be a single letter (A to Z) or a single letter followed
//by a small integer (A0 to E19). LineN must be -1 if omitted.
//Command menu is "X"
let LetterV = Letter-$A
LetterV = (LineN < 0) ? LetterV,(LetterV*MaxLineN)+LineN+($Z-$A+1)
if LetterV ge MaxMenus then CallSwat("Bad menu name")
if MenuBlock!LetterV ne 0 then CallSwat("Duplicate menu name?")
MenuBlock!LetterV = S
resultis S
]
//Args are Line = line number (0 to n)
// C = left character (0 to ScreenWidth-1)
// Cnm = command file character identifying region
// W = width in characters (C+W < ScreenWidth)
// NoName = true for areas where only the value is printed
and NewMPDispBlock(Line,C,Cnm,W,NoName) be
[ let MPD = GetStorage(size MPD/16)
MPD>>MPD.Idle = 1
MPD>>MPD.Phase = BadValuePhase //DriverLoop will paint
MPD>>MPD.MenuMode = StandardMenu
MPD>>MPD.Rabove = MPDlist
MPD>>MPD.NoName = NoName ? 1,0
MPD>>MPD.TextSpace = W //This should be checked, not sure
MPD>>MPD.MDFS = MakeMenuRegion(Cnm,Line,
MPDrlx+Line,MPDrcx+C,1,W,1,W,3,MPD,MPDdeSelect)
MPDlist = MPD
]
and DefineMemory(String,MemNum,BitWidth,Hsize,Size) be
[ let Body = vec (size Symb.M / 16)
Body>>Symb.M.Type = MemSymb
Body>>Symb.M.X = MemNum
Body>>Symb.M.BitWidth = BitWidth
Body>>Symb.M.Hsize = Hsize
Body>>Symb.M.Size = Size
UpdateRcd(String,Body,size Symb.M/16)
]
and DefineRegister(String,RegNum,BitWidth) be
[ let Body = vec (size Symb.R / 16)
Body>>Symb.R.Type = RegSymb
Body>>Symb.R.X = RegNum
Body>>Symb.R.BitWidth = BitWidth
UpdateRcd(String,Body,size Symb.R/16)
]
and DefHWAction(I,Name,lvProc,Arg,lvMProc,Letter; numargs NA) be
[ if I ge NHWActions then CallSwat()
let SSize = StrSize(Name)
let Body = GetStorage(SSize)
MoveBlock(Body,Name,SSize)
HWActions!I = CreateAction(Body,lvProc,Arg,
(NA > 4 ? lvMProc,0),(NA > 5 ? Letter,0))
]
and DefMAction(I,Name,lvProc,Arg,lvMProc,Letter; numargs NA) be
[ if I ge NMActions then CallSwat()
let SSize = StrSize(Name)
let Body = GetStorage(SSize)
MoveBlock(Body,Name,SSize)
MActions!I = CreateAction(Body,lvProc,Arg,
(NA > 4 ? lvMProc,0),(NA > 5 ? Letter,0))
]
//Define action which never appears in a menu
//(i.e., command file or keyboard char only)
and DefIAction(Name,lvProc,Arg,Letter; numargs NA) be
[ let SSize = StrSize(Name)
let Body = GetStorage(SSize)
MoveBlock(Body,Name,SSize)
CreateAction(Body,lvProc,Arg,0,(NA > 3 ? Letter,0))
]