//MIOC.BCPL
get "mdecl.d"
external [
// OS
Puts; Zero
// MIDAS
PutField; GetField
// MSYM
EvalAText
// MCMD
DisplayError
// Machine Dependent
@MEMFORMS; @REGFORMS; @REGWID; @MEMWID; AltRForms; AltMForms
// Defined here
RTexttoData; MTexttoData; SimpleTexttoDVec
RDatatoStream; MDatatoStream; SimpleDVectoStream
]
//Subroutines for converting TextVec’s to DataVec’s.
//RTexttoData(RegX,TextVec,DataVec) and MTexttoData(RegX,TextVec,DataVec)
//convert a TextVec to a DataVec where the width is gotten from the table
//of register widths or of memory widths, respectively. These routines
//use SimpleTexttoDVec(TextVec,NBits,DataVec) to do the work.
//GenlTexttoDVec(TextVec,Form,DataVec) is not presently used.
let RTexttoData(RegX,TV,DVec) be SimpleTexttoDVec(TV,REGWID!RegX,DVec)
and MTexttoData(MemX,TV,DVec) be SimpleTexttoDVec(TV,MEMWID!MemX,DVec)
and SimpleTexttoDVec(TV,NBits,DVec) be
[let Bit1 = NBits-3
Zero(DVec,(NBits+15) rshift 4)
if TV!0 eq 0 then return
for I = TV!0 to 1 by -1 do
[ let X = TV!I
if X ne $ do
[ if (X < $0) % (X > $7) do
[ Zero(DVec,(NBits+15) rshift 4)
let AVal = vec size AVal/16; X = 1
if EvalAText(TV,lv X,AVal,false) then
[ if AVal>>AVal.TypeStorage eq MemTypeStorage do
[ let SBit1,DBit1,MBits = nil,nil,nil
test NBits ge 32
ifso [ SBit1,DBit1,MBits = 0,NBits-32,32 ]
ifnot [ SBit1,DBit1,MBits = 32-NBits,0,NBits ]
MoveLongField(lv AVal>>AVal.Addr,SBit1,MBits,DVec,DBit1)
return
]
]
DisplayError("Bad value")
]
test Bit1 < 0
ifso
[ let T = Bit1+3; if T > 0 then
PutField(0,T,DVec,(X-$0) & (table [ 1; 3; 7 ] !T))
return
]
ifnot [ PutField(Bit1,3,DVec,X-$0); Bit1=Bit1-3 ]
]
]
]
//and GenlTexttoDVec(TV, Form, DVec) be
//[let Field,Ngrps,InGap = vec 5,0,true
//Count the groups
//for I = 1 to TV!0 do
// test InGap
// ifso
//if TV!I ne $ then
//[ InGap = false; Ngrps = Ngrps+1 ]
// ifnot
//if TV!I eq $ then InGap = true
//if Ngrps > Form!0 then Ngrps = Form!0
// now put out initial missing groups
//let FormX = 1
//Zero(Field,6)
//for I = 1 to Form!0 - Ngrps do
//[ MoveLongField(Field,0,Form!(FormX+1),DVec,Form!FormX)
// FormX = FormX+2
//]
// now handle groups with text
//let TVX = 1
//for I = Form!0-Ngrps+1 to Form!0 do
//[ let TempTV = vec 30
// while TV!TVX eq $ do TVX = TVX+1
// let X = 0
// while TV!TVX ne $ logand TVX le TV!0 do
// [ X = X+1
// if X le 30 then TempTV!X = TV!TVX
// TVX = TVX+1
// ]
// TempTV!0 = X
// SimpleTexttoDVec(TempTV, Form!(FormX+1), Field)
// MoveLongField(Field,0,Form!(FormX+1),DVec,Form!FormX)
// FormX = FormX+2
//]
//]
//RDatatoStream(Stream,RegX,DataVec) and MDatatoStream(Stream,MemX,DataVec)
//are used, respetively, for outputting register values and memory values
//to a stream. The format table for the register or memory is obtained
//from REGFORMS or MEMFORMS. If this is 0, then SimpleDVectoStream is
//used to output a right-justified octal string with leading blank fill
//of a size equal to the width of the register/3. If the REGFORMS or
//MEMFORMS entry is not 0, then GenlDVectoStream is used to do the work.
//GenlDVectoStream accepts a format table whose first entry is the
//number of format groups. This is followed by pairs of integers
//which stand for the left-bit in the DataVec for a group and the
//number of bits in the group.
//SimpleDVectoStream accept a fill character as its last argument.
//If this character is 0, then no fillers are output for leading zeroes
//in the output. The value of the output is the original fill character
//if all of the NBits are 0; otherwise it is 60B = "0". If the fill
//character is 40B = " ", then blank fill is used; if 60B = "0" then
//0-fill is used.
//Note: Leading blanks must be suppressed for mmprgn.bcpl
and RDatatoStream(Stream,RegX,DVec) be
[test REGFORMS!RegX eq 0
ifso RegX = SimpleDVectoStream(Stream,REGWID!RegX,DVec,0,true)
ifnot GenlDVectoStream(Stream,REGFORMS!RegX,DVec)
]
and MDatatoStream(Stream,MemX,DVec) be
[test MEMFORMS!MemX eq 0
ifso MemX = SimpleDVectoStream(Stream,MEMWID!MemX,DVec,0,true)
ifnot GenlDVectoStream(Stream,MEMFORMS!MemX,DVec)
]
and SimpleDVectoStream(Stream,NBits,DVec,flush0,LastFlag) = valof
[let Bit1,Size1,Byte = 0,NBits rem 3,nil
if Size1 eq 0 then Size1 = 3
while Bit1 < NBits-3 do
[ Byte = GetField(Bit1,Size1,DVec)
if Byte ne 0 then flush0 = $0
if flush0 ne 0 then Puts(Stream,Byte+flush0)
Bit1 = Bit1+Size1; Size1 = 3
]
Byte = GetField(Bit1,Size1,DVec)
if Byte ne 0 then flush0 = $0
if (flush0 ne 0) % LastFlag then Puts(Stream,Byte+$0)
resultis flush0
]
and MoveLongField(Source,SBit1,NBits,Dest,DBit1) be
[while NBits ge 16 do
[ PutField(DBit1,16,Dest,GetField(SBit1,16,Source))
DBit1,SBit1,NBits = DBit1+16,SBit1+16,NBits-16
]
if NBits > 0 then
PutField(DBit1,NBits,Dest,GetField(SBit1,NBits,Source))
]
and GenlDVectoStream(Stream,Form,DVec) be
[let Field,Foo,flush0 = vec 5,(Form!0)+(Form!0)-1,0
for FormX = 1 to Foo by 2 do
[ if (FormX > 1) & (flush0 ne 0) then Puts(Stream,$ )
MoveLongField(DVec,Form!FormX,Form!(FormX+1),Field,0)
flush0 = SimpleDVectoStream(Stream,Form!(FormX+1),Field,
flush0,((FormX eq Foo) ? true,false))
]
]