; *************  version fuer a86.com   ****************
breite     equ  04h
buf_size   equ  4608
main:      jmp menue
diskv11    db 'DISKV11  Version 1.02   28.04.1988           by  ms'
datfehl    db 7,7,7,13,10,'Fehler bei Dateiverwaltung',13,10,'$'
quellef    db 'quelldatei : $'
zielf      db 'zieldatei : $'
flagf      db 00
handin     dw 0000
handaus    dw 0000
outnum     dw 0000
zdflag     db 0
akti       db ' Drucker ist zugeschaltet',13,10,'$'
passi      db ' Drucker ist nicht zugeschaltet',13,10,'$'
druck      db ' A  =  Drucker  zuschalten',13,10
           db ' P  =  Drucker  abschalten',13,10
           db ' Ihre wahl : $'
alle       db '*.*',00
zatr       db 00
machdir    db 'Neues Directory einrichten',13,10,10
           db 13,10,'Geben Sie den Namen des neuen Directories an :',13,10,'$'
killdir    db 'L”schen eines leeren Directories',13,10,10,'$'
kill2      db 13,10,'Geben Sie den Namen des zu l”schenden <DIR> ein :',13,10,'$'
fehldir2   db 13,10,' Zugriff auf das genannte Verzeichnis abgelehnt',13,10,'$'
fehldir1   db 13,10,' neues directory kann nicht erstellt werden',13,10,'$'
wahl       db 13,10,'A  B  C  D  E  F  G  H  I   Z      X=ENDE $'
aktdir     db 'Aktives Direktory : $'
zaltlw     db 00
wdat       db 'Welche Dateien oder Verzeichnisse ausgeben  ?:$'
msgdat     db 'Ausgabe von Dateien :',13,10,10,'$'
xfcb       db 0ffh, 0,0,0,0,0
attrib     db 08h                   ;volume label attribute
drvnbr1    db 00h                   ;drive number
name1      db '         '           ;name
           db '   '                 ;extension
           db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0                     ;rest of fcb
xfcb2      db 0ffh, 0,0,0,0,0
attrib2    db 08h                   ;volume label attribute
drvnbr2    db 00h                   ;drive number
           db '????????'            ;name
           db '???'                 ;extension
           db 0,0,0,0,0                      ;first 5 'reserved' bytes
newname    db '        '            ;rename field
           db '   '                 ;new extension
           db 0,0,0,0,0,0,0,0,0 9                     ;rest of fcb
nv         db 13,10,'volume label ( 11 zeichen maximal ) : $'
msgvol     db 'bearbeitung des volume-namens :$'
dir_entry  db 0
reserved   db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
zattr      db 0
time       dw 0000
date       dw 0000
size_1     dw 0000
size_2     dw 0000
f_name     db '         '        ;name der datei
term       db '    º  ','$'
msgren     db 'Rename von Dateien und Directories :',13,10,'$'
fehl       db 13,10,'Fehler : Kein RENAME durchgefhrt$'
altlauf    db 'Alter Name ? :$'
neulw      db 'Neuer Name ? :$'
altname    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0
           db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

neuname    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
           db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

wd         db 'Welches Laufwerk soll bearbeitet werden ? : $'
buffer     db 00h               ; anzahl der zu lesenden zeichen
zahl       db 00
bufftext   db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
           db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
