Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
how to access long filename length in DOS? (na_th_an)
#1
Na_th_an, can you make a sub that opens a file with a long filename? Something as neat and cool as the thing you put in the FAQ? Smile
Peace cannot be obtained without war. Why? If there is already peace, it is unnecessary for war. If there is no peace, there is already war."

Visit www.neobasic.net to see rubbish in all its finest.
Reply
#2
The following code is the full LFN module of KetOn. Check it out:

Code:
'    ==============
'Long FileName (Win32) Module
'By Neo Deus Ex Machina
'
'This Module is part of the KetOn library
'made by members of HAR-SoftWare
'
'This Module contains:
' 11 LFN routines
'
'Directory handling (5 routines)
DECLARE SUB KT.LFN.MakeDir(DirName AS STRING)
DECLARE SUB KT.LFN.RemoveDir(DirName AS STRING)
DECLARE SUB KT.LFN.ChangeDir(DirName AS STRING)
DECLARE FUNCTION KT.LFN.GetCurrDir$ ()
DECLARE SUB KT.LFN.RenameDir(DirName AS STRING, NewDirName AS STRING)

'File handling (5 routines)
DECLARE SUB KT.LFN.DeleteFile(FileName AS STRING)
DECLARE SUB KT.LFN.RenameFile(FileName AS STRING, NewFileName AS STRING)
DECLARE FUNCTION KT.LFN.GetFullPath$(FileName AS STRING)
DECLARE FUNCTION KT.LFN.GetShortPath$(FileName AS STRING)
DECLARE FUNCTION KT.LFN.ShortFileName$(LongFileName AS STRING)

'Drive function (1 routine)
DECLARE FUNCTION KT.LFN.GetFileSystem$(DriveLetter AS STRING)

DEFINT A-Z
'$DYNAMIC
'$INCLUDE: '..\..\QB.BI'
'$LIB: '..\..\QB.LIB'

'####################
' Directory Handling
'####################
SUB KT.LFN.MakeDir(DirName AS STRING)
        DIM Regs AS RegTypeX
        Regs.ax = &H7139
        DirNameZ$ = DirName + CHR$(0)
        Regs.ds = -1
        Regs.dx = SADD(DirNameZ$)
        INTERRUPTX &H21, Regs, Regs
END SUB

SUB KT.LFN.RemoveDir(DirName AS STRING)
    DIM Regs AS RegTypeX
    Regs.ax = &H713A
    DirNameZ$ = DirName + CHR$(0)
    Regs.ds = -1
    Regs.dx = SADD(DirNameZ$)
    INTERRUPTX &H21, Regs, Regs
END SUB

SUB KT.LFN.ChangeDir(DirName AS STRING)
    DIM Regs AS RegTypeX
        Regs.ax = &H713B
        DirNameZ$ = DirName + CHR$(0)
        Regs.ds = -1
        Regs.dx = SADD(DirNameZ$)
        INTERRUPTX &H21, Regs, Regs
END SUB

FUNCTION KT.LFN.GetCurrDir$
        DIM Regs AS RegTypeX, CurrDir AS STRING * 256
        Regs.ax = &H7147
        Regs.dx = 0
        Regs.ds = -1
        Regs.si = VARPTR(CurrDir)
        INTERRUPTX &H21, Regs, Regs
        Null = INSTR(CurrDir, CHR$(0))
        IF Null <> 0 THEN KT.LFN.GetCurrDir$ = LEFT$(CurrDir, Null - 1) ELSE KT.LFN.GetCurrDir$ = CurrDir
END FUNCTION

SUB KT.LFN.RenameDir(DirName AS STRING, NewDirName AS STRING)
    KT.LFN.RenameFile DirName, NewDirName
END SUB

'###############
' File Handling
'###############
SUB KT.LFN.DeleteFile(FileName AS STRING)
        DIM Regs AS RegTypeX
        Regs.ax = &H7141
        Regs.si = 0
        Regs.ds = -1
        FileNameZ$ = FileName + CHR$(0)
        Regs.dx = SADD(FileNameZ$)
        INTERRUPTX &H21, Regs, Regs
END SUB

SUB KT.LFN.RenameFile(FileName AS STRING, NewFileName AS STRING)
        DIM Regs AS RegTypeX
        Regs.ax = &H7156
        FileNameZ$ = FileName + CHR$(0)
        Regs.ds = -1
        Regs.dx = SADD(FileNameZ$)
        NewFileNameZ$ = NewFileName + CHR$(0)
        Regs.es = -1
        Regs.di = SADD(NewFileNameZ$)
        INTERRUPTX &H21, Regs, Regs
END SUB

FUNCTION KT.LFN.GetFullPath$(FileName AS STRING)
        DIM Regs AS RegTypeX, NameBuffer AS STRING * 261
        Regs.ax = &H7160
        Regs.cx = &H0000
        Regs.ds = -1
        FileNameZ$ = FileName + CHR$(0)
        Regs.si = SADD(FileNameZ$)
        Regs.es = -1
        Regs.di = VARPTR(NameBuffer)
        INTERRUPTX &H21, Regs, Regs
        PRINT nameBuffer; "ok"
        Null = INSTR(NameBuffer, CHR$(0))
        IF Null > 0 THEN KT.LFN.GetFullPath$ = LEFT$(NameBuffer, Null - 1) ELSE KT.LFN.GetFullPath$ = NameBuffer
END FUNCTION

FUNCTION KT.LFN.GetShortPath$(FileName AS STRING)
        DIM Regs AS RegTypeX, NameBuffer AS STRING * 67
        Regs.ax = &H7160
        Regs.cx = 1
           FileNameZ$ = FileName + CHR$(0)
        Regs.ds = -1
        Regs.si = SADD(FileNameZ$)
        Regs.es = -1
        Regs.di = VARPTR(NameBuffer)
        INTERRUPTX &H21, Regs, Regs
        Null = INSTR(NameBuffer, CHR$(0))
        IF Null > 0 THEN KT.LFN.GetShortPath$ = LEFT$(NameBuffer, Null - 1) ELSE KT.LFN.GetShortPath$ = NameBuffer
END FUNCTION

