home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / MEMTEST / WORM21.ASM < prev   
Assembly Source File  |  2000-06-30  |  7KB  |  259 lines

  1. ;        WORM.ASM ver 2.1 (revised 10/9/81)
  2. ;
  3. ;Jim Eccleston July 19 1980 - program originally written
  4. ;
  5. ;Keith Petersen, W8SDZ, October 9, 1981 - fixed bug which
  6. ;    caused program to print one trap error at start.
  7. ;    Added REPORT conditional assembly so addresses
  8. ;    won't be reported unless there is an error.
  9. ;    Added equates for console ports.
  10. ;
  11. ;Allen Mar August 8, 1980 - added 'label + offset'
  12. ;    so COM file can be generated without DDT.COM
  13. ;    Thanks to Bill Precht and Ward Christensen
  14. ;    who used it in his 'PMMIBYE2' remote CP/M
  15. ;    program...
  16. ;
  17. ;************************************************************************
  18. ;*                                    *
  19. ;*            W O R M T E S T                    *
  20. ;*                                    *
  21. ;*    A serious flaw exists in most memory test routines when        *
  22. ;*    applied to Z-80 systems. A board can be tested for hours    *
  23. ;*    and never drop a bit, then when it's loaded with a program    *
  24. ;*    fail instantly. The problem is that access timing on a        *
  25. ;*    Z-80 instruction fetch (the M-1 cycle) is significantly        *
  26. ;*    more critical than on a simple read cycle. No matter how    *
  27. ;*    fancy a normal memory test gets, it never makes demands        *
  28. ;*    on memory speed that an actual program does. The only way    *
  29. ;*    to check this memory for full speed operation is to         *
  30. ;*    actually run a program in it. Wormtest does just that.        *
  31. ;*                    vide The M-1 Worm. P.C. July 73 *
  32. ;*                                    *
  33. ;************************************************************************
  34. ;
  35. ;The first few lines relocate the program down to low memory
  36. ;There are two parts to the test program. The larger portion
  37. ;consists of service routines, but the Worm itself consists of
  38. ;a short 12 byte routine that upon initialization breaks away
  39. ;from the main body and crawls up through memory space giving a
  40. ;running travelogue as he goes.  If he stops talking, you know
  41. ;something bad happened, and where.  The Worm acts as the main
  42. ;program loop. It manipulates two test bytes and calls two sub-
  43. ;routines. One of the subroutines reports the location of the
  44. ;worm and detects and reports any errors in the test bytes. The
  45. ;other subroutine shifts the Worm up in memory one location and
  46. ;adjusts the return to begin execution for another loop.  There
  47. ;are seven instruction fetches per loop, with the data manipulation
  48. ;instructions in complementary pairs to ensure full speed testing
  49. ;on both ones and zeroes.  The instruction RST 7 is embedded in
  50. ;the Worm in non-executable locations as traps in case a memory
  51. ;error causes the program counter to get out of sync. The Worm
  52. ;leaves behind a slime-trail of FF's as it travels. Any execution
  53. ;of a trap is reported and the trap subroutine attempts to return
  54. ;execution back to the worm.  The error reports indicate which data
  55. ;byte was bad and what the erroneous value was.  A "D" indicates
  56. ;that bits were dropped, while a "P" indicates that bits were
  57. ;picked.  A trap error is flagged by a "T" followed by the address.
  58. ;Upon execution the Worm will immediately start reporting its
  59. ;location (by address).  Bad memory will trash the program or
  60. ;else trigger the error reports.  No memory looks like a string
  61. ;of FF's and a sequential string of traps will be reported.
  62. ;When ROM is hit, execution of the ROM program will begin,
  63. ;so if you have the Morrows Disk Controller you will know
  64. ;your memory is ok when the system re-boots.
  65. ;
  66. stport    equ    20h        ;console status port
  67. txrdy    equ    04h        ;console putput mask
  68. daport    equ    21h        ;console data port
  69. ;
  70. report    equ    0    ;<--make non-zero for address reporting
  71. ;
  72.     org    0100h
  73. ;
  74. ; Move routine relocates WORM program down to 08H
  75. ;
  76. start    lxi    d,dest        ;Destination address
  77.     lxi    h,source    ;Source address
  78.     mvi    b,pend-source+1    ;Number of bytes to move
  79. ;
  80. loop    mov    a,m        ;Get byte
  81.     stax    d        ;Put byte
  82.     inx    h        ;Bump up source adr.
  83.     inx    d        ;Bump up destination adr.
  84.     dcr    b        ;Decrease byte count
  85.     jnz    loop        ;Do again if not zero count
  86.     lxi    sp,stack    ;Set up stack pointer
  87.     lxi    b,data        ;Set up data pointer
  88.     jmp    worm+1
  89. ;
  90. dest    equ    08h        ;destination
  91. ;
  92. source    equ    $
  93. offset    equ    dest-source    ;reloc amount
  94. ;
  95. stwrm    equ    $+offset    ;Start of relocated code (08h)
  96.     dw    0ffffh
  97.     dw    0ffffh
  98.     dw    0ffffh
  99.     dw    0ffffh        ;Rst 7s
  100. ;
  101. movwrm    equ    $+offset
  102.     pop    h        ;Get address of worm + 1
  103.     mov    d,h        ;Duplicate address in d
  104.     mov    e,l        ;and e regs.
  105.     dcx    d        ;Set DE to last address of worm
  106.     mvi    b,0ch        ;Set length of worm
  107. ;
  108. getwrm    equ    $+offset
  109.     ldax    d        ;;Get byte of worm 
  110.     mov    m,a        ;Move it up one location
  111.     dcx    d        ;Adjust pointers
  112.     dcx    h
  113.     dcr    b
  114.     mov    a,b
  115.     cpi    00
  116.     jnz    getwrm
  117.     lxi    b,data        ;Restore data pointer
  118.     inx    h        ;HL to start of worm
  119.     inx    h
  120.     pchl            ;Return to worm
  121.     rst    7        ;RST 7
  122. ;
  123. rptadr    equ    $+offset
  124.     cpi    0ffh        ;Check for dropped bit error
  125.     jnz    errdrp
  126.     mov    a,b
  127.     cpi    00h        ;Check for picked bit error
  128.     jnz    errpik
  129.     jmp    rptad2        ;Show the address
  130.     rst    7
  131.     rst    7        ;Trap
  132. ;
  133. trap    equ    $+offset
  134.     mvi    a,54h        ;Print a "T"
  135.     call    output
  136.     mvi    a,20h        ;Print a " "
  137.     call    output
  138.     pop    h        ;Recover address
  139.     dcx    h        ;Adjust address
  140.     call    adout        ;Print the address
  141.     inx    h        ;Adjust address
  142.     pchl            ;Return
  143. ;
  144. rptad2    equ    $+offset
  145.     pop    h        ;Recover address
  146. ;
  147.     if    report
  148.     call    adout        ;Print address
  149.     endif
  150. ;
  151.     if    not report
  152.     nop ! nop ! nop        ;Don't print address
  153.     endif
  154. ;
  155.     inx    h        ;Adjust return address
  156.     inx    h
  157.     inx    h
  158.     pchl            ;Return
  159. ;
  160. errdrp    equ    $+offset
  161.     mvi    b,44h        ;Show it's dropped bit(s)
  162.     jmp    errprt        ;Print error message
  163. ;
  164. errpik    equ    $+offset
  165.     mvi    b,50h        ;Show it's picked bit(s)
  166. ;
  167. errprt    equ    $+offset
  168.     mov    c,a        ;Save error data
  169.     mvi    a,2ah        ;Print "*"
  170.     call    output
  171.     mvi    a,20h        ;Print " "
  172.     call    output
  173.     mov    a,b        ;Print type of error
  174.     call    output
  175.     mvi    a,20h        ;Print " "
  176.     call    output
  177.     mov    a,c        ;Get error data
  178.     call    bowcl        ;Print and end line
  179.     jmp    rptad2        ;Now try for address and return
  180. ;
  181. adout    equ    $+offset
  182.     push    h        ;Save address
  183.     mov    a,h
  184.     call    bytout        ;Its nybble time
  185.     mov    a,l
  186.     call    bowcl        ;Same with cr/lf
  187.     pop    h        ;Restore address
  188.     ret
  189. ;
  190. bytout    equ    $+offset
  191.     push    psw        ;Save A
  192.     rrc            ;Shift nybble
  193.     rrc
  194.     rrc
  195.     rrc
  196.     call    nybout        ;Nybble out 1
  197.     pop    psw        ;Restore A
  198.     call    nybout        ;Nybble out 2
  199.     ret
  200. ;
  201. bowcl    equ    $+offset
  202.     call    bytout
  203.     mvi    a,0Dh        ;C/R time
  204.     call    output
  205.     mvi    a,0Ah        ;LF time
  206.     call    output
  207.     ret
  208. ;
  209. nybout    equ    $+offset
  210.     ani    0fh        ;Strip high nibble
  211.     cpi    0ah        ;Divide alpha v numeric
  212.     jm    isnum        ;If numeric
  213.     adi    07h        ;Add alpha offset
  214. isnum    equ    $+offset
  215.     adi    30h        ;Add numeric offset
  216.     call    output
  217.     ret
  218. ;
  219. ;************************************************
  220. ;* Insert Your DIRECT Console Output Call Here  *
  221. ;* unless you want to use cp/m calls till crash *
  222. ;************************************************
  223. ;
  224. output    equ    $+offset
  225.     push    b        ;save bc
  226.     push    psw        ;save character
  227. ;
  228. lp    equ    $+offset
  229.     in    stport        ;get console status
  230.     ani    txrdy        ;ready for character?
  231.     jz    lp        ;no, loop and wait
  232.     pop    psw        ;get character
  233.     out    daport        ;output to console
  234.     pop    b        ;restore bc
  235.     ret
  236. ;
  237. data    equ    $+offset
  238.     db    00
  239. ;
  240.     ds    20
  241. stack    equ    $+offset-1
  242. ;
  243. worm    equ    $+offset
  244.     rst    7        ;Trap
  245.     ldax    b        ;Move data to A; start of worm
  246.     push    psw        ;Push test data onto stack
  247.     mvi    a,0ffh        ;Move second test byte to A
  248.     pop    b        ;Pop first test byte into B
  249.     rst    5        ;call "rptadr"
  250.     rst    7        ;Trap
  251.     rst    7
  252.     rst    7
  253.     nop            ;"rptadr" return location
  254.     rst    2        ;call "movwrm"
  255. ;
  256. pend    equ    $        ;program end
  257. ;
  258.     end    0100h
  259.