RegressBitfields.mesa
Christian Jacobi, January 26, 1993 1:47 pm PST
DIRECTORY RegressUtils;
RegressBitfields: CEDAR PROGRAM
IMPORTS RegressUtils =
BEGIN
g19: INT ¬ RegressUtils.Val[19];
g25: INT ¬ RegressUtils.Val[25];
BCrossHW: TYPE = PACKED RECORD [
z: [0..0FFH] ¬ 0,
a: [0..0FH] ¬ 0,
x: [0..0FFH] ¬ 0,
b: [0..0FFFH] ¬ 0
];
ABCrossHW: TYPE = PACKED ARRAY [0..200) OF BCrossHW;
Test1: PROC = {
Basic unaligned bitfield
should: BCrossHW ¬ [z: 0, a: 0, x: 255, b: 0];
shouldCard: CARD ¬ LOOPHOLE[should];
ap: REF ABCrossHW ¬ NEW[ABCrossHW];
ap[25].x ¬ 255;
ap[g19].x ¬ 255;
RegressUtils.Test[shouldCard # LOOPHOLE[ap[g25], CARD], "Test1: shouldCard # LOOPHOLE[ap[g25], CARD]"];
RegressUtils.Test[shouldCard # LOOPHOLE[ap[19], CARD], "Test1: shouldCard # LOOPHOLE[ap[19], CARD]"];
RegressUtils.Test[ap[g25].x # 255, "Test1: ap[g25].x # 255"];
RegressUtils.Test[ap[19].x # 255, "Test1: ap[19].x # 255"];
};
Test2: PROC = {
Unaligned bitfield and INLINE
InlineFoo: PROC [] RETURNS [CARD] = INLINE {
IF g19=19
THEN {ap[g19].x ¬ 255; RETURN [7]}
ELSE {ap[g25].x ¬ 233; RETURN [9]}
};
should: BCrossHW ¬ [z: 0, a: 0, x: 255, b: 0];
shouldCard: CARD ¬ LOOPHOLE[should];
ap: REF ABCrossHW ¬ NEW[ABCrossHW];
xx: CARD;
xx ¬ InlineFoo[];
RegressUtils.Test[shouldCard # LOOPHOLE[ap[19], CARD], "Test2: shouldCard # LOOPHOLE[ap[19], CARD]]"];
RegressUtils.Test[LOOPHOLE[ap[25], CARD] # 0, "Test2: LOOPHOLE[ap[25], CARD] # 0"];
RegressUtils.Test[ap[g25].x # 0, "Test2: ap[g25].x # 0"];
RegressUtils.Test[ap[19].x # 255, "ap[19].x # 255"];
};
Test3: PROC = {
Found this writing at the wrong place...
nchannels: INTEGER = 8;
DeviceNumber: TYPE = [0..255];
ChannelCommand: TYPE = [0..65000];
InterruptWord: TYPE = MSBIT WORD16 MACHINE DEPENDENT RECORD [
channel(0:8..10): [0..nchannels),
device(0:0..7): DeviceNumber,
stopCode(0:11..15): MACHINE DEPENDENT{
finishedOK(0), errorStop(1), powerOff(3)},
command(1:0..15): ChannelCommand];
interrupt: InterruptWord;
should: InterruptWord ¬ [1, 250, finishedOK, 60000];
interrupt.channel ¬ 1;
interrupt.device ¬ 250;
interrupt.stopCode ¬ finishedOK;
interrupt.command ¬ 60000;
RegressUtils.Test[interrupt#should, "interrupt#should"];
};
Test4: PROC = {
Packed array fitting sub word unit
b: BOOL;
two: INT ¬ 2;
Pab: TYPE = PACKED ARRAY [0..8) OF BOOL ¬ ALL[FALSE];
pab: Pab;
pab[two] ¬ TRUE;
RegressUtils.Test[ORD[LOOPHOLE[pab, CHAR]] # 32, "Test4: ORD[LOOPHOLE[pab, CHAR]] # 32"];
b ¬ pab[two];
RegressUtils.Test[b # TRUE, "Test4: b # TRUE"];
};
TestBitfields: PROC = {
RegressUtils.NoteProc["RegressBitfields.Test1"];
Test1[];
RegressUtils.NoteProc["RegressBitfields.Test2"];
Test2[];
RegressUtils.NoteProc["RegressBitfields.Test3"];
Test3[];
RegressUtils.NoteProc["RegressBitfields.Test4"];
Test4[];
};
RegressUtils.Register["RegressBitfields", TestBitfields];
END.