xyz        db 00,'$'
cr_lf      db 13,10,'$'
klein      db 1bh,53h,0,'$'     ;drucker = centronics glp ii
cond       db 0fh,'$'           ;als ibm-drucker installiert
space      db 1bh,33h,0eh,'$'
dire       db 'Zu welchem Directory ?:  $'
root       db '\',00
nd         db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
fehldir    db 13,10,'KEIN  > CD <  zu Ihrem < DIR > durchfhrbar $',13,10
wartmsg    db 13,10,'>enter< fr weiter $'
ro1        db 'wurzel-directory$'
e2         db 13,10,'Keine weiteren Subdirectories in diesem Directory',13,10,'$'
msgdir1    db 'Anzeige der Directories :',13,10,'$'
aktlw      db 'Aktives Laufwerk :  ',13,10,'$'
bu:        db 13,10,10
           db ' diskv11                version 1.00            02.04.88',13,10,10
           db ' diskv11 bearbeitet disketten und festplatten',13,10,10
           db ' Sie haben die wahl :',13,10,10
           db ' A. Volume bearbeiten',13,10
           db ' B. Rename von Dateien oder  * direktories *',13,10
           db ' C. Laufwerk setzen',13,10
           db ' D. Inhalt der Disk ausgeben',13,10
           db ' E. Direktory wechseln       * mit \ immer zum haupt-direc.*',13,10
           db ' F. Direktories anzeigen     * im aktiven directory*',13,10
           db ' G. Erstellen neuer Directories',13,10
           db ' H. L”schen leerer Directories',13,10,
           db ' I. Kopieren einer Datei',13,10
           db ' Z. Drucker an und aus',13,10,10,10
           db ' Ihre Wahl ?: ',13,10
buffe:     db 00
menue:
           call getdrive
           mov zaltlw,al
           call setdta
menue1:    clc              ;von hier bis menue2 nur information
           call hilfe
           mov al,bufftext
           and al,0dfh
menue2:    cmp al,65       ;volume bearbeitung
           jne menue3
           call volume
           jmp menue1
menue3:    cmp al,66       ;rename von dateien und direc.
           jne menue4
           call rename
menue4:    cmp al,67       ;setdrive
           jne menue5
           call man
menue5:    cmp al,68       ;disk
           jne menue6
           call cls
           call haupt
           jmp menue1
menue6:    cmp al,69       ;directory  wechseln
           jne menue7
           call setdirec
menue7:    cmp al,70
           jne menue8       ;subdirecs anzeigen
           call cls
           call searchdi
           jmp menue
menue8:    cmp al,71       ;direc erstellen
           jne menue9
           call mk
           jmp menue
menue9:    cmp al,72       ;direc loeschen
           jne menue10
           call rm
menue10:   cmp al,90       ;drucker an oder aus
           jne menue11
           call drucker
menue11:   cmp al,73      ;kopieren
           jne menue12
           call kopie
menue12:   cmp al,88       ;ende
           je menende
           jmp menue1
menende:   mov dl,zaltlw
           mov ah,0eh
           int 21h
           mov ah,4ch
           int 21h

mk:
           call cls
           mov dx,offset machdir
           call bild
           mov buffer,20h
           call input
           call wanddat
           xor ax,ax               ; bufftext muss den namen + 00h als
           mov ah,39h              ; letztes zeichen des neuen direktory
           mov dx,offset bufftext  ; enthalten
           int 21h
           jc fehlmdir
           ret
fehlmdir:  mov dx,offset fehldir1
           call bild
           call warte
           ret

rm:
           call cls
           mov dx,offset killdir
           call bild
           call searchdi
           mov buffer,20h
           mov dx,offset kill2
           call bild
           call input
           call wanddat
rmdir:     xor ax,ax
           mov ah,3ah
           mov dx,offset bufftext
           int 21h
           jc fehlrd
           ret
fehlrd:    mov dx,offset fehldir2
           call bild
           call warte
           ret

getdrive:
           mov ah,19h
           int 21h
           ret

print:
           push dx
prin1:     lodsb
           cmp al,'$'               ;ende des strings erreicht ?
           je ende_loop
           mov dl,al
           mov ah,05
           int 21h
           jmp prin1
ende_loop: inc bx                    ;sind schon die in >breite< genannten
           cmp bx,breite             ;dateien gedruckt
           jne end1                  ;nein --> naechste datei
           mov bx,0                  ;ja --> dann zaehler auf >0< setzen
           mov si,offset cr_lf       ;naechste zeile auf dem drucker
