;*****************************************************************************
; programm :  testdisk.asm           v 2.01        update : 01.09.1988
; geschrieben in der syntax fr a86 ( public-domain )
; aufruf mit testdisk [ lw: ]
; * funktion in der version 2.01 auf disklaufwerke mit max. 720k beschr„nkt *
; es werden nur normformate unterstuetzt
; wer andere formate bearbeiten will, kann in  ( weit1 ) weitere eintragungen
; vornehmen.
; dann muss eine prozedur eingefgt werden, welche die entsprechenden
; laufwerksdaten in die variablen  s - maxsp laed.
;*****************************************************************************

param_a    equ   082h
param_c    equ   080h

cls        macro                     ; proc l”scht den bildschirm
           mov ax,0003h              ; ohne parameter aufrufen
           int 010h
#em

zeigbild   macro
           mov dx,offset #1
           mov ah,09
           int 021h
#em

posi       macro
           push ax
           push dx
           push bx
           xor bx,bx
           mov ah,#1   ; 02
           mov al,#2   ; 00
           mov dh,#3   ; 23
           mov dl,#4   ; 50
           int 010
           pop bx
           pop dx
           pop ax
#em
           jmp diskpr
nam        db 'Testdisk  Version 2.01   01.04.1988   by m.s'
buffer     db 3               ; anzahl der zu lesenden zeichen
zahl99     db 00
bufftext   db '   '           ; muá buffer x blanks enthalten
op         db 07,13,10,'Geben sie ein Laufwerk an  z.b.   a  b  :','$'
lw         db 00
fehl       db 07,'Fehler aufgetreten',13,10,'$'
falsch     db 07,07,13,10,'Allgemeiner Fehler aufgetreten ',13,10,10
           db ' M”gliche Fehlerquellen :',13,10
           db 10,'1. ) Testdisk in der Version 2.00 nur fr Disketten'
           db ' <= 720 Kbyte geeignet',13,10
           db '2. ) Diskette ist entweder unbrauchbar oder hat kein Norm-Format !'
           db 13,10,'3. ) Disk-Einheit berprfen !'
           db 13,10,'4. )       * m”glicherweise ist das Laufwerk ungltig ***'
           db 13,10,'Programm-Abbruch mit enter $'

message    db 13,10,'Testdisk Version 2.01   public-domain',13,10,13
           db 'ueberprueft Disketten <= 720 Kbyte auf voellige Fehlerfreiheit',13,10
           db 'DOS fhrt in der Regel bei Lese.-oder Schreibfehlern mehr als',13,10
           db 'einen Zugriff durch.',13,10,10
           db 'Testdisk greift nur ** einmal ** zu',13,10,10
           db 'Disketten, welche Testdisk als fehlerfrei '
           db 'identifiziert, sind',13,10,10
           db '                ***  vollkommen *** fehlerfrei',13,10,10,10
           db 'bei Fehlern evtl. neu formatieren ',13,10
           db 'ABBRUCH  mit enter ',13,10,'$'
frei       db '**  Diskette ist fehlerfrei **','$'
spur       db 00
fehlflag   db 00h                ; errorlevel
s          db 02h                ; enth„lt seitenzahl der disk
sek        db 00                 ; sektoren pro spur
sektor     db 00                 ; startsektor fr verfify
kopf       db 00                 ; maxsp = maximale trackanzahl
maxsp      db 026                ; sollen mehr als 40 spuren berprft werden,
z0         db 00                 ; muss hier die spurenzahl eingetragen sein
t1         db 100                ; z0,t1,t2,z1,z2,z3 werden nur bei der um-
t2         db 10                 ; wandlung der hexzahlen in dez-zahlen
mich       db 'spur : '          ; zur anzeige der spuren benutzt
z1         db 0
z2         db 0
z3         db 0
e          db '$'
leer1      db '                                      '
leer       db '                     $'
diskpr:
           cls
           zeigbild message
           cmp b[param_c],00    ; als parameter bergebenes laufwerk
           jne weiter           ; benutzen

input:     call leerzei
           posi 02,00,22,1
           zeigbild op     ; kein laufwerk angegeben ?
           mov ah,0
           mov fehlflag,ah
           mov dx,offset buffer
           mov ah,0a
           int 021
           posi 02,00,23,57
           zeigbild leer
           posi 02,00,21,1
           zeigbild leer1
           mov dl,zahl99
           cmp dl,0
           jne weit
           mov al,fehlflag
           mov ah,04c
           int 021

