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 / SIMTEL / CPMUG / CPMUG008.ARK / DISKTES1.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  6KB  |  409 lines

  1. ;-----------------------------------------------
  2. ;
  3. ; DISK TEST PROGRAM - VERSION 0.2
  4. ;
  5. ; 10 JUL 77
  6. ;
  7. ; DONATED BY ANONYMOUS
  8. ;
  9. ; MODIFIED FOR CP/M BY J. W. SHOOK
  10. ;
  11. ;-----------------------------------------------
  12. ; MODIFICATION HISTORY ***
  13. ;
  14. ; (1) 28 JUN 77 : ADDED CP/M CONSOLE INPUT CALL
  15. ;     FOR SYSTEM SIZE INDEPENDENCE.
  16. ; (2) 03 JUL 77 : ADDED BREAK CHECK TO ALLOW HALT
  17. ;     OF TEST IN REPEAT MODE.
  18. ; (3) 10 JUL 77 : CHANGED DISK I/O TO USE DIRECT
  19. ;     CALLS TO CBIOS IN USER SYSTEM.
  20. ;
  21. ;-----------------------------------------------
  22. ; STANDARD EQUATES
  23. ;
  24. LASTSEC    EQU    26
  25. BDOS    EQU    5
  26. CR    EQU    0DH
  27. LF    EQU    0AH
  28.  
  29.     ORG    100H
  30. GO:
  31.     LXI    SP,STKTOP
  32.     LXI    D,MESGA
  33.     CALL    CRPRT
  34.     CALL    CONIN
  35.     ANI    1    ;GET LSB FOR DISK SELECT
  36.     XRI    1    ;ASCII A MEANS SELECT 0
  37.     MOV    C,A
  38.     CALL    SELDSK
  39.     LXI    D,MESGB
  40.     CALL    CRPRT
  41.     CALL    CONIN
  42.     CALL    HOME
  43.     LXI    D,MESGF
  44.     CALL    CRPRT
  45.     CALL    CONIN
  46.     STA    REPEAT
  47. GOTEST:
  48.     CALL    TEST
  49.     CALL    CONST
  50.     ORA    A
  51.     JNZ    STOPT
  52.     LDA    REPEAT
  53.     ANI    0DFH    ;CONVERT TO UPPER CASE
  54.     CPI    'R'    ;LOOP IF REPEAT FLAG ON
  55.     JZ    GOTEST
  56. STOPT:    LXI    D,MESGH
  57.     CALL    CRPRT
  58. STOPT1:    CALL    CONIN
  59.     ANI    0DFH    ;CONVERT TO UPPER CASE
  60.     CPI    'Y'
  61.     JZ    GO
  62.     CPI    'N'
  63.     JNZ    STOPT1
  64.     LXI    D,MESGG
  65.     CALL    CRPRT
  66.     CALL    CONIN
  67.     JMP    0    ;REBOOT
  68.  
  69. ;CPM CONSOLE INPUT
  70.  
  71. CONIN:
  72.     PUSH B ! PUSH D ! PUSH H
  73.     MVI    C,1
  74.     CALL    BDOS
  75.     POP H ! POP D ! POP B
  76.     RET
  77.  
  78. ;CP/M CONSOLE OUTPUT
  79.  
  80. CONOUT:
  81.     PUSH PSW ! PUSH B ! PUSH D ! PUSH H
  82.     MOV    E,C
  83.     MVI    C,2
  84.     CALL    BDOS
  85.     POP H ! POP D ! POP B ! POP PSW
  86.     RET
  87.  
  88. ; CP/M CONSOLE STATUS CHECK
  89.  
  90. CONST:    PUSH B ! PUSH D ! PUSH H
  91.     MVI    C,11
  92.     CALL    BDOS
  93.     POP H ! POP D ! POP B
  94.     RET
  95.  
  96. ;
  97. MESGA:    DB    'DISKTEST - VERSION 0.2',CR,LF
  98.     DB    '03 JUL 77',CR,LF,LF
  99.     DB    'SELECT DRIVE TO TEST, A OR B? $'
  100. MESGB:    DB    'INSERT SCRATCH DISKETTE, THEN RETURN $'
  101. MESGC:    DB    'COMPARE ERROR ON TRACK $'
  102. MESGD:    DB    '(HEX) SECTOR $'
  103. MESGE:    DB    'PERMANENT $'
  104. MESGF:    DB    'REPEAT TEST (TYPE H TO HALT) OR STOP? (R OR S) $'
  105. MESGG:    DB    'INSERT SYSTEM DISK, THEN RETURN $'
  106. MESGH:    DB    'DO YOU WANT TO RESTART THIS TEST? (Y OR N) $'
  107. MESGI:    DB    'COMPLETED TEST LOOP $'
  108. MESGJ:    DB    'NOW FILLING DISK WITH 00$'
  109. MESGK:    DB    'NOW PERFORMING SEEK TEST$'
  110. MESGL:    DB    'NOW FILLING DISK WITH FF$'
  111. MESGM:    DB    'NOW FILLING DISK WITH 55$'
  112. MESGN:    DB    'NOW FILLING DISK WITH AA$'
  113. MESGO:    DB    'NOW FILLING DISK WITH E5$'
  114.  
  115. ;
  116. TEST:
  117.     LXI    D,MESGJ
  118.     CALL    CRPRT
  119.     MVI    A,0    ;TEST PATTERN
  120.     CALL    FILDSK
  121.     LXI    D,MESGK
  122.     CALL    CRPRT
  123.     CALL    SKTST        ;SEEK TEST
  124.     LXI    D,MESGL
  125.     CALL    CRPRT
  126.     MVI    A,0FFH
  127.     CALL    FILDSK
  128.     LXI    D,MESGM
  129.     CALL    CRPRT
  130.     MVI    A,55H
  131.     CALL    FILDSK
  132.     LXI    D,MESGN
  133.     CALL    CRPRT
  134.     MVI    A,0AAH
  135.     CALL    FILDSK
  136.     LXI    D,MESGO
  137.     CALL    CRPRT
  138.     MVI    A,0E5H
  139.     CALL    FILDSK
  140.     LXI    D,MESGK
  141.     CALL    CRPRT
  142.     CALL    SKTST
  143.     LXI    D,MESGI
  144.     CALL    CRPRT
  145.     LDA    TSTCNT
  146.     INR    A
  147.     STA    TSTCNT
  148.     CALL    PRTHEX
  149.     RET
  150. ;
  151. ;SEEK TEST
  152. ;
  153. SKTST:
  154.     XRA    A
  155.     PUSH    PSW
  156. SKLP:    XRA    A
  157.     MOV    C,A
  158.     CALL    READT    ;READ TRACK ZERO
  159.     POP    PSW
  160.     INR    A
  161.     CPI    77
  162.     JZ    SKDONE
  163.     PUSH    PSW
  164.     MOV    C,A
  165.     CALL    READT    ;READ INCREASING TRACK NO
  166.     JMP    SKLP
  167. SKDONE:
  168.     RET
  169. ;
  170. ;
  171. CRPRT:    CALL    CRLF
  172. PRTMSG:    LDAX    D    ;GET CHAR
  173.     INX    D
  174.     CPI    '$'
  175.     RZ
  176.     PUSH    D
  177.     MOV    C,A
  178.     CALL    CONOUT
  179.     POP    D
  180.     JMP    PRTMSG    ;LOOP TILL $
  181. ;
  182. CRLF:    MVI    C,0DH
  183.     CALL    CONOUT
  184.     MVI    C,0AH
  185.     CALL    CONOUT
  186.     RET
  187. ;
  188. PRTHEX:    PUSH    PSW
  189.     RAR
  190.     RAR
  191.     RAR
  192.     RAR
  193.     CALL    PRTNBL
  194.     POP    PSW
  195. PRTNBL:    ANI    0FH
  196.     ADI    30H
  197.     CPI    3AH
  198.     JC    SML
  199.     ADI    7
  200. SML:
  201.     MOV    C,A
  202.     CALL    CONOUT
  203.     RET
  204. ;
  205. FILDSK:    CALL    FILBUF0
  206.     XRA    A
  207. FDLP:    PUSH    PSW
  208.     MOV    C,A
  209.     STA    TRK
  210.     CALL    WRITET    ;WRITE ONE TRACK
  211.     POP    PSW
  212.     PUSH    PSW
  213.     MOV    C,A
  214.     CALL    COMPT
  215.     POP    PSW
  216.     INR    A
  217.     CPI    77
  218.     JNZ    FDLP    ;DO ALL 77 TRACKS
  219.     RET
  220. ;
  221. FILBUF0:
  222.     LXI    H,BUF0    ;FILL BUF0 WITH (A)
  223.     LXI    B,128*LASTSEC
  224. FLP:    MOV    M,A
  225.     INX    H
  226.     DCR    C
  227.     JNZ    FLP
  228.     DCR    B
  229.     JNZ    FLP
  230.     RET
  231. ;
  232. ;
  233. ;
  234. ;
  235. COMPT:    LXI    H,BUF1
  236.     CALL    RT2    ;REREAD INTO BUF1
  237.     LXI    H,BUF0
  238.     LXI    D,BUF1
  239.     LXI    B,128*LASTSEC
  240. CMPLP:    LDAX    D
  241.     CMP    M
  242.     JNZ    CERR
  243.     INX    H
  244.     INX    D
  245.     DCR    C
  246.     JNZ    CMPLP
  247.     DCR    B    ;ARE WE AT END OF BUFFER?
  248.     JNZ    CMPLP
  249.     RET
  250. CERR:    PUSH    B
  251.     LXI    D,MESGC
  252.     CALL    CRPRT
  253.     LDA    TRK
  254.     CALL    PRTHEX
  255.     LXI    D,MESGD
  256.     CALL    PRTMSG
  257.     POP    H    ;PUSHED FROM B
  258.     DAD    H    ;COMPUTE SECTOR IN ERROR
  259.     LXI    D,0FF00H
  260.     DAD    D
  261.     MVI    A,27
  262.     SUB    H
  263.     CALL    PRTHEX    ;PRINT SECTOR
  264.     RET
  265. ;
  266. ;
  267. READT:    LXI    H,BUF0    ;TRACK # IN C
  268. RT2:    SHLD    DMAAD
  269.     CALL    SETTRK
  270.     MVI    C,1
  271. RT3:    PUSH    B
  272.     LHLD    DMAAD
  273.     PUSH    H
  274.     POP    B
  275.     CALL    SETDMA
  276.     POP    B
  277.     PUSH    B
  278.     CALL    SETSEC
  279.     CALL    READ
  280.     LHLD    DMAAD
  281.     LXI    D,128
  282.     DAD    D
  283.     SHLD    DMAAD
  284.     POP    B
  285.     MVI    A,LASTSEC
  286.     CMP    C
  287.     RZ
  288.     INR    C
  289.     JMP    RT3
  290. ;
  291. ;
  292. WRITET:    LXI    H,BUF0    ;TRACK # IN C
  293. WT2:    SHLD    DMAAD
  294.     CALL    SETTRK
  295.     MVI    C,1
  296. WT3:    PUSH    B
  297.     LHLD    DMAAD
  298.     PUSH    H
  299.     POP    B
  300.     CALL    SETDMA
  301.     POP    B
  302.     PUSH    B
  303.     CALL    SETSEC
  304.     CALL    WRITE
  305.     LHLD    DMAAD
  306.     LXI    D,128
  307.     DAD    D
  308.     SHLD    DMAAD
  309.     POP    B
  310.     MVI    A,LASTSEC
  311.     CMP    C
  312.     RZ
  313.     INR    C
  314.     JMP    WT3
  315.  
  316. DMAAD:    DW    80
  317. REPEAT:    DB    0
  318. CMPERR:    DB    0    ;NUMBER OF COMPARE ERRORS
  319. TRK:    DB    0
  320. TSTCNT:    DB    0
  321. STK:    DS    40H
  322. STKTOP:    DB    0
  323.  
  324. ;--------------------------------------------------------
  325. ;
  326. ; DISK I/O CALLING PROCEDURES
  327. ;
  328. ;--------------------------------------------------------
  329.  
  330. HOME:    ; MOVE HEAD TO TRACK 0
  331.  
  332.     MVI    A,21
  333.     PUSH B ! PUSH D ! PUSH H
  334.     CALL    FBIOS
  335.     POP H ! POP D ! POP B
  336.     RET
  337.  
  338. SELDSK:    ; SELECT DISK DRIVE
  339.  
  340.     MVI    A,24
  341.     PUSH B ! PUSH D ! PUSH H
  342.     CALL FBIOS
  343.     POP H ! POP D ! POP H
  344.     RET
  345.  
  346. SETTRK:    ; SELECT TRACK
  347.  
  348.     MVI    A,27
  349.     PUSH B ! PUSH D ! PUSH H
  350.     CALL FBIOS
  351.     POP H ! POP D ! POP B
  352.     RET
  353.  
  354. SETSEC:    ; SELECT SECTOR
  355.  
  356.     MVI    A,30
  357.     PUSH B ! PUSH D ! PUSH H
  358.     CALL FBIOS
  359.     POP H ! POP D ! POP B
  360.     RET
  361.  
  362. SETDMA:    ; SELECT DMA ADDRESS
  363.  
  364.     MVI    A,33
  365.     PUSH B ! PUSH D ! PUSH H
  366.     CALL    FBIOS
  367.     POP H ! POP D ! POP B
  368.     RET
  369.  
  370. READ:    ; READ SECTOR
  371.  
  372.     MVI    A,36
  373.     PUSH B ! PUSH D ! PUSH H
  374.     CALL FBIOS
  375.     POP H ! POP D ! POP B
  376.     RET
  377.  
  378. WRITE:    ; WRITE SECTOR
  379.  
  380.     MVI    A,39
  381.     PUSH B ! PUSH D ! PUSH H
  382.     CALL    FBIOS
  383.     POP H ! POP D ! POP B
  384.     RET
  385.  
  386. ;******************************************
  387. ;* BIOS FUNCTION CALLING PROCEDURE        *
  388. ;******************************************
  389. ;
  390. ; THIS PROCEDURE ALLOWS CALLING BIOS
  391. ; FUNCTIONS WITHOUT PRIOR KNOWLEDGE OF THE
  392. ; SIZE OF THE CP/M SYSTEM.
  393. ;
  394. ; CALL FBIOS WITH THE FUNCTION IN A
  395. ; AND THE PARAMETER IN BC.
  396. ;
  397. FBIOS:    MOV    E,A    ; GET ENTRY OFFSET
  398.     MVI    D,0    ; IN DE
  399.     LHLD    1    ; GET BIOS ENTRY + 3
  400.     DAD    D    ; ADD ENTRY TO OFFSET
  401.     PCHL        ; JUMP TO BIOS
  402. ;
  403. ;
  404. ;
  405.     DS    3
  406. BUF0:    DS    128*LASTSEC
  407. BUF1:    DS    128*LASTSEC
  408.     END
  409.