home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 2 / 2187 < prev    next >
Internet Message Format  |  1990-12-28  |  41KB

  1. From: markz@ssc.UUCP (Mark Zenier)
  2. Newsgroups: alt.sources
  3. Subject: Frankenstein Cross Assemblers, Intel 8048 "Flavor", Part 2 of 2
  4. Message-ID: <597@ssc.UUCP>
  5. Date: 4 Dec 90 08:16:44 GMT
  6.  
  7. ---- Cut Here and feed the following to sh ----
  8. #!/bin/sh
  9. # This is part 02 of Frankasm/As8048
  10. # ============= as8048.y ==============
  11. if test -f 'as8048.y' -a X"$1" != X"-c"; then
  12.     echo 'x - skipping as8048.y (File already exists)'
  13. else
  14. echo 'x - extracting as8048.y (Text)'
  15. sed 's/^X//' << 'SHAR_EOF' > 'as8048.y' &&
  16. X%{
  17. X
  18. X/*
  19. XHEADER:     ;
  20. XTITLE:         Frankenstein Cross Assemblers;
  21. XVERSION:     2.0;
  22. XDESCRIPTION: "    Reconfigurable Cross-assembler producing Intel (TM)
  23. X        Hex format object records.  ";
  24. XKEYWORDS:     cross-assemblers, 1805, 2650, 6301, 6502, 6805, 6809, 
  25. X        6811, tms7000, 8048, 8051, 8096, z8, z80;
  26. XSYSTEM:     UNIX, MS-Dos ;
  27. XFILENAME:     as8048.y;
  28. XWARNINGS:     "This software is in the public domain.  
  29. X        Any prior copyright claims are relinquished.  
  30. X
  31. X        This software is distributed with no warranty whatever.  
  32. X        The author takes no responsibility for the consequences 
  33. X        of its use.
  34. X
  35. X        Yacc (or Bison) required to compile."  ;
  36. XSEE-ALSO:     as8048.doc,frasmain.c;    
  37. XAUTHORS:     Mark Zenier;
  38. XCOMPILERS:     Microport Sys V/AT, ATT Yacc, Turbo C V1.5, Bison (CUG disk 285)
  39. X        (previous versions Xenix, Unisoft 68000 Version 7, Sun 3);
  40. X*/
  41. X/* 8048  et al  instruction generation file */
  42. X/* November 17, 1990 */
  43. X
  44. X/*
  45. X    description    frame work parser description for framework cross
  46. X            assemblers
  47. X    history        February 2, 1988
  48. X            September 11, 1990 - merge table definition
  49. X            September 12, 1990 - short file names
  50. X            September 14, 1990 - short variable names
  51. X            September 17, 1990 - use yylex as external
  52. X*/
  53. X#include <stdio.h>
  54. X#include "frasmdat.h"
  55. X#include "fragcon.h"
  56. X
  57. X#define yylex lexintercept
  58. X
  59. X/* 0000.0000.0000.xxxx  interrupt selections */
  60. X#define    ISELMASK    0xf
  61. X#define    ISELI        0x1
  62. X#define    ISELTCNTI    0x2
  63. X#define    ISELDMA        0x4
  64. X#define    ISELFLAGS    0x8
  65. X/* 0000.0000.0000.xxxx  accum-flag selections */
  66. X#define    AFSELMASK    0xf
  67. X#define    AFSELA        0x1
  68. X#define    AFSELC        0x2
  69. X#define    AFSELF0        0x4
  70. X#define    AFSELF1        0x8
  71. X/* 0000.0000.xxxx.0000  low port selections */
  72. X#define    PSELMASK    0xf0
  73. X#define    PSELBUS        0x10
  74. X#define    PSELP1        0x20
  75. X#define    PSELP2        0x40
  76. X#define    PSELDBB        0x80
  77. X/* 0000.00xx.xxxx.0000  misc register selections */
  78. X#define    MSELMASK    0x3f0
  79. X#define    MSELPSW        0x10
  80. X#define    MSELT        0x20
  81. X#define    MSELCNT        0x40
  82. X#define    MSELTCNT    0x80
  83. X#define    MSELCLK        0x100
  84. X#define    MSELSTS        0x200
  85. X/* 0000.xx00.0000.0000  ram size */
  86. X#define    RAMSIZEMASK    0xc00
  87. X#define    RAMSIZE64    0x400
  88. X#define    RAMSIZE128    0x800
  89. X#define    RAMSIZE256    0xc00
  90. X/* xxx0.0000.0000.0000  instruction set variations */
  91. X#define    INSTIDL        0x8000
  92. X#define    INSTNOT41    0x4000
  93. X#define    INST41        0x2000
  94. X#define    CPU8048        INSTNOT41|RAMSIZE64
  95. X#define    CPU8049        INSTNOT41|RAMSIZE128
  96. X#define    CPU8050        INSTNOT41|RAMSIZE256
  97. X#define    CPU80C48    INSTNOT41|INSTIDL|RAMSIZE64
  98. X#define    CPU80C49    INSTNOT41|INSTIDL|RAMSIZE128
  99. X#define    CPU80C50    INSTNOT41|INSTIDL|RAMSIZE256
  100. X#define    CPU8041        INST41|RAMSIZE64
  101. X#define    CPU8042        INST41|RAMSIZE128
  102. X#define ST_AF 0x1
  103. X#define ST_REG 0x2
  104. X#define ST_EXPR 0x4
  105. X#define ST_AR 0x8
  106. X#define ST_AINDIRR 0x10
  107. X#define ST_AIMMED 0x20
  108. X#define ST_INDIRA 0x40
  109. X#define ST_INDIRR 0x80
  110. X#define ST_REGEXP 0x100
  111. X#define ST_PA2 0x200
  112. X#define ST_PA4 0x400
  113. X#define ST_P2A 0x800
  114. X#define ST_P4A 0x1000
  115. X#define ST_P2IMMED 0x2000
  116. X#define ST_INH 0x1
  117. X#define ST_INT 0x2
  118. X#define ST_RSELC 0x4
  119. X#define ST_MSELC 0x8
  120. X#define ST_MREG 0x10
  121. X#define ST_MAR 0x1
  122. X#define ST_MAINDIRA 0x2
  123. X#define ST_MAINDIRR 0x4
  124. X#define ST_MAIMMED 0x8
  125. X#define ST_MAMR 0x10
  126. X#define ST_MMRA 0x20
  127. X#define ST_MRA 0x40
  128. X#define ST_MRIMMED 0x80
  129. X#define ST_MINDIRRA 0x100
  130. X#define ST_MINDIRRIM 0x200
  131. X    
  132. X    static char    genbdef[] = "[1=];";
  133. X    static char    genwdef[] = "[1=]y"; /* x for normal, y for byte rev */
  134. X    char ignosyn[] = "[Xinvalid syntax for instruction";
  135. X    char ignosel[] = "[Xinvalid operands/illegal instruction for cpu";
  136. X    int    cpuselect = CPU80C50;
  137. X
  138. X    long    labelloc;
  139. X    static int satsub;
  140. X    int    ifstkpt = 0;
  141. X    int    fraifskip = FALSE;
  142. X
  143. X    struct symel * endsymbol = SYMNULL;
  144. X
  145. X%}
  146. X%union {
  147. X    int    intv;
  148. X    long     longv;
  149. X    char    *strng;
  150. X    struct symel *symb;
  151. X}
  152. X
  153. X%token <intv> RSELC
  154. X%token <intv> MSELC
  155. X%token <intv> INT
  156. X%token <intv> AF
  157. X%token <intv> REG
  158. X%token <intv> P02
  159. X%token <intv> P47
  160. X%token <intv> MREG
  161. X%token <intv> KOC_BDEF
  162. X%token <intv> KOC_ELSE
  163. X%token <intv> KOC_END
  164. X%token <intv> KOC_ENDI
  165. X%token <intv> KOC_EQU
  166. X%token <intv> KOC_IF
  167. X%token <intv> KOC_INCLUDE
  168. X%token <intv> KOC_ORG
  169. X%token <intv> KOC_RESM
  170. X%token <intv> KOC_SDEF
  171. X%token <intv> KOC_SET
  172. X%token <intv> KOC_WDEF
  173. X%token <intv> KOC_CHSET
  174. X%token <intv> KOC_CHDEF
  175. X%token <intv> KOC_CHUSE
  176. X%token <intv> KOC_CPU
  177. X%token <intv> KOC_REG
  178. X%token <intv> KOC_opcode
  179. X%token <intv> KOC_misc
  180. X%token <intv> KOC_mov
  181. X
  182. X%token <longv> CONSTANT
  183. X%token EOL
  184. X%token KEOP_AND
  185. X%token KEOP_DEFINED
  186. X%token KEOP_EQ
  187. X%token KEOP_GE
  188. X%token KEOP_GT
  189. X%token KEOP_HIGH
  190. X%token KEOP_LE
  191. X%token KEOP_LOW
  192. X%token KEOP_LT
  193. X%token KEOP_MOD
  194. X%token KEOP_MUN
  195. X%token KEOP_NE
  196. X%token KEOP_NOT
  197. X%token KEOP_OR
  198. X%token KEOP_SHL
  199. X%token KEOP_SHR
  200. X%token KEOP_XOR
  201. X%token KEOP_locctr
  202. X%token <symb> LABEL
  203. X%token <strng> STRING
  204. X%token <symb> SYMBOL
  205. X
  206. X%token KTK_invalid
  207. X
  208. X%right    KEOP_HIGH KEOP_LOW
  209. X%left    KEOP_OR KEOP_XOR
  210. X%left    KEOP_AND
  211. X%right    KEOP_NOT
  212. X%nonassoc    KEOP_GT KEOP_GE KEOP_LE KEOP_LT KEOP_NE KEOP_EQ
  213. X%left    '+' '-'
  214. X%left    '*' '/' KEOP_MOD KEOP_SHL KEOP_SHR
  215. X%right    KEOP_MUN
  216. X
  217. X
  218. X%type <intv> expr exprlist stringlist
  219. X
  220. X%start file
  221. X
  222. X%%
  223. X
  224. Xfile    :    file allline
  225. X    |    allline
  226. X    ;
  227. X
  228. Xallline    :     line EOL
  229. X            {
  230. X                clrexpr();
  231. X            }
  232. X    |    EOL
  233. X    |    error EOL
  234. X            {
  235. X                clrexpr();
  236. X                yyerrok;
  237. X            }
  238. X    ;
  239. X
  240. Xline    :    LABEL KOC_END 
  241. X            {
  242. X                endsymbol = $1;
  243. X                nextreadact = Nra_end;
  244. X            }
  245. X    |          KOC_END 
  246. X            {
  247. X                nextreadact = Nra_end;
  248. X            }
  249. X    |    KOC_INCLUDE STRING
  250. X            {
  251. X        if(nextfstk >= FILESTKDPTH)
  252. X        {
  253. X            fraerror("include file nesting limit exceeded");
  254. X        }
  255. X        else
  256. X        {
  257. X            infilestk[nextfstk].fnm = savestring($2,strlen($2));
  258. X            if( (infilestk[nextfstk].fpt = fopen($2,"r"))
  259. X                ==(FILE *)NULL )
  260. X            {
  261. X                fraerror("cannot open include file");
  262. X            }
  263. X            else
  264. X            {
  265. X                nextreadact = Nra_new;
  266. X            }
  267. X        }
  268. X            }
  269. X    |    LABEL KOC_EQU expr 
  270. X            {
  271. X                if($1 -> seg == SSG_UNDEF)
  272. X                {
  273. X                    pevalexpr(0, $3);
  274. X                    if(evalr[0].seg == SSG_ABS)
  275. X                    {
  276. X                        $1 -> seg = SSG_EQU;
  277. X                        $1 -> value = evalr[0].value;
  278. X                        prtequvalue("C: 0x%lx\n",
  279. X                            evalr[0].value);
  280. X                    }
  281. X                    else
  282. X                    {
  283. X                        fraerror(
  284. X                    "noncomputable expression for EQU");
  285. X                    }
  286. X                }
  287. X                else
  288. X                {
  289. X                    fraerror(
  290. X                "cannot change symbol value with EQU");
  291. X                }
  292. X            }
  293. X    |    LABEL KOC_SET expr 
  294. X            {
  295. X                if($1 -> seg == SSG_UNDEF
  296. X                   || $1 -> seg == SSG_SET)
  297. X                {
  298. X                    pevalexpr(0, $3);
  299. X                    if(evalr[0].seg == SSG_ABS)
  300. X                    {
  301. X                        $1 -> seg = SSG_SET;
  302. X                        $1 -> value = evalr[0].value;
  303. X                        prtequvalue("C: 0x%lx\n",
  304. X                            evalr[0].value);
  305. X                    }
  306. X                    else
  307. X                    {
  308. X                        fraerror(
  309. X                    "noncomputable expression for SET");
  310. X                    }
  311. X                }
  312. X                else
  313. X                {
  314. X                    fraerror(
  315. X                "cannot change symbol value with SET");
  316. X                }
  317. X            }
  318. X    |    KOC_IF expr 
  319. X            {
  320. X        if((++ifstkpt) < IFSTKDEPTH)
  321. X        {
  322. X            pevalexpr(0, $2);
  323. X            if(evalr[0].seg == SSG_ABS)
  324. X            {
  325. X                if(evalr[0].value != 0)
  326. X                {
  327. X                    elseifstk[ifstkpt] = If_Skip;
  328. X                    endifstk[ifstkpt] = If_Active;
  329. X                }
  330. X                else
  331. X                {
  332. X                    fraifskip = TRUE;
  333. X                    elseifstk[ifstkpt] = If_Active;
  334. X                    endifstk[ifstkpt] = If_Active;
  335. X                }
  336. X            }
  337. X            else
  338. X            {
  339. X                fraifskip = TRUE;
  340. X                elseifstk[ifstkpt] = If_Active;
  341. X                endifstk[ifstkpt] = If_Active;
  342. X            }
  343. X        }
  344. X        else
  345. X        {
  346. X            fraerror("IF stack overflow");
  347. X        }
  348. X            }
  349. X                        
  350. X    |    KOC_IF 
  351. X            {
  352. X        if(fraifskip) 
  353. X        {
  354. X            if((++ifstkpt) < IFSTKDEPTH)
  355. X            {
  356. X                    elseifstk[ifstkpt] = If_Skip;
  357. X                    endifstk[ifstkpt] = If_Skip;
  358. X            }
  359. X            else
  360. X            {
  361. X                fraerror("IF stack overflow");
  362. X            }
  363. X        }
  364. X        else
  365. X        {
  366. X            yyerror("syntax error");
  367. X            YYERROR;
  368. X        }
  369. X                }
  370. X                        
  371. X    |    KOC_ELSE 
  372. X            {
  373. X                switch(elseifstk[ifstkpt])
  374. X                {
  375. X                case If_Active:
  376. X                    fraifskip = FALSE;
  377. X                    break;
  378. X                
  379. X                case If_Skip:
  380. X                    fraifskip = TRUE;
  381. X                    break;
  382. X                
  383. X                case If_Err:
  384. X                    fraerror("ELSE with no matching if");
  385. X                    break;
  386. X                }
  387. X            }
  388. X
  389. X    |    KOC_ENDI 
  390. X            {
  391. X                switch(endifstk[ifstkpt])
  392. X                {
  393. X                case If_Active:
  394. X                    fraifskip = FALSE;
  395. X                    ifstkpt--;
  396. X                    break;
  397. X                
  398. X                case If_Skip:
  399. X                    fraifskip = TRUE;
  400. X                    ifstkpt--;
  401. X                    break;
  402. X                
  403. X                case If_Err:
  404. X                    fraerror("ENDI with no matching if");
  405. X                    break;
  406. X                }
  407. X            }
  408. X    |    LABEL KOC_ORG expr 
  409. X            {
  410. X                pevalexpr(0, $3);
  411. X                if(evalr[0].seg == SSG_ABS)
  412. X                {
  413. X                    locctr = labelloc = evalr[0].value;
  414. X                    if($1 -> seg == SSG_UNDEF)
  415. X                    {
  416. X                        $1 -> seg = SSG_ABS;
  417. X                        $1 -> value = labelloc;
  418. X                    }
  419. X                    else
  420. X                        fraerror(
  421. X                        "multiple definition of label");
  422. X                    prtequvalue("C: 0x%lx\n",
  423. X                        evalr[0].value);
  424. X                }
  425. X                else
  426. X                {
  427. X                    fraerror(
  428. X                     "noncomputable expression for ORG");
  429. X                }
  430. X            }
  431. X    |          KOC_ORG expr 
  432. X            {
  433. X                pevalexpr(0, $2);
  434. X                if(evalr[0].seg == SSG_ABS)
  435. X                {
  436. X                    locctr = labelloc = evalr[0].value;
  437. X                    prtequvalue("C: 0x%lx\n",
  438. X                        evalr[0].value);
  439. X                }
  440. X                else
  441. X                {
  442. X                    fraerror(
  443. X                     "noncomputable expression for ORG");
  444. X                }
  445. X            }
  446. X    |    LABEL KOC_CHSET
  447. X            {
  448. X                if($1 -> seg == SSG_UNDEF)
  449. X                {
  450. X                    $1 -> seg = SSG_EQU;
  451. X                    if( ($1->value = chtcreate()) <= 0)
  452. X                    {
  453. X        fraerror( "cannot create character translation table");
  454. X                    }
  455. X                    prtequvalue("C: 0x%lx\n", $1 -> value);
  456. X                }
  457. X                else
  458. X                {
  459. X            fraerror( "multiple definition of label");
  460. X                }
  461. X            }
  462. X    |        KOC_CHUSE
  463. X            {
  464. X                chtcpoint = (int *) NULL;
  465. X                prtequvalue("C: 0x%lx\n", 0L);
  466. X            }
  467. X    |        KOC_CHUSE expr
  468. X            {
  469. X                pevalexpr(0, $2);
  470. X                if( evalr[0].seg == SSG_ABS)
  471. X                {
  472. X                    if( evalr[0].value == 0)
  473. X                    {
  474. X                        chtcpoint = (int *)NULL;
  475. X                        prtequvalue("C: 0x%lx\n", 0L);
  476. X                    }
  477. X                    else if(evalr[0].value < chtnxalph)
  478. X                    {
  479. X                chtcpoint = chtatab[evalr[0].value];
  480. X                prtequvalue("C: 0x%lx\n", evalr[0].value);
  481. X                    }
  482. X                    else
  483. X                    {
  484. X            fraerror("nonexistent character translation table");
  485. X                    }
  486. X                }
  487. X                else
  488. X                {
  489. X                    fraerror("noncomputable expression");
  490. X                }
  491. X            }
  492. X    |        KOC_CHDEF STRING ',' exprlist
  493. X            {
  494. X        int findrv, numret, *charaddr;
  495. X        char *sourcestr = $2, *before;
  496. X
  497. X        if(chtnpoint != (int *)NULL)
  498. X        {
  499. X            for(satsub = 0; satsub < $4; satsub++)
  500. X            {
  501. X                before = sourcestr;
  502. X
  503. X                pevalexpr(0, exprlist[satsub]);
  504. X                findrv = chtcfind(chtnpoint, &sourcestr,
  505. X                        &charaddr, &numret);
  506. X                if(findrv == CF_END)
  507. X                {
  508. X            fraerror("more expressions than characters");
  509. X                    break;
  510. X                }
  511. X
  512. X                if(evalr[0].seg == SSG_ABS)
  513. X                {
  514. X                    switch(findrv)
  515. X                    {
  516. X                    case CF_UNDEF:
  517. X                        {
  518. X                if(evalr[0].value < 0 ||
  519. X                    evalr[0].value > 255)
  520. X                {
  521. X            frawarn("character translation value truncated");
  522. X                }
  523. X                *charaddr = evalr[0].value & 0xff;
  524. X                prtequvalue("C: 0x%lx\n", evalr[0].value);
  525. X                        }
  526. X                        break;
  527. X
  528. X                    case CF_INVALID:
  529. X                    case CF_NUMBER:
  530. X                fracherror("invalid character to define", 
  531. X                    before, sourcestr);
  532. X                        break;
  533. X
  534. X                    case CF_CHAR:
  535. X                fracherror("character already defined", 
  536. X                    before, sourcestr);
  537. X                        break;
  538. X                    }
  539. X                }
  540. X                else
  541. X                {
  542. X                    fraerror("noncomputable expression");
  543. X                }
  544. X            }
  545. X
  546. X            if( *sourcestr != '\0')
  547. X            {
  548. X                fraerror("more characters than expressions");
  549. X            }
  550. X        }
  551. X        else
  552. X        {
  553. X            fraerror("no CHARSET statement active");
  554. X        }
  555. X            
  556. X            }
  557. X    |    LABEL 
  558. X            {
  559. X            if($1 -> seg == SSG_UNDEF)
  560. X            {
  561. X                $1 -> seg = SSG_ABS;
  562. X                $1 -> value = labelloc;
  563. X                prtequvalue("C: 0x%lx\n", labelloc);
  564. X
  565. X            }
  566. X            else
  567. X                fraerror(
  568. X                "multiple definition of label");
  569. X            }
  570. X    |    labeledline
  571. X    ;
  572. X
  573. Xlabeledline :    LABEL genline
  574. X            {
  575. X            if($1 -> seg == SSG_UNDEF)
  576. X            {
  577. X                $1 -> seg = SSG_ABS;
  578. X                $1 -> value = labelloc;
  579. X            }
  580. X            else
  581. X                fraerror(
  582. X                "multiple definition of label");
  583. X            labelloc = locctr;
  584. X            }
  585. X                
  586. X    |    genline
  587. X            {
  588. X                labelloc = locctr;
  589. X            }
  590. X    ;
  591. X
  592. Xgenline    :    KOC_BDEF    exprlist 
  593. X            {
  594. X                genlocrec(currseg, labelloc);
  595. X                for( satsub = 0; satsub < $2; satsub++)
  596. X                {
  597. X                    pevalexpr(1, exprlist[satsub]);
  598. X                    locctr += geninstr(genbdef);
  599. X                }
  600. X            }
  601. X    |    KOC_SDEF stringlist 
  602. X            {
  603. X                genlocrec(currseg, labelloc);
  604. X                for(satsub = 0; satsub < $2; satsub++)
  605. X                {
  606. X                    locctr += genstring(stringlist[satsub]);
  607. X                }
  608. X            }
  609. X    |    KOC_WDEF exprlist 
  610. X            {
  611. X                genlocrec(currseg, labelloc);
  612. X                for( satsub = 0; satsub < $2; satsub++)
  613. X                {
  614. X                    pevalexpr(1, exprlist[satsub]);
  615. X                    locctr += geninstr(genwdef);
  616. X                }
  617. X            }    
  618. X    |    KOC_RESM expr 
  619. X            {
  620. X                pevalexpr(0, $2);
  621. X                if(evalr[0].seg == SSG_ABS)
  622. X                {
  623. X                    locctr = labelloc + evalr[0].value;
  624. X                    prtequvalue("C: 0x%lx\n", labelloc);
  625. X                }
  626. X                else
  627. X                {
  628. X                    fraerror(
  629. X                 "noncomputable result for RMB expression");
  630. X                }
  631. X            }
  632. X    ;
  633. X
  634. Xexprlist :    exprlist ',' expr
  635. X            {
  636. X                exprlist[nextexprs ++ ] = $3;
  637. X                $$ = nextexprs;
  638. X            }
  639. X    |    expr
  640. X            {
  641. X                nextexprs = 0;
  642. X                exprlist[nextexprs ++ ] = $1;
  643. X                $$ = nextexprs;
  644. X            }
  645. X    ;
  646. X
  647. Xstringlist :    stringlist ',' STRING
  648. X            {
  649. X                stringlist[nextstrs ++ ] = $3;
  650. X                $$ = nextstrs;
  651. X            }
  652. X    |    STRING
  653. X            {
  654. X                nextstrs = 0;
  655. X                stringlist[nextstrs ++ ] = $1;
  656. X                $$ = nextstrs;
  657. X            }
  658. X    ;
  659. X
  660. X
  661. Xline    :    KOC_CPU STRING
  662. X            {
  663. X        if( ! cpumatch($2))
  664. X        {
  665. X            fraerror("unknown cpu type, 80C50 assumed");
  666. X            cpuselect = CPU80C50;
  667. X        }
  668. X            }
  669. X    ;
  670. Xline :        LABEL KOC_REG expr 
  671. X        {
  672. X            if($1 -> seg == SSG_UNDEF
  673. X               || $1 -> seg == SSG_SET)
  674. X            {
  675. X                pevalexpr(0, $3);
  676. X                if(evalr[0].seg == SSG_ABS)
  677. X                {
  678. X                    switch(cpuselect & RAMSIZEMASK)
  679. X                    {
  680. X                    case RAMSIZE64:
  681. X                        if(evalr[0].value < 0 ||
  682. X                           evalr[0].value > 63)
  683. X                        {
  684. X                            fraerror(
  685. X                    "unimplemented register address");
  686. X                        }
  687. X                        break;
  688. X
  689. X                    case RAMSIZE128:
  690. X                        if(evalr[0].value < 0 ||
  691. X                           evalr[0].value > 127)
  692. X                        {
  693. X                            fraerror(
  694. X                    "unimplemented register address");
  695. X                        }
  696. X                        break;
  697. X
  698. X                    case RAMSIZE256:
  699. X                        if(evalr[0].value < 0 ||
  700. X                           evalr[0].value > 255)
  701. X                        {
  702. X                            fraerror(
  703. X                    "unimplemented register address");
  704. X                        }
  705. X                        break;
  706. X
  707. X                    default:
  708. X                        break;
  709. X                    }
  710. X
  711. X                    $1 -> seg = SSG_SET;
  712. X                    $1 -> value = evalr[0].value;
  713. X                    prtequvalue("C: 0x%lx\n",
  714. X                        evalr[0].value);
  715. X                }
  716. X                else
  717. X                {
  718. X                    fraerror(
  719. X                "noncomputable expression for REGISTER SET");
  720. X                }
  721. X            }
  722. X            else
  723. X            {
  724. X                fraerror(
  725. X            "cannot change symbol value with REGISTER SET");
  726. X            }
  727. X        }
  728. X    ;
  729. Xgenline : KOC_opcode  AF
  730. X            {
  731. X        genlocrec(currseg, labelloc);
  732. X        locctr += geninstr(findgen($1, ST_AF,  $2|cpuselect));
  733. X            }
  734. X    ;
  735. Xgenline : KOC_opcode  REG
  736. X            {
  737. X        genlocrec(currseg, labelloc);
  738. X        evalr[1].value = $2;
  739. X        locctr += geninstr(findgen($1, ST_REG,  cpuselect));
  740. X            }
  741. X    ;
  742. Xgenline : KOC_opcode  expr
  743. X            {
  744. X        genlocrec(currseg, labelloc);
  745. X        pevalexpr(1, $2);
  746. X        locctr += geninstr(findgen($1, ST_EXPR,  cpuselect));
  747. X            }
  748. X    ;
  749. Xgenline : KOC_opcode  AF ',' REG
  750. X            {
  751. X        genlocrec(currseg, labelloc);
  752. X        evalr[1].value = $4;
  753. X        locctr += geninstr(findgen($1, ST_AR,  $2|cpuselect));
  754. X            }
  755. X    ;
  756. Xgenline : KOC_opcode  AF ',' '@' REG
  757. X            {
  758. X        genlocrec(currseg, labelloc);
  759. X        if($5 > 1)
  760. X        {
  761. X            fraerror("invalid register for indirect mode");
  762. X            evalr[1].value = 0;
  763. X        }
  764. X        else
  765. X        {
  766. X            evalr[1].value = $5;
  767. X        }
  768. X        locctr += geninstr(findgen($1, ST_AINDIRR,  $2|cpuselect));
  769. X            }
  770. X    ;
  771. Xgenline : KOC_opcode  AF ',' '#' expr
  772. X            {
  773. X        genlocrec(currseg, labelloc);
  774. X        pevalexpr(1, $5);
  775. X        locctr += geninstr(findgen($1, ST_AIMMED,  $2|cpuselect));
  776. X            }
  777. X    ;
  778. Xgenline : KOC_opcode  '@' AF
  779. X            {
  780. X        genlocrec(currseg, labelloc);
  781. X        locctr += geninstr(findgen($1, ST_INDIRA,  $3|cpuselect));
  782. X            }
  783. X    ;
  784. Xgenline : KOC_opcode  '@' REG
  785. X            {
  786. X        genlocrec(currseg, labelloc);
  787. X        if($3 > 1)
  788. X        {
  789. X            fraerror("invalid register for indirect mode");
  790. X            evalr[1].value = 0;
  791. X        }
  792. X        else
  793. X        {
  794. X            evalr[1].value = $3;
  795. X        }
  796. X        locctr += geninstr(findgen($1, ST_INDIRR,  cpuselect));
  797. X            }
  798. X    ;
  799. Xgenline : KOC_opcode  REG ',' expr
  800. X            {
  801. X        genlocrec(currseg, labelloc);
  802. X        evalr[1].value = $2;
  803. X        pevalexpr(2, $4);
  804. X        locctr += geninstr(findgen($1, ST_REGEXP,  cpuselect));
  805. X            }
  806. X    ;
  807. Xgenline : KOC_opcode  AF ',' P02
  808. X            {
  809. X        genlocrec(currseg, labelloc);
  810. X        locctr += geninstr(findgen($1, ST_PA2,  $2 | $4|cpuselect));
  811. X            }
  812. X    ;
  813. Xgenline : KOC_opcode  AF ',' P47 
  814. X            {
  815. X        genlocrec(currseg, labelloc);
  816. X        evalr[1].value = $4;
  817. X        locctr += geninstr(findgen($1, ST_PA4,  $2|cpuselect));
  818. X            }
  819. X    ;
  820. Xgenline : KOC_opcode  P02 ',' AF
  821. X            {
  822. X        genlocrec(currseg, labelloc);
  823. X        locctr += geninstr(findgen($1, ST_P2A,  $2 | $4|cpuselect));
  824. X            }
  825. X    ;
  826. Xgenline : KOC_opcode  P47 ',' AF
  827. X            {
  828. X        genlocrec(currseg, labelloc);
  829. X        evalr[1].value = $2;
  830. X        locctr += geninstr(findgen($1, ST_P4A,  $4|cpuselect));
  831. X            }
  832. X    ;
  833. Xgenline : KOC_opcode  P02 ',' '#' expr
  834. X            {
  835. X        genlocrec(currseg, labelloc);
  836. X        pevalexpr(1, $5);
  837. X        locctr += geninstr(findgen($1, ST_P2IMMED,  $2|cpuselect));
  838. X            }
  839. X    ;
  840. Xgenline : KOC_misc 
  841. X            {
  842. X        genlocrec(currseg, labelloc);
  843. X        locctr += geninstr(findgen($1, ST_INH,  cpuselect));
  844. X            }
  845. X    ;
  846. Xgenline : KOC_misc  INT
  847. X            {
  848. X        genlocrec(currseg, labelloc);
  849. X        locctr += geninstr(findgen($1, ST_INT,  $2|cpuselect));
  850. X            }
  851. X    ;
  852. Xgenline : KOC_misc  RSELC
  853. X            {
  854. X        genlocrec(currseg, labelloc);
  855. X        evalr[1].value = $2 << 4;
  856. X        locctr += geninstr(findgen($1, ST_RSELC,  cpuselect));
  857. X            }
  858. X    ;
  859. Xgenline : KOC_misc  MSELC
  860. X            {
  861. X        genlocrec(currseg, labelloc);
  862. X        evalr[1].value = $2 << 4;
  863. X        locctr += geninstr(findgen($1, ST_MSELC,  cpuselect));
  864. X            }
  865. X    ;
  866. Xgenline : KOC_misc  MREG
  867. X            {
  868. X        genlocrec(currseg, labelloc);
  869. X        locctr += geninstr(findgen($1, ST_MREG,  $2|cpuselect));
  870. X            }
  871. X    ;
  872. Xgenline : KOC_mov  AF ',' REG
  873. X            {
  874. X        genlocrec(currseg, labelloc);
  875. X        evalr[1].value = $4;
  876. X        locctr += geninstr(findgen($1, ST_MAR,  $2|cpuselect));
  877. X            }
  878. X    ;
  879. Xgenline : KOC_mov  AF ',' '@' AF
  880. X            {
  881. X        genlocrec(currseg, labelloc);
  882. X        locctr += geninstr(findgen($1, ST_MAINDIRA,  $2|$5|cpuselect));
  883. X            }
  884. X    ;
  885. Xgenline : KOC_mov  AF ',' '@' REG
  886. X            {
  887. X        genlocrec(currseg, labelloc);
  888. X        if($5 > 1)
  889. X        {
  890. X            fraerror("invalid register for indirect mode");
  891. X            evalr[1].value = 0;
  892. X        }
  893. X        else
  894. X        {
  895. X            evalr[1].value = $5;
  896. X        }
  897. X        locctr += geninstr(findgen($1, ST_MAINDIRR,  $2|cpuselect));
  898. X            }
  899. X    ;
  900. Xgenline : KOC_mov  AF ',' '#' expr
  901. X            {
  902. X        genlocrec(currseg, labelloc);
  903. X        pevalexpr(1, $5);
  904. X        locctr += geninstr(findgen($1, ST_MAIMMED,  $2|cpuselect));
  905. X            }
  906. X    ;
  907. Xgenline : KOC_mov  AF ',' MREG
  908. X            {
  909. X        genlocrec(currseg, labelloc);
  910. X        locctr += geninstr(findgen($1, ST_MAMR,  $2 | $4|cpuselect));
  911. X            }
  912. X    ;
  913. Xgenline : KOC_mov  MREG ',' AF
  914. X            {
  915. X        genlocrec(currseg, labelloc);
  916. X        locctr += geninstr(findgen($1, ST_MMRA,  $2 | $4|cpuselect));
  917. X            }
  918. X    ;
  919. Xgenline : KOC_mov  REG ',' AF
  920. X            {
  921. X        genlocrec(currseg, labelloc);
  922. X        evalr[1].value = $2;
  923. X        locctr += geninstr(findgen($1, ST_MRA,  $4|cpuselect));
  924. X            }
  925. X    ;
  926. Xgenline : KOC_mov  REG ',' '#' expr
  927. X            {
  928. X        genlocrec(currseg, labelloc);
  929. X        evalr[1].value = $2;
  930. X        pevalexpr(2, $5);
  931. X        locctr += geninstr(findgen($1, ST_MRIMMED,  cpuselect));
  932. X            }
  933. X    ;
  934. Xgenline : KOC_mov  '@' REG ',' AF
  935. X            {
  936. X        genlocrec(currseg, labelloc);
  937. X        if($3 > 1)
  938. X        {
  939. X            fraerror("invalid register for indirect mode");
  940. X            evalr[1].value = 0;
  941. X        }
  942. X        else
  943. X        {
  944. X            evalr[1].value = $3;
  945. X        }
  946. X        locctr += geninstr(findgen($1, ST_MINDIRRA,  $5|cpuselect));
  947. X            }
  948. X    ;
  949. Xgenline : KOC_mov  '@' REG ',' '#' expr
  950. X            {
  951. X        genlocrec(currseg, labelloc);
  952. X        if($3 > 1)
  953. X        {
  954. X            fraerror("invalid register for indirect mode");
  955. X            evalr[1].value = 0;
  956. X        }
  957. X        else
  958. X        {
  959. X            evalr[1].value = $3;
  960. X        }
  961. X        pevalexpr(2, $6);
  962. X        locctr += geninstr(findgen($1, ST_MINDIRRIM,  cpuselect));
  963. X            }
  964. X    ;
  965. Xexpr    :    '+' expr %prec KEOP_MUN
  966. X            {
  967. X                $$ = $2;
  968. X            }
  969. X    |    '-' expr %prec KEOP_MUN
  970. X            {
  971. X                $$ = exprnode(PCCASE_UN,$2,IFC_NEG,0,0L,
  972. X                    SYMNULL);
  973. X            }
  974. X    |    KEOP_NOT expr
  975. X            {
  976. X                $$ = exprnode(PCCASE_UN,$2,IFC_NOT,0,0L,
  977. X                    SYMNULL);
  978. X            }
  979. X    |    KEOP_HIGH expr
  980. X            {
  981. X                $$ = exprnode(PCCASE_UN,$2,IFC_HIGH,0,0L,
  982. X                    SYMNULL);
  983. X            }
  984. X    |    KEOP_LOW expr
  985. X            {
  986. X                $$ = exprnode(PCCASE_UN,$2,IFC_LOW,0,0L,
  987. X                    SYMNULL);
  988. X            }
  989. X    |    expr '*' expr
  990. X            {
  991. X                $$ = exprnode(PCCASE_BIN,$1,IFC_MUL,$3,0L,
  992. X                    SYMNULL);
  993. X            }
  994. X    |    expr '/' expr
  995. X            {
  996. X                $$ = exprnode(PCCASE_BIN,$1,IFC_DIV,$3,0L,
  997. X                    SYMNULL);
  998. X            }
  999. X    |    expr '+' expr
  1000. X            {
  1001. X                $$ = exprnode(PCCASE_BIN,$1,IFC_ADD,$3,0L,
  1002. X                    SYMNULL);
  1003. X            }
  1004. X    |    expr '-' expr
  1005. X            {
  1006. X                $$ = exprnode(PCCASE_BIN,$1,IFC_SUB,$3,0L,
  1007. X                    SYMNULL);
  1008. X            }
  1009. X    |    expr KEOP_MOD expr
  1010. X            {
  1011. X                $$ = exprnode(PCCASE_BIN,$1,IFC_MOD,$3,0L,
  1012. X                    SYMNULL);
  1013. X            }
  1014. X    |    expr KEOP_SHL expr
  1015. X            {
  1016. X                $$ = exprnode(PCCASE_BIN,$1,IFC_SHL,$3,0L,
  1017. X                    SYMNULL);
  1018. X            }
  1019. X    |    expr KEOP_SHR expr
  1020. X            {
  1021. X                $$ = exprnode(PCCASE_BIN,$1,IFC_SHR,$3,0L,
  1022. X                    SYMNULL);
  1023. X            }
  1024. X    |    expr KEOP_GT expr
  1025. X            {
  1026. X                $$ = exprnode(PCCASE_BIN,$1,IFC_GT,$3,0L,
  1027. X                    SYMNULL);
  1028. X            }
  1029. X    |    expr KEOP_GE expr
  1030. X            {
  1031. X                $$ = exprnode(PCCASE_BIN,$1,IFC_GE,$3,0L,
  1032. X                    SYMNULL);
  1033. X            }
  1034. X    |    expr KEOP_LT expr
  1035. X            {
  1036. X                $$ = exprnode(PCCASE_BIN,$1,IFC_LT,$3,0L,
  1037. X                    SYMNULL);
  1038. X            }
  1039. X    |    expr KEOP_LE expr
  1040. X            {
  1041. X                $$ = exprnode(PCCASE_BIN,$1,IFC_LE,$3,0L,
  1042. X                    SYMNULL);
  1043. X            }
  1044. X    |    expr KEOP_NE expr
  1045. X            {
  1046. X                $$ = exprnode(PCCASE_BIN,$1,IFC_NE,$3,0L,
  1047. X                    SYMNULL);
  1048. X            }
  1049. X    |    expr KEOP_EQ expr
  1050. X            {
  1051. X                $$ = exprnode(PCCASE_BIN,$1,IFC_EQ,$3,0L,
  1052. X                    SYMNULL);
  1053. X            }
  1054. X    |    expr KEOP_AND expr
  1055. X            {
  1056. X                $$ = exprnode(PCCASE_BIN,$1,IFC_AND,$3,0L,
  1057. X                    SYMNULL);
  1058. X            }
  1059. X    |    expr KEOP_OR expr
  1060. X            {
  1061. X                $$ = exprnode(PCCASE_BIN,$1,IFC_OR,$3,0L,
  1062. X                    SYMNULL);
  1063. X            }
  1064. X    |    expr KEOP_XOR expr
  1065. X            {
  1066. X                $$ = exprnode(PCCASE_BIN,$1,IFC_XOR,$3,0L,
  1067. X                    SYMNULL);
  1068. X            }
  1069. X    |    KEOP_DEFINED SYMBOL
  1070. X            {
  1071. X                $$ = exprnode(PCCASE_DEF,0,IGP_DEFINED,0,0L,$2);
  1072. X            }
  1073. X    |    SYMBOL
  1074. X            {
  1075. X                $$ = exprnode(PCCASE_SYMB,0,IFC_SYMB,0,0L,$1);
  1076. X            }
  1077. X    |    '*'
  1078. X            {
  1079. X                $$ = exprnode(PCCASE_PROGC,0,IFC_PROGCTR,0,
  1080. X                    labelloc, SYMNULL);
  1081. X            }
  1082. X    |    CONSTANT
  1083. X            {
  1084. X                $$ = exprnode(PCCASE_CONS,0,IGP_CONSTANT,0,$1,
  1085. X                    SYMNULL);
  1086. X            }
  1087. X    |    STRING
  1088. X            {
  1089. X                char *sourcestr = $1;
  1090. X                long accval = 0;
  1091. X
  1092. X                if(strlen($1) > 0)
  1093. X                {
  1094. X                    accval = chtran(&sourcestr);
  1095. X                    if(*sourcestr != '\0')
  1096. X                    {
  1097. X                        accval = (accval << 8) +
  1098. X                            chtran(&sourcestr);
  1099. X                    }
  1100. X
  1101. X                    if( *sourcestr != '\0')
  1102. X                    {
  1103. X    frawarn("string constant in expression more than 2 characters long");
  1104. X                    }
  1105. X                }
  1106. X                $$ = exprnode(PCCASE_CONS, 0, IGP_CONSTANT, 0,
  1107. X                    accval, SYMNULL);
  1108. X            }
  1109. X    |    '(' expr ')'
  1110. X            {
  1111. X                $$ = $2;
  1112. X            }
  1113. X    ;
  1114. X
  1115. X
  1116. X
  1117. X%%
  1118. X
  1119. Xlexintercept()
  1120. X/*
  1121. X    description    intercept the call to yylex (the lexical analyzer)
  1122. X            and filter out all unnecessary tokens when skipping
  1123. X            the input between a failed IF and its matching ENDI or
  1124. X            ELSE
  1125. X    globals     fraifskip    the enable flag
  1126. X*/
  1127. X{
  1128. X#undef yylex
  1129. X
  1130. X    int rv;
  1131. X
  1132. X    if(fraifskip)
  1133. X    {
  1134. X        for(;;)
  1135. X        {
  1136. X
  1137. X            switch(rv = yylex())
  1138. X
  1139. X            {
  1140. X            case 0:
  1141. X            case KOC_END:
  1142. X            case KOC_IF:
  1143. X            case KOC_ELSE:
  1144. X            case KOC_ENDI:
  1145. X            case EOL:
  1146. X                return rv;
  1147. X            default:
  1148. X                break;
  1149. X            }
  1150. X        }
  1151. X    }
  1152. X    else
  1153. X        return yylex();
  1154. X#define yylex lexintercept
  1155. X}
  1156. X
  1157. X
  1158. X
  1159. Xsetreserved()
  1160. X{
  1161. X
  1162. X    reservedsym("and", KEOP_AND, 0);
  1163. X    reservedsym("defined", KEOP_DEFINED,0);
  1164. X    reservedsym("eq", KEOP_EQ, 0);
  1165. X    reservedsym("ge", KEOP_GE, 0);
  1166. X    reservedsym("gt", KEOP_GT, 0);
  1167. X    reservedsym("high", KEOP_HIGH, 0);
  1168. X    reservedsym("le", KEOP_LE, 0);
  1169. X    reservedsym("low", KEOP_LOW, 0);
  1170. X    reservedsym("lt", KEOP_LT, 0);
  1171. X    reservedsym("mod", KEOP_MOD, 0);
  1172. X    reservedsym("ne", KEOP_NE, 0);
  1173. X    reservedsym("not", KEOP_NOT, 0);
  1174. X    reservedsym("or", KEOP_OR, 0);
  1175. X    reservedsym("shl", KEOP_SHL, 0);
  1176. X    reservedsym("shr", KEOP_SHR, 0);
  1177. X    reservedsym("xor", KEOP_XOR, 0);
  1178. X    reservedsym("AND", KEOP_AND, 0);
  1179. X    reservedsym("DEFINED", KEOP_DEFINED,0);
  1180. X    reservedsym("EQ", KEOP_EQ, 0);
  1181. X    reservedsym("GE", KEOP_GE, 0);
  1182. X    reservedsym("GT", KEOP_GT, 0);
  1183. X    reservedsym("HIGH", KEOP_HIGH, 0);
  1184. X    reservedsym("LE", KEOP_LE, 0);
  1185. X    reservedsym("LOW", KEOP_LOW, 0);
  1186. X    reservedsym("LT", KEOP_LT, 0);
  1187. X    reservedsym("MOD", KEOP_MOD, 0);
  1188. X    reservedsym("NE", KEOP_NE, 0);
  1189. X    reservedsym("NOT", KEOP_NOT, 0);
  1190. X    reservedsym("OR", KEOP_OR, 0);
  1191. X    reservedsym("SHL", KEOP_SHL, 0);
  1192. X    reservedsym("SHR", KEOP_SHR, 0);
  1193. X    reservedsym("XOR", KEOP_XOR, 0);
  1194. X
  1195. X    /* machine specific token definitions */
  1196. X    reservedsym("RB0", RSELC, 0);
  1197. X    reservedsym("RB1", RSELC, 1);
  1198. X    reservedsym("MB0", MSELC, 2);
  1199. X    reservedsym("MB1", MSELC, 3);
  1200. X    reservedsym("I", INT, ISELI);
  1201. X    reservedsym("TCNTI", INT, ISELTCNTI);
  1202. X    reservedsym("A", AF, AFSELA);
  1203. X    reservedsym("C", AF, AFSELC);
  1204. X    reservedsym("F0", AF, AFSELF0);
  1205. X    reservedsym("F1", AF, AFSELF1);
  1206. X    reservedsym("R0", REG, 0);
  1207. X    reservedsym("R1", REG, 1);
  1208. X    reservedsym("R2", REG, 2);
  1209. X    reservedsym("R3", REG, 3);
  1210. X    reservedsym("R4", REG, 4);
  1211. X    reservedsym("R5", REG, 5);
  1212. X    reservedsym("R6", REG, 6);
  1213. X    reservedsym("R7", REG, 7);
  1214. X    reservedsym("BUS", P02, PSELBUS);
  1215. X    reservedsym("P1", P02, PSELP1);
  1216. X    reservedsym("P2", P02, PSELP2);
  1217. X    reservedsym("P4", P47, 0);
  1218. X    reservedsym("P5", P47, 1);
  1219. X    reservedsym("P6", P47, 2);
  1220. X    reservedsym("P7", P47, 3);
  1221. X    reservedsym("PSW", MREG, MSELPSW);
  1222. X    reservedsym("T", MREG, MSELT);
  1223. X    reservedsym("CNT", MREG, MSELCNT);
  1224. X    reservedsym("TCNT", MREG, MSELTCNT);
  1225. X    reservedsym("CLK", MREG, MSELCLK);
  1226. X    reservedsym("DMA", INT, ISELDMA);
  1227. X    reservedsym("FLAGS", INT, ISELFLAGS);
  1228. X    reservedsym("DBB", P02, PSELDBB);
  1229. X    reservedsym("STS", MREG, MSELSTS);
  1230. X    reservedsym("rb0", RSELC, 0);
  1231. X    reservedsym("rb1", RSELC, 1);
  1232. X    reservedsym("mb0", MSELC, 2);
  1233. X    reservedsym("mb1", MSELC, 3);
  1234. X    reservedsym("i", INT, ISELI);
  1235. X    reservedsym("tcnti", INT, ISELTCNTI);
  1236. X    reservedsym("a", AF, AFSELA);
  1237. X    reservedsym("c", AF, AFSELC);
  1238. X    reservedsym("f0", AF, AFSELF0);
  1239. X    reservedsym("f1", AF, AFSELF1);
  1240. X    reservedsym("r0", REG, 0);
  1241. X    reservedsym("r1", REG, 1);
  1242. X    reservedsym("r2", REG, 2);
  1243. X    reservedsym("r3", REG, 3);
  1244. X    reservedsym("r4", REG, 4);
  1245. X    reservedsym("r5", REG, 5);
  1246. X    reservedsym("r6", REG, 6);
  1247. X    reservedsym("r7", REG, 7);
  1248. X    reservedsym("bus", P02, PSELBUS);
  1249. X    reservedsym("p1", P02, PSELP1);
  1250. X    reservedsym("p2", P02, PSELP2);
  1251. X    reservedsym("p4", P47, 0);
  1252. X    reservedsym("p5", P47, 1);
  1253. X    reservedsym("p6", P47, 2);
  1254. X    reservedsym("p7", P47, 3);
  1255. X    reservedsym("psw", MREG, MSELPSW);
  1256. X    reservedsym("t", MREG, MSELT);
  1257. X    reservedsym("cnt", MREG, MSELCNT);
  1258. X    reservedsym("tcnt", MREG, MSELTCNT);
  1259. X    reservedsym("clk", MREG, MSELCLK);
  1260. X    reservedsym("dma", INT, ISELDMA);
  1261. X    reservedsym("flags", INT, ISELFLAGS);
  1262. X    reservedsym("dbb", P02, PSELDBB);
  1263. X    reservedsym("sts", MREG, MSELSTS);
  1264. X
  1265. X}
  1266. X
  1267. Xcpumatch(str)
  1268. X    char * str;
  1269. X{
  1270. X    int msub;
  1271. X
  1272. X    static struct
  1273. X    {
  1274. X        char * mtch;
  1275. X        int   cpuv;
  1276. X    } matchtab[] =
  1277. X    {
  1278. X        {"C48", CPU80C48},
  1279. X        {"c48", CPU80C48},
  1280. X        {"C35", CPU80C48},
  1281. X        {"c35", CPU80C48},
  1282. X        {"C49", CPU80C49},
  1283. X        {"c49", CPU80C49},
  1284. X        {"C39", CPU80C49},
  1285. X        {"c39", CPU80C49},
  1286. X        {"C50", CPU80C50},
  1287. X        {"c50", CPU80C50},
  1288. X        {"C40", CPU80C50},
  1289. X        {"c40", CPU80C50},
  1290. X        {"48", CPU8048},
  1291. X        {"35", CPU8048},
  1292. X        {"49", CPU8049},
  1293. X        {"39", CPU8049},
  1294. X        {"50", CPU8050},
  1295. X        {"40", CPU8050},
  1296. X        {"41", CPU8041},
  1297. X        {"42", CPU8042},
  1298. X        { "" , 0 }
  1299. X    };
  1300. X
  1301. X    for(msub = 0; matchtab[msub].mtch[0] != '\0'; msub++)
  1302. X    {
  1303. X        if(strcontains(str, matchtab[msub].mtch))
  1304. X        {
  1305. X            cpuselect = matchtab[msub].cpuv;
  1306. X            return TRUE;
  1307. X        }
  1308. X    }
  1309. X
  1310. X    return FALSE;
  1311. X}
  1312. X
  1313. X
  1314. Xstrcontains(s1, sm)
  1315. X    char * s1, *sm;
  1316. X{
  1317. X    int l1 = strlen(s1), lm = strlen(sm);
  1318. X
  1319. X    for(; l1 >= lm; l1--, s1++)
  1320. X    {
  1321. X        if(strncmp(s1, sm, lm) == 0)
  1322. X        {
  1323. X            return TRUE;
  1324. X        }
  1325. X    }
  1326. X    return FALSE;
  1327. X}
  1328. X
  1329. X/*
  1330. X    description    Opcode and Instruction generation tables
  1331. X    usage        Unix, framework crossassembler
  1332. X    history        September 25, 1987
  1333. X*/
  1334. X
  1335. X#define NUMOPCODE 91
  1336. X#define NUMSYNBLK 94
  1337. X#define NUMDIFFOP 116
  1338. X
  1339. Xint gnumopcode = NUMOPCODE;
  1340. X
  1341. Xint ophashlnk[NUMOPCODE];
  1342. X
  1343. Xstruct opsym optab[NUMOPCODE+1]
  1344. X    = {
  1345. X    {"invalid", KOC_opcode, 2, 0 },
  1346. X    {"ADD", KOC_opcode, 3, 2 },
  1347. X    {"ADDC", KOC_opcode, 3, 5 },
  1348. X    {"ANL", KOC_opcode, 4, 8 },
  1349. X    {"ANLD", KOC_opcode, 1, 12 },
  1350. X    {"BYTE", KOC_BDEF, 0, 0 },
  1351. X    {"CALL", KOC_opcode, 1, 13 },
  1352. X    {"CHARDEF", KOC_CHDEF, 0, 0 },
  1353. X    {"CHARSET", KOC_CHSET, 0, 0 },
  1354. X    {"CHARUSE", KOC_CHUSE, 0, 0 },
  1355. X    {"CHD", KOC_CHDEF, 0, 0 },
  1356. X    {"CLR", KOC_opcode, 1, 14 },
  1357. X    {"CPL", KOC_opcode, 1, 15 },
  1358. X    {"CPU", KOC_CPU, 0, 0 },
  1359. X    {"DA", KOC_opcode, 1, 16 },
  1360. X    {"DB", KOC_BDEF, 0, 0 },
  1361. X    {"DEC", KOC_opcode, 2, 17 },
  1362. X    {"DIS", KOC_misc, 1, 19 },
  1363. X    {"DJNZ", KOC_opcode, 1, 20 },
  1364. X    {"DW", KOC_WDEF, 0, 0 },
  1365. X    {"ELSE", KOC_ELSE, 0, 0 },
  1366. X    {"EN", KOC_misc, 1, 21 },
  1367. X    {"END", KOC_END, 0, 0 },
  1368. X    {"ENDI", KOC_ENDI, 0, 0 },
  1369. X    {"ENT0", KOC_misc, 1, 22 },
  1370. X    {"EQU", KOC_EQU, 0, 0 },
  1371. X    {"FCB", KOC_BDEF, 0, 0 },
  1372. X    {"FCC", KOC_SDEF, 0, 0 },
  1373. X    {"FDB", KOC_WDEF, 0, 0 },
  1374. X    {"HALT", KOC_misc, 1, 23 },
  1375. X    {"IDL", KOC_misc, 1, 24 },
  1376. X    {"IF", KOC_IF, 0, 0 },
  1377. X    {"IN", KOC_opcode, 1, 25 },
  1378. X    {"INC", KOC_opcode, 3, 26 },
  1379. X    {"INCL", KOC_INCLUDE, 0, 0 },
  1380. X    {"INCLUDE", KOC_INCLUDE, 0, 0 },
  1381. X    {"INS", KOC_opcode, 1, 29 },
  1382. X    {"JB0", KOC_opcode, 1, 30 },
  1383. X    {"JB1", KOC_opcode, 1, 31 },
  1384. X    {"JB2", KOC_opcode, 1, 32 },
  1385. X    {"JB3", KOC_opcode, 1, 33 },
  1386. X    {"JB4", KOC_opcode, 1, 34 },
  1387. X    {"JB5", KOC_opcode, 1, 35 },
  1388. X    {"JB6", KOC_opcode, 1, 36 },
  1389. X    {"JB7", KOC_opcode, 1, 37 },
  1390. X    {"JC", KOC_opcode, 1, 38 },
  1391. X    {"JF0", KOC_opcode, 1, 39 },
  1392. X    {"JF1", KOC_opcode, 1, 40 },
  1393. X    {"JMP", KOC_opcode, 1, 41 },
  1394. X    {"JMPP", KOC_opcode, 1, 42 },
  1395. X    {"JNC", KOC_opcode, 1, 43 },
  1396. X    {"JNI", KOC_opcode, 1, 44 },
  1397. X    {"JNIBF", KOC_opcode, 1, 45 },
  1398. X    {"JNT0", KOC_opcode, 1, 46 },
  1399. X    {"JNT1", KOC_opcode, 1, 47 },
  1400. X    {"JNZ", KOC_opcode, 1, 48 },
  1401. X    {"JOBF", KOC_opcode, 1, 49 },
  1402. X    {"JT0", KOC_opcode, 1, 50 },
  1403. X    {"JT1", KOC_opcode, 1, 51 },
  1404. X    {"JTF", KOC_opcode, 1, 52 },
  1405. X    {"JZ", KOC_opcode, 1, 53 },
  1406. X    {"MOV", KOC_mov, 9, 54 },
  1407. X    {"MOVD", KOC_opcode, 2, 63 },
  1408. X    {"MOVP3", KOC_mov, 1, 65 },
  1409. X    {"MOVP", KOC_mov, 1, 66 },
  1410. X    {"MOVX", KOC_mov, 2, 67 },
  1411. X    {"NOP", KOC_misc, 1, 69 },
  1412. X    {"ORG", KOC_ORG, 0, 0 },
  1413. X    {"ORL", KOC_opcode, 4, 70 },
  1414. X    {"ORLD", KOC_opcode, 1, 74 },
  1415. X    {"OUT", KOC_opcode, 1, 75 },
  1416. X    {"OUTL", KOC_opcode, 1, 76 },
  1417. X    {"REGISTER", KOC_REG, 0, 0 },
  1418. X    {"RESERVE", KOC_RESM, 0, 0 },
  1419. X    {"RET", KOC_misc, 1, 77 },
  1420. X    {"RETR", KOC_misc, 1, 78 },
  1421. X    {"RL", KOC_opcode, 1, 79 },
  1422. X    {"RLC", KOC_opcode, 1, 80 },
  1423. X    {"RMB", KOC_RESM, 0, 0 },
  1424. X    {"RR", KOC_opcode, 1, 81 },
  1425. X    {"RRC", KOC_opcode, 1, 82 },
  1426. X    {"SEL", KOC_misc, 2, 83 },
  1427. X    {"SET", KOC_SET, 0, 0 },
  1428. X    {"STOP", KOC_misc, 1, 85 },
  1429. X    {"STRING", KOC_SDEF, 0, 0 },
  1430. X    {"STRT", KOC_misc, 1, 86 },
  1431. X    {"SWAP", KOC_opcode, 1, 87 },
  1432. X    {"WORD", KOC_WDEF, 0, 0 },
  1433. X    {"XCH", KOC_opcode, 2, 88 },
  1434. X    {"XCHD", KOC_opcode, 1, 90 },
  1435. X    {"XRL", KOC_opcode, 3, 91 },
  1436. X    { "", 0, 0, 0 }};
  1437. X
  1438. Xstruct opsynt ostab[NUMSYNBLK+1]
  1439. X    = {
  1440. X/* invalid 0 */ { 0, 1, 0 },
  1441. X/* invalid 1 */ { 0xffff, 1, 1 },
  1442. X/* ADD 2 */ { ST_AIMMED, 1, 2 },
  1443. X/* ADD 3 */ { ST_AINDIRR, 1, 3 },
  1444. X/* ADD 4 */ { ST_AR, 1, 4 },
  1445. X/* ADDC 5 */ { ST_AIMMED, 1, 5 },
  1446. X/* ADDC 6 */ { ST_AINDIRR, 1, 6 },
  1447. X/* ADDC 7 */ { ST_AR, 1, 7 },
  1448. X/* ANL 8 */ { ST_AIMMED, 1, 8 },
  1449. X/* ANL 9 */ { ST_AINDIRR, 1, 9 },
  1450. X/* ANL 10 */ { ST_AR, 1, 10 },
  1451. X/* ANL 11 */ { ST_P2IMMED, 3, 11 },
  1452. X/* ANLD 12 */ { ST_P4A, 1, 14 },
  1453. X/* CALL 13 */ { ST_EXPR, 1, 15 },
  1454. X/* CLR 14 */ { ST_AF, 4, 16 },
  1455. X/* CPL 15 */ { ST_AF, 4, 20 },
  1456. X/* DA 16 */ { ST_AF, 1, 24 },
  1457. X/* DEC 17 */ { ST_AF, 1, 25 },
  1458. X/* DEC 18 */ { ST_REG, 1, 26 },
  1459. X/* DIS 19 */ { ST_INT, 2, 27 },
  1460. X/* DJNZ 20 */ { ST_REGEXP, 1, 29 },
  1461. X/* EN 21 */ { ST_INT, 4, 30 },
  1462. X/* ENT0 22 */ { ST_MREG, 1, 34 },
  1463. X/* HALT 23 */ { ST_INH, 1, 35 },
  1464. X/* IDL 24 */ { ST_INH, 1, 36 },
  1465. X/* IN 25 */ { ST_PA2, 3, 37 },
  1466. X/* INC 26 */ { ST_AF, 1, 40 },
  1467. X/* INC 27 */ { ST_INDIRR, 1, 41 },
  1468. X/* INC 28 */ { ST_REG, 1, 42 },
  1469. X/* INS 29 */ { ST_PA2, 1, 43 },
  1470. X/* JB0 30 */ { ST_EXPR, 1, 44 },
  1471. X/* JB1 31 */ { ST_EXPR, 1, 45 },
  1472. X/* JB2 32 */ { ST_EXPR, 1, 46 },
  1473. X/* JB3 33 */ { ST_EXPR, 1, 47 },
  1474. X/* JB4 34 */ { ST_EXPR, 1, 48 },
  1475. X/* JB5 35 */ { ST_EXPR, 1, 49 },
  1476. X/* JB6 36 */ { ST_EXPR, 1, 50 },
  1477. X/* JB7 37 */ { ST_EXPR, 1, 51 },
  1478. X/* JC 38 */ { ST_EXPR, 1, 52 },
  1479. X/* JF0 39 */ { ST_EXPR, 1, 53 },
  1480. X/* JF1 40 */ { ST_EXPR, 1, 54 },
  1481. X/* JMP 41 */ { ST_EXPR, 1, 55 },
  1482. X/* JMPP 42 */ { ST_INDIRA, 1, 56 },
  1483. X/* JNC 43 */ { ST_EXPR, 1, 57 },
  1484. X/* JNI 44 */ { ST_EXPR, 1, 58 },
  1485. X/* JNIBF 45 */ { ST_EXPR, 1, 59 },
  1486. X/* JNT0 46 */ { ST_EXPR, 1, 60 },
  1487. X/* JNT1 47 */ { ST_EXPR, 1, 61 },
  1488. X/* JNZ 48 */ { ST_EXPR, 1, 62 },
  1489. X/* JOBF 49 */ { ST_EXPR, 1, 63 },
  1490. X/* JT0 50 */ { ST_EXPR, 1, 64 },
  1491. X/* JT1 51 */ { ST_EXPR, 1, 65 },
  1492. X/* JTF 52 */ { ST_EXPR, 1, 66 },
  1493. X/* JZ 53 */ { ST_EXPR, 1, 67 },
  1494. X/* MOV 54 */ { ST_MAIMMED, 1, 68 },
  1495. X/* MOV 55 */ { ST_MAINDIRR, 1, 69 },
  1496. X/* MOV 56 */ { ST_MAMR, 2, 70 },
  1497. X/* MOV 57 */ { ST_MAR, 1, 72 },
  1498. X/* MOV 58 */ { ST_MINDIRRA, 1, 73 },
  1499. X/* MOV 59 */ { ST_MINDIRRIM, 1, 74 },
  1500. X/* MOV 60 */ { ST_MMRA, 3, 75 },
  1501. X/* MOV 61 */ { ST_MRA, 1, 78 },
  1502. X/* MOV 62 */ { ST_MRIMMED, 1, 79 },
  1503. X/* MOVD 63 */ { ST_P4A, 1, 80 },
  1504. X/* MOVD 64 */ { ST_PA4, 1, 81 },
  1505. X/* MOVP3 65 */ { ST_MAINDIRA, 1, 82 },
  1506. X/* MOVP 66 */ { ST_MAINDIRA, 1, 83 },
  1507. X/* MOVX 67 */ { ST_MAINDIRR, 1, 84 },
  1508. X/* MOVX 68 */ { ST_MINDIRRA, 1, 85 },
  1509. X/* NOP 69 */ { ST_INH, 1, 86 },
  1510. X/* ORL 70 */ { ST_AIMMED, 1, 87 },
  1511. X/* ORL 71 */ { ST_AINDIRR, 1, 88 },
  1512. X/* ORL 72 */ { ST_AR, 1, 89 },
  1513. X/* ORL 73 */ { ST_P2IMMED, 3, 90 },
  1514. X/* ORLD 74 */ { ST_P4A, 1, 93 },
  1515. X/* OUT 75 */ { ST_P2A, 1, 94 },
  1516. X/* OUTL 76 */ { ST_P2A, 3, 95 },
  1517. X/* RET 77 */ { ST_INH, 1, 98 },
  1518. X/* RETR 78 */ { ST_INH, 1, 99 },
  1519. X/* RL 79 */ { ST_AF, 1, 100 },
  1520. X/* RLC 80 */ { ST_AF, 1, 101 },
  1521. X/* RR 81 */ { ST_AF, 1, 102 },
  1522. X/* RRC 82 */ { ST_AF, 1, 103 },
  1523. X/* SEL 83 */ { ST_MSELC, 1, 104 },
  1524. X/* SEL 84 */ { ST_RSELC, 1, 105 },
  1525. X/* STOP 85 */ { ST_MREG, 1, 106 },
  1526. X/* STRT 86 */ { ST_MREG, 2, 107 },
  1527. X/* SWAP 87 */ { ST_AF, 1, 109 },
  1528. X/* XCH 88 */ { ST_AINDIRR, 1, 110 },
  1529. X/* XCH 89 */ { ST_AR, 1, 111 },
  1530. X/* XCHD 90 */ { ST_AINDIRR, 1, 112 },
  1531. X/* XRL 91 */ { ST_AIMMED, 1, 113 },
  1532. X/* XRL 92 */ { ST_AINDIRR, 1, 114 },
  1533. X/* XRL 93 */ { ST_AR, 1, 115 },
  1534. X    { 0, 0, 0 } };
  1535. X
  1536. Xstruct igel igtab[NUMDIFFOP+1]
  1537. X    = {
  1538. X/* invalid 0 */   { 0 , 0, 
  1539. X        "[Xnullentry" },
  1540. X/* invalid 1 */   { 0 , 0, 
  1541. X        "[Xinvalid opcode" },
  1542. X/* ADD 2 */   { AFSELMASK , AFSELA, 
  1543. X        "03;[1=];" },
  1544. X/* ADD 3 */   { AFSELMASK , AFSELA, 
  1545. X        "60.[1#]|;" },
  1546. X/* ADD 4 */   { AFSELMASK , AFSELA, 
  1547. X        "68.[1#]|;" },
  1548. X/* ADDC 5 */   { AFSELMASK , AFSELA, 
  1549. X        "13;[1=];" },
  1550. X/* ADDC 6 */   { AFSELMASK , AFSELA, 
  1551. X        "70.[1#]|;" },
  1552. X/* ADDC 7 */   { AFSELMASK , AFSELA, 
  1553. X        "78.[1#]|;" },
  1554. X/* ANL 8 */   { AFSELMASK , AFSELA, 
  1555. X        "53;[1=];" },
  1556. X/* ANL 9 */   { AFSELMASK , AFSELA, 
  1557. X        "50.[1#]|;" },
  1558. X/* ANL 10 */   { AFSELMASK , AFSELA, 
  1559. X        "58.[1#]|;" },
  1560. X/* ANL 11 */   { INSTNOT41|PSELMASK , PSELBUS|INSTNOT41, 
  1561. X        "98;[1=];" },
  1562. X/* ANL 12 */   { PSELMASK , PSELP1, 
  1563. X        "99;[1=];" },
  1564. X/* ANL 13 */   { PSELMASK , PSELP2, 
  1565. X        "9a;[1=];" },
  1566. X/* ANLD 14 */   { AFSELMASK , AFSELA, 
  1567. X        "9c.[1#]|;" },
  1568. X/* CALL 15 */   { 0 , 0, 
  1569. X        "[1=].P.f800&-.bI~.3}.e0&.14|;!.ff&;" },
  1570. X/* CLR 16 */   { AFSELMASK , AFSELA, 
  1571. X        "27;" },
  1572. X/* CLR 17 */   { AFSELMASK , AFSELC, 
  1573. X        "97;" },
  1574. X/* CLR 18 */   { AFSELMASK , AFSELF0, 
  1575. X        "85;" },
  1576. X/* CLR 19 */   { AFSELMASK , AFSELF1, 
  1577. X        "a5;" },
  1578. X/* CPL 20 */   { AFSELMASK , AFSELA, 
  1579. X        "37;" },
  1580. X/* CPL 21 */   { AFSELMASK , AFSELC, 
  1581. X        "a7;" },
  1582. X/* CPL 22 */   { AFSELMASK , AFSELF0, 
  1583. X        "95;" },
  1584. X/* CPL 23 */   { AFSELMASK , AFSELF1, 
  1585. X        "b5;" },
  1586. X/* DA 24 */   { AFSELMASK , AFSELA, 
  1587. X        "57;" },
  1588. X/* DEC 25 */   { AFSELMASK , AFSELA, 
  1589. X        "07;" },
  1590. X/* DEC 26 */   { 0 , 0, 
  1591. X        "c8.[1#]|;" },
  1592. X/* DIS 27 */   { ISELMASK , ISELI, 
  1593. X        "15;" },
  1594. X/* DIS 28 */   { ISELMASK , ISELTCNTI, 
  1595. X        "35;" },
  1596. X/* DJNZ 29 */   { 0 , 0, 
  1597. X        "e8.[1#]|;[2=].Q.ff00&-.8I;" },
  1598. X/* EN 30 */   { ISELMASK , ISELI, 
  1599. X        "05;" },
  1600. X/* EN 31 */   { ISELMASK , ISELTCNTI, 
  1601. X        "25;" },
  1602. X/* EN 32 */   { INST41|ISELMASK , ISELDMA|INST41, 
  1603. X        "e5;" },
  1604. X/* EN 33 */   { INST41|ISELMASK , ISELFLAGS|INST41, 
  1605. X        "f5;" },
  1606. X/* ENT0 34 */   { INSTNOT41|MSELMASK , MSELCLK|INSTNOT41, 
  1607. X        "75;" },
  1608. X/* HALT 35 */   { INSTIDL , INSTIDL, 
  1609. X        "01;" },
  1610. X/* IDL 36 */   { INSTIDL , INSTIDL, 
  1611. X        "01;" },
  1612. X/* IN 37 */   { INST41|PSELMASK|AFSELMASK , PSELDBB|AFSELA|INST41, 
  1613. X        "22;" },
  1614. X/* IN 38 */   { PSELMASK|AFSELMASK , PSELP1|AFSELA, 
  1615. X        "09;" },
  1616. X/* IN 39 */   { PSELMASK|AFSELMASK , PSELP2|AFSELA, 
  1617. X        "0a;" },
  1618. X/* INC 40 */   { AFSELMASK , AFSELA, 
  1619. X        "17;" },
  1620. X/* INC 41 */   { 0 , 0, 
  1621. X        "10.[1#]|;" },
  1622. X/* INC 42 */   { 0 , 0, 
  1623. X        "18.[1#]|;" },
  1624. X/* INS 43 */   { INSTNOT41|PSELMASK|AFSELMASK , PSELBUS|AFSELA|INSTNOT41, 
  1625. X        "08;" },
  1626. X/* JB0 44 */   { 0 , 0, 
  1627. X        "12;[1=].Q.ff00&-.8I;" },
  1628. X/* JB1 45 */   { 0 , 0, 
  1629. X        "32;[1=].Q.ff00&-.8I;" },
  1630. X/* JB2 46 */   { 0 , 0, 
  1631. X        "52;[1=].Q.ff00&-.8I;" },
  1632. X/* JB3 47 */   { 0 , 0, 
  1633. X        "72;[1=].Q.ff00&-.8I;" },
  1634. X/* JB4 48 */   { 0 , 0, 
  1635. X        "92;[1=].Q.ff00&-.8I;" },
  1636. X/* JB5 49 */   { 0 , 0, 
  1637. X        "b2;[1=].Q.ff00&-.8I;" },
  1638. X/* JB6 50 */   { 0 , 0, 
  1639. X        "d2;[1=].Q.ff00&-.8I;" },
  1640. X/* JB7 51 */   { 0 , 0, 
  1641. X        "f2;[1=].Q.ff00&-.8I;" },
  1642. X/* JC 52 */   { 0 , 0, 
  1643. X        "f6;[1=].Q.ff00&-.8I;" },
  1644. X/* JF0 53 */   { 0 , 0, 
  1645. X        "b6;[1=].Q.ff00&-.8I;" },
  1646. X/* JF1 54 */   { 0 , 0, 
  1647. X        "76;[1=].Q.ff00&-.8I;" },
  1648. X/* JMP 55 */   { 0 , 0, 
  1649. X        "[1=].P.f800&-.bI~.3}.e0&.04|;!.ff&;" },
  1650. X/* JMPP 56 */   { AFSELMASK , AFSELA, 
  1651. X        "b3;" },
  1652. X/* JNC 57 */   { 0 , 0, 
  1653. X        "e6;[1=].Q.ff00&-.8I;" },
  1654. X/* JNI 58 */   { INSTNOT41 , INSTNOT41, 
  1655. X        "86;[1=].Q.ff00&-.8I;" },
  1656. X/* JNIBF 59 */   { INST41 , INST41, 
  1657. X        "d6;[1=].Q.ff00&-.8I;" },
  1658. X/* JNT0 60 */   { 0 , 0, 
  1659. X        "26;[1=].Q.ff00&-.8I;" },
  1660. X/* JNT1 61 */   { 0 , 0, 
  1661. X        "46;[1=].Q.ff00&-.8I;" },
  1662. X/* JNZ 62 */   { 0 , 0, 
  1663. X        "96;[1=].Q.ff00&-.8I;" },
  1664. X/* JOBF 63 */   { INST41 , INST41, 
  1665. X        "86;[1=].Q.ff00&-.8I;" },
  1666. X/* JT0 64 */   { 0 , 0, 
  1667. X        "36;[1=].Q.ff00&-.8I;" },
  1668. X/* JT1 65 */   { 0 , 0, 
  1669. X        "56;[1=].Q.ff00&-.8I;" },
  1670. X/* JTF 66 */   { 0 , 0, 
  1671. X        "16;[1=].Q.ff00&-.8I;" },
  1672. X/* JZ 67 */   { 0 , 0, 
  1673. X        "c6;[1=].Q.ff00&-.8I;" },
  1674. X/* MOV 68 */   { AFSELMASK , AFSELA, 
  1675. X        "23;[1=];" },
  1676. X/* MOV 69 */   { AFSELMASK , AFSELA, 
  1677. X        "f0.[1#]|;" },
  1678. X/* MOV 70 */   { AFSELMASK|MSELMASK , AFSELA|MSELPSW, 
  1679. X        "c7;" },
  1680. X/* MOV 71 */   { AFSELMASK|MSELMASK , AFSELA|MSELT, 
  1681. X        "42;" },
  1682. X/* MOV 72 */   { AFSELMASK , AFSELA, 
  1683. X        "f8.[1#]|;" },
  1684. X/* MOV 73 */   { AFSELMASK , AFSELA, 
  1685. X        "a0.[1#]|;" },
  1686. X/* MOV 74 */   { 0 , 0, 
  1687. X        "b0.[1#]|;[2=];" },
  1688. X/* MOV 75 */   { AFSELMASK|MSELMASK , AFSELA|MSELPSW, 
  1689. X        "d7;" },
  1690. X/* MOV 76 */   { INST41|AFSELMASK|MSELMASK , AFSELA|MSELSTS|INST41, 
  1691. X        "50;" },
  1692. X/* MOV 77 */   { AFSELMASK|MSELMASK , AFSELA|MSELT, 
  1693. X        "62;" },
  1694. X/* MOV 78 */   { AFSELMASK , AFSELA, 
  1695. X        "a8.[1#]|;" },
  1696. X/* MOV 79 */   { 0 , 0, 
  1697. X        "b8.[1#]|;[2=];" },
  1698. X/* MOVD 80 */   { AFSELMASK , AFSELA, 
  1699. X        "3c.[1#]|;" },
  1700. X/* MOVD 81 */   { AFSELMASK , AFSELA, 
  1701. X        "0c.[1#]|;" },
  1702. X/* MOVP3 82 */   { AFSELMASK , AFSELA, 
  1703. X        "e3;" },
  1704. X/* MOVP 83 */   { AFSELMASK , AFSELA, 
  1705. X        "a3;" },
  1706. X/* MOVX 84 */   { INSTNOT41|AFSELMASK , AFSELA|INSTNOT41, 
  1707. X        "80.[1#]|;" },
  1708. X/* MOVX 85 */   { INSTNOT41|AFSELMASK , AFSELA|INSTNOT41, 
  1709. X        "90.[1#]|;" },
  1710. X/* NOP 86 */   { 0 , 0, 
  1711. X        "00;" },
  1712. X/* ORL 87 */   { AFSELMASK , AFSELA, 
  1713. X        "43;[1=];" },
  1714. X/* ORL 88 */   { AFSELMASK , AFSELA, 
  1715. X        "40.[1#]|;" },
  1716. X/* ORL 89 */   { AFSELMASK , AFSELA, 
  1717. X        "48.[1#]|;" },
  1718. X/* ORL 90 */   { INSTNOT41|PSELMASK , PSELBUS|INSTNOT41, 
  1719. X        "88;[1=];" },
  1720. X/* ORL 91 */   { PSELMASK , PSELP1, 
  1721. X        "89;[1=];" },
  1722. X/* ORL 92 */   { PSELMASK , PSELP2, 
  1723. X        "8a;[1=];" },
  1724. X/* ORLD 93 */   { AFSELMASK , AFSELA, 
  1725. X        "8c.[1#]|;" },
  1726. X/* OUT 94 */   { INST41|AFSELMASK|PSELMASK , AFSELA|PSELDBB|INST41, 
  1727. X        "02;" },
  1728. X/* OUTL 95 */   { INSTNOT41|AFSELMASK|PSELMASK , AFSELA|PSELBUS|INSTNOT41, 
  1729. X        "02;" },
  1730. X/* OUTL 96 */   { AFSELMASK|PSELMASK , AFSELA|PSELP1, 
  1731. X        "39;" },
  1732. X/* OUTL 97 */   { AFSELMASK|PSELMASK , AFSELA|PSELP2, 
  1733. X        "3a;" },
  1734. X/* RET 98 */   { 0 , 0, 
  1735. X        "83;" },
  1736. X/* RETR 99 */   { 0 , 0, 
  1737. X        "93;" },
  1738. X/* RL 100 */   { AFSELMASK , AFSELA, 
  1739. X        "e7;" },
  1740. X/* RLC 101 */   { AFSELMASK , AFSELA, 
  1741. X        "f7;" },
  1742. X/* RR 102 */   { AFSELMASK , AFSELA, 
  1743. X        "77;" },
  1744. X/* RRC 103 */   { AFSELMASK , AFSELA, 
  1745. X        "67;" },
  1746. X/* SEL 104 */   { INSTNOT41 , INSTNOT41, 
  1747. X        "c5.[1#]|;" },
  1748. X/* SEL 105 */   { 0 , 0, 
  1749. X        "c5.[1#]|;" },
  1750. X/* STOP 106 */   { MSELMASK , MSELTCNT, 
  1751. X        "65;" },
  1752. X/* STRT 107 */   { MSELMASK , MSELCNT, 
  1753. X        "45;" },
  1754. X/* STRT 108 */   { MSELMASK , MSELT, 
  1755. X        "55;" },
  1756. X/* SWAP 109 */   { AFSELMASK , AFSELA, 
  1757. X        "47;" },
  1758. X/* XCH 110 */   { AFSELMASK , AFSELA, 
  1759. X        "20.[1#]|;" },
  1760. X/* XCH 111 */   { AFSELMASK , AFSELA, 
  1761. X        "28.[1#]|;" },
  1762. X/* XCHD 112 */   { AFSELMASK , AFSELA, 
  1763. X        "30.[1#]|;" },
  1764. X/* XRL 113 */   { AFSELMASK , AFSELA, 
  1765. X        "d3;[1=];" },
  1766. X/* XRL 114 */   { AFSELMASK , AFSELA, 
  1767. X        "d0.[1#]|;" },
  1768. X/* XRL 115 */   { AFSELMASK , AFSELA, 
  1769. X        "d8.[1#]|;" },
  1770. X    { 0,0,""} };
  1771. X/* end fraptabdef.c */
  1772. SHAR_EOF
  1773. true || echo 'restore of as8048.y failed'
  1774. fi
  1775. exit 0
  1776.