home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 01 / tricks / disksave.asm < prev    next >
Encoding:
Assembly Source File  |  1989-10-10  |  5.4 KB  |  213 lines

  1. ;* ------------------------------------------------------- *
  2. ;*                     DISKSAVE.ASM                        *
  3. ;*          Datenschutz für Disketten/Festplatten          *
  4. ;*       (c) 1989 by Christian Ramsauer  &  TOOLBOX        *
  5. ;* ------------------------------------------------------- *
  6. ;*           Assembler : Turbo Assembler 1.0               *
  7. ;*           tasm disksave.asm                             *
  8. ;*           tlink disksave.obj                            *
  9. ;*           exe2bin disksave.exe disksave.com             *
  10. ;* ------------------------------------------------------- *
  11. code       segment
  12.            assume cs:code, ds:code, es:code
  13.            org 100h
  14.  
  15. START:     jmp BEGIN
  16.  
  17. ;*  Varibalen und Pufferspeicher
  18.  
  19. res        db 255,255,255,255
  20. leer       db 512 dup(0)
  21.  
  22. bootsec    db 11 dup(0)
  23. bprosec    dw 0             ; Bytes pro Sektor
  24. sproclu    db 0             ; Sektoren pro Cluster
  25. bootsecs   dw 0             ; Anzahl der Bootsektoren
  26. fats       db 0             ; Kopien der FAT
  27. rootdir    dw 0             ; Einträge im Rootdirectory
  28. secs       dw 0             ; Anzahl der Sektoren
  29. disktyp    db 0             ; Diskettentyp
  30. secinfat   dw 0             ; Sektoren in der FAT
  31. puffer     dw 512 dup(0)
  32.  
  33. vergl      dw 0
  34. status     db 0
  35. laufwerk   dw 0
  36.  
  37. err1       db "Ungültige Laufwerksangabe !",13,10,7,36
  38. err2       db "Fehler beim Lesen/Schreiben"
  39.            db " eines Sektors !",13,10,7,36
  40.  
  41. ;*  Laufwerk ermitteln, in dem die Diskette/Platte
  42. ;*  ge- bzw. entsichert werden soll
  43.  
  44. GetDrive   proc near
  45.            mov  al,ds:[80h]
  46.            cmp  al,2
  47.            jb   LAB2
  48.            mov  al,ds:[82h]
  49.            cmp  al,90
  50.            jle  LAB1
  51.            sub  al,32
  52. LAB1:      cmp  al,90
  53.            jg   LAB2
  54.            cmp  al,65
  55.            jl   LAB2
  56.            sub  al,65
  57.            mov  ah,0
  58.            mov  laufwerk,ax
  59.            ret
  60. LAB2:      mov  dx,offset err1
  61.            mov  ah,9
  62.            int  21h
  63.            jmp  ENDE
  64. GetDrive   endp
  65.  
  66. ;*  Abfangen eines Fehlers beim Lesen bzw. Schreiben
  67. ;*  eines Sektors auf Diskette/Platte
  68.  
  69. Error      proc near
  70.            jnc  E_END
  71.            mov  dx,offset err2
  72.            mov  ah,9
  73.            int  21h
  74.            jmp  ENDE
  75. E_END:     ret
  76. Error      endp
  77.  
  78. ;*  Interrupt 25h ausführen
  79. ;*  Lesen eines Sektors
  80. ;*  Sektornummer muß in DX übergeben werden
  81. ;*  Puffer:  DS:BX
  82.  
  83. Int25h     proc near
  84.            mov  ax,laufwerk
  85.            mov  cx,1
  86.            int  25h
  87.            call error
  88.            popf
  89.            ret
  90. Int25h     endp
  91.  
  92. ;*  Interrupt 26h ausführen
  93. ;*  Schreiben eines Sektors
  94. ;*  Sektornummer muß in DX übergeben werden
  95. ;*  Puffer:  DS:BX
  96.  
  97. Int26h     proc near
  98.            mov  ax,laufwerk
  99.            mov  cx,1
  100.            int  26h
  101.            call error
  102.            popf
  103.            ret
  104. Int26h     endp
  105.  
  106. ;*  Bootsektor (Nummer 0) von Diskette/Platte lesen
  107. ;*  und ab der Adresse von »bootsec« ablegen
  108.  
  109. GetBootSec proc near
  110.            mov  dx,0
  111.            mov  bx,offset bootsec
  112.            call Int25h
  113.            ret
  114. GetBootSec endp
  115.  
  116. ;*  Ersten Sektor des Directories einlesen
  117. ;*  und geändert wieder zurückschreiben
  118.  
  119. AlterDir   proc near
  120.            mov  bx,offset puffer
  121.            mov  ax,secinfat
  122.            mul  fats
  123.            add  ax,bootsecs
  124.            mov  dx,ax
  125.            call Int25h
  126.            mov  ah,[bx+16]
  127.            mov  al,[bx]
  128.            mov  status,al
  129.            mov  [bx+16],al
  130.            mov  [bx],ah
  131.            call Int26h
  132.            ret
  133. AlterDir   endp
  134.  
  135. ;*  Löschen der ersten FAT auf der Diskette/Platte
  136. ;*  bis auf die drei bzw. vier reservierten Bytes
  137.  
  138. DelFat1    proc near
  139.            mov  ax,secinfat
  140.            add  ax,bootsecs
  141.            mov  vergl,ax
  142.            mov  dx,bootsecs
  143. WEITER:    mov  bx,offset leer
  144.            cmp  dx,bootsecs
  145.            jnz  NOBOOT
  146.            push dx
  147.            xor  dx,dx
  148.            mov  ax,secs
  149.            mov  cl,sproclu
  150.            mov  ch,0
  151.            div  cx
  152.            pop  dx
  153.            cmp  ax,4096
  154.            ja   FAT16
  155. FAT12:     sub  bx,3
  156.            mov  ah,disktyp
  157.            mov  [bx],ah
  158.            jmp  NOBOOT
  159. FAT16:     sub  bx,4
  160.            mov  ah,disktyp
  161.            mov  [bx],ah
  162. NOBOOT:    call Int26h
  163.            inc  dx
  164.            cmp  dx,vergl
  165.            jnz  WEITER
  166.            ret
  167. DelFat1    endp
  168.  
  169. ;*  Wiederherstellung der ersten FAT durch Kopieren
  170. ;*  der zweiten FAT an die Stelle der ersten
  171.  
  172. RestoreFat proc near
  173.            mov  ax,secinfat
  174.            add  ax,bootsecs
  175.            mov  vergl,ax
  176.            mov  dx,bootsecs
  177.            add  dx,secinfat
  178. WHILE:     mov  bx,offset puffer
  179.            call Int25h
  180.            sub  dx,secinfat
  181.            mov  bx,offset puffer
  182.            call Int26h
  183.            inc  dx
  184.            cmp  dx,vergl
  185.            je   P_END
  186.            add  dx,secinfat
  187.            jmp  WHILE
  188. P_END:     ret
  189. RestoreFat endp
  190.  
  191. ;*  Hauptteil des Programms
  192.  
  193. BEGIN:     Push cs
  194.            Pop  ds
  195.            call GetDrive
  196.            call GetBootSec
  197.            call AlterDir
  198.            mov  al,0
  199.            cmp  status,al
  200.            jz   RESTORE
  201.            call DelFat1
  202.            jmp  ENDE
  203.  
  204. RESTORE:   call RestoreFat
  205.  
  206. ENDE:      mov  ah,4Ch
  207.            int  21h
  208.  
  209. code       ends
  210.            end  START
  211. ;* ------------------------------------------------------- *
  212. ;*                  ENDE von DISKSAVE.ASM                  *
  213.