pr1:       lodsb
           cmp al,'$'
           je end1
           mov dl,al
           mov ah,05
           int 21h
           jmp pr1
end1:      pop dx
           ret

volume:
           call cls
           mov dx,offset msgvol
           call bild
           call delname
           mov zatr,00101000xb
           mov dx,offset alle
           call hs
           jc no_vol
           call wandvol
           mov dx,offset f_name
           call bild
           mov dx,offset term
           call bild
no_vol:    mov dx,offset nv
           call bild
           mov buffer,0dh
           call input
           cmp zahl,00
           je exitlab
           cld
           push cx                 ; zur sicherheit alten namen loeschen
           mov cx,11
           mov di,offset newname
           mov al,32
           rep
           stosb
           mov cx,11               ;11 mal blank
           mov di,offset name1
           mov al,32
           rep
           stosb
           pop cx
           mov si,offset bufftext
           mov di,offset newname
           call schieb
           mov dx, offset xfcb2     ;rename m”glich
           mov ah,17h               ;mit dos call
           int 21h
           cmp al, 00h              ;war rename erfolgreich
           je exitlab               ;ja ? dann zurck
           mov si, offset bufftext  ;nein ? dann war kein name da
           mov di, offset name1     ;dann file schaffen
           call schieb
           mov dx, offset xfcb
           mov ah, 16h              ;mit dos call
           int 21h
           call warte
exitlab:   ret

wandvol:
           xor ch,ch              ; >.< in bufftext durch >$< ersetzen
           mov cl,09h
           mov di,offset f_name
           mov al,2eh             ;zu ersetzendes zeichen >.<
           repnz                  ;alles nur damit der punkt verchwindet
           scasb                  ;denn der volume-name ist auch nur
           dec di                 ;ein dateiname (fuer dos)
           mov [di],24h
           ret

setdta:
           mov dx,offset dir_entry   ;hier wird eine neue dta gesetzt
           mov ah,1ah
           int 21h
           ret

rename:
           clc
           call cls
           mov dx,offset msgren
           call bild
           call haupt
           call searchdi
           mov dx,offset altlauf
           call bild
           mov buffer,0dh
           call input
           call wanddat
           mov si,offset bufftext
           mov di,offset altname
           call schieb1
           mov dx,offset neulw
           call bild
           mov buffer,0dh
           call input
           call wanddat
           mov si,offset bufftext
           mov di,offset neuname
           call schieb1
           mov dx,offset altname
           mov di,offset neuname
           mov ah,56h
           int 21h
           jc error
           ret

error:
           mov ah,09h
           mov dx,offset fehl
           int 21h
           call warte
           ret

schieb:
           sub cx,cx
           mov cl,zahl
           rep
           movsb
           ret

schieb1:
           sub cx,cx
           mov cl,zahl
           add cl,02h
           rep
           movsb
           ret

man:
           mov dx,offset wd
           call bild
           mov buffer,03h
           call input
           call wanddat
           call setdrive
           ret

setdrive:
           xor dx,dx                ;in dl muss drivenr. stehen
           mov di,offset bufftext
           mov dx,[di]              ;wird das als parameter angegebene
           or dl,20h                ;laufwerk zum aktuellen laufwerk
           sub dl,61h               ;erkl„rt
           mov ah,0eh               ;buchstabe wird in drive-nr umgewandelt
           int 21h
           clc
           ret

;routine :wanddat.mac
wanddat:
           xor ch,ch               ;cr in bufftext durch >$< ersetzen
           mov cl,zahl             ;anzahl der zu durchsuchenden zeichen
           mov di,offset bufftext  ;adresse des textes
           mov al,0dh
           repnz                   ;zu ersetzendes zeichen >cr<
           scasb                   ;fuer verwendung in doscall >4eh<
           mov [di],00h            ;muss hier >00< eingesetzt werden
           inc di
           mov [di],24h            ;24h = '$ '
           clc                     ;ergibt einen text, der mit doscall >09h<
           ret                     ;ausgegeben werden kann
                               ;**** laenge der eingabe beachten ****
