home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / debug / wadesrc.lbr / MONTAB.AZM / MONTAB.ASM
Assembly Source File  |  1988-06-19  |  26KB  |  1,474 lines

  1.     title    'Z80 Assembler/Disassembler Tables'
  2. ;
  3. ;    Last Edited    84-06-24    Wagner
  4. ;
  5. ;    Copyright (c) 1984 by
  6. ;
  7. ;        Thomas Wagner
  8. ;        Patschkauer Weg 31
  9. ;        1000 Berlin 33
  10. ;        West Germany
  11. ;
  12. ;
  13. ;       Released to the public domain 1987
  14. ;
  15.     maclib    z80
  16.     maclib    monopt
  17. ;
  18.     cseg
  19. ;
  20.     public    analop
  21.     public    mnemtab,reg8nam,r16nam,ccnam
  22.     public    opdesc,jumpmark,jumpaddr,caddress
  23. ;
  24.     public    srchmnemo,translate
  25. ;
  26.     IF    extended
  27.     extrn    peek,peekbuf
  28.     ENDIF
  29.     extrn    opnd1,opnd2,string
  30.     extrn    cmderr
  31. ;
  32. ;------------------------------------------------------------------------------
  33. ;
  34. ;    Table for all mnemonics
  35. ;
  36. mnemtab:
  37.     DB    'NOP '        ; 0
  38. mnnop    equ    0
  39.     DB    'LD  '        ; 1
  40. mnld    equ    1
  41.     DB    'INC '        ; 2
  42. mninc    equ    2
  43.     DB    'DEC '        ; 3
  44. mndec    equ    3
  45.     DB    'EX  '        ; 4
  46. mnex    equ    4
  47.     DB    'DJNZ'        ; 5
  48. mndjnz    equ    5
  49.     DB    'JR  '        ; 6 
  50. mnjr    equ    6
  51.     DB    'RLCA'        ; 7
  52. mnrlca    equ    7
  53.     DB    'RRCA'        ; 8
  54. mnrrca    equ    8
  55.     DB    'RLA '        ; 9
  56. mnrla    equ    9
  57.     DB    'RRA '        ; 10
  58. mnrra    equ    10
  59.     DB    'DAA '        ; 11
  60. mndaa    equ    11
  61.     DB    'CPL '        ; 12
  62. mncpl    equ    12
  63.     DB    'SCF '        ; 13
  64. mnscf    equ    13
  65.     DB    'CCF '        ; 14
  66. mnccf    equ    14
  67.     DB    'HALT'        ; 15
  68. mnhalt    equ    15
  69.     DB    'ADD '        ; 16
  70. mnadd    equ    16
  71.     DB    'ADC '        ; 17
  72. mnadc    equ    17
  73.     DB    'SUB '        ; 18
  74. mnsub    equ    18
  75.     DB    'SBC '        ; 19
  76. mnsbc    equ    19
  77.     DB    'AND '        ; 20
  78. mnand    equ    20
  79.     DB    'XOR '        ; 21
  80. mnxor    equ    21
  81.     DB    'OR  '        ; 22
  82. mnor    equ    22
  83.     DB    'CP  '        ; 23
  84. mncp    equ    23
  85.     DB    'RET '        ; 24
  86. mnret    equ    24
  87.     DB    'POP '        ; 25
  88. mnpop    equ    25
  89.     DB    'JP  '        ; 26
  90. mnjp    equ    26
  91.     DB    'CALL'        ; 27
  92. mncall    equ    27
  93.     DB    'PUSH'        ; 28
  94. mnpush    equ    28
  95.     DB    'RST '        ; 29
  96. mnrst    equ    29
  97.     DB    'OUT '        ; 30
  98. mnout    equ    30
  99.     DB    'EXX '        ; 31
  100. mnexx    equ    31
  101.     DB    'IN  '        ; 32
  102. mnin    equ    32
  103.     DB    'DI  '        ; 33
  104. mndi    equ    33
  105.     DB    'EI  '        ; 34
  106. mnei    equ    34
  107.     DB    'RLC '        ; 35
  108. mnrlc    equ    35
  109.     DB    'RRC '        ; 36
  110. mnrrc    equ    36
  111.     DB    'RL  '        ; 37
  112. mnrl    equ    37
  113.     DB    'RR  '        ; 38
  114. mnrr    equ    38
  115.     DB    'SLA '        ; 39
  116. mnsla    equ    39
  117.     DB    'SRA '        ; 40
  118. mnsra    equ    40
  119.     DB    'NEG '        ; 41
  120. mnneg    equ    41
  121.     DB    'SRL '        ; 42
  122. mnsrl    equ    42
  123.     DB    'BIT '        ; 43
  124. mnbit    equ    43
  125.     DB    'RES '        ; 44
  126. mnres    equ    44
  127.     DB    'SET '        ; 45
  128. mnset    equ    45
  129.     DB    'RETN'        ; 46
  130. mnretn    equ    46
  131.     DB    'IM  '        ; 47
  132. mnim    equ    47
  133.     DB    'RETI'        ; 48
  134. mnreti    equ    48
  135.     DB    'RRD '        ; 49
  136. mnrrd    equ    49
  137.     DB    'RLD '        ; 50
  138. mnrld    equ    50
  139.     DB    'LDI '        ; 51
  140. mnldi    equ    51
  141.     DB    'CPI '        ; 52
  142. mncpi    equ    52
  143.     DB    'INI '        ; 53
  144. mnini    equ    53
  145.     DB    'OUTI'        ; 54
  146. mnouti    equ    54
  147.     DB    'LDD '        ; 55
  148. mnldd    equ    55
  149.     DB    'CPD '        ; 56
  150. mncpd    equ    56
  151.     DB    'IND '        ; 57
  152. mnind    equ    57
  153.     DB    'OUTD'        ; 58
  154. mnoutd    equ    58
  155.     DB    'LDIR'        ; 59
  156. mnldir    equ    59
  157.     DB    'CPIR'        ; 60
  158. mncpir    equ    60
  159.     DB    'INIR'        ; 61
  160. mninir    equ    61
  161.     DB    'OTIR'        ; 62
  162. mnotir    equ    62
  163.     DB    'LDDR'        ; 63
  164. mnlddr    equ    63
  165.     DB    'CPDR'        ; 64
  166. mncpdr    equ    64
  167.     DB    'INDR'        ; 65
  168. mnindr    equ    65
  169.     DB    'OTDR'        ; 66
  170. mnotdr    equ    66
  171.     DB    '??? '        ; 67
  172. mnbadop    equ    67
  173. ;
  174. ;------------------------------------------------------------------------------
  175. ;
  176. ;    Tables for register and condition code names
  177. ;
  178. reg8nam    DB    'BCDEHLIRAF'
  179. ;         0123456789
  180. ;
  181. regb    equ    10h
  182. regc    equ    11h
  183. regd    equ    12h
  184. rege    equ    13h
  185. regh    equ    14h
  186. regl    equ    15h
  187. rega    equ    18h
  188. regi    equ    16h
  189. regr    equ    17h
  190. ;
  191. ;
  192. r16nam:    DB    'BCDEHLSPAFIXIY'
  193. ;         0 1 2 3 4 5 6
  194. ;
  195. regbc    equ    20h
  196. regde    equ    21h
  197. reghl    equ    22h
  198. regsp    equ    23h
  199. regaf    equ    24h
  200. regix    equ    25h
  201. regiy    equ    26h
  202. ;
  203. atbc    equ    30h
  204. atde    equ    31h
  205. athl    equ    32h
  206. atsp    equ    33h
  207. atix    equ    34h
  208. atiy    equ    35h
  209. atixi    equ    3dh
  210. atiyi    equ    3eh
  211. ;
  212. ;
  213. ccnam:    DB    'NZZ NCC POPEP M '
  214. ;         0 1 2 3 4 5 6 7
  215. ;
  216. ccdnz    equ    80h
  217. ccdz    equ    81h
  218. ccdnc    equ    82h
  219. ccdc    equ    83h
  220. ccdpo    equ    84h
  221. ccdpe    equ    85h
  222. ccdp    equ    86h
  223. ccdm    equ    87h
  224. ;
  225. ;
  226. opnim8    equ    40h
  227. opnim16    equ    50h
  228. opnbit    equ    60h
  229. opnjr    equ    70h
  230. opnatc    equ    90h
  231. opnafa    equ    0b0h
  232. opnad16    equ    0a0h
  233. opnad8    equ    0c0h
  234. opnrst    equ    0d0h
  235. ;
  236. opnjprg    equ    0e0h        ; internal use only, not a real operand
  237. opnjp16    equ    052h        ; internal use only, becomes 50h
  238. opncl16    equ    051h        ;   "       "   "      "     "
  239. opnjpsp    equ    0f0h
  240. ;
  241. ;    jump marks
  242. ;
  243. jm16    equ    010h        ; jump immediate 16-bit (11 means call immed.)
  244. jmsp    equ    020h        ; jump stack (ret)
  245. jmreg    equ    030h        ; jump register
  246. ;
  247. ;------------------------------------------------------------------------------
  248. ;
  249. ;    Table of legal opcodes after DD/FD-prefix
  250. ;
  251. preftab:
  252.     DB    09h,19h,21h,22h,23h,29h,2ah,2bh,34h,35h,36h,39h,46h,4eh
  253.     DB    56h,5eh,66h,6eh,70h,71h,72h,73h,74h,75h,77h,7eh,86h,8eh
  254.     DB    096h,09eh,0a6h,0aeh,0b6h,0beh,0cbh,0e1h,0e3h,0e5h,0e9h,0f9h
  255. lpreftab    equ    $-preftab
  256. ;
  257. ;
  258. ;------------------------------------------------------------------------------
  259. ;
  260. ;    Table for opcodes 00..3F
  261. ;
  262. tab00$3f:
  263.     db    mnnop,0,0            ; 00
  264.     db    mnld,regbc,opnim16
  265.     db    mnld,atbc,rega
  266.     db    mninc,regbc,0
  267.     db    mninc,regb,0
  268.     db    mndec,regb,0
  269.     db    mnld,regb,opnim8
  270.     db    mnrlca,0,0
  271. ;
  272.     db    mnex,regaf,opnafa        ; 08
  273.     db    mnadd,reghl,regbc
  274.     db    mnld,rega,atbc
  275.     db    mndec,regbc,0
  276.     db    mninc,regc,0
  277.     db    mndec,regc,0
  278.     db    mnld,regc,opnim8
  279.     db    mnrrca,0,0
  280. ;
  281.     db    mndjnz,opnjr,0            ; 10
  282.     db    mnld,regde,opnim16
  283.     db    mnld,atde,rega
  284.     db    mninc,regde,0
  285.     db    mninc,regd,0
  286.     db    mndec,regd,0
  287.     db    mnld,regd,opnim8
  288.     db    mnrla,0,0
  289. ;
  290.     db    mnjr,opnjr,0            ; 18
  291.     db    mnadd,reghl,regde
  292.     db    mnld,rega,atde
  293.     db    mndec,regde,0
  294.     db    mninc,rege,0
  295.     db    mndec,rege,0
  296.     db    mnld,rege,opnim8
  297.     db    mnrra,0,0
  298. ;
  299.     db    mnjr,ccdnz,opnjr        ; 20
  300.     db    mnld,reghl,opnim16
  301.     db    mnld,opnad16,reghl
  302.     db    mninc,reghl,0
  303.     db    mninc,regh,0
  304.     db    mndec,regh,0
  305.     db    mnld,regh,opnim8
  306.     db    mndaa,0,0
  307. ;
  308.     db    mnjr,ccdz,opnjr            ; 28
  309.     db    mnadd,reghl,reghl
  310.     db    mnld,reghl,opnad16
  311.     db    mndec,reghl,0
  312.     db    mninc,regl,0
  313.     db    mndec,regl,0
  314.     db    mnld,regl,opnim8
  315.     db    mncpl,0,0
  316. ;
  317.     db    mnjr,ccdnc,opnjr        ; 30
  318.     db    mnld,regsp,opnim16
  319.     db    mnld,opnad16,rega
  320.     db    mninc,regsp,0
  321.     db    mninc,athl,0
  322.     db    mndec,athl,0
  323.     db    mnld,athl,opnim8
  324.     db    mnscf,0,0
  325. ;
  326.     db    mnjr,ccdc,opnjr            ; 38
  327.     db    mnadd,reghl,regsp
  328.     db    mnld,rega,opnad16
  329.     db    mndec,regsp,0
  330.     db    mninc,rega,0
  331.     db    mndec,rega,0
  332.     db    mnld,rega,opnim8
  333.     db    mnccf,0,0
  334. ;
  335. ltab00$3f    equ    ($-tab00$3f)/3
  336. ;
  337. ;------------------------------------------------------------------------------
  338. ;
  339. ;    Table for Opcodes 40..BF (Groups of 8)
  340. ;
  341. tab40$bf:
  342.     db    mnld,regb,1fh
  343.     db    mnld,regc,1fh
  344.     db    mnld,regd,1fh
  345.     db    mnld,rege,1fh
  346.     db    mnld,regh,1fh
  347.     db    mnld,regl,1fh
  348.     db    mnld,athl,1fh
  349.     db    mnld,rega,1fh
  350.     db    mnadd,rega,1fh
  351.     db    mnadc,rega,1fh
  352.     db    mnsub,1fh,0
  353.     db    mnsbc,rega,1fh
  354.     db    mnand,1fh,0
  355.     db    mnxor,1fh,0
  356.     db    mnor,1fh,0
  357.     db    mncp,1fh,0
  358. ;
  359. ltab40$bf    equ    ($-tab40$bf)/3
  360. ;
  361. ;------------------------------------------------------------------------------
  362. ;
  363. ;    Table for Opcodes C0..FF
  364. ;
  365. tabc0$ff:
  366.     db    mnret,ccdnz,opnjpsp    ; c0
  367.     db    mnpop,regbc,0
  368.     db    mnjp,ccdnz,opnjp16
  369.     db    mnjp,opnjp16,0
  370.     db    mncall,ccdnz,opncl16
  371.     db    mnpush,regbc,0
  372.     db    mnadd,rega,opnim8
  373.     db    mnrst,opnrst+0,0
  374. ;
  375.     db    mnret,ccdz,opnjpsp    ; c8
  376.     db    mnret,opnjpsp,0
  377.     db    mnjp,ccdz,opnjp16
  378.     db    mnbadop,0,0
  379.     db    mncall,ccdz,opncl16
  380.     db    mncall,opncl16,0
  381.     db    mnadc,rega,opnim8
  382.     db    mnrst,opnrst+1,0
  383. ;
  384.     db    mnret,ccdnc,opnjpsp    ; d0
  385.     db    mnpop,regde,0
  386.     db    mnjp,ccdnc,opnjp16
  387.     db    mnout,opnad8,rega
  388.     db    mncall,ccdnc,opncl16
  389.     db    mnpush,regde,0
  390.     db    mnsub,opnim8,0
  391.     db    mnrst,opnrst+2,0
  392. ;
  393.     db    mnret,ccdc,opnjpsp    ; d8
  394.     db    mnexx,0,0
  395.     db    mnjp,ccdc,opnjp16
  396.     db    mnin,rega,opnad8
  397.     db    mncall,ccdc,opncl16
  398.     db    mnbadop,0,0
  399.     db    mnsbc,rega,opnim8
  400.     db    mnrst,opnrst+3,0
  401. ;
  402.     db    mnret,ccdpo,opnjpsp    ; e0
  403.     db    mnpop,reghl,0
  404.     db    mnjp,ccdpo,opnjp16
  405.     db    mnex,atsp,reghl
  406.     db    mncall,ccdpo,opncl16
  407.     db    mnpush,reghl,0
  408.     db    mnand,opnim8,0
  409.     db    mnrst,opnrst+4,0
  410. ;
  411.     db    mnret,ccdpe,opnjpsp    ; e8
  412.     db    mnjp,athl,opnjprg
  413.     db    mnjp,ccdpe,opnjp16
  414.     db    mnex,regde,reghl
  415.     db    mncall,ccdpe,opncl16
  416.     db    mnbadop,0,0
  417.     db    mnxor,opnim8,0
  418.     db    mnrst,opnrst+5,0
  419. ;
  420.     db    mnret,ccdp,opnjpsp    ; f0
  421.     db    mnpop,regaf,0
  422.     db    mnjp,ccdp,opnjp16
  423.     db    mndi,0,0
  424.     db    mncall,ccdp,opncl16
  425.     db    mnpush,regaf,0
  426.     db    mnor,opnim8,0
  427.     db    mnrst,opnrst+6,0
  428. ;
  429.     db    mnret,ccdm,opnjpsp    ; f8
  430.     db    mnld,regsp,reghl
  431.     db    mnjp,ccdm,opnjp16
  432.     db    mnei,0,0
  433.     db    mncall,ccdm,opncl16
  434.     db    mnbadop,0,0
  435.     db    mncp,opnim8,0
  436.     db    mnrst,opnrst+7,0
  437. ;
  438. ltabc0$ff    equ    ($-tabc0$ff)/3
  439. ;
  440. ;------------------------------------------------------------------------------
  441. ;
  442. ;    Table for prefix-codes ED
  443. ;
  444. tabedpref:
  445.     db    40h,mnin,regb,opnatc
  446.     db    41h,mnout,opnatc,regb
  447.     db    42h,mnsbc,reghl,regbc
  448.     db    43h,mnld,opnad16,regbc
  449.     db    44h,mnneg,0,0
  450.     db    45h,mnretn,opnjpsp,0
  451.     db    46h,mnim,opnbit+0,0
  452.     db    47h,mnld,regi,rega
  453. ;
  454.     db    48h,mnin,regc,opnatc
  455.     db    49h,mnout,opnatc,regc
  456.     db    4ah,mnadc,reghl,regbc
  457.     db    4bh,mnld,regbc,opnad16
  458.     db    4dh,mnreti,opnjpsp,0
  459.     db    4fh,mnld,regr,rega
  460. ;
  461.     db    50h,mnin,regd,opnatc
  462.     db    51h,mnout,opnatc,regd
  463.     db    52h,mnsbc,reghl,regde
  464.     db    53h,mnld,opnad16,regde
  465.     db    56h,mnim,opnbit+1,0
  466.     db    57h,mnld,rega,regi
  467. ;
  468.     db    58h,mnin,rege,opnatc
  469.     db    59h,mnout,opnatc,rege
  470.     db    5ah,mnadc,reghl,regde
  471.     db    5bh,mnld,regde,opnad16
  472.     db    5eh,mnim,opnbit+2,0
  473.     db    5fh,mnld,rega,regr
  474. ;
  475.     db    60h,mnin,regh,opnatc
  476.     db    61h,mnout,opnatc,regh
  477.     db    62h,mnsbc,reghl,reghl
  478.     db    67h,mnrrd,0,0
  479. ;
  480.     db    68h,mnin,regl,opnatc
  481.     db    69h,mnout,opnatc,regl
  482.     db    6ah,mnadc,reghl,reghl
  483.     db    6fh,mnrld,0,0
  484. ;
  485.     db    72h,mnsbc,reghl,regsp
  486.     db    73h,mnld,opnad16,regsp
  487. ;
  488.     db    78h,mnin,rega,opnatc
  489.     db    79h,mnout,opnatc,rega
  490.     db    7ah,mnadc,reghl,regsp
  491.     db    7bh,mnld,regsp,opnad16
  492. ;
  493.     db    0a0h,mnldi,0,0
  494.     db    0a1h,mncpi,0,0
  495.     db    0a2h,mnini,0,0
  496.     db    0a3h,mnouti,0,0
  497.     db    0a8h,mnldd,0,0
  498.     db    0a9h,mncpd,0,0
  499.     db    0aah,mnind,0,0
  500.     db    0abh,mnoutd,0,0
  501. ;
  502.     db    0b0h,mnldir,0,0
  503.     db    0b1h,mncpir,0,0
  504.     db    0b2h,mninir,0,0
  505.     db    0b3h,mnotir,0,0
  506.     db    0b8h,mnlddr,0,0
  507.     db    0b9h,mncpdr,0,0
  508.     db    0bah,mnindr,0,0
  509.     db    0bbh,mnotdr,0,0
  510. ;
  511. ltabedpref    equ    ($-tabedpref)/4
  512. ;
  513. ;
  514. ;    table entry for HALT opcode
  515. ;
  516. tab76:
  517.     db    mnhalt,0,0
  518. ;
  519. ;------------------------------------------------------------------------------
  520. ;
  521. ;    Table for CB-Prefix Opcodes (Groups of 8)
  522. ;
  523. tabcb00$ff:
  524.     db    mnrlc,1fh,0        ; 00
  525.     db    mnrrc,1fh,0        ; 08
  526.     db    mnrl,1fh,0        ; 10
  527.     db    mnrr,1fh,0
  528.     db    mnsla,1fh,0
  529.     db    mnsra,1fh,0
  530.     db    mnbadop,0,0
  531.     db    mnsrl,1fh,0
  532. ;
  533.     db    mnbit,60h,1fh
  534.     db    mnbit,61h,1fh
  535.     db    mnbit,62h,1fh
  536.     db    mnbit,63h,1fh
  537.     db    mnbit,64h,1fh
  538.     db    mnbit,65h,1fh
  539.     db    mnbit,66h,1fh
  540.     db    mnbit,67h,1fh
  541. ;
  542.     db    mnres,60h,1fh
  543.     db    mnres,61h,1fh
  544.     db    mnres,62h,1fh
  545.     db    mnres,63h,1fh
  546.     db    mnres,64h,1fh
  547.     db    mnres,65h,1fh
  548.     db    mnres,66h,1fh
  549.     db    mnres,67h,1fh
  550. ;
  551.     db    mnset,60h,1fh
  552.     db    mnset,61h,1fh
  553.     db    mnset,62h,1fh
  554.     db    mnset,63h,1fh
  555.     db    mnset,64h,1fh
  556.     db    mnset,65h,1fh
  557.     db    mnset,66h,1fh
  558.     db    mnset,67h,1fh
  559. ;
  560. ltabcb00$ff    equ    ($-tabcb00$ff)/3
  561. ;
  562. ;
  563. ;
  564. ;    Operand description:
  565. ;
  566. ;        00    no operand
  567. ;        1x    8-bit register name
  568. ;            (x = pointer to 'reg8nam')
  569. ;        2x    16-bit register name
  570. ;            (x = pointer to 'reg16nam')
  571. ;        3x    memory register, x=pointer to 'reg16nam'
  572. ;            bit 3 = 1: signed offset follows
  573. ;        40    immediate 8-bit follows
  574. ;        50    immediate 16-bit follows
  575. ;        6x    x = bit number/ int-mode-number
  576. ;        70    jump offset follows (16-bit immediate value)
  577. ;        8x    condition code
  578. ;            (x = pointer to 'ccnam')
  579. ;        90    (C)
  580. ;        A0    address follows
  581. ;        B0    AF'
  582. ;        C0    8-bit (port-)address follows
  583. ;        Dx    restart (8-bit immediate value follows)
  584. ;
  585. ;    analop:        analyse opcode
  586. ;
  587. ;        entry:    A/HL = first opcode byte address
  588. ;
  589. ;        exit:    B = opcode length
  590. ;            C = menmonic table pointer
  591. ;            HL = next opcode address
  592. ;            opdesc contains operand description
  593. ;
  594. ;        uses:    all regs
  595. ;
  596. analop:
  597.     shld    caddress
  598.     IF    extended
  599.     call    peek
  600.     push    h
  601.     lxix    peekbuf
  602.     ELSE
  603.     push    h
  604.     push    h
  605.     popix
  606.     ENDIF
  607.     lxiy    opdesc
  608.     mvi    b,1        ; default length
  609.     xra    a
  610.     sta    prefix        ; clear prefix
  611.     sta    condit
  612.     sta    jumpmark
  613.     call    analop1        ; analyse
  614.     mviy    0,0        ; terminate opdesc
  615.     pop    h
  616.     mov    e,b
  617.     mvi    d,0
  618.     dad    d
  619.     ret
  620. ;
  621. ;
  622. analop1:
  623.     ldx    a,0        ; load opcode
  624.     mvi    c,3        ; offset of IX to HL in "r16nam"
  625.     cpi    0ddh
  626.     jrz    prefx        ; IX-prefix
  627.     cpi    0fdh        ; IY-prefix
  628.     jrnz    anal10        ; jump if no prefix
  629.     inr    c
  630. prefx:
  631.     mov    a,c
  632.     sta    prefix
  633.     ldx    a,2        ; get offset
  634.     sta    offset        ; store it
  635.     lxi    h,preftab
  636.     ldx    a,1        ; check next byte
  637.     lxi    b,lpreftab
  638.     ccir            ; allowed combination ?
  639.     jnz    operr        ; error if not
  640.     cpi    0cbh        ; shift/bit op ?
  641.     jrnz    prefx10        ; ok if not
  642.     ldx    a,3        ; get opcode (byte 2 is offset)
  643.     cpi    36h        ; 36 is not allowed
  644.     jz    operr
  645.     ani    7
  646.     cpi    6        ; only .6/.E allowed
  647.     jnz    operr        ; error if not
  648. prefx10:
  649.     mvi    b,2        ; 2 bytes opcode
  650.     inxix            ; get next byte
  651.     ldx    a,0        ; opcode
  652. ;
  653. ;    next byte can't be dd/fd prefix, so fall through
  654. ;
  655. anal10:
  656.     cpi    0cbh
  657.     jrz    exshiftop    ; extended shift / bit operation
  658.     cpi    0edh
  659.     jrz    specop        ; special operation
  660.     lxi    h,tab00$3f
  661.     cpi    040h
  662.     jrc    anal20        ; direct table access for 00..3f
  663.     cpi    0c0h
  664.     jrc    anal30        ; branch for 40..bf
  665.     lxi    h,tabc0$ff    ; direct table for c0..ff
  666.     sui    0c0h        ; offset
  667. ;
  668. anal20:
  669.     mov    e,a
  670.     add    a
  671.     add    e        ; opcode * 3
  672.     mov    e,a
  673.     mvi    d,0
  674.     dad    d        ; table location
  675. anal25:
  676.     mov    c,m        ; mnemonic
  677.     inx    h
  678.     mov    a,m        ; first operand
  679.     ora    a
  680.     rz            ; ready if no operand
  681.     call    analopnd    ; analyse operand
  682.     inx    h
  683.     mov    a,m        ; second operand
  684.     ora    a
  685.     rz            ; ready if no second operand
  686.     jmp    analopnd    ; analyse second operand
  687. ;
  688. ;
  689. anal30:                ; here for opcodes 40..BF
  690.     cpi    76h
  691.     mvi    c,mnhalt    ; HALT is a special case
  692.     rz
  693.     sui    40h
  694.     rrc
  695.     rrc            ; divide opcode by 8
  696.     rrc
  697.     ani    0fh
  698.     lxi    h,tab40$bf
  699.     jr    anal20        ; normal procedure now
  700. ;
  701. ;
  702. ;    Opcode prefix CB:    Extended shifts, bit operations
  703. ;
  704. exshiftop:
  705.     inxix            ; opcode is next byte
  706.     inr    b
  707.     lda    prefix        ; prefix ?
  708.     ora    a
  709.     jrz    exshif1        ; ok if not
  710.     inxix            ; skip offset if prefix
  711. exshif1:
  712.     ldx    a,0        ; load opcode
  713.     rrc
  714.     rrc            ; divide by 8
  715.     rrc
  716.     ani    1fh
  717.     lxi    h,tabcb00$ff
  718.     jr    anal20        ; normal procedure from here
  719. ;
  720. ;
  721. ;    Opcode prefix ED:    Special operations
  722. ;
  723. specop:
  724.     inxix            ; opcode is next byte
  725.     inr    b
  726.     ldx    a,0
  727.     mvi    c,ltabedpref
  728.     lxi    h,tabedpref
  729. specoplp:
  730.     cmp    m
  731.     inx    h
  732.     jrz    anal25        ; continue normally if found
  733.     inx    h
  734.     inx    h
  735.     inx    h
  736.     dcr    c
  737.     jrnz    specoplp
  738. ;
  739. ;    fall through to operr for undefined ED-opcode
  740. ;
  741. operr:
  742.     mvi    c,mnbadop
  743.     mvi    b,1        ; length of bad opcode is 1
  744.     ret
  745. ;
  746. ;------------------------------------------------------------------------------
  747. ;
  748. ;    analopnd:    analyse operand
  749. ;
  750. ;        entry:    A = operand code
  751. ;
  752. analopnd:
  753.     sty    a,0        ; store
  754.     inxiy
  755.     push    psw
  756.     rrc
  757.     rrc
  758.     rrc
  759.     rrc
  760.     ani    0fh
  761.     dcr    a
  762.     add    a
  763.     mov    e,a
  764.     mvi    d,0
  765.     pop    psw
  766.     push    h
  767.     lxi    h,analopntab
  768.     dad    d
  769.     mov    e,m
  770.     inx    h
  771.     mov    d,m
  772.     xchg
  773.     xthl
  774. aopret:
  775.     ret            ; enter table
  776. ;
  777. analopntab:
  778.     dw    aopr8        ; 10
  779.     dw    aopr16        ; 20
  780.     dw    aopa16        ; 30
  781.     dw    aopim8        ; 40
  782.     dw    aopim16        ; 50
  783.     dw    aopret        ; 60
  784.     dw    aopjr        ; 70
  785.     dw    aopccd        ; 80
  786.     dw    aopret        ; 90
  787.     dw    aopim16        ; a0
  788.     dw    aopret        ; b0
  789.     dw    aopim8        ; c0
  790.     dw    aoprst        ; d0
  791.     dw    aopjprg        ; e0
  792.     dw    aopjpsp        ; f0
  793. ;
  794. ;
  795. aopccd:
  796.     mvi    a,80h
  797.     sta    condit
  798.     ret
  799. ;
  800. aopr8:
  801.     ani    0fh
  802.     cpi    0fh
  803.     rnz            ; ready if not undetermined
  804.     ldx    a,0        ; get opcode again
  805.     ani    7        ; get register
  806.     cpi    7        ; A ?
  807.     jrnz    aopr81
  808.     inr    a        ; internally, A is 8
  809. aopr81:
  810.     ori    10h
  811.     sty    a,-1        ; replace
  812.     cpi    16h        ; (HL)
  813.     rnz            ; ready if not (HL)
  814.     mviy    32h,-1        ; replace by (HL)
  815. ;
  816. memopnd:
  817.     lda    prefix
  818.     ora    a
  819.     rz            ; ok if no prefix
  820.     addy    -1        ; else add prefix offset to (HL)
  821.     sty    a,-1
  822. ;
  823.     ldx    a,0        ; get opcode again
  824.     cpi    0e9h        ; JP (rr) ?
  825.     rz            ; no offset for JP (rr)
  826. ;
  827.     sety    3,-1        ; else mark offset follows
  828.     lda    offset        ; copy offset
  829.     sty    a,0
  830.     inxiy            ; point to next
  831.     inr    b        ; offset takes one byte
  832.     ret
  833. ;
  834. aopjr:
  835.     ldx    a,0        ; opcode again
  836.     cpi    10h        ; DJNZ ?
  837.     jrnz    aopjr1
  838.     mvi    a,80h
  839.     sta    condit        ; DJNZ is conditional
  840. aopjr1:
  841.     ldx    a,1
  842.     sty    a,0
  843.     inxiy            ; point to next
  844.     inr    b        ; offset takes one byte
  845.     push    h
  846.     lhld    caddress    ; current addr
  847.     inx    h
  848.     inx    h        ; +2
  849.     mov    e,a
  850.     mvi    d,0        ; calculate absolute jump address
  851.     rlc
  852.     jrnc    aopjr10
  853.     mvi    d,0ffh        ; extend sign
  854. aopjr10:
  855.     dad    d
  856.     xchg
  857.     pop    h
  858.     xra    a
  859.     jr    mkjm16        ; mark as 16-bit jump
  860. ;
  861. aopa16:
  862.     ani    7
  863.     cpi    2
  864.     rnz            ; ready if not HL
  865.     jr    memopnd
  866. ;
  867. aopr16:
  868.     ani    7
  869.     cpi    2
  870.     rnz            ; ready if not HL
  871.     lda    prefix
  872.     addy    -1
  873.     sty    a,-1
  874.     ret
  875. ;
  876. ;
  877. aopim16:
  878.     ldx    e,1        ; copy value
  879.     sty    e,0
  880.     ldx    d,2
  881.     sty    d,1
  882.     inxiy
  883.     inxiy
  884.     inr    b
  885.     inr    b        ; 2 bytes for opcode
  886.     ani    7        ; jump ?
  887.     rz            ; ready if not
  888.     push    psw
  889.     ldy    a,-3
  890.     ani    0f0h        ; clear lower nibble in operand-description
  891.     sty    a,-3
  892.     pop    psw
  893. mkjm16:
  894.     sded    jumpaddr
  895.     ori    jm16
  896. mkjmp:
  897.     push    h
  898.     lxi    h,condit
  899.     ora    m
  900.     sta    jumpmark
  901.     pop    h
  902.     ret
  903. ;
  904. ;
  905. aopim8:
  906.     ldx    d,1
  907.     lda    prefix        ; prefix ?
  908.     ora    a
  909.     jrz    aopim81        ; ok if not
  910.     ldx    d,2        ; value is in next byte if prefix
  911. aopim81:
  912.     sty    d,0        ; copy value
  913.     inxiy
  914.     inr    b        ; one byte for opcode
  915.     ret
  916. ;
  917. ;
  918. aoprst:
  919.     ani    7
  920.     mov    d,a
  921.     inr    d
  922.     mvi    a,-8
  923. aoprstlp:
  924.     adi    8
  925.     dcr    d
  926.     jrnz    aoprstlp
  927.     sty    a,0
  928.     inxiy
  929.     mov    e,a
  930.     mvi    a,1        ; call marker
  931.     jr    mkjm16        ; go mark jump
  932. ;
  933. ;
  934. aopjprg:
  935.     ldy    a,-2        ; previous operand
  936.     jr    aopjj
  937. ;
  938. aopjpsp:
  939.     mvi    a,jmsp
  940. ;
  941. aopjj:
  942.     mviy    0,-1        ; clear field, not an operand
  943.     jr    mkjmp
  944. ;
  945. ;
  946. ;------------------------------------------------------------------------------
  947. ;
  948. ;    Routines for Assembly
  949. ;
  950. ;------------------------------------------------------------------------------
  951. ;
  952. ;    srchmnemo:    search mnemonic
  953. ;
  954. ;        entry:    HL = pointer to mnemonic
  955. ;
  956. ;        exit:    Carry set if not found
  957. ;            A = mnemonic index
  958. ;
  959. srchmnemo:
  960.     lxi    d,mnemtab
  961.     mvi    b,mnbadop    ; number of entries
  962.     mvi    c,0        ; index
  963. srcmnloop:
  964.     push    b
  965.     push    h        ; save start
  966.     mvi    b,4
  967.     mvi    c,0
  968. srcmncmp:
  969.     ldax    d
  970.     sub    m
  971.     ora    c
  972.     mov    c,a        ; all bytes must match
  973.     inx    h
  974.     inx    d
  975.     djnz    srcmncmp
  976.     pop    h
  977.     pop    b
  978.     ora    a
  979.     mov    a,c
  980.     rz            ; ready if found
  981.     inr    c
  982.     djnz    srcmnloop
  983.     stc
  984.     ret            ; exit with carry set
  985. ;
  986. ;
  987. ;------------------------------------------------------------------------------
  988. ;
  989. ;
  990. ;    translate:    translate op description into opcode
  991. ;
  992. ;        entry:    A = mnemonic index
  993. ;            IX = opnd1
  994. ;            IY = opnd2
  995. ;
  996. translate:
  997.     mov    c,a        ; mnemo into C
  998.     xra    a
  999.     sta    prefix
  1000.     sta    prefix2
  1001.     dcr    a
  1002.     sta    regpref        ; registers have preference this time
  1003.     call    trymatch    ; try to match mnemo and operands
  1004.     jrnc    transl10
  1005.     xra    a
  1006.     sta    regpref        ; no register preference this time
  1007.     call    trymatch
  1008.     rc            ; return if no match
  1009. ;
  1010. ;    we have a match, now assemble the opcode
  1011. ;
  1012. ;
  1013. transl10:
  1014.     mov    a,e
  1015.     cpi    4        ; ED-prefix-table ?
  1016.     jrnz    matchnoed
  1017.     dcx    h        ; then opcode is one before mnemo
  1018.     mov    a,m
  1019.     inx    h
  1020.     sta    opcode        ; correct opcode
  1021. ;
  1022. matchnoed:
  1023.     mvi    b,1        ; B = length of opcode
  1024.     lxix    string
  1025.     lda    prefix        ; is there an IX/IY prefix ?
  1026.     ora    a
  1027.     jrz    match10
  1028.     stx    a,0        ; yes, store & increase length
  1029.     inxix
  1030.     inr    b
  1031. ;
  1032. match10:
  1033.     lda    prefix2
  1034.     ora    a        ; opcode prefix ?
  1035.     jrz    match20
  1036.     stx    a,0
  1037.     inxix
  1038.     inr    b
  1039. ;
  1040. match20:
  1041.     lda    opcode        ; get opcode
  1042.     stx    a,0        ; store it
  1043.     dcr    d        ; opcode offset
  1044.     jrz    match25        ; ok if 1
  1045.     inx    h
  1046.     mov    a,m
  1047.     dcx    h
  1048.     cpi    1fh        ; operand 1 undetermined ?
  1049.     lda    opnd1+1
  1050.     jrz    match22
  1051.     lda    opnd2+1        ; else insert reg-num of second opnd into op
  1052. match22:
  1053.     call    make8bit
  1054.     ani    0fh
  1055.     orx    0
  1056.     stx    a,0
  1057. ;
  1058. match25:
  1059.     lda    prefix        ; check again for IX/IY prefix
  1060.     ora    a
  1061.     jrz    match40        ; ok if no prefix
  1062.     push    h
  1063.     lxi    h,preftab
  1064.     lda    string+1    ; opcode
  1065.     push    b        ; check opcode against table of allowed codes
  1066.     lxi    b,lpreftab
  1067.     ccir
  1068.     pop    b
  1069.     pop    h
  1070.     stc
  1071.     rnz            ; error if prefix with illegal opcode
  1072. ;
  1073.     mov    a,m        ; check mnemo
  1074.     cpi    mnjp        ; is it JP (IX/IY) ?
  1075.     jrz    match40        ; then no offset
  1076.     inx    h        ; first opnd
  1077.     lxiy    opnd1
  1078.     mov    a,m
  1079.     inx    h        ; second opnd
  1080.     cpi    athl
  1081.     jrz    match30
  1082.     cpi    1fh
  1083.     jrz    match30
  1084.     mov    a,m
  1085.     cpi    athl
  1086.     jrz    match29
  1087.     cpi    1fh
  1088.     jrnz    match39        ; no offset if not (..)
  1089. match29:
  1090.     lxiy    opnd2
  1091. match30:
  1092.     ldy    a,2        ; offset marker
  1093.     ora    a
  1094.     jrz    match35        ; use 0 if no offset given
  1095.     ldy    a,3        ; else use specified offset
  1096. match35:
  1097.     mov    d,a        ; save
  1098.     lda    prefix2
  1099.     ora    a        ; another prefix ?
  1100.     jrz    match36        ; ok if not
  1101.     ldx    a,0        ; else copy opcode
  1102.     stx    d,0
  1103.     mov    d,a
  1104. match36:
  1105.     stx    d,1
  1106.     inxix
  1107.     inr    b
  1108. ;
  1109. match39:
  1110.     dcx    h
  1111.     dcx    h
  1112. ;
  1113. match40:
  1114.     inx    h        ; first operand
  1115.     mov    a,m
  1116.     ora    a
  1117.     rz            ; ready if no operands
  1118.     lxiy    opnd1
  1119.     call    insopnd
  1120.     inx    h
  1121.     mov    a,m
  1122.     ora    a
  1123.     rz            ; ready if no second operand
  1124.     lxiy    opnd2
  1125.     call    insopnd
  1126.     ora    a        ; clear carry
  1127.     ret
  1128. ;
  1129. ;    insert operand
  1130. ;
  1131. insopnd:
  1132.     cpi    40h
  1133.     rc            ; no change if register
  1134.     jrz    insopni8
  1135.     cpi    60h
  1136.     jrc    insopni16    ; jump if 16-bit immediate
  1137.     cpi    70h
  1138.     rc            ; ready if IM/BIT
  1139.     jrz    insopnjr    ; jump if jump offset
  1140.     cpi    0a0h
  1141.     rc            ; ready if condition code or (C)
  1142.     jrz    insopni16
  1143.     cpi    0c0h
  1144.     rc            ; ready if AF'
  1145.     rnz            ; ready if not 8-bit port address
  1146. ;
  1147. insopni8:
  1148.     ldy    a,5        ; lower byte of value
  1149. insopnst:
  1150.     stx    a,1        ; store in opcode
  1151.     inxix
  1152.     inr    b
  1153.     ret
  1154. ;
  1155. insopni16:
  1156.     call    insopni8
  1157.     ldy    a,6
  1158.     jr    insopnst
  1159. ;
  1160. insopnjr:
  1161.     lhld    caddress    ; current address
  1162.     inx    h
  1163.     inx    h        ; + 2
  1164.     ldy    e,5
  1165.     ldy    d,6        ; jump address specified
  1166.     xchg
  1167.     ora    a
  1168.     dsbc    d        ; calculate offset
  1169.     jrc    insopnjr1    ; branch if negative offset
  1170.     mov    a,h
  1171.     ora    a
  1172.     jnz    cmderr        ; abort if offset > 255
  1173.     mov    a,l
  1174.     ani    80h
  1175.     jnz    cmderr        ; abort if offset > 127
  1176.     mov    a,l
  1177.     jr    insopnst    ; go store offset
  1178. ;
  1179. insopnjr1:
  1180.     inr    h
  1181.     jnz    cmderr        ; abort if offset < -256
  1182.     mov    a,l
  1183.     ani    80h
  1184.     jz    cmderr        ; abort if offset < -128
  1185.     mov    a,l
  1186.     jr    insopnst    ; go store offset
  1187. ;
  1188. ;
  1189. ;    make8bit:    change operand to conform to 8-bit register
  1190. ;
  1191. make8bit:
  1192.     ora    a
  1193.     stc
  1194.     rz            ; ret if opnd empty
  1195.     cpi    20h
  1196.     jrnc    make810        ; branch if 16-bit
  1197.     cpi    16h
  1198.     cmc
  1199.     rnc            ; ready if B..L
  1200.     cpi    18h        ; A ?
  1201.     stc
  1202.     rnz            ; error if I or R
  1203.     dcr    a
  1204.     ora    a
  1205.     ret            ; A is 17h for opcode
  1206. ;
  1207. make810:
  1208.     cpi    32h        ; must be (HL)
  1209.     stc
  1210.     rnz            ; error if not
  1211.     mvi    a,16h        ; (HL) is 16h for opcode
  1212.     ora    a
  1213.     ret
  1214. ;
  1215. ;------------------------------------------------------------------------------
  1216. ;
  1217. ;    trymatch:    try to match mnemo and operands
  1218. ;
  1219. ;        entry:    C = mnemo
  1220. ;            IX = operand 1 description
  1221. ;            IY = operand 2 description
  1222. ;
  1223. trymatch:
  1224.     mvi    e,3        ; E = length of a table element
  1225.     mvi    d,1        ; D = offset of opcodes within table
  1226.     xra    a
  1227.     sta    opcode        ; init opcode
  1228.     sta    prefix2        ; init opcode prefix
  1229.     lxi    h,tab00$3f
  1230.     mvi    b,ltab00$3f
  1231.     call    srchtab
  1232.     rnc
  1233.     mvi    d,8
  1234.     mvi    b,ltab40$bf
  1235.     call    srchtab
  1236.     rnc
  1237.     mvi    d,1
  1238.     mvi    b,ltabc0$ff
  1239.     call    srchtab
  1240.     rnc
  1241.     xra    a
  1242.     sta    opcode        ; reset opcode
  1243.     mvi    a,0cbh
  1244.     sta    prefix2
  1245.     mvi    d,8
  1246.     lxi    h,tabcb00$ff
  1247.     mvi    b,ltabcb00$ff
  1248.     call    srchtab
  1249.     rnc
  1250. ;
  1251.     mvi    a,0edh
  1252.     sta    prefix2
  1253.     mvi    d,1
  1254.     mvi    e,4
  1255.     lxi    h,tabedpref+1
  1256.     mvi    b,ltabedpref
  1257.     call    srchtab
  1258.     rnc
  1259. ;
  1260.     xra    a
  1261.     sta    prefix2
  1262.     mvi    a,076h            ; HALT opcode
  1263.     sta    opcode
  1264.     mvi    e,3
  1265.     mvi    b,1
  1266.     lxi    h,tab76
  1267. ;
  1268. ;    return via srchtab
  1269. ;
  1270. srchtab:
  1271.     mov    a,m
  1272.     cmp    c        ; compare mnemo
  1273.     jrnz    srcht10
  1274.     call    opmatch        ; try to match operands if same
  1275.     rnc            ; ready if match
  1276. srcht10:
  1277.     mov    a,d        ; else continue: save opcode offset
  1278.     mvi    d,0
  1279.     dad    d        ; next table element
  1280.     mov    d,a
  1281.     push    h
  1282.     lxi    h,opcode
  1283.     add    m        ; increase opcode
  1284.     mov    m,a
  1285.     pop    h
  1286.     djnz    srchtab        ; next
  1287.     stc            ; no match
  1288.     ret            ; return with carry set
  1289. ;
  1290. ;
  1291. ;    opmatch:    try to match operands
  1292. ;
  1293. ;        entry:    HL = opcode descriptor
  1294. ;            IX, IY = operands
  1295. ;
  1296. opmatch:
  1297.     xra    a
  1298.     sta    prefix
  1299.     push    b
  1300.     push    d
  1301.     push    h            ; save everything
  1302.     pushix
  1303.     inx    h            ; first operand
  1304.     mov    b,m
  1305.     call    tryopnd
  1306.     jrc    opmatchret        ; return with error if no match
  1307.     inx    h
  1308.     mov    b,m            ; second operand
  1309.     pushiy
  1310.     popix
  1311.     call    tryopnd
  1312. opmatchret:
  1313.     popix
  1314.     pop    h
  1315.     pop    d
  1316.     pop    b
  1317.     ret
  1318. ;
  1319. ;
  1320. ;    tryopnd:    try to match operand
  1321. ;
  1322. ;        entry:    B = operand descriptor byte
  1323. ;            IX = operand
  1324. ;
  1325. tryopnd:
  1326.     mov    a,b
  1327.     ora    a
  1328.     jrnz    tryopnd10
  1329. tryopndnull:
  1330.     orx    1
  1331.     orx    4
  1332.     orx    7
  1333.     rz            ; match if no operand
  1334.     stc
  1335.     ret            ; else no match
  1336. ;
  1337. tryopnd10:
  1338.     cpi    40h
  1339.     jrnc    tryopnd20    ; branch if not register
  1340.     cmpx    1        ; compare
  1341.     jrz    tryopndisreg    ; ok if match
  1342.     cpi    1fh
  1343.     stc
  1344.     rnz            ; no match if not undetermined 8-bit reg
  1345.     ldx    a,1
  1346.     call    make8bit
  1347.     rc            ; error if no 8-bit reg
  1348. tryopndisreg:
  1349.     ldx    a,0
  1350.     ora    a
  1351.     rz            ; match if no prefix
  1352.     sta    prefix        ; store prefix
  1353.     ret            ; ready
  1354. ;
  1355. tryopnd20:
  1356.     jrz    tryopndimm    ; branch if immediate 8-bit (40)
  1357.     ani    0f0h
  1358.     cpi    60h
  1359.     jrc    tryopndimm    ; branch if immediate 16-bit (5x)
  1360.     jrz    tryopndbitim    ; branch if bit/int-mode (6x)
  1361.     cpi    80h
  1362.     jrc    tryopndimm    ; immediate (70)
  1363.     jrz    tryopndcc    ; cond-code (8x)
  1364.     cpi    0a0h        ; address ?
  1365.     jrc    tryopndcmp    ; (C) (90)
  1366.     jrz    tryopndaddr    ; address (A0)
  1367.     cpi    0c0h        ; 8-bit address ?
  1368.     jrc    tryopndcmp    ; AF (B0)
  1369.     jrz    tryopndaddr    ; 8-bit-address    (C0)
  1370.     cpi    0d0h
  1371.     mvi    a,0
  1372.     jrnz    tryopndnull    ; > D0 is no real operand
  1373. ;
  1374. ;    Dx: restart
  1375. ;
  1376.     ldx    a,4
  1377.     cpi    50h        ; must be immediate value
  1378.     stc
  1379.     rnz
  1380.     ldx    a,6
  1381.     ora    a
  1382.     stc
  1383.     rnz            ; error if > 255
  1384.     ldx    a,5
  1385.     mvi    c,0
  1386. tryopndrst:
  1387.     sui    8
  1388.     jrc    tryopndrst1
  1389.     inr    c
  1390.     jr    tryopndrst
  1391. tryopndrst1:
  1392.     adi    8
  1393.     stc
  1394.     rnz            ; error if not divisible by 8
  1395.     mov    a,c
  1396.     ori    0d0h
  1397.     cmp    b
  1398.     rz
  1399.     stc
  1400.     ret
  1401. ;
  1402. tryopndcc:
  1403.     ldx    a,7
  1404. tryopndcc1:
  1405.     cmp    b
  1406.     rz
  1407.     stc
  1408.     ret
  1409. ;
  1410. tryopndcmp:
  1411.     ldx    a,1
  1412.     jr    tryopndcc1
  1413. ;
  1414. tryopndimm:
  1415.     ldx    a,4
  1416.     cpi    50h
  1417.     jrz    tryopndimrp
  1418.     stc
  1419.     ret
  1420. ;
  1421. tryopndaddr:
  1422.     ldx    a,4
  1423.     cpi    0a0h
  1424.     jrz    tryopndimrp
  1425.     stc
  1426.     ret
  1427. ;
  1428. tryopndimrp:
  1429.     lda    regpref        ; register preference ?
  1430.     ora    a
  1431.     rz            ; match ok if not
  1432.     ldx    a,1        ; is it a register ?
  1433.     ora    a
  1434.     rz            ; ret with match if not a register
  1435.     stc
  1436.     ret            ; ret with no match if register operand
  1437. ;
  1438. tryopndbitim:
  1439.     ldx    a,4
  1440.     cpi    50h
  1441.     stc
  1442.     rnz            ; must be value
  1443.     ldx    a,6
  1444.     ora    a
  1445.     stc
  1446.     rnz            ; must be < 255
  1447.     ldx    a,5
  1448.     cpi    8
  1449.     cmc
  1450.     rc            ; must be <= 7
  1451.     ori    60h
  1452.     jr    tryopndcc1
  1453. ;
  1454. ;------------------------------------------------------------------------------
  1455. ;
  1456.     dseg
  1457. ;
  1458. prefix    ds    1
  1459. offset    ds    1
  1460. condit    ds    1
  1461. caddress    ds    2
  1462. ;
  1463. jumpaddr    ds    2
  1464. jumpmark    ds    1
  1465. ;
  1466. opdesc    ds    8
  1467. ;
  1468. prefix2        equ    offset
  1469. opcode        equ    condit
  1470. regpref        equ    opdesc
  1471. ;
  1472.     end
  1473. 
  1474.