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