input:
           mov dx,offset buffer    ;sollen mehr als 20h zeichen eingegeben
           mov ah,0ah              ;werden, muss mehr platz reserviert
           int 21h                 ;werden
           mov dx,offset cr_lf     ;sieht schoener aus
           mov ah,09h
           int 21h
           ret

delname:                   ;hier wird der datei-name geloescht
           cld                      ;sonst werden reste des alten namens
           push cx                  ;ausgegeben
           mov cx,0dh               ;13 mal blank
           mov di,offset f_name
           mov al,' '
           rep
           stosb
           pop cx
           ret

bild:
           mov ah,09h
           int 21h
           ret

setdirec:
           mov dx,offset dire
           call bild
           mov buffer,20h
           call input
           call wanddat
           mov dx,offset bufftext
           mov ah,3bh
           int 21h
           jc fehler
           ret
fehler:    mov dx,offset fehldir
           call bild
warte:     mov dx,offset wartmsg
           call bild
           mov buffer,02h
           call input
           ret

getdirec:
           mov ah,47h
           mov si,offset bufftext
           xor dx,dx
           int 21h
           xor ch,ch
           mov cl,20h
           mov di,offset bufftext
           mov al,00h
           repnz
           scasb                       ;ist 00 erstes zeichen in bufftext
           cmp di,offset bufftext+1    ;dann ist direc = wurzel
           jnz weidi
           mov dx,offset ro1
           call bild
           ret
weidi:     mov [di],00h
           inc di
           mov[di],24h                 ;24h = '$ '
           mov dx,offset bufftext      ;ansonsten direc ausgeben
           call bild
weidi1:    ret

searchdi:
           mov dx,offset msgdir1
           call bild
           xor bx,bx
           mov zatr,10h
           mov zattr,10h
           mov dx,offset alle
           call hs
haupts4:   jc kei_dat1
           cmp zattr,10h
           jne haupts5
           mov dx,offset f_name
           call tete
haupts2:   call bild
haupts5:   call hs2
           jc kei_dat1
           cmp zattr,10h
           jne haupts5
           mov dx,offset f_name
           call tete
           jmp haupts2
kei_dat1:  call kei_dat
           ret                        ;zum hauptmenue

tete:
           cmp zdflag,255
           jne teend
           mov si,offset f_name
           call print
teend:     ret

cls:
           mov ax,0003h
           int 10h
           ret

write:                             ;gibt die in cx genannte anzahl
           mov dx,offset bu                 ;zeichen aus dem buffer aus
           mov cx,( buffe-bu)

                                            ; bedeutung bx :
           mov bx,0002                      ;0 = stdin (norm tastatur)
           mov ah,40h                       ;1 = stdout (norm screen)
           int 21h                          ;2 = immer screen
           ret                              ;3 = immer aux
                                        ;4 = immer prn
hilfe:
           call cls
           call write
           mov dx,offset aktdir
           call bild
           call getdirec
           mov dx,offset cr_lf
           call bild
           call getdrive
           add al,41h
           mov (aktlw+19),al
           mov dx,offset aktlw
           call bild
           mov dx,offset wahl
           call bild
           mov buffer,02h
           call input
           ret

haupt:
           mov dx,offset msgdat
           call bild
           xor bx,bx
           mov zatr,11100111xb                 ;je nach aufgabe
           mov dx,offset wdat
           call bild
           mov buffer,13
           call input
           cmp zahl,00
           je haupt1
           call wanddat
           mov dx,offset bufftext
           call hs
haupt4:    jc kei_dat
           mov dx,offset f_name
           call tete