FUNCTION KT.LFN.ShortFileName$(LongFileName AS STRING)
        DIM Regs AS RegTypeX, FBuffer AS STRING * 13
        Regs.ax = &H71A8
        LFNZ$ = LongFileName + CHR$(0)
        Regs.ds = -1
        Regs.si = SADD(LFNZ$)
    Regs.es = -1
    Regs.di = VARPTR(FBuffer)
        Regs.dx = &H0111
        INTERRUPTX &H21, Regs, Regs
        Null = INSTR(FBuffer, CHR$(0))
        IF Null <> 0 THEN KT.LFN.ShortFileName$ = LEFT$(FBuffer, Null - 1) ELSE KT.LFN.ShortFileName$ = FBuffer
END FUNCTION

'################
' Drive Function
'################
FUNCTION KT.LFN.GetFileSystem$(DriveLetter AS STRING)
    DIM Regs AS RegTypeX, FS AS STRING * 32
        Regs.ax = &H71A0
        RootDirZ$ = DriveLetter + ":\" + CHR$(0)
        Regs.ds = -1
        Regs.dx = SADD(RootDirZ$)
        Regs.es = -1
        Regs.di = VARPTR(FS)
        Regs.cx = 32
        INTERRUPTX &H21, Regs, Regs
        Null = INSTR(FS, CHR$(0))
        IF Null > 0 THEN KT.LFN.GetFileSystem$ = LEFT$(FS, Null - 1) ELSE KT.LFN.GetFileSystem$ = FS
END FUNCTION
Reply
#3
That wouldn't work. I don't want to convert to a short file name, I want to load a long file name into a record number...
Peace cannot be obtained without war. Why? If there is already peace, it is unnecessary for war. If there is no peace, there is already war."

Visit www.neobasic.net to see rubbish in all its finest.
Reply
#4
I don't know what you mean yet, but you can check at:

http://www.ctyme.com/rbrown.htm
Reply
#5
*comes to*

I'll just wait for nathan...
Peace cannot be obtained without war. Why? If there is already peace, it is unnecessary for war. If there is no peace, there is already war."

Visit www.neobasic.net to see rubbish in all its finest.
Reply
#6
Quote:That wouldn't work. I don't want to convert to a short file name, I want to load a long file name into a record number...

Uh...you convert the long filename to a short filename, then you open the short filename. I don't know what you're whining about. It's the same file.
Reply
#7
nope. it isn't.... always... there are more possible long names than short names...
Peace cannot be obtained without war. Why? If there is already peace, it is unnecessary for war. If there is no peace, there is already war."

Visit www.neobasic.net to see rubbish in all its finest.
Reply
#8
I think you need to read the long filename from DOS. If you...

Code:
SHELL "dir *.* /b >file.lst

You'll have all files in the directory (in long filenames) inside file.lst, which you can read.

What do you want to do *exactly*?

I have this neat piece of code from the ABC packets:

Code:
'===========================================================================
' Subject: WINDOW'S LONG FILENAMES           Date: 11-24-95 (00:00)
' Author:  Mark K. Kim                       Code: QB, QBasic, PDS
' Origin:  members.aol.com/vindaci/        Packet: DOS.ABC
'===========================================================================
'#iab.compatibility.version.1a
'LFN version 1.0 beta1 -- Long filename functions
'Copyright (c)1996 Mark K. Kim
'markkkim@aol.com
'http://members.aol.com/markkkim/
'http://members.aol.com/vinDaci/
'* Freely distributed.  May be used in other programs with proper notice of
'  credit.
'* This program is provided "as-is".
'* In QBASIC, no modification is necessary
'* In QuickBASIC, QuickBASIC PDS, or VisualBASIC for DOS, run with the
'  "/L" option, like so:
'
'    QB /L
'    QBX /L
'    VBDOS /L
'
'  Also, do not include the QB.BI, QBX.BI, or VBDOS.BI files. If you do,
'  modify them so that the line "DECLARE ABSOLUTE..." is gone.
'* In QuickBASIC PDS and VisualBASIC, change all the lines in the format
'  "VARSEG(any.string.variable$)" to "SSEG(any.string.variable$)".
'* CREDIT: Ralf Brown's interrupt list was used to get interrupt for the
'  function.  Microsoft DOS's Debug was used to convert Assembly code to
'  machine code.  Microsoft is a Registered Trademark of Microsoft Corp.
'* NOTE: Works only under operating systems that support Windows95 LFN
'  or LFN emulation programs.
'Read the header of each function to find out their usage. These functions
'are designed to work with most other routines as it does not interfere
'with any other routines.


'the following line exists for compatibility reasons:
DECLARE SUB absolute (var1%, var2%, var3%, var4%, var5%, var6%, var7%, var8%, var9%, offset%)

'#begin declaration
  'File attribute constants -- used to do file search
    CONST ATT.ALL = &HFF
    CONST ATT.SHARE = &H80
    CONST ATT.ARC = &H20
    CONST ATT.DIR = &H10
    CONST ATT.VOL = &H8
    CONST ATT.SYS = &H4
    CONST ATT.HID = &H2
    CONST ATT.RDO = &H1
    CONST ATT.NONE = &H0
  'Value set to error code if an error occurs
    Dim errval As Integer
  'Procedures
    DECLARE SUB lfn.mkdir (dirname$)           'make LFN directory
    DECLARE SUB lfn.rmdir (dirname$)           'remove LFN directory
    DECLARE SUB lfn.chdir (dirname$)           'change to a LFN directory
    DECLARE SUB lfn.del (filename$)            'delete a LFN file
    DECLARE SUB lfn.ren (oldname$, newname$)   'rename file
    DECLARE FUNCTION lfn.cwd$ (drive%)         'get current working directory
    DECLARE FUNCTION lfn.l2s$ (longname$)      'long name to short name
    DECLARE FUNCTION lfn.s2l$ (shortname$)     'short name to long name
    DECLARE FUNCTION lfn.findfirst$ (filespec$, findattrib%, mustattrib%)
    DECLARE FUNCTION lfn.findnext$ ()
    DECLARE SUB lfn.findclose ()
'#end declaration


