Subversion Repositories pentevo

Rev

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

  1. ; The Z80 tester.
  2. ;
  3. ; Copyright (C) 2012 Patrik Rak (patrik@raxoft.cz)
  4. ;
  5. ; This source code is released under the MIT license, see included license.txt.
  6.  
  7. opsize      equ     4+postccf       ; Size of the tested instruction sequence.
  8. datasize    equ     16              ; Size of the tested registers and data.
  9. vecsize     equ     opsize+datasize ; Size of entire test vector.
  10.  
  11. test:       ld      (.spptr+1),sp
  12.  
  13.             if      maskflags       ; Keep mask for official flags.
  14.             ld      a,(hl)          
  15.             ld      (.flagptr+1),a
  16.             endif
  17.  
  18.             inc     hl
  19.  
  20.             ld      de,vector       ; Init the test vector, counter and shifter.
  21.             ld      bc,vecsize
  22.             call    .copy
  23.  
  24.             add     hl,bc
  25.  
  26.             call    .copy
  27.  
  28.             call    .copy
  29.            
  30.             add     hl,bc
  31.  
  32.             ld      (.valptr+1),de
  33.  
  34.             inc     de
  35.  
  36.             call    .clear
  37.  
  38.             ld      (.maskptr+1),de
  39.  
  40.             xor     a
  41.             ld      (de),a
  42.             inc     de
  43.  
  44.             call    .copy
  45.            
  46.             ld      a,0x07          ; Make sure we get 0
  47.             out     (0xfe),a        ; on MIC bit when doing IN.
  48.  
  49.             ld      a,0xa9          ; Set I,R,AF' to known values.
  50.             ld      i,a
  51.             ld      r,a
  52.             or      a
  53.             ex      af,af
  54.  
  55.             ld      bc,65535        ; Init CRC.
  56.             ld      d,b
  57.             ld      e,c
  58.             exx
  59.  
  60.             ld      sp,data.regs
  61.  
  62.             ; Test vector sequence combinator.
  63.  
  64. .loop       ld      hl,counter
  65.             ld      de,shifter+1
  66.             ld      bc,vector
  67.            
  68.             macro   combine base,count,offset:0,last:1
  69.             repeat  count
  70.             ld      a,(bc)
  71.             xor     (hl)
  72.             ex      de,hl
  73.             xor     (hl)
  74.             ld      (base+offset+@#),a
  75.             if      ( @# < count-1 ) | ! last
  76.             inc     c
  77.             inc     e
  78.             inc     l
  79.             endif
  80.             endrepeat
  81.             endm
  82.  
  83.             ld      a,(bc)
  84.             xor     (hl)
  85.             ex      de,hl
  86.             xor     (hl)
  87.             cp      0x76        ; Skip halt.
  88.             jp      z,.next
  89.             ld      (.opcode),a
  90.             inc     c
  91.             inc     e
  92.             inc     l
  93.  
  94.             ld      a,(bc)
  95.             xor     (hl)
  96.             ex      de,hl
  97.             xor     (hl)
  98.             ld      (.opcode+1),a
  99.             cp      0x76        ; Skip halt...
  100.             jp      nz,.ok
  101.             ld      a,(.opcode)
  102.             and     0xdf        ; ... with IX/IY prefix.
  103.             cp      0xdd
  104.             jp      z,.next
  105. .ok         inc     c
  106.             inc     e
  107.             inc     l
  108.  
  109.             combine .opcode,opsize-2,2,0
  110.             combine data,datasize
  111.  
  112.             ; The test itself.
  113.  
  114.             pop     af
  115.             pop     bc
  116.             pop     de
  117.             pop     hl
  118.             pop     ix
  119.             pop     iy
  120.             ld      sp,(data.sp)
  121.  
  122. .opcode     ds      opsize
  123. .continue
  124.             if      memptr
  125.             ld      hl,data
  126.             bit     0,(hl)
  127.             endif
  128.  
  129.             ld      (data.sp),sp
  130.             ld      sp,data.regstop
  131.             push    iy
  132.             push    ix
  133.             push    hl
  134.             push    de
  135.             push    bc
  136.             push    af
  137.            
  138.             ld      hl,data
  139.  
  140.             if      maskflags
  141.             ld      a,(hl)
  142. .flagptr    and     0xff
  143.  
  144.             if      ! onlyflags
  145.             ld      (hl),a
  146.             endif
  147.  
  148.             endif
  149.  
  150.             ; CRC update.
  151.  
  152.             if      ! onlyflags
  153.             ld      b,datasize
  154.             endif
  155.  
  156.             if      ! ( onlyflags & maskflags )
  157. .crcloop    ld      a,(hl)
  158.             endif
  159.  
  160.             exx
  161.             xor     e
  162.  
  163.             ld      l,a
  164.             ld      h,crctable/256
  165.            
  166.             ld      a,(hl)
  167.             xor     d
  168.             ld      e,a
  169.             inc     h
  170.  
  171.             ld      a,(hl)
  172.             xor     c
  173.             ld      d,a
  174.             inc     h
  175.  
  176.             ld      a,(hl)
  177.             xor     b
  178.             ld      c,a
  179.             inc     h
  180.  
  181.             ld      b,(hl)
  182.  
  183.             exx
  184.  
  185.             if      ! onlyflags
  186.             inc     hl
  187.             djnz    .crcloop
  188.             endif
  189.  
  190.             ; Multibyte counter with arbitrary bit mask.
  191.  
  192. .next       ld      hl,countmask
  193.             ld      de,counter
  194.             ld      b,vecsize
  195. .countloop  ld      a,(de)
  196.             or      a
  197.             jr      z,.countnext
  198.             dec     a
  199.             and     (hl)
  200.             ld      (de),a
  201.             jp      .loop
  202. .countnext  ld      a,(hl)
  203.             ld      (de),a
  204.             inc     l
  205.             inc     e
  206.             djnz    .countloop
  207.  
  208.             ; Multibyte shifter with arbitrary bit mask.
  209.  
  210. .maskptr    ld      hl,shiftmask
  211. .valptr     ld      de,shifter
  212.             ld      a,(de)
  213.             add     a,a
  214.             neg
  215.             add     (hl)
  216.             xor     (hl)
  217.             and     (hl)
  218.             ld      (de),a
  219.             jp      nz,.loop
  220. .shiftloop  inc     l
  221.             inc     e
  222.             ld      a,e
  223.             cp      shiftend % 256
  224.             jr      z,.exit
  225.             ld      a,(hl)
  226.             dec     a
  227.             xor     (hl)
  228.             and     (hl)
  229.             jr      z,.shiftloop
  230.             ld      (de),a
  231.             ld      (.maskptr+1),hl
  232.             ld      (.valptr+1),de
  233.             jp      .loop
  234.  
  235. .exit       exx
  236. .spptr      ld      sp,0
  237.             ret
  238.  
  239.             ; Misc helper routines.
  240.  
  241. .copy       push    hl
  242.             push    bc
  243.             ldir
  244.             pop     bc
  245.             pop     hl
  246.             ret
  247.  
  248. .clear      push    hl
  249.             push    bc
  250.             ld      h,d
  251.             ld      l,e
  252.             ld      (hl),0
  253.             inc     de
  254.             dec     bc
  255.             ldir
  256.             pop     bc
  257.             pop     hl
  258.             ret
  259.  
  260.             align   256
  261.  
  262.             include crctab.asm
  263.  
  264. ; If this moves from 0x8800, all tests which use this address
  265. ; will need to have their CRCs updated, so don't move it.
  266.  
  267.             align   256
  268. data
  269. .regs       ds      datasize-4
  270. .regstop
  271. .mem        ds      2
  272. .sp         ds      2
  273.  
  274. .jump
  275.             if      postccf
  276.             ccf
  277.             else
  278.             inc     bc
  279.             endif
  280.             jp      test.continue
  281.  
  282. ; This entire workspace must be kept within single 256 byte page.
  283.  
  284. vector      ds      vecsize
  285. counter     ds      vecsize
  286. countmask   ds      vecsize
  287. shifter     ds      1+vecsize
  288. shiftend
  289. shiftmask   ds      1+vecsize
  290.  
  291. ; EOF ;
  292.