haupt2:    call bild
           call hs2
           jc kei_dat
           mov dx,offset f_name
           call tete
           jmp haupt2
haupt1:    mov dx,offset alle  ; '*.*',00
           call hs
           jmp haupt4

hs:
           call delname
           xor cx,cx
           mov cl,zatr
           mov ah,4eh                  ;bufftext muss mit >00< enden
           int 21h
           ret                         ;ergebnis in dta
hs2:       call delname                ;und f_name wieder freimachen
           mov ah,4fh                  ;sucht weiter nach dateien
           int 21h
           ret
kei_dat:   cmp zdflag,0
           je keir
           mov si,offset cr_lf
           call print
           xor bx,bx
keir:      call warte
           ret                   ; zum hauptmenue

drucker:
           call  cls
           cmp zdflag,255
           jne passiv
aktiv:     mov dx,offset akti
           call bild
           jmp d2
passiv:    mov dx,offset passi
           call bild
d2:        mov dx,offset druck
           call bild
           mov buffer,02
           call input
           cmp zahl,00
           je dend
           mov al,bufftext
           and al,0dfh
           cmp al,65  ; gross a
           je dakti
           cmp al,80  ; gross p
           jne drucker
dpas:      mov zdflag,00
           ret
dakti:     mov zdflag,255
           push dx
           push ax
           xor bx,bx
           mov si,offset klein
           call print
           mov dx,offset druck
           call bild
           mov si,offset cond
           call print
           mov si,offset space
           call print
           xor bx,bx
           pop ax
           pop dx
dend:      ret

kopie:
           mov flagf,00
           call haupt
           mov dx,offset quellef
           call bild
           mov buffer,32
           call input
           call wanddat
           call ophandle
           cmp flagf,255
           je koend
           mov dx,offset zielf
           call bild
           mov buffer,32
           call input
           call wanddat
           call dohandle
           cmp flagf,255
           je koend
           call fillbuf
           call clhandle
           call warte
koend:     ret

fillbuf:   proc   near
           push ax
           push bx
           push cx
           push dx
fill1:     mov     ah, 3fh             ;lesen
           mov     bx, handin          ;von der quelle
           mov     cx, buf_size        ;9 sektoren
           mov     dx, offset buf_in   ;im buffer ablegen
           int     21h
           mov outnum, ax
           cmp ax,0000
           je ende
           mov     ah, 40h             ;schreiben
           mov     bx, handaus         ;in das ziel
           mov     cx, outnum          ;gelesene zeichen-anzahl
           mov     dx, offset buf_in   ;aus dem buffer entnehmen
           int     21h
           jmp  fill1
ende:      pop dx
           pop cx
           pop bx
           pop ax
           ret
ophandle:                ;proc oeffnet ein handle fr die in
           xor ax,ax              ;bufftext enthaltene datei
           mov ah,3dh
           mov al,00              ;nur lesen
           mov dx,offset bufftext
           int 21h
           jc fehlop
           mov handin,ax         ; in handin wird die dateinummer uebergeben
           ret
fehlop:
           mov flagf,255
           mov dx,offset datfehl
           call bild
           call warte
           ret


dohandle:               ; proc oeffnet ein handle fr die
           xor ax,ax
           mov ah,3ch            ; cx muss das attribut der datei
           mov cx,00             ; enthalten
           mov dx,offset bufftext
           int 21h
           jc fehlhan
           mov handaus,ax
           ret
fehlhan:   mov dx,offset datfehl
           call bild
           call warte
           mov flagf,255
           ret

clhandle:                 ; proc schliesst den handle auf eine
           xor ax,ax               ; datei
           mov ah,3eh
           mov bx,handaus
           int 21h
           xor ax,ax
           mov ah,3eh
           mov bx,handin
           int 21h
           jc fehlcl
           ret
fehlcl:    mov dx,offset datfehl
           mov flagf,255
           call bild
           ret 2

buf_in:    db 0