'#start example program
  Cls

  longfilename$ = "long filename entry.tmp"
  longdirname$ = "long directory name entry"

  'make a LFN file by first opening a SFN file, then renaming it to LFN:
    'first create SFN
      Open "sfn.tmp" For Output As #1
      Print #1, "La la la! This is a SFN entry!"
      Close #1
    'rename SFN to LFN
      lfn.ren "sfn.tmp", longfilename$
      If errval Then Print "Error while renaming!" Else Print "LFN Created"

  'display all files in the current directory
    'file search -- allow any/all attributes and limit no attribute
      FileName$ = lfn.findfirst$("*.*", ATT.All, ATT.NONE)

    'display result
      If errval Then
          Print "Error during file search!"
      Else
          Print "File search result: "
        'display filename and continue search
          Do
            Print "  "; FileName$
            FileName$ = lfn.findnext$
          Loop Until errval
        'terminate search -- must be called
          lfn.findclose
      End If

  'delete previously created LFN file
    lfn.del longfilename$
    If errval Then Print "Error while deleting LFN!" Else Print "LFN deleted"

  'create LFN directory
    lfn.MkDir longdirname$
    If errval Then Print "Error while creating LFN directory!" Else Print "LFN directory created"

  'display LFN directory's SFN equivalent
    Print "LFN entry's SFN equivalent is: "; lfn.l2s(longdirname$)

  'change current directory to LFN
    'first display current directory
      Print "Current directory: "; lfn.cwd$(-1)
    'next change directory
      lfn.ChDir longdirname$
      If errval Then Print "Error changing directory" Else Print "Directory changed"
    'display directory
      Print "Directory after change: "; lfn.cwd$(-1)
    'change back
      lfn.ChDir ".."
      If errval Then Print "Error changing directory" Else Print "Back to original directory"

  'remove LFN directory
    lfn.RmDir longdirname$
    If errval Then Print "Error removing LFN directory" Else Print "LFN directory removed"

'lfn.chdir -- Change Directory
'INPUT:
'  dirname$ - Name of the directory to change to.
'SUCCESS:
'  * Working directory changed to specified directory.
'  * Global variable errval set to zero.
'FAIL:
'  * Global variable errval set to &h7100 if function is not supported.
'    (probably does not support LFN)
'  * Global variable errval set to non-zero if an error occurs and the task
'    could not be completed successfully.
SUB lfn.chdir (dirname$)

  asm$ = ""
  asm$ = asm$ + Chr$(&H55)                                       'PUSH    BP
  asm$ = asm$ + Chr$(&H89) + Chr$(&HE5)                          'MOV     BP,SP
  asm$ = asm$ + Chr$(&H1E)                                       'PUSH    DS
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H6)              'MOV     BX,[BP+06]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H17)                          'MOV     DX,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H8)              'MOV     BX,[BP+08]
  asm$ = asm$ + Chr$(&H8E) + Chr$(&H1F)                          'MOV     DS,[BX]
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H3B) + Chr$(&H71)             'MOV     AX,713B
  asm$ = asm$ + Chr$(&HCD) + Chr$(&H21)                          'INT     21
  asm$ = asm$ + Chr$(&H1F)                                       'POP     DS
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H6)              'MOV     BX,[BP+06]
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                           'MOV     [BX],AX
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H8)              'MOV     BX,[BP+08]
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H0) + Chr$(&H0)               'MOV     AX,0000
  asm$ = asm$ + Chr$(&H15) + Chr$(&H0) + Chr$(&H0)               'ADC     AX,0000
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                           'MOV     [BX],AX
  asm$ = asm$ + Chr$(&H5D)                                       'POP     BP
  asm$ = asm$ + Chr$(&HCA) + Chr$(&H12) + Chr$(&H0)              'RETF    0012

  lfn.dirname$ = dirname$ + Chr$(0)
  lfn.dirnameseg% = VARSEG(lfn.dirname$)
  lfn.dirnameoff% = SADD(lfn.dirname$)

  DEF SEG = VARSEG(asm$)
  Call absolute(dummy%, dummy%, dummy%, dummy%, dummy%, dummy%, dummy%, lfn.dirnameseg%, lfn.dirnameoff%, SADD(asm$))
  DEF SEG

  IsError% = lfn.dirnameseg%
  errorcode% = lfn.dirnameoff%

  If IsError% Then
    errval = errorcode%
  Else
    errval = 0
  End If

End Sub

'lfn.cwd$ -- Return current directory
'INPUT:
'  drive% - Number of the drive to get the current directory of.
'    0 = A:, 1 = B:, 2 = C:, etc. -1 if current drive.
'SUCCESS:
'  * Return current directory of the specified drive.
'  * Global variable errval set to zero.
'FAIL:
'  * Return "".
'  * Global variable errval set to &h7100 if function is not supported.
'    (probably does not support LFN)
'  * Global variable errval set to non-zero if an error occurs and the task
'    could not be completed successfully.
FUNCTION lfn.cwd$ (drive%)

  asm$ = ""
  asm$ = asm$ + Chr$(&H55)                                'PUSH    BP
  asm$ = asm$ + Chr$(&H89) + Chr$(&HE5)                   'MOV     BP,SP
  asm$ = asm$ + Chr$(&H56)                                'PUSH    SI
  asm$ = asm$ + Chr$(&H1E)                                'PUSH    DS
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H6)       'MOV     BX,[BP+06]
  asm$ = asm$ + Chr$(&H8A) + Chr$(&H17)                   'MOV     DL,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H8)       'MOV     BX,[BP+08]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H37)                   'MOV     SI,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&HA)       'MOV     BX,[BP+0A]
  asm$ = asm$ + Chr$(&H8E) + Chr$(&H1F)                   'MOV     DS,[BX]
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H47) + Chr$(&H71)      'MOV     AX,7147
  asm$ = asm$ + Chr$(&HCD) + Chr$(&H21)                   'INT     21
  asm$ = asm$ + Chr$(&H8C) + Chr$(&HDA)                   'MOV     DX,DS
  asm$ = asm$ + Chr$(&H1F)                                'POP     DS
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H8)       'MOV     BX,[BP+08]
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                    'MOV     [BX],AX
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&HA)       'MOV     BX,[BP+0A]
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H0) + Chr$(&H0)        'MOV     AX,0000
  asm$ = asm$ + Chr$(&H15) + Chr$(&H0) + Chr$(&H0)        'ADC     AX,0000
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                    'MOV     [BX],AX
  asm$ = asm$ + Chr$(&H5E)                                'POP     SI
  asm$ = asm$ + Chr$(&H5D)                                'POP     BP
  asm$ = asm$ + Chr$(&HCA) + Chr$(&H12) + Chr$(&H0)       'RETF    0012

  lfn.Drive% = Drive% + 1

  lfn.Path$ = Space$(1024)
  lfn.pathseg% = VARSEG(lfn.Path$)
  lfn.pathoff% = SADD(lfn.Path$)

  DEF SEG = VARSEG(asm$)
  Call absolute(dummy%, dummy%, dummy%, dummy%, dummy%, dummy%, lfn.pathseg%, lfn.pathoff%, lfn.Drive%, SADD(asm$))
  DEF SEG

  'convert returned data
  IsError% = lfn.pathseg%
  errorcode% = lfn.pathoff%

  If IsError% Then
      errval = errorcode%
  Else
      errval = 0
    'return current directory
      Path$ = ""
      For i% = 1 To 1025
        ch$ = Mid$(lfn.Path$, i%, 1)
        If ch$ <> Chr$(0) Then
          Path$ = Path$ + ch$
        Else
          Exit For
        End If
      Next
      lfn.cwd$ = Path$
  End If

