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

  1. From: markz@ssc.UUCP (Mark Zenier)
  2. Newsgroups: alt.sources
  3. Subject: Frankenstein Cross Assemblers, Zilog Z80 flavor, part 2 of 2
  4. Message-ID: <619@ssc.UUCP>
  5. Date: 6 Dec 90 07:32:29 GMT
  6.  
  7. ---- Cut Here and feed the following to sh ----
  8. #!/bin/sh
  9. # This is part 02 of Frankasm/Asz80
  10. # ============= asz80.y ==============
  11. if test -f 'asz80.y' -a X"$1" != X"-c"; then
  12.     echo 'x - skipping asz80.y (File already exists)'
  13. else
  14. echo 'x - extracting asz80.y (Text)'
  15. sed 's/^X//' << 'SHAR_EOF' > 'asz80.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:     asz80.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:     asz80.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/*   framework crossassembler for z80 + and minus */
  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/*
  60. X    file        critz80.h
  61. X    author        Mark Zenier
  62. X    description    selection critera and syntax type defines for
  63. X            the z80 frasm (framework cross assembler)
  64. X    usage        Unix
  65. X    history        January 22, 1988
  66. X*/
  67. X
  68. X/* xxxx.0000.0000.0000  cpu mask selection for all instructions */
  69. X
  70. X#define    CPUMASK        0xf000
  71. X
  72. X#define    CPU8080        0x1000
  73. X#define    CPU8085        0x3000
  74. X#define    CPUZ80        0x7000
  75. X#define    CPU64180    0xf000
  76. X
  77. X#define    TS8080PLUS    0x1000
  78. X#define    TS8085PLUS    0x2000
  79. X#define    TSZ80PLUS    0x4000
  80. X#define    TS64180        0x8000
  81. X
  82. X/* 0000.0000.0xxx.xxxx  double register select bits for B02, CC01, LD02, LD03,
  83. X            LD05, LD06, LD07, LD08, LD09, LD10, LD12, N03, N04, N05,
  84. X            N07, N11 */
  85. X#define DRMASK 0x7f
  86. X#define    DRIX    1
  87. X#define    DRIY    2
  88. X#define    DRSP    4
  89. X#define    DRHL    8
  90. X#define    DRDE    0x10
  91. X#define    DRBC    0x20
  92. X#define    DRAF    0x40
  93. X
  94. X/* 0000.0xxx.x000.0000  destination select bits */
  95. X#define    DRDESTMASK    0x780
  96. X#define    DRDESTSP    0x80
  97. X#define DRDESTHL    0x100
  98. X#define DRDESTIX    0x200
  99. X#define DRDESTIY    0x300
  100. X
  101. X/* 0000.x000.0000.0000  register is accum for LD02, LD10 */
  102. X
  103. X#define REGISA    0x800
  104. X
  105. X/* register field values for instructions */
  106. X
  107. X#define    VALREGA    7
  108. X#define    VALREGB    0
  109. X#define    VALREGC    1
  110. X#define    VALREGD    2
  111. X#define    VALREGE    3
  112. X#define    VALREGH    4
  113. X#define    VALREGL    5
  114. X
  115. X#define ST_B01 0x1
  116. X#define ST_B02 0x2
  117. X#define ST_B03 0x4
  118. X/* 0000.0000.xxxx.xxxx  condition select */
  119. X#define CCSELMASK    0x00ff
  120. X#define CCSELNZ    0x0001
  121. X#define CCSELZ    0x0002
  122. X#define CCSELNC    0x0004
  123. X#define CCSELC    0x0008
  124. X#define CCSELPO    0x0010
  125. X#define CCSELPE    0x0020
  126. X#define CCSELP    0x0040
  127. X#define CCSELM    0x0080
  128. X#define ST_CC01 0x1
  129. X#define ST_CC02 0x2
  130. X#define ST_CC03 0x4
  131. X#define ST_CC04 0x8
  132. X#define ST_CC05 0x10
  133. X#define ST_EX01 0x1
  134. X#define EXMASK    0xf
  135. X/*    0000.0000.0000.00xx   */
  136. X#define EX2AF        1
  137. X#define EX2HL        2
  138. X/*    0000.0000.0000.xx00   */
  139. X#define EX1AF        4
  140. X#define EX1DE        8
  141. X#define ST_EX02 0x2
  142. X#define ST_IM01 0x1
  143. X/* 0000.0000.0000.0xxx   interrupt mode select bits */
  144. X#define    INTSETMASK    7
  145. X#define INTSETMODE0    1
  146. X#define INTSETMODE1    2
  147. X#define INTSETMODE2    4
  148. X#define ST_IO01 0x1
  149. X#define ST_IO02 0x2
  150. X#define ST_IO03 0x4
  151. X#define ST_IO04 0x8
  152. X#define ST_LD01 0x1
  153. X#define ST_LD02 0x2
  154. X#define ST_LD03 0x4
  155. X#define ST_LD04 0x8
  156. X#define ST_LD05 0x10
  157. X#define ST_LD06 0x20
  158. X#define ST_LD07 0x40
  159. X#define ST_LD08 0x80
  160. X#define ST_LD09 0x100
  161. X#define ST_LD10 0x200
  162. X#define ST_LD11 0x400
  163. X#define ST_LD12 0x800
  164. X#define ST_LD13 0x1000
  165. X#define ST_LD14 0x2000
  166. X#define ST_LD15 0x4000
  167. X/* 0000.0000.0000.00xx */
  168. X#define SPECIALRMASK    3
  169. X#define SPECIALIR    1
  170. X#define SPECIALRR    2
  171. X#define ST_LD16 0x8000
  172. X#define ST_N01 0x1
  173. X#define ST_N02 0x2
  174. X#define ST_N04 0x4
  175. X#define ST_N05 0x8
  176. X#define ST_N06 0x10
  177. X#define ST_N07 0x20
  178. X#define ST_N08 0x40
  179. X#define ST_N09 0x80
  180. X#define ST_N10 0x100
  181. X#define ST_N11 0x200
  182. X#define ST_N12 0x400
  183. X#define ST_R01 0x1
  184. X    
  185. X    unsigned int cpuselect = CPU64180;
  186. X    static char    genbdef[] = "[1=];";
  187. X    static char    genwdef[] = "[1=]y";
  188. X    char ignosyn[] = "[Xinvalid syntax for instruction";
  189. X    char ignosel[] = "[Xinvalid operands/illegal instruction for cpu";
  190. X
  191. X    long    labelloc;
  192. X    static int satsub;
  193. X    int    ifstkpt = 0;
  194. X    int    fraifskip = FALSE;
  195. X
  196. X    struct symel * endsymbol = SYMNULL;
  197. X
  198. X%}
  199. X%union {
  200. X    int    intv;
  201. X    long     longv;
  202. X    char    *strng;
  203. X    struct symel *symb;
  204. X    struct { int indsel, exp; } indexstruc;
  205. X}
  206. X%token <intv> SREGI
  207. X%token <intv> SREGR
  208. X%token <intv> REGA
  209. X%token <intv> REGB
  210. X%token <intv> REGC
  211. X%token <intv> REGD
  212. X%token <intv> REGE
  213. X%token <intv> REGH
  214. X%token <intv> REGL
  215. X%token <intv> DREGAF
  216. X%token <intv> DREGBC
  217. X%token <intv> DREGDE
  218. X%token <intv> DREGHL
  219. X%token <intv> DREGIX
  220. X%token <intv> DREGIY
  221. X%token <intv> DREGSP
  222. X%token <intv> CONDZ
  223. X%token <intv> CONDNZ
  224. X%token <intv> CONDNC
  225. X%token <intv> CONDPE
  226. X%token <intv> CONDPO
  227. X%token <intv> CONDP
  228. X%token <intv> CONDM
  229. X
  230. X%type <intv> dreg condition reg8 specialr ixoriy topexpr
  231. X%type <indexstruc> index
  232. X%token <intv> KOC_BDEF
  233. X%token <intv> KOC_ELSE
  234. X%token <intv> KOC_END
  235. X%token <intv> KOC_ENDI
  236. X%token <intv> KOC_EQU
  237. X%token <intv> KOC_IF
  238. X%token <intv> KOC_INCLUDE
  239. X%token <intv> KOC_ORG
  240. X%token <intv> KOC_RESM
  241. X%token <intv> KOC_SDEF
  242. X%token <intv> KOC_SET
  243. X%token <intv> KOC_WDEF
  244. X%token <intv> KOC_CHSET
  245. X%token <intv> KOC_CHDEF
  246. X%token <intv> KOC_CHUSE
  247. X%token <intv> KOC_CPU
  248. X%token <intv> KOC_bit
  249. X%token <intv> KOC_ccop
  250. X%token <intv> KOC_exop
  251. X%token <intv> KOC_intmode
  252. X%token <intv> KOC_ioop
  253. X%token <intv> KOC_ldop
  254. X%token <intv> KOC_opcode
  255. X%token <intv> KOC_restart
  256. X
  257. X%token <longv> CONSTANT
  258. X%token EOL
  259. X%token KEOP_AND
  260. X%token KEOP_DEFINED
  261. X%token KEOP_EQ
  262. X%token KEOP_GE
  263. X%token KEOP_GT
  264. X%token KEOP_HIGH
  265. X%token KEOP_LE
  266. X%token KEOP_LOW
  267. X%token KEOP_LT
  268. X%token KEOP_MOD
  269. X%token KEOP_MUN
  270. X%token KEOP_NE
  271. X%token KEOP_NOT
  272. X%token KEOP_OR
  273. X%token KEOP_SHL
  274. X%token KEOP_SHR
  275. X%token KEOP_XOR
  276. X%token KEOP_locctr
  277. X%token <symb> LABEL
  278. X%token <strng> STRING
  279. X%token <symb> SYMBOL
  280. X
  281. X%token KTK_invalid
  282. X
  283. X%right    KEOP_HIGH KEOP_LOW
  284. X%left    KEOP_OR KEOP_XOR
  285. X%left    KEOP_AND
  286. X%right    KEOP_NOT
  287. X%nonassoc    KEOP_GT KEOP_GE KEOP_LE KEOP_LT KEOP_NE KEOP_EQ
  288. X%left    '+' '-'
  289. X%left    '*' '/' KEOP_MOD KEOP_SHL KEOP_SHR
  290. X%right    KEOP_MUN
  291. X
  292. X
  293. X%type <intv> expr exprlist stringlist
  294. X
  295. X%start file
  296. X
  297. X%%
  298. X
  299. Xfile    :    file allline
  300. X    |    allline
  301. X    ;
  302. X
  303. Xallline    :     line EOL
  304. X            {
  305. X                clrexpr();
  306. X            }
  307. X    |    EOL
  308. X    |    error EOL
  309. X            {
  310. X                clrexpr();
  311. X                yyerrok;
  312. X            }
  313. X    ;
  314. X
  315. Xline    :    LABEL KOC_END 
  316. X            {
  317. X                endsymbol = $1;
  318. X                nextreadact = Nra_end;
  319. X            }
  320. X    |          KOC_END 
  321. X            {
  322. X                nextreadact = Nra_end;
  323. X            }
  324. X    |    KOC_INCLUDE STRING
  325. X            {
  326. X        if(nextfstk >= FILESTKDPTH)
  327. X        {
  328. X            fraerror("include file nesting limit exceeded");
  329. X        }
  330. X        else
  331. X        {
  332. X            infilestk[nextfstk].fnm = savestring($2,strlen($2));
  333. X            if( (infilestk[nextfstk].fpt = fopen($2,"r"))
  334. X                ==(FILE *)NULL )
  335. X            {
  336. X                fraerror("cannot open include file");
  337. X            }
  338. X            else
  339. X            {
  340. X                nextreadact = Nra_new;
  341. X            }
  342. X        }
  343. X            }
  344. X    |    LABEL KOC_EQU expr 
  345. X            {
  346. X                if($1 -> seg == SSG_UNDEF)
  347. X                {
  348. X                    pevalexpr(0, $3);
  349. X                    if(evalr[0].seg == SSG_ABS)
  350. X                    {
  351. X                        $1 -> seg = SSG_EQU;
  352. X                        $1 -> value = evalr[0].value;
  353. X                        prtequvalue("C: 0x%lx\n",
  354. X                            evalr[0].value);
  355. X                    }
  356. X                    else
  357. X                    {
  358. X                        fraerror(
  359. X                    "noncomputable expression for EQU");
  360. X                    }
  361. X                }
  362. X                else
  363. X                {
  364. X                    fraerror(
  365. X                "cannot change symbol value with EQU");
  366. X                }
  367. X            }
  368. X    |    LABEL KOC_SET expr 
  369. X            {
  370. X                if($1 -> seg == SSG_UNDEF
  371. X                   || $1 -> seg == SSG_SET)
  372. X                {
  373. X                    pevalexpr(0, $3);
  374. X                    if(evalr[0].seg == SSG_ABS)
  375. X                    {
  376. X                        $1 -> seg = SSG_SET;
  377. X                        $1 -> value = evalr[0].value;
  378. X                        prtequvalue("C: 0x%lx\n",
  379. X                            evalr[0].value);
  380. X                    }
  381. X                    else
  382. X                    {
  383. X                        fraerror(
  384. X                    "noncomputable expression for SET");
  385. X                    }
  386. X                }
  387. X                else
  388. X                {
  389. X                    fraerror(
  390. X                "cannot change symbol value with SET");
  391. X                }
  392. X            }
  393. X    |    KOC_IF expr 
  394. X            {
  395. X        if((++ifstkpt) < IFSTKDEPTH)
  396. X        {
  397. X            pevalexpr(0, $2);
  398. X            if(evalr[0].seg == SSG_ABS)
  399. X            {
  400. X                if(evalr[0].value != 0)
  401. X                {
  402. X                    elseifstk[ifstkpt] = If_Skip;
  403. X                    endifstk[ifstkpt] = If_Active;
  404. X                }
  405. X                else
  406. X                {
  407. X                    fraifskip = TRUE;
  408. X                    elseifstk[ifstkpt] = If_Active;
  409. X                    endifstk[ifstkpt] = If_Active;
  410. X                }
  411. X            }
  412. X            else
  413. X            {
  414. X                fraifskip = TRUE;
  415. X                elseifstk[ifstkpt] = If_Active;
  416. X                endifstk[ifstkpt] = If_Active;
  417. X            }
  418. X        }
  419. X        else
  420. X        {
  421. X            fraerror("IF stack overflow");
  422. X        }
  423. X            }
  424. X                        
  425. X    |    KOC_IF 
  426. X            {
  427. X        if(fraifskip) 
  428. X        {
  429. X            if((++ifstkpt) < IFSTKDEPTH)
  430. X            {
  431. X                    elseifstk[ifstkpt] = If_Skip;
  432. X                    endifstk[ifstkpt] = If_Skip;
  433. X            }
  434. X            else
  435. X            {
  436. X                fraerror("IF stack overflow");
  437. X            }
  438. X        }
  439. X        else
  440. X        {
  441. X            yyerror("syntax error");
  442. X            YYERROR;
  443. X        }
  444. X                }
  445. X                        
  446. X    |    KOC_ELSE 
  447. X            {
  448. X                switch(elseifstk[ifstkpt])
  449. X                {
  450. X                case If_Active:
  451. X                    fraifskip = FALSE;
  452. X                    break;
  453. X                
  454. X                case If_Skip:
  455. X                    fraifskip = TRUE;
  456. X                    break;
  457. X                
  458. X                case If_Err:
  459. X                    fraerror("ELSE with no matching if");
  460. X                    break;
  461. X                }
  462. X            }
  463. X
  464. X    |    KOC_ENDI 
  465. X            {
  466. X                switch(endifstk[ifstkpt])
  467. X                {
  468. X                case If_Active:
  469. X                    fraifskip = FALSE;
  470. X                    ifstkpt--;
  471. X                    break;
  472. X                
  473. X                case If_Skip:
  474. X                    fraifskip = TRUE;
  475. X                    ifstkpt--;
  476. X                    break;
  477. X                
  478. X                case If_Err:
  479. X                    fraerror("ENDI with no matching if");
  480. X                    break;
  481. X                }
  482. X            }
  483. X    |    LABEL KOC_ORG expr 
  484. X            {
  485. X                pevalexpr(0, $3);
  486. X                if(evalr[0].seg == SSG_ABS)
  487. X                {
  488. X                    locctr = labelloc = evalr[0].value;
  489. X                    if($1 -> seg == SSG_UNDEF)
  490. X                    {
  491. X                        $1 -> seg = SSG_ABS;
  492. X                        $1 -> value = labelloc;
  493. X                    }
  494. X                    else
  495. X                        fraerror(
  496. X                        "multiple definition of label");
  497. X                    prtequvalue("C: 0x%lx\n",
  498. X                        evalr[0].value);
  499. X                }
  500. X                else
  501. X                {
  502. X                    fraerror(
  503. X                     "noncomputable expression for ORG");
  504. X                }
  505. X            }
  506. X    |          KOC_ORG expr 
  507. X            {
  508. X                pevalexpr(0, $2);
  509. X                if(evalr[0].seg == SSG_ABS)
  510. X                {
  511. X                    locctr = labelloc = evalr[0].value;
  512. X                    prtequvalue("C: 0x%lx\n",
  513. X                        evalr[0].value);
  514. X                }
  515. X                else
  516. X                {
  517. X                    fraerror(
  518. X                     "noncomputable expression for ORG");
  519. X                }
  520. X            }
  521. X    |    LABEL KOC_CHSET
  522. X            {
  523. X                if($1 -> seg == SSG_UNDEF)
  524. X                {
  525. X                    $1 -> seg = SSG_EQU;
  526. X                    if( ($1->value = chtcreate()) <= 0)
  527. X                    {
  528. X        fraerror( "cannot create character translation table");
  529. X                    }
  530. X                    prtequvalue("C: 0x%lx\n", $1 -> value);
  531. X                }
  532. X                else
  533. X                {
  534. X            fraerror( "multiple definition of label");
  535. X                }
  536. X            }
  537. X    |        KOC_CHUSE
  538. X            {
  539. X                chtcpoint = (int *) NULL;
  540. X                prtequvalue("C: 0x%lx\n", 0L);
  541. X            }
  542. X    |        KOC_CHUSE expr
  543. X            {
  544. X                pevalexpr(0, $2);
  545. X                if( evalr[0].seg == SSG_ABS)
  546. X                {
  547. X                    if( evalr[0].value == 0)
  548. X                    {
  549. X                        chtcpoint = (int *)NULL;
  550. X                        prtequvalue("C: 0x%lx\n", 0L);
  551. X                    }
  552. X                    else if(evalr[0].value < chtnxalph)
  553. X                    {
  554. X                chtcpoint = chtatab[evalr[0].value];
  555. X                prtequvalue("C: 0x%lx\n", evalr[0].value);
  556. X                    }
  557. X                    else
  558. X                    {
  559. X            fraerror("nonexistent character translation table");
  560. X                    }
  561. X                }
  562. X                else
  563. X                {
  564. X                    fraerror("noncomputable expression");
  565. X                }
  566. X            }
  567. X    |        KOC_CHDEF STRING ',' exprlist
  568. X            {
  569. X        int findrv, numret, *charaddr;
  570. X        char *sourcestr = $2, *before;
  571. X
  572. X        if(chtnpoint != (int *)NULL)
  573. X        {
  574. X            for(satsub = 0; satsub < $4; satsub++)
  575. X            {
  576. X                before = sourcestr;
  577. X
  578. X                pevalexpr(0, exprlist[satsub]);
  579. X                findrv = chtcfind(chtnpoint, &sourcestr,
  580. X                        &charaddr, &numret);
  581. X                if(findrv == CF_END)
  582. X                {
  583. X            fraerror("more expressions than characters");
  584. X                    break;
  585. X                }
  586. X
  587. X                if(evalr[0].seg == SSG_ABS)
  588. X                {
  589. X                    switch(findrv)
  590. X                    {
  591. X                    case CF_UNDEF:
  592. X                        {
  593. X                if(evalr[0].value < 0 ||
  594. X                    evalr[0].value > 255)
  595. X                {
  596. X            frawarn("character translation value truncated");
  597. X                }
  598. X                *charaddr = evalr[0].value & 0xff;
  599. X                prtequvalue("C: 0x%lx\n", evalr[0].value);
  600. X                        }
  601. X                        break;
  602. X
  603. X                    case CF_INVALID:
  604. X                    case CF_NUMBER:
  605. X                fracherror("invalid character to define", 
  606. X                    before, sourcestr);
  607. X                        break;
  608. X
  609. X                    case CF_CHAR:
  610. X                fracherror("character already defined", 
  611. X                    before, sourcestr);
  612. X                        break;
  613. X                    }
  614. X                }
  615. X                else
  616. X                {
  617. X                    fraerror("noncomputable expression");
  618. X                }
  619. X            }
  620. X
  621. X            if( *sourcestr != '\0')
  622. X            {
  623. X                fraerror("more characters than expressions");
  624. X            }
  625. X        }
  626. X        else
  627. X        {
  628. X            fraerror("no CHARSET statement active");
  629. X        }
  630. X            
  631. X            }
  632. X    |    LABEL 
  633. X            {
  634. X            if($1 -> seg == SSG_UNDEF)
  635. X            {
  636. X                $1 -> seg = SSG_ABS;
  637. X                $1 -> value = labelloc;
  638. X                prtequvalue("C: 0x%lx\n", labelloc);
  639. X
  640. X            }
  641. X            else
  642. X                fraerror(
  643. X                "multiple definition of label");
  644. X            }
  645. X    |    labeledline
  646. X    ;
  647. X
  648. Xlabeledline :    LABEL genline
  649. X            {
  650. X            if($1 -> seg == SSG_UNDEF)
  651. X            {
  652. X                $1 -> seg = SSG_ABS;
  653. X                $1 -> value = labelloc;
  654. X            }
  655. X            else
  656. X                fraerror(
  657. X                "multiple definition of label");
  658. X            labelloc = locctr;
  659. X            }
  660. X                
  661. X    |    genline
  662. X            {
  663. X                labelloc = locctr;
  664. X            }
  665. X    ;
  666. X
  667. Xgenline    :    KOC_BDEF    exprlist 
  668. X            {
  669. X                genlocrec(currseg, labelloc);
  670. X                for( satsub = 0; satsub < $2; satsub++)
  671. X                {
  672. X                    pevalexpr(1, exprlist[satsub]);
  673. X                    locctr += geninstr(genbdef);
  674. X                }
  675. X            }
  676. X    |    KOC_SDEF stringlist 
  677. X            {
  678. X                genlocrec(currseg, labelloc);
  679. X                for(satsub = 0; satsub < $2; satsub++)
  680. X                {
  681. X                    locctr += genstring(stringlist[satsub]);
  682. X                }
  683. X            }
  684. X    |    KOC_WDEF exprlist 
  685. X            {
  686. X                genlocrec(currseg, labelloc);
  687. X                for( satsub = 0; satsub < $2; satsub++)
  688. X                {
  689. X                    pevalexpr(1, exprlist[satsub]);
  690. X                    locctr += geninstr(genwdef);
  691. X                }
  692. X            }    
  693. X    |    KOC_RESM expr 
  694. X            {
  695. X                pevalexpr(0, $2);
  696. X                if(evalr[0].seg == SSG_ABS)
  697. X                {
  698. X                    locctr = labelloc + evalr[0].value;
  699. X                    prtequvalue("C: 0x%lx\n", labelloc);
  700. X                }
  701. X                else
  702. X                {
  703. X                    fraerror(
  704. X                 "noncomputable result for RMB expression");
  705. X                }
  706. X            }
  707. X    ;
  708. X
  709. Xexprlist :    exprlist ',' expr
  710. X            {
  711. X                exprlist[nextexprs ++ ] = $3;
  712. X                $$ = nextexprs;
  713. X            }
  714. X    |    expr
  715. X            {
  716. X                nextexprs = 0;
  717. X                exprlist[nextexprs ++ ] = $1;
  718. X                $$ = nextexprs;
  719. X            }
  720. X    ;
  721. X
  722. Xstringlist :    stringlist ',' STRING
  723. X            {
  724. X                stringlist[nextstrs ++ ] = $3;
  725. X                $$ = nextstrs;
  726. X            }
  727. X    |    STRING
  728. X            {
  729. X                nextstrs = 0;
  730. X                stringlist[nextstrs ++ ] = $1;
  731. X                $$ = nextstrs;
  732. X            }
  733. X    ;
  734. X
  735. X
  736. Xline    :    KOC_CPU STRING
  737. X            {
  738. X        if( ! cpumatch($2))
  739. X        {
  740. X            fraerror("unknown cpu type, 64180 assumed");
  741. X            cpuselect = CPU64180;
  742. X        }
  743. X            }
  744. X    ;
  745. Xgenline : KOC_bit  expr ',' '(' DREGHL ')' 
  746. X            {
  747. X        genlocrec(currseg, labelloc);
  748. X        pevalexpr(1,$2);
  749. X        if(evalr[1].seg != SSG_ABS || 
  750. X            evalr[1].value < 0 ||
  751. X            evalr[1].value > 7)
  752. X        {
  753. X            evalr[1].value = 0;
  754. X            fraerror("impossible bit number");
  755. X        }
  756. X        evalr[1].value <<= 3;
  757. X        locctr += geninstr(findgen($1, ST_B01, cpuselect));
  758. X            }
  759. X    ;
  760. Xgenline : KOC_bit  expr ',' index 
  761. X            {
  762. X        genlocrec(currseg, labelloc);
  763. X        pevalexpr(1,$2);
  764. X        if(evalr[1].seg != SSG_ABS || 
  765. X            evalr[1].value < 0 ||
  766. X            evalr[1].value > 7)
  767. X        {
  768. X            evalr[1].value = 0;
  769. X            fraerror("impossible bit number");
  770. X        }
  771. X        evalr[1].value <<= 3;
  772. X        pevalexpr(2, $4.exp);
  773. X        locctr += geninstr(findgen($1, ST_B02, cpuselect|$4.indsel));
  774. X            }
  775. X    ;
  776. Xgenline : KOC_bit  expr ',' reg8 
  777. X            {
  778. X        genlocrec(currseg, labelloc);
  779. X        pevalexpr(1,$2);
  780. X        if(evalr[1].seg != SSG_ABS || 
  781. X            evalr[1].value < 0 ||
  782. X            evalr[1].value > 7)
  783. X        {
  784. X            evalr[1].value = 0;
  785. X            fraerror("impossible bit number");
  786. X        }
  787. X        evalr[1].value = (evalr[1].value << 3) | $4;
  788. X        locctr += geninstr(findgen($1, ST_B03, cpuselect));
  789. X            }
  790. X    ;
  791. Xgenline : KOC_ccop  '(' dreg ')' 
  792. X            {
  793. X        genlocrec(currseg, labelloc);
  794. X        locctr += geninstr(findgen($1, ST_CC01, cpuselect|$3));
  795. X            }
  796. X    ;
  797. Xgenline : KOC_ccop  condition ',' expr 
  798. X            {
  799. X        genlocrec(currseg, labelloc);
  800. X        pevalexpr(1, $4);
  801. X        locctr += geninstr(findgen($1, ST_CC02, cpuselect|$2));
  802. X            }
  803. X    ;
  804. Xgenline : KOC_ccop  expr 
  805. X            {
  806. X        genlocrec(currseg, labelloc);
  807. X        pevalexpr(1,$2);
  808. X        locctr += geninstr(findgen($1, ST_CC03, cpuselect));
  809. X            }
  810. X    ;
  811. Xgenline : KOC_ccop  condition  
  812. X            {
  813. X        genlocrec(currseg, labelloc);
  814. X        locctr += geninstr(findgen($1, ST_CC04, cpuselect|$2));
  815. X            }
  816. X    ;
  817. Xgenline : KOC_ccop  
  818. X            {
  819. X        genlocrec(currseg, labelloc);
  820. X        locctr += geninstr(findgen($1, ST_CC05, cpuselect));
  821. X            }
  822. X    ;
  823. Xgenline : KOC_exop  dreg ',' dreg 
  824. X            {
  825. X        int selc = 0;
  826. X
  827. X        genlocrec(currseg, labelloc);
  828. X        switch($2)
  829. X        {
  830. X        case DRAF:
  831. X            selc = EX1AF;
  832. X            break;
  833. X        case DRDE:
  834. X            selc = EX1DE;
  835. X        default:
  836. X            break;
  837. X        }
  838. X
  839. X        switch($4)
  840. X        {
  841. X        case DRAF:
  842. X            selc |= EX2AF;
  843. X            break;
  844. X        case DRHL:
  845. X            selc |= EX2HL;
  846. X        default:
  847. X            break;
  848. X        }
  849. X        locctr += geninstr(findgen($1, ST_EX01, cpuselect|selc));
  850. X            }
  851. X    ;
  852. Xgenline : KOC_exop  '(' DREGSP ')' ',' dreg 
  853. X            {
  854. X        genlocrec(currseg, labelloc);
  855. X        locctr += geninstr(findgen($1, ST_EX02, cpuselect|$6));
  856. X            }
  857. X    ;
  858. Xgenline : KOC_intmode  expr 
  859. X            {
  860. X        int selc = 0;
  861. X
  862. X        genlocrec(currseg, labelloc);
  863. X        pevalexpr(1, $2);
  864. X        if(evalr[1].seg != SSG_ABS ||
  865. X           evalr[1].value < 0 ||
  866. X           evalr[1].value > 2)
  867. X        {
  868. X            fraerror("invalid interrupt mode");
  869. X        }
  870. X        else
  871. X        {
  872. X            selc = 1 << ((int) evalr[1].value);
  873. X        }
  874. X        locctr += geninstr(findgen($1, ST_IM01, cpuselect|selc));
  875. X            }
  876. X    ;
  877. Xgenline : KOC_ioop  '(' topexpr ')' ',' reg8 
  878. X            {
  879. X        genlocrec(currseg, labelloc);
  880. X        pevalexpr(1, $3);
  881. X        evalr[2].value = $6 << 3;
  882. X        locctr += geninstr(findgen($1, ST_IO01, cpuselect
  883. X            | ($6 == VALREGA ? REGISA : 0)));
  884. X            }
  885. X    ;
  886. Xgenline : KOC_ioop  '(' REGC ')' ',' reg8 
  887. X            {
  888. X        genlocrec(currseg, labelloc);
  889. X        evalr[1].value = $6 << 3;
  890. X        locctr += geninstr(findgen($1, ST_IO02, cpuselect));
  891. X            }
  892. X    ;
  893. Xgenline : KOC_ioop  reg8 ',' '(' topexpr ')' 
  894. X            {
  895. X        genlocrec(currseg, labelloc);
  896. X        evalr[1].value = $2 << 3;
  897. X        pevalexpr(2, $5);
  898. X        locctr += geninstr(findgen($1, ST_IO03, cpuselect
  899. X            | ($2 == VALREGA ? REGISA : 0)));
  900. X            }
  901. X    ;
  902. Xgenline : KOC_ioop  reg8 ',' '(' REGC ')' 
  903. X            {
  904. X        genlocrec(currseg, labelloc);
  905. X        evalr[1].value = $2 << 3;
  906. X        locctr += geninstr(findgen($1, ST_IO04, cpuselect));
  907. X            }
  908. X    ;
  909. Xgenline : KOC_ldop  '(' dreg ')' ',' topexpr 
  910. X            {
  911. X        genlocrec(currseg, labelloc);
  912. X        pevalexpr(1, $6);
  913. X        locctr += geninstr(findgen($1, ST_LD01, cpuselect|$3));
  914. X            }
  915. X    ;
  916. Xgenline : KOC_ldop  '(' dreg ')' ',' reg8 
  917. X            {
  918. X        genlocrec(currseg, labelloc);
  919. X        evalr[1].value = $6;
  920. X        locctr += geninstr(findgen($1, ST_LD02, cpuselect
  921. X            | $3 | ($6 == VALREGA ? REGISA : 0)));
  922. X            }
  923. X    ;
  924. Xgenline : KOC_ldop  '(' topexpr ')' ',' dreg 
  925. X            {
  926. X        genlocrec(currseg, labelloc);
  927. X        pevalexpr(1, $3);
  928. X        locctr += geninstr(findgen($1, ST_LD03, cpuselect|$6));
  929. X            }
  930. X    ;
  931. Xgenline : KOC_ldop  '(' topexpr ')' ',' REGA 
  932. X            {
  933. X        genlocrec(currseg, labelloc);
  934. X        pevalexpr(1, $3);
  935. X        locctr += geninstr(findgen($1, ST_LD04, cpuselect));
  936. X            }
  937. X    ;
  938. Xgenline : KOC_ldop  dreg ',' '(' topexpr ')' 
  939. X            {
  940. X        genlocrec(currseg, labelloc);
  941. X        pevalexpr(1, $5);
  942. X        locctr += geninstr(findgen($1, ST_LD05, cpuselect|$2));
  943. X            }
  944. X    ;
  945. Xgenline : KOC_ldop  dreg ',' dreg 
  946. X            {
  947. X        genlocrec(currseg, labelloc);
  948. X        locctr += geninstr(findgen($1, ST_LD06, cpuselect|$4
  949. X            | ($2 == DRSP ? DRDESTSP : 0)));
  950. X            }
  951. X    ;
  952. Xgenline : KOC_ldop  dreg ',' topexpr 
  953. X            {
  954. X        genlocrec(currseg, labelloc);
  955. X        pevalexpr(1, $4);
  956. X        locctr += geninstr(findgen($1, ST_LD07, cpuselect|$2));
  957. X            }
  958. X    ;
  959. Xgenline : KOC_ldop  index ',' expr 
  960. X            {
  961. X        genlocrec(currseg, labelloc);
  962. X        pevalexpr(1, $2.exp);
  963. X        pevalexpr(2, $4);
  964. X        locctr += geninstr(findgen($1, ST_LD08, cpuselect|$2.indsel));
  965. X            }
  966. X    ;
  967. Xgenline : KOC_ldop  index ',' reg8 
  968. X            {
  969. X        genlocrec(currseg, labelloc);
  970. X        pevalexpr(1,$2.exp);
  971. X        evalr[2].value = $4;
  972. X        locctr += geninstr(findgen($1, ST_LD09, cpuselect|$2.indsel));
  973. X            }
  974. X    ;
  975. Xgenline : KOC_ldop  reg8 ',' '(' dreg ')' 
  976. X            {
  977. X        genlocrec(currseg, labelloc);
  978. X        evalr[1].value = $2 << 3;
  979. X        locctr += geninstr(findgen($1, ST_LD10, cpuselect
  980. X            | $5 | ($2 == VALREGA ? REGISA : 0)));
  981. X            }
  982. X    ;
  983. Xgenline : KOC_ldop  reg8 ',' topexpr 
  984. X            {
  985. X        genlocrec(currseg, labelloc);
  986. X        evalr[1].value = $2 << 3;
  987. X        pevalexpr(2, $4);
  988. X        locctr += geninstr(findgen($1, ST_LD11, cpuselect));
  989. X            }
  990. X    ;
  991. Xgenline : KOC_ldop  reg8 ',' index 
  992. X            {
  993. X        genlocrec(currseg, labelloc);
  994. X        evalr[1].value = $2 << 3;
  995. X        pevalexpr(2, $4.exp);
  996. X        locctr += geninstr(findgen($1, ST_LD12, cpuselect|$4.indsel));
  997. X            }
  998. X    ;
  999. Xgenline : KOC_ldop  reg8 ',' reg8 
  1000. X            {
  1001. X        genlocrec(currseg, labelloc);
  1002. X        evalr[1].value = ($2 << 3 ) | $4;
  1003. X        locctr += geninstr(findgen($1, ST_LD13, cpuselect));
  1004. X            }
  1005. X    ;
  1006. Xgenline : KOC_ldop  reg8 ',' '(' topexpr ')' 
  1007. X            {
  1008. X        genlocrec(currseg, labelloc);
  1009. X        pevalexpr(1, $5);
  1010. X        locctr += geninstr(findgen($1, ST_LD14, cpuselect
  1011. X            | ($2 == VALREGA ? REGISA : 0)));
  1012. X            }
  1013. X    ;
  1014. Xgenline : KOC_ldop  reg8 ',' specialr 
  1015. X            {
  1016. X        genlocrec(currseg, labelloc);
  1017. X        locctr += geninstr(findgen($1, ST_LD15, cpuselect|$4
  1018. X            | ($2 == VALREGA ? REGISA : 0)));
  1019. X            }
  1020. X    ;
  1021. Xgenline : KOC_ldop  specialr ',' REGA 
  1022. X            {
  1023. X        genlocrec(currseg, labelloc);
  1024. X        locctr += geninstr(findgen($1, ST_LD16, cpuselect|$2));
  1025. X            }
  1026. X    ;
  1027. Xgenline : KOC_opcode 
  1028. X            {
  1029. X        genlocrec(currseg, labelloc);
  1030. X        locctr += geninstr(findgen($1, ST_N01, cpuselect));
  1031. X            }
  1032. X    ;
  1033. Xgenline : KOC_opcode  '(' DREGHL ')' 
  1034. X            {
  1035. X        genlocrec(currseg, labelloc);
  1036. X        locctr += geninstr(findgen($1, ST_N02, cpuselect));
  1037. X            }
  1038. X    ;
  1039. Xgenline : KOC_opcode  dreg 
  1040. X            {
  1041. X        genlocrec(currseg, labelloc);
  1042. X        locctr += geninstr(findgen($1, ST_N04, cpuselect|$2));
  1043. X            }
  1044. X    ;
  1045. Xgenline : KOC_opcode  dreg ',' dreg 
  1046. X            {
  1047. X        int selc = 0;
  1048. X
  1049. X        genlocrec(currseg, labelloc);
  1050. X        switch($2)
  1051. X        {
  1052. X        case DRIX:
  1053. X            selc = DRDESTIX;
  1054. X            break;
  1055. X        case DRIY:
  1056. X            selc = DRDESTIY;
  1057. X            break;
  1058. X        case DRHL:
  1059. X            selc = DRDESTHL;
  1060. X        default:
  1061. X            break;
  1062. X        }
  1063. X        locctr += geninstr(findgen($1, ST_N05, cpuselect
  1064. X            | $4| selc));
  1065. X            }
  1066. X    ;
  1067. Xgenline : KOC_opcode  topexpr 
  1068. X            {
  1069. X        genlocrec(currseg, labelloc);
  1070. X        pevalexpr(1, $2);
  1071. X        locctr += geninstr(findgen($1, ST_N06, cpuselect));
  1072. X            }
  1073. X    ;
  1074. Xgenline : KOC_opcode  index 
  1075. X            {
  1076. X        genlocrec(currseg, labelloc);
  1077. X        pevalexpr(1, $2.exp);
  1078. X        locctr += geninstr(findgen($1, ST_N07, cpuselect|$2.indsel));
  1079. X            }
  1080. X    ;
  1081. Xgenline : KOC_opcode  reg8 
  1082. X            {
  1083. X        genlocrec(currseg, labelloc);
  1084. X        evalr[1].value = $2;
  1085. X        evalr[2].value = $2 << 3;
  1086. X        locctr += geninstr(findgen($1, ST_N08, cpuselect));
  1087. X            }
  1088. X    ;
  1089. Xgenline : KOC_opcode  reg8 ',' '(' DREGHL ')' 
  1090. X            {
  1091. X        genlocrec(currseg, labelloc);
  1092. X        locctr += geninstr(findgen($1, ST_N09, cpuselect
  1093. X            | ($2 == VALREGA ? REGISA : 0)));
  1094. X            }
  1095. X    ;
  1096. Xgenline : KOC_opcode  reg8 ',' topexpr 
  1097. X            {
  1098. X        genlocrec(currseg, labelloc);
  1099. X        pevalexpr(1, $4);
  1100. X        locctr += geninstr(findgen($1, ST_N10, cpuselect
  1101. X            | ($2 == VALREGA ? REGISA : 0)));
  1102. X            }
  1103. X    ;
  1104. Xgenline : KOC_opcode  reg8 ',' index 
  1105. X            {
  1106. X        genlocrec(currseg, labelloc);
  1107. X        pevalexpr(1, $4.exp);
  1108. X        locctr += geninstr(findgen($1, ST_N11, cpuselect|$4.indsel
  1109. X            | ($2 == VALREGA ? REGISA : 0)));
  1110. X            }
  1111. X    ;
  1112. Xgenline : KOC_opcode  reg8 ',' reg8 
  1113. X            {
  1114. X        genlocrec(currseg, labelloc);
  1115. X        evalr[1].value = $4;
  1116. X        locctr += geninstr(findgen($1, ST_N12, cpuselect
  1117. X            | ($2 == VALREGA ? REGISA : 0)));
  1118. X            }
  1119. X    ;
  1120. Xgenline : KOC_restart  expr 
  1121. X            {
  1122. X        int selc = 0;
  1123. X
  1124. X        genlocrec(currseg, labelloc);
  1125. X        pevalexpr(1, $2);
  1126. X        if(evalr[1].seg != SSG_ABS)
  1127. X        {
  1128. X            fraerror("noncomputable expression for address");
  1129. X        }
  1130. X        else
  1131. X        {
  1132. X            selc = evalr[1].value;
  1133. X            switch(selc)
  1134. X            {
  1135. X            case 0:
  1136. X            case 0x8:
  1137. X            case 0x10:
  1138. X            case 0x18:
  1139. X            case 0x20:
  1140. X            case 0x28:
  1141. X            case 0x30:
  1142. X            case 0x38:
  1143. X                break;
  1144. X            default:
  1145. X                fraerror("invalid value for reset expression");
  1146. X                break;
  1147. X            }
  1148. X        }
  1149. X        evalr[1].value &= 070;    
  1150. X        locctr += geninstr(findgen($1, ST_R01, cpuselect));
  1151. X            }
  1152. X    ;
  1153. X
  1154. Xreg8    :    REGA
  1155. X    |    REGB
  1156. X    |    REGC
  1157. X    |    REGD
  1158. X    |    REGE
  1159. X    |    REGH
  1160. X    |    REGL
  1161. X    ;
  1162. X
  1163. Xdreg    :    DREGAF
  1164. X    |    DREGBC
  1165. X    |    DREGDE
  1166. X    |    DREGHL
  1167. X    |    DREGIX
  1168. X    |    DREGIY
  1169. X    |    DREGSP
  1170. X    ;
  1171. X
  1172. Xcondition :    CONDZ
  1173. X    |    CONDNZ
  1174. X    |    CONDNC
  1175. X    |    CONDPE
  1176. X    |    CONDPO
  1177. X    |    CONDP
  1178. X    |    CONDM
  1179. X    |    REGC
  1180. X            {
  1181. X        $$ = CCSELC;
  1182. X            }
  1183. X    ;
  1184. X
  1185. Xspecialr :    SREGI
  1186. X    |    SREGR
  1187. X    ;
  1188. X
  1189. Xindex :    '(' ixoriy '+' expr ')'
  1190. X            {
  1191. X        $$.exp = $4;
  1192. X        $$.indsel = $2;
  1193. X            }
  1194. X    ;
  1195. X
  1196. Xixoriy    :    DREGIX
  1197. X    |    DREGIY
  1198. X    ;
  1199. X
  1200. Xtopexpr    :    '+' expr %prec KEOP_MUN
  1201. X            {
  1202. X                $$ = $2;
  1203. X            }
  1204. X    |    '-' expr %prec KEOP_MUN
  1205. X            {
  1206. X                $$ = exprnode(PCCASE_UN,$2,IFC_NEG,0,0L,
  1207. X                    SYMNULL);
  1208. X            }
  1209. X    |    KEOP_NOT expr
  1210. X            {
  1211. X                $$ = exprnode(PCCASE_UN,$2,IFC_NOT,0,0L,
  1212. X                    SYMNULL);
  1213. X            }
  1214. X    |    KEOP_HIGH expr
  1215. X            {
  1216. X                $$ = exprnode(PCCASE_UN,$2,IFC_HIGH,0,0L,
  1217. X                    SYMNULL);
  1218. X            }
  1219. X    |    KEOP_LOW expr
  1220. X            {
  1221. X                $$ = exprnode(PCCASE_UN,$2,IFC_LOW,0,0L,
  1222. X                    SYMNULL);
  1223. X            }
  1224. X    |    expr '*' expr
  1225. X            {
  1226. X                $$ = exprnode(PCCASE_BIN,$1,IFC_MUL,$3,0L,
  1227. X                    SYMNULL);
  1228. X            }
  1229. X    |    expr '/' expr
  1230. X            {
  1231. X                $$ = exprnode(PCCASE_BIN,$1,IFC_DIV,$3,0L,
  1232. X                    SYMNULL);
  1233. X            }
  1234. X    |    expr '+' expr
  1235. X            {
  1236. X                $$ = exprnode(PCCASE_BIN,$1,IFC_ADD,$3,0L,
  1237. X                    SYMNULL);
  1238. X            }
  1239. X    |    expr '-' expr
  1240. X            {
  1241. X                $$ = exprnode(PCCASE_BIN,$1,IFC_SUB,$3,0L,
  1242. X                    SYMNULL);
  1243. X            }
  1244. X    |    expr KEOP_MOD expr
  1245. X            {
  1246. X                $$ = exprnode(PCCASE_BIN,$1,IFC_MOD,$3,0L,
  1247. X                    SYMNULL);
  1248. X            }
  1249. X    |    expr KEOP_SHL expr
  1250. X            {
  1251. X                $$ = exprnode(PCCASE_BIN,$1,IFC_SHL,$3,0L,
  1252. X                    SYMNULL);
  1253. X            }
  1254. X    |    expr KEOP_SHR expr
  1255. X            {
  1256. X                $$ = exprnode(PCCASE_BIN,$1,IFC_SHR,$3,0L,
  1257. X                    SYMNULL);
  1258. X            }
  1259. X    |    expr KEOP_GT expr
  1260. X            {
  1261. X                $$ = exprnode(PCCASE_BIN,$1,IFC_GT,$3,0L,
  1262. X                    SYMNULL);
  1263. X            }
  1264. X    |    expr KEOP_GE expr
  1265. X            {
  1266. X                $$ = exprnode(PCCASE_BIN,$1,IFC_GE,$3,0L,
  1267. X                    SYMNULL);
  1268. X            }
  1269. X    |    expr KEOP_LT expr
  1270. X            {
  1271. X                $$ = exprnode(PCCASE_BIN,$1,IFC_LT,$3,0L,
  1272. X                    SYMNULL);
  1273. X            }
  1274. X    |    expr KEOP_LE expr
  1275. X            {
  1276. X                $$ = exprnode(PCCASE_BIN,$1,IFC_LE,$3,0L,
  1277. X                    SYMNULL);
  1278. X            }
  1279. X    |    expr KEOP_NE expr
  1280. X            {
  1281. X                $$ = exprnode(PCCASE_BIN,$1,IFC_NE,$3,0L,
  1282. X                    SYMNULL);
  1283. X            }
  1284. X    |    expr KEOP_EQ expr
  1285. X            {
  1286. X                $$ = exprnode(PCCASE_BIN,$1,IFC_EQ,$3,0L,
  1287. X                    SYMNULL);
  1288. X            }
  1289. X    |    expr KEOP_AND expr
  1290. X            {
  1291. X                $$ = exprnode(PCCASE_BIN,$1,IFC_AND,$3,0L,
  1292. X                    SYMNULL);
  1293. X            }
  1294. X    |    expr KEOP_OR expr
  1295. X            {
  1296. X                $$ = exprnode(PCCASE_BIN,$1,IFC_OR,$3,0L,
  1297. X                    SYMNULL);
  1298. X            }
  1299. X    |    expr KEOP_XOR expr
  1300. X            {
  1301. X                $$ = exprnode(PCCASE_BIN,$1,IFC_XOR,$3,0L,
  1302. X                    SYMNULL);
  1303. X            }
  1304. X    |    KEOP_DEFINED SYMBOL
  1305. X            {
  1306. X                $$ = exprnode(PCCASE_DEF,0,IGP_DEFINED,0,0L,$2);
  1307. X            }
  1308. X    |    SYMBOL
  1309. X            {
  1310. X                $$ = exprnode(PCCASE_SYMB,0,IFC_SYMB,0,0L,$1);
  1311. X            }
  1312. X    |    '*'
  1313. X            {
  1314. X                $$ = exprnode(PCCASE_PROGC,0,IFC_PROGCTR,0,
  1315. X                    labelloc, SYMNULL);
  1316. X            }
  1317. X    |    CONSTANT
  1318. X            {
  1319. X                $$ = exprnode(PCCASE_CONS,0,IGP_CONSTANT,0,$1,
  1320. X                    SYMNULL);
  1321. X            }
  1322. X    |    STRING
  1323. X            {
  1324. X                char *sourcestr = $1;
  1325. X                long accval = 0;
  1326. X
  1327. X                if(strlen($1) > 0)
  1328. X                {
  1329. X                    accval = chtran(&sourcestr);
  1330. X                    if(*sourcestr != '\0')
  1331. X                    {
  1332. X                        accval = (accval << 8) +
  1333. X                            chtran(&sourcestr);
  1334. X                    }
  1335. X
  1336. X                    if( *sourcestr != '\0')
  1337. X                    {
  1338. X    frawarn("string constant in expression more than 2 characters long");
  1339. X                    }
  1340. X                }
  1341. X                $$ = exprnode(PCCASE_CONS, 0, IGP_CONSTANT, 0,
  1342. X                    accval, SYMNULL);
  1343. X            }
  1344. X    ;
  1345. X
  1346. Xexpr    :    '(' topexpr ')'
  1347. X            {
  1348. X                $$ = $2;
  1349. X            }
  1350. X    |    topexpr
  1351. X    ;
  1352. X
  1353. X
  1354. X
  1355. X%%
  1356. X
  1357. Xlexintercept()
  1358. X/*
  1359. X    description    intercept the call to yylex (the lexical analyzer)
  1360. X            and filter out all unnecessary tokens when skipping
  1361. X            the input between a failed IF and its matching ENDI or
  1362. X            ELSE
  1363. X    globals     fraifskip    the enable flag
  1364. X*/
  1365. X{
  1366. X#undef yylex
  1367. X
  1368. X    int rv;
  1369. X
  1370. X    if(fraifskip)
  1371. X    {
  1372. X        for(;;)
  1373. X        {
  1374. X
  1375. X            switch(rv = yylex())
  1376. X
  1377. X            {
  1378. X            case 0:
  1379. X            case KOC_END:
  1380. X            case KOC_IF:
  1381. X            case KOC_ELSE:
  1382. X            case KOC_ENDI:
  1383. X            case EOL:
  1384. X                return rv;
  1385. X            default:
  1386. X                break;
  1387. X            }
  1388. X        }
  1389. X    }
  1390. X    else
  1391. X        return yylex();
  1392. X#define yylex lexintercept
  1393. X}
  1394. X
  1395. X
  1396. Xsetreserved()
  1397. X{
  1398. X
  1399. X    reservedsym("and", KEOP_AND, 0);
  1400. X    reservedsym("defined", KEOP_DEFINED,0);
  1401. X    reservedsym("eq", KEOP_EQ, 0);
  1402. X    reservedsym("ge", KEOP_GE, 0);
  1403. X    reservedsym("gt", KEOP_GT, 0);
  1404. X    reservedsym("high", KEOP_HIGH, 0);
  1405. X    reservedsym("le", KEOP_LE, 0);
  1406. X    reservedsym("low", KEOP_LOW, 0);
  1407. X    reservedsym("lt", KEOP_LT, 0);
  1408. X    reservedsym("mod", KEOP_MOD, 0);
  1409. X    reservedsym("ne", KEOP_NE, 0);
  1410. X    reservedsym("not", KEOP_NOT, 0);
  1411. X    reservedsym("or", KEOP_OR, 0);
  1412. X    reservedsym("shl", KEOP_SHL, 0);
  1413. X    reservedsym("shr", KEOP_SHR, 0);
  1414. X    reservedsym("xor", KEOP_XOR, 0);
  1415. X    reservedsym("AND", KEOP_AND, 0);
  1416. X    reservedsym("DEFINED", KEOP_DEFINED,0);
  1417. X    reservedsym("EQ", KEOP_EQ, 0);
  1418. X    reservedsym("GE", KEOP_GE, 0);
  1419. X    reservedsym("GT", KEOP_GT, 0);
  1420. X    reservedsym("HIGH", KEOP_HIGH, 0);
  1421. X    reservedsym("LE", KEOP_LE, 0);
  1422. X    reservedsym("LOW", KEOP_LOW, 0);
  1423. X    reservedsym("LT", KEOP_LT, 0);
  1424. X    reservedsym("MOD", KEOP_MOD, 0);
  1425. X    reservedsym("NE", KEOP_NE, 0);
  1426. X    reservedsym("NOT", KEOP_NOT, 0);
  1427. X    reservedsym("OR", KEOP_OR, 0);
  1428. X    reservedsym("SHL", KEOP_SHL, 0);
  1429. X    reservedsym("SHR", KEOP_SHR, 0);
  1430. X    reservedsym("XOR", KEOP_XOR, 0);
  1431. X
  1432. X    reservedsym("i",SREGI,SPECIALIR);
  1433. X    reservedsym("r",SREGR,SPECIALRR);
  1434. X    reservedsym("I",SREGI,SPECIALIR);
  1435. X    reservedsym("R",SREGR,SPECIALRR);
  1436. X    reservedsym("a",REGA,VALREGA);
  1437. X    reservedsym("b",REGB,VALREGB);
  1438. X    reservedsym("c",REGC,VALREGC);
  1439. X    reservedsym("d",REGD,VALREGD);
  1440. X    reservedsym("e",REGE,VALREGE);
  1441. X    reservedsym("h",REGH,VALREGH);
  1442. X    reservedsym("l",REGL,VALREGL);
  1443. X    reservedsym("af",DREGAF,DRAF);
  1444. X    reservedsym("bc",DREGBC,DRBC);
  1445. X    reservedsym("de",DREGDE,DRDE);
  1446. X    reservedsym("hl",DREGHL,DRHL);
  1447. X    reservedsym("ix",DREGIX,DRIX);
  1448. X    reservedsym("iy",DREGIY,DRIY);
  1449. X    reservedsym("sp",DREGSP,DRSP);
  1450. X    reservedsym("z",CONDZ,CCSELZ);
  1451. X    reservedsym("nz",CONDNZ,CCSELNZ);
  1452. X    reservedsym("nc",CONDNC,CCSELNC);
  1453. X    reservedsym("pe",CONDPE,CCSELPE);
  1454. X    reservedsym("po",CONDPO,CCSELPO);
  1455. X    reservedsym("p",CONDP,CCSELP);
  1456. X    reservedsym("m",CONDM,CCSELM);
  1457. X    reservedsym("A",REGA,VALREGA);
  1458. X    reservedsym("B",REGB,VALREGB);
  1459. X    reservedsym("C",REGC,VALREGC);
  1460. X    reservedsym("D",REGD,VALREGD);
  1461. X    reservedsym("E",REGE,VALREGE);
  1462. X    reservedsym("H",REGH,VALREGH);
  1463. X    reservedsym("L",REGL,VALREGL);
  1464. X    reservedsym("AF",DREGAF,DRAF);
  1465. X    reservedsym("BC",DREGBC,DRBC);
  1466. X    reservedsym("DE",DREGDE,DRDE);
  1467. X    reservedsym("HL",DREGHL,DRHL);
  1468. X    reservedsym("IX",DREGIX,DRIX);
  1469. X    reservedsym("IY",DREGIY,DRIY);
  1470. X    reservedsym("SP",DREGSP,DRSP);
  1471. X    reservedsym("Z",CONDZ,CCSELZ);
  1472. X    reservedsym("NZ",CONDNZ,CCSELNZ);
  1473. X    reservedsym("NC",CONDNC,CCSELNC);
  1474. X    reservedsym("PE",CONDPE,CCSELPE);
  1475. X    reservedsym("PO",CONDPO,CCSELPO);
  1476. X    reservedsym("P",CONDP,CCSELP);
  1477. X    reservedsym("M",CONDM,CCSELM);
  1478. X
  1479. X}
  1480. X
  1481. Xcpumatch(str)
  1482. X    char * str;
  1483. X{
  1484. X    int msub;
  1485. X
  1486. X    static struct
  1487. X    {
  1488. X        char * mtch;
  1489. X        int   cpuv;
  1490. X    } matchtab[] =
  1491. X    {
  1492. X        {"180", CPU64180},
  1493. X        {"z80", CPUZ80},
  1494. X        {"Z80", CPUZ80},
  1495. X        {"85", CPU8085},
  1496. X        {"80", CPU8080},
  1497. X        {"", 0} 
  1498. X    };
  1499. X
  1500. X    for(msub = 0; matchtab[msub].cpuv != 0; msub++)
  1501. X    {
  1502. X        if(strcontains(str, matchtab[msub].mtch))
  1503. X        {
  1504. X            cpuselect = matchtab[msub].cpuv;
  1505. X            return TRUE;
  1506. X        }
  1507. X    }
  1508. X
  1509. X    return FALSE;
  1510. X}
  1511. X
  1512. Xstrcontains(s1, sm)
  1513. X    char * s1, *sm;
  1514. X{
  1515. X    int l1 = strlen(s1), lm = strlen(sm);
  1516. X
  1517. X    for(; l1 >= lm; l1--, s1++)
  1518. X    {
  1519. X        if(strncmp(s1, sm, lm) == 0)
  1520. X        {
  1521. X            return TRUE;
  1522. X        }
  1523. X    }
  1524. X    return FALSE;
  1525. X}
  1526. X
  1527. X/*
  1528. X    description    Opcode and Instruction generation tables
  1529. X    usage        Unix, framework crossassembler
  1530. X    history        September 25, 1987
  1531. X*/
  1532. X
  1533. X#define NUMOPCODE 104
  1534. X#define NUMSYNBLK 159
  1535. X#define NUMDIFFOP 276
  1536. X
  1537. Xint gnumopcode = NUMOPCODE;
  1538. X
  1539. Xint ophashlnk[NUMOPCODE];
  1540. X
  1541. Xstruct opsym optab[NUMOPCODE+1]
  1542. X    = {
  1543. X    {"invalid", KOC_opcode, 2, 0 },
  1544. X    {"ADC", KOC_opcode, 5, 2 },
  1545. X    {"ADD", KOC_opcode, 5, 7 },
  1546. X    {"AND", KOC_opcode, 4, 12 },
  1547. X    {"BIT", KOC_bit, 3, 16 },
  1548. X    {"BYTE", KOC_BDEF, 0, 0 },
  1549. X    {"CALL", KOC_ccop, 2, 19 },
  1550. X    {"CCF", KOC_opcode, 1, 21 },
  1551. X    {"CHARDEF", KOC_CHDEF, 0, 0 },
  1552. X    {"CHARSET", KOC_CHSET, 0, 0 },
  1553. X    {"CHARUSE", KOC_CHUSE, 0, 0 },
  1554. X    {"CHD", KOC_CHDEF, 0, 0 },
  1555. X    {"CP", KOC_opcode, 4, 22 },
  1556. X    {"CPD", KOC_opcode, 1, 26 },
  1557. X    {"CPDR", KOC_opcode, 1, 27 },
  1558. X    {"CPI", KOC_opcode, 1, 28 },
  1559. X    {"CPIR", KOC_opcode, 1, 29 },
  1560. X    {"CPL", KOC_opcode, 1, 30 },
  1561. X    {"CPU", KOC_CPU, 0, 0 },
  1562. X    {"DAA", KOC_opcode, 1, 31 },
  1563. X    {"DB", KOC_BDEF, 0, 0 },
  1564. X    {"DEC", KOC_opcode, 4, 32 },
  1565. X    {"DI", KOC_opcode, 1, 36 },
  1566. X    {"DJNZ", KOC_opcode, 1, 37 },
  1567. X    {"DW", KOC_WDEF, 0, 0 },
  1568. X    {"EI", KOC_opcode, 1, 38 },
  1569. X    {"ELSE", KOC_ELSE, 0, 0 },
  1570. X    {"END", KOC_END, 0, 0 },
  1571. X    {"ENDI", KOC_ENDI, 0, 0 },
  1572. X    {"EQU", KOC_EQU, 0, 0 },
  1573. X    {"EX", KOC_exop, 2, 39 },
  1574. X    {"EXX", KOC_opcode, 1, 41 },
  1575. X    {"FCB", KOC_BDEF, 0, 0 },
  1576. X    {"FCC", KOC_SDEF, 0, 0 },
  1577. X    {"FDB", KOC_WDEF, 0, 0 },
  1578. X    {"HALT", KOC_opcode, 1, 42 },
  1579. X    {"IF", KOC_IF, 0, 0 },
  1580. X    {"IM", KOC_intmode, 1, 43 },
  1581. X    {"IN0", KOC_ioop, 1, 44 },
  1582. X    {"IN", KOC_ioop, 2, 45 },
  1583. X    {"INC", KOC_opcode, 4, 47 },
  1584. X    {"INCL", KOC_INCLUDE, 0, 0 },
  1585. X    {"INCLUDE", KOC_INCLUDE, 0, 0 },
  1586. X    {"IND", KOC_opcode, 1, 51 },
  1587. X    {"INDR", KOC_opcode, 1, 52 },
  1588. X    {"INI", KOC_opcode, 1, 53 },
  1589. X    {"INIR", KOC_opcode, 1, 54 },
  1590. X    {"JP", KOC_ccop, 3, 55 },
  1591. X    {"JR", KOC_ccop, 2, 58 },
  1592. X    {"LD", KOC_ldop, 16, 60 },
  1593. X    {"LDD", KOC_opcode, 1, 76 },
  1594. X    {"LDDR", KOC_opcode, 1, 77 },
  1595. X    {"LDI", KOC_opcode, 1, 78 },
  1596. X    {"LDIR", KOC_opcode, 1, 79 },
  1597. X    {"MULT", KOC_opcode, 1, 80 },
  1598. X    {"NEG", KOC_opcode, 1, 81 },
  1599. X    {"NOP", KOC_opcode, 1, 82 },
  1600. X    {"OR", KOC_opcode, 4, 83 },
  1601. X    {"ORG", KOC_ORG, 0, 0 },
  1602. X    {"OTDM", KOC_opcode, 1, 87 },
  1603. X    {"OTDMR", KOC_opcode, 1, 88 },
  1604. X    {"OTDR", KOC_opcode, 1, 89 },
  1605. X    {"OTIM", KOC_opcode, 1, 90 },
  1606. X    {"OTIMR", KOC_opcode, 1, 91 },
  1607. X    {"OTIR", KOC_opcode, 1, 92 },
  1608. X    {"OUT0", KOC_ioop, 1, 93 },
  1609. X    {"OUT", KOC_ioop, 2, 94 },
  1610. X    {"OUTD", KOC_opcode, 1, 96 },
  1611. X    {"OUTI", KOC_opcode, 1, 97 },
  1612. X    {"POP", KOC_opcode, 1, 98 },
  1613. X    {"PUSH", KOC_opcode, 1, 99 },
  1614. X    {"RES", KOC_bit, 3, 100 },
  1615. X    {"RESERVE", KOC_RESM, 0, 0 },
  1616. X    {"RET", KOC_ccop, 2, 103 },
  1617. X    {"RETI", KOC_opcode, 1, 105 },
  1618. X    {"RETN", KOC_opcode, 1, 106 },
  1619. X    {"RIM", KOC_opcode, 1, 107 },
  1620. X    {"RL", KOC_opcode, 3, 108 },
  1621. X    {"RLA", KOC_opcode, 1, 111 },
  1622. X    {"RLC", KOC_opcode, 3, 112 },
  1623. X    {"RLCA", KOC_opcode, 1, 115 },
  1624. X    {"RLD", KOC_opcode, 1, 116 },
  1625. X    {"RMB", KOC_RESM, 0, 0 },
  1626. X    {"RR", KOC_opcode, 3, 117 },
  1627. X    {"RRA", KOC_opcode, 1, 120 },
  1628. X    {"RRC", KOC_opcode, 3, 121 },
  1629. X    {"RRCA", KOC_opcode, 1, 124 },
  1630. X    {"RRD", KOC_opcode, 1, 125 },
  1631. X    {"RST", KOC_restart, 1, 126 },
  1632. X    {"SBC", KOC_opcode, 5, 127 },
  1633. X    {"SCF", KOC_opcode, 1, 132 },
  1634. X    {"SET", KOC_bit, 3, 133 },
  1635. X    {"SETEQU", KOC_SET, 0, 0 },
  1636. X    {"SIM", KOC_opcode, 1, 136 },
  1637. X    {"SLA", KOC_opcode, 3, 137 },
  1638. X    {"SLP", KOC_opcode, 1, 140 },
  1639. X    {"SRA", KOC_opcode, 3, 141 },
  1640. X    {"SRL", KOC_opcode, 3, 144 },
  1641. X    {"STRING", KOC_SDEF, 0, 0 },
  1642. X    {"SUB", KOC_opcode, 4, 147 },
  1643. X    {"TST", KOC_opcode, 3, 151 },
  1644. X    {"TSTIO", KOC_opcode, 1, 154 },
  1645. X    {"WORD", KOC_WDEF, 0, 0 },
  1646. X    {"XOR", KOC_opcode, 4, 155 },
  1647. X    { "", 0, 0, 0 }};
  1648. X
  1649. Xstruct opsynt ostab[NUMSYNBLK+1]
  1650. X    = {
  1651. X/* invalid 0 */ { 0, 1, 0 },
  1652. X/* invalid 1 */ { 0xffff, 1, 1 },
  1653. X/* ADC 2 */ { ST_N05, 4, 2 },
  1654. X/* ADC 3 */ { ST_N09, 1, 6 },
  1655. X/* ADC 4 */ { ST_N10, 1, 7 },
  1656. X/* ADC 5 */ { ST_N11, 2, 8 },
  1657. X/* ADC 6 */ { ST_N12, 1, 10 },
  1658. X/* ADD 7 */ { ST_N05, 12, 11 },
  1659. X/* ADD 8 */ { ST_N09, 1, 23 },
  1660. X/* ADD 9 */ { ST_N10, 1, 24 },
  1661. X/* ADD 10 */ { ST_N11, 2, 25 },
  1662. X/* ADD 11 */ { ST_N12, 1, 27 },
  1663. X/* AND 12 */ { ST_N02, 1, 28 },
  1664. X/* AND 13 */ { ST_N06, 1, 29 },
  1665. X/* AND 14 */ { ST_N07, 2, 30 },
  1666. X/* AND 15 */ { ST_N08, 1, 32 },
  1667. X/* BIT 16 */ { ST_B01, 1, 33 },
  1668. X/* BIT 17 */ { ST_B02, 2, 34 },
  1669. X/* BIT 18 */ { ST_B03, 1, 36 },
  1670. X/* CALL 19 */ { ST_CC02, 8, 37 },
  1671. X/* CALL 20 */ { ST_CC03, 1, 45 },
  1672. X/* CCF 21 */ { ST_N01, 1, 46 },
  1673. X/* CP 22 */ { ST_N02, 1, 47 },
  1674. X/* CP 23 */ { ST_N06, 1, 48 },
  1675. X/* CP 24 */ { ST_N07, 2, 49 },
  1676. X/* CP 25 */ { ST_N08, 1, 51 },
  1677. X/* CPD 26 */ { ST_N01, 1, 52 },
  1678. X/* CPDR 27 */ { ST_N01, 1, 53 },
  1679. X/* CPI 28 */ { ST_N01, 1, 54 },
  1680. X/* CPIR 29 */ { ST_N01, 1, 55 },
  1681. X/* CPL 30 */ { ST_N01, 1, 56 },
  1682. X/* DAA 31 */ { ST_N01, 1, 57 },
  1683. X/* DEC 32 */ { ST_N02, 1, 58 },
  1684. X/* DEC 33 */ { ST_N04, 6, 59 },
  1685. X/* DEC 34 */ { ST_N07, 2, 65 },
  1686. X/* DEC 35 */ { ST_N08, 1, 67 },
  1687. X/* DI 36 */ { ST_N01, 1, 68 },
  1688. X/* DJNZ 37 */ { ST_N06, 1, 69 },
  1689. X/* EI 38 */ { ST_N01, 1, 70 },
  1690. X/* EX 39 */ { ST_EX01, 2, 71 },
  1691. X/* EX 40 */ { ST_EX02, 3, 73 },
  1692. X/* EXX 41 */ { ST_N01, 1, 76 },
  1693. X/* HALT 42 */ { ST_N01, 1, 77 },
  1694. X/* IM 43 */ { ST_IM01, 3, 78 },
  1695. X/* IN0 44 */ { ST_IO03, 1, 81 },
  1696. X/* IN 45 */ { ST_IO03, 1, 82 },
  1697. X/* IN 46 */ { ST_IO04, 1, 83 },
  1698. X/* INC 47 */ { ST_N02, 1, 84 },
  1699. X/* INC 48 */ { ST_N04, 6, 85 },
  1700. X/* INC 49 */ { ST_N07, 2, 91 },
  1701. X/* INC 50 */ { ST_N08, 1, 93 },
  1702. X/* IND 51 */ { ST_N01, 1, 94 },
  1703. X/* INDR 52 */ { ST_N01, 1, 95 },
  1704. X/* INI 53 */ { ST_N01, 1, 96 },
  1705. X/* INIR 54 */ { ST_N01, 1, 97 },
  1706. X/* JP 55 */ { ST_CC01, 3, 98 },
  1707. X/* JP 56 */ { ST_CC02, 8, 101 },
  1708. X/* JP 57 */ { ST_CC03, 1, 109 },
  1709. X/* JR 58 */ { ST_CC02, 4, 110 },
  1710. X/* JR 59 */ { ST_CC03, 1, 114 },
  1711. X/* LD 60 */ { ST_LD01, 1, 115 },
  1712. X/* LD 61 */ { ST_LD02, 3, 116 },
  1713. X/* LD 62 */ { ST_LD03, 6, 119 },
  1714. X/* LD 63 */ { ST_LD04, 1, 125 },
  1715. X/* LD 64 */ { ST_LD05, 6, 126 },
  1716. X/* LD 65 */ { ST_LD06, 3, 132 },
  1717. X/* LD 66 */ { ST_LD07, 6, 135 },
  1718. X/* LD 67 */ { ST_LD08, 2, 141 },
  1719. X/* LD 68 */ { ST_LD09, 2, 143 },
  1720. X/* LD 69 */ { ST_LD10, 3, 145 },
  1721. X/* LD 70 */ { ST_LD11, 1, 148 },
  1722. X/* LD 71 */ { ST_LD12, 2, 149 },
  1723. X/* LD 72 */ { ST_LD13, 1, 151 },
  1724. X/* LD 73 */ { ST_LD14, 1, 152 },
  1725. X/* LD 74 */ { ST_LD15, 2, 153 },
  1726. X/* LD 75 */ { ST_LD16, 2, 155 },
  1727. X/* LDD 76 */ { ST_N01, 1, 157 },
  1728. X/* LDDR 77 */ { ST_N01, 1, 158 },
  1729. X/* LDI 78 */ { ST_N01, 1, 159 },
  1730. X/* LDIR 79 */ { ST_N01, 1, 160 },
  1731. X/* MULT 80 */ { ST_N04, 4, 161 },
  1732. X/* NEG 81 */ { ST_N01, 1, 165 },
  1733. X/* NOP 82 */ { ST_N01, 1, 166 },
  1734. X/* OR 83 */ { ST_N02, 1, 167 },
  1735. X/* OR 84 */ { ST_N06, 1, 168 },
  1736. X/* OR 85 */ { ST_N07, 2, 169 },
  1737. X/* OR 86 */ { ST_N08, 1, 171 },
  1738. X/* OTDM 87 */ { ST_N01, 1, 172 },
  1739. X/* OTDMR 88 */ { ST_N01, 1, 173 },
  1740. X/* OTDR 89 */ { ST_N01, 1, 174 },
  1741. X/* OTIM 90 */ { ST_N01, 1, 175 },
  1742. X/* OTIMR 91 */ { ST_N01, 1, 176 },
  1743. X/* OTIR 92 */ { ST_N01, 1, 177 },
  1744. X/* OUT0 93 */ { ST_IO01, 1, 178 },
  1745. X/* OUT 94 */ { ST_IO01, 1, 179 },
  1746. X/* OUT 95 */ { ST_IO02, 1, 180 },
  1747. X/* OUTD 96 */ { ST_N01, 1, 181 },
  1748. X/* OUTI 97 */ { ST_N01, 1, 182 },
  1749. X/* POP 98 */ { ST_N04, 6, 183 },
  1750. X/* PUSH 99 */ { ST_N04, 6, 189 },
  1751. X/* RES 100 */ { ST_B01, 1, 195 },
  1752. X/* RES 101 */ { ST_B02, 2, 196 },
  1753. X/* RES 102 */ { ST_B03, 1, 198 },
  1754. X/* RET 103 */ { ST_CC04, 8, 199 },
  1755. X/* RET 104 */ { ST_CC05, 1, 207 },
  1756. X/* RETI 105 */ { ST_N01, 1, 208 },
  1757. X/* RETN 106 */ { ST_N01, 1, 209 },
  1758. X/* RIM 107 */ { ST_N01, 1, 210 },
  1759. X/* RL 108 */ { ST_N02, 1, 211 },
  1760. X/* RL 109 */ { ST_N07, 2, 212 },
  1761. X/* RL 110 */ { ST_N08, 1, 214 },
  1762. X/* RLA 111 */ { ST_N01, 1, 215 },
  1763. X/* RLC 112 */ { ST_N02, 1, 216 },
  1764. X/* RLC 113 */ { ST_N07, 2, 217 },
  1765. X/* RLC 114 */ { ST_N08, 1, 219 },
  1766. X/* RLCA 115 */ { ST_N01, 1, 220 },
  1767. X/* RLD 116 */ { ST_N01, 1, 221 },
  1768. X/* RR 117 */ { ST_N02, 1, 222 },
  1769. X/* RR 118 */ { ST_N07, 2, 223 },
  1770. X/* RR 119 */ { ST_N08, 1, 225 },
  1771. X/* RRA 120 */ { ST_N01, 1, 226 },
  1772. X/* RRC 121 */ { ST_N02, 1, 227 },
  1773. X/* RRC 122 */ { ST_N07, 2, 228 },
  1774. X/* RRC 123 */ { ST_N08, 1, 230 },
  1775. X/* RRCA 124 */ { ST_N01, 1, 231 },
  1776. X/* RRD 125 */ { ST_N01, 1, 232 },
  1777. X/* RST 126 */ { ST_R01, 1, 233 },
  1778. X/* SBC 127 */ { ST_N05, 4, 234 },
  1779. X/* SBC 128 */ { ST_N09, 1, 238 },
  1780. X/* SBC 129 */ { ST_N10, 1, 239 },
  1781. X/* SBC 130 */ { ST_N11, 2, 240 },
  1782. X/* SBC 131 */ { ST_N12, 1, 242 },
  1783. X/* SCF 132 */ { ST_N01, 1, 243 },
  1784. X/* SET 133 */ { ST_B01, 1, 244 },
  1785. X/* SET 134 */ { ST_B02, 2, 245 },
  1786. X/* SET 135 */ { ST_B03, 1, 247 },
  1787. X/* SIM 136 */ { ST_N01, 1, 248 },
  1788. X/* SLA 137 */ { ST_N02, 1, 249 },
  1789. X/* SLA 138 */ { ST_N07, 2, 250 },
  1790. X/* SLA 139 */ { ST_N08, 1, 252 },
  1791. X/* SLP 140 */ { ST_N01, 1, 253 },
  1792. X/* SRA 141 */ { ST_N02, 1, 254 },
  1793. X/* SRA 142 */ { ST_N07, 2, 255 },
  1794. X/* SRA 143 */ { ST_N08, 1, 257 },
  1795. X/* SRL 144 */ { ST_N02, 1, 258 },
  1796. X/* SRL 145 */ { ST_N07, 2, 259 },
  1797. X/* SRL 146 */ { ST_N08, 1, 261 },
  1798. X/* SUB 147 */ { ST_N02, 1, 262 },
  1799. X/* SUB 148 */ { ST_N06, 1, 263 },
  1800. X/* SUB 149 */ { ST_N07, 2, 264 },
  1801. X/* SUB 150 */ { ST_N08, 1, 266 },
  1802. X/* TST 151 */ { ST_N02, 1, 267 },
  1803. X/* TST 152 */ { ST_N06, 1, 268 },
  1804. X/* TST 153 */ { ST_N08, 1, 269 },
  1805. X/* TSTIO 154 */ { ST_N06, 1, 270 },
  1806. X/* XOR 155 */ { ST_N02, 1, 271 },
  1807. X/* XOR 156 */ { ST_N06, 1, 272 },
  1808. X/* XOR 157 */ { ST_N07, 2, 273 },
  1809. X/* XOR 158 */ { ST_N08, 1, 275 },
  1810. X    { 0, 0, 0 } };
  1811. X
  1812. Xstruct igel igtab[NUMDIFFOP+1]
  1813. X    = {
  1814. X/* invalid 0 */   { 0 , 0, 
  1815. X        "[Xnullentry" },
  1816. X/* invalid 1 */   { 0 , 0, 
  1817. X        "[Xinvalid opcode" },
  1818. X/* ADC 2 */   { TSZ80PLUS|DRDESTMASK|DRMASK , TSZ80PLUS|DRDESTHL|DRBC, 
  1819. X        "ed;4a;" },
  1820. X/* ADC 3 */   { TSZ80PLUS|DRDESTMASK|DRMASK , TSZ80PLUS|DRDESTHL|DRDE, 
  1821. X        "ed;5a;" },
  1822. X/* ADC 4 */   { TSZ80PLUS|DRDESTMASK|DRMASK , TSZ80PLUS|DRDESTHL|DRHL, 
  1823. X        "ed;6a;" },
  1824. X/* ADC 5 */   { TSZ80PLUS|DRDESTMASK|DRMASK , TSZ80PLUS|DRDESTHL|DRSP, 
  1825. X        "ed;7a;" },
  1826. X/* ADC 6 */   { REGISA , REGISA, 
  1827. X        "8e;" },
  1828. X/* ADC 7 */   { REGISA , REGISA, 
  1829. X        "ce;[1=];" },
  1830. X/* ADC 8 */   { REGISA|TSZ80PLUS|DRMASK , TSZ80PLUS|DRIX|REGISA, 
  1831. X        "dd;8e;[1=]r" },
  1832. X/* ADC 9 */   { REGISA|TSZ80PLUS|DRMASK , TSZ80PLUS|DRIY|REGISA, 
  1833. X        "fd;8e;[1=]r" },
  1834. X/* ADC 10 */   { REGISA|0 , 0|REGISA, 
  1835. X        "88.[1#]|;" },
  1836. X/* ADD 11 */   { DRDESTMASK|DRMASK , DRDESTHL|DRBC, 
  1837. X        "09;" },
  1838. X/* ADD 12 */   { TSZ80PLUS|DRDESTMASK|DRMASK , TSZ80PLUS|DRDESTIX|DRBC, 
  1839. X        "dd;09;" },
  1840. X/* ADD 13 */   { TSZ80PLUS|DRDESTMASK|DRMASK , TSZ80PLUS|DRDESTIY|DRBC, 
  1841. X        "fd;09;" },
  1842. X/* ADD 14 */   { DRDESTMASK|DRMASK , DRDESTHL|DRDE, 
  1843. X        "19;" },
  1844. X/* ADD 15 */   { TSZ80PLUS|DRDESTMASK|DRMASK , TSZ80PLUS|DRDESTIX|DRDE, 
  1845. X        "dd;19;" },
  1846. X/* ADD 16 */   { TSZ80PLUS|DRDESTMASK|DRMASK , TSZ80PLUS|DRDESTIY|DRDE, 
  1847. X        "fd;19;" },
  1848. X/* ADD 17 */   { DRDESTMASK|DRMASK , DRDESTHL|DRHL, 
  1849. X        "29;" },
  1850. X/* ADD 18 */   { TSZ80PLUS|DRDESTMASK|DRMASK , TSZ80PLUS|DRDESTIX|DRIX, 
  1851. X        "dd;29;" },
  1852. X/* ADD 19 */   { TSZ80PLUS|DRDESTMASK|DRMASK , TSZ80PLUS|DRDESTIY|DRIY, 
  1853. X        "fd;29;" },
  1854. X/* ADD 20 */   { DRDESTMASK|DRMASK , DRDESTHL|DRSP, 
  1855. X        "39;" },
  1856. X/* ADD 21 */   { TSZ80PLUS|DRDESTMASK|DRMASK , TSZ80PLUS|DRDESTIX|DRSP, 
  1857. X        "dd;39;" },
  1858. X/* ADD 22 */   { TSZ80PLUS|DRDESTMASK|DRMASK , TSZ80PLUS|DRDESTIY|DRSP, 
  1859. X        "fd;39;" },
  1860. X/* ADD 23 */   { REGISA , REGISA, 
  1861. X        "86;" },
  1862. X/* ADD 24 */   { REGISA , REGISA, 
  1863. X        "c6;[1=];" },
  1864. X/* ADD 25 */   { REGISA|TSZ80PLUS|DRMASK , TSZ80PLUS|DRIX|REGISA, 
  1865. X        "dd;86;[1=]r" },
  1866. X/* ADD 26 */   { REGISA|TSZ80PLUS|DRMASK , TSZ80PLUS|DRIY|REGISA, 
  1867. X        "fd;86;[1=]r" },
  1868. X/* ADD 27 */   { REGISA|0 , 0|REGISA, 
  1869. X        "80.[1#]|;" },
  1870. X/* AND 28 */   { 0 , 0, 
  1871. X        "a6;" },
  1872. X/* AND 29 */   { 0 , 0, 
  1873. X        "e6;[1=];" },
  1874. X/* AND 30 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIX, 
  1875. X        "dd;a6;[1=]r" },
  1876. X/* AND 31 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIY, 
  1877. X        "fd;a6;[1=]r" },
  1878. X/* AND 32 */   { 0 , 0, 
  1879. X        "a0.[1#]|;" },
  1880. X/* BIT 33 */   { TSZ80PLUS , TSZ80PLUS, 
  1881. X        "cb;[1#].46|;" },
  1882. X/* BIT 34 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIX, 
  1883. X        "dd;cb;[2=]r46.[1#]|;" },
  1884. X/* BIT 35 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIY, 
  1885. X        "fd;cb;[2=]r46.[1#]|;" },
  1886. X/* BIT 36 */   { TSZ80PLUS , TSZ80PLUS, 
  1887. X        "cb;[1#].40|;" },
  1888. X/* CALL 37 */   { CCSELMASK , CCSELNZ, 
  1889. X        "c4;[1=]y" },
  1890. X/* CALL 38 */   { CCSELMASK , CCSELZ, 
  1891. X        "cc;[1=]y" },
  1892. X/* CALL 39 */   { CCSELMASK , CCSELNC, 
  1893. X        "d4;[1=]y" },
  1894. X/* CALL 40 */   { CCSELMASK , CCSELC, 
  1895. X        "dc;[1=]y" },
  1896. X/* CALL 41 */   { CCSELMASK , CCSELPO, 
  1897. X        "e4;[1=]y" },
  1898. X/* CALL 42 */   { CCSELMASK , CCSELPE, 
  1899. X        "ec;[1=]y" },
  1900. X/* CALL 43 */   { CCSELMASK , CCSELP, 
  1901. X        "f4;[1=]y" },
  1902. X/* CALL 44 */   { CCSELMASK , CCSELM, 
  1903. X        "fc;[1=]y" },
  1904. X/* CALL 45 */   { 0 , 0, 
  1905. X        "cd;[1=]y" },
  1906. X/* CCF 46 */   { 0 , 0, 
  1907. X        "3f;" },
  1908. X/* CP 47 */   { 0 , 0, 
  1909. X        "be;" },
  1910. X/* CP 48 */   { 0 , 0, 
  1911. X        "fe;[1=];" },
  1912. X/* CP 49 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIX, 
  1913. X        "dd;be;[1=]r" },
  1914. X/* CP 50 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIY, 
  1915. X        "fd;be;[1=]r" },
  1916. X/* CP 51 */   { 0 , 0, 
  1917. X        "b8.[1#]|;" },
  1918. X/* CPD 52 */   { TSZ80PLUS , TSZ80PLUS, 
  1919. X        "ed;a9;"  },
  1920. X/* CPDR 53 */   { TSZ80PLUS , TSZ80PLUS, 
  1921. X        "ed;b9;"  },
  1922. X/* CPI 54 */   { TSZ80PLUS , TSZ80PLUS, 
  1923. X        "ed;a1;"  },
  1924. X/* CPIR 55 */   { TSZ80PLUS , TSZ80PLUS, 
  1925. X        "ed;b1;"  },
  1926. X/* CPL 56 */   { 0 , 0, 
  1927. X        "2f;" },
  1928. X/* DAA 57 */   { 0 , 0, 
  1929. X        "27;" },
  1930. X/* DEC 58 */   { 0 , 0, 
  1931. X        "35;" },
  1932. X/* DEC 59 */   { DRMASK , DRBC, 
  1933. X        "0b;" },
  1934. X/* DEC 60 */   { DRMASK , DRDE, 
  1935. X        "1b;" },
  1936. X/* DEC 61 */   { DRMASK , DRHL, 
  1937. X        "2b;" },
  1938. X/* DEC 62 */   { DRMASK , DRSP, 
  1939. X        "3b;" },
  1940. X/* DEC 63 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIX, 
  1941. X        "dd;2b;" },
  1942. X/* DEC 64 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIY, 
  1943. X        "fd;2b;" },
  1944. X/* DEC 65 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIX, 
  1945. X        "dd;35;[1=]r" },
  1946. X/* DEC 66 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIY, 
  1947. X        "fd;35;[1=]r" },
  1948. X/* DEC 67 */   { 0 , 0, 
  1949. X        "05.[2#]|;" },
  1950. X/* DI 68 */   { 0 , 0, 
  1951. X        "f3;" },
  1952. X/* DJNZ 69 */   { 0 , 0, 
  1953. X        "10;[1=].P.2+-r" },
  1954. X/* EI 70 */   { 0 , 0, 
  1955. X        "fb;" },
  1956. X/* EX 71 */   { EXMASK , EX1DE|EX2HL, 
  1957. X        "eb;" },
  1958. X/* EX 72 */   { TSZ80PLUS|EXMASK , TSZ80PLUS|EX1AF|EX2AF, 
  1959. X        "08;" },
  1960. X/* EX 73 */   { DRMASK , DRHL, 
  1961. X        "e3;" },
  1962. X/* EX 74 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIX, 
  1963. X        "dd;e3;" },
  1964. X/* EX 75 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIY, 
  1965. X        "fd;e3;" },
  1966. X/* EXX 76 */   { TSZ80PLUS , TSZ80PLUS, 
  1967. X        "d9;" },
  1968. X/* HALT 77 */   { 0 , 0, 
  1969. X        "76;" },
  1970. X/* IM 78 */   { TSZ80PLUS|INTSETMASK , TSZ80PLUS|INTSETMODE0, 
  1971. X        "ed;46;" },
  1972. X/* IM 79 */   { TSZ80PLUS|INTSETMASK , TSZ80PLUS|INTSETMODE1, 
  1973. X        "ed;56;" },
  1974. X/* IM 80 */   { TSZ80PLUS|INTSETMASK , TSZ80PLUS|INTSETMODE2, 
  1975. X        "ed;5e;" },
  1976. X/* IN0 81 */   { TS64180 , TS64180, 
  1977. X        "ed;00.[1#]|;[2=];" },
  1978. X/* IN 82 */   { REGISA , REGISA, 
  1979. X        "db;[2=];" },
  1980. X/* IN 83 */   { TSZ80PLUS , TSZ80PLUS, 
  1981. X        "ed;40.[1#]|;" },
  1982. X/* INC 84 */   { 0 , 0, 
  1983. X        "34;" },
  1984. X/* INC 85 */   { DRMASK , DRBC, 
  1985. X        "03;" },
  1986. X/* INC 86 */   { DRMASK , DRDE, 
  1987. X        "13;" },
  1988. X/* INC 87 */   { DRMASK , DRHL, 
  1989. X        "23;" },
  1990. X/* INC 88 */   { DRMASK , DRSP, 
  1991. X        "33;" },
  1992. X/* INC 89 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIX, 
  1993. X        "dd;23;" },
  1994. X/* INC 90 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIY, 
  1995. X        "fd;23;" },
  1996. X/* INC 91 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIX, 
  1997. X        "dd;34;[1=]r" },
  1998. X/* INC 92 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIY, 
  1999. X        "fd;34;[1=]r" },
  2000. X/* INC 93 */   { 0 , 0, 
  2001. X        "04.[2#]|;" },
  2002. X/* IND 94 */   { TSZ80PLUS , TSZ80PLUS, 
  2003. X        "ed;aa;" },
  2004. X/* INDR 95 */   { TSZ80PLUS , TSZ80PLUS, 
  2005. X        "ed;ba;" },
  2006. X/* INI 96 */   { TSZ80PLUS , TSZ80PLUS, 
  2007. X        "ed;a2;" },
  2008. X/* INIR 97 */   { TSZ80PLUS , TSZ80PLUS, 
  2009. X        "ed;b2;" },
  2010. X/* JP 98 */   { DRMASK , DRHL, 
  2011. X        "e9;" },
  2012. X/* JP 99 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIX, 
  2013. X        "dd;e9;" },
  2014. X/* JP 100 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIY, 
  2015. X        "fd;e9;" },
  2016. X/* JP 101 */   { CCSELMASK , CCSELNZ, 
  2017. X        "c2;[1=]y" },
  2018. X/* JP 102 */   { CCSELMASK , CCSELZ, 
  2019. X        "ca;[1=]y" },
  2020. X/* JP 103 */   { CCSELMASK , CCSELNC, 
  2021. X        "d2;[1=]y" },
  2022. X/* JP 104 */   { CCSELMASK , CCSELC, 
  2023. X        "da;[1=]y" },
  2024. X/* JP 105 */   { CCSELMASK , CCSELPO, 
  2025. X        "e2;[1=]y" },
  2026. X/* JP 106 */   { CCSELMASK , CCSELPE, 
  2027. X        "ea;[1=]y" },
  2028. X/* JP 107 */   { CCSELMASK , CCSELP, 
  2029. X        "f2;[1=]y" },
  2030. X/* JP 108 */   { CCSELMASK , CCSELM, 
  2031. X        "fa;[1=]y" },
  2032. X/* JP 109 */   { 0 , 0, 
  2033. X        "c3;[1=]y" },
  2034. X/* JR 110 */   { TSZ80PLUS|CCSELMASK , CCSELNZ|TSZ80PLUS, 
  2035. X        "20;[1=].P.2+-r" },
  2036. X/* JR 111 */   { TSZ80PLUS|CCSELMASK , CCSELZ|TSZ80PLUS, 
  2037. X        "28;[1=].P.2+-r" },
  2038. X/* JR 112 */   { TSZ80PLUS|CCSELMASK , CCSELNC|TSZ80PLUS, 
  2039. X        "30;[1=].P.2+-r" },
  2040. X/* JR 113 */   { TSZ80PLUS|CCSELMASK , CCSELC|TSZ80PLUS, 
  2041. X        "38;[1=].P.2+-r" },
  2042. X/* JR 114 */   { TSZ80PLUS , TSZ80PLUS, 
  2043. X        "18;[1=].P.2+-r" },
  2044. X/* LD 115 */   { DRMASK , DRHL, 
  2045. X        "36;[1=];" },
  2046. X/* LD 116 */   { DRMASK , DRHL, 
  2047. X        "70.[1#]|;" },
  2048. X/* LD 117 */   { DRMASK|REGISA , DRBC|REGISA, 
  2049. X        "02;" },
  2050. X/* LD 118 */   { DRMASK|REGISA , DRDE|REGISA, 
  2051. X        "12;" },
  2052. X/* LD 119 */   { DRMASK , DRHL, 
  2053. X        "22;[1=]y" },
  2054. X/* LD 120 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIX, 
  2055. X        "dd;22;[1=]y" },
  2056. X/* LD 121 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIY, 
  2057. X        "fd;22;[1=]y" },
  2058. X/* LD 122 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRBC, 
  2059. X        "ed;43;[1=]y" },
  2060. X/* LD 123 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRDE, 
  2061. X        "ed;53;[1=]y" },
  2062. X/* LD 124 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRSP, 
  2063. X        "ed;73;[1=]y" },
  2064. X/* LD 125 */   { 0 , 0, 
  2065. X        "32;[1=]y" },
  2066. X/* LD 126 */   { DRMASK , DRHL, 
  2067. X        "2a;[1=]y" },
  2068. X/* LD 127 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIX, 
  2069. X        "dd;2a;[1=]y" },
  2070. X/* LD 128 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIY, 
  2071. X        "fd;2a;[1=]y" },
  2072. X/* LD 129 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRBC, 
  2073. X        "ed;4b;[1=]y" },
  2074. X/* LD 130 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRDE, 
  2075. X        "ed;5b;[1=]y" },
  2076. X/* LD 131 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRSP, 
  2077. X        "ed;7b;[1=]y" },
  2078. X/* LD 132 */   { DRDESTMASK|TSZ80PLUS|DRMASK , TSZ80PLUS|DRHL|DRDESTSP, 
  2079. X        "f9;" },
  2080. X/* LD 133 */   { DRDESTMASK|TSZ80PLUS|DRMASK , TSZ80PLUS|DRIX|DRDESTSP, 
  2081. X        "dd;f9;" },
  2082. X/* LD 134 */   { DRDESTMASK|TSZ80PLUS|DRMASK , TSZ80PLUS|DRIY|DRDESTSP, 
  2083. X        "fd;f9;" },
  2084. X/* LD 135 */   { DRMASK , DRHL, 
  2085. X        "21;[1=]y" },
  2086. X/* LD 136 */   { DRMASK , DRBC, 
  2087. X        "01;[1=]y" },
  2088. X/* LD 137 */   { DRMASK , DRDE, 
  2089. X        "11;[1=]y" },
  2090. X/* LD 138 */   { DRMASK , DRSP, 
  2091. X        "31;[1=]y" },
  2092. X/* LD 139 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIX, 
  2093. X        "dd;21;[1=]y" },
  2094. X/* LD 140 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIY, 
  2095. X        "fd;21;[1=]y" },
  2096. X/* LD 141 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIX, 
  2097. X        "dd;36;[1=]r[2=];" },
  2098. X/* LD 142 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIY, 
  2099. X        "fd;36;[1=]r[2=];" },
  2100. X/* LD 143 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIX, 
  2101. X        "dd;70.[2#]|;[1=]r" },
  2102. X/* LD 144 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIY, 
  2103. X        "fd;70.[2#]|;[1=]r" },
  2104. X/* LD 145 */   { DRMASK , DRHL, 
  2105. X        "46.[1#]|;" },
  2106. X/* LD 146 */   { DRMASK|REGISA , DRBC|REGISA, 
  2107. X        "0a;" },
  2108. X/* LD 147 */   { DRMASK|REGISA , DRDE|REGISA, 
  2109. X        "1a;" },
  2110. X/* LD 148 */   { 0 , 0, 
  2111. X        "06.[1#]|;[2=];" },
  2112. X/* LD 149 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIX, 
  2113. X        "dd;46.[1#]|;[2=]r" },
  2114. X/* LD 150 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIY, 
  2115. X        "fd;46.[1#]|;[2=]r" },
  2116. X/* LD 151 */   { 0 , 0, 
  2117. X        "40.[1#]|;" },
  2118. X/* LD 152 */   { REGISA , REGISA, 
  2119. X        "3a;[1=]y" },
  2120. X/* LD 153 */   { REGISA|TSZ80PLUS|SPECIALRMASK , TSZ80PLUS|SPECIALIR|REGISA, 
  2121. X        "ed;57;" },
  2122. X/* LD 154 */   { REGISA|TSZ80PLUS|SPECIALRMASK , TSZ80PLUS|SPECIALRR|REGISA, 
  2123. X        "ed;5f;" },
  2124. X/* LD 155 */   { TSZ80PLUS|SPECIALRMASK , TSZ80PLUS|SPECIALIR, 
  2125. X        "ed;47;" },
  2126. X/* LD 156 */   { TSZ80PLUS|SPECIALRMASK , TSZ80PLUS|SPECIALRR, 
  2127. X        "ed;4f;" },
  2128. X/* LDD 157 */   { TSZ80PLUS , TSZ80PLUS, 
  2129. X        "ed;a8;" },
  2130. X/* LDDR 158 */   { TSZ80PLUS , TSZ80PLUS, 
  2131. X        "ed;b8;" },
  2132. X/* LDI 159 */   { TSZ80PLUS , TSZ80PLUS, 
  2133. X        "ed;a0;" },
  2134. X/* LDIR 160 */   { TSZ80PLUS , TSZ80PLUS, 
  2135. X        "ed;b0;" },
  2136. X/* MULT 161 */   { TS64180|DRMASK , TS64180|DRBC, 
  2137. X        "ed;4c;" },
  2138. X/* MULT 162 */   { TS64180|DRMASK , TS64180|DRDE, 
  2139. X        "ed;5c;" },
  2140. X/* MULT 163 */   { TS64180|DRMASK , TS64180|DRHL, 
  2141. X        "ed;6c;" },
  2142. X/* MULT 164 */   { TS64180|DRMASK , TS64180|DRSP, 
  2143. X        "ed;7c;" },
  2144. X/* NEG 165 */   { TSZ80PLUS , TSZ80PLUS, 
  2145. X        "ed;44;" },
  2146. X/* NOP 166 */   { 0 , 0, 
  2147. X        "00;" },
  2148. X/* OR 167 */   { 0 , 0, 
  2149. X        "b6;" },
  2150. X/* OR 168 */   { 0 , 0, 
  2151. X        "f6;[1=];" },
  2152. X/* OR 169 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIX, 
  2153. X        "dd;b6;[1=]r" },
  2154. X/* OR 170 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIY, 
  2155. X        "fd;b6;[1=]r" },
  2156. X/* OR 171 */   { 0 , 0, 
  2157. X        "b0.[1#]|;" },
  2158. X/* OTDM 172 */   { TS64180 , TS64180, 
  2159. X        "ed;8b;" },
  2160. X/* OTDMR 173 */   { TS64180 , TS64180, 
  2161. X        "ed;9b;" },
  2162. X/* OTDR 174 */   { TSZ80PLUS , TSZ80PLUS, 
  2163. X        "ed;bb;" },
  2164. X/* OTIM 175 */   { TS64180 , TS64180, 
  2165. X        "ed;83;" },
  2166. X/* OTIMR 176 */   { TS64180 , TS64180, 
  2167. X        "ed;93;" },
  2168. X/* OTIR 177 */   { TSZ80PLUS , TSZ80PLUS, 
  2169. X        "ed;b3;" },
  2170. X/* OUT0 178 */   { TS64180 , TS64180, 
  2171. X        "ed;01.[2#]|;[1=];" },
  2172. X/* OUT 179 */   { REGISA , REGISA, 
  2173. X        "d3;[1=];" },
  2174. X/* OUT 180 */   { TSZ80PLUS , TSZ80PLUS, 
  2175. X        "ed;41.[1#]|;" },
  2176. X/* OUTD 181 */   { TSZ80PLUS , TSZ80PLUS, 
  2177. X        "ed;ab;" },
  2178. X/* OUTI 182 */   { TSZ80PLUS , TSZ80PLUS, 
  2179. X        "ed;a3;" },
  2180. X/* POP 183 */   { DRMASK , DRBC, 
  2181. X        "c1;" },
  2182. X/* POP 184 */   { DRMASK , DRDE, 
  2183. X        "d1;" },
  2184. X/* POP 185 */   { DRMASK , DRHL, 
  2185. X        "e1;" },
  2186. X/* POP 186 */   { DRMASK , DRAF, 
  2187. X        "f1;" },
  2188. X/* POP 187 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIX, 
  2189. X        "dd;e1;" },
  2190. X/* POP 188 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIY, 
  2191. X        "fd;e1;" },
  2192. X/* PUSH 189 */   { DRMASK , DRBC, 
  2193. X        "c5;" },
  2194. X/* PUSH 190 */   { DRMASK , DRDE, 
  2195. X        "d5;" },
  2196. X/* PUSH 191 */   { DRMASK , DRHL, 
  2197. X        "e5;" },
  2198. X/* PUSH 192 */   { DRMASK , DRAF, 
  2199. X        "f5;" },
  2200. X/* PUSH 193 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIX, 
  2201. X        "dd;e5;" },
  2202. X/* PUSH 194 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIY, 
  2203. X        "fd;e5;" },
  2204. X/* RES 195 */   { TSZ80PLUS , TSZ80PLUS, 
  2205. X        "cb;[1#].86|;" },
  2206. X/* RES 196 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIX, 
  2207. X        "dd;cb;[2=]r86.[1#]|;" },
  2208. X/* RES 197 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIY, 
  2209. X        "fd;cb;[2=]r86.[1#]|;" },
  2210. X/* RES 198 */   { TSZ80PLUS , TSZ80PLUS, 
  2211. X        "cb;[1#].80|;" },
  2212. X/* RET 199 */   { CCSELMASK , CCSELNZ, 
  2213. X        "c0;" },
  2214. X/* RET 200 */   { CCSELMASK , CCSELZ, 
  2215. X        "c8;" },
  2216. X/* RET 201 */   { CCSELMASK , CCSELNC, 
  2217. X        "d0;" },
  2218. X/* RET 202 */   { CCSELMASK , CCSELC, 
  2219. X        "d8;" },
  2220. X/* RET 203 */   { CCSELMASK , CCSELPO, 
  2221. X        "e0;" },
  2222. X/* RET 204 */   { CCSELMASK , CCSELPE, 
  2223. X        "e8;" },
  2224. X/* RET 205 */   { CCSELMASK , CCSELP, 
  2225. X        "f0;" },
  2226. X/* RET 206 */   { CCSELMASK , CCSELM, 
  2227. X        "f8;" },
  2228. X/* RET 207 */   { 0 , 0, 
  2229. X        "c9;" },
  2230. X/* RETI 208 */   { TSZ80PLUS , TSZ80PLUS, 
  2231. X        "ed;4d;" },
  2232. X/* RETN 209 */   { TSZ80PLUS , TSZ80PLUS, 
  2233. X        "ed;45;" },
  2234. X/* RIM 210 */   { CPUMASK , CPU8085, 
  2235. X        "20;" },
  2236. X/* RL 211 */   { TSZ80PLUS , TSZ80PLUS, 
  2237. X        "cb;16;" },
  2238. X/* RL 212 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIX, 
  2239. X        "dd;cb;[1=]r16;" },
  2240. X/* RL 213 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIY, 
  2241. X        "fd;cb;[1=]r16;" },
  2242. X/* RL 214 */   { TSZ80PLUS , TSZ80PLUS, 
  2243. X        "cb;10.[1#]|;" },
  2244. X/* RLA 215 */   { 0 , 0, 
  2245. X        "17;" },
  2246. X/* RLC 216 */   { TSZ80PLUS , TSZ80PLUS, 
  2247. X        "cb;06;" },
  2248. X/* RLC 217 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIX, 
  2249. X        "dd;cb;[1=]r06;" },
  2250. X/* RLC 218 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIY, 
  2251. X        "fd;cb;[1=]r06;" },
  2252. X/* RLC 219 */   { TSZ80PLUS , TSZ80PLUS, 
  2253. X        "cb;00.[1#]|;" },
  2254. X/* RLCA 220 */   { 0 , 0, 
  2255. X        "07;" },
  2256. X/* RLD 221 */   { TSZ80PLUS , TSZ80PLUS, 
  2257. X        "ed;6f;" },
  2258. X/* RR 222 */   { TSZ80PLUS , TSZ80PLUS, 
  2259. X        "cb;1e;" },
  2260. X/* RR 223 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIX, 
  2261. X        "dd;cb;[1=]r1e;" },
  2262. X/* RR 224 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIY, 
  2263. X        "fd;cb;[1=]r1e;" },
  2264. X/* RR 225 */   { TSZ80PLUS , TSZ80PLUS, 
  2265. X        "cb;18.[1#]|;" },
  2266. X/* RRA 226 */   { 0 , 0, 
  2267. X        "1f;" },
  2268. X/* RRC 227 */   { TSZ80PLUS , TSZ80PLUS, 
  2269. X        "cb;0e;" },
  2270. X/* RRC 228 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIX, 
  2271. X        "dd;cb;[1=]r0e;" },
  2272. X/* RRC 229 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIY, 
  2273. X        "fd;cb;[1=]r0e;" },
  2274. X/* RRC 230 */   { TSZ80PLUS , TSZ80PLUS, 
  2275. X        "cb;08.[1#]|;" },
  2276. X/* RRCA 231 */   { 0 , 0, 
  2277. X        "0f;" },
  2278. X/* RRD 232 */   { TSZ80PLUS , TSZ80PLUS, 
  2279. X        "ed;67;" },
  2280. X/* RST 233 */   { 0 , 0, 
  2281. X        "c7.[1#]|;" },
  2282. X/* SBC 234 */   { TSZ80PLUS|DRDESTMASK|DRMASK , TSZ80PLUS|DRDESTHL|DRBC, 
  2283. X        "ed;42;" },
  2284. X/* SBC 235 */   { TSZ80PLUS|DRDESTMASK|DRMASK , TSZ80PLUS|DRDESTHL|DRDE, 
  2285. X        "ed;52;" },
  2286. X/* SBC 236 */   { TSZ80PLUS|DRDESTMASK|DRMASK , TSZ80PLUS|DRDESTHL|DRHL, 
  2287. X        "ed;62;" },
  2288. X/* SBC 237 */   { TSZ80PLUS|DRDESTMASK|DRMASK , TSZ80PLUS|DRDESTHL|DRSP, 
  2289. X        "ed;72;" },
  2290. X/* SBC 238 */   { REGISA , REGISA, 
  2291. X        "9e;" },
  2292. X/* SBC 239 */   { REGISA , REGISA, 
  2293. X        "de;[1=];" },
  2294. X/* SBC 240 */   { REGISA|TSZ80PLUS|DRMASK , TSZ80PLUS|DRIX|REGISA, 
  2295. X        "dd;9e;[1=]r" },
  2296. X/* SBC 241 */   { REGISA|TSZ80PLUS|DRMASK , TSZ80PLUS|DRIY|REGISA, 
  2297. X        "fd;9e;[1=]r" },
  2298. X/* SBC 242 */   { REGISA|0 , 0|REGISA, 
  2299. X        "98.[1#]|;" },
  2300. X/* SCF 243 */   { 0 , 0, 
  2301. X        "37;" },
  2302. X/* SET 244 */   { TSZ80PLUS , TSZ80PLUS, 
  2303. X        "cb;[1#].c6|;" },
  2304. X/* SET 245 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIX, 
  2305. X        "dd;cb;[2=]rc6.[1#]|;" },
  2306. X/* SET 246 */   { TSZ80PLUS|DRMASK , TSZ80PLUS|DRIY, 
  2307. X        "fd;cb;[2=]rc6.[1#]|;" },
  2308. X/* SET 247 */   { TSZ80PLUS , TSZ80PLUS, 
  2309. X        "cb;[1#].c0|;" },
  2310. X/* SIM 248 */   { CPUMASK , CPU8085, 
  2311. X        "30;" },
  2312. X/* SLA 249 */   { TSZ80PLUS , TSZ80PLUS, 
  2313. X        "cb;26;" },
  2314. X/* SLA 250 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIX, 
  2315. X        "dd;cb;[1=]r26;" },
  2316. X/* SLA 251 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIY, 
  2317. X        "fd;cb;[1=]r26;" },
  2318. X/* SLA 252 */   { TSZ80PLUS , TSZ80PLUS, 
  2319. X        "cb;20.[1#]|;" },
  2320. X/* SLP 253 */   { TS64180 , TS64180, 
  2321. X        "ed;76;" },
  2322. X/* SRA 254 */   { TSZ80PLUS , TSZ80PLUS, 
  2323. X        "cb;2e;" },
  2324. X/* SRA 255 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIX, 
  2325. X        "dd;cb;[1=]r2e;" },
  2326. X/* SRA 256 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIY, 
  2327. X        "fd;cb;[1=]r2e;" },
  2328. X/* SRA 257 */   { TSZ80PLUS , TSZ80PLUS, 
  2329. X        "cb;28.[1#]|;" },
  2330. X/* SRL 258 */   { TSZ80PLUS , TSZ80PLUS, 
  2331. X        "cb;3e;" },
  2332. X/* SRL 259 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIX, 
  2333. X        "dd;cb;[1=]r3e;" },
  2334. X/* SRL 260 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIY, 
  2335. X        "fd;cb;[1=]r3e;" },
  2336. X/* SRL 261 */   { TSZ80PLUS , TSZ80PLUS, 
  2337. X        "cb;38.[1#]|;" },
  2338. X/* SUB 262 */   { 0 , 0, 
  2339. X        "96;" },
  2340. X/* SUB 263 */   { 0 , 0, 
  2341. X        "d6;[1=];" },
  2342. X/* SUB 264 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIX, 
  2343. X        "dd;96;[1=]r" },
  2344. X/* SUB 265 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIY, 
  2345. X        "fd;96;[1=]r" },
  2346. X/* SUB 266 */   { 0 , 0, 
  2347. X        "90.[1#]|;" },
  2348. X/* TST 267 */   { TS64180 , TS64180, 
  2349. X        "ed;34;" },
  2350. X/* TST 268 */   { TS64180 , TS64180, 
  2351. X        "ed;64;[1=];" },
  2352. X/* TST 269 */   { TS64180 , TS64180, 
  2353. X        "ed;04.[2#]|;" },
  2354. X/* TSTIO 270 */   { TS64180 , TS64180, 
  2355. X        "ed;74;[1=];" },
  2356. X/* XOR 271 */   { 0 , 0, 
  2357. X        "ae;" },
  2358. X/* XOR 272 */   { 0 , 0, 
  2359. X        "ee;[1=];" },
  2360. X/* XOR 273 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIX, 
  2361. X        "dd;ae;[1=]r" },
  2362. X/* XOR 274 */   { DRMASK|TSZ80PLUS , TSZ80PLUS|DRIY, 
  2363. X        "fd;ae;[1=]r" },
  2364. X/* XOR 275 */   { 0 , 0, 
  2365. X        "a8.[1#]|;" },
  2366. X    { 0,0,""} };
  2367. X/* end fraptabdef.c */
  2368. SHAR_EOF
  2369. true || echo 'restore of asz80.y failed'
  2370. fi
  2371. exit 0
  2372.