Subversion Repositories pentevo

Rev

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

  1. ;        title   'Z80 full instruction set exerciser for Spectrum'
  2.  
  3. ; zexall.src - Z80 full instruction set exerciser
  4. ; Copyright (C) 1994  Frank D. Cringle
  5. ;
  6. ; 03-Nov-2002: Modified to assemble with ZMAC and MAXAM
  7. ; Copyright (C) 2002 J.G.Harston
  8. ; + labels on equates mustn't have trailing colon
  9. ; + macros don't understand <...> sequence, so parameters are passed
  10. ;   explicitly
  11. ; + ds n,c not supported, so strings are set to full explicit length
  12. ; + nonstandard 'cp a,' and 'and a,' changed to 'cp ' and 'and '
  13. ;
  14. ; 03-Nov-2002: Modified to run on Spectrum
  15. ; Copyright (C) 2002 J.G.Harston
  16. ;
  17. ; 23-May-2007: Updated reference CRCs and fixed use of EI/DI
  18. ; (by Stuart Brady)
  19. ;
  20. ; This program is free software; you can redistribute it and/or
  21. ; modify it under the terms of the GNU General Public License
  22. ; as published by the Free Software Foundation; either version 2
  23. ; of the License, or (at your option) any later version.
  24. ;
  25. ; This program is distributed in the hope that it will be useful,
  26. ; but WITHOUT ANY WARRANTY; without even the implied warranty of
  27. ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  28. ; GNU General Public License for more details.
  29. ;
  30. ; You should have received a copy of the GNU General Public License
  31. ; along with this program; if not, write to the Free Software
  32. ; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  33.  
  34. ;        aseg
  35.         org     8000h
  36.  
  37.         jp      start
  38.  
  39. ; machine state before test (needs to be at predictably constant address)
  40. msbt:   db      14 dup (0)
  41. spbt:   db      2 dup (0)
  42. msbthi  equ     msbt / 0100h
  43. msbtlo  equ     msbt & 0ffh
  44.  
  45.  
  46. ; For the purposes of this test program, the machine state consists of:
  47. ;       a 2 byte memory operand, followed by
  48. ;       the registers iy,ix,hl,de,bc,af,sp
  49. ; for a total of 16 bytes.
  50.  
  51. ; The program tests instructions (or groups of similar instructions)
  52. ; by cycling through a sequence of machine states, executing the test
  53. ; instruction for each one and running a 32-bit crc over the resulting
  54. ; machine states.  At the end of the sequence the crc is compared to
  55. ; an expected value that was found empirically on a real Z80.
  56.  
  57. ; A test case is defined by a descriptor which consists of:
  58. ;       a flag mask byte,
  59. ;       the base case,
  60. ;       the incement vector,
  61. ;       the shift vector,
  62. ;       the expected crc,
  63. ;       a short descriptive message.
  64. ;
  65. ; The flag mask byte is used to prevent undefined flag bits from
  66. ; influencing the results.  Documented flags are as per Mostek Z80
  67. ; Technical Manual.
  68. ;
  69. ; The next three parts of the descriptor are 20 byte vectors
  70. ; corresponding to a 4 byte instruction and a 16 byte machine state.
  71. ; The first part is the base case, which is the first test case of
  72. ; the sequence.  This base is then modified according to the next 2
  73. ; vectors.  Each 1 bit in the increment vector specifies a bit to be
  74. ; cycled in the form of a binary counter.  For instance, if the byte
  75. ; corresponding to the accumulator is set to 0ffh in the increment
  76. ; vector, the test will be repeated for all 256 values of the
  77. ; accumulator.  Note that 1 bits don't have to be contiguous.  The
  78. ; number of test cases 'caused' by the increment vector is equal to
  79. ; 2^(number of 1 bits).  The shift vector is similar, but specifies a
  80. ; set of bits in the test case that are to be successively inverted.
  81. ; Thus the shift vector 'causes' a number of test cases equal to the
  82. ; number of 1 bits in it.
  83.  
  84. ; The total number of test cases is the product of those caused by the
  85. ; counter and shift vectors and can easily become unweildy.  Each
  86. ; individual test case can take a few milliseconds to execute, due to
  87. ; the overhead of test setup and crc calculation, so test design is a
  88. ; compromise between coverage and execution time.
  89.  
  90. ; This program is designed to detect differences between
  91. ; implementations and is not ideal for diagnosing the causes of any
  92. ; discrepancies.  However, provided a reference implementation (or
  93. ; real system) is available, a failing test case can be isolated by
  94. ; hand using a binary search of the test space.
  95.  
  96.  
  97. start:  ; ld    hl,(6)
  98.         ld      hl,08000h       ; put stack at top of 32k
  99.         ld      sp,hl
  100.         ld      a,2
  101.         call    01601h          ; open stream 2 (screen)
  102.         di                      ; ensure INTs don't mess with test
  103.         ld      de,msg1
  104.         ld      c,9
  105.         call    bdos
  106.  
  107.         ld      hl,tests        ; first test case
  108. loop:   ld      a,(hl)          ; end of list ?
  109.         inc     hl
  110.         or      (hl)
  111.         jp      z,done
  112.         dec     hl
  113.         call    stt
  114.         jp      loop
  115.  
  116. done:   ld      de,msg2
  117.         ld      c,9
  118.         call    bdos
  119. stop:
  120.         jp      stop            ; wait for reset
  121.  
  122. tests:
  123.         dw      adc16
  124.         dw      add16
  125.         dw      add16x
  126.         dw      add16y
  127.         dw      alu8i
  128.         dw      alu8r
  129.         dw      alu8rx
  130.         dw      alu8x
  131.         dw      bitx
  132.         dw      bitz80
  133.         dw      cpd1
  134.         dw      cpi1
  135.         dw      daaop           ; can't use opcode as label
  136.         dw      inca
  137.         dw      incb
  138.         dw      incbc
  139.         dw      incc
  140.         dw      incd
  141.         dw      incde
  142.         dw      ince
  143.         dw      inch
  144.         dw      inchl
  145.         dw      incix
  146.         dw      inciy
  147.         dw      incl
  148.         dw      incm
  149.         dw      incsp
  150.         dw      incx
  151.         dw      incxh
  152.         dw      incxl
  153.         dw      incyh
  154.         dw      incyl
  155.         dw      ld161
  156.         dw      ld162
  157.         dw      ld163
  158.         dw      ld164
  159.         dw      ld165
  160.         dw      ld166
  161.         dw      ld167
  162.         dw      ld168
  163.         dw      ld16im
  164.         dw      ld16ix
  165.         dw      ld8bd
  166.         dw      ld8im
  167.         dw      ld8imx
  168.         dw      ld8ix1
  169.         dw      ld8ix2
  170.         dw      ld8ix3
  171.         dw      ld8ixy
  172.         dw      ld8rr
  173.         dw      ld8rrx
  174.         dw      lda
  175.         dw      ldd1
  176.         dw      ldd2
  177.         dw      ldi1
  178.         dw      ldi2
  179.         dw      negop           ; jgh: can't use opcode as label
  180.         dw      rldop           ; jgh: can't use opcode as label
  181.         dw      rot8080
  182.         dw      rotxy
  183.         dw      rotz80
  184.         dw      srz80
  185.         dw      srzx
  186.         dw      st8ix1
  187.         dw      st8ix2
  188.         dw      st8ix3
  189.         dw      stabd
  190.         dw      0
  191.  
  192. ; jgh: macro syntax changed for ZMAC and MAXAM
  193. ;       can't use opcodes as labels
  194. ;       ZMAC allows &nn as hex, so & removed from local labels
  195. ;
  196. tstr    macro   insn1,insn2,insn3,insn4,memop,riy,rix,rhl,rde,rbc,flags,acc,rsp
  197. .lab:   db      insn1,insn2,insn3,insn4
  198.         dw      memop,riy,rix,rhl,rde,rbc
  199.         db      flags
  200.         db      acc
  201.         dw      rsp
  202.         if      ($-.lab) <> 20
  203.         error   "missing parameter"
  204.         endif
  205.         endm
  206.  
  207. tmsg    macro   msg
  208. .lab:   db      msg
  209. ;zexfix        if      $ >= (.lab+31)
  210.         if      $ >= (.lab+30)          ;zexfix
  211.         error   "message too long"
  212.         else
  213. ;zexfix        db      .lab+30-$ dup (2eh)
  214.         db      .lab+29-$ dup (2eh)     ;zexfix
  215.         endif
  216.         db      "$"
  217.         endm
  218.  
  219. ; jgh: ZMAC/MAXAM don't recognise <n,m> syntax for macros, so full parameters given
  220. ; jgh: each tmsg has full string, as ZMAC/MAXAM don't have ds n,c pseudo-op
  221.  
  222. ; <adc,sbc> hl,<bc,de,hl,sp> (38,912 cycles)
  223. adc16:  db      0ffh            ; flag mask
  224.         tstr    0edh,042h,0,0,0832ch,04f88h,0f22bh,0b339h,07e1fh,01563h,0d3h,089h,0465eh
  225.         tstr    0,038h,0,0,0,0,0,0f821h,0,0,0,0,0       ; (1024 cycles)
  226.         tstr    0,0,0,0,0,0,0,-1,-1,-1,0d7h,0,-1        ; (38 cycles)
  227.         db      0d4h,08ah,0d5h,019h                     ; expected crc
  228.         tmsg    "<adc,sbc> hl,<bc,de,hl,sp>"
  229.  
  230. ; add hl,<bc,de,hl,sp> (19,456 cycles)
  231. add16:  db      0ffh            ; flag mask
  232.         tstr    9,0,0,0,0c4a5h,0c4c7h,0d226h,0a050h,058eah,08566h,0c6h,0deh,09bc9h
  233.         tstr    030h,0,0,0,0,0,0,0f821h,0,0,0,0,0       ; (512 cycles)
  234.         tstr    0,0,0,0,0,0,0,-1,-1,-1,0d7h,0,-1        ; (38 cycles)
  235.         db      0d9h,0a4h,0cah,005h                     ; expected crc
  236.         tmsg    "add hl,<bc,de,hl,sp>"
  237.  
  238. ; add ix,<bc,de,ix,sp> (19,456 cycles)
  239. add16x: db      0ffh            ; flag mask
  240.         tstr    0ddh,9,0,0,0ddach,0c294h,0635bh,033d3h,06a76h,0fa20h,094h,068h,036f5h
  241.         tstr    0,030h,0,0,0,0,0f821h,0,0,0,0,0,0       ; (512 cycles)
  242.         tstr    0,0,0,0,0,0,-1,0,-1,-1,0d7h,0,-1        ; (38 cycles)
  243.         db      0b1h,0dfh,08eh,0c0h                     ; expected crc
  244.         tmsg    "add ix,<bc,de,ix,sp>"
  245.  
  246. ; add iy,<bc,de,iy,sp> (19,456 cycles)
  247. add16y: db      0ffh            ; flag mask
  248.         tstr    0fdh,9,0,0,0c7c2h,0f407h,051c1h,03e96h,00bf4h,0510fh,092h,01eh,071eah
  249.         tstr    0,030h,0,0,0,0f821h,0,0,0,0,0,0,0       ; (512 cycles)
  250.         tstr    0,0,0,0,0,-1,0,0,-1,-1,0d7h,0,-1        ; (38 cycles)
  251.         db      039h,0c8h,058h,09bh                     ; expected crc
  252.         tmsg    "add iy,<bc,de,iy,sp>"
  253.  
  254. ; aluop a,nn (28,672 cycles)
  255. alu8i:  db      0ffh            ; flag mask
  256.         tstr    0c6h,0,0,0,009140h,07e3ch,07a67h,0df6dh,05b61h,00b29h,010h,066h,085b2h
  257.         tstr    038h,0,0,0,0,0,0,0,0,0,0,-1,0           ; (2048 cycles)
  258.         tstr    0,-1,0,0,0,0,0,0,0,0,0d7h,0,0           ; (14 cycles)
  259.         db      051h,0c1h,09ch,02eh                     ; expected crc
  260.         tmsg    "aluop a,nn"
  261.  
  262. ; aluop a,<b,c,d,e,h,l,(hl),a> (753,664 cycles)
  263. alu8r:  db      0ffh            ; flag mask
  264.         tstr    080h,0,0,0,0c53eh,0573ah,04c4dh,msbt,0e309h,0a666h,0d0h,03bh,0adbbh
  265.         tstr    03fh,0,0,0,0,0,0,0,0,0,0,-1,0           ; (16,384 cycles)
  266.         tstr    0,0,0,0,0ffh,0,0,0,-1,-1,0d7h,0,0       ; (46 cycles)
  267.         db      01dh,0fdh,078h,064h                     ; expected crc
  268.         tmsg    "aluop a,<b,c,d,e,h,l,(hl),a>"
  269.  
  270. ; aluop a,<ixh,ixl,iyh,iyl> (376,832 cycles)
  271. alu8rx: db      0ffh            ; flag mask
  272.         tstr    0ddh,084h,0,0,0d6f7h,0c76eh,0accfh,02847h,022ddh,0c035h,0c5h,038h,0234bh
  273.         tstr    020h,039h,0,0,0,0,0,0,0,0,0,-1,0        ; (8,192 cycles)
  274.         tstr    0,0,0,0,0ffh,0,0,0,-1,-1,0d7h,0,0       ; (46 cycles)
  275.         db      0a8h,086h,0cch,044h                     ; expected crc
  276.         tmsg    "aluop a,<ixh,ixl,iyh,iyl>"
  277.  
  278. ; aluop a,(<ix,iy>+1) (229,376 cycles)
  279. alu8x:  db      0ffh            ; flag mask
  280.         tstr    0ddh,086h,1,0,090b7h,msbt-1,msbt-1,032fdh,0406eh,0c1dch,045h,06eh,0e5fah
  281.         tstr    020h,038h,0,0,0,1,1,0,0,0,0,-1,0        ; (16,384 cycles)
  282.         tstr    0,0,0,0,0ffh,0,0,0,0,0,0d7h,0,0         ; (14 cycles)
  283.         db      052h,018h,05eh,0a5h                     ; expected crc
  284.         tmsg    "aluop a,(<ix,iy>+1)"
  285.  
  286. ; bit n,(<ix,iy>+1) (2048 cycles)
  287. bitx:   db      0ffh            ; flag mask
  288.         tstr    0ddh,0cbh,1,046h,02075h,msbt-1,msbt-1,03cfch,0a79ah,03d74h,051h,027h,0ca14h
  289.         tstr    020h,0,0,038h,0,0,0,0,0,0,053h,0,0      ; (256 cycles)
  290.         tstr    0,0,0,0,0ffh,0,0,0,0,0,0,0,0            ; (8 cycles)
  291.         db      0e1h,0d4h,0a8h,096h                     ; expected crc
  292.         tmsg    "bit n,(<ix,iy>+1)"
  293.  
  294. ; bit n,<b,c,d,e,h,l,(hl),a> (49,152 cycles)
  295. bitz80: db      0ffh            ; flag mask
  296.         tstr    0cbh,040h,0,0,03ef1h,09dfch,07acch,msbt,0be61h,07a86h,050h,024h,01998h
  297.         tstr    0,03fh,0,0,0,0,0,0,0,0,053h,0,0         ; (1024 cycles)
  298.         tstr    0,0,0,0,0ffh,0,0,0,-1,-1,0,-1,0         ; (48 cycles)
  299.         db      0f5h,054h,0d7h,042h                     ; expected crc
  300.         tmsg    "bit n,<b,c,d,e,h,l,(hl),a>"
  301.  
  302. ; cpd<r> (1) (6144 cycles)
  303. cpd1:   db      0ffh            ; flag mask
  304.         tstr    0edh,0a9h,0,0,0c7b6h,072b4h,018f6h,msbt+17,08dbdh,1,0c0h,030h,094a3h
  305.         tstr    0,010h,0,0,0,0,0,0,0,010,0,-1,0         ; (1024 cycles)
  306.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  307.         db      0d0h,06bh,09ch,015h                     ; expected crc
  308.         tmsg    "cpd<r>"
  309.  
  310. ; cpi<r> (1) (6144 cycles)
  311. cpi1:   db      0ffh            ; flag mask
  312.         tstr    0edh,0a1h,0,0,04d48h,0af4ah,0906bh,msbt,04e71h,1,093h,06ah,0907ch
  313.         tstr    0,010h,0,0,0,0,0,0,0,010,0,-1,0         ; (1024 cycles)
  314.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  315.         db      068h,03eh,07bh,02ah                     ; expected crc
  316.         tmsg    "cpi<r>"
  317.  
  318. ; <daa,cpl,scf,ccf>
  319. daaop:  db      0ffh            ; flag mask
  320.         tstr    027h,0,0,0,02141h,009fah,01d60h,0a559h,08d5bh,09079h,004h,08eh,0299dh
  321.         tstr    018h,0,0,0,0,0,0,0,0,0,0d7h,-1,0        ; (65,536 cycles)
  322.         tstr    0,0,0,0,0,0,0,0,0,0,0,0,0               ; (1 cycle)
  323.         db      06dh,02dh,0d2h,013h                     ; expected crc
  324.         tmsg    "<daa,cpl,scf,ccf>"
  325.  
  326. ; <inc,dec> a (3072 cycles)
  327. inca:   db      0ffh            ; flag mask
  328.         tstr    03ch,0,0,0,04adfh,0d5d8h,0e598h,08a2bh,0a7b0h,0431bh,044h,05ah,0d030h
  329.         tstr    001h,0,0,0,0,0,0,0,0,0,0,-1,0           ; (512 cycles)
  330.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  331.         db      081h,0fah,081h,000h                     ; expected crc
  332.         tmsg    "<inc,dec> a"
  333.  
  334. ; <inc,dec> b (3072 cycles)
  335. incb:   db      0ffh            ; flag mask
  336.         tstr    004h,0,0,0,0d623h,0432dh,07a61h,08180h,05a86h,01e85h,086h,058h,09bbbh
  337.         tstr    001h,0,0,0,0,0,0,0,0,0ff00h,0,0,0       ; (512 cycles)
  338.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  339.         db      077h,0f3h,05ah,073h                     ; expected crc
  340.         tmsg    "<inc,dec> b"
  341.  
  342. ; <inc,dec> bc (1536 cycles)
  343. incbc:  db      0ffh            ; flag mask
  344.         tstr    003h,0,0,0,0cd97h,044abh,08dc9h,0e3e3h,011cch,0e8a4h,002h,049h,02a4dh
  345.         tstr    008h,0,0,0,0,0,0,0,0,0f821h,0,0,0       ; (256 cycles)
  346.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  347.         db      0d2h,0aeh,03bh,0ech                     ; expected crc
  348.         tmsg    "<inc,dec> bc"
  349.  
  350. ; <inc,dec> c (3072 cycles)
  351. incc:   db      0ffh            ; flag mask
  352.         tstr    00ch,0,0,0,0d789h,00935h,0055bh,09f85h,08b27h,0d208h,095h,005h,00660h
  353.         tstr    001h,0,0,0,0,0,0,0,0,0ffh,0,0,0         ; (512 cycles)
  354.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  355.         db      01ah,0f6h,012h,0a7h                     ; expected crc
  356.         tmsg    "<inc,dec> c"
  357.  
  358. ; <inc,dec> d (3072 cycles)
  359. incd:   db      0ffh            ; flag mask
  360.         tstr    014h,0,0,0,0a0eah,05fbah,065fbh,0981ch,038cch,0debch,043h,05ch,003bdh
  361.         tstr    001h,0,0,0,0,0,0,0,0ff00h,0,0,0,0       ; (512 cycles)
  362.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  363.         db      0d1h,046h,0bfh,051h                     ; expected crc
  364.         tmsg    "<inc,dec> d"
  365.  
  366. ; <inc,dec> de (1536 cycles)
  367. incde:  db      0ffh            ; flag mask
  368.         tstr    013h,0,0,0,0342eh,0131dh,028c9h,00acah,09967h,03a2eh,092h,0f6h,09d54h
  369.         tstr    008h,0,0,0,0,0,0,0,0f821h,0,0,0,0       ; (256 cycles)
  370.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  371.         db      0aeh,0c6h,0d4h,02ch                     ; expected crc
  372.         tmsg    "<inc,dec> de"
  373.  
  374. ; <inc,dec> e (3072 cycles)
  375. ince:   db      0ffh            ; flag mask
  376.         tstr    01ch,0,0,0,0602fh,04c0dh,02402h,0e2f5h,0a0f4h,0a10ah,013h,032h,05925h
  377.         tstr    001h,0,0,0,0,0,0,0,0ffh,0,0,0,0         ; (512 cycles)
  378.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  379.         db      0cah,08ch,06ah,0c2h                     ; expected crc
  380.         tmsg    "<inc,dec> e"
  381.  
  382. ; <inc,dec> h (3072 cycles)
  383. inch:   db      0ffh            ; flag mask
  384.         tstr    024h,0,0,0,01506h,0f2ebh,0e8ddh,0262bh,011a6h,0bc1ah,017h,006h,02818h
  385.         tstr    001h,0,0,0,0,0,0,0ff00h,0,0,0,0,0       ; (512 cycles)
  386.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  387.         db      056h,00fh,095h,05eh                     ; expected crc
  388.         tmsg    "<inc,dec> h"
  389.  
  390. ; <inc,dec> hl (1536 cycles)
  391. inchl:  db      0ffh            ; flag mask
  392.         tstr    023h,0,0,0,0c3f4h,007a5h,01b6dh,04f04h,0e2c2h,0822ah,057h,0e0h,0c3e1h
  393.         tstr    008h,0,0,0,0,0,0,0f821h,0,0,0,0,0       ; (256 cycles)
  394.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  395.         db      0fch,00dh,06dh,04ah                     ; expected crc
  396.         tmsg    "<inc,dec> hl"
  397.  
  398. ; <inc,dec> ix (1536 cycles)
  399. incix:  db      0ffh            ; flag mask
  400.         tstr    0ddh,023h,0,0,0bc3ch,00d9bh,0e081h,0adfdh,09a7fh,096e5h,013h,085h,00be2h
  401.         tstr    0,8,0,0,0,0,0f821h,0,0,0,0,0,0          ; (256 cycles)
  402.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  403.         db      0a5h,04dh,0beh,031h                     ; expected crc
  404.         tmsg    "<inc,dec> ix"
  405.  
  406. ; <inc,dec> iy (1536 cycles)
  407. inciy:  db      0ffh            ; flag mask
  408.         tstr    0fdh,023h,0,0,09402h,0637ah,03182h,0c65ah,0b2e9h,0abb4h,016h,0f2h,06d05h
  409.         tstr    0,8,0,0,0,0f821h,0,0,0,0,0,0,0          ; (256 cycles)
  410.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  411.         db      050h,05dh,051h,0a3h                     ; expected crc
  412.         tmsg    "<inc,dec> iy"
  413.  
  414. ; <inc,dec> l (3072 cycles)
  415. incl:   db      0ffh            ; flag mask
  416.         tstr    02ch,0,0,0,08031h,0a520h,04356h,0b409h,0f4c1h,0dfa2h,0d1h,03ch,03ea2h
  417.         tstr    001h,0,0,0,0,0,0,0ffh,0,0,0,0,0         ; (512 cycles)
  418.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  419.         db      0a0h,0a1h,0b4h,09fh                     ; expected crc
  420.         tmsg    "<inc,dec> l"
  421.  
  422. ; <inc,dec> (hl) (3072 cycles)
  423. incm:   db      0ffh            ; flag mask
  424.         tstr    034h,0,0,0,0b856h,00c7ch,0e53eh,msbt,0877eh,0da58h,015h,05ch,01f37h
  425.         tstr    001h,0,0,0,0ffh,0,0,0,0,0,0,0,0         ; (512 cycles)
  426.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  427.         db      01ch,0a0h,0ech,0e9h                     ; expected crc
  428.         tmsg    "<inc,dec> (hl)"
  429.  
  430. ; <inc,dec> sp (1536 cycles)
  431. incsp:  db      0ffh            ; flag mask
  432.         tstr    033h,0,0,0,0346fh,0d482h,0d169h,0deb6h,0a494h,0f476h,053h,002h,0855bh
  433.         tstr    008h,0,0,0,0,0,0,0,0,0,0,0,0f821h       ; (256 cycles)
  434.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  435.         db      05dh,0ach,0d5h,027h                     ; expected crc
  436.         tmsg    "<inc,dec> sp"
  437.  
  438. ; <inc,dec> (<ix,iy>+1) (6144 cycles)
  439. incx:   db      0ffh            ; flag mask
  440.         tstr    0ddh,034h,1,0,0fa6eh,msbt-1,msbt-1,02c28h,08894h,05057h,016h,033h,0286fh
  441.         tstr    020h,1,0,0,0ffh,0,0,0,0,0,0,0,0         ; (1024 cycles)
  442.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  443.         db      0ffh,060h,016h,065h                     ; expected crc
  444.         tmsg    "<inc,dec> (<ix,iy>+1)"
  445.  
  446. ; <inc,dec> ixh (3072 cycles)
  447. incxh:  db      0ffh            ; flag mask
  448.         tstr    0ddh,024h,0,0,0b838h,0316ch,0c6d4h,03e01h,08358h,015b4h,081h,0deh,04259h
  449.         tstr    0,1,0,0,0,0ff00h,0,0,0,0,0,0,0          ; (512 cycles)
  450.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  451.         db      06fh,046h,036h,062h                     ; expected crc
  452.         tmsg    "<inc,dec> ixh"
  453.  
  454. ; <inc,dec> ixl (3072 cycles)
  455. incxl:  db      0ffh            ; flag mask
  456.         tstr    0ddh,02ch,0,0,04d14h,07460h,076d4h,006e7h,032a2h,0213ch,0d6h,0d7h,099a5h
  457.         tstr    0,1,0,0,0,0ffh,0,0,0,0,0,0,0            ; (512 cycles)
  458.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  459.         db      002h,07bh,0efh,02ch                     ; expected crc
  460.         tmsg    "<inc,dec> ixl"
  461.  
  462. ; <inc,dec> iyh (3072 cycles)
  463. incyh:  db      0ffh            ; flag mask
  464.         tstr    0ddh,024h,0,0,02836h,09f6fh,09116h,061b9h,082cbh,0e219h,092h,073h,0a98ch
  465.         tstr    0,1,0,0,0ff00h,0,0,0,0,0,0,0,0          ; (512 cycles)
  466.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  467.         db      02dh,096h,06ch,0f3h                     ; expected crc
  468.         tmsg    "<inc,dec> iyh"
  469.  
  470. ; <inc,dec> iyl (3072 cycles)
  471. incyl:  db      0ffh            ; flag mask
  472.         tstr    0ddh,02ch,0,0,0d7c6h,062d5h,0a09eh,07039h,03e7eh,09f12h,090h,0d9h,0220fh
  473.         tstr    0,1,0,0,0ffh,0,0,0,0,0,0,0,0            ; (512 cycles)
  474.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  475.         db      036h,0c1h,01eh,075h                     ; expected crc
  476.         tmsg    "<inc,dec> iyl"
  477.  
  478. ; ld <bc,de>,(nnnn) (32 cycles)
  479. ld161:  db      0ffh            ; flag mask
  480.         tstr    0edh,04bh,msbtlo,msbthi,0f9a8h,0f559h,093a4h,0f5edh,06f96h,0d968h,086h,0e6h,04bd8h
  481.         tstr    0,010h,0,0,0,0,0,0,0,0,0,0,0            ; (2 cycles)
  482.         tstr    0,0,0,0,-1,0,0,0,0,0,0,0,0              ; (16 cycles)
  483.         db      04dh,045h,0a9h,0ach                     ; expected crc
  484.         tmsg    "ld <bc,de>,(nnnn)"
  485.  
  486. ; ld hl,(nnnn) (16 cycles)
  487. ld162:  db      0ffh            ; flag mask
  488.         tstr    02ah,msbtlo,msbthi,0,09863h,07830h,02077h,0b1feh,0b9fah,0abb8h,004h,006h,06015h
  489.         tstr    0,0,0,0,0,0,0,0,0,0,0,0,0               ; (1 cycle)
  490.         tstr    0,0,0,0,-1,0,0,0,0,0,0,0,0              ; (16 cycles)
  491.         db      05fh,097h,024h,087h                     ; expected crc
  492.         tmsg    "ld hl,(nnnn)"
  493.  
  494. ; ld sp,(nnnn) (16 cycles)
  495. ld163:  db      0ffh            ; flag mask
  496.         tstr    0edh,07bh,msbtlo,msbthi,08dfch,057d7h,02161h,0ca18h,0c185h,027dah,083h,01eh,0f460h
  497.         tstr    0,0,0,0,0,0,0,0,0,0,0,0,0               ; (1 cycles)
  498.         tstr    0,0,0,0,-1,0,0,0,0,0,0,0,0              ; (16 cycles)
  499.         db      07ah,0ceh,0a1h,01bh                     ; expected crc
  500.         tmsg    "ld sp,(nnnn)"
  501.  
  502. ; ld <ix,iy>,(nnnn) (32 cycles)
  503. ld164:  db      0ffh            ; flag mask
  504.         tstr    0ddh,02ah,msbtlo,msbthi,0ded7h,0a6fah,0f780h,0244ch,087deh,0bcc2h,016h,063h,04c96h
  505.         tstr    020h,0,0,0,0,0,0,0,0,0,0,0,0            ; (2 cycles)
  506.         tstr    0,0,0,0,-1,0,0,0,0,0,0,0,0              ; (16 cycles)
  507.         db      085h,08bh,0f1h,06dh                     ; expected crc
  508.         tmsg    "ld <ix,iy>,(nnnn)"
  509.  
  510. ; ld (nnnn),<bc,de> (64 cycles)
  511. ld165:  db      0ffh            ; flag mask
  512.         tstr    0edh,043h,msbtlo,msbthi,01f98h,0844dh,0e8ach,0c9edh,0c95dh,08f61h,080h,03fh,0c7bfh
  513.         tstr    0,010h,0,0,0,0,0,0,0,0,0,0,0            ; (2 cycles)
  514.         tstr    0,0,0,0,0,0,0,0,-1,-1,0,0,0             ; (32 cycles)
  515.         db      064h,01eh,087h,015h                     ; expected crc
  516.         tmsg    "ld (nnnn),<bc,de>"
  517.  
  518. ; ld (nnnn),hl (16 cycles)
  519. ld166:  db      0ffh            ; flag mask
  520.         tstr    022h,msbtlo,msbthi,0,0d003h,07772h,07f53h,03f72h,064eah,0e180h,010h,02dh,035e9h
  521.         tstr    0,0,0,0,0,0,0,0,0,0,0,0,0               ; (1 cycle)
  522.         tstr    0,0,0,0,0,0,0,-1,0,0,0,0,0              ; (16 cycles)
  523.         db      0a3h,060h,08bh,047h                     ; expected crc
  524.         tmsg    "ld (nnnn),hl"
  525.  
  526. ; ld (nnnn),sp (16 cycles)
  527. ld167:  db      0ffh            ; flag mask
  528.         tstr    0edh,073h,msbtlo,msbthi,0c0dch,0d1d6h,0ed5ah,0f356h,0afdah,06ca7h,044h,09fh,03f0ah
  529.         tstr    0,0,0,0,0,0,0,0,0,0,0,0,0               ; (1 cycle)
  530.         tstr    0,0,0,0,0,0,0,0,0,0,0,0,-1              ; (16 cycles)
  531.         db      016h,058h,05fh,0d7h                     ; expected crc
  532.         tmsg    "ld (nnnn),sp"
  533.  
  534. ; ld (nnnn),<ix,iy> (64 cycles)
  535. ld168:  db      0ffh            ; flag mask
  536.         tstr    0ddh,022h,msbtlo,msbthi,06cc3h,00d91h,06900h,08ef8h,0e3d6h,0c3f7h,0c6h,0d9h,0c2dfh
  537.         tstr    020h,0,0,0,0,0,0,0,0,0,0,0,0            ; (2 cycles)
  538.         tstr    0,0,0,0,0,-1,-1,0,0,0,0,0,0             ; (32 cycles)
  539.         db      0bah,010h,02ah,06bh                     ; expected crc
  540.         tmsg    "ld (nnnn),<ix,iy>"
  541.  
  542. ; ld <bc,de,hl,sp>,nnnn (64 cycles)
  543. ld16im: db      0ffh            ; flag mask
  544.         tstr    1,0,0,0,05c1ch,02d46h,08eb9h,06078h,074b1h,0b30eh,046h,0d1h,030cch
  545.         tstr    030h,0,0,0,0,0,0,0,0,0,0,0,0            ; (4 cycles)
  546.         tstr    0,0ffh,0ffh,0,0,0,0,0,0,0,0,0,0         ; (16 cycles)
  547.         db      0deh,039h,019h,069h                     ; expected crc
  548.         tmsg    "ld <bc,de,hl,sp>,nnnn"
  549.  
  550. ; ld <ix,iy>,nnnn (32 cycles)
  551. ld16ix: db      0ffh            ; flag mask
  552.         tstr    0ddh,021h,0,0,087e8h,02006h,0bd12h,0b69bh,07253h,0a1e5h,051h,013h,0f1bdh
  553.         tstr    020h,0,0,0,0,0,0,0,0,0,0,0,0            ; (2 cycles)
  554.         tstr    0,0,0ffh,0ffh,0,0,0,0,0,0,0,0,0         ; (16 cycles)
  555.         db      022h,07dh,0d5h,025h                     ; expected crc
  556.         tmsg    "ld <ix,iy>,nnnn"
  557.  
  558. ; ld a,<(bc),(de)> (44 cycles)
  559. ld8bd:  db      0ffh            ; flag mask
  560.         tstr    00ah,0,0,0,0b3a8h,01d2ah,07f8eh,042ach,msbt,msbt,0c6h,0b1h,0ef8eh
  561.         tstr    010h,0,0,0,0,0,0,0,0,0,0,0,0            ; (2 cycles)
  562.         tstr    0,0,0,0,0ffh,0,0,0,0,0,0d7h,-1,0        ; (22 cycles)
  563.         db      03bh,0c6h,06ah,071h                     ; expected crc
  564.         tmsg    "ld a,<(bc),(de)>"
  565.  
  566. ; ld <b,c,d,e,h,l,(hl),a>,nn (64 cycles)
  567. ld8im:  db      0ffh            ; flag mask
  568.         tstr    6,0,0,0,0c407h,0f49dh,0d13dh,00339h,0de89h,07455h,053h,0c0h,05509h
  569.         tstr    038h,0,0,0,0,0,0,0,0,0,0,0,0            ; (8 cycles)
  570.         tstr    0,0,0,0,0,0,0,0,0,0,0,-1,0              ; (8 cycles)
  571.         db      0f1h,0dah,0b5h,056h                     ; expected crc
  572.         tmsg    "ld <b,c,d,e,h,l,(hl),a>,nn"
  573.  
  574. ; ld (<ix,iy>+1),nn (32 cycles)
  575. ld8imx: db      0ffh            ; flag mask
  576.         tstr    0ddh,036h,1,0,01b45h,msbt-1,msbt-1,0d5c1h,061c7h,0bdc4h,0c0h,085h,0cd16h
  577.         tstr    020h,0,0,0,0,0,0,0,0,0,0,0,0            ; (2 cycles)
  578.         tstr    0,0,0,-1,0,0,0,0,0,0,0,-1,0             ; (16 cycles)
  579.         db      0e8h,00ch,0ffh,011h                     ; expected crc
  580.         tmsg    "ld (<ix,iy>+1),nn"
  581.  
  582. ; ld <b,c,d,e>,(<ix,iy>+1) (512 cycles)
  583. ld8ix1: db      0ffh            ; flag mask
  584.         tstr    0ddh,046h,1,0,0d016h,msbt-1,msbt-1,04260h,07f39h,00404h,097h,04ah,0d085h
  585.         tstr    020h,018h,0,0,0,1,1,0,0,0,0,0,0         ; (32 cycles)
  586.         tstr    0,0,0,0,-1,0,0,0,0,0,0,0,0              ; (16 cycles)
  587.         db      036h,00fh,001h,082h                     ; expected crc
  588.         tmsg    "ld <b,c,d,e>,(<ix,iy>+1)"
  589.  
  590. ; ld <h,l>,(<ix,iy>+1) (256 cycles)
  591. ld8ix2: db      0ffh            ; flag mask
  592.         tstr    0ddh,066h,1,0,084e0h,msbt-1,msbt-1,09c52h,0a799h,049b6h,093h,000h,0eeadh
  593.         tstr    020h,008h,0,0,0,1,1,0,0,0,0,0,0         ; (16 cycles)
  594.         tstr    0,0,0,0,-1,0,0,0,0,0,0,0,0              ; (16 cycles)
  595.         db      0b7h,0bah,00ch,09ch                     ; expected crc
  596.         tmsg    "ld <h,l>,(<ix,iy>+1)"
  597.  
  598. ; ld a,(<ix,iy>+1) (128 cycles)
  599. ld8ix3: db      0ffh            ; flag mask
  600.         tstr    0ddh,07eh,1,0,0d8b6h,msbt-1,msbt-1,0c612h,0df07h,09cd0h,043h,0a6h,0a0e5h
  601.         tstr    020h,0,0,0,0,1,1,0,0,0,0,0,0            ; (8 cycles)
  602.         tstr    0,0,0,0,-1,0,0,0,0,0,0,0,0              ; (16 cycles)
  603.         db      0e7h,05ah,01eh,063h                     ; expected crc
  604.         tmsg    "ld a,(<ix,iy>+1)"
  605.  
  606. ; ld <ixh,ixl,iyh,iyl>,nn (32 cycles)
  607. ld8ixy: db      0ffh            ; flag mask
  608.         tstr    0ddh,026h,0,0,03c53h,04640h,0e179h,07711h,0c107h,01afah,081h,0adh,05d9bh
  609.         tstr    020h,8,0,0,0,0,0,0,0,0,0,0,0            ; (4 cycles)
  610.         tstr    0,0,0,0,0,0,0,0,0,0,0,-1,0              ; (8 cycles)
  611.         db      024h,0e8h,082h,08bh                     ; expected crc
  612.         tmsg    "ld <ixh,ixl,iyh,iyl>,nn"
  613.  
  614. ; ld <b,c,d,e,h,l,a>,<b,c,d,e,h,l,a> (3456 cycles)
  615. ld8rr:  db      0ffh            ; flag mask
  616.         tstr    040h,0,0,0,072a4h,0a024h,061ach,msbt,082c7h,0718fh,097h,08fh,0ef8eh
  617.         tstr    03fh,0,0,0,0,0,0,0,0,0,0,0,0            ; (64 cycles)
  618.         tstr    0,0,0,0,0ffh,0,0,0,-1,-1,0d7h,-1,0      ; (54 cycles)
  619.         db      043h,075h,089h,0beh                     ; expected crc
  620.         tmsg    "ld <bcdehla>,<bcdehla>"
  621.  
  622. ; ld <b,c,d,e,ixy,a>,<b,c,d,e,ixy,a> (6912 cycles)
  623. ld8rrx: db      0ffh            ; flag mask
  624.         tstr    0ddh,040h,0,0,0bcc5h,msbt,msbt,msbt,02fc2h,098c0h,083h,01fh,03bcdh
  625.         tstr    020h,03fh,0,0,0,0,0,0,0,0,0,0,0         ; (128 cycles)
  626.         tstr    0,0,0,0,0ffh,0,0,0,-1,-1,0d7h,-1,0      ; (54 cycles)
  627.         db      0f1h,063h,0aeh,01ah                     ; expected crc
  628.         tmsg    "ld <bcdexya>,<bcdexya>"
  629.  
  630. ; ld a,(nnnn) / ld (nnnn),a (44 cycles)
  631. lda:    db      0ffh            ; flag mask
  632.         tstr    032h,msbtlo,msbthi,0,0fd68h,0f4ech,044a0h,0b543h,00653h,0cdbah,0d2h,04fh,01fd8h
  633.         tstr    008h,0,0,0,0,0,0,0,0,0,0,0,0            ; (2 cycle)
  634.         tstr    0,0,0,0,0ffh,0,0,0,0,0,0d7h,-1,0        ; (22 cycles)
  635.         db      0c9h,026h,02dh,0e5h                     ; expected crc
  636.         tmsg    "ld a,(nnnn) / ld (nnnn),a"
  637.  
  638. ; ldd<r> (1) (44 cycles)
  639. ldd1:   db      0ffh            ; flag mask
  640.         tstr    0edh,0a8h,0,0,09852h,068fah,066a1h,msbt+3,msbt+1,1,0c1h,068h,020b7h
  641.         tstr    0,010h,0,0,0,0,0,0,0,0,0,0,0            ; (2 cycles)
  642.         tstr    0,0,0,0,-1,0,0,0,0,0,0d7h,0,0           ; (22 cycles)
  643.         db      039h,0e2h,095h,0edh                     ; expected crc
  644.         tmsg    "ldd<r> (1)"
  645.  
  646. ; ldd<r> (2) (44 cycles)
  647. ldd2:   db      0ffh            ; flag mask
  648.         tstr    0edh,0a8h,0,0,0f12eh,0eb2ah,0d5bah,msbt+3,msbt+1,2,047h,0ffh,0fbe4h
  649.         tstr    0,010h,0,0,0,0,0,0,0,0,0,0,0            ; (2 cycles)
  650.         tstr    0,0,0,0,-1,0,0,0,0,0,0d7h,0,0           ; (22 cycles)
  651.         db      094h,0cbh,08fh,065h                     ; expected crc
  652.         tmsg    "ldd<r> (2)"
  653.  
  654. ; ldi<r> (1) (44 cycles)
  655. ldi1:   db      0ffh            ; flag mask
  656.         tstr    0edh,0a0h,0,0,0fe30h,003cdh,06058h,msbt+2,msbt,1,004h,060h,02688h
  657.         tstr    0,010h,0,0,0,0,0,0,0,0,0,0,0            ; (2 cycles)
  658.         tstr    0,0,0,0,-1,0,0,0,0,0,0d7h,0,0           ; (22 cycles)
  659.         db      05ah,094h,002h,055h                     ; expected crc
  660.         tmsg    "ldi<r> (1)"
  661.  
  662. ; ldi<r> (2) (44 cycles)
  663. ldi2:   db      0ffh            ; flag mask
  664.         tstr    0edh,0a0h,0,0,04aceh,0c26eh,0b188h,msbt+2,msbt,2,014h,02dh,0a39fh
  665.         tstr    0,010h,0,0,0,0,0,0,0,0,0,0,0            ; (2 cycles)
  666.         tstr    0,0,0,0,-1,0,0,0,0,0,0d7h,0,0           ; (22 cycles)
  667.         db      044h,0fch,062h,02ah                     ; expected crc
  668.         tmsg    "ldi<r> (2)"
  669.  
  670. ; neg (16,384 cycles)
  671. negop:  db      0ffh            ; flag mask
  672.         tstr    0edh,044h,0,0,038a2h,05f6bh,0d934h,057e4h,0d2d6h,04642h,043h,05ah,009cch
  673.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,-1,0           ; (16,384 cycles)
  674.         tstr    0,0,0,0,0,0,0,0,0,0,0,0,0               ; (1 cycle)
  675.         db      0d6h,038h,0ddh,06ah                     ; expected crc
  676.         tmsg    "neg"
  677.  
  678. ; <rld,rrd> (7168 cycles)
  679. rldop:  db      0ffh            ; flag mask
  680.         tstr    0edh,067h,0,0,091cbh,0c48bh,0fa62h,msbt,0e720h,0b479h,040h,006h,08ae2h
  681.         tstr    0,8,0,0,0ffh,0,0,0,0,0,0,0,0            ; (512 cycles)
  682.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,-1,0           ; (14 cycles)
  683.         db      01bh,0bch,005h,051h                     ; expected crc
  684.         tmsg    "<rrd,rld>"
  685.  
  686. ; <rlca,rrca,rla,rra> (6144 cycles)
  687. rot8080: db     0ffh            ; flag mask
  688.         tstr    7,0,0,0,0cb92h,06d43h,00a90h,0c284h,00c53h,0f50eh,091h,0ebh,040fch
  689.         tstr    018h,0,0,0,0,0,0,0,0,0,0,-1,0           ; (1024 cycles)
  690.         tstr    0,0,0,0,0,0,0,0,0,0,0d7h,0,0            ; (6 cycles)
  691.         db      09bh,0a3h,080h,07ch                     ; expected crc
  692.         tmsg    "<rlca,rrca,rla,rra>"
  693.  
  694. ; shift/rotate (<ix,iy>+1) (416 cycles)
  695. rotxy:  db      0ffh            ; flag mask
  696.         tstr    0ddh,0cbh,1,6,0ddafh,msbt-1,msbt-1,0ff3ch,0dbf6h,094f4h,082h,080h,061d9h
  697.         tstr    020h,0,0,038h,0,0,0,0,0,0,080h,0,0      ; (32 cycles)
  698.         tstr    0,0,0,0,0ffh,0,0,0,0,0,057h,0,0         ; (13 cycles)
  699.         db      04ch,006h,053h,0f1h                     ; expected crc
  700.         tmsg    "shf/rot (<ix,iy>+1)"
  701.  
  702. ; shift/rotate <b,c,d,e,h,l,(hl),a> (6784 cycles)
  703. rotz80: db      0ffh            ; flag mask
  704.         tstr    0cbh,0,0,0,0ccebh,05d4ah,0e007h,msbt,01395h,030eeh,043h,078h,03dadh
  705.         tstr    0,03fh,0,0,0,0,0,0,0,0,080h,0,0         ; (128 cycles)
  706.         tstr    0,0,0,0,0ffh,0,0,0,-1,-1,057h,-1,0      ; (53 cycles)
  707.         db      036h,0bch,01fh,0c3h                     ; expected crc
  708.         tmsg    "shf/rot <b,c,d,e,h,l,(hl),a>"
  709.  
  710. ; <set,res> n,<b,c,d,e,h,l,(hl),a> (7936 cycles)
  711. srz80:  db      0ffh            ; flag mask
  712.         tstr    0cbh,080h,0,0,02cd5h,097abh,039ffh,msbt,0d14bh,06ab2h,053h,027h,0b538h
  713.         tstr    0,07fh,0,0,0,0,0,0,0,0,0,0,0            ; (128 cycles)
  714.         tstr    0,0,0,0,0ffh,0,0,0,-1,-1,0d7h,-1,0      ; (62 cycles)
  715.         db      077h,05eh,089h,075h                     ; expected crc
  716.         tmsg    "<set,res> n,<bcdehl(hl)a>"
  717.  
  718. ; <set,res> n,(<ix,iy>+1) (1792 cycles)
  719. srzx:   db      0ffh            ; flag mask
  720.         tstr    0ddh,0cbh,1,086h,0fb44h,msbt-1,msbt-1,0ba09h,068beh,032d8h,010h,05eh,0a867h
  721.         tstr    020h,0,0,078h,0,0,0,0,0,0,0,0,0 ; (128 cycles)
  722.         tstr    0,0,0,0,0ffh,0,0,0,0,0,0d7h,0,0         ;(14 cycles)
  723.         db      0fah,09fh,051h,0d4h                     ; expected crc
  724.         tmsg    "<set,res> n,(<ix,iy>+1)"
  725.  
  726. ; ld (<ix,iy>+1),<b,c,d,e> (1024 cycles)
  727. st8ix1: db      0ffh            ; flag mask
  728.         tstr    0ddh,070h,1,0,0270dh,msbt-1,msbt-1,0b73ah,0887bh,099eeh,086h,070h,0ca07h
  729.         tstr    020h,003h,0,0,0,1,1,0,0,0,0,0,0         ; (32 cycles)
  730.         tstr    0,0,0,0,0,0,0,0,-1,-1,0,0,0             ; (32 cycles)
  731.         db      0dch,096h,020h,025h                     ; expected crc
  732.         tmsg    "ld (<ix,iy>+1),<b,c,d,e>"
  733.  
  734. ; ld (<ix,iy>+1),<h,l> (256 cycles)
  735. st8ix2: db      0ffh            ; flag mask
  736.         tstr    0ddh,074h,1,0,0b664h,msbt-1,msbt-1,0e8ach,0b5f5h,0aafeh,012h,010h,09566h
  737.         tstr    020h,001h,0,0,0,1,1,0,0,0,0,0,0         ; (16 cycles)
  738.         tstr    0,0,0,0,0,0,0,-1,0,0,0,0,0              ; (32 cycles)
  739.         db      027h,08ah,0c9h,0aeh                     ; expected crc
  740.         tmsg    "ld (<ix,iy>+1),<h,l>"
  741.  
  742. ; ld (<ix,iy>+1),a (64 cycles)
  743. st8ix3: db      0ffh            ; flag mask
  744.         tstr    0ddh,077h,1,0,067afh,msbt-1,msbt-1,04f13h,00644h,0bcd7h,050h,0ach,05fafh
  745.         tstr    020h,0,0,0,0,1,1,0,0,0,0,0,0            ; (8 cycles)
  746.         tstr    0,0,0,0,0,0,0,0,0,0,0,-1,0              ; (8 cycles)
  747.         db      0d1h,002h,02ah,013h                     ; expected crc
  748.         tmsg    "ld (<ix,iy>+1),a"
  749.  
  750. ; ld (<bc,de>),a (96 cycles)
  751. stabd:  db      0ffh            ; flag mask
  752.         tstr    2,0,0,0,00c3bh,0b592h,06cffh,0959eh,msbt,msbt+1,0c1h,021h,0bde7h
  753.         tstr    018h,0,0,0,0,0,0,0,0,0,0,0,0            ; (4 cycles)
  754.         tstr    0,0,0,0,-1,0,0,0,0,0,0,-1,0             ; (24 cycles)
  755.         db      019h,0cah,0edh,02fh                     ; expected crc
  756.         tmsg    "ld (<bc,de>),a"
  757.  
  758. ; start test pointed to by (hl)
  759. stt:    push    hl
  760.         ld      a,(hl)          ; get pointer to test
  761.         inc     hl
  762.         ld      h,(hl)
  763.         ld      l,a
  764.         ld      a,(hl)          ; flag mask
  765.         ld      (flgmsk+1),a
  766.         inc     hl
  767.         push    hl
  768.         ld      de,20
  769.         add     hl,de           ; point to incmask
  770.         ld      de,counter
  771.         call    initmask
  772.         pop     hl
  773.         push    hl
  774.         ld      de,20+20
  775.         add     hl,de           ; point to scanmask
  776.         ld      de,shifter
  777.         call    initmask
  778.         ld      hl,shifter
  779.         ld      (hl),1          ; first bit
  780.         pop     hl
  781.         push    hl
  782.         ld      de,iut          ; copy initial instruction under test
  783.         ld      bc,4
  784.         ldir
  785.         ld      de,msbt         ; copy initial machine state
  786.         ld      bc,16
  787.         ldir
  788.         ld      de,20+20+4      ; skip incmask, scanmask and expcrc
  789.         add     hl,de
  790.         ex      de,hl
  791.         ld      c,9
  792.         call    bdos            ; show test name
  793.         call    initcrc         ; initialise crc
  794. ; test loop
  795. tlp:    ld      a,(iut)
  796.         cp      076h            ; pragmatically avoid halt intructions
  797.         jp      z,tlp2
  798.         and     0dfh
  799.         cp      0ddh
  800.         jp      nz,tlp1
  801.         ld      a,(iut+1)
  802.         cp      076h
  803. tlp1:   call    nz,test         ; execute the test instruction
  804. tlp2:   call    count           ; increment the counter
  805.         call    nz,shift        ; shift the scan bit
  806.         pop     hl              ; pointer to test case
  807.         jp      z,tlp3          ; done if shift returned NZ
  808.         ld      de,20+20+20
  809.         add     hl,de           ; point to expected crc
  810.         call    cmpcrc
  811.         ld      de,okmsg
  812.         jp      z,tlpok
  813.         push    hl              ; save pointer to crc
  814.         ld      hl,crcval
  815.         ld      de,ermsg1       ; jgh: swap crc= and expected= messages
  816.         ld      c,9
  817.         call    bdos
  818.         call    phex8
  819.         ld      de,ermsg2
  820.         ld      c,9
  821.         call    bdos
  822.         pop     hl              ; get pointer to crc back
  823.         call    phex8
  824.         ld      de,crlf
  825. tlpok:  ld      c,9
  826.         call    bdos
  827.         pop     hl
  828.         inc     hl
  829.         inc     hl
  830.         ret
  831.  
  832. tlp3:   push    hl
  833.         ld      a,1             ; initialise count and shift scanners
  834.         ld      (cntbit),a
  835.         ld      (shfbit),a
  836.         ld      hl,counter
  837.         ld      (cntbyt),hl
  838.         ld      hl,shifter
  839.         ld      (shfbyt),hl
  840.  
  841.         ld      b,4             ; bytes in iut field
  842.         pop     hl              ; pointer to test case
  843.         push    hl
  844.         ld      de,iut
  845.         call    setup           ; setup iut
  846.         ld      b,16            ; bytes in machine state
  847.         ld      de,msbt
  848.         call    setup           ; setup machine state
  849.         jp      tlp
  850.  
  851. ; set up a field of the test case
  852. ; b  = number of bytes
  853. ; hl = pointer to base case
  854. ; de = destination
  855. setup:  call    subyte
  856.         inc     hl
  857.         dec     b
  858.         jp      nz,setup
  859.         ret
  860.  
  861. subyte: push    bc
  862.         push    de
  863.         push    hl
  864.         ld      c,(hl)          ; get base byte
  865.         ld      de,20
  866.         add     hl,de           ; point to incmask
  867.         ld      a,(hl)
  868.         cp      0
  869.         jp      z,subshf
  870.         ld      b,8             ; 8 bits
  871. subclp: rrca
  872.         push    af
  873.         ld      a,0
  874.         call    c,nxtcbit       ; get next counter bit if mask bit was set
  875.         xor     c               ; flip bit if counter bit was set
  876.         rrca
  877.         ld      c,a
  878.         pop     af
  879.         dec     b
  880.         jp      nz,subclp
  881.         ld      b,8
  882. subshf: ld      de,20
  883.         add     hl,de           ; point to shift mask
  884.         ld      a,(hl)
  885.         cp      0
  886.         jp      z,substr
  887.         ld      b,8             ; 8 bits
  888. sbshf1: rrca
  889.         push    af
  890.         ld      a,0
  891.         call    c,nxtsbit       ; get next shifter bit if mask bit was set
  892.         xor     c               ; flip bit if shifter bit was set
  893.         rrca
  894.         ld      c,a
  895.         pop     af
  896.         dec     b
  897.         jp      nz,sbshf1
  898. substr: pop     hl
  899.         pop     de
  900.         ld      a,c
  901.         ld      (de),a          ; mangled byte to destination
  902.         inc     de
  903.         pop     bc
  904.         ret
  905.  
  906. ; get next counter bit in low bit of a
  907. cntbit: db      1 dup (0)
  908. cntbyt: db      2 dup (0)
  909.  
  910. nxtcbit: push   bc
  911.         push    hl
  912.         ld      hl,(cntbyt)
  913.         ld      b,(hl)
  914.         ld      hl,cntbit
  915.         ld      a,(hl)
  916.         ld      c,a
  917.         rlca
  918.         ld      (hl),a
  919.         cp      1
  920.         jp      nz,ncb1
  921.         ld      hl,(cntbyt)
  922.         inc     hl
  923.         ld      (cntbyt),hl
  924. ncb1:   ld      a,b
  925.         and     c
  926.         pop     hl
  927.         pop     bc
  928.         ret     z
  929.         ld      a,1
  930.         ret
  931.  
  932. ; get next shifter bit in low bit of a
  933. shfbit: db      1 dup (0)
  934. shfbyt: db      2 dup (0)
  935.  
  936. nxtsbit: push   bc
  937.         push    hl
  938.         ld      hl,(shfbyt)
  939.         ld      b,(hl)
  940.         ld      hl,shfbit
  941.         ld      a,(hl)
  942.         ld      c,a
  943.         rlca
  944.         ld      (hl),a
  945.         cp      1
  946.         jp      nz,nsb1
  947.         ld      hl,(shfbyt)
  948.         inc     hl
  949.         ld      (shfbyt),hl
  950. nsb1:   ld      a,b
  951.         and     c
  952.         pop     hl
  953.         pop     bc
  954.         ret     z
  955.         ld      a,1
  956.         ret
  957.  
  958.  
  959. ; clear memory at hl, bc bytes
  960. clrmem: push    af
  961.         push    bc
  962.         push    de
  963.         push    hl
  964.         ld      (hl),0
  965.         ld      d,h
  966.         ld      e,l
  967.         inc     de
  968.         dec     bc
  969.         ldir
  970.         pop     hl
  971.         pop     de
  972.         pop     bc
  973.         pop     af
  974.         ret
  975.  
  976. ; initialise counter or shifter
  977. ; de = pointer to work area for counter or shifter
  978. ; hl = pointer to mask
  979. initmask:
  980.         push    de
  981.         ex      de,hl
  982.         ld      bc,20+20
  983.         call    clrmem          ; clear work area
  984.         ex      de,hl
  985.         ld      b,20            ; byte counter
  986.         ld      c,1             ; first bit
  987.         ld      d,0             ; bit counter
  988. imlp:   ld      e,(hl)
  989. imlp1:  ld      a,e
  990.         and     c
  991.         jp      z,imlp2
  992.         inc     d
  993. imlp2:  ld      a,c
  994.         rlca
  995.         ld      c,a
  996.         cp      1
  997.         jp      nz,imlp1
  998.         inc     hl
  999.         dec     b
  1000.         jp      nz,imlp
  1001. ; got number of 1-bits in mask in reg d
  1002.         ld      a,d
  1003.         and     0f8h
  1004.         rrca
  1005.         rrca
  1006.         rrca                    ; divide by 8 (get byte offset)
  1007.         ld      l,a
  1008.         ld      h,0
  1009.         ld      a,d
  1010.         and     7               ; bit offset
  1011.         inc     a
  1012.         ld      b,a
  1013.         ld      a,080h
  1014. imlp3:  rlca
  1015.         dec     b
  1016.         jp      nz,imlp3
  1017.         pop     de
  1018.         add     hl,de
  1019.         ld      de,20
  1020.         add     hl,de
  1021.         ld      (hl),a
  1022.         ret
  1023.  
  1024. ; multi-byte counter
  1025. count:  push    bc
  1026.         push    de
  1027.         push    hl
  1028.         ld      hl,counter      ; 20 byte counter starts here
  1029.         ld      de,20           ; somewhere in here is the stop bit
  1030.         ex      de,hl
  1031.         add     hl,de
  1032.         ex      de,hl
  1033. cntlp:  inc     (hl)
  1034.         ld      a,(hl)
  1035.         cp      0
  1036.         jp      z,cntlp1        ; overflow to next byte
  1037.         ld      b,a
  1038.         ld      a,(de)
  1039.         and     b               ; test for terminal value
  1040.         jp      z,cntend
  1041.         ld      (hl),0          ; reset to zero
  1042. cntend: pop     bc
  1043.         pop     de
  1044.         pop     hl
  1045.         ret
  1046.  
  1047. cntlp1: inc     hl
  1048.         inc     de
  1049.         jp      cntlp
  1050.  
  1051.  
  1052. ; multi-byte shifter
  1053. shift:  push    bc
  1054.         push    de
  1055.         push    hl
  1056.         ld      hl,shifter      ; 20 byte shift register starts here
  1057.         ld      de,20           ; somewhere in here is the stop bit
  1058.         ex      de,hl
  1059.         add     hl,de
  1060.         ex      de,hl
  1061. shflp:  ld      a,(hl)
  1062.         or      a
  1063.         jp      z,shflp1
  1064.         ld      b,a
  1065.         ld      a,(de)
  1066.         and     b
  1067.         jp      nz,shlpe
  1068.         ld      a,b
  1069.         rlca
  1070.         cp      1
  1071.         jp      nz,shflp2
  1072.         ld      (hl),0
  1073.         inc     hl
  1074.         inc     de
  1075. shflp2: ld      (hl),a
  1076.         xor     a               ; set Z
  1077. shlpe:  pop     hl
  1078.         pop     de
  1079.         pop     bc
  1080.         ret
  1081. shflp1: inc     hl
  1082.         inc     de
  1083.         jp      shflp
  1084.  
  1085. counter: db     2*20 dup (0)
  1086. shifter: db     2*20 dup (0)
  1087.  
  1088. ; test harness
  1089. test:   push    af
  1090.         push    bc
  1091.         push    de
  1092.         push    hl
  1093.       if        0
  1094.         ld      de,crlf
  1095.         ld      c,9
  1096.         call    bdos
  1097.         ld      hl,iut
  1098.         ld      b,4
  1099.         call    hexstr
  1100.         ld      e,' '
  1101.         ld      c,2
  1102.         call    bdos
  1103.         ld      b,16
  1104.         ld      hl,msbt
  1105.         call    hexstr
  1106.       endif
  1107. ;zexfix        di                      ; disable interrupts
  1108.         push    iy              ; jgh: Spectrum INTs change (IY+x)
  1109.         di              ;zexfix
  1110.         ld      (spsav),sp      ; save stack pointer
  1111.         ld      sp,msbt+2       ; point to test-case machine state
  1112.         pop     iy              ; and load all regs
  1113.         pop     ix
  1114.         pop     hl
  1115.         pop     de
  1116.         pop     bc
  1117.         pop     af
  1118.         ld      sp,(spbt)
  1119. iut:    db      4 dup (0)       ; max 4 byte instruction under test
  1120.         ld      (spat),sp       ; save stack pointer
  1121.         ld      sp,spat
  1122.         push    af              ; save other registers
  1123.         push    bc
  1124.         push    de
  1125.         push    hl
  1126.         push    ix
  1127.         push    iy
  1128.         ld      sp,(spsav)      ; restore stack pointer
  1129.         pop     iy              ; jgh: Restore Spectrum's IY
  1130.         ei                      ; enable interrupts
  1131.         ld      hl,(msbt)       ; copy memory operand
  1132.         ld      (msat),hl
  1133.         ld      hl,flgsat       ; flags after test
  1134.         ld      a,(hl)
  1135. flgmsk: and     0d7h            ; mask-out irrelevant bits (self-modified code!)
  1136.         ld      (hl),a
  1137.         ld      b,16            ; total of 16 bytes of state
  1138.         ld      de,msat
  1139.         ld      hl,crcval
  1140. tcrc:   ld      a,(de)
  1141.         inc     de
  1142.         call    updcrc          ; accumulate crc of this test case
  1143.         dec     b
  1144.         jp      nz,tcrc
  1145.       if        0
  1146.         ld      e,' '
  1147.         ld      c,2
  1148.         call    bdos
  1149.         ld      hl,crcval
  1150.         call    phex8
  1151.         ld      de,crlf
  1152.         ld      c,9
  1153.         call    bdos
  1154.         ld      hl,msat
  1155.         ld      b,16
  1156.         call    hexstr
  1157.         ld      de,crlf
  1158.         ld      c,9
  1159.         call    bdos
  1160.       endif
  1161.         pop     hl
  1162.         pop     de
  1163.         pop     bc
  1164.         pop     af
  1165.         ret
  1166.  
  1167. ; machine state after test
  1168. msat:   db      14 dup (0)      ; memop,iy,ix,hl,de,bc,af
  1169. spat:   db      2 dup (0)       ; stack pointer after test
  1170. ; ZMAC/MAXAM doesn't like ':' after label with EQUs
  1171. flgsat  equ     spat-2  ; flags
  1172.  
  1173. spsav:  db      2 dup (0)       ; saved stack pointer
  1174.  
  1175. ; display hex string (pointer in hl, byte count in b)
  1176. hexstr: ld      a,(hl)
  1177.         call    phex2
  1178.         inc     hl
  1179.         dec     b
  1180.         jp      nz,hexstr
  1181.         ret
  1182.  
  1183. ; display hex
  1184. ; display the big-endian 32-bit value pointed to by hl
  1185. phex8:  push    af
  1186.         push    bc
  1187.         push    hl
  1188.         ld      b,4
  1189. ph8lp:  ld      a,(hl)
  1190.         call    phex2
  1191.         inc     hl
  1192.         dec     b
  1193.         jp      nz,ph8lp
  1194.         pop     hl
  1195.         pop     bc
  1196.         pop     af
  1197.         ret
  1198.  
  1199. ; display byte in a
  1200. phex2:  push    af
  1201.         rrca
  1202.         rrca
  1203.         rrca
  1204.         rrca
  1205.         call    phex1
  1206.         pop     af
  1207. ; fall through
  1208.  
  1209. ; display low nibble in a
  1210. phex1:  push    af
  1211.         push    bc
  1212.         push    de
  1213.         push    hl
  1214.         and     0fh
  1215.         cp      10
  1216.         jp      c,ph11
  1217.         add     a,'a'-'9'-1
  1218. ph11:   add     a,'0'
  1219.         ld      e,a
  1220.         ld      c,2
  1221.         call    bdos
  1222.         pop     hl
  1223.         pop     de
  1224.         pop     bc
  1225.         pop     af
  1226.         ret
  1227.  
  1228. bdos:   push    af
  1229.         push    bc
  1230.         push    de
  1231.         push    hl
  1232. ;zexfix        ei
  1233.         ld      b,a     ;zexfix
  1234. ; Accept call 2 (print char) and call 9 (print string)
  1235. ; Ignore all others
  1236.         ld      a,c
  1237.         cp      2
  1238.         jr      z,prchar
  1239.         cp      9
  1240.         jr      z,prstring
  1241. bdosdone:
  1242. ;zexfix        di                      ; ensure INTs remain disabled
  1243.         pop     hl
  1244.         pop     de
  1245.         pop     bc
  1246.         pop     af
  1247.         ret
  1248.  
  1249. ; Pass bdos calls to Spectrum system
  1250. prchar:
  1251. ;zexfix        ld      a,e             ; get char
  1252. ;zexfix        cp      10              ; ignore LF as CR auto-LFs
  1253. ;zexfix        jr      z,bdosdone
  1254.         ld      a,b     ;zexfix
  1255.         ei              ;zexfix
  1256.         rst     010h
  1257.         di              ;zexfix
  1258.         jr      bdosdone
  1259.  
  1260.         db    0         ;zexfix
  1261.         db    0         ;zexfix
  1262.         db    0         ;zexfix
  1263.  
  1264. prstring:
  1265.         ld      a,(de)
  1266.         cp      '$'
  1267.         jr      z,bdosdone
  1268. ;zexfix        cp      10
  1269. ;zexfix        call    nz,010h
  1270.         ei              ;zexfix
  1271.         rst     010h    ;zexfix
  1272.         di              ;zexfix
  1273.         inc     de
  1274.         jr      prstring
  1275.  
  1276.         db    0         ;zexfix
  1277.         db    0         ;zexfix
  1278.         db    0         ;zexfix
  1279.  
  1280. msg1:   db      "Z80all instruction exerciser"
  1281. ;zexfix        db      10
  1282.         db      13
  1283. ;zexfix        db      10
  1284.         db      13,"$"
  1285.         db      0       ;zexfix
  1286.         db      0       ;zexfix
  1287. msg2:   db      "Tests complete$"
  1288. okmsg:  db      "OK"
  1289. ;zexfix        db      10
  1290.         db      13,"$"
  1291.         db      0       ;zexfix
  1292. ermsg1:
  1293.         db      " "     ;zexfix
  1294.         db      "  CRC:$"       ; was ERROR:
  1295. ermsg2: db      " expected:$"
  1296. crlf:
  1297. ;zexfix        db      10
  1298.         db      13,"$"
  1299.         db      0       ;zexfix
  1300.  
  1301. ; compare crc
  1302. ; hl points to value to compare to crcval
  1303. cmpcrc: push    bc
  1304.         push    de
  1305.         push    hl
  1306.         ld      de,crcval
  1307.         ld      b,4
  1308. cclp:   ld      a,(de)
  1309.         cp      (hl)
  1310.         jp      nz,cce
  1311.         inc     hl
  1312.         inc     de
  1313.         dec     b
  1314.         jp      nz,cclp
  1315. cce:    pop     hl
  1316.         pop     de
  1317.         pop     bc
  1318.         ret
  1319.  
  1320. ; 32-bit crc routine
  1321. ; entry: a contains next byte, hl points to crc
  1322. ; exit:  crc updated
  1323. updcrc: push    af
  1324.         push    bc
  1325.         push    de
  1326.         push    hl
  1327.         push    hl
  1328.         ld      de,3
  1329.         add     hl,de   ; point to low byte of old crc
  1330.         xor     (hl)    ; xor with new byte
  1331.         ld      l,a
  1332.         ld      h,0
  1333.         add     hl,hl   ; use result as index into table of 4 byte entries
  1334.         add     hl,hl
  1335.         ex      de,hl
  1336.         ld      hl,crctab
  1337.         add     hl,de   ; point to selected entry in crctab
  1338.         ex      de,hl
  1339.         pop     hl
  1340.         ld      bc,4    ; c = byte count, b = accumulator
  1341. crclp:  ld      a,(de)
  1342.         xor     b
  1343.         ld      b,(hl)
  1344.         ld      (hl),a
  1345.         inc     de
  1346.         inc     hl
  1347.         dec     c
  1348.         jp      nz,crclp
  1349.       if        0
  1350.         ld      hl,crcval
  1351.         call    phex8
  1352.         ld      de,crlf
  1353.         ld      c,9
  1354.         call    bdos
  1355.       endif
  1356.         pop     hl
  1357.         pop     de
  1358.         pop     bc
  1359.         pop     af
  1360.         ret
  1361.  
  1362. initcrc:push    af
  1363.         push    bc
  1364.         push    hl
  1365.         ld      hl,crcval
  1366.         ld      a,0ffh
  1367.         ld      b,4
  1368. icrclp: ld      (hl),a
  1369.         inc     hl
  1370.         dec     b
  1371.         jp      nz,icrclp
  1372.         pop     hl
  1373.         pop     bc
  1374.         pop     af
  1375.         ret
  1376.  
  1377. crcval  db      4 dup (0)
  1378.  
  1379. crctab: db      000h,000h,000h,000h
  1380.         db      077h,007h,030h,096h
  1381.         db      0eeh,00eh,061h,02ch
  1382.         db      099h,009h,051h,0bah
  1383.         db      007h,06dh,0c4h,019h
  1384.         db      070h,06ah,0f4h,08fh
  1385.         db      0e9h,063h,0a5h,035h
  1386.         db      09eh,064h,095h,0a3h
  1387.         db      00eh,0dbh,088h,032h
  1388.         db      079h,0dch,0b8h,0a4h
  1389.         db      0e0h,0d5h,0e9h,01eh
  1390.         db      097h,0d2h,0d9h,088h
  1391.         db      009h,0b6h,04ch,02bh
  1392.         db      07eh,0b1h,07ch,0bdh
  1393.         db      0e7h,0b8h,02dh,007h
  1394.         db      090h,0bfh,01dh,091h
  1395.         db      01dh,0b7h,010h,064h
  1396.         db      06ah,0b0h,020h,0f2h
  1397.         db      0f3h,0b9h,071h,048h
  1398.         db      084h,0beh,041h,0deh
  1399.         db      01ah,0dah,0d4h,07dh
  1400.         db      06dh,0ddh,0e4h,0ebh
  1401.         db      0f4h,0d4h,0b5h,051h
  1402.         db      083h,0d3h,085h,0c7h
  1403.         db      013h,06ch,098h,056h
  1404.         db      064h,06bh,0a8h,0c0h
  1405.         db      0fdh,062h,0f9h,07ah
  1406.         db      08ah,065h,0c9h,0ech
  1407.         db      014h,001h,05ch,04fh
  1408.         db      063h,006h,06ch,0d9h
  1409.         db      0fah,00fh,03dh,063h
  1410.         db      08dh,008h,00dh,0f5h
  1411.         db      03bh,06eh,020h,0c8h
  1412.         db      04ch,069h,010h,05eh
  1413.         db      0d5h,060h,041h,0e4h
  1414.         db      0a2h,067h,071h,072h
  1415.         db      03ch,003h,0e4h,0d1h
  1416.         db      04bh,004h,0d4h,047h
  1417.         db      0d2h,00dh,085h,0fdh
  1418.         db      0a5h,00ah,0b5h,06bh
  1419.         db      035h,0b5h,0a8h,0fah
  1420.         db      042h,0b2h,098h,06ch
  1421.         db      0dbh,0bbh,0c9h,0d6h
  1422.         db      0ach,0bch,0f9h,040h
  1423.         db      032h,0d8h,06ch,0e3h
  1424.         db      045h,0dfh,05ch,075h
  1425.         db      0dch,0d6h,00dh,0cfh
  1426.         db      0abh,0d1h,03dh,059h
  1427.         db      026h,0d9h,030h,0ach
  1428.         db      051h,0deh,000h,03ah
  1429.         db      0c8h,0d7h,051h,080h
  1430.         db      0bfh,0d0h,061h,016h
  1431.         db      021h,0b4h,0f4h,0b5h
  1432.         db      056h,0b3h,0c4h,023h
  1433.         db      0cfh,0bah,095h,099h
  1434.         db      0b8h,0bdh,0a5h,00fh
  1435.         db      028h,002h,0b8h,09eh
  1436.         db      05fh,005h,088h,008h
  1437.         db      0c6h,00ch,0d9h,0b2h
  1438.         db      0b1h,00bh,0e9h,024h
  1439.         db      02fh,06fh,07ch,087h
  1440.         db      058h,068h,04ch,011h
  1441.         db      0c1h,061h,01dh,0abh
  1442.         db      0b6h,066h,02dh,03dh
  1443.         db      076h,0dch,041h,090h
  1444.         db      001h,0dbh,071h,006h
  1445.         db      098h,0d2h,020h,0bch
  1446.         db      0efh,0d5h,010h,02ah
  1447.         db      071h,0b1h,085h,089h
  1448.         db      006h,0b6h,0b5h,01fh
  1449.         db      09fh,0bfh,0e4h,0a5h
  1450.         db      0e8h,0b8h,0d4h,033h
  1451.         db      078h,007h,0c9h,0a2h
  1452.         db      00fh,000h,0f9h,034h
  1453.         db      096h,009h,0a8h,08eh
  1454.         db      0e1h,00eh,098h,018h
  1455.         db      07fh,06ah,00dh,0bbh
  1456.         db      008h,06dh,03dh,02dh
  1457.         db      091h,064h,06ch,097h
  1458.         db      0e6h,063h,05ch,001h
  1459.         db      06bh,06bh,051h,0f4h
  1460.         db      01ch,06ch,061h,062h
  1461.         db      085h,065h,030h,0d8h
  1462.         db      0f2h,062h,000h,04eh
  1463.         db      06ch,006h,095h,0edh
  1464.         db      01bh,001h,0a5h,07bh
  1465.         db      082h,008h,0f4h,0c1h
  1466.         db      0f5h,00fh,0c4h,057h
  1467.         db      065h,0b0h,0d9h,0c6h
  1468.         db      012h,0b7h,0e9h,050h
  1469.         db      08bh,0beh,0b8h,0eah
  1470.         db      0fch,0b9h,088h,07ch
  1471.         db      062h,0ddh,01dh,0dfh
  1472.         db      015h,0dah,02dh,049h
  1473.         db      08ch,0d3h,07ch,0f3h
  1474.         db      0fbh,0d4h,04ch,065h
  1475.         db      04dh,0b2h,061h,058h
  1476.         db      03ah,0b5h,051h,0ceh
  1477.         db      0a3h,0bch,000h,074h
  1478.         db      0d4h,0bbh,030h,0e2h
  1479.         db      04ah,0dfh,0a5h,041h
  1480.         db      03dh,0d8h,095h,0d7h
  1481.         db      0a4h,0d1h,0c4h,06dh
  1482.         db      0d3h,0d6h,0f4h,0fbh
  1483.         db      043h,069h,0e9h,06ah
  1484.         db      034h,06eh,0d9h,0fch
  1485.         db      0adh,067h,088h,046h
  1486.         db      0dah,060h,0b8h,0d0h
  1487.         db      044h,004h,02dh,073h
  1488.         db      033h,003h,01dh,0e5h
  1489.         db      0aah,00ah,04ch,05fh
  1490.         db      0ddh,00dh,07ch,0c9h
  1491.         db      050h,005h,071h,03ch
  1492.         db      027h,002h,041h,0aah
  1493.         db      0beh,00bh,010h,010h
  1494.         db      0c9h,00ch,020h,086h
  1495.         db      057h,068h,0b5h,025h
  1496.         db      020h,06fh,085h,0b3h
  1497.         db      0b9h,066h,0d4h,009h
  1498.         db      0ceh,061h,0e4h,09fh
  1499.         db      05eh,0deh,0f9h,00eh
  1500.         db      029h,0d9h,0c9h,098h
  1501.         db      0b0h,0d0h,098h,022h
  1502.         db      0c7h,0d7h,0a8h,0b4h
  1503.         db      059h,0b3h,03dh,017h
  1504.         db      02eh,0b4h,00dh,081h
  1505.         db      0b7h,0bdh,05ch,03bh
  1506.         db      0c0h,0bah,06ch,0adh
  1507.         db      0edh,0b8h,083h,020h
  1508.         db      09ah,0bfh,0b3h,0b6h
  1509.         db      003h,0b6h,0e2h,00ch
  1510.         db      074h,0b1h,0d2h,09ah
  1511.         db      0eah,0d5h,047h,039h
  1512.         db      09dh,0d2h,077h,0afh
  1513.         db      004h,0dbh,026h,015h
  1514.         db      073h,0dch,016h,083h
  1515.         db      0e3h,063h,00bh,012h
  1516.         db      094h,064h,03bh,084h
  1517.         db      00dh,06dh,06ah,03eh
  1518.         db      07ah,06ah,05ah,0a8h
  1519.         db      0e4h,00eh,0cfh,00bh
  1520.         db      093h,009h,0ffh,09dh
  1521.         db      00ah,000h,0aeh,027h
  1522.         db      07dh,007h,09eh,0b1h
  1523.         db      0f0h,00fh,093h,044h
  1524.         db      087h,008h,0a3h,0d2h
  1525.         db      01eh,001h,0f2h,068h
  1526.         db      069h,006h,0c2h,0feh
  1527.         db      0f7h,062h,057h,05dh
  1528.         db      080h,065h,067h,0cbh
  1529.         db      019h,06ch,036h,071h
  1530.         db      06eh,06bh,006h,0e7h
  1531.         db      0feh,0d4h,01bh,076h
  1532.         db      089h,0d3h,02bh,0e0h
  1533.         db      010h,0dah,07ah,05ah
  1534.         db      067h,0ddh,04ah,0cch
  1535.         db      0f9h,0b9h,0dfh,06fh
  1536.         db      08eh,0beh,0efh,0f9h
  1537.         db      017h,0b7h,0beh,043h
  1538.         db      060h,0b0h,08eh,0d5h
  1539.         db      0d6h,0d6h,0a3h,0e8h
  1540.         db      0a1h,0d1h,093h,07eh
  1541.         db      038h,0d8h,0c2h,0c4h
  1542.         db      04fh,0dfh,0f2h,052h
  1543.         db      0d1h,0bbh,067h,0f1h
  1544.         db      0a6h,0bch,057h,067h
  1545.         db      03fh,0b5h,006h,0ddh
  1546.         db      048h,0b2h,036h,04bh
  1547.         db      0d8h,00dh,02bh,0dah
  1548.         db      0afh,00ah,01bh,04ch
  1549.         db      036h,003h,04ah,0f6h
  1550.         db      041h,004h,07ah,060h
  1551.         db      0dfh,060h,0efh,0c3h
  1552.         db      0a8h,067h,0dfh,055h
  1553.         db      031h,06eh,08eh,0efh
  1554.         db      046h,069h,0beh,079h
  1555.         db      0cbh,061h,0b3h,08ch
  1556.         db      0bch,066h,083h,01ah
  1557.         db      025h,06fh,0d2h,0a0h
  1558.         db      052h,068h,0e2h,036h
  1559.         db      0cch,00ch,077h,095h
  1560.         db      0bbh,00bh,047h,003h
  1561.         db      022h,002h,016h,0b9h
  1562.         db      055h,005h,026h,02fh
  1563.         db      0c5h,0bah,03bh,0beh
  1564.         db      0b2h,0bdh,00bh,028h
  1565.         db      02bh,0b4h,05ah,092h
  1566.         db      05ch,0b3h,06ah,004h
  1567.         db      0c2h,0d7h,0ffh,0a7h
  1568.         db      0b5h,0d0h,0cfh,031h
  1569.         db      02ch,0d9h,09eh,08bh
  1570.         db      05bh,0deh,0aeh,01dh
  1571.         db      09bh,064h,0c2h,0b0h
  1572.         db      0ech,063h,0f2h,026h
  1573.         db      075h,06ah,0a3h,09ch
  1574.         db      002h,06dh,093h,00ah
  1575.         db      09ch,009h,006h,0a9h
  1576.         db      0ebh,00eh,036h,03fh
  1577.         db      072h,007h,067h,085h
  1578.         db      005h,000h,057h,013h
  1579.         db      095h,0bfh,04ah,082h
  1580.         db      0e2h,0b8h,07ah,014h
  1581.         db      07bh,0b1h,02bh,0aeh
  1582.         db      00ch,0b6h,01bh,038h
  1583.         db      092h,0d2h,08eh,09bh
  1584.         db      0e5h,0d5h,0beh,00dh
  1585.         db      07ch,0dch,0efh,0b7h
  1586.         db      00bh,0dbh,0dfh,021h
  1587.         db      086h,0d3h,0d2h,0d4h
  1588.         db      0f1h,0d4h,0e2h,042h
  1589.         db      068h,0ddh,0b3h,0f8h
  1590.         db      01fh,0dah,083h,06eh
  1591.         db      081h,0beh,016h,0cdh
  1592.         db      0f6h,0b9h,026h,05bh
  1593.         db      06fh,0b0h,077h,0e1h
  1594.         db      018h,0b7h,047h,077h
  1595.         db      088h,008h,05ah,0e6h
  1596.         db      0ffh,00fh,06ah,070h
  1597.         db      066h,006h,03bh,0cah
  1598.         db      011h,001h,00bh,05ch
  1599.         db      08fh,065h,09eh,0ffh
  1600.         db      0f8h,062h,0aeh,069h
  1601.         db      061h,06bh,0ffh,0d3h
  1602.         db      016h,06ch,0cfh,045h
  1603.         db      0a0h,00ah,0e2h,078h
  1604.         db      0d7h,00dh,0d2h,0eeh
  1605.         db      04eh,004h,083h,054h
  1606.         db      039h,003h,0b3h,0c2h
  1607.         db      0a7h,067h,026h,061h
  1608.         db      0d0h,060h,016h,0f7h
  1609.         db      049h,069h,047h,04dh
  1610.         db      03eh,06eh,077h,0dbh
  1611.         db      0aeh,0d1h,06ah,04ah
  1612.         db      0d9h,0d6h,05ah,0dch
  1613.         db      040h,0dfh,00bh,066h
  1614.         db      037h,0d8h,03bh,0f0h
  1615.         db      0a9h,0bch,0aeh,053h
  1616.         db      0deh,0bbh,09eh,0c5h
  1617.         db      047h,0b2h,0cfh,07fh
  1618.         db      030h,0b5h,0ffh,0e9h
  1619.         db      0bdh,0bdh,0f2h,01ch
  1620.         db      0cah,0bah,0c2h,08ah
  1621.         db      053h,0b3h,093h,030h
  1622.         db      024h,0b4h,0a3h,0a6h
  1623.         db      0bah,0d0h,036h,005h
  1624.         db      0cdh,0d7h,006h,093h
  1625.         db      054h,0deh,057h,029h
  1626.         db      023h,0d9h,067h,0bfh
  1627.         db      0b3h,066h,07ah,02eh
  1628.         db      0c4h,061h,04ah,0b8h
  1629.         db      05dh,068h,01bh,002h
  1630.         db      02ah,06fh,02bh,094h
  1631.         db      0b4h,00bh,0beh,037h
  1632.         db      0c3h,00ch,08eh,0a1h
  1633.         db      05ah,005h,0dfh,01bh
  1634.         db      02dh,002h,0efh,08dh
  1635.  
  1636.