End Function

'lfn.del -- Delete a file
'INPUT:
'  filename$ - Name of the file to delete
'SUCCESS:
'  * File deleted
'  * Global variable errval set to zero.
'FAIL:
'  * Global variable errval set to &h7100 if function is not supported.
'    (probably does not support LFN)
'  * Global variable errval set to non-zero if an error occurs and the task
'    could not be completed successfully.
SUB lfn.del (filename$)

  asm$ = ""
  asm$ = asm$ + Chr$(&H55)                                       'PUSH    BP
  asm$ = asm$ + Chr$(&H89) + Chr$(&HE5)                          'MOV     BP,SP
  asm$ = asm$ + Chr$(&H56)                                       'PUSH SI
  asm$ = asm$ + Chr$(&H1E)                                       'PUSH    DS
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H6)              'MOV     BX,[BP+06]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H17)                          'MOV     DX,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H8)              'MOV     BX,[BP+08]
  asm$ = asm$ + Chr$(&H8E) + Chr$(&H1F)                          'MOV     DS,[BX]
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H41) + Chr$(&H71)             'MOV     AX,7141
  asm$ = asm$ + Chr$(&HB9) + Chr$(&H0) + Chr$(&H0)               'MOV     CX,0000
  asm$ = asm$ + Chr$(&HBE) + Chr$(&H1) + Chr$(&H0)               'MOV     SI,0001
  asm$ = asm$ + Chr$(&HCD) + Chr$(&H21)                          'INT     21
  asm$ = asm$ + Chr$(&H1F)                                       'POP     DS
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H6)              'MOV     BX,[BP+06]
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                           'MOV     [BX],AX
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H8)              'MOV     BX,[BP+08]
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H0) + Chr$(&H0)               'MOV     AX,0000
  asm$ = asm$ + Chr$(&H15) + Chr$(&H0) + Chr$(&H0)               'ADC     AX,0000
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                           'MOV     [BX],AX
  asm$ = asm$ + Chr$(&H5E)                                       'POP     SI
  asm$ = asm$ + Chr$(&H5D)                                       'POP     BP
  asm$ = asm$ + Chr$(&HCA) + Chr$(&H12) + Chr$(&H0)              'RETF    0012

  lfn.FileName$ = FileName$ + Chr$(0)
  lfn.filenameseg% = VARSEG(lfn.FileName$)
  lfn.filenameoff% = SADD(lfn.FileName$)

  DEF SEG = VARSEG(asm$)
  Call absolute(dummy%, dummy%, dummy%, dummy%, dummy%, dummy%, dummy%, lfn.filenameseg%, lfn.filenameoff%, SADD(asm$))
  DEF SEG

  IsError% = lfn.filenameseg%
  errorcode% = lfn.filenameoff%

  If IsError% Then
    errval = errorcode%
  Else
    errval = 0
  End If

End Sub

'lfn.close -- Stop file search
'INPUT:
'  None
'SUCCESS:
'  * Global variable errval set to zero.
'FAIL:
'  * Global variable errval set to &h7100 if function is not supported.
'    (probably does not support LFN)
'  * Global variable errval set to non-zero if an error occurs and the task
'    could not be completed successfully.
SUB lfn.findclose

  SHARED lfn.filefindhandle%

  asm$ = ""
  asm$ = asm$ + Chr$(&H55)                                  'PUSH    BP
  asm$ = asm$ + Chr$(&H89) + Chr$(&HE5)                     'MOV     BP,SP
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H6)         'MOV     BX,[BP+06]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H1F)                     'MOV     BX,[BX]
  asm$ = asm$ + Chr$(&HB8) + Chr$(&HA1) + Chr$(&H71)        'MOV     AX,71A1
  asm$ = asm$ + Chr$(&HCD) + Chr$(&H21)                     'INT     21
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H8)         'MOV     BX,[BP+08]
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                      'MOV     [BX],AX
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H0) + Chr$(&H0)          'MOV     AX,0000
  asm$ = asm$ + Chr$(&H15) + Chr$(&H0) + Chr$(&H0)          'ADC     AX,0000
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&HA)         'MOV     BX,[BP+0A]
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                      'MOV     [BX],AX
  asm$ = asm$ + Chr$(&H5D)                                  'POP     BP
  asm$ = asm$ + Chr$(&HCA) + Chr$(&H12) + Chr$(&H0)         'RETF    0012

  DEF SEG = VARSEG(asm$)
  Call absolute(dummy%, dummy%, dummy%, dummy%, dummy%, dummy%, IsError%, errorcode%, lfn.filefindhandle%, SADD(asm$))
  DEF SEG

  If IsError% Then
    errval = errorcode%
  Else
    errval = 0
  End If

End Sub

