Subversion Repositories pentevo

Rev

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

  1. /* natpseudo.c */
  2. /*****************************************************************************/
  3. /* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only                     */
  4. /*                                                                           */
  5. /* AS-Port                                                                   */
  6. /*                                                                           */
  7. /* Pseudo Instructions used for National Semiconductor CPUs                  */
  8. /*                                                                           */
  9. /*****************************************************************************/
  10.  
  11. /*****************************************************************************
  12.  * Includes
  13.  *****************************************************************************/
  14.  
  15. #include "stdinc.h"
  16. #include <string.h>
  17. #include "bpemu.h"
  18.  
  19. #include "asmdef.h"
  20. #include "asmsub.h"
  21. #include "asmpars.h"
  22. #include "asmitree.h"
  23. #include "codepseudo.h"
  24. #include "intpseudo.h"
  25. #include "errmsg.h"
  26.  
  27. #include "natpseudo.h"
  28.  
  29. /*****************************************************************************
  30.  * Global Functions
  31.  *****************************************************************************/
  32.  
  33. static void DecodeSFR(Word Code)
  34. {
  35.   UNUSED(Code);
  36.   CodeEquate(SegData, 0, 0xff);
  37. }
  38.  
  39. static void DecodeDSx(Word Shift)
  40. {
  41.   if (ChkArgCnt(1, 1))
  42.   {
  43.     tSymbolFlags Flags;
  44.     Boolean ValOK;
  45.     Word Size = EvalStrIntExpressionWithFlags(&ArgStr[1], UInt16, &ValOK, &Flags) << Shift;
  46.  
  47.     if (mFirstPassUnknown(Flags)) WrError(ErrNum_FirstPassCalc);
  48.     else if (ValOK)
  49.     {
  50.       DontPrint = True;
  51.       if (!Size) WrError(ErrNum_NullResMem);
  52.       CodeLen = Size;
  53.       BookKeeping();
  54.     }
  55.   }
  56. }
  57.  
  58. static void DecodeFx(Word Shift)
  59. {
  60.   if (ChkArgCnt(2, 2))
  61.   {
  62.     tSymbolFlags Flags;
  63.     Boolean ValOK;
  64.     Word Size = EvalStrIntExpressionWithFlags(&ArgStr[1], UInt16, &ValOK, &Flags);
  65.  
  66.     if (mFirstPassUnknown(Flags)) WrError(ErrNum_FirstPassCalc);
  67.     else if (ValOK)
  68.     {
  69.       if (SetMaxCodeLen(Size << Shift)) WrError(ErrNum_CodeOverflow);
  70.       else
  71.       {
  72.         Word Value = EvalStrIntExpression(&ArgStr[2], Shift ? Int16 : Int8, &ValOK);
  73.  
  74.         if (ValOK)
  75.         {
  76.           Word z;
  77.  
  78.           for (z = 0; z < Size; z++)
  79.           {
  80.             BAsmCode[CodeLen++] = Lo(Value);
  81.             if (Shift)
  82.               BAsmCode[CodeLen++] = Hi(Value);
  83.           }
  84.         }
  85.       }
  86.     }
  87.   }
  88. }
  89.  
  90. Boolean DecodeNatPseudo(void)
  91. {
  92.   static PInstTable InstTable = NULL;
  93.  
  94.   if (!InstTable)
  95.   {
  96.     InstTable = CreateInstTable(31);
  97.  
  98.     AddInstTable(InstTable, "SFR"  , 0     , DecodeSFR);
  99.     AddInstTable(InstTable, "ADDR" , eIntPseudoFlag_BigEndian | eIntPseudoFlag_AllowInt , DecodeIntelDB);
  100.     AddInstTable(InstTable, "ADDRW", eIntPseudoFlag_BigEndian | eIntPseudoFlag_AllowInt , DecodeIntelDW);
  101.     AddInstTable(InstTable, "BYTE" , eIntPseudoFlag_AllowInt , DecodeIntelDB);
  102.     AddInstTable(InstTable, "WORD" , eIntPseudoFlag_AllowInt , DecodeIntelDW);
  103.     AddInstTable(InstTable, "DSB"  , 0     , DecodeDSx);
  104.     AddInstTable(InstTable, "DSW"  , 1     , DecodeDSx);
  105.     AddInstTable(InstTable, "FB"   , 0     , DecodeFx);
  106.     AddInstTable(InstTable, "FW"   , 1     , DecodeFx);
  107.   }
  108.  
  109.   return LookupInstTable(InstTable, OpPart.str.p_str);
  110. }
  111.