Mercurial > yaAGC
changeset 4:e4aa55f2b90e
Filled in the instruction table
author | Josef "Jeff" Sipek <jeffpc@josefsipek.net> |
---|---|
date | Sat, 02 Jun 2007 00:32:27 -0400 |
parents | 5188cbc52a00 |
children | b91d6b730a57 |
files | yaAGC/agc_engine.c |
diffstat | 1 files changed, 234 insertions(+), 239 deletions(-) [+] |
line wrap: on
line diff
--- a/yaAGC/agc_engine.c Thu May 31 23:06:13 2007 -0400 +++ b/yaAGC/agc_engine.c Sat Jun 02 00:32:27 2007 -0400 @@ -399,135 +399,241 @@ NextZ += 2; } +// TCF instruction (1 MCT). +void AGC_INST_TCF(State_t *state) +{ + BacktraceAdd (State, 0); + NextZ = Address12; + // THAT was easy ... too easy ... +} + +// DAS instruction (3 MCT). +void AGC_INST_DAS(State_t *state) +{ + // We add the less-significant words (as SP values), and thus + // the sign of the lower word of the output does not necessarily + // match the sign of the upper word. + int Msw, Lsw; + if (IsL (Address10)) // DDOUBL + { + Lsw = AddSP16 (0177777 & c (RegL), 0177777 & c (RegL)); + Msw = AddSP16 (Accumulator, Accumulator); + if ((0140000 & Lsw) == 0040000) + Msw = AddSP16 (Msw, AGC_P1); + else if ((0140000 & Lsw) == 0100000) + Msw = AddSP16 (Msw, SignExtend (AGC_M1)); + Lsw = OverflowCorrected (Lsw); + c (RegA) = 0177777 & Msw; + c (RegL) = 0177777 & SignExtend (Lsw); + return; + } + WhereWord = FindMemoryWord (State, Address10); + if (Address10 < REG16) + Lsw = AddSP16 (0177777 & c (RegL), 0177777 & c (Address10)); + else + Lsw = AddSP16 (0177777 & c (RegL), SignExtend (*WhereWord)); + if (Address10 < REG16 + 1) + Msw = AddSP16 (Accumulator, 0177777 & c (Address10 - 1)); + else + Msw = AddSP16 (Accumulator, SignExtend (WhereWord[-1])); + + if ((0140000 & Lsw) == 0040000) + Msw = AddSP16 (Msw, AGC_P1); + else if ((0140000 & Lsw) == 0100000) + Msw = AddSP16 (Msw, SignExtend (AGC_M1)); + Lsw = OverflowCorrected (Lsw); + + if ((0140000 & Msw) == 0100000) + c (RegA) = SignExtend (AGC_M1); + else if ((0140000 & Msw) == 0040000) + c (RegA) = AGC_P1; + else + c (RegA) = AGC_P0; + c (RegL) = AGC_P0; + // Save the results. + if (Address10 < REG16) + c (Address10) = SignExtend (Lsw); + else + AssignFromPointer (State, WhereWord, Lsw); + if (Address10 < REG16 + 1) + c (Address10 - 1) = Msw; + else + AssignFromPointer (State, WhereWord - 1, OverflowCorrected (Msw)); +} + +// "LXCH K" instruction (2 MCT). +void AGC_INST_LXCH(State_t *state) +{ + if (IsL (Address10)) + return; + if (IsReg (Address10, RegZERO)) // ZL + c (RegL) = AGC_P0; + else if (Address10 < REG16) + { + Operand16 = c (RegL); + c (RegL) = c (Address10); + if (Address10 >= 020 && Address10 <= 023) + AssignFromPointer (State, WhereWord, + OverflowCorrected (0177777 & Operand16)); + else + c (Address10) = Operand16; + if (Address10 == RegZ) + NextZ = c (RegZ); + } + else + { + WhereWord = FindMemoryWord (State, Address10); + Operand16 = *WhereWord; + AssignFromPointer (State, WhereWord, + OverflowCorrected (0177777 & c (RegL))); + c (RegL) = SignExtend (Operand16); + } +} + +// INCR instruction (2 MCT). +void AGC_INST_INCR(State_t *state) +{ + int Sum; + WhereWord = FindMemoryWord (State, Address10); + if (Address10 < REG16) + c (Address10) = AddSP16 (AGC_P1, 0177777 & c (Address10)); + else + { + Sum = AddSP16 (AGC_P1, SignExtend (*WhereWord)); + AssignFromPointer (State, WhereWord, OverflowCorrected (Sum)); + InterruptRequests (State, Address10, Sum); + } +} + static const InstructionInfo_t Instructions[0200] = { - { .time = 0, .func = AGC_INST_TC }, // 0000 - { .time = 0, .func = AGC_INST_TC }, // 0001 - { .time = 0, .func = AGC_INST_TC }, // 0002 - { .time = 0, .func = AGC_INST_TC }, // 0003 - { .time = 0, .func = AGC_INST_TC }, // 0004 - { .time = 0, .func = AGC_INST_TC }, // 0005 - { .time = 0, .func = AGC_INST_TC }, // 0006 - { .time = 0, .func = AGC_INST_TC }, // 0007 - { .time = 1, .func = AGC_INST_CCS }, // 0010 - { .time = 1, .func = AGC_INST_CCS }, // 0011 - { .time = 0, .func = AGC_INST_TCF }, // 0012 - { .time = 0, .func = AGC_INST_TCF }, // 0013 - { .time = 0, .func = AGC_INST_TCF }, // 0014 - { .time = 0, .func = AGC_INST_TCF }, // 0015 - { .time = 0, .func = AGC_INST_TCF }, // 0016 - { .time = 0, .func = AGC_INST_TCF }, // 0017 - { .time = 2, .func = AGC_INST_DAS }, // 0020 - { .time = 2, .func = AGC_INST_DAS }, // 0021 - { .time = 1, .func = AGC_INST_LXCH }, // 0022 - { .time = 1, .func = AGC_INST_LXCH }, // 0023 - { .time = 1, .func = NULL }, // 0024 - { .time = 1, .func = NULL }, // 0025 - { .time = 1, .func = NULL }, // 0026 - { .time = 1, .func = NULL }, // 0027 - { .time = 1, .func = NULL }, // 0030 - { .time = 1, .func = NULL }, // 0031 - { .time = 1, .func = NULL }, // 0032 - { .time = 1, .func = NULL }, // 0033 - { .time = 1, .func = NULL }, // 0034 - { .time = 1, .func = NULL }, // 0035 - { .time = 1, .func = NULL }, // 0036 - { .time = 1, .func = NULL }, // 0037 - { .time = 1, .func = NULL }, // 0040 - { .time = 1, .func = NULL }, // 0041 - { .time = 1, .func = NULL }, // 0042 - { .time = 1, .func = NULL }, // 0043 - { .time = 1, .func = NULL }, // 0044 - { .time = 1, .func = NULL }, // 0045 - { .time = 1, .func = NULL }, // 0046 - { .time = 1, .func = NULL }, // 0047 - { .time = 1, .func = NULL }, // 0050 - { .time = 1, .func = NULL }, // 0051 - { .time = 2, .func = NULL }, // 0052 - { .time = 2, .func = NULL }, // 0053 - { .time = 1, .func = NULL }, // 0054 - { .time = 1, .func = NULL }, // 0055 - { .time = 1, .func = NULL }, // 0056 - { .time = 1, .func = NULL }, // 0057 - { .time = 1, .func = NULL }, // 0060 - { .time = 1, .func = NULL }, // 0061 - { .time = 1, .func = NULL }, // 0062 - { .time = 1, .func = NULL }, // 0063 - { .time = 1, .func = NULL }, // 0064 - { .time = 1, .func = NULL }, // 0065 - { .time = 1, .func = NULL }, // 0066 - { .time = 1, .func = NULL }, // 0067 - { .time = 1, .func = NULL }, // 0070 - { .time = 1, .func = NULL }, // 0071 - { .time = 1, .func = NULL }, // 0072 - { .time = 1, .func = NULL }, // 0073 - { .time = 1, .func = NULL }, // 0074 - { .time = 1, .func = NULL }, // 0075 - { .time = 1, .func = NULL }, // 0076 - { .time = 1, .func = NULL }, // 0077 - { .time = 1, .func = NULL }, // 0100 - { .time = 1, .func = NULL }, // 0101 - { .time = 1, .func = NULL }, // 0102 - { .time = 1, .func = NULL }, // 0103 - { .time = 1, .func = NULL }, // 0104 - { .time = 1, .func = NULL }, // 0105 - { .time = 1, .func = NULL }, // 0106 - { .time = 1, .func = NULL }, // 0107 - { .time = 5, .func = NULL }, // 0110 - { .time = 5, .func = NULL }, // 0111 - { .time = 0, .func = NULL }, // 0112 - { .time = 0, .func = NULL }, // 0113 - { .time = 0, .func = NULL }, // 0114 - { .time = 0, .func = NULL }, // 0115 - { .time = 0, .func = NULL }, // 0116 - { .time = 0, .func = NULL }, // 0117 - { .time = 1, .func = NULL }, // 0120 - { .time = 1, .func = NULL }, // 0121 - { .time = 1, .func = NULL }, // 0122 - { .time = 1, .func = NULL }, // 0123 - { .time = 1, .func = NULL }, // 0124 - { .time = 1, .func = NULL }, // 0125 - { .time = 1, .func = NULL }, // 0126 - { .time = 1, .func = NULL }, // 0127 - { .time = 2, .func = NULL }, // 0130 - { .time = 2, .func = NULL }, // 0131 - { .time = 2, .func = NULL }, // 0132 - { .time = 2, .func = NULL }, // 0133 - { .time = 2, .func = NULL }, // 0134 - { .time = 2, .func = NULL }, // 0135 - { .time = 2, .func = NULL }, // 0136 - { .time = 2, .func = NULL }, // 0137 - { .time = 2, .func = NULL }, // 0140 - { .time = 2, .func = NULL }, // 0141 - { .time = 2, .func = NULL }, // 0142 - { .time = 2, .func = NULL }, // 0143 - { .time = 2, .func = NULL }, // 0144 - { .time = 2, .func = NULL }, // 0145 - { .time = 2, .func = NULL }, // 0146 - { .time = 2, .func = NULL }, // 0147 - { .time = 1, .func = NULL }, // 0150 - { .time = 1, .func = NULL }, // 0151 - { .time = 1, .func = NULL }, // 0152 - { .time = 1, .func = NULL }, // 0153 - { .time = 1, .func = NULL }, // 0154 - { .time = 1, .func = NULL }, // 0155 - { .time = 1, .func = NULL }, // 0156 - { .time = 1, .func = NULL }, // 0157 - { .time = 1, .func = NULL }, // 0160 - { .time = 1, .func = NULL }, // 0161 - { .time = 0, .func = NULL }, // 0162 - { .time = 0, .func = NULL }, // 0163 - { .time = 0, .func = NULL }, // 0164 - { .time = 0, .func = NULL }, // 0165 - { .time = 0, .func = NULL }, // 0166 - { .time = 0, .func = NULL }, // 0167 - { .time = 2, .func = NULL }, // 0170 - { .time = 2, .func = NULL }, // 0171 - { .time = 2, .func = NULL }, // 0172 - { .time = 2, .func = NULL }, // 0173 - { .time = 2, .func = NULL }, // 0174 - { .time = 2, .func = NULL }, // 0175 - { .time = 2, .func = NULL }, // 0176 - { .time = 2, .func = NULL }, // 0177 + { .time = 0, .func = AGC_INST_TC }, // 0000 + { .time = 0, .func = AGC_INST_TC }, // 0001 + { .time = 0, .func = AGC_INST_TC }, // 0002 + { .time = 0, .func = AGC_INST_TC }, // 0003 + { .time = 0, .func = AGC_INST_TC }, // 0004 + { .time = 0, .func = AGC_INST_TC }, // 0005 + { .time = 0, .func = AGC_INST_TC }, // 0006 + { .time = 0, .func = AGC_INST_TC }, // 0007 + { .time = 1, .func = AGC_INST_CCS }, // 0010 + { .time = 1, .func = AGC_INST_CCS }, // 0011 + { .time = 0, .func = AGC_INST_TCF }, // 0012 + { .time = 0, .func = AGC_INST_TCF }, // 0013 + { .time = 0, .func = AGC_INST_TCF }, // 0014 + { .time = 0, .func = AGC_INST_TCF }, // 0015 + { .time = 0, .func = AGC_INST_TCF }, // 0016 + { .time = 0, .func = AGC_INST_TCF }, // 0017 + { .time = 2, .func = AGC_INST_DAS }, // 0020 + { .time = 2, .func = AGC_INST_DAS }, // 0021 + { .time = 1, .func = AGC_INST_LXCH }, // 0022 + { .time = 1, .func = AGC_INST_LXCH }, // 0023 + { .time = 1, .func = AGC_INST_INCR }, // 0024 + { .time = 1, .func = AGC_INST_INCR }, // 0025 + { .time = 1, .func = AGC_INST_ADS }, // 0026 + { .time = 1, .func = AGC_INST_ADS }, // 0027 + { .time = 1, .func = AGC_INST_CA }, // 0030 + { .time = 1, .func = AGC_INST_CA }, // 0031 + { .time = 1, .func = AGC_INST_CA }, // 0032 + { .time = 1, .func = AGC_INST_CA }, // 0033 + { .time = 1, .func = AGC_INST_CA }, // 0034 + { .time = 1, .func = AGC_INST_CA }, // 0035 + { .time = 1, .func = AGC_INST_CA }, // 0036 + { .time = 1, .func = AGC_INST_CA }, // 0037 + { .time = 1, .func = AGC_INST_CS }, // 0040 + { .time = 1, .func = AGC_INST_CS }, // 0041 + { .time = 1, .func = AGC_INST_CS }, // 0042 + { .time = 1, .func = AGC_INST_CS }, // 0043 + { .time = 1, .func = AGC_INST_CS }, // 0044 + { .time = 1, .func = AGC_INST_CS }, // 0045 + { .time = 1, .func = AGC_INST_CS }, // 0046 + { .time = 1, .func = AGC_INST_CS }, // 0047 + { .time = 1, .func = AGC_INST_INDEX }, // 0050 + { .time = 1, .func = AGC_INST_INDEX }, // 0051 + { .time = 2, .func = AGC_INST_DXCH }, // 0052 + { .time = 2, .func = AGC_INST_DXCH }, // 0053 + { .time = 1, .func = AGC_INST_TS }, // 0054 + { .time = 1, .func = AGC_INST_TS }, // 0055 + { .time = 1, .func = AGC_INST_XCH }, // 0056 + { .time = 1, .func = AGC_INST_XCH }, // 0057 + { .time = 1, .func = AGC_INST_AD }, // 0060 + { .time = 1, .func = AGC_INST_AD }, // 0061 + { .time = 1, .func = AGC_INST_AD }, // 0062 + { .time = 1, .func = AGC_INST_AD }, // 0063 + { .time = 1, .func = AGC_INST_AD }, // 0064 + { .time = 1, .func = AGC_INST_AD }, // 0065 + { .time = 1, .func = AGC_INST_AD }, // 0066 + { .time = 1, .func = AGC_INST_AD }, // 0067 + { .time = 1, .func = AGC_INST_MASK }, // 0070 + { .time = 1, .func = AGC_INST_MASK }, // 0071 + { .time = 1, .func = AGC_INST_MASK }, // 0072 + { .time = 1, .func = AGC_INST_MASK }, // 0073 + { .time = 1, .func = AGC_INST_MASK }, // 0074 + { .time = 1, .func = AGC_INST_MASK }, // 0075 + { .time = 1, .func = AGC_INST_MASK }, // 0076 + { .time = 1, .func = AGC_INST_MASK }, // 0077 + { .time = 1, .func = AGC_INST_READ }, // 0100 + { .time = 1, .func = AGC_INST_WRITE }, // 0101 + { .time = 1, .func = AGC_INST_RAND }, // 0102 + { .time = 1, .func = AGC_INST_WAND }, // 0103 + { .time = 1, .func = AGC_INST_ROR }, // 0104 + { .time = 1, .func = AGC_INST_WOR }, // 0105 + { .time = 1, .func = AGC_INST_RXOR }, // 0106 + { .time = 1, .func = AGC_INST_EDRUPT }, // 0107 + { .time = 5, .func = AGC_INST_DV }, // 0110 + { .time = 5, .func = AGC_INST_DV }, // 0111 + { .time = 0, .func = AGC_INST_BZF }, // 0112 + { .time = 0, .func = AGC_INST_BZF }, // 0113 + { .time = 0, .func = AGC_INST_BZF }, // 0114 + { .time = 0, .func = AGC_INST_BZF }, // 0115 + { .time = 0, .func = AGC_INST_BZF }, // 0116 + { .time = 0, .func = AGC_INST_BZF }, // 0117 + { .time = 1, .func = AGC_INST_MSU }, // 0120 + { .time = 1, .func = AGC_INST_MSU }, // 0121 + { .time = 1, .func = AGC_INST_QXCH }, // 0122 + { .time = 1, .func = AGC_INST_QXCH }, // 0123 + { .time = 1, .func = AGC_INST_AUG }, // 0124 + { .time = 1, .func = AGC_INST_AUG }, // 0125 + { .time = 1, .func = AGC_INST_DIM }, // 0126 + { .time = 1, .func = AGC_INST_DIM }, // 0127 + { .time = 2, .func = AGC_INST_DCA }, // 0130 + { .time = 2, .func = AGC_INST_DCA }, // 0131 + { .time = 2, .func = AGC_INST_DCA }, // 0132 + { .time = 2, .func = AGC_INST_DCA }, // 0133 + { .time = 2, .func = AGC_INST_DCA }, // 0134 + { .time = 2, .func = AGC_INST_DCA }, // 0135 + { .time = 2, .func = AGC_INST_DCA }, // 0136 + { .time = 2, .func = AGC_INST_DCA }, // 0137 + { .time = 2, .func = AGC_INST_DCS }, // 0140 + { .time = 2, .func = AGC_INST_DCS }, // 0141 + { .time = 2, .func = AGC_INST_DCS }, // 0142 + { .time = 2, .func = AGC_INST_DCS }, // 0143 + { .time = 2, .func = AGC_INST_DCS }, // 0144 + { .time = 2, .func = AGC_INST_DCS }, // 0145 + { .time = 2, .func = AGC_INST_DCS }, // 0146 + { .time = 2, .func = AGC_INST_DCS }, // 0147 + { .time = 1, .func = AGC_INDEX_INDEX }, // 0150 + { .time = 1, .func = AGC_INDEX_INDEX }, // 0151 + { .time = 1, .func = AGC_INDEX_INDEX }, // 0152 + { .time = 1, .func = AGC_INDEX_INDEX }, // 0153 + { .time = 1, .func = AGC_INDEX_INDEX }, // 0154 + { .time = 1, .func = AGC_INDEX_INDEX }, // 0155 + { .time = 1, .func = AGC_INDEX_INDEX }, // 0156 + { .time = 1, .func = AGC_INDEX_INDEX }, // 0157 + { .time = 1, .func = AGC_INST_SU }, // 0160 + { .time = 1, .func = AGC_INST_SU }, // 0161 + { .time = 0, .func = AGC_INST_BZMF }, // 0162 + { .time = 0, .func = AGC_INST_BZMF }, // 0163 + { .time = 0, .func = AGC_INST_BZMF }, // 0164 + { .time = 0, .func = AGC_INST_BZMF }, // 0165 + { .time = 0, .func = AGC_INST_BZMF }, // 0166 + { .time = 0, .func = AGC_INST_BZMF }, // 0167 + { .time = 2, .func = AGC_INST_MP }, // 0170 + { .time = 2, .func = AGC_INST_MP }, // 0171 + { .time = 2, .func = AGC_INST_MP }, // 0172 + { .time = 2, .func = AGC_INST_MP }, // 0173 + { .time = 2, .func = AGC_INST_MP }, // 0174 + { .time = 2, .func = AGC_INST_MP }, // 0175 + { .time = 2, .func = AGC_INST_MP }, // 0176 + { .time = 2, .func = AGC_INST_MP }, // 0177 }; // A way, for debugging, to disable interrupts. The 0th entry disables @@ -2105,117 +2211,6 @@ switch (ExtendedOpcode) { - case 012: // TCF. - case 013: - case 014: - case 015: - case 016: - case 017: - BacktraceAdd (State, 0); - // TCF instruction (1 MCT). - NextZ = Address12; - // THAT was easy ... too easy ... - break; - case 020: // DAS. - case 021: - //DasInstruction: - // DAS instruction (3 MCT). - { - // We add the less-significant words (as SP values), and thus - // the sign of the lower word of the output does not necessarily - // match the sign of the upper word. - int Msw, Lsw; - if (IsL (Address10)) // DDOUBL - { - Lsw = AddSP16 (0177777 & c (RegL), 0177777 & c (RegL)); - Msw = AddSP16 (Accumulator, Accumulator); - if ((0140000 & Lsw) == 0040000) - Msw = AddSP16 (Msw, AGC_P1); - else if ((0140000 & Lsw) == 0100000) - Msw = AddSP16 (Msw, SignExtend (AGC_M1)); - Lsw = OverflowCorrected (Lsw); - c (RegA) = 0177777 & Msw; - c (RegL) = 0177777 & SignExtend (Lsw); - break; - } - WhereWord = FindMemoryWord (State, Address10); - if (Address10 < REG16) - Lsw = AddSP16 (0177777 & c (RegL), 0177777 & c (Address10)); - else - Lsw = AddSP16 (0177777 & c (RegL), SignExtend (*WhereWord)); - if (Address10 < REG16 + 1) - Msw = AddSP16 (Accumulator, 0177777 & c (Address10 - 1)); - else - Msw = AddSP16 (Accumulator, SignExtend (WhereWord[-1])); - - if ((0140000 & Lsw) == 0040000) - Msw = AddSP16 (Msw, AGC_P1); - else if ((0140000 & Lsw) == 0100000) - Msw = AddSP16 (Msw, SignExtend (AGC_M1)); - Lsw = OverflowCorrected (Lsw); - - if ((0140000 & Msw) == 0100000) - c (RegA) = SignExtend (AGC_M1); - else if ((0140000 & Msw) == 0040000) - c (RegA) = AGC_P1; - else - c (RegA) = AGC_P0; - c (RegL) = AGC_P0; - // Save the results. - if (Address10 < REG16) - c (Address10) = SignExtend (Lsw); - else - AssignFromPointer (State, WhereWord, Lsw); - if (Address10 < REG16 + 1) - c (Address10 - 1) = Msw; - else - AssignFromPointer (State, WhereWord - 1, OverflowCorrected (Msw)); - } - break; - case 022: // LXCH. - case 023: - // "LXCH K" instruction (2 MCT). - if (IsL (Address10)) - break; - if (IsReg (Address10, RegZERO)) // ZL - c (RegL) = AGC_P0; - else if (Address10 < REG16) - { - Operand16 = c (RegL); - c (RegL) = c (Address10); - if (Address10 >= 020 && Address10 <= 023) - AssignFromPointer (State, WhereWord, - OverflowCorrected (0177777 & Operand16)); - else - c (Address10) = Operand16; - if (Address10 == RegZ) - NextZ = c (RegZ); - } - else - { - WhereWord = FindMemoryWord (State, Address10); - Operand16 = *WhereWord; - AssignFromPointer (State, WhereWord, - OverflowCorrected (0177777 & c (RegL))); - c (RegL) = SignExtend (Operand16); - } - break; - case 024: // INCR. - case 025: - // INCR instruction (2 MCT). - { - int Sum; - WhereWord = FindMemoryWord (State, Address10); - if (Address10 < REG16) - c (Address10) = AddSP16 (AGC_P1, 0177777 & c (Address10)); - else - { - Sum = AddSP16 (AGC_P1, SignExtend (*WhereWord)); - AssignFromPointer (State, WhereWord, OverflowCorrected (Sum)); - InterruptRequests (State, Address10, Sum); - } - } - break; case 026: // ADS. Reviewed against Blair-Smith. case 027: // ADS instruction (2 MCT).