'lfn.findfirst$ -- Find file, initialization call
'INPUT:
'  filespec$ - File name type to look for. IE - "C:\*.*"
'  findattrib% - Files with these attributes are returned. Any files with
'    lesser attributes are also returned. Files with more than these
'    attributes are not returned. Used in conjunction with mustattrib%.
'    Use ATT.* constants provided in declaration.
'  mustattrib% - Files without these attributes are not returned. Used in
'    conjunction with findattrib%. Use ATT.* constants provided in
'    declaration.
'SUCCESS:
'  * Return name of the first file matching the createria.
'  * Global variable errval set to zero.
'FAIL:
'  * Return "".
'  * Global variable errval set to &h7100 if function is not supported.
'    (probably does not support LFN)
'  * Global variable errval set to non-zero if an error occurs and the task
'    could not be completed successfully.
FUNCTION lfn.findfirst$ (filespec$, findattrib%, mustattrib%)

  SHARED lfn.filefindhandle%
  SHARED lfn.finddata AS STRING * 320
  lfn.finddata = Space$(320)

  asm$ = asm$ + Chr$(&H55)                                  'PUSH    BP
  asm$ = asm$ + Chr$(&H89) + Chr$(&HE5)                     'MOV     BP,SP
  asm$ = asm$ + Chr$(&H57)                                  'PUSH    DI
  asm$ = asm$ + Chr$(&H6)                                   'PUSH    ES
  asm$ = asm$ + Chr$(&H56)                                  'PUSH    SI
  asm$ = asm$ + Chr$(&H1E)                                  'PUSH    DS
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H6)         'MOV     BX,[BP+06]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H3F)                     'MOV     DI,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H8)         'MOV     BX,[BP+08]
  asm$ = asm$ + Chr$(&H8E) + Chr$(&H7)                      'MOV     ES,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&HA)         'MOV     BX,[BP+0A]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H17)                     'MOV     DX,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&HE)         'MOV     BX,[BP+0E]
  asm$ = asm$ + Chr$(&H8A) + Chr$(&H2F)                     'MOV     CH,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H10)        'MOV     BX,[BP+10]
  asm$ = asm$ + Chr$(&H8A) + Chr$(&HF)                      'MOV     CL,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&HC)         'MOV     BX,[BP+0C]
  asm$ = asm$ + Chr$(&H8E) + Chr$(&H1F)                     'MOV     DS,[BX]
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H4E) + Chr$(&H71)        'MOV     AX,714E
  asm$ = asm$ + Chr$(&HBE) + Chr$(&H1) + Chr$(&H0)          'MOV     SI,0001
  asm$ = asm$ + Chr$(&HCD) + Chr$(&H21)                     'INT     21
  asm$ = asm$ + Chr$(&H1F)                                  'POP     DS
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&HA)         'MOV     BX,[BP+0A]
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                      'MOV     [BX],AX
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H0) + Chr$(&H0)          'MOV     AX,0000
  asm$ = asm$ + Chr$(&H15) + Chr$(&H0) + Chr$(&H0)          'ADC     AX,0000
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&HC)         'MOV     BX,[BP+0C]
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                      'MOV     [BX],AX
  asm$ = asm$ + Chr$(&H5E)                                  'POP     SI
  asm$ = asm$ + Chr$(&H7)                                   'POP     ES
  asm$ = asm$ + Chr$(&H5F)                                  'POP     DI
  asm$ = asm$ + Chr$(&H5D)                                  'POP     BP
  asm$ = asm$ + Chr$(&HCA) + Chr$(&H12) + Chr$(&H0)         'RETF    0012

  lfn.filespec$ = filespec$ + Chr$(0)

  lfn.filespecseg% = VARSEG(lfn.filespec$)
  lfn.filespecoff% = SADD(lfn.filespec$)
  lfn.finddataseg% = VARSEG(lfn.finddata)
  lfn.finddataoff% = VarPtr(lfn.finddata)

  DEF SEG = VARSEG(asm$)
  Call absolute(dummy%, dummy%, dummy%, findattrib%, mustattrib%, lfn.filespecseg%, lfn.filespecoff%, lfn.finddataseg%, lfn.finddataoff%, SADD(asm$))
  DEF SEG

  IsError% = lfn.filespecseg%
  retcode% = lfn.filespecoff%

  If IsError% Then
    errval = retcode%
  Else
    errval = 0
    lfn.filefindhandle% = retcode%
    FileName$ = ""
    DEF SEG = VARSEG(lfn.finddata)
    For i% = 0 To 259
      ch$ = Chr$(PEEK(VarPtr(lfn.finddata) + &H2C + i%))
      If ch$ <> Chr$(0) Then
        FileName$ = FileName$ + ch$
      Else
        Exit For
      End If
    Next
    lfn.findfirst$ = FileName$
  End If

End Function

'lfn.findnext$ -- Find file, continuation call
'INPUT:
'  None. Same values used to call LFN.FINDFIRST$ are automatically used.
'SUCCESS:
'  * Return name of the next file matching the createria.
'  * Global variable errval set to zero.
'FAIL:
'  * Return "".
'  * Global variable errval set to &h7100 if function is not supported.
'    (probably does not support LFN)
'  * Global variable errval set to non-zero if an error occurs and the task
'    could not be completed successfully. This includes a case when there
'    is no more a file matching the createria.
FUNCTION lfn.findnext$

  SHARED lfn.filefindhandle%
  SHARED lfn.finddata AS STRING * 320

  asm$ = ""
  asm$ = asm$ + Chr$(&H55)                                  'PUSH    BP
  asm$ = asm$ + Chr$(&H89) + Chr$(&HE5)                     'MOV     BP,SP
  asm$ = asm$ + Chr$(&H56)                                  'PUSH    SI
  asm$ = asm$ + Chr$(&H6)                                   'PUSH    ES
  asm$ = asm$ + Chr$(&H57)                                  'PUSH    DI
  asm$ = asm$ + Chr$(&HBE) + Chr$(&H1) + Chr$(&H0)          'MOV     SI,0001
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H6)         'MOV     BX,[BP+06]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H3F)                     'MOV     DI,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H8)         'MOV     BX,[BP+08]
  asm$ = asm$ + Chr$(&H8E) + Chr$(&H7)                      'MOV     ES,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&HA)         'MOV     BX,[BP+0A]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H1F)                     'MOV     BX,[BX]
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H4F) + Chr$(&H71)        'MOV     AX,714F
  asm$ = asm$ + Chr$(&HCD) + Chr$(&H21)                     'INT     21
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H6)         'MOV     BX,[BP+06]
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                      'MOV     [BX],AX
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H8)         'MOV     BX,[BP+08]
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H0) + Chr$(&H0)          'MOV     AX,0000
  asm$ = asm$ + Chr$(&H15) + Chr$(&H0) + Chr$(&H0)          'ADC     AX,0000
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                      'MOV     [BX],AX
  asm$ = asm$ + Chr$(&H5F)                                  'POP     DI
  asm$ = asm$ + Chr$(&H7)                                   'POP     ES
  asm$ = asm$ + Chr$(&H5E)                                  'POP     SI
  asm$ = asm$ + Chr$(&H5D)                                  'POP     BP
  asm$ = asm$ + Chr$(&HCA) + Chr$(&H12) + Chr$(&H0)         'RETF    0012

  lfn.finddataseg% = VARSEG(lfn.finddata)
  lfn.finddataoff% = VarPtr(lfn.finddata)

  DEF SEG = VARSEG(asm$)
  Call absolute(dummy%, dummy%, dummy%, dummy%, dummy%, dummy%, lfn.filefindhandle%, lfn.finddataseg%, lfn.finddataoff%, SADD(asm$))
  DEF SEG

  IsError% = lfn.finddataseg%
  errorcode% = lfn.finddataoff%

  If IsError% Then
    errval = errorcode%
  Else
    errval = 0
    FileName$ = ""
    DEF SEG = VARSEG(lfn.finddata)
    For i% = 0 To 259
      ch$ = Chr$(PEEK(VarPtr(lfn.finddata) + &H2C + i%))
      If ch$ <> Chr$(0) Then
        FileName$ = FileName$ + ch$
      Else
        Exit For
      End If
    Next
    lfn.findnext$ = FileName$
  End If

