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

  1. From: markz@ssc.UUCP (Mark Zenier)
  2. Newsgroups: alt.sources
  3. Subject: Frankenstein Cross Assemblers, Zilog Z8 flavor, Part 1 of 1
  4. Message-ID: <608@ssc.UUCP>
  5. Date: 5 Dec 90 06:19:51 GMT
  6.  
  7. ---- Cut Here and feed the following to sh ----
  8. #!/bin/sh
  9. # This is Frankasm/Asz8, a shell archive (shar 3.43)
  10. # made 12/04/1990 08:46 UTC by markz@ssc.uucp
  11. # Source directory /usr/mark/frank.shar
  12. #
  13. # existing files will NOT be overwritten unless -c is specified
  14. # This format requires very little intelligence at unshar time.
  15. # "if test", "echo", "true", and "sed" may be needed.
  16. #
  17. # This shar contains:
  18. # length  mode       name
  19. # ------ ---------- ------------------------------------------
  20. #   1463 -r--r----- asz8.1
  21. #   8593 -r--r----- asz8.doc
  22. #   3548 -r--r----- asz8.tst
  23. #   7110 -r--r----- asz8.tut
  24. #  36629 -r--r--r-- asz8.y
  25. #
  26. # ============= asz8.1 ==============
  27. if test -f 'asz8.1' -a X"$1" != X"-c"; then
  28.     echo 'x - skipping asz8.1 (File already exists)'
  29. else
  30. echo 'x - extracting asz8.1 (Text)'
  31. sed 's/^X//' << 'SHAR_EOF' > 'asz8.1' &&
  32. X.TH ASZ8 1L
  33. X.SH NAME
  34. Xasz8 \- cross assemblers for microcomputers
  35. X.SH SYNOPSIS
  36. X.nf
  37. Xasz8 [-p cpu] [-l listfile] [-o hexfile] [-d] [-s symbolfile] input
  38. X.fi
  39. X.SH DESCRIPTION
  40. XThe asz8 command assembles the input file into a
  41. Xtext output file representing the program memory for a microcomputer.
  42. X
  43. XOptions
  44. X.IP "-p cpu"
  45. XOverride the instruction set selection.
  46. X.RS 10
  47. XValid Values for Cpu
  48. X.RS 5
  49. Xz8600, z8, Z8, UPC, upc, Z8090
  50. X.RE
  51. X.RE
  52. X.IP "-l listfile"
  53. XOutput a file formated with the memory address, data, and source input lines.
  54. X.IP "-o hexfile"
  55. XOutput the memory data image in a form accepted by most prom programmers.
  56. X.IP "-h hexfile"
  57. XSame as \-o.
  58. X.IP \-d
  59. XSave the intermediate data file (see FILE) and abort the execution at the
  60. Xend of processing.
  61. X.IP "-s symbolfile"
  62. XPrint the symbol table values and names, one per line in the specified file.
  63. X.SH FILES
  64. X/usr/tmp/frtXXXXXX
  65. X.SH SEE ALSO
  66. XFrankenstein Cross Assemblers Users Manual (file base.doc)
  67. XAppendix for asz8 Frankenstein Assembler (file asz8.doc)
  68. X.SH NOTES
  69. XThere is only one input file.
  70. X
  71. XThe program can select which subset of instructions is accepted.
  72. XThe program first uses the name with which it is invoked.
  73. XThis is scanned for a substring which indicates which set to use.
  74. XThe -p options overrides this selction by performing the same substring
  75. Xsearch.
  76. XFinally the input file can select which subset to use with the CPU statement.
  77. X
  78. XThere should only be one executable file with all of its names linked to it.
  79. SHAR_EOF
  80. true || echo 'restore of asz8.1 failed'
  81. fi
  82. # ============= asz8.doc ==============
  83. if test -f 'asz8.doc' -a X"$1" != X"-c"; then
  84.     echo 'x - skipping asz8.doc (File already exists)'
  85. else
  86. echo 'x - extracting asz8.doc (Text)'
  87. sed 's/^X//' << 'SHAR_EOF' > 'asz8.doc' &&
  88. X.HM A 1 1 1 1 1 1
  89. X.H 1 "Appendix for asz8 Frankenstein Assembler"
  90. X.H 2 "Pseudo Operations"
  91. X.H 3 "Standard Pseudo Operation Mnemonics"
  92. X.VL 40 5 1
  93. X.LI "End"
  94. XEND
  95. X.LI "File Inclusion"
  96. XINCL
  97. XINCLUDE
  98. X.LI "If"
  99. XIF
  100. X.LI "Else"
  101. XELSE
  102. X.LI "End If"
  103. XENDI
  104. X.LI "Equate"
  105. XEQU
  106. X.LI "Set"
  107. XSET
  108. X.LI "Org"
  109. XORG
  110. X.LI "Reserve Memory"
  111. XRESERVE
  112. XRMB
  113. X.LI "Define Byte Data"
  114. XBYTE
  115. XDB
  116. XFCB
  117. X.LI "Define Word Data"
  118. XDW
  119. XFDB
  120. XWORD
  121. X.LI "Define String Data"
  122. XFCC
  123. XSTRING
  124. X.LI "Define Character Set Translation"
  125. XCHARSET
  126. X.LI "Define Character Value"
  127. XCHARDEF
  128. XCHD
  129. X.LI "Use Character Translation"
  130. XCHARUSE
  131. X.LE
  132. X.H 3 "Machine Dependent Pseudo Operations"
  133. X.H 4 "Register Symbol Definitions"
  134. X.DS I N
  135. XLabel REG RegisterSymbol
  136. XLabel RREG RegisterSymbol
  137. XLabel REG expression
  138. XLabel RREG expression
  139. XLabel REG
  140. XLabel RREG
  141. X.DE
  142. X.P
  143. XSymbols in the register address space are defined with the REG, and RREG 
  144. Xpseudooperations.
  145. XThe symbol in the label field is added to the symbol table as a register
  146. Xsymbol.
  147. XThe symbols defined with the REG are single byte registers.
  148. XThe symbols defined with RREG are double registers, and must be on even
  149. Xboundries.
  150. X.P
  151. XThe operand can be in three forms.
  152. X.P
  153. XWhen the operand is a register symbol, the label symbol is defined with
  154. Xthe same register address as the symbol, with the size determined by which
  155. Xpseudoop is used.
  156. XAliases to working registers must use this form. 
  157. X.P
  158. XWhen the operand is an expression, the label symbol is defined at the
  159. Xvalue of the expression, with the size determined by which pseudoop is used.
  160. XThe value must be in the range 0 to 127 (or 223 for the UPC register set), 
  161. Xor 240 to 255, and must be defined at the first pass.
  162. X.P
  163. XWith no operand, the label symbol is defined at the register address 
  164. Xfollowing the previous REG or RREG instruction.
  165. XIf a previous Register Definition used a working register as its operand,
  166. Xthe current definition will be in the working set, otherwise it will be
  167. Xin the register file.
  168. X.P
  169. XRegister Symbols must be surrounded by parenthesis when used in expressions.
  170. X.H 4 "Register Set Selection"
  171. X.DS I N
  172. XCPU string
  173. X.DE
  174. XThe register set can be specified in the source file with the CPU 
  175. Xpseudooperation.
  176. XThe string, delimited by quotes or apostrophes, is scanned for a
  177. Xsubstring which selects which register set is used.
  178. XWhen the program is invoked, this operation is performed on the name of
  179. Xthe program, then the -p optional arguement, if any, and then any CPU
  180. Xstatements.
  181. XThe last one selects the which subset of the registers the assembler will
  182. Xaccept.
  183. X.VL 30 5 1
  184. X.LI "Register Architecture"
  185. XSubstrings
  186. X.SP
  187. X.LI "z8"
  188. X86
  189. Xz8
  190. XZ8
  191. X.SP
  192. X.LI "Universal"
  193. XUPC
  194. Xupc
  195. X9
  196. X.LI "Peripheral"
  197. X.LI "Controller"
  198. X.LE
  199. X.H 2 "Instructions"
  200. X.H 3 "Instruction List"
  201. X.TS H
  202. X;
  203. Xl l l.
  204. XOpcode    Syntax    Selection Criteria
  205. X.sp
  206. X.TH
  207. X.sp
  208. XADC     '@' REGISTER ',' '#' expr
  209. XADC     REGISTER ',' '#' expr
  210. XADC     REGISTER ',' '@' REGISTER
  211. XADC     REGISTER ',' '@' REGISTER    SRCWORK+DSTWORK
  212. XADC     REGISTER ',' REGISTER
  213. XADC     REGISTER ',' REGISTER    SRCWORK+DSTWORK
  214. X.sp
  215. XADD     '@' REGISTER ',' '#' expr
  216. XADD     REGISTER ',' '#' expr
  217. XADD     REGISTER ',' '@' REGISTER
  218. XADD     REGISTER ',' '@' REGISTER    SRCWORK+DSTWORK
  219. XADD     REGISTER ',' REGISTER
  220. XADD     REGISTER ',' REGISTER    SRCWORK+DSTWORK
  221. X.sp
  222. XAND     '@' REGISTER ',' '#' expr
  223. XAND     REGISTER ',' '#' expr
  224. XAND     REGISTER ',' '@' REGISTER
  225. XAND     REGISTER ',' '@' REGISTER    SRCWORK+DSTWORK
  226. XAND     REGISTER ',' REGISTER
  227. XAND     REGISTER ',' REGISTER    SRCWORK+DSTWORK
  228. X.sp
  229. XCALL     '@' REGISTER    DSTDBL
  230. XCALL     expr
  231. X.sp
  232. XCCF    
  233. X.sp
  234. XCLR     '@' REGISTER
  235. XCLR     REGISTER
  236. X.sp
  237. XCOM     '@' REGISTER
  238. XCOM     REGISTER
  239. X.sp
  240. XCP     '@' REGISTER ',' '#' expr
  241. XCP     REGISTER ',' '#' expr
  242. XCP     REGISTER ',' '@' REGISTER
  243. XCP     REGISTER ',' '@' REGISTER    SRCWORK+DSTWORK
  244. XCP     REGISTER ',' REGISTER
  245. XCP     REGISTER ',' REGISTER    SRCWORK+DSTWORK
  246. X.sp
  247. XDA     '@' REGISTER
  248. XDA     REGISTER
  249. X.sp
  250. XDEC     '@' REGISTER
  251. XDEC     REGISTER
  252. X.sp
  253. XDECW     '@' REGISTER
  254. XDECW     REGISTER    DSTDBL
  255. X.sp
  256. XDI    
  257. X.sp
  258. XDJNZ     REGISTER ',' expr    DSTWORK
  259. X.sp
  260. XEI    
  261. X.sp
  262. XINC     '@' REGISTER
  263. XINC     REGISTER
  264. XINC     REGISTER    DSTWORK
  265. X.sp
  266. XINCW     '@' REGISTER
  267. XINCW     REGISTER    DSTDBL
  268. X.sp
  269. XIRET    
  270. X.sp
  271. XJP     '@' REGISTER    DSTDBL
  272. XJP     CONDITION ',' expr
  273. XJP     expr
  274. X.sp
  275. XJR     CONDITION ',' expr
  276. XJR     expr
  277. X.sp
  278. XLD     '@' REGISTER ',' '#' expr
  279. XLD     '@' REGISTER ',' REGISTER
  280. XLD     '@' REGISTER ',' REGISTER    DSTWORK+SRCWORK
  281. XLD     REGISTER ',' '#' expr
  282. XLD     REGISTER ',' '#' expr    DSTWORK
  283. XLD     REGISTER ',' '@' REGISTER
  284. XLD     REGISTER ',' '@' REGISTER    DSTWORK+SRCWORK
  285. XLD     REGISTER ',' REGISTER
  286. XLD     REGISTER ',' REGISTER    DSTWORK
  287. XLD     REGISTER ',' REGISTER    SRCWORK
  288. XLD     REGISTER ',' expr '(' REGISTER ')'    DSTWORK+SRCWORK
  289. XLD     expr '(' REGISTER ')' ',' REGISTER     DSTWORK+SRCWORK
  290. X.sp
  291. XLDC     '@' REGISTER ',' REGISTER    DSTWORK+SRCWORK
  292. XLDC     REGISTER ',' '@' REGISTER    DSTWORK+SRCWORK
  293. X.sp
  294. XLDCI     '@' REGISTER ',' '@' REGISTER    DSTDBL+DSTWORK+SRCWORK
  295. XLDCI     '@' REGISTER ',' '@' REGISTER    SRCDBL+DSTWORK+SRCWORK
  296. X.sp
  297. XLDE     '@' REGISTER ',' REGISTER    DSTWORK+SRCWORK
  298. XLDE     REGISTER ',' '@' REGISTER    DSTWORK+SRCWORK
  299. X.sp
  300. XLDEI     '@' REGISTER ',' '@' REGISTER    DSTDBL+DSTWORK+SRCWORK
  301. XLDEI     '@' REGISTER ',' '@' REGISTER    SRCDBL+DSTWORK+SRCWORK
  302. X.sp
  303. XNOP    
  304. X.sp
  305. XOR     '@' REGISTER ',' '#' expr
  306. XOR     REGISTER ',' '#' expr
  307. XOR     REGISTER ',' '@' REGISTER
  308. XOR     REGISTER ',' '@' REGISTER    SRCWORK+DSTWORK
  309. XOR     REGISTER ',' REGISTER
  310. XOR     REGISTER ',' REGISTER    SRCWORK+DSTWORK
  311. X.sp
  312. XPOP     '@' REGISTER
  313. XPOP     REGISTER
  314. X.sp
  315. XPUSH     '@' REGISTER
  316. XPUSH     REGISTER
  317. X.sp
  318. XRCF    
  319. X.sp
  320. XRET    
  321. X.sp
  322. XRL     '@' REGISTER
  323. XRL     REGISTER
  324. X.sp
  325. XRLC     '@' REGISTER
  326. XRLC     REGISTER
  327. X.sp
  328. XRR     '@' REGISTER
  329. XRR     REGISTER
  330. X.sp
  331. XRRC     '@' REGISTER
  332. XRRC     REGISTER
  333. X.sp
  334. XSBC     '@' REGISTER ',' '#' expr
  335. XSBC     REGISTER ',' '#' expr
  336. XSBC     REGISTER ',' '@' REGISTER
  337. XSBC     REGISTER ',' '@' REGISTER    SRCWORK+DSTWORK
  338. XSBC     REGISTER ',' REGISTER
  339. XSBC     REGISTER ',' REGISTER    SRCWORK+DSTWORK
  340. X.sp
  341. XSCF    
  342. X.sp
  343. XSRA     '@' REGISTER
  344. XSRA     REGISTER
  345. X.sp
  346. XSRP     '#' expr
  347. X.sp
  348. XSUB     '@' REGISTER ',' '#' expr
  349. XSUB     REGISTER ',' '#' expr
  350. XSUB     REGISTER ',' '@' REGISTER
  351. XSUB     REGISTER ',' '@' REGISTER    SRCWORK+DSTWORK
  352. XSUB     REGISTER ',' REGISTER
  353. XSUB     REGISTER ',' REGISTER    SRCWORK+DSTWORK
  354. X.sp
  355. XSWAP     '@' REGISTER
  356. XSWAP     REGISTER
  357. X.sp
  358. XTCM     '@' REGISTER ',' '#' expr
  359. XTCM     REGISTER ',' '#' expr
  360. XTCM     REGISTER ',' '@' REGISTER
  361. XTCM     REGISTER ',' '@' REGISTER    SRCWORK+DSTWORK
  362. XTCM     REGISTER ',' REGISTER
  363. XTCM     REGISTER ',' REGISTER    SRCWORK+DSTWORK
  364. X.sp
  365. XTM     '@' REGISTER ',' '#' expr
  366. XTM     REGISTER ',' '#' expr
  367. XTM     REGISTER ',' '@' REGISTER
  368. XTM     REGISTER ',' '@' REGISTER    SRCWORK+DSTWORK
  369. XTM     REGISTER ',' REGISTER
  370. XTM     REGISTER ',' REGISTER    SRCWORK+DSTWORK
  371. X.sp
  372. XXOR     '@' REGISTER ',' '#' expr
  373. XXOR     REGISTER ',' '#' expr
  374. XXOR     REGISTER ',' '@' REGISTER
  375. XXOR     REGISTER ',' '@' REGISTER    SRCWORK+DSTWORK
  376. XXOR     REGISTER ',' REGISTER
  377. XXOR     REGISTER ',' REGISTER    SRCWORK+DSTWORK
  378. X.TE
  379. X.H 3 "Selection Criteria Keywords"
  380. X.VL 25 5 
  381. X.LI DSTWORK
  382. XThe instruction will use the short form if
  383. Xthe register is in the working set.
  384. X.LI DSTDBL
  385. XThe instruction requires that the destination register be a double register.
  386. X.LI SRCWORK
  387. XThe instruction will use the short form if
  388. Xthe register is in the working set.
  389. X.LI SRCDBL
  390. XThe instruction requires that the source register be a double register.
  391. X.LE
  392. X.H 3 "Apostrophes"
  393. XThe apostrophes in the syntax field are a notation used for the
  394. Xparser generator and are not put in the assembler source statement.
  395. X.H 2 "Notes"
  396. X.H 3 "Registers"
  397. XRegisters are treated as symbols with a different syntactic type than
  398. Xmemory addresses. 
  399. XThis seperates symbols which would have the same numeric value into the
  400. Xdifferent address spaces, register and memory.
  401. XUsing a symbol that is already defined as a Register as a statement label
  402. Xfor an instruction or a SET/EQU will result in a "Syntax Error".
  403. X.P
  404. XRegisters are represented by the reserved symbols R0 thru R15 and RR0 thru
  405. XRR14 for the working set registers.   
  406. XOther registers are defined with the REG and RREG pseudooperations.
  407. X.P
  408. XRegister Symbols must be surrounded by parenthesis when used in expressions.
  409. XConverted register values are meaningless as ROM or Data memory addresses.
  410. XWorking set registers have a value between 0e0h and 0efh.
  411. X.DS I N
  412. XExample
  413. X.SP
  414. Xld r3, #(buffstart)
  415. X.DE
  416. X.H 3 "Data Memory"
  417. XROM and Data memory addresses are not differentiated.
  418. X.H 3 "Conditions"
  419. XConditions are represented by the reserved symbols F, C, NC, Z, NZ, PL, MI,
  420. XOV, NOV, EQ, NE, GE, LT, GT, LE, UGE, ULT, UGT, ULE
  421. X.P
  422. XNote that the EQ, NE, GT, LE, GE, LT operators are not available in this
  423. Xassembler, the =, <>, >, <=, >=, < special character representations must
  424. Xbe used.
  425. X.H 3 "Reserved Symbols"
  426. X.H 4 "Machine Dependent Reserved Symbols"
  427. XAND
  428. XC
  429. XDEFINED
  430. XEQ
  431. XF
  432. XGE
  433. XGT
  434. XHIGH
  435. XLE
  436. XLOW
  437. XLT
  438. XMI
  439. XMOD
  440. XNC
  441. XNE
  442. XNOT
  443. XNOV
  444. XNZ
  445. XOR
  446. XOV
  447. XPL
  448. XR0
  449. XR1
  450. XR10
  451. XR11
  452. XR12
  453. XR13
  454. XR14
  455. XR15
  456. XR2
  457. XR3
  458. XR4
  459. XR5
  460. XR6
  461. XR7
  462. XR8
  463. XR9
  464. XRR0
  465. XRR10
  466. XRR12
  467. XRR14
  468. XRR2
  469. XRR4
  470. XRR6
  471. XRR8
  472. XSHL
  473. XSHR
  474. XUGE
  475. XUGT
  476. XULE
  477. XULT
  478. XXOR
  479. XZ
  480. Xand
  481. Xdefined
  482. Xhigh
  483. Xlow
  484. Xmod
  485. Xnot
  486. Xor
  487. Xshl
  488. Xshr
  489. Xxor
  490. X.TC 1 1 7
  491. SHAR_EOF
  492. true || echo 'restore of asz8.doc failed'
  493. fi
  494. # ============= asz8.tst ==============
  495. if test -f 'asz8.tst' -a X"$1" != X"-c"; then
  496.     echo 'x - skipping asz8.tst (File already exists)'
  497. else
  498. echo 'x - extracting asz8.tst (Text)'
  499. sed 's/^X//' << 'SHAR_EOF' > 'asz8.tst' &&
  500. Ximmed    equ    11H
  501. Xxdest    reg    $2d
  502. Xxsrc    reg    $1c
  503. Xxddest    rreg    $44
  504. X    adc    @ xdest , # immed
  505. X    adc    R13, @ R12
  506. X    adc    R13, R12
  507. X    adc    xdest , # immed
  508. X    adc    xdest, @ xsrc
  509. X    adc    xdest, xsrc
  510. X    add    @ xdest , # immed
  511. X    add    R13, @ R12
  512. X    add    R13, R12
  513. X    add    xdest , # immed
  514. X    add    xdest, @ xsrc
  515. X    add    xdest, xsrc
  516. X    and    @ xdest , # immed
  517. X    and    R13, @ R12
  518. X    and    R13, R12
  519. X    and    xdest , # immed
  520. X    and    xdest, @ xsrc
  521. X    and    xdest, xsrc
  522. X    call    @ xddest
  523. X    call    jmpdst
  524. X    ccf
  525. X    clr    @ xdest
  526. X    clr    xdest
  527. X    com    @ xdest
  528. X    com    xdest
  529. X    cp    @ xdest , # immed
  530. X    cp    R13, @ R12
  531. X    cp    R13, R12
  532. X    cp    xdest , # immed
  533. X    cp    xdest, @ xsrc
  534. X    cp    xdest, xsrc
  535. X    da    @ xdest
  536. X    da    xdest
  537. X    dec    @ xdest
  538. X    dec    xdest
  539. X    decw    @ xddest
  540. X    decw    xddest
  541. X    di
  542. X    djnz    R0, *+56
  543. X    djnz    R1, *+56
  544. X    djnz    R10, *+56
  545. X    djnz    R11, *+56
  546. X    djnz    R12, *+56
  547. X    djnz    R13, *+56
  548. X    djnz    R14, *+56
  549. X    djnz    R15, *+56
  550. X    djnz    R2, *+56
  551. X    djnz    R3, *+56
  552. X    djnz    R4, *+56
  553. X    djnz    R5, *+56
  554. X    djnz    R6, *+56
  555. X    djnz    R7, *+56
  556. X    djnz    R8, *+56
  557. X    djnz    R9, *+56
  558. X    ei
  559. X    inc    @ xdest
  560. X    inc    R0
  561. X    inc    R1
  562. X    inc    R10
  563. X    inc    R11
  564. X    inc    R12
  565. X    inc    R13
  566. X    inc    R14
  567. X    inc    R15
  568. X    inc    R2
  569. X    inc    R3
  570. X    inc    R4
  571. X    inc    R5
  572. X    inc    R6
  573. X    inc    R7
  574. X    inc    R8
  575. X    inc    R9
  576. X    inc    xdest
  577. X    incw    @ xddest
  578. X    incw    xddest
  579. X    iret
  580. X    jp    @ xddest
  581. X    jp    jmpdst
  582. X    jp    C, jmpdst
  583. X    jp    EQ, jmpdst
  584. X    jp    F, jmpdst
  585. X    jp    GE, jmpdst
  586. X    jp    GT, jmpdst
  587. X    jp    LE, jmpdst
  588. X    jp    LT, jmpdst
  589. X    jp    MI, jmpdst
  590. X    jp    NC, jmpdst
  591. X    jp    NE, jmpdst
  592. X    jp    NOV, jmpdst
  593. X    jp    NZ, jmpdst
  594. X    jp    OV, jmpdst
  595. X    jp    PL, jmpdst
  596. X    jp    UGE, jmpdst
  597. X    jp    UGT, jmpdst
  598. X    jp    ULE, jmpdst
  599. X    jp    ULT, jmpdst
  600. X    jp    Z, jmpdst
  601. X    jr    *+56
  602. X    jr    C, *+56
  603. X    jr    EQ, *+56
  604. X    jr    F, *+56
  605. X    jr    GE, *+56
  606. X    jr    GT, *+56
  607. X    jr    LE, *+56
  608. X    jr    LT, *+56
  609. X    jr    MI, *+56
  610. X    jr    NC, *+56
  611. X    jr    NE, *+56
  612. X    jr    NOV, *+56
  613. X    jr    NZ, *+56
  614. X    jr    OV, *+56
  615. X    jr    PL, *+56
  616. X    jr    UGE, *+56
  617. X    jr    UGT, *+56
  618. X    jr    ULE, *+56
  619. X    jr    ULT, *+56
  620. X    jr    Z, *+56
  621. X    ld    R13, $44(R12)
  622. X    ld    $55(R13), R12
  623. X    ld    R13, @ R12
  624. X    ld    xdest, xsrc
  625. X    ld    xdest, @ xsrc
  626. X    ld    xdest, # immed
  627. X    ld    @ xdest, # immed
  628. X    ld    @ R13, R12
  629. X    ld    @ xdest, xsrc
  630. X    ld    R0, # immed
  631. X    ld    R0, xsrc
  632. X    ld    R1, # immed
  633. X    ld    R1, xsrc
  634. X    ld    R10, # immed
  635. X    ld    R10, xsrc
  636. X    ld    R11, # immed
  637. X    ld    R11, xsrc
  638. X    ld    R12, # immed
  639. X    ld    R12, xsrc
  640. X    ld    R13, # immed
  641. X    ld    R13, xsrc
  642. X    ld    R14, # immed
  643. X    ld    R14, xsrc
  644. X    ld    R15, # immed
  645. X    ld    R15, xsrc
  646. X    ld    R2, # immed
  647. X    ld    R2, xsrc
  648. X    ld    R3, # immed
  649. X    ld    R3, xsrc
  650. X    ld    R4, # immed
  651. X    ld    R4, xsrc
  652. X    ld    R5, # immed
  653. X    ld    R5, xsrc
  654. X    ld    R6, # immed
  655. X    ld    R6, xsrc
  656. X    ld    R7, # immed
  657. X    ld    R7, xsrc
  658. X    ld    R8, # immed
  659. X    ld    R8, xsrc
  660. X    ld    R9, # immed
  661. X    ld    R9, xsrc
  662. X    ld    xdest, R0
  663. X    ld    xdest, R1
  664. X    ld    xdest, R10
  665. X    ld    xdest, R11
  666. X    ld    xdest, R12
  667. X    ld    xdest, R13
  668. X    ld    xdest, R14
  669. X    ld    xdest, R15
  670. X    ld    xdest, R2
  671. X    ld    xdest, R3
  672. X    ld    xdest, R4
  673. X    ld    xdest, R5
  674. X    ld    xdest, R6
  675. X    ld    xdest, R7
  676. X    ld    xdest, R8
  677. X    ld    xdest, R9
  678. X    ldc    @ RR10, R13
  679. X    ldc    R13, @RR10
  680. X    ldci    @ R13, @RR10
  681. X    ldci    @ RR10, @ R13
  682. X    lde    @ RR10, R13
  683. X    lde    R13, @RR10
  684. X    ldei    @ R13, @RR10
  685. X    ldei    @ RR10, @ R13
  686. X    nop
  687. X    or    @ xdest , # immed
  688. X    or    R13, @ R12
  689. X    or    R13, R12
  690. X    or    xdest , # immed
  691. X    or    xdest, @ xsrc
  692. X    or    xdest, xsrc
  693. X    pop    @ xdest
  694. X    pop    xdest
  695. X    push    @ xdest
  696. X    push    xdest
  697. X    rcf
  698. X    ret
  699. X    rl    @ xdest
  700. X    rl    xdest
  701. X    rlc    @ xdest
  702. X    rlc    xdest
  703. X    rr    @ xdest
  704. X    rr    xdest
  705. X    rrc    @ xdest
  706. X    rrc    xdest
  707. X    sbc    @ xdest , # immed
  708. X    sbc    R13, @ R12
  709. X    sbc    R13, R12
  710. X    sbc    xdest , # immed
  711. X    sbc    xdest, @ xsrc
  712. X    sbc    xdest, xsrc
  713. X    scf
  714. X    sra    @ xdest
  715. X    sra    xdest
  716. X    srp    # 112
  717. X    sub    @ xdest , # immed
  718. X    sub    R13, @ R12
  719. X    sub    R13, R12
  720. X    sub    xdest , # immed
  721. X    sub    xdest, @ xsrc
  722. X    sub    xdest, xsrc
  723. X    swap    @ xdest
  724. X    swap    xdest
  725. X    tcm    @ xdest , # immed
  726. X    tcm    R13, @ R12
  727. X    tcm    R13, R12
  728. X    tcm    xdest , # immed
  729. X    tcm    xdest, @ xsrc
  730. X    tcm    xdest, xsrc
  731. X    tm    @ xdest , # immed
  732. X    tm    R13, @ R12
  733. X    tm    R13, R12
  734. X    tm    xdest , # immed
  735. X    tm    xdest, @ xsrc
  736. X    tm    xdest, xsrc
  737. X    xor    @ xdest , # immed
  738. X    xor    R13, @ R12
  739. X    xor    R13, R12
  740. X    xor    xdest , # immed
  741. X    xor    xdest, @ xsrc
  742. X    xor    xdest, xsrc
  743. Xjmpdst    
  744. SHAR_EOF
  745. true || echo 'restore of asz8.tst failed'
  746. fi
  747. # ============= asz8.tut ==============
  748. if test -f 'asz8.tut' -a X"$1" != X"-c"; then
  749.     echo 'x - skipping asz8.tut (File already exists)'
  750. else
  751. echo 'x - extracting asz8.tut (Text)'
  752. sed 's/^X//' << 'SHAR_EOF' > 'asz8.tut' &&
  753. X00000011 immed            0000002d xdest            0000001c xsrc             
  754. X00000244 xddest           0000020a jmpdst           
  755. X  0x11                   immed    equ    11H
  756. X 0x2d                   xdest    reg    $2d
  757. X 0x1c                   xsrc    reg    $1c
  758. X 0x44                   xddest    rreg    $44
  759. X0000 17 2d 11             adc    @ xdest , # immed
  760. X0003 13 dc             adc    R13, @ R12
  761. X0005 12 dc             adc    R13, R12
  762. X0007 16 2d 11             adc    xdest , # immed
  763. X000a 15 1c 2d             adc    xdest, @ xsrc
  764. X000d 14 1c 2d             adc    xdest, xsrc
  765. X0010 07 2d 11             add    @ xdest , # immed
  766. X0013 03 dc             add    R13, @ R12
  767. X0015 02 dc             add    R13, R12
  768. X0017 06 2d 11             add    xdest , # immed
  769. X001a 05 1c 2d             add    xdest, @ xsrc
  770. X001d 04 1c 2d             add    xdest, xsrc
  771. X0020 57 2d 11             and    @ xdest , # immed
  772. X0023 53 dc             and    R13, @ R12
  773. X0025 52 dc             and    R13, R12
  774. X0027 56 2d 11             and    xdest , # immed
  775. X002a 55 1c 2d             and    xdest, @ xsrc
  776. X002d 54 1c 2d             and    xdest, xsrc
  777. X0030 d4 44             call    @ xddest
  778. X0032 d6 02 0a             call    jmpdst
  779. X0035 ef             ccf
  780. X0036 b1 2d             clr    @ xdest
  781. X0038 b0 2d             clr    xdest
  782. X003a 61 2d             com    @ xdest
  783. X003c 60 2d             com    xdest
  784. X003e a7 2d 11             cp    @ xdest , # immed
  785. X0041 a3 dc             cp    R13, @ R12
  786. X0043 a2 dc             cp    R13, R12
  787. X0045 a6 2d 11             cp    xdest , # immed
  788. X0048 a5 1c 2d             cp    xdest, @ xsrc
  789. X004b a4 1c 2d             cp    xdest, xsrc
  790. X004e 41 2d             da    @ xdest
  791. X0050 40 2d             da    xdest
  792. X0052 01 2d             dec    @ xdest
  793. X0054 00 2d             dec    xdest
  794. X0056 81 44             decw    @ xddest
  795. X0058 80 44             decw    xddest
  796. X005a 8f             di
  797. X005b 0a 36             djnz    R0, *+56
  798. X005d 1a 36             djnz    R1, *+56
  799. X005f aa 36             djnz    R10, *+56
  800. X0061 ba 36             djnz    R11, *+56
  801. X0063 ca 36             djnz    R12, *+56
  802. X0065 da 36             djnz    R13, *+56
  803. X0067 ea 36             djnz    R14, *+56
  804. X0069 fa 36             djnz    R15, *+56
  805. X006b 2a 36             djnz    R2, *+56
  806. X006d 3a 36             djnz    R3, *+56
  807. X006f 4a 36             djnz    R4, *+56
  808. X0071 5a 36             djnz    R5, *+56
  809. X0073 6a 36             djnz    R6, *+56
  810. X0075 7a 36             djnz    R7, *+56
  811. X0077 8a 36             djnz    R8, *+56
  812. X0079 9a 36             djnz    R9, *+56
  813. X007b 9f             ei
  814. X007c 21 2d             inc    @ xdest
  815. X007e 0e             inc    R0
  816. X007f 1e             inc    R1
  817. X0080 ae             inc    R10
  818. X0081 be             inc    R11
  819. X0082 ce             inc    R12
  820. X0083 de             inc    R13
  821. X0084 ee             inc    R14
  822. X0085 fe             inc    R15
  823. X0086 2e             inc    R2
  824. X0087 3e             inc    R3
  825. X0088 4e             inc    R4
  826. X0089 5e             inc    R5
  827. X008a 6e             inc    R6
  828. X008b 7e             inc    R7
  829. X008c 8e             inc    R8
  830. X008d 9e             inc    R9
  831. X008e 20 2d             inc    xdest
  832. X0090 a1 44             incw    @ xddest
  833. X0092 a0 44             incw    xddest
  834. X0094 bf             iret
  835. X0095 30 44             jp    @ xddest
  836. X0097 8d 02 0a             jp    jmpdst
  837. X009a 7d 02 0a             jp    C, jmpdst
  838. X009d 6d 02 0a             jp    EQ, jmpdst
  839. X00a0 0d 02 0a             jp    F, jmpdst
  840. X00a3 9d 02 0a             jp    GE, jmpdst
  841. X00a6 ad 02 0a             jp    GT, jmpdst
  842. X00a9 2d 02 0a             jp    LE, jmpdst
  843. X00ac 1d 02 0a             jp    LT, jmpdst
  844. X00af 5d 02 0a             jp    MI, jmpdst
  845. X00b2 fd 02 0a             jp    NC, jmpdst
  846. X00b5 ed 02 0a             jp    NE, jmpdst
  847. X00b8 cd 02 0a             jp    NOV, jmpdst
  848. X00bb ed 02 0a             jp    NZ, jmpdst
  849. X00be 4d 02 0a             jp    OV, jmpdst
  850. X00c1 dd 02 0a             jp    PL, jmpdst
  851. X00c4 fd 02 0a             jp    UGE, jmpdst
  852. X00c7 bd 02 0a             jp    UGT, jmpdst
  853. X00ca 3d 02 0a             jp    ULE, jmpdst
  854. X00cd 7d 02 0a             jp    ULT, jmpdst
  855. X00d0 6d 02 0a             jp    Z, jmpdst
  856. X00d3 8b 36             jr    *+56
  857. X00d5 7b 36             jr    C, *+56
  858. X00d7 6b 36             jr    EQ, *+56
  859. X00d9 0b 36             jr    F, *+56
  860. X00db 9b 36             jr    GE, *+56
  861. X00dd ab 36             jr    GT, *+56
  862. X00df 2b 36             jr    LE, *+56
  863. X00e1 1b 36             jr    LT, *+56
  864. X00e3 5b 36             jr    MI, *+56
  865. X00e5 fb 36             jr    NC, *+56
  866. X00e7 eb 36             jr    NE, *+56
  867. X00e9 cb 36             jr    NOV, *+56
  868. X00eb eb 36             jr    NZ, *+56
  869. X00ed 4b 36             jr    OV, *+56
  870. X00ef db 36             jr    PL, *+56
  871. X00f1 fb 36             jr    UGE, *+56
  872. X00f3 bb 36             jr    UGT, *+56
  873. X00f5 3b 36             jr    ULE, *+56
  874. X00f7 7b 36             jr    ULT, *+56
  875. X00f9 6b 36             jr    Z, *+56
  876. X00fb c7 dc 44             ld    R13, $44(R12)
  877. X00fe d7 cd 55             ld    $55(R13), R12
  878. X0101 e3 dc             ld    R13, @ R12
  879. X0103 e4 1c 2d             ld    xdest, xsrc
  880. X0106 e5 1c 2d             ld    xdest, @ xsrc
  881. X0109 e6 2d 11             ld    xdest, # immed
  882. X010c e7 2d 11             ld    @ xdest, # immed
  883. X010f f3 dc             ld    @ R13, R12
  884. X0111 f5 1c 2d             ld    @ xdest, xsrc
  885. X0114 0c 11             ld    R0, # immed
  886. X0116 08 1c             ld    R0, xsrc
  887. X0118 1c 11             ld    R1, # immed
  888. X011a 18 1c             ld    R1, xsrc
  889. X011c ac 11             ld    R10, # immed
  890. X011e a8 1c             ld    R10, xsrc
  891. X0120 bc 11             ld    R11, # immed
  892. X0122 b8 1c             ld    R11, xsrc
  893. X0124 cc 11             ld    R12, # immed
  894. X0126 c8 1c             ld    R12, xsrc
  895. X0128 dc 11             ld    R13, # immed
  896. X012a d8 1c             ld    R13, xsrc
  897. X012c ec 11             ld    R14, # immed
  898. X012e e8 1c             ld    R14, xsrc
  899. X0130 fc 11             ld    R15, # immed
  900. X0132 f8 1c             ld    R15, xsrc
  901. X0134 2c 11             ld    R2, # immed
  902. X0136 28 1c             ld    R2, xsrc
  903. X0138 3c 11             ld    R3, # immed
  904. X013a 38 1c             ld    R3, xsrc
  905. X013c 4c 11             ld    R4, # immed
  906. X013e 48 1c             ld    R4, xsrc
  907. X0140 5c 11             ld    R5, # immed
  908. X0142 58 1c             ld    R5, xsrc
  909. X0144 6c 11             ld    R6, # immed
  910. X0146 68 1c             ld    R6, xsrc
  911. X0148 7c 11             ld    R7, # immed
  912. X014a 78 1c             ld    R7, xsrc
  913. X014c 8c 11             ld    R8, # immed
  914. X014e 88 1c             ld    R8, xsrc
  915. X0150 9c 11             ld    R9, # immed
  916. X0152 98 1c             ld    R9, xsrc
  917. X0154 09 2d             ld    xdest, R0
  918. X0156 19 2d             ld    xdest, R1
  919. X0158 a9 2d             ld    xdest, R10
  920. X015a b9 2d             ld    xdest, R11
  921. X015c c9 2d             ld    xdest, R12
  922. X015e d9 2d             ld    xdest, R13
  923. X0160 e9 2d             ld    xdest, R14
  924. X0162 f9 2d             ld    xdest, R15
  925. X0164 29 2d             ld    xdest, R2
  926. X0166 39 2d             ld    xdest, R3
  927. X0168 49 2d             ld    xdest, R4
  928. X016a 59 2d             ld    xdest, R5
  929. X016c 69 2d             ld    xdest, R6
  930. X016e 79 2d             ld    xdest, R7
  931. X0170 89 2d             ld    xdest, R8
  932. X0172 99 2d             ld    xdest, R9
  933. X0174 d2 da             ldc    @ RR10, R13
  934. X0176 c2 da             ldc    R13, @RR10
  935. X0178 c3 da             ldci    @ R13, @RR10
  936. X017a d3 da             ldci    @ RR10, @ R13
  937. X017c 92 da             lde    @ RR10, R13
  938. X017e 82 da             lde    R13, @RR10
  939. X0180 83 da             ldei    @ R13, @RR10
  940. X0182 93 da             ldei    @ RR10, @ R13
  941. X0184 ff             nop
  942. X0185 47 2d 11             or    @ xdest , # immed
  943. X0188 43 dc             or    R13, @ R12
  944. X018a 42 dc             or    R13, R12
  945. X018c 46 2d 11             or    xdest , # immed
  946. X018f 45 1c 2d             or    xdest, @ xsrc
  947. X0192 44 1c 2d             or    xdest, xsrc
  948. X0195 51 2d             pop    @ xdest
  949. X0197 50 2d             pop    xdest
  950. X0199 71 2d             push    @ xdest
  951. X019b 70 2d             push    xdest
  952. X019d cf             rcf
  953. X019e af             ret
  954. X019f 91 2d             rl    @ xdest
  955. X01a1 90 2d             rl    xdest
  956. X01a3 11 2d             rlc    @ xdest
  957. X01a5 10 2d             rlc    xdest
  958. X01a7 e1 2d             rr    @ xdest
  959. X01a9 e0 2d             rr    xdest
  960. X01ab c1 2d             rrc    @ xdest
  961. X01ad c0 2d             rrc    xdest
  962. X01af 37 2d 11             sbc    @ xdest , # immed
  963. X01b2 33 dc             sbc    R13, @ R12
  964. X01b4 32 dc             sbc    R13, R12
  965. X01b6 36 2d 11             sbc    xdest , # immed
  966. X01b9 35 1c 2d             sbc    xdest, @ xsrc
  967. X01bc 34 1c 2d             sbc    xdest, xsrc
  968. X01bf df             scf
  969. X01c0 d1 2d             sra    @ xdest
  970. X01c2 d0 2d             sra    xdest
  971. X01c4 31 70             srp    # 112
  972. X01c6 27 2d 11             sub    @ xdest , # immed
  973. X01c9 23 dc             sub    R13, @ R12
  974. X01cb 22 dc             sub    R13, R12
  975. X01cd 26 2d 11             sub    xdest , # immed
  976. X01d0 25 1c 2d             sub    xdest, @ xsrc
  977. X01d3 24 1c 2d             sub    xdest, xsrc
  978. X01d6 f1 2d             swap    @ xdest
  979. X01d8 f0 2d             swap    xdest
  980. X01da 67 2d 11             tcm    @ xdest , # immed
  981. X01dd 63 dc             tcm    R13, @ R12
  982. X01df 62 dc             tcm    R13, R12
  983. X01e1 66 2d 11             tcm    xdest , # immed
  984. X01e4 65 1c 2d             tcm    xdest, @ xsrc
  985. X01e7 64 1c 2d             tcm    xdest, xsrc
  986. X01ea 77 2d 11             tm    @ xdest , # immed
  987. X01ed 73 dc             tm    R13, @ R12
  988. X01ef 72 dc             tm    R13, R12
  989. X01f1 76 2d 11             tm    xdest , # immed
  990. X01f4 75 1c 2d             tm    xdest, @ xsrc
  991. X01f7 74 1c 2d             tm    xdest, xsrc
  992. X01fa b7 2d 11             xor    @ xdest , # immed
  993. X01fd b3 dc             xor    R13, @ R12
  994. X01ff b2 dc             xor    R13, R12
  995. X0201 b6 2d 11             xor    xdest , # immed
  996. X0204 b5 1c 2d             xor    xdest, @ xsrc
  997. X0207 b4 1c 2d             xor    xdest, xsrc
  998. X 0x20a                  jmpdst    
  999. X ERROR SUMMARY - ERRORS DETECTED 0
  1000. X               -  WARNINGS       0
  1001. SHAR_EOF
  1002. true || echo 'restore of asz8.tut failed'
  1003. fi
  1004. # ============= asz8.y ==============
  1005. if test -f 'asz8.y' -a X"$1" != X"-c"; then
  1006.     echo 'x - skipping asz8.y (File already exists)'
  1007. else
  1008. echo 'x - extracting asz8.y (Text)'
  1009. sed 's/^X//' << 'SHAR_EOF' > 'asz8.y' &&
  1010. X%{
  1011. X
  1012. X/*
  1013. XHEADER:     ;
  1014. XTITLE:         Frankenstein Cross Assemblers;
  1015. XVERSION:     2.0;
  1016. XDESCRIPTION: "    Reconfigurable Cross-assembler producing Intel (TM)
  1017. X        Hex format object records.  ";
  1018. XKEYWORDS:     cross-assemblers, 1805, 2650, 6301, 6502, 6805, 6809, 
  1019. X        6811, tms7000, 8048, 8051, 8096, z8, z80;
  1020. XSYSTEM:     UNIX, MS-Dos ;
  1021. XFILENAME:     asz8.y;
  1022. XWARNINGS:     "This software is in the public domain.  
  1023. X        Any prior copyright claims are relinquished.  
  1024. X
  1025. X        This software is distributed with no warranty whatever.  
  1026. X        The author takes no responsibility for the consequences 
  1027. X        of its use.
  1028. X
  1029. X        Yacc (or Bison) required to compile."  ;
  1030. XSEE-ALSO:     asz8.doc,frasmain.c;    
  1031. XAUTHORS:     Mark Zenier;
  1032. XCOMPILERS:     Microport Sys V/AT, ATT Yacc, Turbo C V1.5, Bison (CUG disk 285)
  1033. X        (previous versions Xenix, Unisoft 68000 Version 7, Sun 3);
  1034. X*/
  1035. X/* z8 instruction generation file */
  1036. X/* November 17, 1990 */
  1037. X
  1038. X/*
  1039. X    description    frame work parser description for framework cross
  1040. X            assemblers
  1041. X    history        February 2, 1988
  1042. X            September 11, 1990 - merge table definition
  1043. X            September 12, 1990 - short file names
  1044. X            September 14, 1990 - short variable names
  1045. X            September 17, 1990 - use yylex as external
  1046. X*/
  1047. X#include <stdio.h>
  1048. X#include "frasmdat.h"
  1049. X#include "fragcon.h"
  1050. X
  1051. X#define yylex lexintercept
  1052. X
  1053. X/*
  1054. X    file        critz8.h
  1055. X    author        Mark Zenier
  1056. X    description    Selection criteria and syntax type constants for
  1057. X            the z8 framework assembler
  1058. X    usage        Unix
  1059. X    history        October 28, 1987
  1060. X*/
  1061. X
  1062. X/* 0000.0000.0000.000x   destination register is in working set */
  1063. X#define    DSTWORK    0x1
  1064. X
  1065. X/* 0000.0000.0000.00x0    destination is double register */
  1066. X#define DSTDBL    0x2
  1067. X
  1068. X/* 0000.0000.0000.0x00   source register is in working set */
  1069. X#define SRCWORK    0x4
  1070. X
  1071. X/* 0000.0000.0000.x000    source is double register */
  1072. X#define SRCDBL    0x8
  1073. X
  1074. X/* type flags for symbol table value for registers */
  1075. X#define REGFLGSHFT    8
  1076. X#define REGDFLGSH    REGFLGSHFT
  1077. X#define REGSFLGSH    (REGFLGSHFT -2)
  1078. X#define REGFLGS        ((DSTWORK|DSTDBL)<<REGFLGSHFT)
  1079. X#define REGDEFWRK    (DSTWORK<<REGFLGSHFT)
  1080. X#define    REGDEFDBL    (DSTDBL<<REGFLGSHFT)
  1081. X#define REGBITS        0xff
  1082. X#define REGWORKBITS    0xf
  1083. X
  1084. X#define CPU8600    1    /* use z8 register set */
  1085. X#define CPU8090    2    /* use UPC register set */
  1086. X#define ST_CEXP 0x1
  1087. X#define ST_EXP 0x2
  1088. X#define ST_INH 0x4
  1089. X#define ST_IR1 0x8
  1090. X#define ST_IRIM 0x10
  1091. X#define ST_IRIR 0x20
  1092. X#define ST_IRR 0x40
  1093. X#define ST_R1 0x80
  1094. X#define ST_R2 0x100
  1095. X#define ST_REXP 0x200
  1096. X#define ST_RIMM 0x400
  1097. X#define ST_RIR 0x800
  1098. X#define ST_RX 0x1000
  1099. X#define ST_XR 0x2000
  1100. X#define ST_IMM 0x1
  1101. X    
  1102. X    int cpuselect = CPU8600;
  1103. X    static char    genbdef[] = "[1=];";
  1104. X    static char    genwdef[] = "[1=]x";
  1105. X    char ignosyn[] = "[Xinvalid syntax for instruction";
  1106. X    char ignosel[] = "[Xinvalid operands";
  1107. X    int    prevregwork = 0;
  1108. X    int    regloccnt = 0;
  1109. X
  1110. X    long    labelloc;
  1111. X    static int satsub;
  1112. X    int    ifstkpt = 0;
  1113. X    int    fraifskip = FALSE;
  1114. X
  1115. X    struct symel * endsymbol = SYMNULL;
  1116. X
  1117. X%}
  1118. X%union {
  1119. X    int    intv;
  1120. X    long     longv;
  1121. X    char    *strng;
  1122. X    struct symel *symb;
  1123. X}
  1124. X
  1125. X%token <intv> REGISTER
  1126. X%token <intv> CONDITION
  1127. X
  1128. X%type <intv> regdefop regoperand
  1129. X
  1130. X%token <intv> KOC_BDEF
  1131. X%token <intv> KOC_ELSE
  1132. X%token <intv> KOC_END
  1133. X%token <intv> KOC_ENDI
  1134. X%token <intv> KOC_EQU
  1135. X%token <intv> KOC_IF
  1136. X%token <intv> KOC_INCLUDE
  1137. X%token <intv> KOC_ORG
  1138. X%token <intv> KOC_RESM
  1139. X%token <intv> KOC_SDEF
  1140. X%token <intv> KOC_SET
  1141. X%token <intv> KOC_WDEF
  1142. X%token <intv> KOC_CHSET
  1143. X%token <intv> KOC_CHDEF
  1144. X%token <intv> KOC_CHUSE
  1145. X%token <intv> KOC_REG
  1146. X%token <intv> KOC_RREG
  1147. X%token <intv> KOC_CPU
  1148. X%token <intv> KOC_opcode
  1149. X%token <intv> KOC_srp
  1150. X
  1151. X%token <longv> CONSTANT
  1152. X%token EOL
  1153. X%token KEOP_AND
  1154. X%token KEOP_DEFINED
  1155. X%token KEOP_EQ
  1156. X%token KEOP_GE
  1157. X%token KEOP_GT
  1158. X%token KEOP_HIGH
  1159. X%token KEOP_LE
  1160. X%token KEOP_LOW
  1161. X%token KEOP_LT
  1162. X%token KEOP_MOD
  1163. X%token KEOP_MUN
  1164. X%token KEOP_NE
  1165. X%token KEOP_NOT
  1166. X%token KEOP_OR
  1167. X%token KEOP_SHL
  1168. X%token KEOP_SHR
  1169. X%token KEOP_XOR
  1170. X%token KEOP_locctr
  1171. X%token <symb> LABEL
  1172. X%token <strng> STRING
  1173. X%token <symb> SYMBOL
  1174. X
  1175. X%token KTK_invalid
  1176. X
  1177. X%right    KEOP_HIGH KEOP_LOW
  1178. X%left    KEOP_OR KEOP_XOR
  1179. X%left    KEOP_AND
  1180. X%right    KEOP_NOT
  1181. X%nonassoc    KEOP_GT KEOP_GE KEOP_LE KEOP_LT KEOP_NE KEOP_EQ
  1182. X%left    '+' '-'
  1183. X%left    '*' '/' KEOP_MOD KEOP_SHL KEOP_SHR
  1184. X%right    KEOP_MUN
  1185. X
  1186. X
  1187. X%type <intv> expr exprlist stringlist
  1188. X
  1189. X%start file
  1190. X
  1191. X%%
  1192. X
  1193. Xfile    :    file allline
  1194. X    |    allline
  1195. X    ;
  1196. X
  1197. Xallline    :     line EOL
  1198. X            {
  1199. X                clrexpr();
  1200. X            }
  1201. X    |    EOL
  1202. X    |    error EOL
  1203. X            {
  1204. X                clrexpr();
  1205. X                yyerrok;
  1206. X            }
  1207. X    ;
  1208. X
  1209. Xline    :    LABEL KOC_END 
  1210. X            {
  1211. X                endsymbol = $1;
  1212. X                nextreadact = Nra_end;
  1213. X            }
  1214. X    |          KOC_END 
  1215. X            {
  1216. X                nextreadact = Nra_end;
  1217. X            }
  1218. X    |    KOC_INCLUDE STRING
  1219. X            {
  1220. X        if(nextfstk >= FILESTKDPTH)
  1221. X        {
  1222. X            fraerror("include file nesting limit exceeded");
  1223. X        }
  1224. X        else
  1225. X        {
  1226. X            infilestk[nextfstk].fnm = savestring($2,strlen($2));
  1227. X            if( (infilestk[nextfstk].fpt = fopen($2,"r"))
  1228. X                ==(FILE *)NULL )
  1229. X            {
  1230. X                fraerror("cannot open include file");
  1231. X            }
  1232. X            else
  1233. X            {
  1234. X                nextreadact = Nra_new;
  1235. X            }
  1236. X        }
  1237. X            }
  1238. X    |    LABEL KOC_EQU expr 
  1239. X            {
  1240. X                if($1 -> seg == SSG_UNDEF)
  1241. X                {
  1242. X                    pevalexpr(0, $3);
  1243. X                    if(evalr[0].seg == SSG_ABS)
  1244. X                    {
  1245. X                        $1 -> seg = SSG_EQU;
  1246. X                        $1 -> value = evalr[0].value;
  1247. X                        prtequvalue("C: 0x%lx\n",
  1248. X                            evalr[0].value);
  1249. X                    }
  1250. X                    else
  1251. X                    {
  1252. X                        fraerror(
  1253. X                    "noncomputable expression for EQU");
  1254. X                    }
  1255. X                }
  1256. X                else
  1257. X                {
  1258. X                    fraerror(
  1259. X                "cannot change symbol value with EQU");
  1260. X                }
  1261. X            }
  1262. X    |    LABEL KOC_SET expr 
  1263. X            {
  1264. X                if($1 -> seg == SSG_UNDEF
  1265. X                   || $1 -> seg == SSG_SET)
  1266. X                {
  1267. X                    pevalexpr(0, $3);
  1268. X                    if(evalr[0].seg == SSG_ABS)
  1269. X                    {
  1270. X                        $1 -> seg = SSG_SET;
  1271. X                        $1 -> value = evalr[0].value;
  1272. X                        prtequvalue("C: 0x%lx\n",
  1273. X                            evalr[0].value);
  1274. X                    }
  1275. X                    else
  1276. X                    {
  1277. X                        fraerror(
  1278. X                    "noncomputable expression for SET");
  1279. X                    }
  1280. X                }
  1281. X                else
  1282. X                {
  1283. X                    fraerror(
  1284. X                "cannot change symbol value with SET");
  1285. X                }
  1286. X            }
  1287. X    |    KOC_IF expr 
  1288. X            {
  1289. X        if((++ifstkpt) < IFSTKDEPTH)
  1290. X        {
  1291. X            pevalexpr(0, $2);
  1292. X            if(evalr[0].seg == SSG_ABS)
  1293. X            {
  1294. X                if(evalr[0].value != 0)
  1295. X                {
  1296. X                    elseifstk[ifstkpt] = If_Skip;
  1297. X                    endifstk[ifstkpt] = If_Active;
  1298. X                }
  1299. X                else
  1300. X                {
  1301. X                    fraifskip = TRUE;
  1302. X                    elseifstk[ifstkpt] = If_Active;
  1303. X                    endifstk[ifstkpt] = If_Active;
  1304. X                }
  1305. X            }
  1306. X            else
  1307. X            {
  1308. X                fraifskip = TRUE;
  1309. X                elseifstk[ifstkpt] = If_Active;
  1310. X                endifstk[ifstkpt] = If_Active;
  1311. X            }
  1312. X        }
  1313. X        else
  1314. X        {
  1315. X            fraerror("IF stack overflow");
  1316. X        }
  1317. X            }
  1318. X                        
  1319. X    |    KOC_IF 
  1320. X            {
  1321. X        if(fraifskip) 
  1322. X        {
  1323. X            if((++ifstkpt) < IFSTKDEPTH)
  1324. X            {
  1325. X                    elseifstk[ifstkpt] = If_Skip;
  1326. X                    endifstk[ifstkpt] = If_Skip;
  1327. X            }
  1328. X            else
  1329. X            {
  1330. X                fraerror("IF stack overflow");
  1331. X            }
  1332. X        }
  1333. X        else
  1334. X        {
  1335. X            yyerror("syntax error");
  1336. X            YYERROR;
  1337. X        }
  1338. X                }
  1339. X                        
  1340. X    |    KOC_ELSE 
  1341. X            {
  1342. X                switch(elseifstk[ifstkpt])
  1343. X                {
  1344. X                case If_Active:
  1345. X                    fraifskip = FALSE;
  1346. X                    break;
  1347. X                
  1348. X                case If_Skip:
  1349. X                    fraifskip = TRUE;
  1350. X                    break;
  1351. X                
  1352. X                case If_Err:
  1353. X                    fraerror("ELSE with no matching if");
  1354. X                    break;
  1355. X                }
  1356. X            }
  1357. X
  1358. X    |    KOC_ENDI 
  1359. X            {
  1360. X                switch(endifstk[ifstkpt])
  1361. X                {
  1362. X                case If_Active:
  1363. X                    fraifskip = FALSE;
  1364. X                    ifstkpt--;
  1365. X                    break;
  1366. X                
  1367. X                case If_Skip:
  1368. X                    fraifskip = TRUE;
  1369. X                    ifstkpt--;
  1370. X                    break;
  1371. X                
  1372. X                case If_Err:
  1373. X                    fraerror("ENDI with no matching if");
  1374. X                    break;
  1375. X                }
  1376. X            }
  1377. X    |    LABEL KOC_ORG expr 
  1378. X            {
  1379. X                pevalexpr(0, $3);
  1380. X                if(evalr[0].seg == SSG_ABS)
  1381. X                {
  1382. X                    locctr = labelloc = evalr[0].value;
  1383. X                    if($1 -> seg == SSG_UNDEF)
  1384. X                    {
  1385. X                        $1 -> seg = SSG_ABS;
  1386. X                        $1 -> value = labelloc;
  1387. X                    }
  1388. X                    else
  1389. X                        fraerror(
  1390. X                        "multiple definition of label");
  1391. X                    prtequvalue("C: 0x%lx\n",
  1392. X                        evalr[0].value);
  1393. X                }
  1394. X                else
  1395. X                {
  1396. X                    fraerror(
  1397. X                     "noncomputable expression for ORG");
  1398. X                }
  1399. X            }
  1400. X    |          KOC_ORG expr 
  1401. X            {
  1402. X                pevalexpr(0, $2);
  1403. X                if(evalr[0].seg == SSG_ABS)
  1404. X                {
  1405. X                    locctr = labelloc = evalr[0].value;
  1406. X                    prtequvalue("C: 0x%lx\n",
  1407. X                        evalr[0].value);
  1408. X                }
  1409. X                else
  1410. X                {
  1411. X                    fraerror(
  1412. X                     "noncomputable expression for ORG");
  1413. X                }
  1414. X            }
  1415. X    |    LABEL KOC_CHSET
  1416. X            {
  1417. X                if($1 -> seg == SSG_UNDEF)
  1418. X                {
  1419. X                    $1 -> seg = SSG_EQU;
  1420. X                    if( ($1->value = chtcreate()) <= 0)
  1421. X                    {
  1422. X        fraerror( "cannot create character translation table");
  1423. X                    }
  1424. X                    prtequvalue("C: 0x%lx\n", $1 -> value);
  1425. X                }
  1426. X                else
  1427. X                {
  1428. X            fraerror( "multiple definition of label");
  1429. X                }
  1430. X            }
  1431. X    |        KOC_CHUSE
  1432. X            {
  1433. X                chtcpoint = (int *) NULL;
  1434. X                prtequvalue("C: 0x%lx\n", 0L);
  1435. X            }
  1436. X    |        KOC_CHUSE expr
  1437. X            {
  1438. X                pevalexpr(0, $2);
  1439. X                if( evalr[0].seg == SSG_ABS)
  1440. X                {
  1441. X                    if( evalr[0].value == 0)
  1442. X                    {
  1443. X                        chtcpoint = (int *)NULL;
  1444. X                        prtequvalue("C: 0x%lx\n", 0L);
  1445. X                    }
  1446. X                    else if(evalr[0].value < chtnxalph)
  1447. X                    {
  1448. X                chtcpoint = chtatab[evalr[0].value];
  1449. X                prtequvalue("C: 0x%lx\n", evalr[0].value);
  1450. X                    }
  1451. X                    else
  1452. X                    {
  1453. X            fraerror("nonexistent character translation table");
  1454. X                    }
  1455. X                }
  1456. X                else
  1457. X                {
  1458. X                    fraerror("noncomputable expression");
  1459. X                }
  1460. X            }
  1461. X    |        KOC_CHDEF STRING ',' exprlist
  1462. X            {
  1463. X        int findrv, numret, *charaddr;
  1464. X        char *sourcestr = $2, *before;
  1465. X
  1466. X        if(chtnpoint != (int *)NULL)
  1467. X        {
  1468. X            for(satsub = 0; satsub < $4; satsub++)
  1469. X            {
  1470. X                before = sourcestr;
  1471. X
  1472. X                pevalexpr(0, exprlist[satsub]);
  1473. X                findrv = chtcfind(chtnpoint, &sourcestr,
  1474. X                        &charaddr, &numret);
  1475. X                if(findrv == CF_END)
  1476. X                {
  1477. X            fraerror("more expressions than characters");
  1478. X                    break;
  1479. X                }
  1480. X
  1481. X                if(evalr[0].seg == SSG_ABS)
  1482. X                {
  1483. X                    switch(findrv)
  1484. X                    {
  1485. X                    case CF_UNDEF:
  1486. X                        {
  1487. X                if(evalr[0].value < 0 ||
  1488. X                    evalr[0].value > 255)
  1489. X                {
  1490. X            frawarn("character translation value truncated");
  1491. X                }
  1492. X                *charaddr = evalr[0].value & 0xff;
  1493. X                prtequvalue("C: 0x%lx\n", evalr[0].value);
  1494. X                        }
  1495. X                        break;
  1496. X
  1497. X                    case CF_INVALID:
  1498. X                    case CF_NUMBER:
  1499. X                fracherror("invalid character to define", 
  1500. X                    before, sourcestr);
  1501. X                        break;
  1502. X
  1503. X                    case CF_CHAR:
  1504. X                fracherror("character already defined", 
  1505. X                    before, sourcestr);
  1506. X                        break;
  1507. X                    }
  1508. X                }
  1509. X                else
  1510. X                {
  1511. X                    fraerror("noncomputable expression");
  1512. X                }
  1513. X            }
  1514. X
  1515. X            if( *sourcestr != '\0')
  1516. X            {
  1517. X                fraerror("more characters than expressions");
  1518. X            }
  1519. X        }
  1520. X        else
  1521. X        {
  1522. X            fraerror("no CHARSET statement active");
  1523. X        }
  1524. X            
  1525. X            }
  1526. X    |    LABEL 
  1527. X            {
  1528. X            if($1 -> seg == SSG_UNDEF)
  1529. X            {
  1530. X                $1 -> seg = SSG_ABS;
  1531. X                $1 -> value = labelloc;
  1532. X                prtequvalue("C: 0x%lx\n", labelloc);
  1533. X
  1534. X            }
  1535. X            else
  1536. X                fraerror(
  1537. X                "multiple definition of label");
  1538. X            }
  1539. X    |    labeledline
  1540. X    ;
  1541. X
  1542. Xlabeledline :    LABEL genline
  1543. X            {
  1544. X            if($1 -> seg == SSG_UNDEF)
  1545. X            {
  1546. X                $1 -> seg = SSG_ABS;
  1547. X                $1 -> value = labelloc;
  1548. X            }
  1549. X            else
  1550. X                fraerror(
  1551. X                "multiple definition of label");
  1552. X            labelloc = locctr;
  1553. X            }
  1554. X                
  1555. X    |    genline
  1556. X            {
  1557. X                labelloc = locctr;
  1558. X            }
  1559. X    ;
  1560. X
  1561. Xgenline    :    KOC_BDEF    exprlist 
  1562. X            {
  1563. X                genlocrec(currseg, labelloc);
  1564. X                for( satsub = 0; satsub < $2; satsub++)
  1565. X                {
  1566. X                    pevalexpr(1, exprlist[satsub]);
  1567. X                    locctr += geninstr(genbdef);
  1568. X                }
  1569. X            }
  1570. X    |    KOC_SDEF stringlist 
  1571. X            {
  1572. X                genlocrec(currseg, labelloc);
  1573. X                for(satsub = 0; satsub < $2; satsub++)
  1574. X                {
  1575. X                    locctr += genstring(stringlist[satsub]);
  1576. X                }
  1577. X            }
  1578. X    |    KOC_WDEF exprlist 
  1579. X            {
  1580. X                genlocrec(currseg, labelloc);
  1581. X                for( satsub = 0; satsub < $2; satsub++)
  1582. X                {
  1583. X                    pevalexpr(1, exprlist[satsub]);
  1584. X                    locctr += geninstr(genwdef);
  1585. X                }
  1586. X            }    
  1587. X    |    KOC_RESM expr 
  1588. X            {
  1589. X                pevalexpr(0, $2);
  1590. X                if(evalr[0].seg == SSG_ABS)
  1591. X                {
  1592. X                    locctr = labelloc + evalr[0].value;
  1593. X                    prtequvalue("C: 0x%lx\n", labelloc);
  1594. X                }
  1595. X                else
  1596. X                {
  1597. X                    fraerror(
  1598. X                 "noncomputable result for RMB expression");
  1599. X                }
  1600. X            }
  1601. X    ;
  1602. X
  1603. Xexprlist :    exprlist ',' expr
  1604. X            {
  1605. X                exprlist[nextexprs ++ ] = $3;
  1606. X                $$ = nextexprs;
  1607. X            }
  1608. X    |    expr
  1609. X            {
  1610. X                nextexprs = 0;
  1611. X                exprlist[nextexprs ++ ] = $1;
  1612. X                $$ = nextexprs;
  1613. X            }
  1614. X    ;
  1615. X
  1616. Xstringlist :    stringlist ',' STRING
  1617. X            {
  1618. X                stringlist[nextstrs ++ ] = $3;
  1619. X                $$ = nextstrs;
  1620. X            }
  1621. X    |    STRING
  1622. X            {
  1623. X                nextstrs = 0;
  1624. X                stringlist[nextstrs ++ ] = $1;
  1625. X                $$ = nextstrs;
  1626. X            }
  1627. X    ;
  1628. X
  1629. X
  1630. X
  1631. Xline     :    LABEL regdefop regoperand
  1632. X            {
  1633. X        if($1 -> seg == SSG_UNDEF)
  1634. X        {
  1635. X            $1 -> value = ( $3 & REGBITS )
  1636. X                    | ( $3 & REGDEFWRK )
  1637. X                    | ($2 == 2 ? REGDEFDBL : 0);
  1638. X            $1 -> seg = SSG_RESV;
  1639. X            $1 -> tok = REGISTER;
  1640. X
  1641. X            if($3 & REGDEFWRK) 
  1642. X            {
  1643. X                if(($3 & 0xf0) != 0xe0)
  1644. X                    fraerror(
  1645. X                "invalid working register address");
  1646. X            }
  1647. X            else
  1648. X            {
  1649. X                switch(cpuselect)
  1650. X                {
  1651. X                case CPU8600:
  1652. X                    if( ($3 & REGBITS) > 0x7f &&
  1653. X                        ($3 & REGBITS) < 0xf0)
  1654. X                    {
  1655. X                        fraerror(
  1656. X                    "unimplemented register address");
  1657. X                    }
  1658. X                    break;
  1659. X
  1660. X                case CPU8090:
  1661. X                    if( ($3 & REGBITS) > 0xdf &&
  1662. X                        ($3 & REGBITS) < 0xf0)
  1663. X                    {
  1664. X                        fraerror(
  1665. X                    "unimplemented register address");
  1666. X                    }
  1667. X                    break;
  1668. X
  1669. X                }
  1670. X            }
  1671. X
  1672. X            if( ( $1 -> value & REGDEFDBL) && ( $1 -> value & 1) )
  1673. X                fraerror("double register not on even boundry");
  1674. X
  1675. X            prtequvalue("C: 0x%x\n",REGBITS & ((int) $1->value));
  1676. X        }
  1677. X        else
  1678. X        {
  1679. X            fraerror("multiple definition of label");
  1680. X        }
  1681. X        prevregwork = $3 & REGDEFWRK;
  1682. X        regloccnt = ($3 & REGBITS) + $2;
  1683. X            }
  1684. X    ;
  1685. X
  1686. Xregdefop :    KOC_REG
  1687. X            {
  1688. X        $$ = 1;
  1689. X            }
  1690. X    |    KOC_RREG
  1691. X            {
  1692. X        $$ = 2;
  1693. X            }
  1694. X    ;
  1695. X
  1696. Xregoperand :    REGISTER
  1697. X            {
  1698. X        $$ = $1;
  1699. X            }
  1700. X    |    expr
  1701. X            {
  1702. X        $$ = 0;
  1703. X        pevalexpr(0, $1);
  1704. X        if(evalr[0].seg != SSG_ABS)
  1705. X        {
  1706. X            fraerror("noncomputable value for REG");
  1707. X        }
  1708. X        else
  1709. X        {
  1710. X            if(evalr[0].value >= 0 && evalr[0].value <= 255)
  1711. X                $$ = evalr[0].value;
  1712. X            else
  1713. X                fraerror("value out of range");
  1714. X        }
  1715. X            }
  1716. X    |
  1717. X            {
  1718. X        if(regloccnt <= 255)
  1719. X            $$ = regloccnt | prevregwork ;
  1720. X        else
  1721. X        {
  1722. X            $$ = 0;
  1723. X            fraerror("register location counter out of range");
  1724. X        }
  1725. X            }
  1726. X    ;
  1727. X
  1728. Xline    :    KOC_CPU STRING
  1729. X            {
  1730. X        if( ! cpumatch($2))
  1731. X        {
  1732. X            fraerror("unknown cpu type, z8 assumed");
  1733. X            cpuselect = CPU8600;
  1734. X        }
  1735. X            }
  1736. X    ;
  1737. Xgenline : KOC_opcode  CONDITION ',' expr
  1738. X            {
  1739. X        genlocrec(currseg, labelloc);
  1740. X        evalr[1].value = $2;
  1741. X        pevalexpr(2, $4);
  1742. X        locctr += geninstr(findgen($1, ST_CEXP, 0));
  1743. X            }
  1744. X    ;
  1745. Xgenline : KOC_opcode  expr
  1746. X            {
  1747. X        genlocrec(currseg, labelloc);
  1748. X        pevalexpr(1, $2);
  1749. X        locctr += geninstr(findgen($1, ST_EXP, 0));
  1750. X            }
  1751. X    ;
  1752. Xgenline : KOC_opcode 
  1753. X            {
  1754. X        genlocrec(currseg, labelloc);
  1755. X        locctr += geninstr(findgen($1, ST_INH, 0));
  1756. X            }
  1757. X    ;
  1758. Xgenline : KOC_opcode  '@' REGISTER
  1759. X            {
  1760. X        genlocrec(currseg, labelloc);
  1761. X        evalr[1].value = $3 & REGBITS;
  1762. X        evalr[2].value = $3 & REGWORKBITS;
  1763. X        locctr += geninstr(findgen($1, ST_IR1, 
  1764. X            ($3 & REGFLGS) >> REGDFLGSH ));
  1765. X            }
  1766. X    ;
  1767. Xgenline : KOC_opcode  '@' REGISTER ',' '#' expr
  1768. X            {
  1769. X        genlocrec(currseg, labelloc);
  1770. X        evalr[1].value = $3 & REGBITS;
  1771. X        evalr[3].value = $3 & REGWORKBITS;
  1772. X        pevalexpr(2, $6);
  1773. X        locctr += geninstr(findgen($1, ST_IRIM, 
  1774. X            ($3 & REGFLGS) >> REGDFLGSH ));
  1775. X            }
  1776. X    ;
  1777. Xgenline : KOC_opcode  '@' REGISTER ',' '@' REGISTER
  1778. X            {
  1779. X        genlocrec(currseg, labelloc);
  1780. X        evalr[1].value = $3 & REGBITS;
  1781. X        evalr[2].value = $3 & REGWORKBITS;
  1782. X        evalr[3].value = $6 & REGBITS;
  1783. X        evalr[4].value = $6 & REGWORKBITS;
  1784. X        locctr += geninstr(findgen($1, ST_IRIR, 
  1785. X            ( ($3 & REGFLGS) >> REGDFLGSH ) |
  1786. X            ( ($6 & REGFLGS) >> REGSFLGSH ) ));
  1787. X            }
  1788. X    ;
  1789. Xgenline : KOC_opcode  '@' REGISTER ',' REGISTER
  1790. X            {
  1791. X        genlocrec(currseg, labelloc);
  1792. X        evalr[1].value = $3 & REGBITS;
  1793. X        evalr[2].value = $3 & REGWORKBITS;
  1794. X        evalr[3].value = $5 & REGBITS;
  1795. X        evalr[4].value = $5 & REGWORKBITS;
  1796. X        locctr += geninstr(findgen($1, ST_IRR, 
  1797. X            ( ($3 & REGFLGS) >> REGDFLGSH ) |
  1798. X            ( ($5 & REGFLGS) >> REGSFLGSH ) ));
  1799. X            }
  1800. X    ;
  1801. Xgenline : KOC_opcode  REGISTER
  1802. X            {
  1803. X        genlocrec(currseg, labelloc);
  1804. X        evalr[1].value = $2 & REGBITS;
  1805. X        evalr[2].value = $2 & REGWORKBITS;
  1806. X        locctr += geninstr(findgen($1, ST_R1, 
  1807. X            ($2 & REGFLGS) >> REGDFLGSH ));
  1808. X            }
  1809. X    ;
  1810. Xgenline : KOC_opcode  REGISTER ',' REGISTER
  1811. X            {
  1812. X        genlocrec(currseg, labelloc);
  1813. X        evalr[1].value = $2 & REGBITS;
  1814. X        evalr[2].value = $2 & REGWORKBITS;
  1815. X        evalr[3].value = $4 & REGBITS;
  1816. X        evalr[4].value = $4 & REGWORKBITS;
  1817. X        locctr += geninstr(findgen($1, ST_R2, 
  1818. X            ( ($2 & REGFLGS) >> REGDFLGSH ) |
  1819. X            ( ($4 & REGFLGS) >> REGSFLGSH ) ));
  1820. X            }
  1821. X    ;
  1822. Xgenline : KOC_opcode  REGISTER ',' expr
  1823. X            {
  1824. X        genlocrec(currseg, labelloc);
  1825. X        evalr[1].value = $2 & REGBITS;
  1826. X        pevalexpr(2, $4);
  1827. X        evalr[3].value = $2 & REGWORKBITS;
  1828. X        locctr += geninstr(findgen($1, ST_REXP,
  1829. X            ($2 & REGFLGS) >> REGDFLGSH ));
  1830. X            }
  1831. X    ;
  1832. Xgenline : KOC_opcode  REGISTER ',' '#' expr
  1833. X            {
  1834. X        genlocrec(currseg, labelloc);
  1835. X        evalr[1].value = $2 & REGBITS;
  1836. X        evalr[3].value = $2 & REGWORKBITS;
  1837. X        pevalexpr(2, $5);
  1838. X        locctr += geninstr(findgen($1, ST_RIMM, 
  1839. X            ($2 & REGFLGS) >> REGDFLGSH ));
  1840. X            }
  1841. X    ;
  1842. Xgenline : KOC_opcode  REGISTER ',' '@' REGISTER
  1843. X            {
  1844. X        genlocrec(currseg, labelloc);
  1845. X        evalr[1].value = $2 & REGBITS;
  1846. X        evalr[2].value = $2 & REGWORKBITS;
  1847. X        evalr[3].value = $5 & REGBITS;
  1848. X        evalr[4].value = $5 & REGWORKBITS;
  1849. X        locctr += geninstr(findgen($1, ST_RIR, 
  1850. X            ( ($2 & REGFLGS) >> REGDFLGSH ) |
  1851. X            ( ($5 & REGFLGS) >> REGSFLGSH ) ));
  1852. X            }
  1853. X    ;
  1854. Xgenline : KOC_opcode  REGISTER ',' expr '(' REGISTER ')'
  1855. X            {
  1856. X        genlocrec(currseg, labelloc);
  1857. X        evalr[1].value = $2 & REGWORKBITS;
  1858. X        pevalexpr(2, $4);
  1859. X        evalr[3].value = $6 & REGWORKBITS;
  1860. X        locctr += geninstr(findgen($1, ST_RX, 
  1861. X            ( ($2 & REGFLGS) >> REGDFLGSH ) |
  1862. X            ( ($6 & REGFLGS) >> REGSFLGSH ) ));
  1863. X            }
  1864. X    ;
  1865. Xgenline : KOC_opcode  expr '(' REGISTER ')' ',' REGISTER 
  1866. X            {
  1867. X        genlocrec(currseg, labelloc);
  1868. X        pevalexpr(1, $2);
  1869. X        evalr[2].value = $4 & REGWORKBITS;
  1870. X        evalr[3].value = $7 & REGWORKBITS;
  1871. X        locctr += geninstr(findgen($1, ST_XR, 
  1872. X            ( ($4 & REGFLGS) >> REGDFLGSH ) |
  1873. X            ( ($7 & REGFLGS) >> REGSFLGSH ) ));
  1874. X            }
  1875. X    ;
  1876. Xgenline : KOC_srp  '#' expr
  1877. X            {
  1878. X        pevalexpr(1, $3);
  1879. X        if(evalr[1].seg != SSG_ABS)
  1880. X        {
  1881. X            fraerror("noncomputable value for SRP");
  1882. X        }
  1883. X        else
  1884. X        {
  1885. X            switch(( (int) evalr[1].value ) & REGBITS)
  1886. X            {
  1887. X            case 0x80:
  1888. X            case 0x90:
  1889. X            case 0xa0:
  1890. X            case 0xb0:
  1891. X            case 0xc0:
  1892. X            case 0xd0:
  1893. X                if(cpuselect == CPU8600)
  1894. X                {
  1895. X                    fraerror("invalid value for SRP");
  1896. X                    break;
  1897. X                }
  1898. X                /* fall thru */
  1899. X            case 0x00:
  1900. X            case 0x10:
  1901. X            case 0x20:
  1902. X            case 0x30:
  1903. X            case 0x40:
  1904. X            case 0x50:
  1905. X            case 0x60:
  1906. X            case 0x70:
  1907. X            case 0xf0:
  1908. X                genlocrec(currseg, labelloc);
  1909. X                locctr += geninstr(findgen($1, ST_IMM, 0));
  1910. X                break;
  1911. X            default:
  1912. X                fraerror("invalid value for SRP");
  1913. X                break;
  1914. X            }
  1915. X        }
  1916. X            }
  1917. X    ;
  1918. Xexpr    :    '+' expr %prec KEOP_MUN
  1919. X            {
  1920. X                $$ = $2;
  1921. X            }
  1922. X    |    '-' expr %prec KEOP_MUN
  1923. X            {
  1924. X                $$ = exprnode(PCCASE_UN,$2,IFC_NEG,0,0L,
  1925. X                    SYMNULL);
  1926. X            }
  1927. X    |    KEOP_NOT expr
  1928. X            {
  1929. X                $$ = exprnode(PCCASE_UN,$2,IFC_NOT,0,0L,
  1930. X                    SYMNULL);
  1931. X            }
  1932. X    |    KEOP_HIGH expr
  1933. X            {
  1934. X                $$ = exprnode(PCCASE_UN,$2,IFC_HIGH,0,0L,
  1935. X                    SYMNULL);
  1936. X            }
  1937. X    |    KEOP_LOW expr
  1938. X            {
  1939. X                $$ = exprnode(PCCASE_UN,$2,IFC_LOW,0,0L,
  1940. X                    SYMNULL);
  1941. X            }
  1942. X    |    expr '*' expr
  1943. X            {
  1944. X                $$ = exprnode(PCCASE_BIN,$1,IFC_MUL,$3,0L,
  1945. X                    SYMNULL);
  1946. X            }
  1947. X    |    expr '/' expr
  1948. X            {
  1949. X                $$ = exprnode(PCCASE_BIN,$1,IFC_DIV,$3,0L,
  1950. X                    SYMNULL);
  1951. X            }
  1952. X    |    expr '+' expr
  1953. X            {
  1954. X                $$ = exprnode(PCCASE_BIN,$1,IFC_ADD,$3,0L,
  1955. X                    SYMNULL);
  1956. X            }
  1957. X    |    expr '-' expr
  1958. X            {
  1959. X                $$ = exprnode(PCCASE_BIN,$1,IFC_SUB,$3,0L,
  1960. X                    SYMNULL);
  1961. X            }
  1962. X    |    expr KEOP_MOD expr
  1963. X            {
  1964. X                $$ = exprnode(PCCASE_BIN,$1,IFC_MOD,$3,0L,
  1965. X                    SYMNULL);
  1966. X            }
  1967. X    |    expr KEOP_SHL expr
  1968. X            {
  1969. X                $$ = exprnode(PCCASE_BIN,$1,IFC_SHL,$3,0L,
  1970. X                    SYMNULL);
  1971. X            }
  1972. X    |    expr KEOP_SHR expr
  1973. X            {
  1974. X                $$ = exprnode(PCCASE_BIN,$1,IFC_SHR,$3,0L,
  1975. X                    SYMNULL);
  1976. X            }
  1977. X    |    expr KEOP_GT expr
  1978. X            {
  1979. X                $$ = exprnode(PCCASE_BIN,$1,IFC_GT,$3,0L,
  1980. X                    SYMNULL);
  1981. X            }
  1982. X    |    expr KEOP_GE expr
  1983. X            {
  1984. X                $$ = exprnode(PCCASE_BIN,$1,IFC_GE,$3,0L,
  1985. X                    SYMNULL);
  1986. X            }
  1987. X    |    expr KEOP_LT expr
  1988. X            {
  1989. X                $$ = exprnode(PCCASE_BIN,$1,IFC_LT,$3,0L,
  1990. X                    SYMNULL);
  1991. X            }
  1992. X    |    expr KEOP_LE expr
  1993. X            {
  1994. X                $$ = exprnode(PCCASE_BIN,$1,IFC_LE,$3,0L,
  1995. X                    SYMNULL);
  1996. X            }
  1997. X    |    expr KEOP_NE expr
  1998. X            {
  1999. X                $$ = exprnode(PCCASE_BIN,$1,IFC_NE,$3,0L,
  2000. X                    SYMNULL);
  2001. X            }
  2002. X    |    expr KEOP_EQ expr
  2003. X            {
  2004. X                $$ = exprnode(PCCASE_BIN,$1,IFC_EQ,$3,0L,
  2005. X                    SYMNULL);
  2006. X            }
  2007. X    |    expr KEOP_AND expr
  2008. X            {
  2009. X                $$ = exprnode(PCCASE_BIN,$1,IFC_AND,$3,0L,
  2010. X                    SYMNULL);
  2011. X            }
  2012. X    |    expr KEOP_OR expr
  2013. X            {
  2014. X                $$ = exprnode(PCCASE_BIN,$1,IFC_OR,$3,0L,
  2015. X                    SYMNULL);
  2016. X            }
  2017. X    |    expr KEOP_XOR expr
  2018. X            {
  2019. X                $$ = exprnode(PCCASE_BIN,$1,IFC_XOR,$3,0L,
  2020. X                    SYMNULL);
  2021. X            }
  2022. X    |    KEOP_DEFINED SYMBOL
  2023. X            {
  2024. X                $$ = exprnode(PCCASE_DEF,0,IGP_DEFINED,0,0L,$2);
  2025. X            }
  2026. X    |    SYMBOL
  2027. X            {
  2028. X                $$ = exprnode(PCCASE_SYMB,0,IFC_SYMB,0,0L,$1);
  2029. X            }
  2030. X    |    '*'
  2031. X            {
  2032. X                $$ = exprnode(PCCASE_PROGC,0,IFC_PROGCTR,0,
  2033. X                    labelloc, SYMNULL);
  2034. X            }
  2035. X    |    CONSTANT
  2036. X            {
  2037. X                $$ = exprnode(PCCASE_CONS,0,IGP_CONSTANT,0,$1,
  2038. X                    SYMNULL);
  2039. X            }
  2040. X    |    STRING
  2041. X            {
  2042. X                char *sourcestr = $1;
  2043. X                long accval = 0;
  2044. X
  2045. X                if(strlen($1) > 0)
  2046. X                {
  2047. X                    accval = chtran(&sourcestr);
  2048. X                    if(*sourcestr != '\0')
  2049. X                    {
  2050. X                        accval = (accval << 8) +
  2051. X                            chtran(&sourcestr);
  2052. X                    }
  2053. X
  2054. X                    if( *sourcestr != '\0')
  2055. X                    {
  2056. X    frawarn("string constant in expression more than 2 characters long");
  2057. X                    }
  2058. X                }
  2059. X                $$ = exprnode(PCCASE_CONS, 0, IGP_CONSTANT, 0,
  2060. X                    accval, SYMNULL);
  2061. X            }
  2062. X    |    '(' expr ')'
  2063. X            {
  2064. X                $$ = $2;
  2065. X            }
  2066. X    ;
  2067. X
  2068. Xexpr    :    '(' REGISTER ')'
  2069. X        {
  2070. X    $$ = exprnode(PCCASE_CONS,0,IGP_CONSTANT,0,
  2071. X        (long) (REGBITS & $2),
  2072. X        SYMNULL);
  2073. X        }
  2074. X    ;
  2075. X
  2076. X%%
  2077. X
  2078. Xlexintercept()
  2079. X/*
  2080. X    description    intercept the call to yylex (the lexical analyzer)
  2081. X            and filter out all unnecessary tokens when skipping
  2082. X            the input between a failed IF and its matching ENDI or
  2083. X            ELSE
  2084. X    globals     fraifskip    the enable flag
  2085. X*/
  2086. X{
  2087. X#undef yylex
  2088. X
  2089. X    int rv;
  2090. X
  2091. X    if(fraifskip)
  2092. X    {
  2093. X        for(;;)
  2094. X        {
  2095. X
  2096. X            switch(rv = yylex())
  2097. X
  2098. X            {
  2099. X            case 0:
  2100. X            case KOC_END:
  2101. X            case KOC_IF:
  2102. X            case KOC_ELSE:
  2103. X            case KOC_ENDI:
  2104. X            case EOL:
  2105. X                return rv;
  2106. X            default:
  2107. X                break;
  2108. X            }
  2109. X        }
  2110. X    }
  2111. X    else
  2112. X        return yylex();
  2113. X#define yylex lexintercept
  2114. X}
  2115. X
  2116. X
  2117. X
  2118. Xsetreserved()
  2119. X{
  2120. X
  2121. X    reservedsym("and", KEOP_AND, 0);
  2122. X    reservedsym("defined", KEOP_DEFINED,0);
  2123. X    reservedsym("high", KEOP_HIGH, 0);
  2124. X    reservedsym("low", KEOP_LOW, 0);
  2125. X    reservedsym("mod", KEOP_MOD, 0);
  2126. X    reservedsym("not", KEOP_NOT, 0);
  2127. X    reservedsym("or", KEOP_OR, 0);
  2128. X    reservedsym("shl", KEOP_SHL, 0);
  2129. X    reservedsym("shr", KEOP_SHR, 0);
  2130. X    reservedsym("xor", KEOP_XOR, 0);
  2131. X    reservedsym("AND", KEOP_AND, 0);
  2132. X    reservedsym("DEFINED", KEOP_DEFINED,0);
  2133. X    reservedsym("HIGH", KEOP_HIGH, 0);
  2134. X    reservedsym("LOW", KEOP_LOW, 0);
  2135. X    reservedsym("MOD", KEOP_MOD, 0);
  2136. X    reservedsym("NOT", KEOP_NOT, 0);
  2137. X    reservedsym("OR", KEOP_OR, 0);
  2138. X    reservedsym("SHL", KEOP_SHL, 0);
  2139. X    reservedsym("SHR", KEOP_SHR, 0);
  2140. X    reservedsym("XOR", KEOP_XOR, 0);
  2141. X    reservedsym("F", CONDITION, 0);
  2142. X    reservedsym("C", CONDITION, 0x7);
  2143. X    reservedsym("NC", CONDITION, 0xf);
  2144. X    reservedsym("Z", CONDITION, 0x6);
  2145. X    reservedsym("NZ", CONDITION, 0xe);
  2146. X    reservedsym("PL", CONDITION, 0xd);
  2147. X    reservedsym("MI", CONDITION, 0x5);
  2148. X    reservedsym("OV", CONDITION, 0x4);
  2149. X    reservedsym("NOV", CONDITION, 0xc);
  2150. X    reservedsym("EQ", CONDITION, 0x6);
  2151. X    reservedsym("NE", CONDITION, 0xe);
  2152. X    reservedsym("GE", CONDITION, 0x9);
  2153. X    reservedsym("LT", CONDITION, 0x1);
  2154. X    reservedsym("GT", CONDITION, 0xa);
  2155. X    reservedsym("LE", CONDITION, 0x2);
  2156. X    reservedsym("UGE", CONDITION, 0xf);
  2157. X    reservedsym("ULT", CONDITION, 0x7);
  2158. X    reservedsym("UGT", CONDITION, 0xb);
  2159. X    reservedsym("ULE", CONDITION, 0x3);
  2160. X    reservedsym("R0", REGISTER, REGDEFWRK + 0xe0);
  2161. X    reservedsym("R1", REGISTER, REGDEFWRK + 0xe1);
  2162. X    reservedsym("R2", REGISTER, REGDEFWRK + 0xe2);
  2163. X    reservedsym("R3", REGISTER, REGDEFWRK + 0xe3);
  2164. X    reservedsym("R4", REGISTER, REGDEFWRK + 0xe4);
  2165. X    reservedsym("R5", REGISTER, REGDEFWRK + 0xe5);
  2166. X    reservedsym("R6", REGISTER, REGDEFWRK + 0xe6);
  2167. X    reservedsym("R7", REGISTER, REGDEFWRK + 0xe7);
  2168. X    reservedsym("R8", REGISTER, REGDEFWRK + 0xe8);
  2169. X    reservedsym("R9", REGISTER, REGDEFWRK + 0xe9);
  2170. X    reservedsym("R10", REGISTER, REGDEFWRK + 0xea);
  2171. X    reservedsym("R11", REGISTER, REGDEFWRK + 0xeb);
  2172. X    reservedsym("R12", REGISTER, REGDEFWRK + 0xec);
  2173. X    reservedsym("R13", REGISTER, REGDEFWRK + 0xed);
  2174. X    reservedsym("R14", REGISTER, REGDEFWRK + 0xee);
  2175. X    reservedsym("R15", REGISTER, REGDEFWRK + 0xef);
  2176. X    reservedsym("RR0", REGISTER, REGDEFWRK + REGDEFDBL + 0xe0);
  2177. X    reservedsym("RR2", REGISTER, REGDEFWRK + REGDEFDBL + 0xe2);
  2178. X    reservedsym("RR4", REGISTER, REGDEFWRK + REGDEFDBL + 0xe4);
  2179. X    reservedsym("RR6", REGISTER, REGDEFWRK + REGDEFDBL + 0xe6);
  2180. X    reservedsym("RR8", REGISTER, REGDEFWRK + REGDEFDBL + 0xe8);
  2181. X    reservedsym("RR10", REGISTER, REGDEFWRK + REGDEFDBL + 0xea);
  2182. X    reservedsym("RR12", REGISTER, REGDEFWRK + REGDEFDBL + 0xec);
  2183. X    reservedsym("RR14", REGISTER, REGDEFWRK + REGDEFDBL + 0xee);
  2184. X}
  2185. X
  2186. X
  2187. Xcpumatch(str)
  2188. X    char * str;
  2189. X{
  2190. X    int msub;
  2191. X
  2192. X    static struct
  2193. X    {
  2194. X        char * mtch;
  2195. X        int   cpuv;
  2196. X    } matchtab[] =
  2197. X    {
  2198. X        {"86", CPU8600 },
  2199. X        {"z8", CPU8600 },
  2200. X        {"Z8", CPU8600 },
  2201. X        {"upc", CPU8090 },
  2202. X        {"UPC", CPU8090 },
  2203. X        {"9", CPU8090 },
  2204. X        {"", 0} 
  2205. X    };
  2206. X
  2207. X    for(msub = 0; matchtab[msub].cpuv != 0; msub++)
  2208. X    {
  2209. X        if(strcontains(str, matchtab[msub].mtch))
  2210. X        {
  2211. X            cpuselect = matchtab[msub].cpuv;
  2212. X            return TRUE;
  2213. X        }
  2214. X    }
  2215. X
  2216. X    return FALSE;
  2217. X}
  2218. X
  2219. X
  2220. Xstrcontains(s1, sm)
  2221. X    char * s1, *sm;
  2222. X{
  2223. X    int l1 = strlen(s1), lm = strlen(sm);
  2224. X
  2225. X    for(; l1 >= lm; l1--, s1++)
  2226. X    {
  2227. X        if(strncmp(s1, sm, lm) == 0)
  2228. X        {
  2229. X            return TRUE;
  2230. X        }
  2231. X    }
  2232. X    return FALSE;
  2233. X}
  2234. X
  2235. X/*
  2236. X    description    Opcode and Instruction generation tables
  2237. X    usage        Unix, framework crossassembler
  2238. X    history        September 25, 1987
  2239. X*/
  2240. X
  2241. X#define NUMOPCODE 70
  2242. X#define NUMSYNBLK 102
  2243. X#define NUMDIFFOP 130
  2244. X
  2245. Xint gnumopcode = NUMOPCODE;
  2246. X
  2247. Xint ophashlnk[NUMOPCODE];
  2248. X
  2249. Xstruct opsym optab[NUMOPCODE+1]
  2250. X    = {
  2251. X    {"invalid", KOC_opcode, 2, 0 },
  2252. X    {"ADC", KOC_opcode, 4, 2 },
  2253. X    {"ADD", KOC_opcode, 4, 6 },
  2254. X    {"AND", KOC_opcode, 4, 10 },
  2255. X    {"BYTE", KOC_BDEF, 0, 0 },
  2256. X    {"CALL", KOC_opcode, 2, 14 },
  2257. X    {"CCF", KOC_opcode, 1, 16 },
  2258. X    {"CHARDEF", KOC_CHDEF, 0, 0 },
  2259. X    {"CHARSET", KOC_CHSET, 0, 0 },
  2260. X    {"CHARUSE", KOC_CHUSE, 0, 0 },
  2261. X    {"CHD", KOC_CHDEF, 0, 0 },
  2262. X    {"CLR", KOC_opcode, 2, 17 },
  2263. X    {"COM", KOC_opcode, 2, 19 },
  2264. X    {"CP", KOC_opcode, 4, 21 },
  2265. X    {"CPU", KOC_CPU, 0, 0 },
  2266. X    {"DA", KOC_opcode, 2, 25 },
  2267. X    {"DB", KOC_BDEF, 0, 0 },
  2268. X    {"DEC", KOC_opcode, 2, 27 },
  2269. X    {"DECW", KOC_opcode, 2, 29 },
  2270. X    {"DI", KOC_opcode, 1, 31 },
  2271. X    {"DJNZ", KOC_opcode, 1, 32 },
  2272. X    {"DW", KOC_WDEF, 0, 0 },
  2273. X    {"EI", KOC_opcode, 1, 33 },
  2274. X    {"ELSE", KOC_ELSE, 0, 0 },
  2275. X    {"END", KOC_END, 0, 0 },
  2276. X    {"ENDI", KOC_ENDI, 0, 0 },
  2277. X    {"EQU", KOC_EQU, 0, 0 },
  2278. X    {"FCB", KOC_BDEF, 0, 0 },
  2279. X    {"FCC", KOC_SDEF, 0, 0 },
  2280. X    {"FDB", KOC_WDEF, 0, 0 },
  2281. X    {"IF", KOC_IF, 0, 0 },
  2282. X    {"INC", KOC_opcode, 2, 34 },
  2283. X    {"INCL", KOC_INCLUDE, 0, 0 },
  2284. X    {"INCLUDE", KOC_INCLUDE, 0, 0 },
  2285. X    {"INCW", KOC_opcode, 2, 36 },
  2286. X    {"IRET", KOC_opcode, 1, 38 },
  2287. X    {"JP", KOC_opcode, 3, 39 },
  2288. X    {"JR", KOC_opcode, 2, 42 },
  2289. X    {"LD", KOC_opcode, 7, 44 },
  2290. X    {"LDC", KOC_opcode, 2, 51 },
  2291. X    {"LDCI", KOC_opcode, 1, 53 },
  2292. X    {"LDE", KOC_opcode, 2, 54 },
  2293. X    {"LDEI", KOC_opcode, 1, 56 },
  2294. X    {"NOP", KOC_opcode, 1, 57 },
  2295. X    {"OR", KOC_opcode, 4, 58 },
  2296. X    {"ORG", KOC_ORG, 0, 0 },
  2297. X    {"POP", KOC_opcode, 2, 62 },
  2298. X    {"PUSH", KOC_opcode, 2, 64 },
  2299. X    {"RCF", KOC_opcode, 1, 66 },
  2300. X    {"REG", KOC_REG, 0, 0 },
  2301. X    {"RESERVE", KOC_RESM, 0, 0 },
  2302. X    {"RET", KOC_opcode, 1, 67 },
  2303. X    {"RL", KOC_opcode, 2, 68 },
  2304. X    {"RLC", KOC_opcode, 2, 70 },
  2305. X    {"RMB", KOC_RESM, 0, 0 },
  2306. X    {"RR", KOC_opcode, 2, 72 },
  2307. X    {"RRC", KOC_opcode, 2, 74 },
  2308. X    {"RREG", KOC_RREG, 0, 0 },
  2309. X    {"SBC", KOC_opcode, 4, 76 },
  2310. X    {"SCF", KOC_opcode, 1, 80 },
  2311. X    {"SET", KOC_SET, 0, 0 },
  2312. X    {"SRA", KOC_opcode, 2, 81 },
  2313. X    {"SRP", KOC_srp, 1, 83 },
  2314. X    {"STRING", KOC_SDEF, 0, 0 },
  2315. X    {"SUB", KOC_opcode, 4, 84 },
  2316. X    {"SWAP", KOC_opcode, 2, 88 },
  2317. X    {"TCM", KOC_opcode, 4, 90 },
  2318. X    {"TM", KOC_opcode, 4, 94 },
  2319. X    {"WORD", KOC_WDEF, 0, 0 },
  2320. X    {"XOR", KOC_opcode, 4, 98 },
  2321. X    { "", 0, 0, 0 }};
  2322. X
  2323. Xstruct opsynt ostab[NUMSYNBLK+1]
  2324. X    = {
  2325. X/* invalid 0 */ { 0, 1, 0 },
  2326. X/* invalid 1 */ { 0xffff, 1, 1 },
  2327. X/* ADC 2 */ { ST_IRIM, 1, 2 },
  2328. X/* ADC 3 */ { ST_R2, 2, 3 },
  2329. X/* ADC 4 */ { ST_RIMM, 1, 5 },
  2330. X/* ADC 5 */ { ST_RIR, 2, 6 },
  2331. X/* ADD 6 */ { ST_IRIM, 1, 8 },
  2332. X/* ADD 7 */ { ST_R2, 2, 9 },
  2333. X/* ADD 8 */ { ST_RIMM, 1, 11 },
  2334. X/* ADD 9 */ { ST_RIR, 2, 12 },
  2335. X/* AND 10 */ { ST_IRIM, 1, 14 },
  2336. X/* AND 11 */ { ST_R2, 2, 15 },
  2337. X/* AND 12 */ { ST_RIMM, 1, 17 },
  2338. X/* AND 13 */ { ST_RIR, 2, 18 },
  2339. X/* CALL 14 */ { ST_EXP, 1, 20 },
  2340. X/* CALL 15 */ { ST_IR1, 1, 21 },
  2341. X/* CCF 16 */ { ST_INH, 1, 22 },
  2342. X/* CLR 17 */ { ST_IR1, 1, 23 },
  2343. X/* CLR 18 */ { ST_R1, 1, 24 },
  2344. X/* COM 19 */ { ST_IR1, 1, 25 },
  2345. X/* COM 20 */ { ST_R1, 1, 26 },
  2346. X/* CP 21 */ { ST_IRIM, 1, 27 },
  2347. X/* CP 22 */ { ST_R2, 2, 28 },
  2348. X/* CP 23 */ { ST_RIMM, 1, 30 },
  2349. X/* CP 24 */ { ST_RIR, 2, 31 },
  2350. X/* DA 25 */ { ST_IR1, 1, 33 },
  2351. X/* DA 26 */ { ST_R1, 1, 34 },
  2352. X/* DEC 27 */ { ST_IR1, 1, 35 },
  2353. X/* DEC 28 */ { ST_R1, 1, 36 },
  2354. X/* DECW 29 */ { ST_IR1, 1, 37 },
  2355. X/* DECW 30 */ { ST_R1, 1, 38 },
  2356. X/* DI 31 */ { ST_INH, 1, 39 },
  2357. X/* DJNZ 32 */ { ST_REXP, 1, 40 },
  2358. X/* EI 33 */ { ST_INH, 1, 41 },
  2359. X/* INC 34 */ { ST_IR1, 1, 42 },
  2360. X/* INC 35 */ { ST_R1, 2, 43 },
  2361. X/* INCW 36 */ { ST_IR1, 1, 45 },
  2362. X/* INCW 37 */ { ST_R1, 1, 46 },
  2363. X/* IRET 38 */ { ST_INH, 1, 47 },
  2364. X/* JP 39 */ { ST_CEXP, 1, 48 },
  2365. X/* JP 40 */ { ST_EXP, 1, 49 },
  2366. X/* JP 41 */ { ST_IR1, 1, 50 },
  2367. X/* JR 42 */ { ST_CEXP, 1, 51 },
  2368. X/* JR 43 */ { ST_EXP, 1, 52 },
  2369. X/* LD 44 */ { ST_IRIM, 1, 53 },
  2370. X/* LD 45 */ { ST_IRR, 2, 54 },
  2371. X/* LD 46 */ { ST_R2, 3, 56 },
  2372. X/* LD 47 */ { ST_RIMM, 2, 59 },
  2373. X/* LD 48 */ { ST_RIR, 2, 61 },
  2374. X/* LD 49 */ { ST_RX, 1, 63 },
  2375. X/* LD 50 */ { ST_XR, 1, 64 },
  2376. X/* LDC 51 */ { ST_IRR, 1, 65 },
  2377. X/* LDC 52 */ { ST_RIR, 1, 66 },
  2378. X/* LDCI 53 */ { ST_IRIR, 2, 67 },
  2379. X/* LDE 54 */ { ST_IRR, 1, 69 },
  2380. X/* LDE 55 */ { ST_RIR, 1, 70 },
  2381. X/* LDEI 56 */ { ST_IRIR, 2, 71 },
  2382. X/* NOP 57 */ { ST_INH, 1, 73 },
  2383. X/* OR 58 */ { ST_IRIM, 1, 74 },
  2384. X/* OR 59 */ { ST_R2, 2, 75 },
  2385. X/* OR 60 */ { ST_RIMM, 1, 77 },
  2386. X/* OR 61 */ { ST_RIR, 2, 78 },
  2387. X/* POP 62 */ { ST_IR1, 1, 80 },
  2388. X/* POP 63 */ { ST_R1, 1, 81 },
  2389. X/* PUSH 64 */ { ST_IR1, 1, 82 },
  2390. X/* PUSH 65 */ { ST_R1, 1, 83 },
  2391. X/* RCF 66 */ { ST_INH, 1, 84 },
  2392. X/* RET 67 */ { ST_INH, 1, 85 },
  2393. X/* RL 68 */ { ST_IR1, 1, 86 },
  2394. X/* RL 69 */ { ST_R1, 1, 87 },
  2395. X/* RLC 70 */ { ST_IR1, 1, 88 },
  2396. X/* RLC 71 */ { ST_R1, 1, 89 },
  2397. X/* RR 72 */ { ST_IR1, 1, 90 },
  2398. X/* RR 73 */ { ST_R1, 1, 91 },
  2399. X/* RRC 74 */ { ST_IR1, 1, 92 },
  2400. X/* RRC 75 */ { ST_R1, 1, 93 },
  2401. X/* SBC 76 */ { ST_IRIM, 1, 94 },
  2402. X/* SBC 77 */ { ST_R2, 2, 95 },
  2403. X/* SBC 78 */ { ST_RIMM, 1, 97 },
  2404. X/* SBC 79 */ { ST_RIR, 2, 98 },
  2405. X/* SCF 80 */ { ST_INH, 1, 100 },
  2406. X/* SRA 81 */ { ST_IR1, 1, 101 },
  2407. X/* SRA 82 */ { ST_R1, 1, 102 },
  2408. X/* SRP 83 */ { ST_IMM, 1, 103 },
  2409. X/* SUB 84 */ { ST_IRIM, 1, 104 },
  2410. X/* SUB 85 */ { ST_R2, 2, 105 },
  2411. X/* SUB 86 */ { ST_RIMM, 1, 107 },
  2412. X/* SUB 87 */ { ST_RIR, 2, 108 },
  2413. X/* SWAP 88 */ { ST_IR1, 1, 110 },
  2414. X/* SWAP 89 */ { ST_R1, 1, 111 },
  2415. X/* TCM 90 */ { ST_IRIM, 1, 112 },
  2416. X/* TCM 91 */ { ST_R2, 2, 113 },
  2417. X/* TCM 92 */ { ST_RIMM, 1, 115 },
  2418. X/* TCM 93 */ { ST_RIR, 2, 116 },
  2419. X/* TM 94 */ { ST_IRIM, 1, 118 },
  2420. X/* TM 95 */ { ST_R2, 2, 119 },
  2421. X/* TM 96 */ { ST_RIMM, 1, 121 },
  2422. X/* TM 97 */ { ST_RIR, 2, 122 },
  2423. X/* XOR 98 */ { ST_IRIM, 1, 124 },
  2424. X/* XOR 99 */ { ST_R2, 2, 125 },
  2425. X/* XOR 100 */ { ST_RIMM, 1, 127 },
  2426. X/* XOR 101 */ { ST_RIR, 2, 128 },
  2427. X    { 0, 0, 0 } };
  2428. X
  2429. Xstruct igel igtab[NUMDIFFOP+1]
  2430. X    = {
  2431. X/* invalid 0 */   { 0 , 0, 
  2432. X        "[Xnullentry" },
  2433. X/* invalid 1 */   { 0 , 0, 
  2434. X        "[Xinvalid opcode" },
  2435. X/* ADC 2 */   { 0 , 0, 
  2436. X        "17;[1#];[2=];" },
  2437. X/* ADC 3 */   { SRCWORK+DSTWORK , SRCWORK+DSTWORK, 
  2438. X        "12;[2#4#];" },
  2439. X/* ADC 4 */   { 0 , 0, 
  2440. X        "14;[3#];[1#];" },
  2441. X/* ADC 5 */   { 0 , 0, 
  2442. X        "16;[1#];[2=];" },
  2443. X/* ADC 6 */   { SRCWORK+DSTWORK , SRCWORK+DSTWORK, 
  2444. X        "13;[2#4#];" },
  2445. X/* ADC 7 */   { 0 , 0, 
  2446. X        "15;[3#];[1#];" },
  2447. X/* ADD 8 */   { 0 , 0, 
  2448. X        "07;[1#];[2=];" },
  2449. X/* ADD 9 */   { SRCWORK+DSTWORK , SRCWORK+DSTWORK, 
  2450. X        "02;[2#4#];" },
  2451. X/* ADD 10 */   { 0 , 0, 
  2452. X        "04;[3#];[1#];" },
  2453. X/* ADD 11 */   { 0 , 0, 
  2454. X        "06;[1#];[2=];" },
  2455. X/* ADD 12 */   { SRCWORK+DSTWORK , SRCWORK+DSTWORK, 
  2456. X        "03;[2#4#];" },
  2457. X/* ADD 13 */   { 0 , 0, 
  2458. X        "05;[3#];[1#];" },
  2459. X/* AND 14 */   { 0 , 0, 
  2460. X        "57;[1#];[2=];" },
  2461. X/* AND 15 */   { SRCWORK+DSTWORK , SRCWORK+DSTWORK, 
  2462. X        "52;[2#4#];" },
  2463. X/* AND 16 */   { 0 , 0, 
  2464. X        "54;[3#];[1#];" },
  2465. X/* AND 17 */   { 0 , 0, 
  2466. X        "56;[1#];[2=];" },
  2467. X/* AND 18 */   { SRCWORK+DSTWORK , SRCWORK+DSTWORK, 
  2468. X        "53;[2#4#];" },
  2469. X/* AND 19 */   { 0 , 0, 
  2470. X        "55;[3#];[1#];" },
  2471. X/* CALL 20 */   { 0 , 0, 
  2472. X        "d6;[1=]x" },
  2473. X/* CALL 21 */   { DSTDBL , DSTDBL, 
  2474. X        "d4;[1#];" },
  2475. X/* CCF 22 */   { 0 , 0, 
  2476. X        "ef;" },
  2477. X/* CLR 23 */   { 0 , 0, 
  2478. X        "b1;[1#];" },
  2479. X/* CLR 24 */   { 0 , 0, 
  2480. X        "b0;[1#];" },
  2481. X/* COM 25 */   { 0 , 0, 
  2482. X        "61;[1#];" },
  2483. X/* COM 26 */   { 0 , 0, 
  2484. X        "60;[1#];" },
  2485. X/* CP 27 */   { 0 , 0, 
  2486. X        "a7;[1#];[2=];" },
  2487. X/* CP 28 */   { SRCWORK+DSTWORK , SRCWORK+DSTWORK, 
  2488. X        "a2;[2#4#];" },
  2489. X/* CP 29 */   { 0 , 0, 
  2490. X        "a4;[3#];[1#];" },
  2491. X/* CP 30 */   { 0 , 0, 
  2492. X        "a6;[1#];[2=];" },
  2493. X/* CP 31 */   { SRCWORK+DSTWORK , SRCWORK+DSTWORK, 
  2494. X        "a3;[2#4#];" },
  2495. X/* CP 32 */   { 0 , 0, 
  2496. X        "a5;[3#];[1#];" },
  2497. X/* DA 33 */   { 0 , 0, 
  2498. X        "41;[1#];" },
  2499. X/* DA 34 */   { 0 , 0, 
  2500. X        "40;[1#];" },
  2501. X/* DEC 35 */   { 0 , 0, 
  2502. X        "01;[1#];" },
  2503. X/* DEC 36 */   { 0 , 0, 
  2504. X        "00;[1#];" },
  2505. X/* DECW 37 */   { 0 , 0, 
  2506. X        "81;[1#];" },
  2507. X/* DECW 38 */   { DSTDBL , DSTDBL, 
  2508. X        "80;[1#];" },
  2509. X/* DI 39 */   { 0 , 0, 
  2510. X        "8f;" },
  2511. X/* DJNZ 40 */   { DSTWORK , DSTWORK, 
  2512. X        "[3#]a;[2=].Q.1+-r" },
  2513. X/* EI 41 */   { 0 , 0, 
  2514. X        "9f;" },
  2515. X/* INC 42 */   { 0 , 0, 
  2516. X        "21;[1#];" },
  2517. X/* INC 43 */   { DSTWORK , DSTWORK, 
  2518. X        "[2#]e;" },
  2519. X/* INC 44 */   { 0 , 0, 
  2520. X        "20;[1#];" },
  2521. X/* INCW 45 */   { 0 , 0, 
  2522. X        "a1;[1#];" },
  2523. X/* INCW 46 */   { DSTDBL , DSTDBL, 
  2524. X        "a0;[1#];" },
  2525. X/* IRET 47 */   { 0 , 0, 
  2526. X        "bf;" },
  2527. X/* JP 48 */   { 0 , 0, 
  2528. X        "[1#]d;[2=]x" },
  2529. X/* JP 49 */   { 0 , 0, 
  2530. X        "8d;[1=]x" },
  2531. X/* JP 50 */   { DSTDBL , DSTDBL, 
  2532. X        "30;[1#];" },
  2533. X/* JR 51 */   { 0 , 0, 
  2534. X        "[1#]b;[2=].Q.1+-r" },
  2535. X/* JR 52 */   { 0 , 0, 
  2536. X        "8b;[1=].Q.1+-r" },
  2537. X/* LD 53 */   { 0 , 0, 
  2538. X        "e7;[1#];[2=];" },
  2539. X/* LD 54 */   { DSTWORK+SRCWORK , DSTWORK+SRCWORK, 
  2540. X        "f3;[2#4#];" },
  2541. X/* LD 55 */   { 0 , 0, 
  2542. X        "f5;[3#];[1#];" },
  2543. X/* LD 56 */   { DSTWORK , DSTWORK, 
  2544. X        "[2#]8;[3#];" },
  2545. X/* LD 57 */   { SRCWORK , SRCWORK, 
  2546. X        "[4#]9;[1#];" },
  2547. X/* LD 58 */   { 0 , 0, 
  2548. X        "e4;[3#];[1#];" },
  2549. X/* LD 59 */   { DSTWORK , DSTWORK, 
  2550. X        "[3#]c;[2=];" },
  2551. X/* LD 60 */   { 0 , 0, 
  2552. X        "e6;[1#];[2=];" },
  2553. X/* LD 61 */   { DSTWORK+SRCWORK , DSTWORK+SRCWORK, 
  2554. X        "e3;[2#4#];" },
  2555. X/* LD 62 */   { 0 , 0, 
  2556. X        "e5;[3#];[1#];" },
  2557. X/* LD 63 */   { DSTWORK+SRCWORK , DSTWORK+SRCWORK, 
  2558. X        "c7;[1#3#];[2=];" },
  2559. X/* LD 64 */   { DSTWORK+SRCWORK , DSTWORK+SRCWORK, 
  2560. X        "d7;[3#2#];[1=];" },
  2561. X/* LDC 65 */   { DSTWORK+SRCWORK , DSTWORK+SRCWORK, 
  2562. X        "d2;[4#2#];" },
  2563. X/* LDC 66 */   { DSTWORK+SRCWORK , DSTWORK+SRCWORK, 
  2564. X        "c2;[2#4#];" },
  2565. X/* LDCI 67 */   { SRCDBL+DSTDBL+DSTWORK+SRCWORK , SRCDBL+DSTWORK+SRCWORK, 
  2566. X        "c3;[2#4#];" },
  2567. X/* LDCI 68 */   { SRCDBL+DSTDBL+DSTWORK+SRCWORK , DSTDBL+DSTWORK+SRCWORK, 
  2568. X        "d3;[4#2#];" },
  2569. X/* LDE 69 */   { DSTWORK+SRCWORK , DSTWORK+SRCWORK, 
  2570. X        "92;[4#2#];" },
  2571. X/* LDE 70 */   { DSTWORK+SRCWORK , DSTWORK+SRCWORK, 
  2572. X        "82;[2#4#];" },
  2573. X/* LDEI 71 */   { SRCDBL+DSTDBL+DSTWORK+SRCWORK , SRCDBL+DSTWORK+SRCWORK, 
  2574. X        "83;[2#4#];" },
  2575. X/* LDEI 72 */   { SRCDBL+DSTDBL+DSTWORK+SRCWORK , DSTDBL+DSTWORK+SRCWORK, 
  2576. X        "93;[4#2#];" },
  2577. X/* NOP 73 */   { 0 , 0, 
  2578. X        "ff;" },
  2579. X/* OR 74 */   { 0 , 0, 
  2580. X        "47;[1#];[2=];" },
  2581. X/* OR 75 */   { SRCWORK+DSTWORK , SRCWORK+DSTWORK, 
  2582. X        "42;[2#4#];" },
  2583. X/* OR 76 */   { 0 , 0, 
  2584. X        "44;[3#];[1#];" },
  2585. X/* OR 77 */   { 0 , 0, 
  2586. X        "46;[1#];[2=];" },
  2587. X/* OR 78 */   { SRCWORK+DSTWORK , SRCWORK+DSTWORK, 
  2588. X        "43;[2#4#];" },
  2589. X/* OR 79 */   { 0 , 0, 
  2590. X        "45;[3#];[1#];" },
  2591. X/* POP 80 */   { 0 , 0, 
  2592. X        "51;[1#];" },
  2593. X/* POP 81 */   { 0 , 0, 
  2594. X        "50;[1#];" },
  2595. X/* PUSH 82 */   { 0 , 0, 
  2596. X        "71;[1#];" },
  2597. X/* PUSH 83 */   { 0 , 0, 
  2598. X        "70;[1#];" },
  2599. X/* RCF 84 */   { 0 , 0, 
  2600. X        "cf;" },
  2601. X/* RET 85 */   { 0 , 0, 
  2602. X        "af;" },
  2603. X/* RL 86 */   { 0 , 0, 
  2604. X        "91;[1#];" },
  2605. X/* RL 87 */   { 0 , 0, 
  2606. X        "90;[1#];" },
  2607. X/* RLC 88 */   { 0 , 0, 
  2608. X        "11;[1#];" },
  2609. X/* RLC 89 */   { 0 , 0, 
  2610. X        "10;[1#];" },
  2611. X/* RR 90 */   { 0 , 0, 
  2612. X        "e1;[1#];" },
  2613. X/* RR 91 */   { 0 , 0, 
  2614. X        "e0;[1#];" },
  2615. X/* RRC 92 */   { 0 , 0, 
  2616. X        "c1;[1#];" },
  2617. X/* RRC 93 */   { 0 , 0, 
  2618. X        "c0;[1#];" },
  2619. X/* SBC 94 */   { 0 , 0, 
  2620. X        "37;[1#];[2=];" },
  2621. X/* SBC 95 */   { SRCWORK+DSTWORK , SRCWORK+DSTWORK, 
  2622. X        "32;[2#4#];" },
  2623. X/* SBC 96 */   { 0 , 0, 
  2624. X        "34;[3#];[1#];" },
  2625. X/* SBC 97 */   { 0 , 0, 
  2626. X        "36;[1#];[2=];" },
  2627. X/* SBC 98 */   { SRCWORK+DSTWORK , SRCWORK+DSTWORK, 
  2628. X        "33;[2#4#];" },
  2629. X/* SBC 99 */   { 0 , 0, 
  2630. X        "35;[3#];[1#];" },
  2631. X/* SCF 100 */   { 0 , 0, 
  2632. X        "df;" },
  2633. X/* SRA 101 */   { 0 , 0, 
  2634. X        "d1;[1#];" },
  2635. X/* SRA 102 */   { 0 , 0, 
  2636. X        "d0;[1#];" },
  2637. X/* SRP 103 */   { 0 , 0, 
  2638. X        "31;[1=];" },
  2639. X/* SUB 104 */   { 0 , 0, 
  2640. X        "27;[1#];[2=];" },
  2641. X/* SUB 105 */   { SRCWORK+DSTWORK , SRCWORK+DSTWORK, 
  2642. X        "22;[2#4#];" },
  2643. X/* SUB 106 */   { 0 , 0, 
  2644. X        "24;[3#];[1#];" },
  2645. X/* SUB 107 */   { 0 , 0, 
  2646. X        "26;[1#];[2=];" },
  2647. X/* SUB 108 */   { SRCWORK+DSTWORK , SRCWORK+DSTWORK, 
  2648. X        "23;[2#4#];" },
  2649. X/* SUB 109 */   { 0 , 0, 
  2650. X        "25;[3#];[1#];" },
  2651. X/* SWAP 110 */   { 0 , 0, 
  2652. X        "f1;[1#];" },
  2653. X/* SWAP 111 */   { 0 , 0, 
  2654. X        "f0;[1#];" },
  2655. X/* TCM 112 */   { 0 , 0, 
  2656. X        "67;[1#];[2=];" },
  2657. X/* TCM 113 */   { SRCWORK+DSTWORK , SRCWORK+DSTWORK, 
  2658. X        "62;[2#4#];" },
  2659. X/* TCM 114 */   { 0 , 0, 
  2660. X        "64;[3#];[1#];" },
  2661. X/* TCM 115 */   { 0 , 0, 
  2662. X        "66;[1#];[2=];" },
  2663. X/* TCM 116 */   { SRCWORK+DSTWORK , SRCWORK+DSTWORK, 
  2664. X        "63;[2#4#];" },
  2665. X/* TCM 117 */   { 0 , 0, 
  2666. X        "65;[3#];[1#];" },
  2667. X/* TM 118 */   { 0 , 0, 
  2668. X        "77;[1#];[2=];" },
  2669. X/* TM 119 */   { SRCWORK+DSTWORK , SRCWORK+DSTWORK, 
  2670. X        "72;[2#4#];" },
  2671. X/* TM 120 */   { 0 , 0, 
  2672. X        "74;[3#];[1#];" },
  2673. X/* TM 121 */   { 0 , 0, 
  2674. X        "76;[1#];[2=];" },
  2675. X/* TM 122 */   { SRCWORK+DSTWORK , SRCWORK+DSTWORK, 
  2676. X        "73;[2#4#];" },
  2677. X/* TM 123 */   { 0 , 0, 
  2678. X        "75;[3#];[1#];" },
  2679. X/* XOR 124 */   { 0 , 0, 
  2680. X        "b7;[1#];[2=];" },
  2681. X/* XOR 125 */   { SRCWORK+DSTWORK , SRCWORK+DSTWORK, 
  2682. X        "b2;[2#4#];" },
  2683. X/* XOR 126 */   { 0 , 0, 
  2684. X        "b4;[3#];[1#];" },
  2685. X/* XOR 127 */   { 0 , 0, 
  2686. X        "b6;[1#];[2=];" },
  2687. X/* XOR 128 */   { SRCWORK+DSTWORK , SRCWORK+DSTWORK, 
  2688. X        "b3;[2#4#];" },
  2689. X/* XOR 129 */   { 0 , 0, 
  2690. X        "b5;[3#];[1#];" },
  2691. X    { 0,0,""} };
  2692. X/* end fraptabdef.c */
  2693. SHAR_EOF
  2694. true || echo 'restore of asz8.y failed'
  2695. fi
  2696. exit 0
  2697.