home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / basic / library / qb_pds / dos / bdisk / fff.asm < prev    next >
Encoding:
Assembly Source File  |  1987-12-05  |  4.7 KB  |  184 lines

  1. ;============================================================================
  2. ; Fast Floppy Format
  3. ;
  4. ; This program uses the BDISK library routines to perform a format of a
  5. ; 5 1/4" 360K floppy diskette.  The file BDISK.INC is necessary for assembly,
  6. ; and the file BDISK.LIB is necessary for linking.
  7.  
  8.         DOSSEG
  9.         .MODEL small
  10.  
  11.         INCLUDE bdisk.inc
  12.  
  13.         .STACK 200H
  14.  
  15.         .DATA
  16.  
  17. Mess1   db 13,10
  18.         db 'Fast Floppy Format, ASM - Version 1.0, by Eric Tauck',13,10
  19.         db '$'
  20.  
  21. Mess2   db 13,10
  22.         db 'Usage: FFF <drive>',13,10
  23.         db '$'
  24.  
  25. Mess3   db 13,10
  26.         db 'About to format diskette in drive A:',13,10
  27.         db 'Press any key to begin',13,10
  28.         db '$'
  29.  
  30. Mess4   db 13,10
  31.         db 'Error: Illegal drive specifier',13,10
  32.         db '$'
  33.  
  34. Mess5   db 13,10
  35.         db 'Error: Could not format disk',13,10
  36.         db '$'
  37.  
  38.         .DATA?
  39.  
  40. Drive   dw ?                    ;drive to format
  41. SecBuf  db (9 * 512) DUP (?)    ;buffer for whole track
  42.  
  43.         .CODE
  44.  
  45. ;--- initialize
  46.  
  47. Start:  push ds
  48.         mov ax, @DATA
  49.         mov ds, ax              ;set data segment
  50.         mov ah, 9               ;display function
  51.         mov dx, OFFSET Mess1    ;message
  52.         int 21h
  53.  
  54.         mov ax, 2523h           ;set int function
  55.         push cs
  56.         pop ds                  ;interrupt segment
  57.         mov dx, OFFSET Break    ;interrupt offset
  58.         int 21h                 ;install break trap
  59.         pop ds
  60.  
  61.         setbase 9, 512          ;set disk base
  62.  
  63. ;--- get drive number
  64.  
  65.         mov si, 81h     ;command tail location
  66. Main1:  lodsb           ;load length
  67.         cmp al, 13      ;check if end
  68.         je Main2
  69.         cmp al, ' '     ;skip delimiters
  70.         jbe Main1
  71.  
  72.         mov dx, @DATA
  73.         mov ds, dx      ;set data segment
  74.         or al, 'a'-'A'  ;make lower case
  75.         sub al, 'a'     ;convert to number
  76.         cmp al, 26      ;check range
  77.         jae Main3
  78.  
  79. ;--- prepare to format
  80.  
  81.         sub ah, ah
  82.         mov drive, ax           ;save drive number
  83.         add Mess3 + 36, al      ;fix message
  84.         mov dx, OFFSET Mess3
  85.         mov ah, 9               ;display function
  86.         int 21h
  87.  
  88.         mov ax, 0c08h           ;function number
  89.         int 21h                 ;wait for key
  90.         jmp short Main4
  91.  
  92. ;--- no input
  93.  
  94. Main2:  mov dx, OFFSET Mess2
  95.         jmp Main8
  96.  
  97. ;--- invalid drive
  98.  
  99. Main3:  mov dx, OFFSET Mess4
  100.         jmp Main8
  101.  
  102. ;--- format disk, loop for each track and head
  103.  
  104. Main4:
  105.         sub bx, bx                      ;track count
  106.         mov dx, OFFSET Mess5            ;message if format error
  107. Main5:
  108.         sub cx, cx                      ;head count
  109. Main6:
  110.         trkfrm drive, cx, bx, 9, 512    ;format track
  111.         or ax, ax                       ;check if error
  112.         jz Main7
  113.         jmp Main8
  114.  
  115. Main7:  inc cx                          ;next head
  116.         cmp cx, 2                       ;check if done
  117.         jne Main6
  118.         inc bx                          ;next track
  119.         cmp bx, 40                      ;check if done
  120.         jne Main5
  121.  
  122. ;--- write boot sector
  123.  
  124.         mov ax, SEG _BOOTSEC
  125.         mov ds, ax
  126.         mov di, OFFSET _BOOTSEC         ;location of boot sector
  127.  
  128.         secwrt drive, 0, 0, 1, 1, ds, di       ;write sector
  129.  
  130. ;--- write FAT's
  131.  
  132.         mov ax, @DATA
  133.         mov es, ax
  134.         mov di, OFFSET SecBuf   ;location of sector buffer
  135.  
  136.         push di
  137.         mov al, _BOOTSEC + 21   ;get the media descriptor byte
  138.         stosb
  139.         mov al, 0ffH            ;reserved FF
  140.         stosb
  141.         stosb
  142.         sub al, al
  143.         mov cx, (9 * 512) - 3   ;remaining bytes in buffer
  144.         rep stosb               ;clear buffer
  145.         pop di
  146.  
  147.         secwrt drive, 0, 0, 2, 2, es, di       ;write sectors
  148.         secwrt drive, 0, 0, 4, 2, es, di       ;write sectors
  149.  
  150. ;--- write directories
  151.  
  152.         push di
  153.         sub al, al
  154.         stosb
  155.         stosb
  156.         stosb                   ;clear the first bytes
  157.         pop di
  158.  
  159.         secwrt drive, 0, 0, 6, 4, es, di        ;write sectors
  160.         secwrt drive, 1, 0, 1, 3, es, di        ;write sectors
  161.  
  162.         resbase
  163.         mov ax, 4c00h           ;exit function and code
  164.         int 21h
  165.  
  166. ;--- error formatting disk, error message location in DX
  167.  
  168. Main8:  mov ax, @DATA
  169.         mov ds, ax      ;set data segment
  170.         mov ah, 9       ;display function
  171.         int 21h
  172.  
  173.         resbase         ;restore disk data
  174.         mov ax, 4cffh   ;exit function and code
  175.         int 21h
  176.  
  177. ;--- ^C (break) interrupt handler
  178.  
  179. Break:  resbase         ;restore disk data
  180.         stc             ;set carry
  181.         retf            ;far return to DOS
  182.  
  183.         END Start
  184.