End Function

'lfn.l2s$ -- Convert long filename to short filename
'INPUT:
'  longname$ - Long filename to convert to short filename.
'SUCCESS:
'  * Return short filename version of the long filename.
'  * Global variable errval set to zero.
'FAIL:
'  * Return "".
'  * Global variable errval set to &h7100 if function is not supported.
'    (probably does not support LFN)
'  * Global variable errval set to non-zero if an error occurs and the task
'    could not be completed successfully.
FUNCTION lfn.l2s$ (longname$)

  asm$ = ""
  asm$ = asm$ + Chr$(&H55)                                  'PUSH    BP
  asm$ = asm$ + Chr$(&H89) + Chr$(&HE5)                     'MOV     BP,SP
  asm$ = asm$ + Chr$(&H57)                                  'PUSH    DI
  asm$ = asm$ + Chr$(&H6)                                   'PUSH    ES
  asm$ = asm$ + Chr$(&H56)                                  'PUSH    SI
  asm$ = asm$ + Chr$(&H1E)                                  'PUSH    DS
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H6)         'MOV     BX,[BP+06]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H3F)                     'MOV     DI,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H8)         'MOV     BX,[BP+08]
  asm$ = asm$ + Chr$(&H8E) + Chr$(&H7)                      'MOV     ES,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&HA)         'MOV     BX,[BP+0A]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H37)                     'MOV     SI,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&HC)         'MOV     BX,[BP+0C]
  asm$ = asm$ + Chr$(&H8E) + Chr$(&H1F)                     'MOV     DS,[BX]
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H60) + Chr$(&H71)        'MOV     AX,7160
  asm$ = asm$ + Chr$(&HB9) + Chr$(&H1) + Chr$(&H0)          'MOV     CX,0001
  asm$ = asm$ + Chr$(&HCD) + Chr$(&H21)                     'INT     21
  asm$ = asm$ + Chr$(&H1F)                                  'POP     DS
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&HA)         'MOV     BX,[BP+0A]
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                      'MOV     [BX],AX
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H0) + Chr$(&H0)          'MOV     AX,0000
  asm$ = asm$ + Chr$(&H15) + Chr$(&H0) + Chr$(&H0)          'ADC     AX,0000
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&HC)         'MOV     BX,[BP+0C]
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                      'MOV     [BX],AX
  asm$ = asm$ + Chr$(&H5E)                                  'POP     SI
  asm$ = asm$ + Chr$(&H7)                                   'POP     ES
  asm$ = asm$ + Chr$(&H5F)                                  'POP     DI
  asm$ = asm$ + Chr$(&H5D)                                  'POP     BP
  asm$ = asm$ + Chr$(&HCA) + Chr$(&H12) + Chr$(&H0)         'RETF    0012

  lfn.longname$ = longname$ + Chr$(0)
  lfn.shortname$ = Space$(67)
  
  lfn.longnameseg% = VARSEG(lfn.longname$)
  lfn.longnameoff% = SADD(lfn.longname$)
  lfn.shortnameseg% = VARSEG(lfn.shortname$)
  lfn.shortnameoff% = SADD(lfn.shortname$)

  DEF SEG = VARSEG(asm$)
  Call absolute(dummy%, dummy%, dummy%, dummy%, dummy%, lfn.longnameseg%, lfn.longnameoff%, lfn.shortnameseg%, lfn.shortnameoff%, SADD(asm$))
  DEF SEG

  IsError% = lfn.longnameseg%
  errorcode% = lfn.longnameoff%

  If IsError% Then
    errval = errorcode%
  Else
    errval = 0
    shortname$ = ""
    For i% = 1 To 67
      ch$ = Mid$(lfn.shortname$, i%, 1)
      If ch$ <> Chr$(0) Then
        shortname$ = shortname$ + ch$
      Else
        Exit For
      End If
    Next
    lfn.l2s$ = shortname$
  End If

End Function

