Subversion Repositories pentevo

Rev

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

  1. /* codeh8_3.c */
  2. /*****************************************************************************/
  3. /* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only                     */
  4. /*                                                                           */
  5. /* AS-Portierung                                                             */
  6. /*                                                                           */
  7. /* Codegenerator H8/300(L/H)                                                 */
  8. /*                                                                           */
  9. /*****************************************************************************/
  10.  
  11. #include "stdinc.h"
  12. #include <string.h>
  13. #include <ctype.h>
  14.  
  15. #include "nls.h"
  16. #include "bpemu.h"
  17. #include "strutil.h"
  18. #include "asmdef.h"
  19. #include "asmsub.h"
  20. #include "asmpars.h"
  21. #include "asmallg.h"
  22. #include "onoff_common.h"
  23. #include "asmstructs.h"
  24. #include "asmitree.h"
  25. #include "codepseudo.h"
  26. #include "motpseudo.h"
  27. #include "codevars.h"
  28. #include "errmsg.h"
  29.  
  30. #include "codeh8_3.h"
  31.  
  32. #define ModNone (-1)
  33. #define ModReg 0
  34. #define MModReg (1 << ModReg)
  35. #define ModImm 1
  36. #define MModImm (1 << ModImm)
  37. #define ModAbs8 2
  38. #define MModAbs8 (1 << ModAbs8)
  39. #define ModAbs16 3
  40. #define MModAbs16 (1 << ModAbs16)
  41. #define ModAbs24 4
  42. #define MModAbs24 (1 << ModAbs24)
  43. #define MModAbs (MModAbs8 | MModAbs16 | MModAbs24)
  44. #define ModIReg 5
  45. #define MModIReg (1 << ModIReg)
  46. #define ModPreDec 6
  47. #define MModPreDec (1 << ModPreDec)
  48. #define ModPostInc 7
  49. #define MModPostInc (1 << ModPostInc)
  50. #define ModInd16 8
  51. #define MModInd16 (1 << ModInd16)
  52. #define ModInd24 9
  53. #define MModInd24 (1 << ModInd24)
  54. #define ModIIAbs 10
  55. #define MModIIAbs (1 << ModIIAbs)
  56. #define MModInd (MModInd16 | MModInd24)
  57.  
  58. /* keep in the same order as in registration */
  59.  
  60. #define M_CPUH8_300L  (1 << 0)
  61. #define M_CPU6413308  (1 << 1)
  62. #define M_CPUH8_300   (1 << 2)
  63. #define M_CPU6413309  (1 << 3)
  64. #define M_CPUH8_300H  (1 << 4)
  65.  
  66. #define REG_SP 7
  67.  
  68. static tSymbolSize OpSize, MomSize;
  69. static ShortInt AdrMode;    /* Ergebnisadressmodus */
  70. static Byte AdrPart;        /* Adressierungsmodusbits im Opcode */
  71. static Word AdrVals[6];     /* Adressargument */
  72.  
  73. static CPUVar CPUH8_300L;
  74. static CPUVar CPU6413308,CPUH8_300;
  75. static CPUVar CPU6413309,CPUH8_300H;
  76. static Boolean CPU16;       /* keine 32-Bit-Register */
  77.  
  78. /*-------------------------------------------------------------------------*/
  79. /* Adressparsing */
  80.  
  81. static void SetOpSize(tSymbolSize Size)
  82. {
  83.   if (OpSize == eSymbolSizeUnknown)
  84.     OpSize = Size;
  85.   else if (Size != OpSize)
  86.   {
  87.     WrError(ErrNum_ConfOpSizes);
  88.     AdrMode = ModNone;
  89.     AdrCnt = 0;
  90.   }
  91. }
  92.  
  93. static Boolean IsNum(char Inp, Byte *Erg)
  94. {
  95.   if ((Inp < '0') || (Inp > '7'))
  96.     return False;
  97.   else
  98.   {
  99.     *Erg = Inp - AscOfs;
  100.     return True;
  101.   }
  102. }
  103.  
  104. /*!------------------------------------------------------------------------
  105.  * \fn     DecodeRegCore(char *pArg, Byte *pResult, tSymbolSize *pSize)
  106.  * \brief  check whether argument is a CPU register
  107.  * \param  pArg source argument
  108.  * \param  pResult register # if yes
  109.  * \param  pSize register size if yes
  110.  * \return True if it is a register
  111.  * ------------------------------------------------------------------------ */
  112.  
  113. static Boolean DecodeRegCore(char *pArg, Byte *pResult, tSymbolSize *pSize)
  114. {
  115.   if (!as_strcasecmp(pArg, "SP"))
  116.   {
  117.     *pResult = REG_SP | REGSYM_FLAG_ALIAS;
  118.     *pSize = MaxMode ? eSymbolSize32Bit : eSymbolSize16Bit;
  119.     return True;
  120.   }
  121.  
  122.   switch (strlen(pArg))
  123.   {
  124.     case 2:
  125.       if (IsNum(pArg[1], pResult))
  126.       {
  127.         if (as_toupper(*pArg) == 'R')
  128.         {
  129.           *pSize = eSymbolSize16Bit;
  130.           return True;
  131.         }
  132.         else if (as_toupper(*pArg) == 'E')
  133.         {
  134.           *pResult += 8;
  135.           *pSize = eSymbolSize16Bit;
  136.           return True;
  137.         }
  138.       }
  139.       break;
  140.     case 3:
  141.       if ((as_toupper(*pArg) == 'R') && IsNum(pArg[1], pResult))
  142.       {
  143.         if (as_toupper(pArg[2]) == 'L')
  144.         {
  145.           *pResult += 8;
  146.           *pSize = eSymbolSize8Bit;
  147.           return True;
  148.         }
  149.         else if (as_toupper(pArg[2]) == 'H')
  150.         {
  151.           *pSize = eSymbolSize8Bit;
  152.           return True;
  153.         }
  154.       }
  155.       else if ((as_toupper(*pArg) == 'E') && (as_toupper(pArg[1]) == 'R') && IsNum(pArg[2], pResult))
  156.       {
  157.         *pSize = eSymbolSize32Bit;
  158.         return True;
  159.       }
  160.   }
  161.  
  162.   *pSize = eSymbolSizeUnknown;
  163.   return False;
  164. }
  165.  
  166. /*!------------------------------------------------------------------------
  167.  * \fn     DissectReg_H8_3(char *pDest, size_t DestSize, tRegInt Value, tSymbolSize InpSize)
  168.  * \brief  dissect register symbols - C16x variant
  169.  * \param  pDest destination buffer
  170.  * \param  DestSize destination buffer size
  171.  * \param  Value numeric register value
  172.  * \param  InpSize register size
  173.  * ------------------------------------------------------------------------ */
  174.  
  175. static void DissectReg_H8_3(char *pDest, size_t DestSize, tRegInt Value, tSymbolSize InpSize)
  176. {
  177.   switch (InpSize)
  178.   {
  179.     case eSymbolSize8Bit:
  180.       as_snprintf(pDest, DestSize, "R%u%c", (unsigned)(Value & 7), "HL"[(Value >> 3) & 1]);
  181.       break;
  182.     case eSymbolSize16Bit:
  183.       if (Value == (REG_SP | REGSYM_FLAG_ALIAS))
  184.         as_snprintf(pDest, DestSize, "SP");
  185.       else
  186.         as_snprintf(pDest, DestSize, "%c%u", "RE"[(Value >> 3) & 1], (unsigned)(Value & 7));
  187.       break;
  188.     case eSymbolSize32Bit:
  189.       if (Value == (REG_SP | REGSYM_FLAG_ALIAS))
  190.         as_snprintf(pDest, DestSize, "SP");
  191.       else
  192.         as_snprintf(pDest, DestSize, "ER%u", (unsigned)Value);
  193.       break;
  194.     default:
  195.       as_snprintf(pDest, DestSize, "%d-%u", (int)InpSize, (unsigned)Value);
  196.   }
  197. }
  198.  
  199. /*!------------------------------------------------------------------------
  200.  * \fn     DecodeReg(const tStrComp *pArg, Byte *pResult, tSymbolSize ReqSize, tSymbolSize *pSize)
  201.  * \brief  check whether argument is a CPU register or register alias
  202.  * \param  pArg source argument
  203.  * \param  pResult register # if yes
  204.  * \param  SizeMask requested register size(s)
  205.  * \param  pSize register size if yes
  206.  * \return reg eval result
  207.  * ------------------------------------------------------------------------ */
  208.  
  209. static tRegEvalResult DecodeReg(const tStrComp *pArg, Byte *pResult, unsigned SizeMask, tSymbolSize *pSize, Boolean MustBeReg)
  210. {
  211.   tRegDescr RegDescr;
  212.   tEvalResult EvalResult;
  213.   tRegEvalResult RegEvalResult;
  214.  
  215.   if (DecodeRegCore(pArg->str.p_str, pResult, pSize))
  216.   {
  217.     RegEvalResult = eIsReg;
  218.     *pResult &= ~REGSYM_FLAG_ALIAS;
  219.   }
  220.   else
  221.   {
  222.     RegEvalResult = EvalStrRegExpressionAsOperand(pArg, &RegDescr, &EvalResult, eSymbolSizeUnknown, MustBeReg);
  223.     *pSize = EvalResult.DataSize;
  224.     *pResult = RegDescr.Reg & ~REGSYM_FLAG_ALIAS;
  225.   }
  226.  
  227.   if ((RegEvalResult == eIsReg)
  228.    && !((SizeMask >> *pSize) & 1))
  229.   {
  230.     WrStrErrorPos(ErrNum_InvOpSize, pArg);
  231.     return MustBeReg ? eIsNoReg : eRegAbort;
  232.   }
  233.  
  234.   return RegEvalResult;
  235. }
  236.  
  237. static void CutSize(tStrComp *pArg)
  238. {
  239.   int ArgLen = strlen(pArg->str.p_str);
  240.  
  241.   if ((ArgLen >= 2) && !strcmp(pArg->str.p_str + ArgLen - 2, ":8"))
  242.   {
  243.     StrCompShorten(pArg, 2);
  244.     MomSize = eSymbolSize8Bit;
  245.   }
  246.   else if ((ArgLen >= 3) && !strcmp(pArg->str.p_str + ArgLen - 3, ":16"))
  247.   {
  248.     StrCompShorten(pArg, 3);
  249.     MomSize = eSymbolSize16Bit;
  250.   }
  251.   else if ((ArgLen >= 3) && !strcmp(pArg->str.p_str + ArgLen - 3, ":24"))
  252.   {
  253.     StrCompShorten(pArg, 3);
  254.     MomSize = eSymbolSize24Bit;
  255.   }
  256. }
  257.  
  258. static Boolean ChkCPU32(tErrorNum ErrorNum)
  259. {
  260.   return ChkMinCPUExt(CPU6413309, ErrorNum);
  261. }
  262.  
  263. static Byte DecodeBaseReg(const tStrComp *pArg, Byte *Erg, Boolean MustBeReg)
  264. {
  265.   tSymbolSize HSize;
  266.   Word Mask;
  267.  
  268.   switch (DecodeReg(pArg, Erg, (1 << eSymbolSize16Bit) | (1 << eSymbolSize32Bit), &HSize, MustBeReg))
  269.   {
  270.     case eIsNoReg:
  271.       return 0;
  272.     case eRegAbort:
  273.       return 1;
  274.     default:
  275.       break;
  276.   }
  277.   if ((HSize == eSymbolSize16Bit) && (*Erg > 7))
  278.   {
  279.     WrStrErrorPos(ErrNum_InvReg, pArg);
  280.     return 1;
  281.   }
  282.   Mask = (HSize == eSymbolSize16Bit) ? (M_CPUH8_300L | M_CPU6413308 | M_CPUH8_300) : (M_CPU6413309 | M_CPUH8_300H);
  283.   if (ChkExactCPUMaskExt(Mask, CPUH8_300L, ErrNum_AddrModeNotSupported) < 0)
  284.     return 1;
  285.   return 2;
  286. }
  287.  
  288. static Boolean Is8(LongInt Address)
  289. {
  290.   if (CPU16)
  291.     return (((Address >> 8) & 0xff) == 0xff);
  292.   else
  293.     return (((Address >> 8) & 0xffff) == 0xffff);
  294. }
  295.  
  296. static Boolean Is16(LongInt Address)
  297. {
  298.   return (CPU16) ? (True) : (((Address >= 0) && (Address <= 0x7fff)) || ((Address >= 0xff8000) && (Address <= 0xffffff)));
  299. }
  300.  
  301. static void DecideVAbsolute(LongInt Address, Word Mask)
  302. {
  303.   /* bei Automatik Operandengroesse festlegen */
  304.  
  305.   if (MomSize == eSymbolSizeUnknown)
  306.   {
  307.     if (Is8(Address))
  308.       MomSize = eSymbolSize8Bit;
  309.     else if (Is16(Address))
  310.       MomSize = eSymbolSize16Bit;
  311.     else
  312.       MomSize = eSymbolSize24Bit;
  313.   }
  314.  
  315.   /* wenn nicht vorhanden, eins rauf */
  316.  
  317.   if ((MomSize == eSymbolSize8Bit) && ((Mask & MModAbs8) == 0))
  318.     MomSize = eSymbolSize16Bit;
  319.   if ((MomSize == eSymbolSize16Bit) && ((Mask & MModAbs16) == 0))
  320.     MomSize = eSymbolSize24Bit;
  321.  
  322.   /* entsprechend Modus Bytes ablegen */
  323.  
  324.   switch (MomSize)
  325.   {
  326.     case eSymbolSize8Bit:
  327.       if (!Is8(Address)) WrError(ErrNum_AdrOverflow);
  328.       else
  329.       {
  330.         AdrCnt = 2;
  331.         AdrVals[0] = Address & 0xff;
  332.         AdrMode = ModAbs8;
  333.       }
  334.       break;
  335.     case eSymbolSize16Bit:
  336.       if (!Is16(Address)) WrError(ErrNum_AdrOverflow);
  337.       else
  338.       {
  339.         AdrCnt = 2;
  340.         AdrVals[0] = Address & 0xffff;
  341.         AdrMode = ModAbs16;
  342.       }
  343.       break;
  344.     case eSymbolSize24Bit:
  345.       AdrCnt = 4;
  346.       AdrVals[1] = Address & 0xffff;
  347.       AdrVals[0] = Lo(Address >> 16);
  348.       AdrMode = ModAbs24;
  349.       break;
  350.     default:
  351.       WrError(ErrNum_InternalError);
  352.   }
  353. }
  354.  
  355. static void DecideAbsolute(const tStrComp *pArg, Word Mask)
  356. {
  357.   LongInt Addr;
  358.   Boolean OK;
  359.  
  360.   Addr = EvalStrIntExpression(pArg, Int32, &OK);
  361.   if (OK)
  362.     DecideVAbsolute(Addr, Mask);
  363. }
  364.  
  365.  
  366. static void DecodeAdr(tStrComp *pArg, Word Mask)
  367. {
  368.   tSymbolSize HSize;
  369.   Byte HReg;
  370.   LongInt HLong;
  371.   Boolean OK;
  372.   char *p;
  373.   LongInt DispAcc;
  374.   int ArgLen;
  375.  
  376.   AdrMode = ModNone;
  377.   AdrCnt = 0;
  378.   MomSize = eSymbolSizeUnknown;
  379.  
  380.   /* immediate ? */
  381.  
  382.   if (*pArg->str.p_str == '#')
  383.   {
  384.     switch (OpSize)
  385.     {
  386.       case eSymbolSizeUnknown:
  387.         WrError(ErrNum_UndefOpSizes);
  388.         break;
  389.       case eSymbolSize8Bit:
  390.         HReg = EvalStrIntExpressionOffs(pArg, 1, Int8, &OK);
  391.         if (OK)
  392.         {
  393.           AdrCnt = 2;
  394.           AdrVals[0] = HReg;
  395.           AdrMode = ModImm;
  396.         }
  397.         break;
  398.       case eSymbolSize16Bit:
  399.         AdrVals[0] = EvalStrIntExpressionOffs(pArg, 1, Int16, &OK);
  400.         if (OK)
  401.         {
  402.           AdrCnt = 2;
  403.           AdrMode = ModImm;
  404.         }
  405.         break;
  406.       case eSymbolSize32Bit:
  407.         HLong = EvalStrIntExpressionOffs(pArg, 1, Int32, &OK);
  408.         if (OK)
  409.         {
  410.           AdrCnt = 4;
  411.           AdrVals[0] = HLong >> 16;
  412.           AdrVals[1] = HLong & 0xffff;
  413.           AdrMode = ModImm;
  414.         }
  415.         break;
  416.       default:
  417.         WrError(ErrNum_InvOpSize);
  418.     }
  419.     goto chk;
  420.   }
  421.  
  422.   /* Register ? */
  423.  
  424.   switch (DecodeReg(pArg, &HReg, (1 << eSymbolSize8Bit) | (1 << eSymbolSize16Bit) | (1 << eSymbolSize32Bit), &HSize, False))
  425.   {
  426.     case eIsReg:
  427.       AdrMode = ModReg;
  428.       AdrPart = HReg;
  429.       SetOpSize(HSize);
  430.       goto chk;
  431.     case eRegAbort:
  432.       return;
  433.     case eIsNoReg:
  434.       break;
  435.   }
  436.  
  437.   /* indirekt ? */
  438.  
  439.   if (*pArg->str.p_str == '@')
  440.   {
  441.     tStrComp Arg;
  442.  
  443.     StrCompRefRight(&Arg, pArg, 1);
  444.  
  445.     if (*Arg.str.p_str == '@')
  446.     {
  447.       AdrVals[0] = EvalStrIntExpressionOffs(&Arg, 1, UInt8, &OK) & 0xff;
  448.       if (OK)
  449.       {
  450.         AdrCnt = 1;
  451.         AdrMode = ModIIAbs;
  452.       }
  453.       goto chk;
  454.     }
  455.  
  456.     switch (DecodeBaseReg(&Arg, &AdrPart, False))
  457.     {
  458.       case 1:
  459.         goto chk;
  460.       case 2:
  461.         AdrMode = ModIReg;
  462.         goto chk;
  463.     }
  464.  
  465.     if (*Arg.str.p_str == '-')
  466.     {
  467.       tStrComp Reg;
  468.  
  469.       StrCompRefRight(&Reg, &Arg, 1);
  470.       switch (DecodeBaseReg(&Reg, &AdrPart, True))
  471.       {
  472.         case 1:
  473.           goto chk;
  474.         case 2:
  475.           AdrMode = ModPreDec;
  476.           goto chk;
  477.       }
  478.     }
  479.  
  480.     ArgLen = strlen(Arg.str.p_str);
  481.     if (*Arg.str.p_str && (Arg.str.p_str[ArgLen - 1] == '+'))
  482.     {
  483.       StrCompShorten(&Arg, 1);
  484.       switch (DecodeBaseReg(&Arg, &AdrPart, True))
  485.       {
  486.         case 1:
  487.           goto chk;
  488.         case 2:
  489.          AdrMode = ModPostInc;
  490.          goto chk;
  491.       }
  492.       Arg.str.p_str[ArgLen - 1] = '+'; Arg.Pos.Len++;
  493.     }
  494.  
  495.     if (IsIndirect(Arg.str.p_str))
  496.     {
  497.       tStrComp Part, Remainder;
  498.  
  499.       StrCompRefRight(&Part, &Arg, 1);
  500.       StrCompShorten(&Part, 1);
  501.  
  502.       AdrPart = 0xff;
  503.       DispAcc = 0;
  504.       do
  505.       {
  506.         p = QuotPos(Part.str.p_str, ',');
  507.         if (p)
  508.           StrCompSplitRef(&Part, &Remainder, &Part, p);
  509.         switch (DecodeBaseReg(&Part, &HReg, False))
  510.         {
  511.           case 2:
  512.             if (AdrPart != 0xff)
  513.             {
  514.               WrError(ErrNum_InvAddrMode);
  515.               goto chk;
  516.             }
  517.             else
  518.               AdrPart = HReg;
  519.             break;
  520.           case 1:
  521.             goto chk;
  522.           case 0:
  523.             CutSize(&Part);
  524.             DispAcc += EvalStrIntExpression(&Part, Int32, &OK);
  525.             if (!OK)
  526.             {
  527.               goto chk;
  528.             }
  529.             break;
  530.         }
  531.         if (p)
  532.           Part = Remainder;
  533.       }
  534.       while (p);
  535.  
  536.       if (AdrPart == 0xff)
  537.         DecideVAbsolute(DispAcc, Mask);
  538.       else
  539.       {
  540.         if ((CPU16) && ((DispAcc & 0xffff8000) == 0x8000))
  541.           DispAcc += 0xffff0000;
  542.         if (MomSize == eSymbolSizeUnknown)
  543.           MomSize = ((DispAcc >= -32768) && (DispAcc <= 32767)) ? eSymbolSize16Bit : eSymbolSize24Bit;
  544.         switch (MomSize)
  545.         {
  546.           case eSymbolSize8Bit:
  547.             WrError(ErrNum_InvOpSize);
  548.             break;
  549.           case eSymbolSize16Bit:
  550.             if (ChkRange(DispAcc, -32768, 32767))
  551.             {
  552.               AdrCnt = 2;
  553.               AdrVals[0] = DispAcc & 0xffff;
  554.               AdrMode = ModInd16;
  555.             }
  556.             break;
  557.           case eSymbolSize24Bit:
  558.             AdrVals[1] = DispAcc & 0xffff;
  559.             AdrVals[0] = Lo(DispAcc >> 16);
  560.             AdrCnt = 4;
  561.             AdrMode = ModInd24;
  562.             break;
  563.           default:
  564.             WrError(ErrNum_InternalError);
  565.         }
  566.       }
  567.     }
  568.     else
  569.     {
  570.       CutSize(&Arg);
  571.       DecideAbsolute(&Arg, Mask);
  572.     }
  573.     goto chk;
  574.   }
  575.  
  576.   CutSize(pArg);
  577.   DecideAbsolute(pArg, Mask);
  578.  
  579. chk:
  580.   if (((AdrMode == ModReg) && (OpSize == eSymbolSize32Bit))
  581.    || ((AdrMode == ModReg) && (OpSize == eSymbolSize16Bit) && (AdrPart > 7))
  582.    || (AdrMode == ModAbs24)
  583.    || (AdrMode == ModInd24))
  584.   {
  585.     if (!ChkMinCPUExt(CPU6413309, ErrNum_AddrModeNotSupported))
  586.     {
  587.       AdrMode = ModNone;
  588.       AdrCnt = 0;
  589.     }
  590.   }
  591.   if ((AdrMode != ModNone) && ((Mask & (1 << AdrMode)) == 0))
  592.   {
  593.     WrError(ErrNum_InvAddrMode);
  594.     AdrMode = ModNone;
  595.     AdrCnt = 0;
  596.   }
  597. }
  598.  
  599. static LongInt ImmVal(void)
  600. {
  601.   switch (OpSize)
  602.   {
  603.     case eSymbolSize8Bit:
  604.       return Lo(AdrVals[0]);
  605.     case eSymbolSize16Bit:
  606.       return AdrVals[0];
  607.     case eSymbolSize32Bit:
  608.       return (((LongInt)AdrVals[0]) << 16) + AdrVals[1];
  609.     default:
  610.       WrError(ErrNum_InternalError);
  611.       return 0;
  612.   }
  613. }
  614.  
  615. /*--------------------------------------------------------------------------*/
  616. /* Bit Symbol Handling */
  617.  
  618. /*
  619.  * Compact representation of bits in symbol table:
  620.  * Bits 10...3: Absolute address (8-bit value for range $FFxx or $FFFFxx)
  621.  * Bits 0..2: Bit position
  622.  */
  623.  
  624. /*!------------------------------------------------------------------------
  625.  * \fn     EvalBitPosition(const tStrComp *pArg, Boolean *pOK)
  626.  * \brief  evaluate bit position
  627.  * \param  bit position argument (with or without #)
  628.  * \param  pOK parsing OK?
  629.  * \return numeric bit position
  630.  * ------------------------------------------------------------------------ */
  631.  
  632. static LongWord EvalBitPosition(const tStrComp *pArg, Boolean *pOK)
  633. {
  634.   return EvalStrIntExpressionOffs(pArg, !!(*pArg->str.p_str == '#'), UInt3, pOK);
  635. }
  636.  
  637. /*!------------------------------------------------------------------------
  638.  * \fn     AssembleBitSymbol(Byte BitPos, LongWord Address)
  639.  * \brief  build the compact internal representation of a bit symbol
  640.  * \param  BitPos bit position in byte
  641.  * \param  Address register address
  642.  * \return compact representation
  643.  * ------------------------------------------------------------------------ */
  644.  
  645. static LongWord AssembleBitSymbol(Byte BitPos, Word Address)
  646. {
  647.   return
  648.     (Address << 3)
  649.   | (BitPos << 0);
  650. }
  651.  
  652. /*!------------------------------------------------------------------------
  653.  * \fn     DecodeBitArg2(LongWord *pResult, const tStrComp *pBitArg, tStrComp *pRegArg)
  654.  * \brief  encode a bit symbol, address & bit position separated
  655.  * \param  pResult resulting encoded bit
  656.  * \param  pRegArg register argument
  657.  * \param  pBitArg bit argument
  658.  * \return True if success
  659.  * ------------------------------------------------------------------------ */
  660.  
  661. static Boolean DecodeBitArg2(LongWord *pResult, const tStrComp *pBitArg, tStrComp *pRegArg)
  662. {
  663.   Boolean OK;
  664.   LongWord BitPos;
  665.  
  666.   BitPos = EvalBitPosition(pBitArg, &OK);
  667.   if (!OK)
  668.     return False;
  669.  
  670.   DecideAbsolute(pRegArg, MModAbs8);
  671.   if (AdrMode != ModAbs8)
  672.     return False;
  673.  
  674.   *pResult = AssembleBitSymbol(BitPos, AdrVals[0]);
  675.   return True;
  676. }
  677.  
  678. /*!------------------------------------------------------------------------
  679.  * \fn     DecodeBitArg(LongWord *pResult, int Start, int Stop)
  680.  * \brief  encode a bit symbol from instruction argument(s)
  681.  * \param  pResult resulting encoded bit
  682.  * \param  Start first argument
  683.  * \param  Stop last argument
  684.  * \return True if success
  685.  * ------------------------------------------------------------------------ */
  686.  
  687. static Boolean DecodeBitArg(LongWord *pResult, int Start, int Stop)
  688. {
  689.   *pResult = 0;
  690.  
  691.   /* Just one argument -> parse as bit argument */
  692.  
  693.   if (Start == Stop)
  694.   {
  695.     tEvalResult EvalResult;
  696.  
  697.     *pResult = EvalStrIntExpressionWithResult(&ArgStr[Start], UInt32, &EvalResult);
  698.     if (EvalResult.OK)
  699.       ChkSpace(SegBData, EvalResult.AddrSpaceMask);
  700.     return EvalResult.OK;
  701.   }
  702.  
  703.   /* register & bit position are given as separate arguments */
  704.  
  705.   else if (Stop == Start + 1)
  706.     return DecodeBitArg2(pResult, &ArgStr[Start], &ArgStr[Stop]);
  707.  
  708.   /* other # of arguments not allowed */
  709.  
  710.   else
  711.   {
  712.     WrError(ErrNum_WrongArgCnt);
  713.     return False;
  714.   }
  715. }
  716.  
  717. /*!------------------------------------------------------------------------
  718.  * \fn     DissectBitSymbol(LongWord BitSymbol, Word *pAddress, Byte *pBitPos)
  719.  * \brief  transform compact representation of bit (field) symbol into components
  720.  * \param  BitSymbol compact storage
  721.  * \param  pAddress register address
  722.  * \param  pBitPos bit position
  723.  * \return constant True
  724.  * ------------------------------------------------------------------------ */
  725.  
  726. static Boolean DissectBitSymbol(LongWord BitSymbol, LongWord *pAddress, Byte *pBitPos)
  727. {
  728.   *pAddress = (BitSymbol >> 3) & 0xfful;
  729.   *pBitPos = BitSymbol & 7;
  730.   return True;
  731. }
  732.  
  733. /*!------------------------------------------------------------------------
  734.  * \fn     DissectBit_H8_3(char *pDest, size_t DestSize, LargeWord Inp)
  735.  * \brief  dissect compact storage of bit (field) into readable form for listing
  736.  * \param  pDest destination for ASCII representation
  737.  * \param  DestSize destination buffer size
  738.  * \param  Inp compact storage
  739.  * ------------------------------------------------------------------------ */
  740.  
  741. static void DissectBit_H8_3(char *pDest, size_t DestSize, LargeWord Inp)
  742. {
  743.   Byte BitPos;
  744.   LongWord Address;
  745.  
  746.   DissectBitSymbol(Inp, &Address, &BitPos);
  747.  
  748.   as_snprintf(pDest, DestSize, "#%u,$%s%x", BitPos,
  749.               (HexStartCharacter == 'A') ? (CPU16 ? "FF" : "FFFF") : (CPU16 ? "ff" : "ffff"),
  750.               (unsigned)Address);
  751. }
  752.  
  753. /*!------------------------------------------------------------------------
  754.  * \fn     ExpandBit_H8_3(const tStrComp *pVarName, const struct sStructElem *pStructElem, LargeWord Base)
  755.  * \brief  expands bit definition when a structure is instantiated
  756.  * \param  pVarName desired symbol name
  757.  * \param  pStructElem element definition
  758.  * \param  Base base address of instantiated structure
  759.  * ------------------------------------------------------------------------ */
  760.  
  761. static void ExpandBit_H8_3(const tStrComp *pVarName, const struct sStructElem *pStructElem, LargeWord Base)
  762. {
  763.   LongWord Address = Base + pStructElem->Offset;
  764.  
  765.   if (pInnermostNamedStruct)
  766.   {
  767.     PStructElem pElem = CloneStructElem(pVarName, pStructElem);
  768.  
  769.     if (!pElem)
  770.       return;
  771.     pElem->Offset = Address;
  772.     AddStructElem(pInnermostNamedStruct->StructRec, pElem);
  773.   }
  774.   else
  775.   {
  776.     if (!ChkRange(Address, SegLimits[SegCode] - 0xff, SegLimits[SegCode])
  777.      || !ChkRange(pStructElem->BitPos, 0, 7))
  778.       return;
  779.  
  780.     PushLocHandle(-1);
  781.     EnterIntSymbol(pVarName, AssembleBitSymbol(pStructElem->BitPos, Address), SegBData, False);
  782.     PopLocHandle();
  783.     /* TODO: MakeUseList? */
  784.   }
  785. }
  786.  
  787. /*-------------------------------------------------------------------------*/
  788. /* Code Generators */
  789.  
  790. static void DecodeFixed(Word Code)
  791. {
  792.   if (!ChkArgCnt(0, 0));
  793.   else if (*AttrPart.str.p_str) WrError(ErrNum_UseLessAttr);
  794.   else
  795.   {
  796.     CodeLen = 2;
  797.     WAsmCode[0] = Code;
  798.   }
  799. }
  800.  
  801. static void DecodeEEPMOV(Word Code)
  802. {
  803.   UNUSED(Code);
  804.  
  805.   if (OpSize == eSymbolSizeUnknown)
  806.     OpSize = CPU16 ? eSymbolSize8Bit : eSymbolSize16Bit;
  807.   if (OpSize > eSymbolSize16Bit) WrError(ErrNum_InvOpSize);
  808.   else if (!ChkArgCnt(0, 0));
  809.   else if ((OpSize == eSymbolSize16Bit) && !ChkCPU32(ErrNum_AddrModeNotSupported));
  810.   else
  811.   {
  812.     CodeLen = 4;
  813.     WAsmCode[0] = (OpSize == eSymbolSize8Bit) ? 0x7b5c : 0x7bd4;
  814.     WAsmCode[1] = 0x598f;
  815.   }
  816. }
  817.  
  818. static void DecodeMOV(Word Code)
  819. {
  820.   Byte HReg;
  821.  
  822.   UNUSED(Code);
  823.  
  824.   if (ChkArgCnt(2, 2))
  825.   {
  826.     DecodeAdr(&ArgStr[2], MModReg | MModIReg | MModPreDec | MModInd | MModAbs);
  827.     switch (AdrMode)
  828.     {
  829.       case ModReg:
  830.         HReg = AdrPart;
  831.         DecodeAdr(&ArgStr[1], MModReg | MModIReg | MModPostInc | MModInd | MModImm | ((OpSize == eSymbolSize8Bit) ? MModAbs : (MModAbs16 | MModAbs24)));
  832.         switch (AdrMode)
  833.         {
  834.           case ModReg:
  835.           {
  836.             int z = (OpSize == eSymbolSize32Bit) ? 3 : OpSize;
  837.  
  838.             CodeLen = 2;
  839.             WAsmCode[0] = 0x0c00 + (z << 8) + (AdrPart << 4) + HReg;
  840.             if (OpSize == eSymbolSize32Bit)
  841.               WAsmCode[0] += 0x80;
  842.             break;
  843.           }
  844.           case ModIReg:
  845.             switch (OpSize)
  846.             {
  847.               case eSymbolSize8Bit:
  848.                 CodeLen = 2;
  849.                 WAsmCode[0] = 0x6800 + (AdrPart << 4) + HReg;
  850.                 break;
  851.               case eSymbolSize16Bit:
  852.                 CodeLen = 2;
  853.                 WAsmCode[0] = 0x6900 + (AdrPart << 4) + HReg;
  854.                 break;
  855.               case eSymbolSize32Bit:
  856.                 CodeLen = 4;
  857.                 WAsmCode[0] = 0x0100;
  858.                 WAsmCode[1] = 0x6900 + (AdrPart << 4) + HReg;
  859.                 break;
  860.               default:
  861.                 break;
  862.             }
  863.             break;
  864.           case ModPostInc:
  865.             switch (OpSize)
  866.             {
  867.               case eSymbolSize8Bit:
  868.                 CodeLen = 2;
  869.                 WAsmCode[0] = 0x6c00 + (AdrPart << 4) + HReg;
  870.                 break;
  871.               case eSymbolSize16Bit:
  872.                 CodeLen = 2;
  873.                 WAsmCode[0] = 0x6d00 + (AdrPart << 4) + HReg;
  874.                 break;
  875.               case eSymbolSize32Bit:
  876.                 CodeLen = 4;
  877.                 WAsmCode[0] = 0x0100;
  878.                 WAsmCode[1] = 0x6d00 + (AdrPart << 4) + HReg;
  879.                 break;
  880.               default:
  881.                 break;
  882.             }
  883.             break;
  884.           case ModInd16:
  885.             switch (OpSize)
  886.             {
  887.               case eSymbolSize8Bit:
  888.                 CodeLen = 4;
  889.                 WAsmCode[0] = 0x6e00 + (AdrPart << 4) + HReg;
  890.                 WAsmCode[1] = AdrVals[0];
  891.                 break;
  892.               case eSymbolSize16Bit:
  893.                 CodeLen = 4;
  894.                 WAsmCode[0] = 0x6f00 + (AdrPart << 4) + HReg;
  895.                 WAsmCode[1] = AdrVals[0];
  896.                 break;
  897.               case eSymbolSize32Bit:
  898.                 CodeLen = 6;
  899.                 WAsmCode[0] = 0x0100;
  900.                 WAsmCode[1] = 0x6f00 + (AdrPart << 4) + HReg;
  901.                 WAsmCode[2] = AdrVals[0];
  902.                 break;
  903.               default:
  904.                 break;
  905.             }
  906.             break;
  907.           case ModInd24:
  908.             switch (OpSize)
  909.             {
  910.               case eSymbolSize8Bit:
  911.                 CodeLen = 8;
  912.                 WAsmCode[0] = 0x7800 + (AdrPart << 4);
  913.                 WAsmCode[1] = 0x6a20 + HReg;
  914.                 memcpy(WAsmCode + 2, AdrVals, AdrCnt);
  915.                 break;
  916.               case eSymbolSize16Bit:
  917.                 CodeLen = 8;
  918.                 WAsmCode[0] = 0x7800 + (AdrPart << 4);
  919.                 WAsmCode[1] = 0x6b20 + HReg;
  920.                 memcpy(WAsmCode + 2, AdrVals, AdrCnt);
  921.                 break;
  922.               case eSymbolSize32Bit:
  923.                 CodeLen = 10;
  924.                 WAsmCode[0] = 0x0100;
  925.                 WAsmCode[1] = 0x7800 + (AdrPart << 4);
  926.                 WAsmCode[2] = 0x6b20 + HReg;
  927.                 memcpy(WAsmCode + 3, AdrVals, AdrCnt);
  928.                 break;
  929.               default:
  930.                 break;
  931.             }
  932.             break;
  933.           case ModAbs8:
  934.             CodeLen = 2;
  935.             WAsmCode[0] = 0x2000 + (((Word)HReg) << 8) + Lo(AdrVals[0]);
  936.             break;
  937.           case ModAbs16:
  938.             switch (OpSize)
  939.             {
  940.               case eSymbolSize8Bit:
  941.                 CodeLen = 4;
  942.                 WAsmCode[0] = 0x6a00 + HReg;
  943.                 WAsmCode[1] = AdrVals[0];
  944.                 break;
  945.               case eSymbolSize16Bit:
  946.                 CodeLen = 4;
  947.                 WAsmCode[0] = 0x6b00 + HReg;
  948.                 WAsmCode[1] = AdrVals[0];
  949.                 break;
  950.               case eSymbolSize32Bit:
  951.                 CodeLen = 6;
  952.                 WAsmCode[0] = 0x0100;
  953.                 WAsmCode[1] = 0x6b00 + HReg;
  954.                 WAsmCode[2] = AdrVals[0];
  955.                 break;
  956.               default:
  957.                 break;
  958.             }
  959.             break;
  960.           case ModAbs24:
  961.             switch (OpSize)
  962.             {
  963.               case eSymbolSize8Bit:
  964.                 CodeLen = 6;
  965.                 WAsmCode[0] = 0x6a20 + HReg;
  966.                 memcpy(WAsmCode + 1, AdrVals, AdrCnt);
  967.                 break;
  968.               case eSymbolSize16Bit:
  969.                 CodeLen = 6;
  970.                 WAsmCode[0] = 0x6b20 + HReg;
  971.                 memcpy(WAsmCode + 1, AdrVals, AdrCnt);
  972.                 break;
  973.               case eSymbolSize32Bit:
  974.                 CodeLen = 8;
  975.                 WAsmCode[0] = 0x0100;
  976.                 WAsmCode[1] = 0x6b20 + HReg;
  977.                 memcpy(WAsmCode + 2, AdrVals, AdrCnt);
  978.                 break;
  979.               default:
  980.                 break;
  981.             }
  982.             break;
  983.           case ModImm:
  984.             switch (OpSize)
  985.             {
  986.               case eSymbolSize8Bit:
  987.                 CodeLen = 2;
  988.                 WAsmCode[0] = 0xf000 + (((Word)HReg) << 8) + Lo(AdrVals[0]);
  989.                 break;
  990.               case eSymbolSize16Bit:
  991.                 CodeLen = 4;
  992.                 WAsmCode[0] = 0x7900 + HReg;
  993.                 WAsmCode[1] = AdrVals[0];
  994.                 break;
  995.               case eSymbolSize32Bit:
  996.                 CodeLen = 6;
  997.                 WAsmCode[0] = 0x7a00 + HReg;
  998.                 memcpy(WAsmCode + 1, AdrVals, AdrCnt);
  999.                 break;
  1000.               default:
  1001.                 break;
  1002.             }
  1003.             break;
  1004.         }
  1005.         break;
  1006.       case ModIReg:
  1007.         HReg = AdrPart;
  1008.         DecodeAdr(&ArgStr[1], MModReg);
  1009.         if (AdrMode != ModNone)
  1010.         {
  1011.           switch (OpSize)
  1012.           {
  1013.             case eSymbolSize8Bit:
  1014.               CodeLen = 2;
  1015.               WAsmCode[0] = 0x6880 + (HReg << 4) + AdrPart;
  1016.               break;
  1017.             case eSymbolSize16Bit:
  1018.               CodeLen = 2;
  1019.               WAsmCode[0] = 0x6980 + (HReg << 4) + AdrPart;
  1020.               break;
  1021.             case eSymbolSize32Bit:
  1022.               CodeLen = 4;
  1023.               WAsmCode[0] = 0x0100;
  1024.               WAsmCode[1] = 0x6980 + (HReg << 4) + AdrPart;
  1025.               break;
  1026.             default:
  1027.               break;
  1028.           }
  1029.         }
  1030.         break;
  1031.       case ModPreDec:
  1032.         HReg = AdrPart;
  1033.         DecodeAdr(&ArgStr[1], MModReg);
  1034.         if (AdrMode != ModNone)
  1035.         {
  1036.           switch (OpSize)
  1037.           {
  1038.             case eSymbolSize8Bit:
  1039.               CodeLen=2; WAsmCode[0]=0x6c80+(HReg << 4)+AdrPart;
  1040.               break;
  1041.             case eSymbolSize16Bit:
  1042.               CodeLen=2; WAsmCode[0]=0x6d80+(HReg << 4)+AdrPart;
  1043.               break;
  1044.             case eSymbolSize32Bit:
  1045.               CodeLen=4; WAsmCode[0]=0x0100;
  1046.               WAsmCode[1]=0x6d80+(HReg << 4)+AdrPart;
  1047.               break;
  1048.             default:
  1049.               break;
  1050.           }
  1051.         }
  1052.         break;
  1053.       case ModInd16:
  1054.         HReg = AdrPart;
  1055.         WAsmCode[1] = AdrVals[0];
  1056.         DecodeAdr(&ArgStr[1], MModReg);
  1057.         if (AdrMode!=ModNone)
  1058.         {
  1059.           switch (OpSize)
  1060.           {
  1061.             case eSymbolSize8Bit:
  1062.               CodeLen = 4;
  1063.               WAsmCode[0] = 0x6e80 + (HReg << 4) + AdrPart;
  1064.               break;
  1065.             case eSymbolSize16Bit:
  1066.               CodeLen = 4;
  1067.               WAsmCode[0] = 0x6f80 + (HReg << 4) + AdrPart;
  1068.               break;
  1069.             case eSymbolSize32Bit:
  1070.               CodeLen = 6;
  1071.               WAsmCode[0] = 0x0100;
  1072.               WAsmCode[2] = WAsmCode[1];
  1073.               WAsmCode[1] = 0x6f80 + (HReg << 4) + AdrPart;
  1074.               break;
  1075.             default:
  1076.               break;
  1077.           }
  1078.         }
  1079.         break;
  1080.       case ModInd24:
  1081.         HReg = AdrPart;
  1082.         memcpy(WAsmCode + 2, AdrVals, 4);
  1083.         DecodeAdr(&ArgStr[1], MModReg);
  1084.         if (AdrMode != ModNone)
  1085.         {
  1086.           switch (OpSize)
  1087.           {
  1088.             case eSymbolSize8Bit:
  1089.               CodeLen = 8;
  1090.               WAsmCode[0] = 0x7800 + (HReg << 4);
  1091.               WAsmCode[1] = 0x6aa0 + AdrPart;
  1092.               break;
  1093.             case eSymbolSize16Bit:
  1094.               CodeLen = 8;
  1095.               WAsmCode[0] = 0x7800 + (HReg << 4);
  1096.               WAsmCode[1] = 0x6ba0 + AdrPart;
  1097.               break;
  1098.             case eSymbolSize32Bit:
  1099.               CodeLen = 10;
  1100.               WAsmCode[0] = 0x0100;
  1101.               WAsmCode[4] = WAsmCode[3];
  1102.               WAsmCode[3] = WAsmCode[2];
  1103.               WAsmCode[1] = 0x7800 + (HReg << 4);
  1104.               WAsmCode[2] = 0x6ba0 + AdrPart;
  1105.               break;
  1106.             default:
  1107.               break;
  1108.           }
  1109.         }
  1110.         break;
  1111.       case ModAbs8:
  1112.         HReg = Lo(AdrVals[0]);
  1113.         DecodeAdr(&ArgStr[1], MModReg);
  1114.         if (AdrMode != ModNone)
  1115.         {
  1116.           switch (OpSize)
  1117.           {
  1118.             case eSymbolSize8Bit:
  1119.               CodeLen = 2;
  1120.               WAsmCode[0] = 0x3000 + (((Word)AdrPart) << 8) + HReg;
  1121.               break;
  1122.             case eSymbolSize16Bit:
  1123.               CodeLen = 4;
  1124.               WAsmCode[0] = 0x6b80 + AdrPart;
  1125.               WAsmCode[1] = 0xff00 + HReg;
  1126.               break;
  1127.             case eSymbolSize32Bit:
  1128.               CodeLen = 6;
  1129.               WAsmCode[0] = 0x0100;
  1130.               WAsmCode[1] = 0x6b80 + AdrPart;
  1131.               WAsmCode[2] = 0xff00 + HReg;
  1132.               break;
  1133.             default:
  1134.               break;
  1135.           }
  1136.         }
  1137.         break;
  1138.       case ModAbs16:
  1139.         WAsmCode[1] = AdrVals[0];
  1140.         DecodeAdr(&ArgStr[1], MModReg);
  1141.         if (AdrMode != ModNone)
  1142.         {
  1143.           switch (OpSize)
  1144.           {
  1145.             case eSymbolSize8Bit:
  1146.               CodeLen = 4;
  1147.               WAsmCode[0] = 0x6a80 + AdrPart;
  1148.               break;
  1149.             case eSymbolSize16Bit:
  1150.               CodeLen = 4;
  1151.               WAsmCode[0] = 0x6b80 + AdrPart;
  1152.               break;
  1153.             case eSymbolSize32Bit:
  1154.               CodeLen = 6;
  1155.               WAsmCode[0] = 0x0100;
  1156.               WAsmCode[2] = WAsmCode[1];
  1157.               WAsmCode[1] = 0x6b80 + AdrPart;
  1158.               break;
  1159.             default:
  1160.               break;
  1161.           }
  1162.         }
  1163.         break;
  1164.       case ModAbs24:
  1165.         memcpy(WAsmCode + 1, AdrVals, 4);
  1166.         DecodeAdr(&ArgStr[1], MModReg);
  1167.         if (AdrMode != ModNone)
  1168.         {
  1169.           switch (OpSize)
  1170.           {
  1171.             case eSymbolSize8Bit:
  1172.               CodeLen = 6;
  1173.               WAsmCode[0] = 0x6aa0 + AdrPart;
  1174.               break;
  1175.             case eSymbolSize16Bit:
  1176.               CodeLen = 6;
  1177.               WAsmCode[0] = 0x6ba0 + AdrPart;
  1178.               break;
  1179.             case eSymbolSize32Bit:
  1180.               CodeLen = 8;
  1181.               WAsmCode[0] = 0x0100;
  1182.               WAsmCode[3] = WAsmCode[2];
  1183.               WAsmCode[2] = WAsmCode[1];
  1184.               WAsmCode[1] = 0x6ba0 + AdrPart;
  1185.               break;
  1186.             default:
  1187.               break;
  1188.           }
  1189.         }
  1190.         break;
  1191.     }
  1192.   }
  1193. }
  1194.  
  1195. static void DecodeMOVTPE_MOVFPE(Word CodeTPE)
  1196. {
  1197.   if (ChkArgCnt(2, 2)
  1198.    && ChkMinCPU(CPU6413308))
  1199.   {
  1200.     tStrComp *pRegArg = CodeTPE ? &ArgStr[1] : &ArgStr[2],
  1201.              *pMemArg = CodeTPE ? &ArgStr[2] : &ArgStr[1];
  1202.  
  1203.     DecodeAdr(pRegArg, MModReg);
  1204.     if (AdrMode != ModNone)
  1205.     {
  1206.       if (OpSize != eSymbolSize8Bit) WrError(ErrNum_InvOpSize);
  1207.       else
  1208.       {
  1209.         Byte HReg = AdrPart;
  1210.         DecodeAdr(pMemArg, MModAbs16);
  1211.         if (AdrMode != ModNone)
  1212.         {
  1213.           CodeLen = 4;
  1214.           WAsmCode[0] = 0x6a40 + CodeTPE + HReg;
  1215.           WAsmCode[1] = AdrVals[0];
  1216.         }
  1217.       }
  1218.     }
  1219.   }
  1220. }
  1221.  
  1222. static void DecodePUSH_POP(Word Code)
  1223. {
  1224.   if (ChkArgCnt(1, 1))
  1225.   {
  1226.     DecodeAdr(&ArgStr[1], MModReg);
  1227.     if (AdrMode != ModNone)
  1228.     {
  1229.       if (OpSize == eSymbolSize8Bit) WrError(ErrNum_InvOpSize);
  1230.       else if ((OpSize != eSymbolSize32Bit) || ChkCPU32(ErrNum_AddrModeNotSupported))
  1231.       {
  1232.         if (OpSize == eSymbolSize32Bit)
  1233.           WAsmCode[0] = 0x0100;
  1234.         CodeLen = 2 * OpSize;
  1235.         WAsmCode[(CodeLen - 2) >> 1] = Code + AdrPart;
  1236.       }
  1237.     }
  1238.   }
  1239. }
  1240.  
  1241. static void DecodeLDC_STC(Word CodeIsSTC)
  1242. {
  1243.   if (ChkArgCnt(2, 2))
  1244.   {
  1245.     tStrComp *pRegArg = CodeIsSTC ? &ArgStr[1] : &ArgStr[2],
  1246.              *pMemArg = CodeIsSTC ? &ArgStr[2] : &ArgStr[1];
  1247.  
  1248.     if (as_strcasecmp(pRegArg->str.p_str, "CCR")) WrError(ErrNum_InvAddrMode);
  1249.     else
  1250.     {
  1251.        SetOpSize(eSymbolSize8Bit);
  1252.        DecodeAdr(pMemArg, MModReg | MModIReg | MModInd | MModAbs16 | MModAbs24 | (CodeIsSTC ? MModPreDec : (MModImm | MModPostInc)));
  1253.        switch (AdrMode)
  1254.        {
  1255.          case ModReg:
  1256.            CodeLen = 2;
  1257.            WAsmCode[0] = 0x0300 + AdrPart - (CodeIsSTC << 1);
  1258.            break;
  1259.          case ModIReg:
  1260.            CodeLen = 4;
  1261.            WAsmCode[0] = 0x0140;
  1262.            WAsmCode[1] = 0x6900 + CodeIsSTC + (AdrPart << 4);
  1263.            break;
  1264.          case ModPostInc:
  1265.          case ModPreDec:
  1266.            CodeLen = 4;
  1267.            WAsmCode[0] = 0x0140;
  1268.            WAsmCode[1] = 0x6d00 + CodeIsSTC + (AdrPart << 4);
  1269.            break;
  1270.          case ModInd16:
  1271.            CodeLen = 6;
  1272.            WAsmCode[0] = 0x0140;
  1273.            WAsmCode[2] = AdrVals[0];
  1274.            WAsmCode[1] = 0x6f00 + CodeIsSTC + (AdrPart << 4);
  1275.            break;
  1276.          case ModInd24:
  1277.            CodeLen = 10;
  1278.            WAsmCode[0] = 0x0140;
  1279.            WAsmCode[1] = 0x7800 + (AdrPart << 4);
  1280.            WAsmCode[2] = 0x6b20 + CodeIsSTC;
  1281.            memcpy(WAsmCode + 3, AdrVals, AdrCnt);
  1282.            break;
  1283.          case ModAbs16:
  1284.            CodeLen = 6;
  1285.            WAsmCode[0] = 0x0140;
  1286.            WAsmCode[2] = AdrVals[0];
  1287.            WAsmCode[1] = 0x6b00 + CodeIsSTC;
  1288.            break;
  1289.          case ModAbs24:
  1290.            CodeLen = 8;
  1291.            WAsmCode[0] = 0x0140;
  1292.            WAsmCode[1] = 0x6b20 + CodeIsSTC;
  1293.            memcpy(WAsmCode + 2, AdrVals, AdrCnt);
  1294.            break;
  1295.          case ModImm:
  1296.            CodeLen = 2;
  1297.            WAsmCode[0] = 0x0700 + Lo(AdrVals[0]);
  1298.            break;
  1299.        }
  1300.     }
  1301.   }
  1302. }
  1303.  
  1304. static void DecodeADD_SUB(Word IsSUB)
  1305. {
  1306.   if (ChkArgCnt(2, 2))
  1307.   {
  1308.     DecodeAdr(&ArgStr[2], MModReg);
  1309.     if (AdrMode != ModNone)
  1310.     {
  1311.       Byte HReg = AdrPart;
  1312.       DecodeAdr(&ArgStr[1], MModReg | MModImm);
  1313.       if (AdrMode != ModNone)
  1314.       {
  1315.         if (((OpSize > eSymbolSize16Bit) || ((OpSize == eSymbolSize16Bit) && (AdrMode == ModImm))) && !ChkCPU32(ErrNum_AddrModeNotSupported));
  1316.         else
  1317.         {
  1318.           switch (AdrMode)
  1319.           {
  1320.             case ModImm:
  1321.               switch (OpSize)
  1322.               {
  1323.                 case eSymbolSize8Bit:
  1324.                   if (IsSUB) WrError(ErrNum_InvAddrMode);
  1325.                   else
  1326.                   {
  1327.                     CodeLen = 2;
  1328.                     WAsmCode[0] = 0x8000 + (((Word)HReg) << 8) + Lo(AdrVals[0]);
  1329.                   }
  1330.                   break;
  1331.                 case eSymbolSize16Bit:
  1332.                   CodeLen = 4;
  1333.                   WAsmCode[1] = AdrVals[0];
  1334.                   WAsmCode[0] = 0x7910 + (IsSUB << 5) + HReg;
  1335.                   break;
  1336.                 case eSymbolSize32Bit:
  1337.                   CodeLen = 6;
  1338.                   memcpy(WAsmCode + 1, AdrVals, 4);
  1339.                   WAsmCode[0] = 0x7a10 + (IsSUB << 5) + HReg;
  1340.                   break;
  1341.                 default:
  1342.                   break;
  1343.               }
  1344.               break;
  1345.             case ModReg:
  1346.               switch (OpSize)
  1347.               {
  1348.                 case eSymbolSize8Bit:
  1349.                   CodeLen = 2;
  1350.                   WAsmCode[0] = 0x0800 + (IsSUB << 12) + (AdrPart << 4) + HReg;
  1351.                   break;
  1352.                 case eSymbolSize16Bit:
  1353.                   CodeLen = 2;
  1354.                   WAsmCode[0] = 0x0900 + (IsSUB << 12) + (AdrPart << 4) + HReg;
  1355.                   break;
  1356.                 case eSymbolSize32Bit:
  1357.                   CodeLen = 2;
  1358.                   WAsmCode[0] = 0x0a00 + (IsSUB << 12) + 0x80 + (AdrPart << 4) + HReg;
  1359.                   break;
  1360.                 default:
  1361.                   break;
  1362.               }
  1363.               break;
  1364.           }
  1365.         }
  1366.       }
  1367.     }
  1368.   }
  1369. }
  1370.  
  1371. static void DecodeCMP(Word Code)
  1372. {
  1373.   UNUSED(Code);
  1374.  
  1375.   if (ChkArgCnt(2, 2))
  1376.   {
  1377.     DecodeAdr(&ArgStr[2], MModReg);
  1378.     if (AdrMode != ModNone)
  1379.     {
  1380.       Byte HReg = AdrPart;
  1381.       DecodeAdr(&ArgStr[1], MModReg | MModImm);
  1382.       if (AdrMode != ModNone)
  1383.       {
  1384.         if (((OpSize > eSymbolSize16Bit) || ((OpSize == eSymbolSize16Bit) && (AdrMode == ModImm))) && !ChkCPU32(ErrNum_AddrModeNotSupported));
  1385.         else
  1386.         {
  1387.           switch (AdrMode)
  1388.           {
  1389.             case ModImm:
  1390.               switch (OpSize)
  1391.               {
  1392.                 case eSymbolSize8Bit:
  1393.                   CodeLen = 2;
  1394.                   WAsmCode[0] = 0xa000 + (((Word)HReg) << 8) + Lo(AdrVals[0]);
  1395.                   break;
  1396.                 case eSymbolSize16Bit:
  1397.                   CodeLen = 4;
  1398.                   WAsmCode[1] = AdrVals[0];
  1399.                   WAsmCode[0] = 0x7920 + HReg;
  1400.                   break;
  1401.                 case eSymbolSize32Bit:
  1402.                   CodeLen = 6;
  1403.                   memcpy(WAsmCode + 1, AdrVals, 4);
  1404.                   WAsmCode[0] = 0x7a20 + HReg;
  1405.                 default:
  1406.                   break;
  1407.               }
  1408.               break;
  1409.             case ModReg:
  1410.               switch (OpSize)
  1411.               {
  1412.                 case eSymbolSize8Bit:
  1413.                   CodeLen = 2;
  1414.                   WAsmCode[0] = 0x1c00 + (AdrPart << 4) + HReg;
  1415.                   break;
  1416.                 case eSymbolSize16Bit:
  1417.                   CodeLen = 2;
  1418.                   WAsmCode[0] = 0x1d00 + (AdrPart << 4) + HReg;
  1419.                   break;
  1420.                 case eSymbolSize32Bit:
  1421.                   CodeLen = 2;
  1422.                   WAsmCode[0] = 0x1f80 + (AdrPart << 4) + HReg;
  1423.                   break;
  1424.                 default:
  1425.                   break;
  1426.               }
  1427.               break;
  1428.           }
  1429.         }
  1430.       }
  1431.     }
  1432.   }
  1433. }
  1434.  
  1435. static void DecodeLogic(Word Code)
  1436. {
  1437.   if (ChkArgCnt(2, 2))
  1438.   {
  1439.     DecodeAdr(&ArgStr[2], MModReg);
  1440.     if (AdrMode != ModNone)
  1441.     {
  1442.       if ((OpSize <= eSymbolSize8Bit) || ChkCPU32(ErrNum_AddrModeNotSupported))
  1443.       {
  1444.         Byte HReg = AdrPart;
  1445.         DecodeAdr(&ArgStr[1], MModImm | MModReg);
  1446.         switch (AdrMode)
  1447.         {
  1448.           case ModImm:
  1449.             switch (OpSize)
  1450.             {
  1451.               case eSymbolSize8Bit:
  1452.                 CodeLen = 2;
  1453.                 WAsmCode[0] = 0xc000 + (Code << 12) + (((Word)HReg) << 8) + Lo(AdrVals[0]);
  1454.                 break;
  1455.               case eSymbolSize16Bit:
  1456.                 CodeLen = 4;
  1457.                 WAsmCode[1] = AdrVals[0];
  1458.                 WAsmCode[0] = 0x7940 + (Code << 4) + HReg;
  1459.                 break;
  1460.               case eSymbolSize32Bit:
  1461.                 CodeLen = 6;
  1462.                 memcpy(WAsmCode + 1, AdrVals, AdrCnt);
  1463.                 WAsmCode[0] = 0x7a40 + (Code << 4) + HReg;
  1464.                 break;
  1465.               default:
  1466.                 break;
  1467.             }
  1468.             break;
  1469.           case ModReg:
  1470.             switch (OpSize)
  1471.             {
  1472.               case eSymbolSize8Bit:
  1473.                 CodeLen = 2;
  1474.                 WAsmCode[0] = 0x1400 + (Code << 8) + (AdrPart << 4) + HReg;
  1475.                 break;
  1476.               case eSymbolSize16Bit:
  1477.                 CodeLen = 2;
  1478.                 WAsmCode[0] = 0x6400 + (Code << 8) + (AdrPart << 4) + HReg;
  1479.                 break;
  1480.               case eSymbolSize32Bit:
  1481.                 CodeLen = 4;
  1482.                 WAsmCode[0] = 0x01f0;
  1483.                 WAsmCode[1] = 0x6400 + (Code << 8) + (AdrPart << 4) + HReg;
  1484.                 break;
  1485.               default:
  1486.                 break;
  1487.             }
  1488.             break;
  1489.         }
  1490.       }
  1491.     }
  1492.   }
  1493. }
  1494.  
  1495. static void DecodeLogicBit(Word Code)
  1496. {
  1497.   SetOpSize(eSymbolSize8Bit);
  1498.   if (!ChkArgCnt(2, 2));
  1499.   else if (as_strcasecmp(ArgStr[2].str.p_str, "CCR")) WrError(ErrNum_InvAddrMode);
  1500.   else
  1501.   {
  1502.     DecodeAdr(&ArgStr[1], MModImm);
  1503.     if (AdrMode != ModNone)
  1504.     {
  1505.       CodeLen = 2;
  1506.       WAsmCode[0] = 0x0400 + (Code << 8) + Lo(AdrVals[0]);
  1507.     }
  1508.   }
  1509. }
  1510.  
  1511. static void DecodeADDX_SUBX(Word IsSUBX)
  1512. {
  1513.   if (ChkArgCnt(2, 2))
  1514.   {
  1515.     DecodeAdr(&ArgStr[2], MModReg);
  1516.     if (AdrMode != ModNone)
  1517.     {
  1518.       if (OpSize != eSymbolSize8Bit) WrError(ErrNum_InvOpSize);
  1519.       else
  1520.       {
  1521.         Byte HReg = AdrPart;
  1522.         DecodeAdr(&ArgStr[1], MModImm | MModReg);
  1523.         switch (AdrMode)
  1524.         {
  1525.           case ModImm:
  1526.             CodeLen = 2;
  1527.             WAsmCode[0] = 0x9000 + (((Word)HReg) << 8) + Lo(AdrVals[0]) + (IsSUBX << 13);
  1528.             break;
  1529.           case ModReg:
  1530.             CodeLen = 2;
  1531.             WAsmCode[0] = 0x0e00 + (AdrPart << 4) + HReg + (IsSUBX << 12);
  1532.             break;
  1533.         }
  1534.       }
  1535.     }
  1536.   }
  1537. }
  1538.  
  1539. static void DecodeADDS_SUBS(Word IsSUBS)
  1540. {
  1541.   if (ChkArgCnt(2, 2))
  1542.   {
  1543.     DecodeAdr(&ArgStr[2], MModReg);
  1544.     if (AdrMode != ModNone)
  1545.     {
  1546.       if (((CPU16) && (OpSize != eSymbolSize16Bit)) || ((!CPU16) && (OpSize != eSymbolSize32Bit))) WrError(ErrNum_InvOpSize);
  1547.       else
  1548.       {
  1549.         Byte HReg = AdrPart;
  1550.         DecodeAdr(&ArgStr[1], MModImm);
  1551.         if (AdrMode != ModNone)
  1552.         {
  1553.           LongInt AdrLong = ImmVal();
  1554.           if ((AdrLong != 1) && (AdrLong != 2) && (AdrLong != 4)) WrError(ErrNum_OverRange);
  1555.           else
  1556.           {
  1557.             switch (AdrLong)
  1558.             {
  1559.               case 1: WAsmCode[0] = 0x0b00; break;
  1560.               case 2: WAsmCode[0] = 0x0b80; break;
  1561.               case 4: WAsmCode[0] = 0x0b90; break;
  1562.             }
  1563.             CodeLen = 2;
  1564.             WAsmCode[0] += HReg + IsSUBS;
  1565.           }
  1566.         }
  1567.       }
  1568.     }
  1569.   }
  1570. }
  1571.  
  1572. static void DecodeMul(Word Code)
  1573. {
  1574.   if (ChkArgCnt(2, 2))
  1575.   {
  1576.     if (OpSize != eSymbolSizeUnknown) OpSize++;
  1577.     DecodeAdr(&ArgStr[2], MModReg);
  1578.     if (AdrMode != ModNone)
  1579.     {
  1580.       if (OpSize == eSymbolSize8Bit) WrError(ErrNum_InvOpSize);
  1581.       else if ((OpSize != eSymbolSize32Bit) || ChkCPU32(ErrNum_AddrModeNotSupported))
  1582.       {
  1583.         Byte HReg = AdrPart;
  1584.         OpSize--;
  1585.         DecodeAdr(&ArgStr[1], MModReg);
  1586.         if (AdrMode != ModNone)
  1587.         {
  1588.           if ((Code & 2) == 2)
  1589.           {
  1590.             CodeLen = 4;
  1591.             WAsmCode[0] = 0x01c0;
  1592.             if ((Code & 1) == 1)
  1593.               WAsmCode[0] += 0x10;
  1594.           }
  1595.           else
  1596.             CodeLen=2;
  1597.           WAsmCode[CodeLen >> 2] = 0x5000
  1598.                                  + (((Word)OpSize) << 9)
  1599.                                  + ((Code & 1) << 8)
  1600.                                  + (AdrPart << 4) + HReg;
  1601.         }
  1602.       }
  1603.     }
  1604.   }
  1605. }
  1606.  
  1607. static void DecodeBit1(Word Code)
  1608. {
  1609.   Word OpCode = 0x60 + (Code & 0x7f);
  1610.   Byte BitPos;
  1611.  
  1612.   switch (ArgCnt)
  1613.   {
  1614.     case 1:
  1615.     {
  1616.       LongWord BitSpec;
  1617.  
  1618.       if (DecodeBitArg(&BitSpec, 1, 1))
  1619.       {
  1620.         LongWord Addr;
  1621.  
  1622.         DissectBitSymbol(BitSpec, &Addr, &BitPos);
  1623.         AdrMode = ModAbs8;
  1624.         AdrVals[0] = Addr & 0xff;
  1625.         AdrCnt = 2;
  1626.         goto common;
  1627.       }
  1628.       break;
  1629.     }
  1630.     case 2:
  1631.     {
  1632.       Boolean OK;
  1633.  
  1634.       BitPos = EvalBitPosition(&ArgStr[1], &OK);
  1635.       if (OK)
  1636.       {
  1637.         DecodeAdr(&ArgStr[2], MModReg | MModIReg | MModAbs8);
  1638.         if (AdrMode != ModNone)
  1639.           goto common;
  1640.       }
  1641.       break;
  1642.     }
  1643.     common:
  1644.       if (OpSize > eSymbolSize8Bit) WrError(ErrNum_InvOpSize);
  1645.       else switch (AdrMode)
  1646.       {
  1647.         case ModReg:
  1648.           CodeLen = 2;
  1649.           WAsmCode[0] = (OpCode << 8) + (Code & 0x80) + (BitPos << 4) + AdrPart;
  1650.           break;
  1651.         case ModIReg:
  1652.           CodeLen = 4;
  1653.           WAsmCode[0] = 0x7c00 + (AdrPart << 4);
  1654.           WAsmCode[1] = (OpCode << 8) + (Code & 0x80) + (BitPos << 4);
  1655.           if (OpCode < 0x70)
  1656.             WAsmCode[0] += 0x100;
  1657.           break;
  1658.         case ModAbs8:
  1659.           CodeLen = 4;
  1660.           WAsmCode[0] = 0x7e00 + Lo(AdrVals[0]);
  1661.           WAsmCode[1] = (OpCode << 8) + (Code & 0x80) + (BitPos << 4);
  1662.           if (OpCode < 0x70)
  1663.             WAsmCode[0] += 0x100;
  1664.           break;
  1665.       }
  1666.       break;
  1667.     default:
  1668.       (void)ChkArgCnt(1, 2);
  1669.   }
  1670. }
  1671.  
  1672. static void DecodeBit2(Word Code)
  1673. {
  1674.   Word OpCode;
  1675.   Byte Bit;
  1676.   Boolean OK;
  1677.   tSymbolSize HSize;
  1678.  
  1679.   switch (ArgCnt)
  1680.   {
  1681.     case 1:
  1682.     {
  1683.       LongWord BitSpec;
  1684.  
  1685.       if (DecodeBitArg(&BitSpec, 1, 1))
  1686.       {
  1687.         LongWord Addr;
  1688.  
  1689.         DissectBitSymbol(BitSpec, &Addr, &Bit);
  1690.         OpCode = Code + 0x70;
  1691.         AdrMode = ModAbs8;
  1692.         AdrVals[0] = Addr & 0xff;
  1693.         AdrCnt = 2;
  1694.         goto common;
  1695.       }
  1696.       break;
  1697.     }
  1698.     case 2:
  1699.       switch (DecodeReg(&ArgStr[1], &Bit, 1 << eSymbolSize8Bit, &HSize, False))
  1700.       {
  1701.         case eIsReg:
  1702.           OpCode = Code + 0x60;
  1703.           OK = True;
  1704.           break;
  1705.         case eIsNoReg:
  1706.           OpCode = Code + 0x70;
  1707.           Bit = EvalBitPosition(&ArgStr[1], &OK);
  1708.           break;
  1709.         default: /* eRegAbort */
  1710.           return;
  1711.       }
  1712.       if (OK)
  1713.       {
  1714.         DecodeAdr(&ArgStr[2], MModReg | MModIReg | MModAbs8);
  1715.         if (AdrMode != ModNone)
  1716.           goto common;
  1717.         break;
  1718.       }
  1719.     common:
  1720.       if (OpSize > eSymbolSize8Bit) WrError(ErrNum_InvOpSize);
  1721.       else
  1722.       {
  1723.         switch (AdrMode)
  1724.         {
  1725.           case ModReg:
  1726.             CodeLen = 2;
  1727.             WAsmCode[0] = (OpCode << 8) + (Bit << 4) + AdrPart;
  1728.             break;
  1729.           case ModIReg:
  1730.             CodeLen = 4;
  1731.             WAsmCode[0] = 0x7d00 + (AdrPart << 4);
  1732.             WAsmCode[1] = (OpCode << 8) + (Bit << 4);
  1733.             if (Code == 3)
  1734.               WAsmCode[0] -= 0x100;
  1735.             break;
  1736.           case ModAbs8:
  1737.             CodeLen = 4;
  1738.             WAsmCode[0] = 0x7f00 + Lo(AdrVals[0]);
  1739.             WAsmCode[1] = (OpCode << 8) + (Bit << 4);
  1740.             if (Code == 3)
  1741.               WAsmCode[0] -= 0x100;
  1742.             break;
  1743.         }
  1744.       }
  1745.       break;
  1746.     default:
  1747.       (void)ChkArgCnt(1, 2);
  1748.   }
  1749. }
  1750.  
  1751. static void DecodeINC_DEC(Word Code)
  1752. {
  1753.   Boolean OK;
  1754.   int z;
  1755.   Byte HReg;
  1756.  
  1757.   if (ChkArgCnt(1, 2))
  1758.   {
  1759.     DecodeAdr(&ArgStr[ArgCnt], MModReg);
  1760.     if (AdrMode != ModNone)
  1761.     {
  1762.       if ((OpSize <= eSymbolSize8Bit) || ChkCPU32(ErrNum_AddrModeNotSupported))
  1763.       {
  1764.         HReg = AdrPart;
  1765.         if (ArgCnt == 1)
  1766.         {
  1767.           OK = True;
  1768.           z = 1;
  1769.         }
  1770.         else
  1771.         {
  1772.           DecodeAdr(&ArgStr[1], MModImm);
  1773.           OK = (AdrMode == ModImm);
  1774.           if (OK)
  1775.           {
  1776.             z = ImmVal();
  1777.             if (z < 1)
  1778.             {
  1779.               WrError(ErrNum_UnderRange);
  1780.               OK = False;
  1781.             }
  1782.             else if (((OpSize == eSymbolSize8Bit) && (z > 1)) || (z > 2))
  1783.             {
  1784.               WrError(ErrNum_OverRange);
  1785.               OK = False;
  1786.             }
  1787.           }
  1788.         }
  1789.         if (OK)
  1790.         {
  1791.           CodeLen = 2;
  1792.           z--;
  1793.           switch (OpSize)
  1794.           {
  1795.             case eSymbolSize8Bit:
  1796.               WAsmCode[0] = Code + 0x0a00 + HReg;
  1797.               break;
  1798.             case eSymbolSize16Bit:
  1799.               WAsmCode[0] = Code + 0x0b50 + HReg + (z << 7);
  1800.               break;
  1801.             case eSymbolSize32Bit:
  1802.               WAsmCode[0] = Code + 0x0b70 + HReg + (z << 7);
  1803.               break;
  1804.             default:
  1805.               break;
  1806.           }
  1807.         }
  1808.       }
  1809.     }
  1810.   }
  1811. }
  1812.  
  1813. static void DecodeShift(Word Code)
  1814. {
  1815.   if (ChkArgCnt(1, 1))
  1816.   {
  1817.     DecodeAdr(&ArgStr[1], MModReg);
  1818.     if (AdrMode != ModNone)
  1819.     {
  1820.       if ((OpSize <= eSymbolSize8Bit) || ChkCPU32(ErrNum_AddrModeNotSupported))
  1821.       {
  1822.         CodeLen = 2;
  1823.         switch (OpSize)
  1824.         {
  1825.           case eSymbolSize8Bit:
  1826.             WAsmCode[0] = Code + AdrPart;
  1827.             break;
  1828.           case eSymbolSize16Bit:
  1829.             WAsmCode[0] = Code + AdrPart + 0x10;
  1830.             break;
  1831.           case eSymbolSize32Bit:
  1832.             WAsmCode[0] = Code + AdrPart + 0x30;
  1833.             break;
  1834.           default:
  1835.             break;
  1836.         }
  1837.       }
  1838.     }
  1839.   }
  1840. }
  1841.  
  1842. static void DecodeNEG_NOT(Word Code)
  1843. {
  1844.   if (ChkArgCnt(1, 1))
  1845.   {
  1846.     DecodeAdr(&ArgStr[1], MModReg);
  1847.     if (AdrMode != ModNone)
  1848.     {
  1849.       if ((OpSize <= eSymbolSize8Bit) || ChkCPU32(ErrNum_AddrModeNotSupported))
  1850.       {
  1851.         CodeLen = 2;
  1852.         switch (OpSize)
  1853.         {
  1854.           case eSymbolSize8Bit:
  1855.             WAsmCode[0] = Code + 0x1700 + AdrPart;
  1856.             break;
  1857.           case eSymbolSize16Bit:
  1858.             WAsmCode[0] = Code + 0x1710 + AdrPart;
  1859.             break;
  1860.           case eSymbolSize32Bit:
  1861.             WAsmCode[0] = Code + 0x1730 + AdrPart;
  1862.             break;
  1863.           default:
  1864.             break;
  1865.         }
  1866.       }
  1867.     }
  1868.   }
  1869. }
  1870.  
  1871. static void DecodeEXTS_EXTU(Word IsEXTS)
  1872. {
  1873.   if (ChkArgCnt(1, 1)
  1874.    && ChkCPU32(ErrNum_InstructionNotSupported))
  1875.   {
  1876.     DecodeAdr(&ArgStr[1], MModReg);
  1877.     if (AdrMode != ModNone)
  1878.     {
  1879.       if ((OpSize != eSymbolSize16Bit) && (OpSize != 2)) WrError(ErrNum_InvOpSize);
  1880.       else
  1881.       {
  1882.         CodeLen = 2;
  1883.         switch (OpSize)
  1884.         {
  1885.           case eSymbolSize16Bit:
  1886.             WAsmCode[0] = IsEXTS ? 0x17d0 : 0x1750;
  1887.             break;
  1888.           case eSymbolSize32Bit:
  1889.             WAsmCode[0] = IsEXTS ? 0x17f0 : 0x1770;
  1890.             break;
  1891.           default:
  1892.             break;
  1893.         }
  1894.         WAsmCode[0] += AdrPart;
  1895.       }
  1896.     }
  1897.   }
  1898. }
  1899.  
  1900. static void DecodeDAA_DAS(Word Code)
  1901. {
  1902.   if (ChkArgCnt(1, 1))
  1903.   {
  1904.     DecodeAdr(&ArgStr[1], MModReg);
  1905.     if (AdrMode != ModNone)
  1906.     {
  1907.       if (OpSize != eSymbolSize8Bit) WrError(ErrNum_InvOpSize);
  1908.       else
  1909.       {
  1910.         CodeLen = 2;
  1911.         WAsmCode[0] = Code + AdrPart;
  1912.       }
  1913.     }
  1914.   }
  1915. }
  1916.  
  1917. static void DecodeCond(Word Code)
  1918. {
  1919.   if (!ChkArgCnt(1, 1));
  1920.   else if ((OpSize != eSymbolSizeUnknown) && (OpSize != eSymbolSizeFloat32Bit) && (OpSize != eSymbolSize32Bit)) WrError(ErrNum_InvOpSize);
  1921.   else
  1922.   {
  1923.     Boolean OK;
  1924.     tSymbolFlags Flags;
  1925.     LongInt AdrLong = EvalStrIntExpressionWithFlags(&ArgStr[1], Int24, &OK, &Flags) - (EProgCounter() + 2);
  1926.  
  1927.     if (OK)
  1928.     {
  1929.       if (OpSize == eSymbolSizeUnknown)
  1930.       {
  1931.         if ((AdrLong >= -128) && (AdrLong <= 127))
  1932.           OpSize = eSymbolSizeFloat32Bit;
  1933.         else
  1934.         {
  1935.           OpSize = eSymbolSize32Bit;
  1936.           AdrLong -= 2;
  1937.         }
  1938.       }
  1939.       else if (OpSize == eSymbolSize32Bit)
  1940.         AdrLong -= 2;
  1941.       if (OpSize == eSymbolSize32Bit)
  1942.       {
  1943.         if (!mSymbolQuestionable(Flags) && ((AdrLong < -32768) || (AdrLong > 32767))) WrError(ErrNum_JmpDistTooBig);
  1944.         else if (ChkCPU32(ErrNum_AddrModeNotSupported))
  1945.         {
  1946.           CodeLen = 4;
  1947.           WAsmCode[0] = 0x5800 + (Code << 4);
  1948.           WAsmCode[1] = AdrLong & 0xffff;
  1949.         }
  1950.       }
  1951.       else
  1952.       {
  1953.         if (!mSymbolQuestionable(Flags) && ((AdrLong < -128) || (AdrLong > 127))) WrError(ErrNum_JmpDistTooBig);
  1954.         else
  1955.         {
  1956.           CodeLen = 2;
  1957.           WAsmCode[0] = 0x4000 + (Code << 8) + (AdrLong & 0xff);
  1958.         }
  1959.       }
  1960.     }
  1961.   }
  1962. }
  1963.  
  1964. static void DecodeJMP_JSR(Word Code)
  1965. {
  1966.   if (ChkArgCnt(1, 1))
  1967.   {
  1968.     DecodeAdr(&ArgStr[1], MModIReg | ((CPU16) ? MModAbs16 : MModAbs24) | MModIIAbs);
  1969.     switch (AdrMode)
  1970.     {
  1971.       case ModIReg:
  1972.         CodeLen = 2;
  1973.         WAsmCode[0] = 0x5900 + Code + (AdrPart << 4);
  1974.         break;
  1975.       case ModAbs16:
  1976.         CodeLen = 4;
  1977.         WAsmCode[0] = 0x5a00 + Code;
  1978.         WAsmCode[1] = AdrVals[0];
  1979.         break;
  1980.       case ModAbs24:
  1981.         CodeLen = 4;
  1982.         WAsmCode[0] = 0x5a00 + Code + Lo(AdrVals[0]);
  1983.         WAsmCode[1] = AdrVals[1];
  1984.         break;
  1985.       case ModIIAbs:
  1986.         CodeLen = 2;
  1987.         WAsmCode[0] = 0x5b00 + Code + Lo(AdrVals[0]);
  1988.         break;
  1989.     }
  1990.   }
  1991. }
  1992.  
  1993. static void DecodeBSR(Word Code)
  1994. {
  1995.   UNUSED(Code);
  1996.  
  1997.   if (!ChkArgCnt(1, 1));
  1998.   else if ((OpSize != eSymbolSizeUnknown) && (OpSize != eSymbolSizeFloat32Bit) && (OpSize != eSymbolSize32Bit)) WrError(ErrNum_InvOpSize);
  1999.   else
  2000.   {
  2001.     Boolean OK;
  2002.     tSymbolFlags Flags;
  2003.     LongInt AdrLong = EvalStrIntExpressionWithFlags(&ArgStr[1], Int24, &OK, &Flags) - (EProgCounter() + 2);
  2004.  
  2005.     if (OK)
  2006.     {
  2007.       if (OpSize == eSymbolSizeUnknown)
  2008.       {
  2009.         if ((AdrLong >= -128) && (AdrLong <= 127))
  2010.           OpSize = eSymbolSizeFloat32Bit;
  2011.         else
  2012.         {
  2013.           OpSize = eSymbolSize32Bit;
  2014.           AdrLong -= 2;
  2015.         }
  2016.       }
  2017.       else
  2018.       {
  2019.         if (OpSize == eSymbolSize32Bit)
  2020.           AdrLong -= 2;
  2021.       }
  2022.       if (OpSize == eSymbolSize32Bit)
  2023.       {
  2024.         if (!mSymbolQuestionable(Flags) && ((AdrLong < -32768) || (AdrLong > 32767))) WrError(ErrNum_JmpDistTooBig);
  2025.         else if (ChkCPU32(ErrNum_AddrModeNotSupported))
  2026.         {
  2027.           CodeLen = 4;
  2028.           WAsmCode[0] = 0x5c00;
  2029.           WAsmCode[1] = AdrLong & 0xffff;
  2030.         }
  2031.       }
  2032.       else
  2033.       {
  2034.         if ((AdrLong < -128) || (AdrLong > 127)) WrError(ErrNum_JmpDistTooBig);
  2035.         else
  2036.         {
  2037.           CodeLen = 2;
  2038.           WAsmCode[0] = 0x5500 + (AdrLong & 0xff);
  2039.         }
  2040.       }
  2041.     }
  2042.   }
  2043. }
  2044.  
  2045. static void DecodeTRAPA(Word Code)
  2046. {
  2047.   UNUSED(Code);
  2048.  
  2049.   if (ChkArgCnt(1, 1)
  2050.    && ChkMinCPU(CPU6413309))
  2051.   {
  2052.     Boolean OK;
  2053.  
  2054.     WAsmCode[0] = EvalStrIntExpressionOffs(&ArgStr[1], !!(*ArgStr[1].str.p_str == '#'), UInt2, &OK) << 4;
  2055.     if (OK)
  2056.     {
  2057.       WAsmCode[0] += 0x5700;
  2058.       CodeLen = 2;
  2059.     }
  2060.   }
  2061. }
  2062.  
  2063. /*!------------------------------------------------------------------------
  2064.  * \fn     DecodeBIT(Word Code)
  2065.  * \brief  handle BIT instruction
  2066.  * ------------------------------------------------------------------------ */
  2067.  
  2068. static void DecodeBIT(Word Code)
  2069. {
  2070.   UNUSED(Code);
  2071.  
  2072.   /* if in structure definition, add special element to structure */
  2073.  
  2074.   if ((OpSize != eSymbolSize8Bit) && (OpSize != eSymbolSizeUnknown))
  2075.   {
  2076.     WrError(ErrNum_InvOpSize);
  2077.     return;
  2078.   }
  2079.   if (ActPC == StructSeg)
  2080.   {
  2081.     Boolean OK;
  2082.     Byte BitPos;
  2083.     PStructElem pElement;
  2084.  
  2085.     if (!ChkArgCnt(2, 2))
  2086.       return;
  2087.     BitPos = EvalBitPosition(&ArgStr[1], &OK);
  2088.     if (!OK)
  2089.       return;
  2090.     pElement = CreateStructElem(&LabPart);
  2091.     if (!pElement)
  2092.       return;
  2093.     pElement->pRefElemName = as_strdup(ArgStr[2].str.p_str);
  2094.     pElement->OpSize = eSymbolSize8Bit;
  2095.     pElement->BitPos = BitPos;
  2096.     pElement->ExpandFnc = ExpandBit_H8_3;
  2097.     AddStructElem(pInnermostNamedStruct->StructRec, pElement);
  2098.   }
  2099.   else
  2100.   {
  2101.     LongWord BitSpec;
  2102.  
  2103.     if (DecodeBitArg(&BitSpec, 1, ArgCnt))
  2104.     {
  2105.       *ListLine = '=';
  2106.       DissectBit_H8_3(ListLine + 1, STRINGSIZE - 3, BitSpec);
  2107.       PushLocHandle(-1);
  2108.       EnterIntSymbol(&LabPart, BitSpec, SegBData, False);
  2109.       PopLocHandle();
  2110.       /* TODO: MakeUseList? */
  2111.     }
  2112.   }
  2113. }
  2114.  
  2115. /*-------------------------------------------------------------------------*/
  2116. /* dynamische Belegung/Freigabe Codetabellen */
  2117.  
  2118. static void AddFixed(const char *NName, Word NCode)
  2119. {
  2120.   AddInstTable(InstTable, NName, NCode, DecodeFixed);
  2121. }
  2122.  
  2123. static void AddCond(const char *NName, Byte NCode)
  2124. {
  2125.   AddInstTable(InstTable, NName, NCode, DecodeCond);
  2126. }
  2127.  
  2128. static void AddShift(const char *NName, Word NCode)
  2129. {
  2130.   AddInstTable(InstTable, NName, NCode, DecodeShift);
  2131. }
  2132.  
  2133. static void AddLogic(const char *NName, const char *NNameBit, Word NCode)
  2134. {
  2135.   AddInstTable(InstTable, NName, NCode, DecodeLogic);
  2136.   AddInstTable(InstTable, NNameBit, NCode, DecodeLogicBit);
  2137. }
  2138.  
  2139. static void AddMul(const char *NName, Word NCode)
  2140. {
  2141.   AddInstTable(InstTable, NName, NCode, DecodeMul);
  2142. }
  2143.  
  2144. static void AddBit1(const char *NName, Word NCode)
  2145. {
  2146.   AddInstTable(InstTable, NName, NCode, DecodeBit1);
  2147. }
  2148.  
  2149. static void AddBit2(const char *NName, Word NCode)
  2150. {
  2151.   AddInstTable(InstTable, NName, NCode, DecodeBit2);
  2152. }
  2153.  
  2154. static void InitFields(void)
  2155. {
  2156.   InstTable = CreateInstTable(203);
  2157.   AddInstTable(InstTable, "EEPMOV", 0, DecodeEEPMOV);
  2158.   AddInstTable(InstTable, "MOV", 0, DecodeMOV);
  2159.   AddInstTable(InstTable, "MOVTPE", 0x80, DecodeMOVTPE_MOVFPE);
  2160.   AddInstTable(InstTable, "MOVFPE", 0x00, DecodeMOVTPE_MOVFPE);
  2161.   AddInstTable(InstTable, "PUSH", 0x6df0, DecodePUSH_POP);
  2162.   AddInstTable(InstTable, "POP", 0x6d70, DecodePUSH_POP);
  2163.   AddInstTable(InstTable, "LDC", 0x00, DecodeLDC_STC);
  2164.   AddInstTable(InstTable, "STC", 0x80, DecodeLDC_STC);
  2165.   AddInstTable(InstTable, "ADD", 0, DecodeADD_SUB);
  2166.   AddInstTable(InstTable, "SUB", 1, DecodeADD_SUB);
  2167.   AddInstTable(InstTable, "CMP", 0, DecodeCMP);
  2168.   AddInstTable(InstTable, "ADDX", 0, DecodeADDX_SUBX);
  2169.   AddInstTable(InstTable, "SUBX", 1, DecodeADDX_SUBX);
  2170.   AddInstTable(InstTable, "ADDS", 0x0000, DecodeADDS_SUBS);
  2171.   AddInstTable(InstTable, "SUBS", 0x1000, DecodeADDS_SUBS);
  2172.   AddInstTable(InstTable, "INC", 0x0000, DecodeINC_DEC);
  2173.   AddInstTable(InstTable, "DEC", 0x1000, DecodeINC_DEC);
  2174.   AddInstTable(InstTable, "NEG", 0x80, DecodeNEG_NOT);
  2175.   AddInstTable(InstTable, "NOT", 0x00, DecodeNEG_NOT);
  2176.   AddInstTable(InstTable, "EXTS", 1, DecodeEXTS_EXTU);
  2177.   AddInstTable(InstTable, "EXTU", 0, DecodeEXTS_EXTU);
  2178.   AddInstTable(InstTable, "DAA", 0x0f00, DecodeDAA_DAS);
  2179.   AddInstTable(InstTable, "DAS", 0x1f00, DecodeDAA_DAS);
  2180.   AddInstTable(InstTable, "JMP", 0x0000, DecodeJMP_JSR);
  2181.   AddInstTable(InstTable, "JSR", 0x0400, DecodeJMP_JSR);
  2182.   AddInstTable(InstTable, "BSR", 0, DecodeBSR);
  2183.   AddInstTable(InstTable, "TRAPA", 0, DecodeTRAPA);
  2184.  
  2185.   AddFixed("NOP", 0x0000); AddFixed("RTE"  , 0x5670);
  2186.   AddFixed("RTS", 0x5470); AddFixed("SLEEP", 0x0180);
  2187.  
  2188.   AddCond("BRA", 0x0); AddCond("BT" , 0x0);
  2189.   AddCond("BRN", 0x1); AddCond("BF" , 0x1);
  2190.   AddCond("BHI", 0x2); AddCond("BLS", 0x3);
  2191.   AddCond("BCC", 0x4); AddCond("BHS", 0x4);
  2192.   AddCond("BCS", 0x5); AddCond("BLO", 0x5);
  2193.   AddCond("BNE", 0x6); AddCond("BEQ", 0x7);
  2194.   AddCond("BVC", 0x8); AddCond("BVS", 0x9);
  2195.   AddCond("BPL", 0xa); AddCond("BMI", 0xb);
  2196.   AddCond("BGE", 0xc); AddCond("BLT", 0xd);
  2197.   AddCond("BGT", 0xe); AddCond("BLE", 0xf);
  2198.  
  2199.   AddShift("ROTL" , 0x1280); AddShift("ROTR" , 0x1380);
  2200.   AddShift("ROTXL", 0x1200); AddShift("ROTXR", 0x1300);
  2201.   AddShift("SHAL" , 0x1080); AddShift("SHAR" , 0x1180);
  2202.   AddShift("SHLL" , 0x1000); AddShift("SHLR" , 0x1100);
  2203.  
  2204.   AddLogic("OR", "ORC", 0);
  2205.   AddLogic("XOR", "XORC", 1);
  2206.   AddLogic("AND", "ANDC", 2);
  2207.  
  2208.   AddMul("DIVXS", 3);
  2209.   AddMul("DIVXU", 1);
  2210.   AddMul("MULXS", 2);
  2211.   AddMul("MULXU", 0);
  2212.  
  2213.   AddBit1("BAND", 0x16); AddBit1("BIAND", 0x96);
  2214.   AddBit1("BOR" , 0x14); AddBit1("BIOR" , 0x94);
  2215.   AddBit1("BXOR", 0x15); AddBit1("BIXOR", 0x95);
  2216.   AddBit1("BLD" , 0x17); AddBit1("BILD" , 0x97);
  2217.   AddBit1("BST" , 0x07); AddBit1("BIST" , 0x87);
  2218.  
  2219.   AddBit2("BCLR", 2);
  2220.   AddBit2("BNOT", 1);
  2221.   AddBit2("BSET", 0);
  2222.   AddBit2("BTST", 3);
  2223.  
  2224.   AddInstTable(InstTable, "REG", 0, CodeREG);
  2225.   AddInstTable(InstTable, "BIT", 0, DecodeBIT);
  2226. }
  2227.  
  2228. static void DeinitFields(void)
  2229. {
  2230.   DestroyInstTable(InstTable);
  2231. }
  2232.  
  2233. /*-------------------------------------------------------------------------*/
  2234.  
  2235. /*!------------------------------------------------------------------------
  2236.  * \fn     InternSymbol_H8_3(char *pArg, TempResult *pResult)
  2237.  * \brief  handle built-in symbols on H8/300
  2238.  * \param  pArg source argument
  2239.  * \param  pResult result buffer
  2240.  * ------------------------------------------------------------------------ */
  2241.  
  2242. static void InternSymbol_H8_3(char *pArg, TempResult *pResult)
  2243. {
  2244.   Byte Result;
  2245.   tSymbolSize Size;
  2246.  
  2247.   if (DecodeRegCore(pArg, &Result, &Size))
  2248.   {
  2249.     pResult->Typ = TempReg;
  2250.     pResult->DataSize = Size;
  2251.     pResult->Contents.RegDescr.Reg = Result;
  2252.     pResult->Contents.RegDescr.Dissect = DissectReg_H8_3;
  2253.     pResult->Contents.RegDescr.compare = NULL;
  2254.   }
  2255. }
  2256.  
  2257. static Boolean DecodeAttrPart_H8_3(void)
  2258. {
  2259.   if (*AttrPart.str.p_str)
  2260.   {
  2261.     if (strlen(AttrPart.str.p_str) != 1)
  2262.     {
  2263.       WrStrErrorPos(ErrNum_TooLongAttr, &AttrPart);
  2264.       return False;
  2265.     }
  2266.     if (!DecodeMoto16AttrSize(*AttrPart.str.p_str, &AttrPartOpSize[0], False))
  2267.       return False;
  2268.   }
  2269.   return True;
  2270. }
  2271.  
  2272. static void MakeCode_H8_3(void)
  2273. {
  2274.   CodeLen = 0; DontPrint = False;
  2275.  
  2276.   /* zu ignorierendes */
  2277.  
  2278.   if (Memo("")) return;
  2279.  
  2280.   OpSize = eSymbolSizeUnknown;
  2281.   if (AttrPartOpSize[0] != eSymbolSizeUnknown)
  2282.     SetOpSize(AttrPartOpSize[0]);
  2283.  
  2284.   if (DecodeMoto16Pseudo(OpSize, True)) return;
  2285.  
  2286.   if (!LookupInstTable(InstTable, OpPart.str.p_str))
  2287.     WrStrErrorPos(ErrNum_UnknownInstruction, &OpPart);
  2288. }
  2289.  
  2290. static Boolean IsDef_H8_3(void)
  2291. {
  2292.   return Memo("REG")
  2293.       || Memo("BIT");
  2294. }
  2295.  
  2296. static void SwitchTo_H8_3(void)
  2297. {
  2298.   TurnWords = True;
  2299.   SetIntConstMode(eIntConstModeMoto);
  2300.  
  2301.   PCSymbol = "*";
  2302.   HeaderID = 0x68;
  2303.   NOPCode = 0x0000;
  2304.   DivideChars = ",";
  2305.   HasAttrs = True;
  2306.   AttrChars = ".";
  2307.  
  2308.   ValidSegs = 1 << SegCode;
  2309.   Grans[SegCode] = 1;
  2310.   ListGrans[SegCode] = 2;
  2311.   SegInits[SegCode] = 0;
  2312.   SegLimits[SegCode] = (MomCPU <= CPUH8_300) ? 0xffff : 0xffffffl;
  2313.  
  2314.   DecodeAttrPart = DecodeAttrPart_H8_3;
  2315.   MakeCode = MakeCode_H8_3;
  2316.   IsDef = IsDef_H8_3;
  2317.   InternSymbol = InternSymbol_H8_3;
  2318.   DissectReg = DissectReg_H8_3;
  2319.   DissectBit = DissectBit_H8_3;
  2320.   QualifyQuote = QualifyQuote_SingleQuoteConstant;
  2321.   IntConstModeIBMNoTerm = True;
  2322.   SwitchFrom = DeinitFields;
  2323.   InitFields();
  2324.   onoff_maxmode_add();
  2325.   AddMoto16PseudoONOFF(False);
  2326.  
  2327.   CPU16 = (MomCPU <= CPUH8_300);
  2328. }
  2329.  
  2330. void codeh8_3_init(void)
  2331. {
  2332.   CPUH8_300L = AddCPU("H8/300L"   , SwitchTo_H8_3);
  2333.   CPU6413308 = AddCPU("HD6413308" , SwitchTo_H8_3);
  2334.   CPUH8_300  = AddCPU("H8/300"    , SwitchTo_H8_3);
  2335.   CPU6413309 = AddCPU("HD6413309" , SwitchTo_H8_3);
  2336.   CPUH8_300H = AddCPU("H8/300H"   , SwitchTo_H8_3);
  2337. }
  2338.