weiter:
           mov  dl,[param_a]
           jmp short we1

weit:      mov dl,bufftext
we1:       or   dl,020           ; laufwerksdaten bestimmen
           sub  dl,060           ; anzahl der cluster gibt
           mov  lw,dl            ; aufschluss ber zahl der sektoren
           mov  ah,036
           int  021
           jc   err              ; jetzt schon ein fehler, dann ist disk
           cmp  ax,0002          ; mehr als 2 sektoren pro cluster
           jg   err              ; dann ist lw gr”sser 720 kbyte  !
           cmp  dx,013b          ; oder lw defekt evtl. ungltiges lw
           je   w1               ; festplatte wird abgewiesen
           cmp  dx,0139
           je   w2
           cmp  dx,015f
           je   w3
           cmp  dx,0162
           je   w4
           cmp  dx,0650
           jg   w5
err:       jmp  error             ; grunddaten werden erstellt
w1:        mov sek,08             ; seiten : 1 oder 2
           mov s,02                ; sektoren pro spur : 8 oder 9
           mov maxsp,026
           jmp check
w2:        mov sek,08
           mov s,01h
           mov maxsp,026         ; maxsp muss maximale track-
           jmp check             ; anzahl -1 enthalten !!!
w3:        mov sek,09
           mov s,01
           mov maxsp,026
           jmp check
w4:        mov sek,09
           mov s,02
           mov maxsp,026
           jmp check
w5:        mov sek,09
           mov s,02
           mov maxsp,079
check:     clc                 ; bis hierhin werden nur daten fr verify
           mov kopf,00       ; gesammelt
           mov spur,00
           mov sektor,01
           mov  ah,04         ; funktionscode fr verify
           mov  al,sek         ; al mit anzahl der zu lesenden sektoren laden
           mov  dl,lw          ; dl mit laufwerk laden
           sub lw,01         ; -1, um das richtige lw zu benutzen
           mov  dl,lw
verify:    clc
           mov  al,sek
           mov  ah,04
           mov  dh,kopf        ; kopf entweder 0 oder 1
           mov  ch,spur
           mov  z0,ch
           call zahl
           call pos
           mov  cl,sektor
           mov  dl,lw
           int  013
           jc   fehler         ; fehler ? --> anzeigen
verify1:   clc
           add spur,01       ; und weiterz„hlen
           cmp  ch,maxsp
           jg   verify2
           mov sektor,01
           jmp verify
verify2:   cmp s,01          ; nur einseitig --> dann ende
           je   normend
           add kopf,01       ; ansonsten kopf 1 benutzen
           cmp kopf,02       ; kopf 1 schon benutzt --> ende
           je   normend
           mov spur,00       ; ansonsten spur und sektor mit anfangswerten
           mov sektor,01     ; laden
           jmp verify
normend:   mov al,fehlflag
           cmp al,00
           jne nore
           posi 02,00,21,1
           zeigbild frei
nore:      mov  al,fehlflag    ; errorlevel wird auf 0ffh gesetzt
           jmp input
fehler:    cmp  ah,020       ; ah=20 --> disk-einheit defekt
           je   error        ; dann prog beenden
           zeigbild fehl     ; ansonsten nur fehler anzeigen
           mov fehlflag,07f
           jmp verify1
error:     cls
           zeigbild  falsch  ; fatal-fehler anzeigen und proc beenden
           jmp input

zahl:      push ax
           push dx           ; mac konvertiert ein hexzahl in z0
           xor ax,ax         ; in eine ascii-ausgabe in z1,z2,z3
           mov al,z0         ; sie kann dann als zeichenkette
           idiv t1           ; ausgegeben werden
           add al,48
           mov z1,al
           xchg ah,al
           mov ah,00
           idiv t2
           add al,48
           mov z2,al
           add ah,48
           mov z3,ah
           pop dx
           pop ax
           ret

leerzei:   posi 02,00,23,1
           zeigbild leer1
           ret

pos:       posi 02,00,23,50
           push ax
           push dx
           zeigbild mich
           pop dx
           pop ax
           ret

