home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wunderki.zip / DIRH.ASM < prev    next >
Assembly Source File  |  1993-08-16  |  11KB  |  209 lines

  1. ;//////////////////////////////////////////////////////
  2. ;/                                                    /
  3. ;/ Run-time Library für Borland Pascal 7.0 unter OS/2 /
  4. ;/ Routinen für Verzeichnisse.                        /
  5. ;/                                                    /
  6. ;/ 1993 Matthias Withopf / c't                        /
  7. ;/ Originalversion (c) 1988,92 Borland International  /
  8. ;/                                                    /
  9. ;//////////////////////////////////////////////////////
  10.  
  11.                 .286p                                         
  12.  
  13.                 _NOMACROS_ = 1                  ; keine Macros definieren
  14.                 INCLUDE SE.ASM
  15.                 INCLUDE OS2.ASM
  16.  
  17. DATA            SEGMENT WORD PUBLIC
  18.                 EXTRN   InOutRes:WORD
  19. DATA            ENDS
  20.  
  21. CODE            SEGMENT BYTE PUBLIC
  22.                 ASSUME  CS:CODE,DS:DATA
  23.  
  24.                 EXTRN   ConvErrCode:NEAR
  25.  
  26.                 ;
  27.                 ; Procedure GetDir(D : Byte;Var Dir : String);
  28.                 ;
  29.  
  30.                 PUBLIC  DirGet
  31. DirGet          PROC    PASCAL FAR
  32.                 ARG     A_Drive    : BYTE  : 2,   \
  33.                         A_StrP     : DWORD,       \
  34.                         A_StrLen   : WORD
  35.                 LOCAL   L_DriveNo  : WORD,        \
  36.                         L_DriveMap : DWORD,       \
  37.                         L_Path     : BYTE  : 128
  38.                 PUSH    DS                      ; rette Datensegment
  39.                 LEA     SI,L_Path               ; lese Zeiger
  40.                 PUSH    SS                      ; auf Buffer für
  41.                 POP     DS                      ; Pfad in DS:SI
  42.                 MOV     AL,A_Drive              ; lese Nummer des Laufwerks
  43.                 OR      AL,AL                   ; ist es aktuelles Laufwerk ?
  44.                 JNZ     @@NotCurDrive           ; nein -> weiter
  45.                 LEA     BX,L_DriveNo            ; übergebe
  46.                 PUSH    SS                      ; Zeiger auf Speicher
  47.                 PUSH    BX                      ; für Drive-Nummer
  48.                 LEA     BX,L_DriveMap           ; übergebe
  49.                 PUSH    SS                      ; Zeiger auf Speicher
  50.                 PUSH    BX                      ; für Drive-Map
  51.                 CALL    DosQCurDisk             ; erfrage aktuelles Laufwerk
  52.                 MOV     AX,L_DriveNo            ; lese Nummer des Laufwerks
  53. @@NotCurDrive:  MOV     DL,AL                   ; rette Nummer des aktuellen Laufwerks
  54.                 ADD     AL,'A' - 1              ; wandle in Laufwerksbuchstabe
  55.                 MOV     [SI],AL                 ; speichere als erstes 
  56.                 INC     SI                      ; Zeichen des Pfadnamens
  57.                 MOV     WORD PTR [SI],'\:'      ; füge ':\' 
  58.                 INC     SI                      ; an den 
  59.                 INC     SI                      ; Laufwerksbuchstaben an
  60.                 XOR     DH,DH                   ; übergebe Nummer
  61.                 PUSH    DX                      ; des Laufwerks
  62.                 PUSH    SS                      ; übergebe Zeiger
  63.                 PUSH    SI                      ; auf den Pfad-Buffer
  64.                 MOV     L_DriveNo,127           ; gebe max. Länge des Pfad-Buffers an
  65.                 LEA     BX,L_DriveNo            ; übergebe
  66.                 PUSH    SS                      ; Dummy-Zeiger auf Speicher
  67.                 PUSH    BX                      ; für Länge des Pfadnamens
  68.                 CALL    DosQCurDir              ; erfrage aktuelles Verzeichnis
  69.                 OR      AX,AX                   ; ist Fehler aufgetreten ?
  70.                 JZ      @@NoError               ; nein -> weiter
  71.                 MOV     BYTE PTR [SI],0         ; kein Pfadnamen im Fehlerfall
  72. @@NoError:      LEA     SI,L_Path               ; lese Zeiger auf Pfadnamen in DS:SI
  73.                 LES     DI,A_StrP               ; lese Zeiger auf Rückgabe-String
  74.                 MOV     DX,DI                   ; rette Zeiger auf Längenbyte
  75.                 INC     DI                      ; überspringe Längenbyte
  76.                 MOV     CX,A_StrLen             ; lese max. Länge des Rückgabe-Strings
  77.                 XOR     BX,BX                   ; Länge des Rückgabe-Strings := 0
  78.                 CLD                             ; lese nächstes Zeichen  
  79. @@GetCharLoop:  LODSB                           ; aus Pfadnamen
  80.                 OR      AL,AL                   ; ist Ende erreicht ?
  81.                 JE      @@StoreLen              ; ja -> speichere Längenbyte
  82.                 STOSB                           ; speichere Zeichen im Rückgabe-String
  83.                 INC     BX                      ; erhöhe Länge des Rückgabe-Strings
  84.                 LOOP    @@GetCharLoop           ; -> bis Ende erreicht ist
  85. @@StoreLen:     MOV     DI,DX                   ; speichere Längenbyte
  86.                 MOV     AL,BL                   ; des 
  87.                 STOSB                           ; Rückgabe-Strings
  88.                 POP     DS                      ; hole Datensegment zurück
  89.                 RET
  90. DirGet          ENDP
  91.  
  92.                 ;
  93.                 ; Procedure ChDir(Dir : String);
  94.                 ;
  95.  
  96.                 PUBLIC  DirSet
  97. DirSet          PROC    PASCAL FAR
  98.                 ARG     A_StrP : DWORD
  99.                 LOCAL   L_Path : BYTE : 128
  100.                 CALL    GetPath                 ; konvertiere Pfad in nullterminierten String
  101.                 MOV     AX,WORD PTR L_Path      ; lese die ersten zwei Zeichen aus Pfad
  102.                 OR      AL,AL                   ; ist ein Leerstring angegeben ?
  103.                 JE      @@Exit                  ; ja -> Ende
  104.                 CMP     AH,':'                  ; ist das zweite Zeichen = ':' ?
  105.                 JNE     @@NoDisk                ; nein -> nur Verzeichnis setzen
  106.                 AND     AL,NOT 20H              ; wandle Laufwerkbuchstaben in Großbuchstaben
  107.                 SUB     AL,'A' - 1              ; konvertiere Buchstaben
  108.                 XOR     AH,AH                   ; in Laufwerksnummer  
  109.                 PUSH    AX                      ; übergebe Laufwerksnummer
  110.                 CALL    DosSelectDisk           ; setze neues Default-Laufwerk
  111.                 OR      AX,AX                   ; ist Fehler aufgetreten ?
  112.                 JZ      @@DiskOk                ; nein -> ok, weiter
  113.                 MOV     InOutRes,15             ; sonst Fehler: 'Invalid drive number'
  114.                 JMP     SHORT @@Exit            ; -> Ende
  115.  
  116. @@DiskOk:       CMP     L_Path[2],0             ; ist Pfad hinter Laufwerksbuchstaben angegeben ?
  117.                 JE      @@Exit                  ; nein -> Ende
  118. @@NoDisk:       LEA     BX,L_Path               ; übergebe
  119.                 PUSH    SS                      ; Zeiger auf
  120.                 PUSH    BX                      ; den Pfad-Buffer
  121.                 XOR     AX,AX                   ; übergebe
  122.                 PUSH    AX                      ; 0L
  123.                 PUSH    AX                      ; (reserviert)
  124.                 CALL    DosChDir                ; wähle neues Default-Verzeichnis
  125.                 OR      AX,AX                   ; ist Fehler aufgetreten ?
  126.                 JZ      @@Exit                  ; nein -> Ende
  127.                 CALL    ConvErrCode             ; konvertiere Fehlercode nach OS/2-Code
  128.                 MOV     InOutRes,AX             ; specichere Fehlernummer
  129. @@Exit:         RET
  130. DirSet          ENDP
  131.  
  132.                 ;
  133.                 ; Procedure MkDir(Dir : String);
  134.                 ;
  135.  
  136.                 PUBLIC  DirCreate
  137. DirCreate       PROC    FAR
  138.                 XOR     DL,DL                   ; setze Flag für Anlegen
  139.                 JMP     SHORT DirCreateRemove   ; -> lege Verzeichnis an
  140. DirCreate       ENDP
  141.  
  142.                 ;
  143.                 ; Procedure RmDir(Dir : String);
  144.                 ;
  145.  
  146.                 PUBLIC  DirRemove
  147. DirRemove       PROC    FAR
  148.                 MOV     DL,1                    ; setze Flag für Löschen
  149. DirRemove       ENDP                            
  150.  
  151.                 ;
  152.                 ; Gemeinsame Routine für Anlegen/Löschen eines 
  153.                 ; Verzeichnisses.
  154.                 ;
  155.  
  156.                 PUBLIC  DirCreate
  157. DirCreateRemove PROC    PASCAL FAR
  158.                 ARG     A_StrP : DWORD
  159.                 LOCAL   L_Path : BYTE : 128
  160.                 CALL    GetPath                 ; konvertiere Pfad in nullterminierten String
  161.                 LEA     BX,L_Path               ; übergebe
  162.                 PUSH    SS                      ; Zeiger auf
  163.                 PUSH    BX                      ; Pfadnamen
  164.                 XOR     AX,AX                   ; übergebe
  165.                 PUSH    AX                      ; 0L
  166.                 PUSH    AX                      ; (reserviert)
  167.                 OR      DL,DL                   ; soll Verzeichnis angelegt werden ?
  168.                 JZ      @@Create                ; ja -> weiter
  169.                 CALL    DosRmDir                ; lösche Verzeichnis
  170.                 JMP     SHORT @@TestOnErr       ; -> teste auf Fehler
  171.  
  172. @@Create:       CALL    DosMkDir                ; lege neues Verzeichnis an
  173. @@TestOnErr:    OR      AX,AX                   ; ist Fehler aufgetreten ?
  174.                 JZ      @@NoError               ; nein -> weiter
  175.                 CALL    ConvErrCode             ; konvertiere Fehlercode nach OS/2-Code
  176.                 MOV     InOutRes,AX             ; speichere Fehlernummer
  177. @@NoError:      RET
  178.  
  179.                 ;
  180.                 ; Kopiere den Argument-String (Pascal-String) als
  181.                 ; nullterminierten String in den Pfad-Buffer.
  182.                 ; Die max. Länge beträgt 127 Zeichen.
  183.                 ;
  184.  
  185. GetPath         PROC    NEAR
  186.                 PUSH    DS                      ; rette Datensegment
  187.                 LDS     SI,A_StrP               ; lese Zeiger auf Agument-String in DS:SI
  188.                 LEA     DI,L_Path               ; lese Zeiger 
  189.                 PUSH    SS                      ; auf Pfad-Buffer
  190.                 POP     ES                      ; in ES:DI
  191.                 CLD                             ; lese Längenbyte
  192.                 LODSB                           ; des Argument-Strings
  193.                 CMP     AL,127                  ; ist Länge > 127 Zeichen ?
  194.                 JB      @@LenOk                 ; nein -> Länge ok, weiter
  195.                 MOV     AL,127                  ; sonst: begrenze Pfad auf 127 Zeichen
  196. @@LenOk:        XOR     CX,CX                   ; lese Länge
  197.                 MOV     CL,AL                   ; in CX
  198.                 REP     MOVSB                   ; kopiere Argument-String in Pfad-Buffer
  199.                 XOR     AL,AL                   ; schließe Pfadnamen
  200.                 STOSB                           ; mit Nullbyte ab
  201.                 POP     DS                      ; hole Datensegment zurück
  202.                 RET
  203. GetPath         ENDP
  204. DirCreateRemove ENDP
  205.  
  206. CODE            ENDS
  207.  
  208.                 END
  209.