*----------------------------------------------------------- Title[DMesaVersion.mc...December 14, 1983 6:22 PM...Taft]; * Microcode version number declaration and VERSION opcode *----------------------------------------------------------- *----------------------------------------------------------- Macro[DefineVersion, * Major version number; increment only when incompatible changes are * made to the instruction set. This requires coordination among all * microcode implementations and all software that uses them. Set[VersionNumber, 0] * Release date; change whenever a new change is made, however trivial. MakeYear[123] * 83 MakeMonth[14] * December MakeDay[16]]; * 14 *----------------------------------------------------------- % Macros to encode information for the VERSION opcode. MachineType: TYPE = MACHINE DEPENDENT { altoI (1), altoII (2), altoIIXM (3), dolphin (4), dorado (5), dandelion (6), dicentra (7), (17B)}; VersionResult: TYPE = MACHINE DEPENDENT RECORD [ machineType (0: 0..3): MachineType, majorVersion (0: 4..7): [0..17B], -- incremented by incompatible changes unused (0: 8..13): [0..77B], floatingPoint (0: 14..14): BOOLEAN, cedar (0: 15..15): BOOLEAN, releaseDate (1): CARDINAL]; -- days since January 1, 1901 For the macros below, 1904, 1908, ..., 1980, 1984, etc. are leap years. So 1 January 1982 is 81*365 + 19 days = 29584 days (=71620b) after 1 January 1901; 365d = 555b. % Macro[MakeYear, Set[YearOffset, Add[71620,Select[Sub[#1,122],0,555,1332,2110,2665,3442,4217,4775]]] Set[LeapOffset,Select[Sub[#1,122],0,0,1,0,0,0,1,0]] ]; Macro[MakeDay, Set[DayOffset,Sub[#1,1]]]; Macro[MakeMonth, Set[MonthOffset, IFG[#1,6,Select[Sub[#1,7],265,324,363,421,460,516], Select[Sub[#1,1],0,37,73,132,170,227]]] IFG[MonthOffset,72,Set[MonthOffset,Add[LeapOffset,MonthOffset]]] ]; DefineVersion[]; MC[VersionFlags, Add[50000, LShift[VersionNumber, 10], * Cedar is always present * Presence of floating point is determined dynamically ]]; MC[ReleaseDate, Add[YearOffset, MonthOffset, DayOffset]]; Set[XTask, IP[EMU]]; TopLevel; *----------------------------------------------------------- VersionM: MiscTable[104], * Push[VersionFlags]; Push[ReleaseDate]; *----------------------------------------------------------- Stack← VersionFlags, Call[FloatingPointPresent]; * Returns 0 or 2 :If[AltoMode]; ********** Alto version ********** Stack&+1← (Stack&+1)+T; * B15=0: Cedar never present :Else; ******** PrincOps version ******** Stack&+1← (Stack&+1)+T+1; * B15=1: Cedar always present :EndIf; ********************************** Stack← HighByte[ReleaseDate]; StackT← (StackT) OR (LowByte[ReleaseDate]), IFUNext2;