home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol073 / memrs.asm < prev    next >
Assembly Source File  |  1984-04-29  |  21KB  |  991 lines

  1. ;MEMR        SEP 3, 1979
  2.     Page 0
  3. VERS    EQU    19    ;X.X
  4. ;
  5. ;
  6. ;Diss-assembly of Delta Products memory test program
  7. ;Written by D. Rasmussen January 1, 1979
  8. ;
  9. ;Extensively re-written and new tests added by Larry Alkoff
  10. ;
  11. ;Additional changes by Bill Bolton
  12. ;
  13. ;********************************************
  14. ;    FIX LIST BY WFB
  15. ;********************************************
  16. ;15/JULY/81    V19-OPTIONAL CONOUT VIA BDOS/BIOS
  17. ;            AND NEW COMMAND LINE ARGUMENT
  18. ;            TEST, COMMENT TEXT UPDATED
  19. ;14/JULY/81    V18-CONOUT VIA BDOS
  20. ;14/JULY/81    V17-MESSAGES CORRECTED
  21. ;
  22. ;********************************************
  23. ;    FIX LIST by LBA
  24. ;********************************************
  25. ;9/3    V16-MISC CLEANUP
  26. ;6/11    V15-BUGF ANI 7FH IN HEATH CRTIN
  27. ;5/25    V14-MSGS, RANGE LIMITS, FIX S.B. TEST
  28. ;5/19    V13-CONDX FOR MONITOR I/O
  29. ;5/18    V12-IMPROVE WALKING BIT AND CHECKERBOARD TEST
  30. ;5/15    V11-BUGF CONO PRESERVE REGS
  31. ;    AND DEFAULT END ADDR (DEFEND) NOW JUST BELOW BIOS
  32. ;5/13/79 V0-OBJECT CODE AND SOURCE LISTING
  33. ;    GIVEN TO LA BY HEAD OF DELTA PRODUCTS
  34. ;    AT SAN FRANCISCO COMPUTER FAIR.
  35. ;
  36. ;********************************************
  37. ;    INFORMATION ABOUT THIS TEST
  38. ;********************************************
  39. ;
  40. ;    This memory test will use default address
  41. ;if starting and ending address questions
  42. ;are answered with a "CR".
  43. ;Memory test can be terminated by a "SP".
  44. ;
  45. ;Command line arguments are accepted as follows -
  46. ;    '-' start of argument string
  47. ;    'B' console output via BDOS (for spooling or printing)
  48. ;    'R' random number test only
  49. ;
  50. ;The arguments may be given separately or together,
  51. ;i.e. -B, -R, -BR, -RB, or even -B -R
  52. ;The default upper test boundary address is modifed
  53. ;to the bottom of the BDOS if the B option is given.
  54. ;
  55. ;    This test is designed to display the most common
  56. ;problems first and most uncommon ones last.
  57. ;The test never finishes by itself.
  58. ;The operator may terminate by pressing the
  59. ;space bar at any time.
  60. ;Generally memory chip failures will be found within 5 seconds.
  61. ;The test takes about 3 minutes to run all
  62. ;phases in a 32k board.
  63. ;    To completely test for all address open and short
  64. ;combinations, the test should be run over a 4K boundry.
  65. ;Then run the test over the full range. There are some
  66. ;subtle things that get missed if you only run the
  67. ;test over the full range and not 4K at a time.
  68. ;    The test falls into a random numbers test at the end
  69. ;of the first phase and will stay there until
  70. ;a space bar is pressed.
  71. ;If the memory board passes these tests and will
  72. ;run for an hour on the random numbers test
  73. ;without a problem, look elsewhere for your troubles.
  74. ;
  75. ;
  76. ;The following tests are performed:
  77. ;
  78. ;FAST COMPLEMENT:
  79. ;This is a test of ALL MEMORY starting at 0
  80. ;and testing to memtop (except its own loop).
  81. ;Pick up each byte, complement and try to store.
  82. ;Quickly test if properly complemented
  83. ;and restore original byte.
  84. ;
  85. ;STUCK BIT:
  86. ;1. Fills test area with 0FFH and checks for 0FFH.
  87. ;2. Then fills test area with 0's and tests for 0's.
  88. ;3. Then re-fills with 0FFH and tests
  89. ;   just in case the bit was originally high in (1.).
  90. ;
  91. ;ADJACENT BIT SHORTED:
  92. ;Sets a single bit in all bytes high.
  93. ;This checks if a bit is shorted to the
  94. ;ones on each side.
  95. ;The test repeats 8 times, rotating
  96. ;the test bit from LSB to MSB.
  97. ;
  98. ;CHECKERBOARD:
  99. ;Fill memory with 0AAH, 55H pattern and check.
  100. ;This forms an alternating "checkerboard".
  101. ;Then reverse the pattern and re-check.
  102. ;
  103. ;WALKING BIT TEST:
  104. ;Fill memory with one bit set for each byte.
  105. ;The bit rotates at memory increases.
  106. ;For example, byte 1 has bit 1 set, byte 2 bit 2 etc.
  107. ;Then memory is checked for the proper pattern.
  108. ;This is repeated 8 times, rotating the bit each time.
  109. ;Then, the whole procedure is repeated rotating
  110. ;the opposite way.
  111. ;
  112. ;ADDRESS SHORTED:
  113. ;Fills all memory with 55H then writes an 0AAH
  114. ;at 0 (or the lowest memory tested).
  115. ;It then tests the rest of memory for 55H's.
  116. ;Then it clears location of the 0AAH and
  117. ;writes it into location 1.
  118. ;Then does same with location 2,4,8,etc setting
  119. ;a new address bit high each time and testing all of memory.
  120. ;If any address bit is shorted to another,
  121. ;the test will find an 0AAH in another location
  122. ;than the place it wrote one.
  123. ;This test takes the most time and is run last.
  124. ;
  125. ;RANDOM NUMBERS:
  126. ;A random number routine generates an 8 bit number
  127. ;pattern and writes it through all test memory.
  128. ;It then re-inserts the same seed to the routine
  129. ;and test reads the memory. A new seed is generated
  130. ;and the exercise is repeated with a new pattern.
  131. ;This goes on and on reporting each loop through
  132. ;until terminated with the space bar.
  133. ;
  134. ;
  135. ;********************************************
  136. ;    SWITCHES
  137. ;********************************************
  138. ;
  139. TRUE    EQU    0FFFFH
  140. FALSE     EQU    NOT TRUE
  141. ;
  142. NOCHEK    EQU    FALSE        ;NO RANGE CHECKING
  143. HEATH    EQU    FALSE
  144. CRAM    EQU    4200H AND HEATH    ;CP/M RAM BASE (0=STANDARD)
  145. ;
  146. ;    PICK ONE I/O ROUTINE
  147. ;
  148. CPMIO    EQU    TRUE        ;I/O VIA CP/M, WARM BOOT EXIT
  149. LAPIO    EQU    FALSE        ;I/O VIA LAPPLE
  150. H84CRT    EQU    FALSE        ;HEATH ROUTINE
  151. ;
  152. ;********************************************
  153. ;    EQUATES
  154. ;********************************************
  155. ;
  156. DEFST    EQU    500H        ;DEFAULT STARTING ADDR (INCLUSIVE)
  157. DEFEND    EQU    0F5FFH        ;DEFAULT ENDING ADDR (INCLUSIVE)
  158. TPA    EQU    CRAM+100H
  159. STACK    EQU    CRAM+100H    ;STACK
  160. RETRYS    EQU    18        ;# OF RETRYS
  161. ENDADD    EQU    STACK-2        ;ENDING ADDRESS
  162. MEM    EQU    STACK-4        ;STARTING ADDRESS
  163. MEMTOPL    EQU    STACK-6        ;STORE TOP OF MEMORY
  164. COUNT    EQU    STACK-7        ;STORAGE FOR RETRY COUNT
  165. TESTBYTE EQU    STACK-8        ;STORAGE
  166. TBUF    EQU    CRAM+82H    ;OR STACK-9 IF NOT CP/M TBUFF
  167. SEED    EQU    STACK-11
  168. SEEDST    EQU    STACK-13
  169. TEMP    EQU    STACK-15
  170. WBOOT    EQU    CRAM+0        ;WARM BOOT ENTRY
  171. BDOS    EQU    CRAM+5        ;BDOS ENTRY
  172. CR    EQU    0DH
  173. LF    EQU    0AH
  174. BD$OFF    EQU    -7        ;OFFSET TO BELOW BDOS
  175. BI$OFF    EQU    -4        ;OFFSET TO BELOW BIOS
  176. ;
  177. ;********************************************
  178. ;    START OF PROGRAM
  179. ;********************************************
  180. ;
  181.     ORG    TPA
  182. ;
  183. START:    JMP    START2
  184. ;
  185. JEXIT:    JMP    MONIT
  186. JCONI:    JMP    CONIN        ;JUMPS MAY BE PATCHED
  187. JCONS:    JMP    CONST
  188. JCONO:    JMP    CONOUT
  189. ;
  190. ;********************************************
  191. ;    MAIN LOOP
  192. ;********************************************
  193. ;
  194. START2:
  195.     LXI    SP,STACK-16
  196.     CALL    INIT
  197.     MVI    A,RETRYS    ;SET RETRY COUNT
  198.     STA    COUNT
  199.     LXI    D,SIG    ;SIGN ON
  200.     CALL    PMSG    ;PRINT IT
  201.     CALL    CRLF
  202.     CALL    CRLF
  203.     LDA    BDOS$FLAG
  204.     ORA    A        ;BIOS OUTPUT
  205.     JNZ    BDOS$1        ;NO
  206.     LXI    D,BIOSMSG
  207.     CALL    PMSG
  208.     LXI    D,LOCMSG
  209.     CALL    PMSG
  210.     LHLD    WBOOT+1    ;GET LOCATION OF BIOS ENTRY
  211.     LXI    D,BI$OFF+1 ;OFFSET TO START OF BIOS
  212.     DAD    D
  213.     MVI    L,0
  214.     JMP    GO$ON$1
  215. ;
  216. BDOS$1:
  217.     LXI    D,BDOSMSG
  218.     CALL    PMSG
  219.     LXI    D,LOCMSG
  220.     CALL    PMSG
  221.     LHLD    BDOS+1    ;GET LOCATION OF BDOS ENTRY
  222.     LXI    D,BD$OFF+1 ;OFFSET TO START OF BDOS
  223.     DAD    D
  224.     MVI    L,0
  225. GO$ON$1:
  226.     CALL    PHL    ;PRINT LOCATION OF BIOS
  227.     LXI    D,MEMSG
  228.     CALL    PMSG
  229.     CALL    MEMTOP    ;FIND TOP OF MEMORY
  230.     SHLD    MEMTOPL    ;AND SAVE
  231.     CALL    PHL    ;AND PRINT IT
  232.     LXI    D,SPMSG
  233.     CALL    PMSG
  234.     LXI    D,XPMSG    ;EXPLAIN
  235.     CALL    PMSG
  236.     LDA    BDOS$FLAG
  237.     ORA    A    ;BIOS OUTPUT?
  238.     JNZ    BDOS$4    ;NO
  239.     LXI    D,BIOSMSG
  240.     JMP    GO$ON$4
  241. ;
  242. BDOS$4:
  243.     LXI    D,BDOSMSG
  244. GO$ON$4:
  245.     CALL    PMSG
  246.     CALL    CRLF
  247.     LXI    D,SMSG    ;STARTING ADDR MSG
  248.     CALL    PMSG    ;PRINT IT
  249. LOWER0:            ;GET STARTING ADDRESS
  250.     CALL    GETADD    ;INPUT ADDR FROM CONIN
  251.     JNC    LOWER2    ;NC MEANS ADDR ENTERED
  252.     LXI    H,LASTB    ;CY=CR GIVES DEFAULT
  253.     PUSH    H
  254.     CALL    PHL    ;PRINT DEFAULT ADDR
  255.     POP    H
  256. LOWER2:
  257.     IF HEATH OR NOCHEK
  258.     SHLD MEM ! JMP UPPER0    ;NO CHECKING
  259.     ENDIF
  260.     XCHG        ;ST ADDR TO DE
  261.     LXI    H,LASTB    ;TOP OF THIS PROGRAM
  262.     CALL    HILO    ;MUST BE BELOW
  263.     XCHG        ;STARTING ADDR
  264.     SHLD    MEM    ;SAVE STARTING ADDR
  265.     JNC    UPPER0    ;LOWER ADDR IS OK, GET UPPER
  266.     LXI    D,LOWMSG
  267.     CALL    PMSG    ;SAY TOO LOW
  268.     LXI    H,LASTB
  269.     CALL    PHL    ;SAY LOWEST OK ADDR
  270.     JMP    LOWER0
  271. UPPER0:            ;GET ENDING ADDR
  272.     LXI    D,EMSG    ;ENDING ADDR MSG
  273.     CALL    PMSG
  274.     CALL    GETADD    ;GET ENDING ADDR FROM KEYBOARD
  275.     JNC    UPPER2    ;NC MEANS ADDR ENTERED
  276.     LDA    BDOS$FLAG
  277.     ORA    A    ;BIOS OUTPUT ?
  278.     JNZ    BDOS$2    ;NO
  279.     LHLD    WBOOT+1    
  280.     LXI    D,BI$OFF ;ESTABLISH DEFAULT ADDRESS
  281.     JMP    GO$ON$2
  282. ;
  283. BDOS$2:
  284.     LHLD    BDOS+1    ;CY=CR MEANS DEFAULT
  285.     LXI    D,BD$OFF ;ESTABLISH DEFAULT END ADDR
  286. GO$ON$2:
  287.     DAD    D    ;JUST BELOW BIOS OR BDOS
  288.     PUSH    H
  289.     CALL    PHL    ;PRINT DEFAULT ADDR
  290.     POP    H
  291. UPPER2:
  292.     XCHG        ;END ADDR TO DE
  293.     IF HEATH OR NOCHEK
  294.     JMP    UPPERX    ;NO CHECKING
  295.     ENDIF
  296.     LHLD    MEM    ;GET START ADDR
  297.     INX    H
  298.     CALL    HILO    ;ERROR,END ADDR MUST
  299.     JNC    UPPERX    ;BE ABOVE START ADDR
  300.     LXI    D,UPPMSG
  301.     CALL    PMSG
  302.     JMP    UPPER0    ;TRY AGAIN
  303. ;
  304. UPPERX:
  305.     XCHG        ;END ADDR
  306.     SHLD    ENDADD    ;SAVE ENDING ADDR
  307.     SHLD    SEED    ;USE AS SEED ALSO
  308.     LXI    D,CTUMSG    ;CONTINUE?
  309.     CALL    PMSG
  310. WAIT:
  311.     CALL    CSTAT    ;WAIT FOR RESPONSE
  312.     ORA    A
  313.     JZ    WAIT
  314. RESTART:
  315.     CALL    CSTAT    ;SEE IF ABORT
  316.     CALL    CRLF
  317.     LDA    RAND$FLAG
  318.     ORA    A    ;DO RANDOM TEST ONLY ?
  319.     JNZ    RTEST    ;YES, GO DO RANDOM NUMBERS
  320. ;
  321. ;********************************************
  322. ;    DO FAST COMPLEMENT TEST - ALL MEMORY
  323. ;********************************************
  324. ;
  325.     LXI    D,FCTST
  326.     CALL    PMSG    ;PRINT FAST COMP TEST
  327.     IF NOT HEATH
  328.     LXI    H,0    ;START AT 0
  329.     ENDIF
  330.     IF HEATH
  331.     LXI    H,2000H
  332.     ENDIF
  333.     LXI D,FCTEST-1    ;AND STOP AT LOOP
  334.     CALL    FCTEST    ;DO TEST
  335.     LHLD    MEMTOPL    ;NOW TEST
  336.     XCHG        ;TO MEMTOP
  337.     LXI    H,FCLPX    ;STARTING HERE
  338.     CALL    FCTEST
  339. ;
  340. ;********************************************
  341. ;    DO BIT STUCK TEST
  342. ;********************************************
  343.     LXI    D,BSTST
  344.     CALL    PMSG    ;PRINT TEST
  345.     MVI    B,0FFH    ;FF TEST START
  346.     CALL    TESTW    ;WRITE TEST BYTE
  347.     CALL    TESTR    ;CHECK TEST BYTE
  348.     MVI    B,0    ;ZEROS TEST
  349.     CALL    TESTW    ;WRITE TEST BYTE 0
  350.     CALL    TESTR    ;TEST
  351.     MVI    B,0FFH    ;BACK HI TEST
  352.     CALL    TESTW    ;WRITE TEST BYTE 0FFH
  353.     CALL    TESTR    ;TEST
  354. ;
  355. ;********************************************
  356. ;    DO SHORTED BIT TEST
  357. ;********************************************
  358.     LXI    D,SBTST
  359.     CALL    PMSG    ;PRINT BIT SHORT TEST
  360.     MVI    A,1    ;ROTATE BIT TEST
  361. LOOP2:    MOV    B,A    ;MAKE TEST BYTE
  362.     CALL    ROTTST    ;DO TEST
  363.     JNC    LOOP2    ;DONE WITH 8 BITS?
  364. ;
  365. ;********************************************
  366. ;    DO CHECKERBOARD TEST
  367. ;********************************************
  368.     LXI    D,CBTST
  369.     CALL    PMSG    ;PRINT CHECKBOARD TEST
  370.     MVI    B,55H
  371.     CALL    CBTEST
  372.     MVI    B,0AAH
  373.     CALL    CBTEST
  374. ;
  375. ;********************************************
  376. ;    DO WALKING BIT TEST
  377. ;********************************************
  378.     LXI    D,WBLTST
  379.     CALL    PMSG    ;PRINT WALKING BIT LEFT
  380.     MVI    B,80H
  381. WALL:    CALL    WALKL    ;DO TEST, SAVES B
  382.     MOV    A,B
  383.     RLC        ;NEXT SEED BIT
  384.     MOV    B,A
  385.     CPI    80H    ;DONE IF
  386.     JNZ    WALL
  387.     LXI    D,WBRTST
  388.     CALL    PMSG    ;PRINT WALKING BIT RIGHT
  389.     MVI    B,1
  390. WALR:    CALL    WALKR    ;DO TEST, SAVES B
  391.     MOV    A,B
  392.     RRC        ;NEXT SEED BIT
  393.     MOV    B,A
  394.     CPI    1    ;DONE IF
  395.     JNZ    WALR
  396. ;
  397. ;********************************************
  398. ;    DO ADDRESS LINE TEST
  399. ;********************************************
  400.     LXI    D,ALTST
  401.     CALL    PMSG    ;PRINT ADDR LINE TEST
  402.     MVI    B,055H    ;TEST BYTE
  403.     CALL    ADTEST    ;TEST
  404.     MVI    B,0AAH    ;TEST BYTE
  405.     CALL    ADTEST    ;TEST
  406. ;
  407. ;********************************************
  408. ;    DO RANDOM NUMBER TEST
  409. ;********************************************
  410. RTEST:    LXI    D,RNTST
  411.     CALL    PMSG
  412.     MVI    C,'1'
  413. RANDLP:    PUSH    B
  414.     CALL    RNDW    ;DO RANDOM # TEST
  415.     CALL    SPACE
  416.     POP    B
  417.     CALL    CONO
  418.     INR    C
  419.     MVI    A,'9'
  420.     CMP    C
  421.     JNZ    RANDLP    ;CONTINUE RANDOM NR TEST
  422. ;
  423.     LXI    D,MSGOK    ;POINT AT TEST COMPLETE MSG
  424.     CALL    PMSG
  425.     JMP    RESTART    ;START TEST AGAIN WITH OLD PARAMETERS
  426. ;
  427. ;********************************************
  428. ;    FINISHED WITH MAIN LOOP
  429. ;********************************************
  430. ;
  431. ERROR:            ;PRINT ERROR LOCATIONS
  432.     PUSH    B
  433.     PUSH    D
  434.     PUSH    H
  435.     PUSH    PSW    ;SAVE ALL REGS
  436.     CALL    CRLF
  437.     LXI    D,MSG1
  438.     LDA    COUNT
  439.     CPI    RETRYS
  440.     CZ    PMSG    ;PRINT LABELS
  441.     CALL    PHL    ;PRINT HL REG
  442.     MOV    D,B    ;GET SHOULD BE DATA
  443.     CALL    CNVT    ;PRINT HEX
  444.     MOV    A,B
  445.     CALL    CNVTB
  446.     POP    PSW
  447.     PUSH    PSW
  448.     MOV    D,A    ;GET WAS DATA
  449.     CALL    CNVT    ;PRINT HEX
  450.     POP    PSW
  451.     CALL    CNVTB
  452.     LDA    COUNT    ;GET ERROR COUNT
  453.     DCR    A    ;ONE LESS
  454.     STA    COUNT    ;PUT BACK COUNT
  455.     JNZ    MORET
  456.     LXI    D,CTUMSG
  457.     CALL    PMSG
  458.     CALL    GETADD    ;SEE IF STOP OR CONTINUE
  459.     MVI    A,RETRYS
  460.     STA    COUNT    ;RESET COUNT
  461. MORET:    POP    H    ;GET ALL REGS BACK
  462.     POP    D    ;AND CONTINUE TEST
  463.     POP    B
  464.     RET
  465. ;
  466. PHL:            ;PRINT HL REGISTER
  467.     MOV    D,H
  468.     CALL    CNVT    ;MAKE ADDR OF ERROR ASCII
  469.     MOV    D,L
  470.     CALL    CNVT
  471.     CALL    TAB
  472.     RET
  473. ;
  474. PMSG:        ;PRINT STRING POINTED BY DE
  475.     CALL    CSTAT    ;POSS ABORT AT EVERY PMSG
  476. PMSGLP:    LDAX    D    ;GET BYTE TO PRINT
  477.     ORA    A    ;END OF TEXT?
  478.     RZ
  479.     MOV    C,A    ;CONVENTION
  480.     CALL    CONO    ;GOTO OUTPUT
  481.     INX    D
  482.     JMP    PMSGLP
  483. ;
  484. FCTEST:            ;COMPLEMENT BYTE AND RESTORE
  485.     MOV A,M ! CMA
  486.     MOV    M,A    ;VERY FAST CHANGE
  487.     MOV    B,A    ;SAVE COMPLEMENTED BYTE
  488.     MOV    C,M    ;SEE WHAT GOT STORED
  489.     MOV A,B ! CMA    ;ORIG BYTE
  490.     MOV    M,A    ;ALWAYS RESTORED
  491. FCLPX:    MOV A,C ! CMP B    ;DID IT COMPLEMENT?
  492.     CNZ    ERROR
  493.     INX H ! CALL HILO
  494.     JNC    FCTEST    ;DO MORE
  495.     RET        ;DONE
  496. ;
  497. LOAD:            ;GET ADDRESSES TO TEST
  498.     CALL    CSTAT    ;POSS ABORT AT EVERY LOAD
  499.     LHLD    ENDADD    ;GET ENDING ADDR
  500.     XCHG        ;INTO DE
  501.     LHLD    MEM    ;GET STARTING ADDR
  502.     RET
  503. ;
  504. TESTW:            ;FILL MEMORY WITH TEST BYTE
  505.     CALL    LOAD
  506. WLOOP:    MOV    M,B    ;PUT TEST BYTE IN MEMORY
  507.     INX H ! CALL HILO
  508.     JNC    WLOOP
  509.     RET
  510. ;
  511. TESTR:        ;READ AND COMPARE MEMORY TO TEST BYTE
  512.     LHLD    MEM
  513. TESTADR:
  514.     XCHG
  515.     LHLD    ENDADD    ;GET STARTING ADDR
  516.     XCHG
  517. RLOOP:    MOV A,M ! CMP B    ;CHECK BYTE
  518.     CNZ    ERROR
  519.     INX H ! CALL HILO
  520.     JNC    RLOOP
  521.     RET
  522. ;
  523. CBTEST:            ;CHECKERBOARD TEST
  524.     CALL    LOAD
  525. CBWLP:    MOV    M,B    ;B HAS TEST BYTE
  526.     INX H ! CALL HILO
  527.     JC    CBR    ;TIME TO READ
  528.     MOV A,B ! CMA    ;55H BECOMES 0AAH
  529.     MOV    M,A    ;STORE COMPLEMENT
  530.     INX H ! CALL HILO
  531.     JNC    CBWLP
  532. CBR:            ;READ AND TEST CHECKERBOARD
  533.     CALL    LOAD
  534. CBRLP:    MOV A,M ! CMP B    ;CHECK BYTE
  535.     CNZ    ERROR
  536.     INX H ! CALL HILO
  537.     RC        ;DONE
  538.     MOV A,B ! CMA ! MOV B,A
  539.     MOV A,M ! CMP B    ;CHECK BYTE
  540.     CNZ    ERROR
  541.     MOV A,B ! CMA ! MOV B,A
  542.     INX H ! CALL HILO
  543.     JNC    CBRLP
  544.     RET
  545. ;
  546. CSTAT:        ;CONSOLE ABORT (SAVES ALL REGS)
  547.     PUSH H ! PUSH D ! PUSH B
  548.     CALL    JCONS    ;SEE IF KEY STRUCK
  549.     ORA    A    ;SET FLAGS
  550.     JZ    NOKEY
  551.     CALL    JCONI    ;GET KEY
  552.     CPI    ' '    ;EXIT IF SPACE
  553.     JZ    RETURN
  554.     CPI    3    ;OR ^C
  555.     JZ    RETURN
  556.     CPI    18H    ;^X
  557.     JZ    START    ;RE-START TEST
  558. NOKEY:    POP B ! POP D ! POP H
  559.     RET
  560. ;
  561. CNVT:            ;CONVERT REG D TO HEX ASCII
  562.     MOV    A,D
  563.     RRC        ;GET HIGH NIBBLE
  564.     RRC
  565.     RRC
  566.     RRC
  567.     ANI    00FH
  568.     CALL    CNV    ;MAKE NIBBLE ASCII
  569.     MVI    A,00FH
  570.     ANA    D    ;GET LOW NIBBLE
  571.     CALL    CNV    ;MAKE NIBBLE ASCII
  572.     RET
  573. ;
  574. CNV:    ADI    030H
  575.     CPI    03AH
  576.     JM    DONE
  577.     ADI    007H
  578. DONE:    MOV    C,A
  579.     CALL    CONO
  580.     RET
  581. ;
  582. ROTTST:            ;ROTATE TEST
  583.     PUSH    PSW
  584.     CALL    TESTW
  585.     POP    PSW
  586.     PUSH    PSW
  587.     CALL    TESTR
  588.     POP    PSW
  589.     RLC
  590.     RET
  591. ;
  592. WALKL:        ;LEFT WALKING BIT TEST
  593.     PUSH    B    ;SAVE SEED
  594.     CALL    LOAD
  595. WLSTOR:    MOV    A,B    ;GET BYTE
  596.     RLC        ;ROTATE LEFT
  597.     MOV    B,A    ;AND RESAVE IN B
  598.     MOV    M,A    ;TO MEMORY
  599.     INX H ! CALL HILO
  600.     JNC    WLSTOR
  601.     CALL    LOAD
  602.     POP B ! PUSH B    ;GET SEED BIT
  603. WLTST:    MOV    A,B    ;NOW CHECK
  604.     RLC
  605.     MOV    B,A
  606.     MOV A,M ! CMP B    ;CHECK BYTE
  607.     CNZ    ERROR
  608.     INX H ! CALL HILO
  609.     JNC    WLTST
  610.     POP    B    ;ORIG SEED
  611.     RET        ;DONE
  612. ;
  613. WALKR:        ;RIGHT WALKING BIT TEST
  614.     PUSH    B    ;SAVE SEED
  615.     CALL    LOAD
  616. WRSTOR:    MOV    A,B    ;GET BYTE
  617.     RRC        ;ROTATE RIGHT
  618.     MOV    B,A    ;AND RESAVE IN B
  619.     MOV    M,A    ;TO MEMORY
  620.     INX H ! CALL HILO
  621.     JNC    WRSTOR
  622.     CALL    LOAD
  623.     POP B ! PUSH B    ;GET SEED BIT
  624. WRTST:    MOV    A,B    ;NOW CHECK
  625.     RRC
  626.     MOV    B,A
  627.     MOV    A,M    ;CHECK BYTE
  628.     CMP    B
  629.     CNZ    ERROR
  630.     INX H ! CALL HILO
  631.     JNC    WRTST
  632.     POP    B    ;ORIG SEED
  633.     RET        ;DONE
  634. ;
  635. ADTEST:            ;ADDRESS SHORTED TEST
  636.     CALL    TESTW    ;FILL MEMORY WITH TEST BYTE
  637.     MOV    A,B
  638.     STA    TESTBYTE    ;SAVE TEST BYTE
  639.     CALL    LOAD
  640.     CMA
  641.     MOV    M,A
  642.     INX    H
  643.     CALL    TESTADR
  644.     LXI    B,1    ;START ADDR LSB ON
  645. LOOP4:    LHLD    MEM
  646.     DAD    B
  647.     RC        ;ROLLED OVER 65K
  648.     MOV    A,D    ;GET TEST ADDR
  649.     SUB    H    ;PAST END?
  650.     RC        ;KEEP GOING IF NO CARRY
  651.     JNZ    INXHA
  652.     MOV    A,E
  653.     SUB    L
  654.     RC
  655. INXHA:    LDA    TESTBYTE
  656.     PUSH    B
  657.     MOV    B,A
  658.     CMA        ;INVERT BITS
  659.     MOV    M,A    ;WRITE TO TEST MEMORY
  660.     INX H ! CALL HILO
  661.     JC    OVERFL
  662.     CALL    TESTADR    ;TEST
  663.     POP    H
  664.     DAD    H
  665.     RC
  666.     MOV    B,H
  667.     MOV    C,L
  668.     JMP    LOOP4
  669. ;
  670. OVERFL:    POP    B
  671.     RET
  672. ;
  673. GETBYT:    CALL    CHAR
  674.     RZ
  675.     CPI    ' '    ;EXIT IF SPACE
  676.     JZ    RETURN
  677.     CPI    3    ;^C
  678.     JZ    RETURN
  679.     CPI    18H    ;^X
  680.     JZ    START
  681.     CALL    ATOH
  682.     JP    REENTER
  683.     RRC
  684.     RRC
  685.     RRC
  686.     RRC
  687.     MOV    E,A
  688.     PUSH    D
  689.     CALL    CHAR
  690.     POP    D
  691.     JZ    REENTER
  692.     CALL    ATOH
  693.     JP    REENTER
  694.     ORA    E
  695.     RET
  696. ;
  697. CHAR:    CALL    JCONI
  698.     CPI    CR
  699.     STC        ;SET CY FLAG (MAYBE CR)
  700.     RZ
  701.     PUSH    PSW
  702.     MOV    C,A
  703.     CALL    CONO
  704.     POP    PSW
  705.     RET
  706. ;
  707. ATOH:    SUI    030H
  708.     JM    BAD
  709.     CPI    00AH
  710.     RM
  711.     SUI    007H
  712.     CPI    00AH
  713.     JM    BAD
  714.     CPI    010H
  715.     RM
  716. BAD:    XRA    A    ;SET ZERO FLAG
  717.     RET
  718. ;
  719. REENTER:
  720.     POP    H    ;FIX STACK
  721.     LXI    D,IEMSG
  722.     CALL    PMSG
  723. GETADD:            ;INPUT 4 HEX VALUES FROM CONSOLE
  724.     CALL    GETBYT
  725.     RC
  726.     MOV    H,A
  727.     SHLD    TEMP
  728.     CALL    GETBYT
  729.     LHLD    TEMP
  730.     MOV    L,A
  731.     RET
  732. ;
  733. CNVTB:            ;PRINT REG A IN BINAR
  734.     MOV    E,A    ;SAVE A
  735.     MVI    D,2    ;TWO SPACES
  736.     CALL    TLOP
  737.     MVI    B,2    ;NIBBLE COUNT
  738. PNIBB:    MVI    D,4
  739. ALLBIT:    MOV    A,E    ;RESTORE A
  740.     RAL
  741.     MOV    E,A
  742.     MVI    C,030H    ;0
  743.     JNC    ZERO
  744.     MVI    C,031H    ;1
  745. ZERO:    CALL    CONO
  746.     DCR    D
  747.     JNZ    ALLBIT
  748.     CALL    SPACE    ;PRINT SPACE
  749.     DCR    B
  750.     JNZ    PNIBB
  751. TAB:    MVI    D,004H
  752. TLOP:    CALL    SPACE
  753.     DCR    D
  754.     JNZ    TLOP
  755.     RET
  756. ;
  757. CRLF:    MVI C,CR ! CALL CONO
  758.     MVI C,LF ! JMP CONO
  759. ;
  760. SPACE:    MVI    C,020H
  761. CONO:    PUSH B ! PUSH D ! PUSH H
  762.     LDA    BDOS$FLAG
  763.     ORA    A    ;BIOS OUTPUT ?
  764.     JNZ    BDOS$3    ;NO
  765.     CALL    JCONO    ;YES
  766.     JMP    GO$ON$3
  767. ;
  768. BDOS$3:    
  769.     MOV    E,C
  770.     MVI    C,2
  771.     CALL    BDOS
  772. GO$ON$3:
  773.     POP H ! POP D ! POP B
  774.     RET
  775. ;
  776. ;RANGE TESTING ROUTINE - CY SET IF RANGE EXCEEDED
  777. ;  IF    HL=DE    THEN NC AND Z SET
  778. ;  IF    HL<=DE    THEN NC
  779. ;  IF    HL>DE    THEN CY AND NZ
  780. ;  IF    HL=0    THEN CY AND Z SET
  781. HILOX:    INX    H    ;INCREMENT PNTR, CHECK RANGE
  782. HILO:
  783.     MOV A,H ! ORA L
  784.     STC ! RZ    ;TEST HL=0
  785.     MOV A,E ! SUB L    ;DE-HL
  786.     MOV A,D ! SBB H
  787.     RET
  788. ;
  789. RNDW:            ;WRITE RANDOM NUMBERS
  790.     LHLD    SEED    ;GET SEED
  791.     SHLD    SEEDST    ;SAVE IT FOR LATER
  792.     CALL    LOAD
  793. RNDWL:    CALL    RND
  794.     MOV    M,B
  795.     INX H ! CALL HILO
  796.     JNC    RNDWL
  797. ;
  798. RNDR:            ;CHECK AND READ RANDOM NUMBERS
  799.     LHLD    SEEDST    ;START WITH SAME SEED
  800.     SHLD    SEED    ;PASS SEED TO GENERATOR
  801.     CALL    LOAD    ;GET TEST ADDR
  802. RNDRL:    CALL    RND
  803.     MOV    A,M
  804.     CMP    B
  805.     CNZ    ERROR
  806.     INX H ! CALL HILO
  807.     JNC    RNDRL
  808.     RET        ;TEST DONE
  809. ;
  810. RND:            ;GENERATE RANDOM NR FROM SEED
  811.     PUSH    H
  812.     LHLD    SEED
  813.     MOV    A,L
  814.     XRA    H
  815.     MOV    B,A
  816.     RLC
  817.     MOV    L,A
  818.     ADD    H
  819.     MOV    H,A
  820.     SHLD    SEED
  821.     POP    H
  822.     RET
  823. ;
  824. RETURN:
  825.     LXI    SP,STACK-16    ;FIX STACK
  826.     JMP    JEXIT
  827. ;
  828. MEMTOP:            ;FIND TOP OF MEMORY
  829.     IF NOT HEATH
  830.     LXI    H,100H-1
  831.     ENDIF
  832.     IF HEATH
  833.     LXI    H,2000H-1
  834.     ENDIF
  835. MEMLOOP:
  836.     INR    H
  837.     JZ    FOUND    ;ABOVE 64K BOUNDRY
  838.     MOV    B,M    ;GET MEMORY BYTE
  839.     MOV    A,M    ;AND IN A
  840.     CMA
  841.     MOV    M,A    ;STORE COMP
  842.     MOV    C,M    ;GET BACK COMP BYTE
  843.     CMP    C    ;DID IT STORE OK?
  844.     MOV    M,B    ;PUT BACK ORIG
  845.     JZ    MEMLOOP
  846. FOUND:    DCR    H    ;FOUND IT
  847.     RET        ;HL=MEMTOP
  848. ;
  849. ;********************************************
  850. ;    MESSAGE AREA
  851. ;********************************************
  852. SIG:    DB    CR,LF
  853.     DB    'MEMRS Memory Test - Version '
  854.     DB    VERS/10+30H, '.', VERS MOD 10+30H
  855.     DB    0
  856. BIOSMSG:DB    'BIOS',0
  857. BDOSMSG:DB    'BDOS',0
  858. LOCMSG:    DB    ' located at ',0
  859. MEMSG:    DB    ' Top of memory at ',0
  860. SPMSG:    DB    CR,LF
  861.     DB    'Press "SP" or "^C" to warm boot at any time'
  862.     DB    CR,LF
  863.     DB    'or "^X" to restart test from beginning. ',0
  864. XPMSG:    DB    CR,LF
  865.     DB    'Response of "CR" gives default test range'
  866.     DB    CR,LF
  867.     DB    'which starts above this program and ends at ',0
  868. MSG1:    DB    'LOCATION  SHOULD BE           WAS'
  869.     DB    CR,LF,0
  870. CTUMSG:    DB    CR,LF
  871.     DB    '"CR" to continue test - "SP", "^C" to quit,'
  872.     DB    ' "^X" to restart.',0
  873. MSGOK:    DB    CR,LF
  874.     DB    'Test series complete', 0
  875. SMSG:    DB    CR,LF
  876.     DB    'Starting address (Hex or "CR") ',0
  877. EMSG:    DB    CR,LF
  878.     DB    'Ending address   (Hex or "CR") ',0
  879. IEMSG:    DB    CR,LF
  880.     DB    'Input error - Retype 4 hex digits ',0
  881. FCTST:    DB    CR,LF
  882.     DB    'Non-destructive test of ALL MEMORY starting at '
  883.     IF NOT HEATH
  884.     DB    '0 ',0
  885.     ENDIF
  886.     IF HEATH
  887.     DB    '2000H ',0
  888.     ENDIF
  889. BSTST:    DB    CR,LF
  890.     DB    'Bit stuck high or low test ',0
  891. SBTST:    DB    CR,LF
  892.     DB    'Adjacent bits shorted test ',0
  893. CBTST:    DB    CR,LF
  894.     DB    'Checkerboard (55AAH pattern) test ',0
  895. WBLTST:    DB    CR,LF
  896.     DB    'Walking bit left test ',0
  897. WBRTST:    DB    CR,LF
  898.     DB    'Walking bit right test ',0
  899. ALTST:    DB    CR,LF
  900.     DB    'Address line test ',0
  901. RNTST:    DB    CR,LF
  902.     DB    'Random number test - Cycle: ',0
  903. LOWMSG:    DB    CR,LF
  904.     DB    'Re-enter, starting address must be at least ',0
  905. UPPMSG:    DB    CR,LF
  906.     DB    'Re-enter, ending address too low',0
  907. ;
  908. ;
  909. ;********************************************
  910. ;    INSERT CUSTOM INITIALIZATION AND I/O ROUTINES HERE
  911. ;********************************************
  912. ;
  913.     IF CPMIO    ;THESE ROUTINES CP/M USERS
  914. MONIT    EQU    WBOOT
  915. CONST    EQU    6    ;CONSOLE STATUS TO REG A
  916. CONIN    EQU    9    ;CONSOLE CHAR TO REG A
  917. CONOUT    EQU    0CH    ;CHAR FROM REG C TO CONSOLE
  918. ;
  919. INIT:            ;SET HI ORDER ADDR BYTES
  920.     LDA    WBOOT+2
  921.     STA    JCONS+2
  922.     STA    JCONI+2
  923.     STA    JCONO+2
  924.     JMP    INIT1
  925.     ENDIF
  926. ;
  927.     IF LAPIO    ;USES LAPPLE MONITOR
  928. MONIT    EQU    0D000H
  929. CONST    EQU    0D012H
  930. CONIN    EQU    0D003H
  931. CONOUT    EQU    0D009H
  932. INIT:    JMP    INIT1    ;NO INIT NEEDED
  933.     ENDIF
  934. ;
  935.     IF H84CRT
  936. MONIT    EQU    WBOOT
  937. INIT:    JMP    INIT1
  938. CONST    EQU    $
  939. CRTST:    IN H84ST ! ANI 1
  940.     MVI A,0 ! RZ ! CMA ! RET
  941. CONIN    EQU    $
  942. CRTIN:    IN H84ST ! RAR ! JNC CRTIN
  943.     IN H84IO ! ANI 7FH ! RET
  944. CONOUT    EQU    $
  945. CRTOUT:    IN H84ST ! ANI 20H ! JZ CRTOUT
  946.     MOV A,C ! OUT H84IO ! RET
  947. H84ST    EQU    0EDH
  948. H84IO    EQU    0E8H
  949.     ENDIF
  950. ;
  951. INIT1:
  952.     LXI    H,TBUF    ;POINT TO COMMAND LINE
  953.     MOV    A,M    ;GET FIRST BYTE
  954.     CPI    '-'    ;OPTION CHARACTER ?
  955.     JNZ    DEFAULT ;NO
  956. CLOOP:
  957.     INX    H    ;POINT TO NEXT BYTE
  958.     MOV    A,M
  959.     CPI    00    ;END OF COMMAND LINE ?
  960.     RZ        ;YES
  961.     CPI    'B'    ;BDOS OUTPUT ?
  962.     CZ    SET$BDOS ;YES
  963.     CPI    'R'    ;RANDOM TEST ONLY ?
  964.     CZ    SET$RAND ;YES
  965.     JMP    CLOOP    ;NO
  966. ;
  967. DEFAULT:
  968.     XRA    A
  969.     STA    BDOS$FLAG    ;BIOS OUTPUT
  970.     STA    RAND$FLAG    ;FULL TEST
  971.     RET
  972. ;
  973. SET$BDOS:
  974.     MVI    A,TRUE        ;BDOS OUTPUT
  975.     STA    BDOS$FLAG
  976.     RET
  977. ;
  978. SET$RAND:
  979.     MVI    A,TRUE        ;RANDOM NUMBER TEST ONLY
  980.     STA    RAND$FLAG
  981.     RET
  982. ;    
  983. ;********************************************
  984. ;
  985. BDOS$FLAG    DB    0    ;BDOS OUTPUT FLAG
  986. RAND$FLAG    DB    0    ;RANDOM TEST FLAG
  987. ;
  988. LASTB    EQU    $    ;END OF PROGRAM
  989. ;
  990.     END    START
  991.