'lfn.mkdir -- Create/Make Directory
'INPUT:
'  dirname$ - Name of the directory to create.
'SUCCESS:
'  * New directory created
'  * Global variable errval set to zero.
'FAIL:
'  * Global variable errval set to &h7100 if function is not supported.
'    (probably does not support LFN)
'  * Global variable errval set to non-zero if an error occurs and the task
'    could not be completed successfully.
SUB lfn.mkdir (dirname$)

  asm$ = ""
  asm$ = asm$ + Chr$(&H55)                                       'PUSH    BP
  asm$ = asm$ + Chr$(&H89) + Chr$(&HE5)                          'MOV     BP,SP
  asm$ = asm$ + Chr$(&H1E)                                       'PUSH    DS
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H6)              'MOV     BX,[BP+06]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H17)                          'MOV     DX,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H8)              'MOV     BX,[BP+08]
  asm$ = asm$ + Chr$(&H8E) + Chr$(&H1F)                          'MOV     DS,[BX]
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H39) + Chr$(&H71)             'MOV     AX,7139
  asm$ = asm$ + Chr$(&HCD) + Chr$(&H21)                          'INT     21
  asm$ = asm$ + Chr$(&H1F)                                       'POP     DS
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H6)              'MOV     BX,[BP+06]
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                           'MOV     [BX],AX
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H8)              'MOV     BX,[BP+08]
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H0) + Chr$(&H0)               'MOV     AX,0000
  asm$ = asm$ + Chr$(&H15) + Chr$(&H0) + Chr$(&H0)               'ADC     AX,0000
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                           'MOV     [BX],AX
  asm$ = asm$ + Chr$(&H5D)                                       'POP     BP
  asm$ = asm$ + Chr$(&HCA) + Chr$(&H12) + Chr$(&H0)              'RETF    0012

  lfn.dirname$ = dirname$ + Chr$(0)
  lfn.dirnameseg% = VARSEG(lfn.dirname$)
  lfn.dirnameoff% = SADD(lfn.dirname$)

  DEF SEG = VARSEG(asm$)
  Call absolute(dummy%, dummy%, dummy%, dummy%, dummy%, dummy%, dummy%, lfn.dirnameseg%, lfn.dirnameoff%, SADD(asm$))
  DEF SEG

  IsError% = lfn.dirnameseg%
  errorcode% = lfn.dirnameoff%

  If IsError% Then
    errval = errorcode%
  Else
    errval = 0
  End If

End Sub

'lfn.ren -- Rename file/directory
'INPUT:
'  oldname$ - Name of the file/directory to change.
'  newname$ - Name of the new file/directory name.
'SUCCESS:
'  * Specified file/directory name changed to the specified name.
'  * Global variable errval set to zero.
'FAIL:
'  * Global variable errval set to &h7100 if function is not supported.
'    (probably does not support LFN)
'  * Global variable errval set to non-zero if an error occurs and the task
'    could not be completed successfully.
SUB lfn.ren (oldname$, newname$)

  asm$ = ""
  asm$ = asm$ + Chr$(&H55)                                  'PUSH    BP
  asm$ = asm$ + Chr$(&H89) + Chr$(&HE5)                     'MOV     BP,SP
  asm$ = asm$ + Chr$(&H57)                                  'PUSH    DI
  asm$ = asm$ + Chr$(&H6)                                   'PUSH    ES
  asm$ = asm$ + Chr$(&H1E)                                  'PUSH    DS
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H56) + Chr$(&H71)        'MOV     AX,7156
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H6)         'MOV     BX,[BP+06]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H3F)                     'MOV     DI,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H8)         'MOV     BX,[BP+08]
  asm$ = asm$ + Chr$(&H8E) + Chr$(&H7)                      'MOV     ES,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&HA)         'MOV     BX,[BP+0A]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H17)                     'MOV     DX,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&HC)         'MOV     BX,[BP+0C]
  asm$ = asm$ + Chr$(&H8E) + Chr$(&H1F)                     'MOV     DS,[BX]
  asm$ = asm$ + Chr$(&HCD) + Chr$(&H21)                     'INT     21
  asm$ = asm$ + Chr$(&H1F)                                  'POP     DS
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H6)         'MOV     BX,[BP+06]
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                      'MOV     [BX],AX
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H0) + Chr$(&H0)          'MOV     AX,0000
  asm$ = asm$ + Chr$(&H15) + Chr$(&H0) + Chr$(&H0)          'ADC     AX,0000
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H8)         'MOV     BX,[BP+08]
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                      'MOV     [BX],AX
  asm$ = asm$ + Chr$(&H7)                                   'POP     ES
  asm$ = asm$ + Chr$(&H5F)                                  'POP     DI
  asm$ = asm$ + Chr$(&H5D)                                  'POP     BP
  asm$ = asm$ + Chr$(&HCA) + Chr$(&H12) + Chr$(&H0)         'RETF    0012

  lfn.oldname$ = oldname$ + Chr$(0)
  lfn.newname$ = newname$ + Chr$(0)

  lfn.oldnameseg% = VARSEG(lfn.oldname$)
  lfn.oldnameoff% = SADD(lfn.oldname$)
  lfn.newnameseg% = VARSEG(lfn.newname$)
  lfn.newnameoff% = SADD(lfn.newname$)

  DEF SEG = VARSEG(asm$)
  Call absolute(dummy%, dummy%, dummy%, dummy%, dummy%, lfn.oldnameseg%, lfn.oldnameoff%, lfn.newnameseg%, lfn.newnameoff%, SADD(asm$))
  DEF SEG

  IsError% = lfn.newnameseg%
  errorcode% = lfn.newnameoff%

  If IsError% Then
    errval = errorcode%
  Else
    errval = 0
  End If

End Sub

'lfn.rmdir -- Remove Directory
'INPUT:
'  dirname$ - Name of the directory to remove.
'SUCCESS:
'  * Specified directory removed.
'  * Global variable errval set to zero.
'FAIL:
'  * Global variable errval set to &h7100 if function is not supported.
'    (probably does not support LFN)
'  * Global variable errval set to non-zero if an error occurs and the task
'    could not be completed successfully.
SUB lfn.rmdir (dirname$)
  asm$ = ""
  asm$ = asm$ + Chr$(&H55)                                       'PUSH    BP
  asm$ = asm$ + Chr$(&H89) + Chr$(&HE5)                          'MOV     BP,SP
  asm$ = asm$ + Chr$(&H1E)                                       'PUSH    DS
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H6)              'MOV     BX,[BP+06]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H17)                          'MOV     DX,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H8)              'MOV     BX,[BP+08]
  asm$ = asm$ + Chr$(&H8E) + Chr$(&H1F)                          'MOV     DS,[BX]
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H3A) + Chr$(&H71)             'MOV     AX,713A
  asm$ = asm$ + Chr$(&HCD) + Chr$(&H21)                          'INT     21
  asm$ = asm$ + Chr$(&H1F)                                       'POP     DS
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H6)              'MOV     BX,[BP+06]
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                           'MOV     [BX],AX
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H8)              'MOV     BX,[BP+08]
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H0) + Chr$(&H0)               'MOV     AX,0000
  asm$ = asm$ + Chr$(&H15) + Chr$(&H0) + Chr$(&H0)               'ADC     AX,0000
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                           'MOV     [BX],AX
  asm$ = asm$ + Chr$(&H5D)                                       'POP     BP
  asm$ = asm$ + Chr$(&HCA) + Chr$(&H12) + Chr$(&H0)              'RETF    0012

  lfn.dirname$ = dirname$ + Chr$(0)
  lfn.dirnameseg% = VARSEG(lfn.dirname$)
  lfn.dirnameoff% = SADD(lfn.dirname$)

  DEF SEG = VARSEG(asm$)
  Call absolute(dummy%, dummy%, dummy%, dummy%, dummy%, dummy%, dummy%, lfn.dirnameseg%, lfn.dirnameoff%, SADD(asm$))
  DEF SEG

  IsError% = lfn.dirnameseg%
  errorcode% = lfn.dirnameoff%

  If IsError% Then
    errval = errorcode%
  Else
    errval = 0
  End If

