Subversion Repositories pentevo

Rev

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

  1. /* codesc14xxx.c */
  2. /*****************************************************************************/
  3. /* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only                     */
  4. /*                                                                           */
  5. /* AS-Portierung                                                             */
  6. /*                                                                           */
  7. /* Codegenerator SC14xxx                                                     */
  8. /*                                                                           */
  9. /*****************************************************************************/
  10.  
  11. #include "stdinc.h"
  12. #include <string.h>
  13.  
  14. #include "asmdef.h"
  15. #include "asmsub.h"
  16. #include "asmpars.h"
  17. #include "codepseudo.h"
  18. #include "headids.h"
  19. #include "asmitree.h"
  20. #include "codevars.h"
  21. #include "errmsg.h"
  22. #include "chartrans.h"
  23.  
  24. #include "codesc14xxx.h"
  25.  
  26. /*---------------------------------------------------------------------------*/
  27.  
  28. #define M_14400 (1 << 0)
  29. #define M_14401 (1 << 1)
  30. #define M_14402 (1 << 2)
  31. #define M_14404 (1 << 3)
  32. #define M_14405 (1 << 4)
  33. #define M_14420 (1 << 5)
  34. #define M_14421 (1 << 6)
  35. #define M_14422 (1 << 7)
  36. #define M_14424 (1 << 8)
  37.  
  38. typedef struct
  39. {
  40.   Word CPUMask;
  41.   Byte Code, MinArg, MaxArg;
  42. } FixedOrder;
  43.  
  44. static CPUVar CPU14400, CPU14401, CPU14402, CPU14404, CPU14405,
  45.               CPU14420, CPU14421, CPU14422, CPU14424;
  46. static FixedOrder *FixedOrders;
  47. static Word CurrMask;
  48.  
  49. /*---------------------------------------------------------------------------*/
  50.  
  51. static void DecodeFixed(Word Index)
  52. {
  53.   FixedOrder *POp = FixedOrders + Index;
  54.   Boolean OK;
  55.   Byte Value;
  56.   tSymbolFlags Flags;
  57.  
  58.   if (ChkArgCnt((POp->MinArg != POp->MaxArg) ? 1 : 0, (POp->MinArg != POp->MaxArg) ? 1 : 0)
  59.    && (ChkExactCPUMask(POp->CPUMask, CPU14400) >= 0))
  60.   {
  61.     OK = True;
  62.     if (ArgCnt == 0) Value = 0;
  63.     else
  64.     {
  65.       Value = EvalStrIntExpressionWithFlags(&ArgStr[1], Int8, &OK, &Flags);
  66.       if (mFirstPassUnknown(Flags)) Value = POp->MinArg;
  67.       if (OK) OK = ChkRange(Value, POp->MinArg, POp->MaxArg);
  68.     }
  69.     if (OK)
  70.     {
  71.       WAsmCode[0] = (((Word) POp->Code) << 8) + (Value & 0xff);
  72.       CodeLen = 1;
  73.     }
  74.   }
  75. }
  76.  
  77. /*---------------------------------------------------------------------------*/
  78.  
  79. static Boolean Toggle;
  80.  
  81. static void PutByte(Byte Val)
  82. {
  83.   if (Toggle)
  84.     WAsmCode[CodeLen++] |= ((Word) Val) << 8;
  85.   else
  86.     WAsmCode[CodeLen] = Val & 0xff;
  87.   Toggle = !Toggle;
  88. }
  89.  
  90. static void DecodeDS(Word Code)
  91. {
  92.   int cnt;
  93.   Boolean OK;
  94.  
  95.   UNUSED(Code);
  96.  
  97.   if (ChkArgCnt(1, 1))
  98.   {
  99.     tSymbolFlags Flags;
  100.  
  101.     cnt = EvalStrIntExpressionWithFlags(&ArgStr[1], UInt16, &OK, &Flags);
  102.     if (OK)
  103.     {
  104.       if (mFirstPassUnknown(Flags)) WrError(ErrNum_FirstPassCalc);
  105.       else
  106.       {
  107.         if (!cnt) WrError(ErrNum_NullResMem);
  108.         CodeLen = (cnt + 1) >> 1;
  109.         DontPrint = True;
  110.         BookKeeping();
  111.       }
  112.     }
  113.   }
  114. }
  115.  
  116. static void DecodeDS16(Word Code)
  117. {
  118.   int cnt;
  119.   Boolean OK;
  120.  
  121.   UNUSED(Code);
  122.  
  123.   if (ChkArgCnt(1, 1))
  124.   {
  125.     tSymbolFlags Flags;
  126.  
  127.     cnt = EvalStrIntExpressionWithFlags(&ArgStr[1], UInt16, &OK, &Flags);
  128.     if (OK)
  129.     {
  130.       if (mFirstPassUnknown(Flags)) WrError(ErrNum_FirstPassCalc);
  131.       else
  132.       {
  133.         if (!cnt) WrError(ErrNum_NullResMem);
  134.         CodeLen = cnt;
  135.         DontPrint = True;
  136.         BookKeeping();
  137.       }
  138.     }
  139.   }
  140. }
  141.  
  142. static void DecodeDC(Word Code)
  143. {
  144.   TempResult t;
  145.  
  146.   UNUSED(Code);
  147.  
  148.   as_tempres_ini(&t);
  149.   if (ChkArgCnt(1, ArgCntMax))
  150.   {
  151.     Boolean OK = True;
  152.     char *p, *pEnd;
  153.     tStrComp *pArg;
  154.  
  155.     Toggle = FALSE;
  156.     forallargs(pArg, OK)
  157.     {
  158.       EvalStrExpression(pArg, &t);
  159.       switch (t.Typ)
  160.       {
  161.         case TempInt:
  162.           if (mFirstPassUnknown(t.Flags))
  163.             t.Contents.Int &= 127;
  164.           if (ChkRange(t.Contents.Int, -128, 255))
  165.             PutByte(t.Contents.Int);
  166.           break;
  167.         case TempString:
  168.           if (as_chartrans_xlate_nonz_dynstr(CurrTransTable->p_table, &t.Contents.str, pArg))
  169.             OK = False;
  170.           else
  171.             for (p = t.Contents.str.p_str, pEnd = p + t.Contents.str.len; p < pEnd; p++)
  172.               PutByte(((usint) *p) & 0xff);
  173.           break;
  174.         case TempFloat:
  175.           WrStrErrorPos(ErrNum_StringOrIntButFloat, pArg);
  176.           /* fall-through */
  177.         default:
  178.           OK = False;
  179.       }
  180.     }
  181.     if (!OK)
  182.       CodeLen = 0;
  183.     else if (Toggle)
  184.       CodeLen++;
  185.   }
  186.   as_tempres_free(&t);
  187. }
  188.  
  189. static void DecodeDW(Word Code)
  190. {
  191.   int z;
  192.   Boolean OK;
  193.  
  194.   UNUSED(Code);
  195.  
  196.   if (ChkArgCnt(1, ArgCntMax))
  197.   {
  198.     z = 1; OK = TRUE;
  199.     while ((OK) && (z <= ArgCnt))
  200.     {
  201.       WAsmCode[z - 1] = EvalStrIntExpression(&ArgStr[z], Int16, &OK);
  202.       z++;
  203.     }
  204.     if (OK)
  205.       CodeLen = ArgCnt;
  206.   }
  207. }
  208.  
  209. /*---------------------------------------------------------------------------*/
  210.  
  211. static void AddFixed(const char *NName, Byte NCode, Word NMask, Byte NMin, Byte NMax)
  212. {
  213.   order_array_rsv_end(FixedOrders, FixedOrder);
  214.   FixedOrders[InstrZ].CPUMask = NMask;
  215.   FixedOrders[InstrZ].Code = NCode;
  216.   FixedOrders[InstrZ].MinArg = NMin;
  217.   FixedOrders[InstrZ].MaxArg = NMax;
  218.   AddInstTable(InstTable, NName, InstrZ++, DecodeFixed);
  219. }
  220.  
  221. static void InitFields(void)
  222. {
  223.   InstTable = CreateInstTable(301);
  224.  
  225.   InstrZ = 0;
  226.  
  227.   AddInstTable(InstTable, "DC", 0, DecodeDC);
  228.   AddInstTable(InstTable, "DC8", 0, DecodeDC);
  229.   AddInstTable(InstTable, "DW", 0, DecodeDW);
  230.   AddInstTable(InstTable, "DW16", 0, DecodeDW);
  231.   AddInstTable(InstTable, "DS", 0, DecodeDS);
  232.   AddInstTable(InstTable, "DS8", 0, DecodeDS);
  233.   AddInstTable(InstTable, "DS16", 0, DecodeDS16);
  234.  
  235.   /* standard set */
  236.  
  237.   AddFixed("BR"       , 0x01, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x01, 0xff);
  238.   AddFixed("BRK"      , 0x6e,                     M_14402 | M_14404 | M_14405                     | M_14422 | M_14424, 0x00, 0x00);
  239.   AddFixed("JMP"      , 0x02, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x01, 0xff);
  240.   AddFixed("JMP1"     , 0x03, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x01, 0xff);
  241.   AddFixed("RTN"      , 0x04, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  242.   AddFixed("WNT"      , 0x08, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x01, 0xff);
  243.   AddFixed("WT"       , 0x09, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x01, 0xff);
  244.   AddFixed("WSC"      , 0x48,                               M_14404 | M_14405           | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  245.   AddFixed("RFEN"     , 0x0b, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  246.   AddFixed("RFDIS"    , 0x0a, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  247.   AddFixed("BK_A"     , 0x0e, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  248.   AddFixed("BK_A1"    , 0x05,                               M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  249.   AddFixed("BK_C"     , 0x0f, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  250.   AddFixed("SLOTZERO" , 0x0d, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  251.   AddFixed("EN_SL_ADJ", 0x2c, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  252.   AddFixed("WNTP1"    , 0x07, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  253.   AddFixed("WNTM1"    , 0x06, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  254.   AddFixed("LD_PTR"   , 0x0c,                     M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  255.   AddFixed("UNLCK"    , 0x28, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  256.   AddFixed("A_RX"     , 0x49,                               M_14404 | M_14405                     | M_14422 | M_14424, 0x00, 0xff);
  257.   AddFixed("A_TX"     , 0x4a,                               M_14404 | M_14405                     | M_14422 | M_14424, 0x00, 0xff);
  258.   AddFixed("A_MUTE"   , 0xc1, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  259.   AddFixed("A_MTOFF"  , 0xc9,                               M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  260.   AddFixed("A_MUTE1"  , 0xca,                                                   M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  261.   AddFixed("A_MTOFF1" , 0xcb,                                                   M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  262.   AddFixed("A_STOFF"  , 0xc2, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  263.   AddFixed("A_STON"   , 0xcc,                     M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  264.   AddFixed("A_RCV0"   , 0x80, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  265.   AddFixed("A_RCV36"  , 0x82, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  266.   AddFixed("A_RCV30"  , 0x83, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  267.   AddFixed("A_RCV24"  , 0x84, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  268.   AddFixed("A_RCV18"  , 0x85, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  269.   AddFixed("A_RCV12"  , 0x86, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  270.   AddFixed("A_RCV6"   , 0x87, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  271.   AddFixed("A_RCV33"  , 0x8a, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  272.   AddFixed("A_RCV27"  , 0x8b, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  273.   AddFixed("A_RCV21"  , 0x8c, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  274.   AddFixed("A_RCV15"  , 0x8d, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  275.   AddFixed("A_RCV9"   , 0x8e, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  276.   AddFixed("A_RCV3"   , 0x8f, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  277.   AddFixed("A_NORM"   , 0xc5, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  278.   AddFixed("A_RST"    , 0xc0, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  279.   AddFixed("A_LDR"    , 0xc6, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  280.   AddFixed("A_LDW"    , 0xc7, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  281.   AddFixed("A_RST1"   , 0xeb,                                                   M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  282.   AddFixed("A_LDR1"   , 0xce,                               M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  283.   AddFixed("A_LDW1"   , 0xcf,                               M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  284.   AddFixed("A_ST18"   , 0xe1,                     M_14402                                                            , 0x00, 0x00);
  285.   AddFixed("B_ST"     , 0x31, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  286.   AddFixed("B_ST2"    , 0x21,           M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  287.   AddFixed("B_PPT"    , 0x22,                               M_14404 | M_14405                               | M_14424, 0x00, 0x00);
  288.   AddFixed("B_ZT"     , 0x22, M_14400                                                                                , 0x00, 0x00);
  289.   AddFixed("B_ZR"     , 0x2a, M_14400                                                                                , 0x00, 0x00);
  290.   AddFixed("B_AT"     , 0x32, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  291.   AddFixed("B_AT2"    , 0x37,           M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  292.   AddFixed("B_BT"     , 0x34, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  293.   AddFixed("B_BTFM"   , 0x23,                               M_14404 | M_14405                               | M_14424, 0x00, 0xff);
  294.   AddFixed("B_BTFU"   , 0x25,           M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  295.   AddFixed("B_BTFP"   , 0x35,           M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  296.   AddFixed("B_BTDU"   , 0x71,                               M_14404 | M_14405                               | M_14424, 0x00, 0xff);
  297.   AddFixed("B_BTDP"   , 0x72,                               M_14404 | M_14405                               | M_14424, 0x00, 0xff);
  298.   AddFixed("B_XON"    , 0x27, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  299.   AddFixed("B_XOFF"   , 0x26, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  300.   AddFixed("B_SR"     , 0x29, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  301.   AddFixed("B_AR"     , 0x3a, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  302.   AddFixed("B_AR2"    , 0x3f,           M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  303.   AddFixed("B_RON"    , 0x2f, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  304.   AddFixed("B_RINV"   , 0x2e, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  305.   AddFixed("B_BR"     , 0x3c, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  306.   AddFixed("B_BRFU"   , 0x2d,           M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  307.   AddFixed("B_BRFP"   , 0x3d,           M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  308.   AddFixed("B_BRFD"   , 0x2a,                               M_14404 | M_14405                               | M_14424, 0x00, 0xff);
  309.   AddFixed("B_BRDU"   , 0x79,                               M_14404 | M_14405                               | M_14424, 0x00, 0xff);
  310.   AddFixed("B_BRDP"   , 0x7a,                               M_14404 | M_14405                               | M_14424, 0x00, 0xff);
  311.   AddFixed("B_XR"     , 0x2b, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  312.   AddFixed("B_XT"     , 0x24, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  313.   AddFixed("B_WB_ON"  , 0x65,                     M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  314.   AddFixed("B_WB_OFF" , 0x64,                     M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  315.   AddFixed("B_WRS"    , 0x39, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  316.   AddFixed("B_RC"     , 0x33, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  317.   AddFixed("B_RST"    , 0x20, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  318.   AddFixed("B_DIV1"   , 0x4f,                                         M_14405                                        , 0x00, 0x00);
  319.   AddFixed("B_DIV2"   , 0x4e,                                         M_14405                                        , 0x00, 0x00);
  320.   AddFixed("B_DIV4"   , 0x4d,                                         M_14405                                        , 0x00, 0x00);
  321.   AddFixed("C_LD"     , 0xfa,           M_14401 | M_14402                     | M_14420 | M_14421 | M_14422          , 0x00, 0xff);
  322.   AddFixed("C_ON"     , 0xee,                                                   M_14420 | M_14421 | M_14422          , 0x00, 0x00);
  323.   AddFixed("C_OFF"    , 0xef,                                                   M_14420 | M_14421 | M_14422          , 0x00, 0x00);
  324.   AddFixed("C_LD2"    , 0xba,                                                                                 M_14424, 0x00, 0xff);
  325.   AddFixed("C_ON2"    , 0xae,                                                                                 M_14424, 0x00, 0x00);
  326.   AddFixed("C_OFF2"   , 0xaf,                                                                                 M_14424, 0x00, 0x00);
  327.   AddFixed("D_LDK"    , 0x50, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  328.   AddFixed("D_PREP"   , 0x44, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  329.   AddFixed("D_WRS"    , 0x5f, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  330.   AddFixed("D_LDS"    , 0x57, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  331.   AddFixed("D_RST"    , 0x40, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  332.   AddFixed("M_WR"     , 0xb9, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  333.   AddFixed("M_RST"    , 0xa9, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  334.   AddFixed("M_INI0"   , 0xa0,                               M_14404 | M_14405                               | M_14424, 0x00, 0x00);
  335.   AddFixed("M_INI1"   , 0xa1,                               M_14404 | M_14405                               | M_14424, 0x00, 0x00);
  336.   AddFixed("MEN1N"    , 0xa4, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  337.   AddFixed("MEN1"     , 0xa5, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  338.   AddFixed("P_EN"     , 0xe9,           M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  339.   AddFixed("P_LDH"    , 0xed,           M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  340.   AddFixed("P_LDL"    , 0xec,           M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  341.   AddFixed("P_LD"     , 0xe8,           M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  342.   AddFixed("P_SC"     , 0xea,           M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  343.   AddFixed("U_INT0"   , 0x61, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  344.   AddFixed("U_INT1"   , 0x6b, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  345.   AddFixed("U_INT2"   , 0x6d, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  346.   AddFixed("U_INT3"   , 0x6f, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  347.   AddFixed("U_PSC"    , 0x60, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  348.   AddFixed("U_VINT"   , 0x63,                               M_14404 | M_14405                     | M_14422 | M_14424, 0x00, 0xff);
  349.  
  350.   /* obsolete stuff - argument range may be incorrect */
  351.  
  352.   AddFixed("D_ON"     , 0x42, M_14400 | M_14401                               | M_14420 | M_14421                    , 0x00, 0x00);
  353.   AddFixed("D_OFF"    , 0x43, M_14400 | M_14401                               | M_14420 | M_14421                    , 0x00, 0x00);
  354.   AddFixed("RCK_INT"  , 0x62,                                                   M_14420 | M_14421                    , 0x00, 0x00);
  355.   AddFixed("CLK1"     , 0x66,                                                   M_14420 | M_14421                    , 0x00, 0x00);
  356.   AddFixed("CLK3"     , 0x67,                                                   M_14420 | M_14421                    , 0x00, 0x00);
  357.   AddFixed("U_CK8"    , 0x68, M_14400 | M_14401                               | M_14420 | M_14421                    , 0x00, 0x00);
  358.   AddFixed("U_CK4"    , 0x69, M_14400 | M_14401                               | M_14420 | M_14421                    , 0x00, 0x00);
  359.   AddFixed("U_CK2"    , 0x6a, M_14400 | M_14401                               | M_14420 | M_14421                    , 0x00, 0x00);
  360.   AddFixed("U_CK1"    , 0x6c, M_14400 | M_14401                               | M_14420 | M_14421                    , 0x00, 0x00);
  361.   AddFixed("MEN3N"    , 0xa2, M_14400 | M_14401                               | M_14420 | M_14421                    , 0x00, 0x00);
  362.   AddFixed("MEN3"     , 0xa3, M_14400 | M_14401                               | M_14420 | M_14421                    , 0x00, 0x00);
  363.   AddFixed("MEN2N"    , 0xa6, M_14400 | M_14401                               | M_14420 | M_14421                    , 0x00, 0x00);
  364.   AddFixed("MEN2"     , 0xa7, M_14400 | M_14401                               | M_14420 | M_14421                    , 0x00, 0x00);
  365.   AddFixed("M_RD"     , 0xa8, M_14400 | M_14401                               | M_14420 | M_14421                    , 0x00, 0xff);
  366.   AddFixed("M_WRS"    , 0xb8, M_14400                                         | M_14420 | M_14421                    , 0x00, 0xff);
  367.   AddFixed("A_ALAW"   , 0xc3, M_14400 | M_14401                               | M_14420 | M_14421                    , 0x00, 0x00);
  368.   AddFixed("A_DT"     , 0xc4, M_14400 | M_14401                               | M_14420 | M_14421                    , 0x00, 0x00);
  369.   AddFixed("A_LIN"    , 0xc8,                                                   M_14420 | M_14421                    , 0x00, 0x00);
  370.   AddFixed("A_DT1"    , 0xcd,                                                   M_14420 | M_14421                    , 0x00, 0x00);
  371.   AddFixed("A_STRN"   , 0xe0,                                                   M_14420 | M_14421                    , 0x00, 0x00);
  372.   AddFixed("RCK_EXT"  , 0x63,                                                   M_14420 | M_14421                    , 0x00, 0xff);
  373.   AddFixed("P_SPD0"   , 0xe8, M_14400                                                                                , 0x00, 0xff);
  374.   AddFixed("P_SPD1"   , 0xe9, M_14400                                                                                , 0x00, 0xff);
  375.   AddFixed("P_SPD2"   , 0xea, M_14400                                                                                , 0x00, 0xff);
  376.   AddFixed("P_SPD3"   , 0xeb, M_14400                                                                                , 0x00, 0xff);
  377.   AddFixed("P_SPD4"   , 0xec, M_14400                                                                                , 0x00, 0xff);
  378.   AddFixed("P_SPD5"   , 0xed, M_14400                                                                                , 0x00, 0xff);
  379.   AddFixed("P_SPD6"   , 0xee, M_14400                                                                                , 0x00, 0xff);
  380.   AddFixed("P_SPD7"   , 0xef, M_14400                                                                                , 0x00, 0xff);
  381.   AddFixed("P_RPD0"   , 0xe0, M_14400                                                                                , 0x00, 0xff);
  382.   AddFixed("P_RPD1"   , 0xe1, M_14400                                                                                , 0x00, 0xff);
  383.   AddFixed("P_RPD2"   , 0xe2, M_14400                                                                                , 0x00, 0xff);
  384.   AddFixed("P_RPD3"   , 0xe3, M_14400                                                                                , 0x00, 0xff);
  385.   AddFixed("P_RPD4"   , 0xe4, M_14400                                                                                , 0x00, 0xff);
  386.   AddFixed("P_RPD5"   , 0xe5, M_14400                                                                                , 0x00, 0xff);
  387.   AddFixed("P_RPD6"   , 0xe6, M_14400                                                                                , 0x00, 0xff);
  388.   AddFixed("P_RPD7"   , 0xe7, M_14400                                                                                , 0x00, 0xff);
  389.  
  390.   /* aliases */
  391.  
  392.   AddFixed("B_TX"     , 0x31, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  393.   AddFixed("B_BT2"    , 0x25,           M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  394.   AddFixed("B_BR2"    , 0x2d,           M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  395.   AddFixed("B_BTP"    , 0x35,           M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  396.   AddFixed("B_BRP"    , 0x3d,           M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0xff);
  397.   AddFixed("B_ON"     , 0x27, M_14400 | M_14401 | M_14402 | M_14404 | M_14405 | M_14420 | M_14421 | M_14422 | M_14424, 0x00, 0x00);
  398. }
  399.  
  400. static void DeinitFields(void)
  401. {
  402.   DestroyInstTable(InstTable);
  403.   order_array_free(FixedOrders);
  404. }
  405.  
  406. /*---------------------------------------------------------------------------*/
  407.  
  408. static void MakeCode_sc14xxx(void)
  409. {
  410.   /* Leeranweisung ignorieren */
  411.  
  412.   if (Memo("")) return;
  413.  
  414.   if (!LookupInstTable(InstTable, OpPart.str.p_str))
  415.     WrStrErrorPos(ErrNum_UnknownInstruction, &OpPart);
  416. }
  417.  
  418. static Boolean IsDef_sc14xxx(void)
  419. {
  420.   return FALSE;
  421. }
  422.  
  423. static void SwitchFrom_sc14xxx(void)
  424. {
  425.   DeinitFields();
  426. }
  427.  
  428. static void SwitchTo_sc14xxx(void)
  429. {
  430.   const TFamilyDescr *FoundDescr;
  431.  
  432.   FoundDescr = FindFamilyByName("SC14XXX");
  433.  
  434.   TurnWords = False; SetIntConstMode(eIntConstModeC);
  435.   PCSymbol = "$"; HeaderID = FoundDescr->Id; NOPCode = 0x0000;
  436.   DivideChars = ","; HasAttrs = False;
  437.  
  438.   ValidSegs = (1 << SegCode);
  439.   Grans[SegCode] = 2; ListGrans[SegCode] = 2; SegInits[SegCode] = 1;
  440.   SegLimits[SegCode] = 0xff;
  441.  
  442.   MakeCode=MakeCode_sc14xxx; IsDef = IsDef_sc14xxx;
  443.   SwitchFrom = SwitchFrom_sc14xxx;
  444.  
  445.   InitFields();
  446.   CurrMask = 1 << (MomCPU - CPU14400);
  447. }
  448.  
  449. /*---------------------------------------------------------------------------*/
  450.  
  451. void codesc14xxx_init(void)
  452. {
  453.   CPU14400 = AddCPU("SC14400", SwitchTo_sc14xxx);
  454.   CPU14401 = AddCPU("SC14401", SwitchTo_sc14xxx);
  455.   CPU14402 = AddCPU("SC14402", SwitchTo_sc14xxx);
  456.   CPU14404 = AddCPU("SC14404", SwitchTo_sc14xxx);
  457.   CPU14405 = AddCPU("SC14405", SwitchTo_sc14xxx);
  458.   CPU14420 = AddCPU("SC14420", SwitchTo_sc14xxx);
  459.   CPU14421 = AddCPU("SC14421", SwitchTo_sc14xxx);
  460.   CPU14422 = AddCPU("SC14422", SwitchTo_sc14xxx);
  461.   CPU14424 = AddCPU("SC14424", SwitchTo_sc14xxx);
  462. }
  463.