home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol027 / memtst.src < prev    next >
Encoding:
Text File  |  1985-02-10  |  16.9 KB  |  513 lines

  1. ;    FILE:  MEMBIT.SRC             CREATED 14-NOV-80
  2. ;    WRITTEN BY D.A. STEELE
  3. ;    LAST UPDATE 
  4. ;
  5. ;         THIS WILL BE A RAM TEST WHICH WILL TEST 64K OF RAM
  6. ;    IN 1K BLOCKS.  THE TESTS WILL BE DONE WITHOUT DISTROYING
  7. ;    ANY PORTION OF RAM WITH THE EXCEPTION OF THE 5K BLOCK JUST
  8. ;    BELOW CP/M THE TOP OF WHICH WILL BE LOCATED BY (LHLD BDOS+1;
  9. ;    DCR H; DCR H).
  10. ;
  11. ;    THE TEST:
  12. ;         1:  WILL FILL MEMORY WITH 0FFH THEN CHECK FOR 0FFH AND FILL WITH 0
  13. ;    AND THEN CHECK FOR 0.
  14. ;         2:   WILL START AT THE FIRST TEST BLOCK LOCATION WITH AN 88H TO
  15. ;    BE WRITTEN.  COUNTING UPWARDS IN MEMORY EACH LOCATION IS WRITTEN
  16. ;    WITH THE VALUE OF THE PROVIOUS LOCATION ROTATED RIGHT WITH 
  17. ;    CARRY WICH WILL CAUSE AN UNEVEN PATTERN IN EACH 8 OR 16 BYTE
  18. ;    BLOCK OF MEMORY.  
  19. ;         AFTER THIS 4K BLOCK HAS BEEN TESTED THEN THE NEXT
  20. ;    BLOCK WILL BE TESTED.
  21. ;
  22. ;    ERRORS WILL BE THE NUMBER OF TIMES
  23. ;    AN ERROR WAS DETECTED.  (IE. IF THERE HAVE BEEN 3 PASSES AND ERRORS
  24. ;     IS EQUAL TO 3 THIS WILL MEAN THAT ONE ERROR OCCURRED IN EACH PASS
  25. ;    OR 3 ERRORS OCCURREC IN ONE PASS ETC.   STATUS: THE BIT SET WILL WILL
  26. ;    GIVE THE 4K BLOCK LOCATION IN WHICH ERRORS HAVE OCCURRED SENCE THE START
  27. ;    IF THE TEST.  THE HIGH ORDER BIT WILL COROSPOND TO THE F000H BLOCK OF
  28. ;    MEMORY.
  29.  
  30. ;
  31. ;    THIS TEST IS WRITTEN TO BE USED WITH A PASCAL/Z MONITOR FOR CONFIDENCE
  32. ;    TESTS OF THE ATS III.  
  33. ;
  34. ;    THE MONITOR PROGRAM SHOULD HAVE THE FALLOWING DECLARATION
  35. ;
  36. ;    FUNCTION MEMTST : INTEGER; EXTERNAL
  37. ;
  38. ;    A STATUS WORD IS RETURNED TO THE CALLING PROGRAM WITH BITS SET
  39. ;    ACCORDINGLY TO ALL MEMORY LOCATIONS WHICH FAILED.
  40.  
  41.           NAME      MEMTST
  42.           ENTRY     MEMTST
  43.  
  44. BDOS      EQU       5
  45. BEGIN:
  46. MEMTST:   JR        BACK
  47.           JR        BACK2     ;THE JUMP VECTOR AFTER RESTORE
  48.  
  49. INIT:     EXX                 ;GET READY TO SAVE ALTERNATE REGISTERS
  50.           POP       H         ;SAVE THE RETURN ADDRESS
  51.           PUSH      D
  52.           PUSH      B
  53.           PUSH      IY
  54.           PUSH      IX
  55.           PUSH      H         ;PUT BACK THE RETURN ADDRESSè
  56.           EXX                 ;ALT. BC IS THE ERROR FLAG SO ZERO IT
  57.           LXI       B,0
  58.           LIYD      STARTA    ;THIS IS THE ADDTESS OF THE NEXT BLOCK
  59.           EXX                 ;TO BE TESTED
  60.  
  61.           LHLD      BDOS+1    ;NOW GET THE ADDRESS OF THE SAVE AREA
  62.           DCR       H         ;THIS WILL BE 2 PAGES BELOW CP/M
  63.           DCR       H         ;TO ALLOW ROOM FOR SID.
  64.           MVI       L,0       ;NOW MAKE SURE ITS AN EVEN BLOCK
  65.           MOV       A,H
  66.           ANI       0F0H
  67.           MOV       H,A
  68.  
  69.           LXI       D,1000H   ;HL IS NOW POINTING AT THE TOP BUT
  70.           STC                 ;WE WANT THE BOTTOM SO SUBTRACT
  71.           CMC                 ;1000H FROM IT.
  72.           DSBC      D
  73.           PUSH      H         ;THIS STORE THIS VALUE IN IX
  74.           POP       X
  75.           RET
  76. ;
  77. ;                             IX = ADDRESS OF SAVE AREA
  78. ;                             IY ╜ FIRS╘ ADDRES╙ O╞ NEX╘ BLOC╦ T╧ TEST
  79. ;
  80. ;
  81. ;
  82. SAVE:     PUSH      Y         ;HL NOW POINTS TO THE START OF THE
  83.           POP       H         ;NEXT TEST BLOCK
  84.           PUSH      X         ;POINT DE TO THE SAVE AREA
  85.           POP       D
  86.           LXI       B,400H   ;MOVE ONE BLOCK
  87.           LDIR
  88.           JR        BACK22    ;RETURN TO BACKGROUND
  89.  
  90. ;
  91. ;
  92. ;
  93. SAVEME:   LXI       H,BOTTOM     ;GET THE END AND LENGTH OF THIS 
  94.           LXI       B,BOTTOM-BEGIN ; ROUTINE
  95.           PUSH      X         ;GET THE ADDRESS OF THE SAVE AREA
  96.           POP       D         ; IN D
  97.           PUSH      D         ; WE WILL GO TO HERE WHEN FINISHED
  98.           LDDR                ;WITH THE MOVE
  99.  
  100.           POP       H
  101.           INX       H         ;GET PAST THE FIRST JUMP VECTOR
  102.           INX       H
  103.           LXI       B,BOTTOM-BEGIN
  104.           STC
  105.           CMC
  106.           DSBC      B         ;GET TO BOTTOM OF CODE AREA
  107.           PCHL
  108. ;    
  109. ;è;
  110. UNSAVE:   DB        0FFH
  111.     
  112. ;
  113. ;
  114. ;
  115. REST:     PUSH      Y  
  116.           POP       D
  117.                               ;KEEP IN MIND TO MAINTAIN A
  118.                               ;AS THE ERROR FLAG
  119. REST1:                        ;PUT HL BACK TO THE START OF THE
  120.                               ;START OF THE BLOCK
  121.                               ;BLOCK START IN DE
  122.           PUSH      X  
  123.           POP       H         ;GET SAVE AREA ADDRESS
  124.           LXI       B,400H
  125.           LDIR
  126.           JR        BACK5
  127.  
  128.  
  129.  
  130.  
  131. ;
  132. ;
  133. ;
  134. BACK:     DB        0,0,0,0,0,0,0,0,0,0,0,0 ;FOR DEBUG
  135.           LXI       H,0
  136.           DAD       SP        ;GET THE OLD STACK POINTER  
  137.           LXI       SP,STAK
  138.           PUSH      H         ;SAVE OLD STACK POINTER ON NEW STACK
  139.           CALL      ADDRIN    ;GET START AND STOP ADDRESSES
  140. BACK1:    CALL      INIT      ;INITIALIZE THE NECESSARY STUFF
  141.  
  142. BACK11:   JMP       SAVEME
  143. BACK2:    
  144. BACK21    JR        SAVE
  145. BACK22:   JR        TEST1
  146. BACK3     JR        TEST2
  147.  
  148. BACK4:    JR        REST
  149. BACK5:    CPI       0         ;PASSED
  150.           CNZ       FAIL
  151.  
  152.           
  153. BACK6     LXI       D,400H   ;MOVE BOTTOM OF BLOCK UP ONE
  154.           DADY      D         ; BLOCK
  155.           PUSH      Y
  156.           POP       H         ;GET IT IN HL
  157.           LBCD      STOPA     ;GET THE STOP ADDRESS
  158.           MOV       A,H       ;AND TEST IT AGAINST THE       
  159.           CMP       B         ;START OF THE NEXT BLOCK
  160.           JZ        DONE      ;STOP IF BLOCK > STOP
  161.           JNC       DONE
  162.           PUSH      X
  163.           POP       B         ;GET BOTTOM OF SAVE AREAè          MOV       A,B
  164.           SUB       H
  165.           CPI       30H       ;IF LESS THAN 3 BLOCKS THEN WE NEED
  166.                               ;TO RETURN TEST TO ITS ORIGIONAL
  167.                               ;POSITION
  168.           JRZ       RESTXFR
  169.  
  170. BACK7     JRC       RESTXFR   ;IF CARRY THEN WE ARE CLOSER THAN
  171.                               ;WE WANT
  172. BACK8     MOV       A,H       ;IF HL IS NOW 0 WE HAVE GONE 46K
  173.           CPI       0         ;SO STOP
  174.           JZ        DONE
  175.           JR        BACK21
  176. ;
  177. ;
  178. ;
  179. TEST1:    PUSH      Y         ;GET ADDRESS OF THE AREA TO BE
  180.           POP       H         ;TESTED
  181.           MVI       D,0FFH    ;WE'LL FILL W/ FF'S FIRST
  182.           LXI       B,400H   ;ONE BLOCKS WORTH
  183. TEST11:   MOV       M,D
  184.           INX       H
  185.           DCX       B
  186.           MOV       A,C
  187.           ORA       B
  188.           JRNZ      TEST11
  189.  
  190.                               ;NOW TESTS FOR THOSE FF
  191.                               ;AND FILL W/ 0
  192.           LXI       B,400H
  193. TEST12    DCX       H         ;HL WAS INCREMENTED PAST THE LAST
  194.           MVI       A,0FFH    ;WRITE
  195.           XRA       M         ;XOR FF W/ FF = 0
  196.           JRNZ      ERROR     ;OOPS
  197.           MOV       M,A       ;FILL M W/ 0
  198.           DCX       B         ;COUNTIT
  199.           MOV       A,B
  200.           ORA       C
  201.           JRNZ      TEST12
  202.  
  203.           LXI       B,400H   ;NOW TEST FOR ZEROS
  204. TEST13:   XRA       A         
  205.           XRA       M
  206.           JRNZ      ERROR
  207.           INX       H
  208.           DCX       B
  209.           MOV       A,B
  210.           ORA       C
  211.           JRNZ      TEST13
  212.           JR        BACK3
  213.  
  214. ;
  215. ;
  216. ;
  217. ERROR:    MVI       A,0FFH    ;FAILEDè          JR        BACK4
  218. ;
  219. RESTXFR:  JR        RESTME
  220. BACK4XFR: JR        BACK4
  221. BACK6XFR: JR        BACK6
  222. ;
  223. ;
  224. ;
  225. TEST2                         
  226.           PUSH      Y         ;POINT H TO BOTTOM OF TEST BLOCK
  227.           POP       H
  228. TEST21:   
  229.           LXI       B,400H   ;
  230.           MVI       A,88H
  231.           EXAF
  232. TEST22:   EXAF
  233.           MOV       M,A
  234.           INX       H
  235.           DCX       B
  236.           RAR                 ;MAKE THE NEXT PATTERN
  237.           EXAF                ;SAVE IT
  238.           MOV       A,B
  239.           ORA       C         ;ARE WE DONE
  240.           JRNZ      TEST22
  241.  
  242.           LXI       B,400H
  243. TEST23:   EXAF                ;MEMORY IS FILLED NOW
  244.           RLA
  245.           DCX       H         ;NEXT LOCATION TO TEST
  246.           DCX       B
  247.           MOV       D,A
  248.           EXAF                ;SAVE PATTERN
  249.           MOV       A,D
  250.           CMP       M         ;CHECKIT
  251.           JRNZ      ERROR
  252.           MOV       A,B
  253.           ORA       C         ;CHECK COUNT TO SEE IF DONE
  254.           JRNZ      TEST23
  255.           MVI       A,0       ;PASSED
  256.           JR        BACK4XFR  ;TEST2 COMPLETED
  257.  
  258. ;
  259. ;
  260. ;
  261. RESTME║   
  262.           JMP       BACK8
  263. ;
  264. ;
  265. ;    INPUT BUFFER FROM CONSOLE
  266.  
  267. CINSIZ    EQU       10
  268. BIOS      EQU       BDOS
  269. WBOOT     EQU       0
  270.  
  271. èSTARTM:   DB        'ENTER START ADDRESS $'
  272. STOPM:    DB        0AH,0DH,'ENTER STOP ADDRESS $'
  273. EVENM:    DB        0AH,0DH,'MUST START ON EVEN 1K BLOCK BOUNDRY',0AH,0DH,'$'
  274. CRLF:     DB        0AH,0DH,'$'
  275.  
  276.  
  277. CIN:      LXI       D,INBUF        ;GET ADDRESS OF INPUT BUFFER
  278.           MVI       A,CINSIZ
  279.           STAX      D              ;LOAD THE BUFFER LENGTH
  280.           MVI       C,10
  281.           CALL      BIOS              ;LET CP/M INPUT BUFFER
  282.           RET
  283.  
  284. CEND:     LDA       INBUF+1        ;GET NUMBER OF CHARACTERS
  285.           LXI       H,INBUF+2      ;POINT TO THE FIRST
  286.           MVI       D,0            ;ZERO D
  287.           MOV       E,A            ;CHAR COUNT IN E
  288.           DAD       D              ;ADD TO FIRST CHAR LOC.
  289.           MVI       M,0            ;AND PUT A 0 THERE
  290.  
  291. HEXIN:    LXI       D,INBUF+2      ;POINT TO FIRST CHAR IN BUFFER
  292.           LXI       H,0            ;ZERO THE NUMBER
  293. IN1:      LDAX      D              ;GET A CHAR
  294.           SUI       '0'            ;CHECK FOR < 0
  295.           RC                       ;BUFFER END RETURN
  296.           ADI       '0'-'G'        ;CHECK > F
  297.           RC                       ;INVALID RETURN
  298.           ADI       6
  299.           JP        IN2            ;NO BETWEEN A AND F
  300.           ADI       7              
  301.           RC
  302. IN2:      ADI       10
  303.           ORA       A              ;CLEAR CARRY
  304.           MOV       C,A            ;MOVE HEX TO C
  305.           MVI       B,0            ;ZERO B
  306.           DAD       H              ;SHIFT NUMBER LEFT 4
  307.           DAD       H
  308.           DAD       H
  309.           DAD       H
  310.           DAD       B              ;AND ADD NEW DIGIT
  311.           INX       D              ;INC BUFFER POINTER
  312.           JMP       IN1            ;DO NEXT CHAR
  313.  
  314. NOTEVEN:  LXI       D,EVENM        ;SEND NOT EVEN MESSAGE
  315.           MVI       C,9
  316.           CALL      BIOS
  317. ADDRIN:   
  318.           LXI       H,0
  319.           SHLD      STARTA         ;STORE THE START ADDRESS
  320.  
  321.           LXI       H,0FFFFH
  322.           SHLD      STOPA          ;STORE THE STOP ADDRESS
  323.           
  324.           RET
  325. èDONE:
  326.           CALL      CFAIL          ;CHECK ALL BLOCKS THAT FAILED AND UPDATE ERROR FLAG
  327.           JMP       PASS           ;PRINT OUT THE ERRORS
  328.  
  329. BOTTOM:   NOP
  330.  
  331. ;    FILE FAIL.SRC       14-DEC-80
  332. ;
  333. ;    IN THE EVENT OF A TEST FAILURE, THIS ROUTINE WILL MOVE 
  334. ;    THE 4K BLOCK NUMBER INTO A REG.
  335. ;    AND WILL IN TURN OR IT IN WITH THE ERROR FLAG.
  336. ;
  337. ;    THE PASS COUNT AND ERROR COUNT WILL BE INCREMENTED 
  338. ;    ACCORDINGLY
  339. ;
  340. ;    BECAUSE IT IS NEVER EXECUTED WHILE MEMORY IS DISPLACED, THIS PORTION
  341. ;    IF THE TEST PROGRAM IS NEVER SAVED,
  342. ;
  343.  
  344. ERRFLG:   DW        0              ;A STATUS WITH BITS SET CORROSPONDING TO THE 4K BLOCKS THAT HAVE FAILED
  345. ERRCNT:   DW        0              ;THE NUMBER OF BLOCKS IN WHICH ERRORS HAVE OCCURRED.  IE  IF TWO ERRORS OCCUR IN ONE PASS
  346.                                    ;THEN THIS WILL BE INCREMENTED BY TWO EVEN THOUGH ONLY ONE PASS HAS BEEN MADE
  347. ERRM:     DB        '     ERRORS = $'
  348. STATM:    DB        ' STATUS = $'
  349. ERRORS:   DB        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    ;16 4K BLOCKS  WILL INDICATE IN WHICH BLOCKS ERRORS HAVE OCCURED.
  350.  
  351. OUTCHAR:  ANI       0FH            ;MASK 4 BITS
  352.           ADI       90H            ;ADD OFFSET
  353.           DAA                      ;DEC ADJUST
  354.           ACI       40H            ;ADD OFFSET
  355.           DAA                      ;DEC ADJUST
  356.           MOV       E,A            ;TO FOR OUTPUT
  357.           MVI       C,2            ;CONSOL OUT
  358.           CALL      BDOS
  359.           RET
  360.  
  361. HEXPRN:   PUSH      H
  362.           PUSH      PSW
  363.           RRC
  364.           RRC
  365.           RRC
  366.           RRC
  367.           CALL      OUTCHAR
  368.           POP       PSW
  369.           CALL      OUTCHAR
  370.           POP       H
  371.           RET          
  372.  
  373. OUTIT:    MOV       A,H            ;PUT 2 HIGH ORDER DIGITS IN A
  374.           CALL      HEXPRN
  375.           MOV       A,L
  376.           CALL      HEXPRN
  377.           RET
  378.  
  379.           è;    SET THE PROPER BYTE IN ERRORS TO CORROSPOND TO THE BLOCK OF MEMORY THAT FAILED
  380. ;    CALLED BY MEMTST AFTER A BLOCK HAS FAILED
  381. ;
  382. FAIL:     PUSH      Y
  383.           POP       H              ;GET THE BLOCK ADDRESS
  384.           MOV       A,H            ;HIGH BYTE OF BLOCK INTO A
  385.           RRC
  386.           RRC
  387.           RRC
  388.           RRC
  389.           ANI       0FH            ;BLOCK NO. NOW IN A
  390.           LXI       H,ERRORS       ;GET ADDRESS OF THE ERROR FLAGS
  391.           MOV       E,A            ;GET OFSET OF PROPER FLAG
  392.           MVI       D,0
  393.           DAD       D              ;ADD IN THE OFFSET
  394.           MVI       M,0FFH         ;SET THE FLAG
  395.           RET                 
  396.  
  397. ;    SET THE ERROR FLAG TO CORROSPOND WITH ALL ERROR ARRAY BYTES THAT HAVE BEEN SET
  398. ;
  399. FAILD:    PUSH      H              ;SAVE POINTER TO ERRORS
  400.           PUSH      B              ;SAVE COUNTER
  401.           MOV       A,B            ;GET BLOCK NUMBER FOR COMPAIR
  402.           LXI       D,5            ;EACH CASE WILL BE 5 BYTES APART
  403.           LXI       H,A0           ;POINT HL TO FIRST CASE
  404.           MVI       B,0            ;WE'LL TEST FOR 0 FIRST
  405. FAIL1:    CMP       B              ;IS B=BLOCK NO.?
  406.           JZ        AX             ;IF SO JUMP OUT
  407.           INR       B              ;IF NOT PREPAIR TO TEST NEXT NUMBER
  408.           DAD       D              ;POINT TO NEXT CASE
  409.           JR        FAIL1
  410.  
  411. ;    CHECK ERROR ARRAY FOR BLOCKS FAILED   -   CALLED BY MEMTEST AT END OF 64K PASS
  412. CFAIL:    LXI       H,ERRORS
  413.           MVI       B,0
  414. CFAIL1:   MVI       A,0FFH         ;LOOK AT IRST BYTE IN ERROR ARRAY
  415.           CMP       M              ;IF SET THEN PROCESS IT
  416.           CZ        FAILD
  417.           INX       H              ;INCREMENT POINTER
  418.           INR       B              ;COUNT HOW MANY WE'VE LOOKED AT
  419.           MVI       A,10H
  420.           CMP       B              ;SEE IF WE'RE DONE
  421.           RZ
  422.           JMP       CFAIL1
  423.  
  424. AX:       PCHL                     ;DO THE NECESSARY CASE
  425. A0:       LXI       B,1
  426.           JR        DOOR
  427. A1:       LXI       B,2
  428.           JR        DOOR
  429. A2:       LXI       B,4
  430.           JR        DOOR
  431. A3:       LXI       B,8
  432.           JR        DOOR
  433. A4:       LXI       B,10Hè          JR        DOOR
  434. A5:       LXI       B,20H
  435.           JR        DOOR
  436. A6:       LXI       B,40H
  437.           JR        DOOR
  438. A7:       LXI       B,80H
  439.           JR        DOOR
  440. A8:       LXI       B,100H
  441.           JR        DOOR
  442. A9:       LXI       B,200H
  443.           JR        DOOR
  444. AA:       LXI       B,400H
  445.           JR        DOOR
  446. AB:       LXI       B,800H
  447.           JR        DOOR
  448. AC:       LXI       B,1000H
  449.           JR        DOOR
  450. AD:       LXI       B,2000H
  451.           JR        DOOR
  452. AE:       LXI       B,4000H
  453.           JR        DOOR
  454. AF:       LXI       B,8000H
  455.           JR        DOOR
  456.  
  457. DOOR:     LDED      ERRFLG         ;NOW OR INTO THE ERROR FLAG
  458.           MOV       A,D            ;THE BLOCK NUMBER IN WHICH THE
  459.           ORA       B              ;ERROR JUST OCCURED
  460.           MOV       D,A
  461.           MOV       A,E
  462.           ORA       C
  463.           MOV       E,A
  464.           SDED      ERRFLG         ;STORE THE ERROR FLAG
  465.           LHLD      ERRCNT
  466.           INX       H
  467.           SHLD      ERRCNT         ;STORE NEW ERROR COUNT
  468.           
  469.           POP       B              ;RESTORE BLOCK NUMBER WE ARE ON
  470.           POP       H              ;AND THE POINTER TO ERROR
  471.           RET                      ;TO CFAIL: + X
  472.  
  473.                
  474.  
  475. ;    INCREMENT THE PASSCOUNT    CALLED BY MEMTST
  476. ;    AND PRINT THE STATUS LINE TO THE CRT
  477. ;
  478. PASS:     
  479.  
  480. DPASS:    
  481.           LXI       D,ERRM         ;PRINT THE ERROR COUNT
  482.           CALL      PRNT
  483.           LHLD      ERRCNT
  484.           CALL      OUTIT
  485.           LXI       D,STATM
  486.           CALL      PRNT
  487.           LHLD      ERRFLGè          CALL      OUTIT
  488.  
  489.                                    ; NOW PREPAIR TO RETURN TO PASCAL/Z
  490.           POP       IX             ; RESTORE ALL ALTERNATE REG.
  491.           POP       IY
  492.           POP       B
  493.           POP       D
  494.           EXX                 
  495.           XRA       A
  496.           LXI       H,ERRFLG       ; GET THE ERROR FLAG
  497.           MOV       E,M
  498.           INX       H
  499.           MOV       D,M
  500.           POP       H
  501.           SPHL                     ;RESTORE ORIGIONAL STACK POINTER
  502.           RET
  503.  
  504.  
  505. PRNT:     MVI       C,9
  506.           CALL      BDOS
  507.           RET
  508. INBUF:    DS        CINSIZ
  509. STARTA:   DS        2
  510. STOPA:    DS        2
  511.           DS        30
  512. STAK:
  513.