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 / CPMUG001.ARK / DISKTEST.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  9KB  |  486 lines

  1.     ORG    100H
  2. ;THE FOLLOWING EQU MUST BE CHANGED FOR USE ON
  3. ;OTHER THAN 16K SYSTEMS
  4. CBBASE    EQU    3E00H
  5. CONOUT    EQU    CBBASE+0CH
  6. CONIN    EQU    CBBASE+9
  7. LASTSEC    EQU    26
  8. GO:
  9.     LXI    SP,STKTOP
  10.     LXI    D,MESGA
  11.     CALL    CRPRT
  12.     CALL    GETCON
  13.     ANI    1    ;GET LSB FOR DISK SELECT
  14.     XRI    1    ;ASCII A MEANS SELECT 0
  15.     MOV    C,A
  16.     CALL    SELDSK
  17.     LXI    D,MESGB
  18.     CALL    CRPRT
  19.     CALL    CONIN
  20.     CALL    HOME
  21.     LXI    D,MESGF
  22.     CALL    CRPRT
  23.     CALL    GETCON
  24.     STA    REPEAT
  25. GOTEST:
  26.     CALL    TEST
  27.     LDA    REPEAT
  28.     ANI    0DFH    ;CONVERT TO UPPER CASE
  29.     CPI    'R'    ;LOOP IF REPEAT FLAG ON
  30.     JZ    GOTEST
  31.     LXI    D,MESGH
  32.     CALL    CRPRT
  33.     CALL    GETCON
  34.     ANI    0DFH    ;CONVERT TO UPPER CASE
  35.     CPI    'Y'
  36.     JZ    GO
  37.     LXI    D,MESGG
  38.     CALL    CRPRT
  39.     CALL    CONIN
  40.     JMP    0    ;REBOOT
  41. ;
  42. GETCON:    CALL    CONIN
  43.     PUSH    PSW
  44.     MOV    C,A
  45.     CALL    CONOUT
  46.     POP    PSW
  47.     RET
  48. ;
  49. MESGA:    DB    'SELECT DRIVE TO TEST, A OR B? $'
  50. MESGB:    DB    'INSERT SCRATCH DISKETTE, THEN RETURN $'
  51. MESGC:    DB    'COMPARE ERROR ON TRACK $'
  52. MESGD:    DB    '(HEX) SECTOR $'
  53. MESGE:    DB    'PERMANENT $'
  54. MESGF:    DB    'REPEAT TEST CONTINUOUSLY OR STOP? (R OR S) $'
  55. MESGG:    DB    'INSERT SYSTEM DISK, THEN RETURN $'
  56. MESGH:    DB    'DO YOU WANT TO RESTART THIS TEST? (Y OR N) $'
  57. MESGI:    DB    'COMPLETED TEST LOOP $'
  58. ;
  59. TEST:
  60.     MVI    A,0    ;TEST PATTERN
  61.     CALL    FILDSK
  62.     CALL    SKTST        ;SEEK TEST
  63.     MVI    A,0FFH
  64.     CALL    FILDSK
  65.     MVI    A,55H
  66.     CALL    FILDSK
  67.     MVI    A,0AAH
  68.     CALL    FILDSK
  69.     MVI    A,0E5H
  70.     CALL    FILDSK
  71.     CALL    SKTST
  72.     LXI    D,MESGI
  73.     CALL    CRPRT
  74.     LDA    TSTCNT
  75.     INR    A
  76.     STA    TSTCNT
  77.     CALL    PRTHEX
  78.     RET
  79. ;
  80. ;SEEK TEST
  81. ;
  82. SKTST:
  83.     XRA    A
  84.     PUSH    PSW
  85. SKLP:    XRA    A
  86.     MOV    C,A
  87.     CALL    READT    ;READ TRACK ZERO
  88.     POP    PSW
  89.     INR    A
  90.     CPI    77
  91.     JZ    SKDONE
  92.     PUSH    PSW
  93.     MOV    C,A
  94.     CALL    READT    ;READ INCREASING TRACK NO
  95.     JMP    SKLP
  96. SKDONE:
  97.     RET
  98. ;
  99. ;
  100. CRPRT:    CALL    CRLF
  101. PRTMSG:    LDAX    D    ;GET CHAR
  102.     INX    D
  103.     CPI    '$'
  104.     RZ
  105.     PUSH    D
  106.     MOV    C,A
  107.     CALL    CONOUT
  108.     POP    D
  109.     JMP    PRTMSG    ;LOOP TILL $
  110. ;
  111. CRLF:    MVI    C,0DH
  112.     CALL    CONOUT
  113.     MVI    C,0AH
  114.     CALL    CONOUT
  115.     RET
  116. ;
  117. PRTHEX:    PUSH    PSW
  118.     RAR
  119.     RAR
  120.     RAR
  121.     RAR
  122.     CALL    PRTNBL
  123.     POP    PSW
  124. PRTNBL:    ANI    0FH
  125.     ADI    30H
  126.     CPI    3AH
  127.     JC    SML
  128.     ADI    7
  129. SML:
  130.     MOV    C,A
  131.     CALL    CONOUT
  132.     RET
  133. ;
  134. FILDSK:    CALL    FILBUF0
  135.     XRA    A
  136. FDLP:    PUSH    PSW
  137.     MOV    C,A
  138.     STA    TRK
  139.     CALL    WRITET    ;WRITE ONE TRACK
  140.     POP    PSW
  141.     PUSH    PSW
  142.     MOV    C,A
  143.     CALL    COMPT
  144.     POP    PSW
  145.     INR    A
  146.     CPI    77
  147.     JNZ    FDLP    ;DO ALL 77 TRACKS
  148.     RET
  149. ;
  150. FILBUF0:
  151.     LXI    H,BUF0    ;FILL BUF0 WITH (A)
  152.     LXI    B,128*LASTSEC
  153. FLP:    MOV    M,A
  154.     INX    H
  155.     DCR    C
  156.     JNZ    FLP
  157.     DCR    B
  158.     JNZ    FLP
  159.     RET
  160. ;
  161. ;
  162. ;
  163. ;
  164. COMPT:    LXI    H,BUF1
  165.     CALL    RT2    ;REREAD INTO BUF1
  166.     LXI    H,BUF0
  167.     LXI    D,BUF1
  168.     LXI    B,128*LASTSEC
  169. CMPLP:    LDAX    D
  170.     CMP    M
  171.     JNZ    CERR
  172.     INX    H
  173.     INX    D
  174.     DCR    C
  175.     JNZ    CMPLP
  176.     DCR    B    ;ARE WE AT END OF BUFFER?
  177.     JNZ    CMPLP
  178.     RET
  179. CERR:    PUSH    B
  180.     LXI    D,MESGC
  181.     CALL    CRPRT
  182.     LDA    TRK
  183.     CALL    PRTHEX
  184.     LXI    D,MESGD
  185.     CALL    PRTMSG
  186.     POP    H    ;PUSHED FROM B
  187.     DAD    H    ;COMPUTE SECTOR IN ERROR
  188.     LXI    D,0FF00H
  189.     DAD    D
  190.     MVI    A,27
  191.     SUB    H
  192.     CALL    PRTHEX    ;PRINT SECTOR
  193.     RET
  194. ;
  195. ;
  196. READT:    LXI    H,BUF0    ;TRACK # IN C
  197. RT2:    SHLD    DMAAD
  198.     CALL    SETTRK
  199.     MVI    C,1
  200. RT3:    PUSH    B
  201.     CALL    SETSEC
  202.     CALL    READ
  203.     LHLD    DMAAD
  204.     LXI    D,128
  205.     DAD    D
  206.     SHLD    DMAAD
  207.     POP    B
  208.     MVI    A,LASTSEC
  209.     CMP    C
  210.     RZ
  211.     INR    C
  212.     JMP    RT3
  213. ;
  214. ;
  215. WRITET:    LXI    H,BUF0    ;TRACK # IN C
  216. WT2:    SHLD    DMAAD
  217.     CALL    SETTRK
  218.     MVI    C,1
  219. WT3:    PUSH    B
  220.     CALL    SETSEC
  221.     CALL    WRITE
  222.     LHLD    DMAAD
  223.     LXI    D,128
  224.     DAD    D
  225.     SHLD    DMAAD
  226.     POP    B
  227.     MVI    A,LASTSEC
  228.     CMP    C
  229.     RZ
  230.     INR    C
  231.     JMP    WT3
  232. REPEAT:    DB    0
  233. CMPERR:    DB    0    ;NUMBER OF COMPARE ERRORS
  234. TRK:    DB    0
  235. TSTCNT:    DB    0
  236. STK:    DS    32
  237. STKTOP:    DB    0
  238.     ORG    400H    ;KEEP CONSTANT
  239. ;        TRACK   =  LAST SELECTED TRACK
  240. ;        SECTOR  =  LAST SELECTED SECTOR
  241. ;        DMAAD   =  LAST SELECTED DMA ADDRESS
  242. ;        DISKNO  =  LAST SELECTED DISK NUMBER
  243. ;    (NOTE THAT ALL ARE BYTE VALUES EXCEPT FOR DMAAD)
  244. ;
  245. SCRAT    DB    0,0,0,0,0,0,0,0,0,0,0    ;START OF SCRATCH AREA
  246. TRACK    EQU    SCRAT        ;CURRENT TRACK ON DRIVE 0
  247. TRAK1    EQU    TRACK+1        ;CURRENT TRACK ON DRIVE 1
  248. SECTOR    EQU    SCRAT+2        ;CURRENTLY SELECTED SECTOR
  249. DMAAD    EQU    SCRAT+3        ;CURRENT DMA ADDRESS
  250. DISKNO    EQU    SCRAT+5        ;CURRENT DISK NUMBER
  251. DUMMY    EQU    DISKNO+1    ;MUST BE 0 FOR DOUBLE ADD
  252. ;
  253. ;
  254. ;
  255. ;
  256. ;    I/O DRIVERS FOR THE DISK FOLLOW
  257. ;
  258. HOME:    ;MOVE TO THE TRACK 00 POSITION OF CURRENT DRIVE
  259.     LDA    DISKNO    ;SELECTED DISK
  260.     MOV    C,A    ;FOLLOW PARAMETER CONVENTIONS
  261.     CALL    SELDSK    ;ROUTINE TO SELECT THE DISK
  262. ;SET UP H,L TO POINT TO WORD WITH TRACK FOR SELECTED DISK
  263.     LXI    D,TRACK
  264.     LHLD    DISKNO
  265.     DAD    D
  266. HOMEL:
  267.     MVI    M,00    ;SET CURRENT TRACK PTR BACK TO 0
  268.     IN    127    ;READ FDC STATUS
  269.     ANI    4    ;TEST TRACK 0 BIT
  270.     RNZ        ;RETURN IF AT 0
  271.     STC        ;DIRECTION=OUT
  272.     CALL    STEP    ;STEP ONE TRACK
  273.     JMP    HOMEL    ;LOOP
  274. ;
  275. SELDSK:    ;SELECT DISK GIVEN BY REGISTER C
  276. ;MAKE SURE DUMMY IS 0 (FOR USE IN DOUBLE ADD TO H,L)
  277.     XRA    A
  278.     STA    DUMMY
  279.     MOV    A,C
  280.     STA    DISKNO
  281.     RRC        ;PUT INTO BITS 4,5
  282.     RRC
  283.     RRC
  284.     RRC
  285.     ORI    08    ;ENABLE DISK SELECT
  286.     OUT    127    ;SELECT THE DISK
  287.     RET
  288. ;
  289. SETTRK:    ;SET TRACK GIVEN BY REGISTER C
  290. ;FIRST REFERENCE CORRECT TRACK INDICATOR ACCORDING TO
  291. ;SELECTED DISK
  292.     LXI    D,TRACK    ;ADDRESS OF TRACK FOR DISK 0
  293.     LHLD    DISKNO    ;FIND OUT WHICH DISK IS SELECTED
  294.     DAD    D
  295.     MOV    A,C    ;DESIRED TRACK
  296.     CMP    M
  297.     RZ        ;WE ARE ALREADY ON THE TRACK
  298. SETTKX:
  299.     CALL    STEP    ;STEP TRACK-CARRY HAS DIRECTION
  300.             ;STEP WILL UPDATE TRACK INDICATOR
  301.     MOV    A,C
  302.     CMP    M    ;ARE WE WHERE WE WANT TO BE
  303.     JNZ    SETTKX    ;NOT YET
  304. ;HAVE STEPPED ENOUGH
  305. SEEKRT:
  306. ;DELAY 18 MSEC FOR FINAL STEP TIME AND HEAD SETTLE TIME
  307.     MVI    A,18D
  308.     CALL    DELAY
  309.     RET        ;END OF SETTRK ROUTINE
  310. ;
  311. DELAY:    ;ROUTINE TO DELAY C(A) MILLISECONDS
  312.     MVI    C,82H    ;ADJUST FOR 1 MSEC LOOP DELAY
  313.             ;THIS IS THE VALUE FOR OUR IMSAI
  314. LDXA:
  315.     DCR    C
  316.     JNZ    LDXA    ;LOOP 1 MSEC
  317.     DCR    A
  318.     JNZ    DELAY
  319.     RET        ;END OF DELAY ROUTINE
  320. ;
  321. SETSEC:    ;SET SECTOR GIVEN BY REGISTER C
  322.     MOV    A,C
  323.     STA    SECTOR
  324.     RET
  325. ;
  326. SETDMA:    ;SET DMA ADDRESS GIVEN BY REGISTERS B AND C
  327.     MOV    L,C    ;LOW ORDER ADDRESS
  328.     MOV    H,B    ;HIGH ORDER ADDRESS
  329.     SHLD    DMAAD    ;SAVE THE ADDRESS
  330.     RET
  331. ;
  332. ;
  333. ERRORS:    DB    0    ;KEEP TRACK OF NUMBER OF ERRORS
  334. READ:    ;PERFORM READ OPERATION.
  335.     ;THIS IS SIMILAR TO WRITE, SO SET UP READ COMMAND AND USE
  336.     ;COMMON CODE IN WRITE
  337.     MVI    D,40H    ;SET READ FLAG
  338.     JMP    WAITIO    ;TO PERFORM THE ACTUAL I/O
  339. ;
  340. WRITE:    ;PERFORM A WRITE OPERATION
  341.     MVI    D,80H    ;SET WRITE COMMAND
  342. ;
  343. WAITIO:
  344. ;ENTER HERE FROM READ AND WRITE TO PERFORM THE ACTUAL I/O 
  345. ;OPERATION.  RETURN A 00H IN REGISTER A IF THE OPERATION COMPLETES
  346. ;PROPERLY, AND 01H IF AN ERROR OCCURS DURING THE READ OR WRITE
  347. ;
  348. ;IN THIS CASE, WE HAVE SAVED THE DISK NUMBER IN 'DISKNO' (0,1)
  349. ;            THE TRACK NUMBER IN 'TRACK' (0-76)
  350. ;            THE SECTOR NUMBER IN 'SECTOR' (1-26)
  351. ;            THE DMA ADDRESS IN 'DMAAD' (3-3F80H)
  352.             ;D STILL HAS R/W FLAG
  353.     MVI    A,0    ;SET ERROR COUNT
  354.     STA    ERRORS    ;RETRY SOME FAILURES 10 TIMES
  355.             ;BEFORE GIVING UP
  356. TRYAGN:
  357. ;FIRST WE HAVE TO FIGURE OUT WHICH DRIVE IS SELECTED
  358. ;AND WHICH TRACK IS DESIRED
  359.     LXI    B,TRACK
  360.     LHLD    DISKNO
  361.     DAD    B    ;H,L POINT TO CORRECT TRACK INDICATOR
  362.     MOV    A,M
  363.     PUSH    PSW    ;NEED IT LATER
  364.     LHLD    DMAAD    ;GET BUFFER ADDRESS
  365.     DCX    H    ;SAVE AND REPLACE 3 BYTES BELOW
  366.             ;BUF WITH TRACK,SECTOR,ADDRESS MARK
  367.     MOV    B,M
  368.     MVI    A,0FBH    ;ADDRESS MARK
  369.     MOV    M,A
  370.     DCX    H
  371.     MOV    C,M
  372.     LDA    SECTOR    ;NOTE THAT INVALID SECTOR NUMBER
  373.             ;WILL RESULT IN HEAD UNLOADED
  374.             ;ERROR, SO DONT CHECK
  375.     MOV    M,A
  376.     DCX    H
  377.     MOV    E,M
  378.     POP    PSW
  379.     MOV    M,A
  380.     MOV    A,H    ;SET UP FDC DMA ADDRESS
  381.     OUT    126    ;HIGH BYTE
  382.     MOV    A,L
  383.     OUT    125    ;LOW BYTE
  384.     MOV    A,D    ;GET R/W FLAG
  385.     OUT    127    ;START DISK READ/WRITE
  386. RWWAIT:    IN    127    ;READ FDC STATUS
  387.     ANI    0F8H    ;TEST FOR ANY ERROR OR IOF
  388.     JZ    RWWAIT
  389.     MOV    M,E    ;RESTORE 3 BYTES BELOW BUF
  390.     INX    H
  391.     MOV    M,C
  392.     INX    H
  393.     MOV    M,B
  394.     IN    127    ;TEST FOR ERRORS
  395.     ANI    0F0H
  396.     RZ        ;A WILL BE 0 IF NO ERRORS
  397. ;COME HERE ON ERROR FROM DISK
  398.     PUSH    D    ;SAVE READ/WRITE CODE
  399.     LXI    D,MESGE1
  400.     CALL    CRPRT
  401.     IN    127
  402.     ANI    0F0H
  403.     CALL    PRTHEX
  404.     LXI    D,MESGE2
  405.     CALL    PRTMSG
  406.     LDA    DISKNO
  407.     ADI    'A'
  408.     MOV    C,A
  409.     CALL    CONOUT
  410.     LXI    D,MESGE3
  411.     CALL    PRTMSG
  412.     LXI    D,TRACK
  413.     LHLD    DISKNO
  414.     DAD    D
  415.     MOV    A,M
  416.     CALL    PRTHEX
  417.     LXI    D,MESGE4
  418.     CALL    PRTMSG
  419.     LDA    SECTOR
  420.     CALL    PRTHEX
  421.     LDA    ERRORS
  422.     INR    A
  423.     STA    ERRORS
  424.     CPI    20
  425.     JNZ    REDO    ;RETRY    20 TIMES
  426.     POP    D
  427.     MVI    A,0FFH    ;ERROR RETURN
  428.     RET
  429. ;
  430. MESGE1:    DB    'DISK ERROR, TYPE $'
  431. MESGE2:    DB    ', ON DRIVE $'
  432. MESGE3:    DB    ', AT TRACK $'
  433. MESGE4:    DB    ', SECTOR $'
  434. REDO:
  435.     POP    D    ;GET R/W FLAG
  436.     IN    127    ;GET ERROR BITS
  437.     ANI    0E0H    ;RETRY IF NOT TRACK ERROR
  438.     JNZ    TRYAGN
  439. ;WAS A TRACK ERROR SO NEED TO RESEEK
  440.     PUSH    D    ;SAVE    READ/WRITE INDICATOR
  441. ;FIGURE OUT THE DESIRED TRACK
  442.     LXI    D,TRACK
  443.     LHLD    DISKNO    ;SELECTED DISK
  444.     DAD    D    ;POINT TO CORRECT TRACK INDICATOR
  445.     MOV    A,M    ;DESIRED TRACK
  446.     PUSH    PSW    ;SAVE IT
  447.     CALL    HOME
  448.     POP    PSW
  449.     MOV    C,A
  450.     CALL    SETTRK
  451.     POP    D    ;GET READ/WRITE INDICATOR
  452.     JMP    TRYAGN
  453. ;
  454. ;
  455. ;
  456. STEP:                ;STEP HEAD OUT TOWARDS ZERO
  457.                 ;IF CARRY IS SET; ELSE
  458.                 ;STEP IN
  459. ; H,L POINT TO CORRECT TRACK INDICATOR WORD
  460.     PUSH    PSW    ;SAVE DIRECTION
  461. STWAIT:    IN    127    ;INPUT FDC STATUS
  462.     ANI    2    ;TEST STEP READY BIT
  463.     JZ    STWAIT    ;WAIT FOR STEP READY(MAX 10 MSEC)
  464.     POP    PSW    ;GET DIRECTION TO STEP
  465.     JC    OUTX
  466.     INR    M    ;INCREMENT CURRENT TRACK BYTE
  467.     MVI    A,4    ;SET DIRECTION = IN
  468. DOSTEP:
  469.     OUT    127    ;SET DIRECTION BIT IN FDC
  470.     ORI    2
  471.     OUT    127    ;PULSE STEP BIT
  472.     ANI    0FDH
  473.     OUT    127    ;TURN OFF PULSE
  474.     RET
  475. ;
  476. OUTX:
  477.     DCR    M    ;UPDATE TRACK BYTE
  478.     XRA    A    ;SET DIRECTION = OUT
  479.     JMP    DOSTEP
  480. ;
  481. ;
  482. ;
  483. BUF0:    DS    128*LASTSEC
  484. BUF1:    DS    128*LASTSEC
  485.     END
  486.