End Sub

'lfn.s2l$ -- Convert short filename to long filename
'INPUT:
'  shortname$ - Short filename to convert to long filename.
'SUCCESS:
'  * Return long filename version of the short filename.
'  * Global variable errval set to zero.
'FAIL:
'  * Return "".
'  * Global variable errval set to &h7100 if function is not supported.
'    (probably does not support LFN)
'  * Global variable errval set to non-zero if an error occurs and the task
'    could not be completed successfully.
FUNCTION lfn.s2l$ (shortname$)

  asm$ = ""
  asm$ = asm$ + Chr$(&H55)                                  'PUSH    BP
  asm$ = asm$ + Chr$(&H89) + Chr$(&HE5)                     'MOV     BP,SP
  asm$ = asm$ + Chr$(&H57)                                  'PUSH    DI
  asm$ = asm$ + Chr$(&H6)                                   'PUSH    ES
  asm$ = asm$ + Chr$(&H56)                                  'PUSH    SI
  asm$ = asm$ + Chr$(&H1E)                                  'PUSH    DS
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H6)         'MOV     BX,[BP+06]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H3F)                     'MOV     DI,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&H8)         'MOV     BX,[BP+08]
  asm$ = asm$ + Chr$(&H8E) + Chr$(&H7)                      'MOV     ES,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&HA)         'MOV     BX,[BP+0A]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H37)                     'MOV     SI,[BX]
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&HC)         'MOV     BX,[BP+0C]
  asm$ = asm$ + Chr$(&H8E) + Chr$(&H1F)                     'MOV     DS,[BX]
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H60) + Chr$(&H71)        'MOV     AX,7160
  asm$ = asm$ + Chr$(&HB9) + Chr$(&H2) + Chr$(&H0)          'MOV     CX,0002
  asm$ = asm$ + Chr$(&HCD) + Chr$(&H21)                     'INT     21
  asm$ = asm$ + Chr$(&H1F)                                  'POP     DS
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&HA)         'MOV     BX,[BP+0A]
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                      'MOV     [BX],AX
  asm$ = asm$ + Chr$(&HB8) + Chr$(&H0) + Chr$(&H0)          'MOV     AX,0000
  asm$ = asm$ + Chr$(&H15) + Chr$(&H0) + Chr$(&H0)          'ADC     AX,0000
  asm$ = asm$ + Chr$(&H8B) + Chr$(&H5E) + Chr$(&HC)         'MOV     BX,[BP+0C]
  asm$ = asm$ + Chr$(&H89) + Chr$(&H7)                      'MOV     [BX],AX
  asm$ = asm$ + Chr$(&H5E)                                  'POP     SI
  asm$ = asm$ + Chr$(&H7)                                   'POP     ES
  asm$ = asm$ + Chr$(&H5F)                                  'POP     DI
  asm$ = asm$ + Chr$(&H5D)                                  'POP     BP
  asm$ = asm$ + Chr$(&HCA) + Chr$(&H12) + Chr$(&H0)         'RETF    0012

  lfn.shortname$ = shortname$ + Chr$(0)
  lfn.longname$ = Space$(261)

  lfn.shortnameseg% = VARSEG(lfn.shortname$)
  lfn.shortnameoff% = SADD(lfn.shortname$)
  lfn.longnameseg% = VARSEG(lfn.longname$)
  lfn.longnameoff% = SADD(lfn.longname$)

  DEF SEG = VARSEG(asm$)
  Call absolute(dummy%, dummy%, dummy%, dummy%, dummy%, lfn.shortnameseg%, lfn.shortnameoff%, lfn.longnameseg%, lfn.longnameoff%, SADD(asm$))
  DEF SEG

  IsError% = lfn.shortnameseg%
  errorcode% = lfn.shortnameoff%

  If IsError% Then
    errval = errorcode%
  Else
    errval = 0
    longname$ = ""
    For i% = 1 To 261
      ch$ = Mid$(lfn.longname$, i%, 1)
      If ch$ <> Chr$(0) Then
        longname$ = longname$ + ch$
      Else
        Exit For
      End If
    Next
    lfn.s2l$ = longname$
  End If

End Function
SCUMM (the band) on Myspace!
ComputerEmuzone Games Studio
underBASIC, homegrown musicians
[img]http://www.ojodepez-fanzine.net/almacen/yoghourtslover.png[/i
Reply
#9
SUB open.file(long.file.name$, n%, method%)

opens that file in record n% with the method method%... like you know OUTPUT INPUT RANDOM APPEND etc....

EDIT
I guess converting to short filename isn't terrible, but I just don't like it.
Peace cannot be obtained without war. Why? If there is already peace, it is unnecessary for war. If there is no peace, there is already war."

Visit www.neobasic.net to see rubbish in all its finest.
Reply
#10
You can use the FUNCTION lfn.l2s$ (longname$) in the code I gave you inside your open.file function. That way, using longfilenames or not will be transparent to the user and your problem will be fixed. You _have_ to do this 'cause OPEN only takes 8.3 filenames.
SCUMM (the band) on Myspace!
ComputerEmuzone Games Studio
underBASIC, homegrown musicians
[img]http://www.ojodepez-fanzine.net/almacen/yoghourtslover.png[/i
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)