Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1. /* codeol40.c */
  2. /*****************************************************************************/
  3. /* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only                     */
  4. /*                                                                           */
  5. /* AS-Portierung                                                             */
  6. /*                                                                           */
  7. /* Codegenerator OKI OLMS-40-Familie                                         */
  8. /*                                                                           */
  9. /*****************************************************************************/
  10.  
  11. #include "stdinc.h"
  12. #include <string.h>
  13. #include <ctype.h>
  14.  
  15. #include "bpemu.h"
  16. #include "strutil.h"
  17. #include "asmdef.h"
  18. #include "asmsub.h"
  19. #include "asmpars.h"
  20. #include "asmitree.h"
  21. #include "codepseudo.h"
  22. #include "fourpseudo.h"
  23. #include "codevars.h"
  24. #include "headids.h"
  25. #include "errmsg.h"
  26.  
  27. #include "codeol40.h"
  28.  
  29. typedef enum
  30. {
  31.   ModA = 0,
  32.   ModDPL = 1,
  33.   ModDPH = 2,
  34.   ModW = 3,
  35.   ModX = 4,
  36.   ModY = 5,
  37.   ModZ = 6,
  38.   ModM = 7,
  39.   ModImm = 10,
  40.   ModPP = 11,
  41.   ModT = 12,
  42.   ModTL = 13,
  43.   ModTH = 14,
  44.   ModPPI = 15,
  45.   ModNone = 0x7f
  46. } tAdrMode;
  47.  
  48. #define MModA (1 << ModA)
  49. #define MModDPL (1 << ModDPL)
  50. #define MModDPH (1 << ModDPH)
  51. #define MModW (1 << ModW)
  52. #define MModX (1 << ModX)
  53. #define MModY (1 << ModY)
  54. #define MModZ (1 << ModZ)
  55. #define MModM (1 << ModM)
  56. #define MModImm (1 << ModImm)
  57. #define MModPP (1 << ModPP)
  58. #define MModT (1 << ModT)
  59. #define MModTL (1 << ModTL)
  60. #define MModTH (1 << ModTH)
  61. #define MModPPI (1 << ModPPI)
  62.  
  63. static CPUVar CPU5840, CPU5842, CPU58421, CPU58422, CPU5847;
  64. static IntType CodeIntType, DataIntType, OpSizeType;
  65. static tAdrMode AdrMode;
  66. static Byte AdrVal;
  67.  
  68. /*-------------------------------------------------------------------------*/
  69.  
  70. typedef struct
  71. {
  72.   const char *pAsc;
  73.   tAdrMode AdrMode;
  74. } tNotation;
  75.  
  76. static void DecodeAdr(const tStrComp *pArg, Word Mask)
  77. {
  78.   static const tNotation Notations[] =
  79.   {
  80.     { "A",    ModA    },
  81.     { "M",    ModM    },
  82.     { "(DP)", ModM    },
  83.     { "W",    ModW    },
  84.     { "X",    ModX    },
  85.     { "Y",    ModY    },
  86.     { "Z",    ModZ    },
  87.     { "DPL",  ModDPL  },
  88.     { "DPH",  ModDPH  },
  89.     { "PP",   ModPP   },
  90.     { "T",    ModT    },
  91.     { "TL",   ModTL   },
  92.     { "TH",   ModTH   },
  93.     { "(PP)", ModPPI  },
  94.     { NULL,   ModNone },
  95.   };
  96.   const tNotation *pNot;
  97.   Boolean OK;
  98.  
  99.   if (MomCPU != CPU5840)
  100.     Mask &= ~(MModX | MModY | MModZ | MModTL | MModTH);
  101.   if (MomCPU  == CPU5847)
  102.     Mask &= ~(MModW);
  103.  
  104.   for (pNot = Notations; pNot->pAsc; pNot++)
  105.     if (!as_strcasecmp(pArg->str.p_str, pNot->pAsc))
  106.     {
  107.       AdrMode = pNot->AdrMode;
  108.       goto AdrFound;
  109.     }
  110.  
  111.   AdrVal = EvalStrIntExpressionOffs(pArg, !!(0[pArg->str.p_str] == '#'), OpSizeType, &OK);
  112.   if (OK)
  113.   {
  114.     AdrMode = ModImm;
  115.     AdrVal &= IntTypeDefs[OpSizeType].Mask;
  116.   }
  117.  
  118. AdrFound:
  119.  
  120.   if ((AdrMode != ModNone) && (!(Mask & (1 << AdrMode))))
  121.   {
  122.     WrError(ErrNum_InvAddrMode);
  123.     AdrMode = ModNone; AdrCnt = 0;
  124.   }
  125. }
  126.  
  127. /*-------------------------------------------------------------------------*/
  128.  
  129. static void DecodeLD(Word Code)
  130. {
  131.   UNUSED(Code);
  132.  
  133.   if (ChkArgCnt(2, 2))
  134.   {
  135.     DecodeAdr(&ArgStr[1], MModA | MModDPL | MModDPH | MModW | MModX | MModY | MModZ | MModPP | MModT);
  136.     switch (AdrMode)
  137.     {
  138.       case ModA:
  139.         DecodeAdr(&ArgStr[2], MModImm | MModW | MModX | MModY | MModZ | MModM | MModDPL | MModTL | MModTH);
  140.         switch (AdrMode)
  141.         {
  142.           case ModW:
  143.           case ModX:
  144.           case ModY:
  145.           case ModZ:
  146.             BAsmCode[CodeLen++] = 0x84 | (AdrMode - ModW);
  147.             break;
  148.           case ModM:
  149.             BAsmCode[CodeLen++] = 0x94;
  150.             break;
  151.           case ModDPL:
  152.             BAsmCode[CodeLen++] = 0x55;
  153.             break;
  154.           case ModImm:
  155.             BAsmCode[CodeLen++] = 0x10 | AdrVal;
  156.             break;
  157.           case ModTL:
  158.           case ModTH:
  159.             BAsmCode[CodeLen++] = 0x6b - (AdrMode - ModTL);
  160.             break;
  161.           default:
  162.             break;
  163.         }
  164.         break;
  165.       case ModDPL:
  166.         DecodeAdr(&ArgStr[2], MModImm | MModA);
  167.         switch (AdrMode)
  168.         {
  169.           case ModImm:
  170.             BAsmCode[CodeLen++] = 0x20 | AdrVal;
  171.             break;
  172.           case ModA:
  173.             BAsmCode[CodeLen++] = 0x54;
  174.             break;
  175.           default:
  176.             break;
  177.         }
  178.         break;
  179.       case ModDPH:
  180.         DecodeAdr(&ArgStr[2], MModImm);
  181.         switch (AdrMode)
  182.         {
  183.           case ModImm:
  184.             BAsmCode[CodeLen++] = 0x60 | AdrVal;
  185.             break;
  186.           default:
  187.             break;
  188.         }
  189.         break;
  190.       case ModW:
  191.       case ModX:
  192.       case ModY:
  193.       case ModZ:
  194.       {
  195.         tAdrMode HMode = AdrMode;
  196.  
  197.         DecodeAdr(&ArgStr[2], MModA);
  198.         switch (AdrMode)
  199.         {
  200.           case ModA:
  201.             BAsmCode[CodeLen++] = 0x80 | (HMode - ModW);
  202.             break;
  203.           default:
  204.             break;
  205.         }
  206.         break;
  207.       }
  208.       case ModPP:
  209.         DecodeAdr(&ArgStr[2], MModA);
  210.         switch (AdrMode)
  211.         {
  212.           case ModA:
  213.             BAsmCode[CodeLen++] = 0x58;
  214.             break;
  215.           default:
  216.             break;
  217.         }
  218.         break;
  219.       case ModT:
  220.         OpSizeType = Int8;
  221.         DecodeAdr(&ArgStr[2], MModImm);
  222.         switch (AdrMode)
  223.         {
  224.           case ModImm:
  225.             if (MomCPU == CPU5840)
  226.             {
  227.               BAsmCode[CodeLen++] = 0x68;
  228.               BAsmCode[CodeLen++] = AdrVal;
  229.             }
  230.             else if (AdrVal) WrError(ErrNum_OverRange);
  231.             else
  232.               BAsmCode[CodeLen++] = 0x68;
  233.             break;
  234.           default:
  235.             break;
  236.         }
  237.         break;
  238.       default:
  239.         break;
  240.     }
  241.   }
  242. }
  243.  
  244. static void DecodeINCDEC(Word IsDEC)
  245. {
  246.   if (ChkArgCnt(1, 1))
  247.   {
  248.     DecodeAdr(&ArgStr[1], MModA | MModW | MModX | MModY | MModZ | MModDPL | MModM
  249.                        | ((IsDEC && (MomCPU == CPU5840)) ? MModDPH : 0));
  250.     switch (AdrMode)
  251.     {
  252.       case ModA:
  253.         BAsmCode[CodeLen++] = IsDEC ? 0x0f : 0x01;
  254.         break;
  255.       case ModW:
  256.       case ModX:
  257.       case ModY:
  258.       case ModZ:
  259.         BAsmCode[CodeLen++] = (IsDEC ? 0x8c : 0x88) | (AdrMode - ModW);
  260.         break;
  261.       case ModM:
  262.         BAsmCode[CodeLen++] = IsDEC ? 0x5c : 0x5d;
  263.         break;
  264.       case ModDPL:
  265.         BAsmCode[CodeLen++] = IsDEC ? 0x56 : 0x57;
  266.         break;
  267.       case ModDPH:
  268.         BAsmCode[CodeLen++] = 0x5f;
  269.         break;
  270.       default:
  271.         break;
  272.     }
  273.   }
  274. }
  275.  
  276. static void DecodeBit(Word Code)
  277. {
  278.   if (ArgCnt == 1)
  279.   {
  280.     if (!as_strcasecmp(ArgStr[1].str.p_str, "C"))
  281.       BAsmCode[CodeLen++] = Hi(Code);
  282.     else
  283.       WrError(ErrNum_InvAddrMode);
  284.   }
  285.   else if (ChkArgCnt(1, 2))
  286.   {
  287.     Boolean OK;
  288.     unsigned BitNo = EvalStrIntExpression(&ArgStr[2], UInt2, &OK);
  289.  
  290.     Code = Lo(Code);
  291.  
  292.     if (OK)
  293.     {
  294.       DecodeAdr(&ArgStr[1], ((Code == 2) ? MModA : MModPPI) | MModM);
  295.       switch (AdrMode)
  296.       {
  297.         case ModA:
  298.           BAsmCode[CodeLen++] = 0xa0 | BitNo;
  299.           break;
  300.         case ModM:
  301.           if (Code == 2)
  302.             BAsmCode[CodeLen++] = 0xa4 | BitNo;
  303.           else
  304.             BAsmCode[CodeLen++] = 0xb8 | (Code << 2) | BitNo;
  305.           break;
  306.         case ModPPI:
  307.           BAsmCode[CodeLen++] = 0xb0 | (Code << 2) | BitNo;
  308.           break;
  309.         default:
  310.           break;
  311.       }
  312.     }
  313.   }
  314. }
  315.  
  316. static void CodeFixed(Word Code)
  317. {
  318.   if (ChkArgCnt(0, 0)
  319.    && (ChkExactCPUMask(Hi(Code), CPU5840) >= 0))
  320.     BAsmCode[CodeLen++] = Lo(Code);
  321. }
  322.  
  323. static void CodeTHB(Word Code)
  324. {
  325.   if (ChkArgCnt(1, 1)
  326.    && (ChkExactCPUMask(Hi(Code), CPU5840) >= 0))
  327.   {
  328.     Boolean OK = True;
  329.     Word ImmVal = ArgCnt ? EvalStrIntExpression(&ArgStr[1], UInt1, &OK) : 0;
  330.  
  331.     if (OK)
  332.     {
  333.       if ((MomCPU == CPU5840) || (MomCPU == CPU5842))
  334.         BAsmCode[CodeLen++] = Lo(Code) | (ImmVal & 1);
  335.       else if (ImmVal) WrError(ErrNum_OverRange);
  336.       else
  337.         BAsmCode[CodeLen++] = Lo(Code);
  338.     }
  339.   }
  340. }
  341.  
  342. static void CodeImm2(Word Code)
  343. {
  344.   if (ChkArgCnt(1, 1)
  345.    && (ChkExactCPUMask(Hi(Code), CPU5840) >= 0))
  346.   {
  347.     Boolean OK;
  348.     Word ImmVal = EvalStrIntExpression(&ArgStr[1], UInt2, &OK);
  349.  
  350.     if (OK)
  351.       BAsmCode[CodeLen++] = Lo(Code) | (ImmVal & 3);
  352.   }
  353. }
  354.  
  355. static void CodeImm4(Word Code)
  356. {
  357.   if (ChkArgCnt(1, 1)
  358.    && (ChkExactCPUMask(Hi(Code), CPU5840) >= 0))
  359.   {
  360.     Boolean OK;
  361.     Word ImmVal = EvalStrIntExpression(&ArgStr[1], Int4, &OK);
  362.  
  363.     if (OK)
  364.       BAsmCode[CodeLen++] = Lo(Code) | (ImmVal & 15);
  365.   }
  366. }
  367.  
  368. static void CodeLTI(Word Code)
  369. {
  370.   if (ChkArgCnt(0, 1)
  371.    && (ChkExactCPUMask(Hi(Code), CPU5840) >= 0))
  372.   {
  373.     Boolean OK = True;
  374.     Word ImmVal = ArgCnt ? EvalStrIntExpression(&ArgStr[1], Int8, &OK) : 0;
  375.  
  376.     if (OK)
  377.     {
  378.       /* LTI can only load 0 into timer on smaller devices */
  379.  
  380.       if (MomCPU == CPU5840)
  381.       {
  382.         BAsmCode[CodeLen++] = Lo(Code);
  383.         BAsmCode[CodeLen++] = Lo(ImmVal);
  384.       }
  385.       else if (ImmVal != 0) WrError(ErrNum_OverRange);
  386.       else
  387.         BAsmCode[CodeLen++] = Lo(Code);
  388.     }
  389.   }
  390. }
  391.  
  392. static void CodeJC(Word Code)
  393. {
  394.   if (ChkArgCnt(1, 1)
  395.    && (ChkExactCPUMask(Hi(Code), CPU5840) >= 0))
  396.   {
  397.     tEvalResult EvalResult;
  398.     Word Address = EvalStrIntExpressionWithResult(&ArgStr[1], CodeIntType, &EvalResult);
  399.     if (EvalResult.OK && ChkSamePage(EProgCounter() + 1, Address, 6, EvalResult.Flags))
  400.     {
  401.       ChkSpace(SegCode, EvalResult.AddrSpaceMask);
  402.       BAsmCode[CodeLen++] = Lo(Code) | (Address & 0x3f);
  403.     }
  404.   }
  405. }
  406.  
  407. static void CodeJMP(Word Code)
  408. {
  409.   if (ChkArgCnt(1, 1)
  410.    && (ChkExactCPUMask(Hi(Code), CPU5840) >= 0))
  411.   {
  412.     tEvalResult EvalResult;
  413.     Word Address= EvalStrIntExpressionWithResult(&ArgStr[1], CodeIntType, &EvalResult);
  414.     if (EvalResult.OK)
  415.     {
  416.       ChkSpace(SegCode, EvalResult.AddrSpaceMask);
  417.       BAsmCode[CodeLen++] = Lo(Code) | (Hi(Address) & 0x07);
  418.       BAsmCode[CodeLen++] = Lo(Address);
  419.     }
  420.   }
  421. }
  422.  
  423. static void DecodeDATA_OLMS40(Word Code)
  424. {
  425.   UNUSED(Code);
  426.  
  427.   DecodeDATA(Int8, Int4);
  428. }
  429.  
  430. static void DecodeSFR(Word Code)
  431. {
  432.   UNUSED(Code);
  433.  
  434.   CodeEquate(SegData, 0, SegLimits[SegData]);
  435. }
  436.  
  437. /*-------------------------------------------------------------------------*/
  438.  
  439. static void InitFields(void)
  440. {
  441.   InstTable = CreateInstTable(201);
  442.  
  443.   AddInstTable(InstTable, "LD", 0, DecodeLD);
  444.   AddInstTable(InstTable, "INC", 0, DecodeINCDEC);
  445.   AddInstTable(InstTable, "DEC", 1, DecodeINCDEC);
  446.   AddInstTable(InstTable, "BSET", 0x4000, DecodeBit);
  447.   AddInstTable(InstTable, "BCLR", 0x4101, DecodeBit);
  448.   AddInstTable(InstTable, "BTST", 0x4202, DecodeBit);
  449.  
  450.   AddInstTable(InstTable, "CLA",    0x1f10, CodeFixed);
  451.   AddInstTable(InstTable, "CLL",    0x1f20, CodeFixed);
  452.   AddInstTable(InstTable, "CLH",    0x1f60, CodeFixed);
  453.   AddInstTable(InstTable, "L",      0x1f94, CodeFixed);
  454.   AddInstTable(InstTable, "LAL",    0x1f55, CodeFixed);
  455.   AddInstTable(InstTable, "LLA",    0x1f54, CodeFixed);
  456.   AddInstTable(InstTable, "LAW",    0x0f84, CodeFixed);
  457.   AddInstTable(InstTable, "LAX",    0x0185, CodeFixed);
  458.   AddInstTable(InstTable, "LAY",    0x0186, CodeFixed);
  459.   AddInstTable(InstTable, "LAZ",    0x0187, CodeFixed);
  460.   AddInstTable(InstTable, "SI",     0x1f90, CodeFixed);
  461.   AddInstTable(InstTable, "LWA",    0x0f80, CodeFixed);
  462.   AddInstTable(InstTable, "LXA",    0x0181, CodeFixed);
  463.   AddInstTable(InstTable, "LYA",    0x0182, CodeFixed);
  464.   AddInstTable(InstTable, "LZA",    0x0183, CodeFixed);
  465.   AddInstTable(InstTable, "LPA",    0x1f58, CodeFixed);
  466.   AddInstTable(InstTable, "RTH",    0x016a, CodeFixed);
  467.   AddInstTable(InstTable, "RTL",    0x016b, CodeFixed);
  468.   AddInstTable(InstTable, "XA",     0x0149, CodeFixed);
  469.   AddInstTable(InstTable, "XL",     0x014a, CodeFixed);
  470.   AddInstTable(InstTable, "XCH",    0x0148, CodeFixed);
  471.   AddInstTable(InstTable, "X",      0x1f98, CodeFixed);
  472.   AddInstTable(InstTable, "XAX",    0x014b, CodeFixed);
  473.   AddInstTable(InstTable, "INA",    0x0f01, CodeFixed);
  474.   AddInstTable(InstTable, "INL",    0x0f57, CodeFixed);
  475.   AddInstTable(InstTable, "INM",    0x1f5d, CodeFixed);
  476.   AddInstTable(InstTable, "INW",    0x0f88, CodeFixed);
  477.   AddInstTable(InstTable, "INX",    0x0189, CodeFixed);
  478.   AddInstTable(InstTable, "INY",    0x018a, CodeFixed);
  479.   AddInstTable(InstTable, "INZ",    0x018b, CodeFixed);
  480.   AddInstTable(InstTable, "DCA",    0x0f0f, CodeFixed);
  481.   AddInstTable(InstTable, "DCL",    0x0f56, CodeFixed);
  482.   AddInstTable(InstTable, "DCM",    0x1f5c, CodeFixed);
  483.   AddInstTable(InstTable, "DCW",    0x018c, CodeFixed);
  484.   AddInstTable(InstTable, "DCX",    0x018d, CodeFixed);
  485.   AddInstTable(InstTable, "DCY",    0x018e, CodeFixed);
  486.   AddInstTable(InstTable, "DCZ",    0x018f, CodeFixed);
  487.   AddInstTable(InstTable, "DCH",    0x015f, CodeFixed);
  488.   AddInstTable(InstTable, "CAO",    0x1f50, CodeFixed);
  489.   AddInstTable(InstTable, "AND",    0x0144, CodeFixed);
  490.   AddInstTable(InstTable, "OR",     0x0145, CodeFixed);
  491.   AddInstTable(InstTable, "EOR",    0x0146, CodeFixed);
  492.   AddInstTable(InstTable, "RAL",    0x1f47, CodeFixed);
  493.   AddInstTable(InstTable, "AC",     0x1f4c, CodeFixed);
  494.   AddInstTable(InstTable, "ACS",    0x014d, CodeFixed);
  495.   AddInstTable(InstTable, "AS",     0x1f4e, CodeFixed);
  496.   AddInstTable(InstTable, "DAS",    0x1f5a, CodeFixed);
  497.   AddInstTable(InstTable, "CM",     0x1f5e, CodeFixed);
  498.   AddInstTable(InstTable, "AWS",    0x019c, CodeFixed);
  499.   AddInstTable(InstTable, "AXS",    0x019d, CodeFixed);
  500.   AddInstTable(InstTable, "AYS",    0x019e, CodeFixed);
  501.   AddInstTable(InstTable, "AZS",    0x019f, CodeFixed);
  502.   AddInstTable(InstTable, "TI",     0x01af, CodeFixed);
  503.   AddInstTable(InstTable, "TTM",    0x1fae, CodeFixed);
  504.   AddInstTable(InstTable, "TC",     0x1f42, CodeFixed);
  505.   AddInstTable(InstTable, "SC",     0x1f40, CodeFixed);
  506.   AddInstTable(InstTable, "RC",     0x1f41, CodeFixed);
  507.   AddInstTable(InstTable, "JA",     0x1f43, CodeFixed);
  508.   AddInstTable(InstTable, "RT",     0x1f59, CodeFixed);
  509.   AddInstTable(InstTable, "OBS",    0x0170, CodeFixed);
  510.   AddInstTable(InstTable, "OTD",    0x1f71, CodeFixed);
  511.   AddInstTable(InstTable, "OA",     0x1f72, CodeFixed);
  512.   AddInstTable(InstTable, "OB",     0x1f73, CodeFixed);
  513.   AddInstTable(InstTable, "OP",     0x1f74, CodeFixed);
  514.   AddInstTable(InstTable, "OAB",    0x0175, CodeFixed);
  515.   AddInstTable(InstTable, "OPM",    0x1f76, CodeFixed);
  516.   AddInstTable(InstTable, "IA",     0x1f7a, CodeFixed);
  517.   AddInstTable(InstTable, "IB",     0x1f7b, CodeFixed);
  518.   AddInstTable(InstTable, "IK",     0x0f7c, CodeFixed);
  519.   AddInstTable(InstTable, "IAB",    0x017d, CodeFixed);
  520.   AddInstTable(InstTable, "EI",     0x0153, CodeFixed);
  521.   AddInstTable(InstTable, "DI",     0x0152, CodeFixed);
  522.   AddInstTable(InstTable, "ET",     0x016f, CodeFixed);
  523.   AddInstTable(InstTable, "DT",     0x016e, CodeFixed);
  524.   AddInstTable(InstTable, "ECT",    0x017f, CodeFixed);
  525.   AddInstTable(InstTable, "DCT",    0x017e, CodeFixed);
  526.   AddInstTable(InstTable, "HLT",    0x016d, CodeFixed);
  527.   AddInstTable(InstTable, "EXP",    0x0169, CodeFixed);
  528.   AddInstTable(InstTable, "NOP",    0x1f00, CodeFixed);
  529.  
  530.   AddInstTable(InstTable, "THB",    0x0fac, CodeTHB);
  531.  
  532.   AddInstTable(InstTable, "LM",     0x0194, CodeImm2);
  533.   AddInstTable(InstTable, "SMI",    0x0190, CodeImm2);
  534.   AddInstTable(InstTable, "XM",     0x0198, CodeImm2);
  535.   AddInstTable(InstTable, "SPB",    0x01b0, CodeImm2);
  536.   AddInstTable(InstTable, "RPB",    0x01b4, CodeImm2);
  537.   AddInstTable(InstTable, "SMB",    0x1fb8, CodeImm2);
  538.   AddInstTable(InstTable, "RMB",    0x1fbc, CodeImm2);
  539.   AddInstTable(InstTable, "TAB",    0x1fa0, CodeImm2);
  540.   AddInstTable(InstTable, "TMB",    0x1fa4, CodeImm2);
  541.   AddInstTable(InstTable, "TKB",    0x01a8, CodeImm2);
  542.  
  543.   AddInstTable(InstTable, "LAI",    0x1f10, CodeImm4);
  544.   AddInstTable(InstTable, "LLI",    0x1f20, CodeImm4);
  545.   AddInstTable(InstTable, "LHI",    0x1f60, CodeImm4);
  546.   AddInstTable(InstTable, "AIS",    0x1f00, CodeImm4);
  547.  
  548.   AddInstTable(InstTable, "LTI",    0x1f68, CodeLTI);
  549.  
  550.   AddInstTable(InstTable, "JC",     0x1fc0, CodeJC);
  551.  
  552.   AddInstTable(InstTable, "J",      0x1f30, CodeJMP);
  553.   AddInstTable(InstTable, "CAL",    0x1f38, CodeJMP);
  554.  
  555.   AddInstTable(InstTable, "RES", 0, DecodeRES);
  556.   AddInstTable(InstTable, "DATA", 0, DecodeDATA_OLMS40);
  557.   AddInstTable(InstTable, "SFR", 0, DecodeSFR);
  558. }
  559.  
  560. static void DeinitFields(void)
  561. {
  562.   DestroyInstTable(InstTable);
  563. }
  564.  
  565. /*-------------------------------------------------------------------------*/
  566.  
  567. static void  MakeCode_OLMS40(void)
  568. {
  569.   CodeLen = 0;
  570.   DontPrint = False;
  571.   OpSizeType = Int4;
  572.  
  573.   /* zu ignorierendes */
  574.  
  575.   if (Memo(""))
  576.     return;
  577.  
  578.   if (!LookupInstTable(InstTable, OpPart.str.p_str))
  579.     WrStrErrorPos(ErrNum_UnknownInstruction, &OpPart);
  580. }
  581.  
  582.  
  583. static Boolean IsDef_OLMS40(void)
  584. {
  585.   return False;
  586. }
  587.  
  588. static void SwitchFrom_OLMS40(void)
  589. {
  590.   DeinitFields();
  591. }
  592.  
  593. static void SwitchTo_OLMS40(void)
  594. {
  595.   const TFamilyDescr *pDescr;
  596.  
  597.   pDescr = FindFamilyByName("OLMS-40");
  598.  
  599.   TurnWords = False;
  600.   SetIntConstMode(eIntConstModeIntel);
  601.  
  602.   PCSymbol = "$";
  603.   HeaderID = pDescr->Id;
  604.   NOPCode = 0x00;
  605.   DivideChars = ",";
  606.   HasAttrs = False;
  607.  
  608.   ValidSegs = (1 << SegCode) | (1 << SegData);
  609.   Grans[SegCode] = 1; ListGrans[SegCode] = 1; SegInits[SegCode] = 0;
  610.   Grans[SegData] = 1; ListGrans[SegData] = 1; SegInits[SegCode] = 0;
  611.   if (MomCPU == CPU5840)
  612.   {
  613.     CodeIntType = UInt11;
  614.     DataIntType = UInt7;
  615.     SegLimits[SegData] = IntTypeDefs[DataIntType].Max;
  616.     SegLimits[SegCode] = IntTypeDefs[CodeIntType].Max;
  617.   }
  618.   else if (MomCPU == CPU5842)
  619.   {
  620.     CodeIntType = UInt10;
  621.     DataIntType = UInt5;
  622.     SegLimits[SegData] = IntTypeDefs[DataIntType].Max;
  623.     SegLimits[SegCode] = 767;
  624.   }
  625.   else if ((MomCPU == CPU58421) || (MomCPU == CPU58422))
  626.   {
  627.     CodeIntType = UInt11;
  628.     DataIntType = UInt6;
  629.     SegLimits[SegData] = 39;
  630.     SegLimits[SegCode] = 1535;
  631.   }
  632.   else if (MomCPU == CPU5847)
  633.   {
  634.     CodeIntType = UInt11;
  635.     DataIntType = UInt7;
  636.     SegLimits[SegData] = 95;
  637.     SegLimits[SegCode] = 1535;
  638.   }
  639.  
  640.   MakeCode = MakeCode_OLMS40;
  641.   IsDef = IsDef_OLMS40;
  642.   SwitchFrom = SwitchFrom_OLMS40; InitFields();
  643.  
  644. }
  645.  
  646. void codeolms40_init(void)
  647. {
  648.   CPU5840  = AddCPU("MSM5840" , SwitchTo_OLMS40);
  649.   CPU5842  = AddCPU("MSM5842" , SwitchTo_OLMS40);
  650.   CPU58421 = AddCPU("MSM58421", SwitchTo_OLMS40);
  651.   CPU58422 = AddCPU("MSM58422", SwitchTo_OLMS40);
  652.   CPU5847  = AddCPU("MSM5847" , SwitchTo_OLMS40);
  653. }
  654.