home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol255 / scan.mac < prev    next >
Encoding:
Text File  |  1986-03-22  |  5.0 KB  |  331 lines

  1.     TITLE    'Bad Sectors Scan Utility   6/May/1984  '
  2.     .SALL
  3. ;---------------------------------------------------------------;
  4. ;                                ;
  5. ;    CP/M plus  Bad Sector Scan Utility            ;
  6. ;                                ;
  7. ;    by Tetsuya Okada, Copyright (C) 1984            ;
  8. ;                                ;
  9. ;    Version 1.00    6/May/1984                ;
  10. ;                                ;
  11. ;---------------------------------------------------------------;
  12.     $INCLUDE STDINCL.LIB
  13. ;
  14.     .REQUEST STDLIB
  15.     EXTRN    DECPRI
  16.     CSEG        ; PROGRAM CODE BEGIN
  17.     DEFB    'Copyright (C) 1984 by Tetsuya Okada',EOF
  18. SCAN::
  19.     LD    SP,STACK
  20. RESTART:
  21.     @MSG    <CR,LF,'SCAN - Bad Sectors Scan Utility for CP/M plus',CR,LF,CR,LF>
  22. ;     
  23. ;    CP/M VERSION CHECK
  24. ;
  25.     @BDOS    B$VERS    ;RETURN VERSION NUMBER
  26.     LD    A,H
  27.     AND    A
  28.     JR    NZ,VER$BAD    ;NOT CP/M
  29.     LD    A,L
  30.     AND    0F0H        ;IGNORE RELEASE NUMBER
  31.     CP    30H
  32.     JR    Z,VER$OK
  33. VER$BAD:
  34.     @MSG    <'ERROR: CP/M 3.X required.',CR,LF>
  35.     @STOP
  36. VER$OK:
  37. ;
  38. ;    PROMPT DRIVE NUMBER
  39. ;
  40. MAIN$LOOP:
  41.     @MSG    <'Enter Drive (A-O, or CR to end): '>
  42.     @BDOS    B$CIN
  43.     CP    CR
  44.     JP    Z,STOP
  45.     CP    'a'    ;SMALL ?
  46.     JR    C,NOT$SMALL
  47.     SUB    'a'-'A'
  48. NOT$SMALL:
  49.     LD    (DRIVE),A
  50.     @MSG    <CR,LF>
  51.     LD    A,(DRIVE)
  52.     CP    'A'
  53.     JR    C,DR$ERROR
  54.     CP    'O'+1
  55.     JR    C,DR$OK
  56. DR$ERROR:
  57.     @MSG    <'ERROR: Invalid Drive',CR,LF>
  58.     JP    MAIN$LOOP
  59. DR$OK:
  60. ;
  61. ;    GET DPB
  62. ;
  63.     LD    E,0FFH        ;RETURN ERROR MODE
  64.     @BDOS    B$SETER        ;SET BDOS ERROR MODE
  65. ;    
  66.     LD    HL,1        ;MAKE DRIVE VECTOR
  67.     LD    A,(DRIVE)
  68.     SUB    'A'
  69. SH$DVEC:            ;SHIFT REG(A) TIMES
  70.     DEC    A
  71.     JR    NZ,RST$DRV
  72.     ADD    HL,HL
  73.     JR    SH$DVEC
  74. RST$DRV:
  75.     EX    DE,HL
  76.     @BDOS    B$RSTDRV    ;RESET DRIVE
  77. ;
  78.     LD    A,(DRIVE)
  79.     SUB    'A'
  80.     LD    E,A    
  81.     @BDOS    B$SELDSK    ;SELECT DISK
  82.     INC    A
  83.     JP    NZ,SEL$SUC
  84.     LD    A,H
  85.     CP    4
  86.     JP    Z,DR$ERROR
  87.     JP    IO$ERROR
  88. SEL$SUC:
  89.     @BDOS    B$GETDPB    ;GET DPB ADDRESS OF SELECTED DRIVE
  90.     LD    (DPBADR),HL
  91.     LD    A,H
  92.     AND    L
  93.     CP    0FFH
  94.     JP    Z,IO$ERROR
  95. ;
  96. ;    CALC NUMBER OF PHISICAL SECTOR PER TRACK
  97. ;
  98.     LD    IX,(DPBADR)
  99.     LD    L,(IX+0)    ;SPT (128 SECTORS PER TRACK)
  100.     LD    H,(IX+1)
  101.     LD    A,(IX+15)    ;PSH (PHISICAL RECORD SHIFT FACTOR)
  102. PS$SHIFT:
  103.     AND    A
  104.     JR    Z,PS$S1
  105.     SRL    H        ;HALVE HL 
  106.     RR    L
  107.     JP    C,DPBERROR    ;ERROR IF REMAINDER IS NOT ZERO
  108.     DEC    A
  109.     JR    PS$SHIFT
  110. PS$S1:
  111.     LD    (PSPT),HL    ;STORE PHISICAL SECTOR PER TRACK
  112. ;
  113. ;    CALC NUMBER OF TRACKS 
  114. ;
  115.     LD    L,(IX+5)    ;DSM (NUMBER OF BLOCKS - 1)
  116.     LD    H,(IX+6)
  117.     INC    HL
  118.     LD    B,(IX+2)    ;BSH (BLOCK SHIFT FACTOR)
  119. TR$SHIFT:
  120.     ADD    HL,HL
  121.     JP    C,BIG$DISK
  122.     DJNZ    TR$SHIFT
  123.      LD    E,(IX+0)    ;SPT
  124.     LD    D,(IX+1)
  125.     LD    BC,1
  126. TR$DIV:
  127.     AND    A    ;CLEAR CARRY FLAG
  128.     SBC    HL,DE
  129.     JR    C,TR$D1
  130.     JR    Z,TR$D1
  131.     INC    BC
  132.     JR    TR$DIV
  133. TR$D1:
  134.     LD    (TRACKS),BC
  135. ;
  136.     @MSG    <'Do you want to scan reserved tracks ? (y/n) '>
  137.     CALL    YESNO
  138.     JR    Z,RSV$SCAN
  139.     LD    L,(IX+13)    ;OFF (NUMBER OF RESERVED TRACKS)
  140.     LD    H,(IX+14)
  141.     LD    (CURTRK),HL
  142.     JR    TR$E
  143. RSV$SCAN:
  144.     LD    HL,(TRACKS)
  145.     LD    E,(IX+13)    ;OFF
  146.     LD    D,(IX+14)
  147.     ADD    HL,DE
  148.     LD    (TRACKS),HL
  149.     LD    HL,0
  150.     LD    (CURTRK),HL
  151. TR$E:
  152.     @MSG    <'Do you need sector skewing ? (y/n) '>
  153.     CALL    YESNO
  154.     LD    A,0
  155.     JR    NZ,NO$SKEW
  156.     LD    A,0FFH
  157. NO$SKEW:
  158.     LD    (SKEWF),A
  159. ;
  160. ;    SCAN DISK
  161. ;
  162. @BIOS    MACRO    ?FUNC        ;;MACRO TO CALL BIOS
  163.     CALL    BIOSSUB
  164.     LD    A,?FUNC
  165.     LD    (FUNC),A
  166.     @BDOS    B$BIOS
  167.     ENDM
  168. ;
  169.     XOR    A
  170.     LD    (ERROR),A    ;CLEAR ERROR FLAG
  171. ;
  172.     LD    HL,(TRACKS)
  173.     LD    (TRKCNT),HL
  174. NEXT$TRK:
  175.     @MSG    <'Scanning Track - '>
  176.     LD    HL,(CURTRK)
  177.     CALL    DECPRI
  178.     @MSG    <'      ',CR>
  179. ;
  180.     LD    HL,1
  181.     LD    (CURSEC),HL
  182. NEXT$SEC:
  183.     LD    BC,(CURTRK)
  184.     @BIOS    10        ;SETTRK
  185.     LD    BC,(CURSEC)
  186.     @BIOS    11        ;SETSEC
  187.     LD    BC,SECBUF
  188.     @BIOS    12        ;SETDMA
  189.     @BIOS    13        ;READ
  190.     AND    A
  191.     CALL    NZ,BAD$SEC
  192. ;
  193.     LD    HL,(CURSEC)
  194.     INC    HL
  195.     LD    A,(SKEWF)
  196.     AND    A
  197.     JR    Z,NO$SK
  198.     INC    HL
  199.     LD    (CURSEC),HL
  200.     LD    DE,(PSPT)
  201.     SCF
  202.     SBC    HL,DE
  203.     JR    C,NEXT$SEC
  204.     BIT    0,L
  205.     JR    NZ,INC$TRK
  206.     LD    HL,2
  207.     LD    (CURSEC),HL
  208.     JR    NEXT$SEC
  209. NO$SK:
  210.     LD    (CURSEC),HL
  211.     LD    DE,(PSPT)
  212.     SCF
  213.     SBC    HL,DE
  214.     JR    C,NEXT$SEC
  215. INC$TRK:
  216.     LD    HL,(CURTRK)
  217.     INC    HL
  218.     LD    (CURTRK),HL
  219.     LD    HL,(TRKCNT)
  220.     DEC    HL
  221.     LD    (TRKCNT),HL
  222.     LD    A,H
  223.     OR    L
  224.     JP    NZ,NEXT$TRK
  225. ;
  226. ;    SCANNING COMPLETE
  227. ;
  228.     @MSG    <'Scanning Complete.    '>
  229.     LD    A,(ERROR)
  230.     AND    A
  231.     JR    Z,NO$BAD
  232.     LD    H,0
  233.     LD    L,A
  234.     CALL    DECPRI
  235.     JR    BSMSG
  236. NO$BAD:
  237.     @MSG    <'No'>
  238. BSMSG:
  239.     @MSG    <' Bad Sectors.       ',CR,LF>
  240.     JP    RESTART
  241. ;
  242. STOP:
  243.     @STOP
  244. ;
  245. ;    FATAL ERROR PROCESSING
  246. ;
  247. IO$ERROR:
  248.     @MSG    <'ERROR: Phisical Disk I/O',CR,LF>
  249.     JP    RESTART
  250. ;
  251. DPBERROR:
  252.     @MSG    <'ERROR: Invalid Disk Parameter Block',CR,LF>
  253.     JP    RESTART
  254. ;
  255. BIG$DISK:
  256.     @MSG    <'ERROR: This program cannot support such a big drive.',CR,LF>
  257.     JP    RESTART
  258. ;
  259. MED$CHG:
  260.     @MSG    <'ERROR: Media density has changed.',CR,LF>
  261.     JP    RESTART
  262. ;
  263. ;    SUBROUTINES
  264. ;
  265. YESNO:        ; FLAG Z: YES; NZ: NO
  266.     @BDOS    B$CIN
  267.     PUSH    AF
  268.     @MSG    <CR,LF>
  269.     POP    AF
  270.     CP    'Y'
  271.     RET    Z
  272.     CP    'y'
  273.     RET    
  274. ;
  275. BIOSSUB:    ; SET REGISTERS TO BIOSPB
  276.     LD    (AREG),A
  277.     LD    (BCREG),BC
  278.     LD    (DEREG),DE
  279.     LD    (HLREG),HL
  280.     LD    DE,BIOSPB
  281.     RET
  282. ;
  283. BAD$SEC:
  284.     POP    HL    ;RETURN ADDRESS
  285.     INC    A
  286.     JP    Z,MED$CHG
  287.     PUSH    HL    ;RE-PUSH
  288.     @MSG    <CR,'*** Bad Sector ***  Track - '>
  289.     LD    HL,(CURTRK)
  290.     CALL    DECPRI
  291.     @MSG    <'   Sector - '>
  292.     LD    HL,(CURSEC)
  293.     CALL    DECPRI
  294.     @MSG    <'            ',CR,LF>
  295. ;
  296.     LD    HL,ERROR
  297.     INC    (HL)
  298.     RET    NZ
  299.     DEC    (HL)
  300.     RET
  301. ;
  302. ;    DATA AREA
  303. ;
  304.     DSEG
  305. ;
  306. DRIVE:    DEFS    1    ;DRIVE SPEC. IN ASCII
  307. DPBADR: DEFS    2    ;DPB ADDRESS
  308. PSPT:    DEFS     2    ;NUMBER OF PHISICAL SECTORS PER TRACK
  309. TRACKS: DEFS    2    ;NUMBER OF TRACK 
  310. TRKCNT: DEFS    2    ;TRACK COUNTER
  311. CURTRK: DEFS    2    ;CURRENT TRACK
  312. CURSEC: DEFS    2    ;CURRENT SECTOR
  313. ERROR:    DEFS    1    ;ERROR COUNT
  314. SKEWF:    DEFS    1    ;NONZERO IF SKEWING
  315. ;
  316. BIOSPB:        ;BIOS PARAMETER BLOCK FOR DIRECT BIOS CALL
  317. FUNC:    DEFS    1
  318. AREG:    DEFS    1
  319. BCREG:    DEFS    2
  320. DEREG:    DEFS    2
  321. HLREG:    DEFS    2
  322. ;
  323.     DEFS    32    ;STACK ROOM
  324. STACK:
  325. ;
  326. SECBUF::        ;MUST BE LAST OF .COM FILE
  327. ;    DEFS    1024
  328. ;
  329.     END    SCAN
  330.