'=========================================================================== ' 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 SHARED 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