MILC logo

IndexVorigeVolgendeLeeg

MSX-DOS 2.20 functions [4/5]
ASCII, 01-09-94


    
  3.60   GET/SET FILE ATTRIBUTES (50H)

     Parameters:    C = 50H (_ATTR) 
                   DE = Drive/path/file ASCIIZ string
                                or fileinfo block pointer
                    A = 0 => get attributes
                        1 => set attributes
                    L = New attributes byte (only if A=1)
     Results:       A = Error
                    L = Current attributes byte

   This function  is normally  used to  change the  attributes of  a file  or 
sub-directory.  It can  also be  used to  find out the current attributes but 
this is  more usually  done with  the "find  first entry"  function (function 
40h).  If A=0  then the current attributes byte for the file or sub-directory 
will just be returned in register L.

   If A=1  then the attributes byte will be set to the new value specified in 
register  L, and this new value will also be returned in register L. Only the 
system, hidden,  read only  and archive  bits may  be altered for a file, and 
only  the hidden  bit for a sub-directory. An ".IATTR" error will be returned 
if an  attempt is made to alter any other attribute bits. If a fileinfo block 
is  passed then  the attributes  byte in  it will not be updated with the new 
setting.

   Global filename  characters are  not allowed  so only  one object (file or 
sub-directory)  can have  its attributes set by this function. The attributes 
of the  root directory  cannot be  changed because  it does not have any. The 
attributes  of a  file cannot be changed if there is a file handle open to it 
(".FOPEN"  error).  The  attributes  of the  "." and  ".." directory  entries 
however can  be changed.  If a device name such as "CON" is specified then no 
error  will be  returned but  the device's  attributes will  not actually  be 
changed (since it does not have any).

  3.61   GET/SET FILE DATE AND TIME (51H)

     Parameters:    C = 51H (_FTIME) 
                   DE = Drive/path/file ASCIIZ string
                                or fileinfo block pointer
                    A = 0 => get date and time
                        1 => set date and time 
                   IX = New time value (only if A=1)
                   HL = New date value (only if A=1)
     Results:       A = Error
                   DE = Current file time value
                   HL = Current file date value 

   If  A=1 then  this function sets the date and time of last modification of 
the file or sub-directory specified by the drive/path/file string or fileinfo 
block. Global  filename characters  are not allowed in any part of the string 
so  only one  file can have its date and time modified by this function. If a 
device name such as "CON" is specified then no error will be returned but the 
device's date and time will not actually be changed.

   The date  and time  format are exactly as contained in the directory entry 
and  fileinfo blocks  (see the  "Program Interface Specification"). No checks 
are done for sensible dates or times, the values are simply stored. Note that 
if a fileinfo block is passed then the date and time stored in it will not be 
updated by this function.

   If  A=0 then  the current values are just returned. Note that although the 
time value is passed in IX, it is returned in DE. The date and time of a file 
cannot be altered (although it can be read) if there is a file handle open to 
the file (".FOPEN" error).

  3.62   DELETE FILE HANDLE (52H)

     Parameters:    C = 52H (_HDELETE) 
                    B = File handle
     Results:       A = Error

   This function  deletes the  file handle associated with the specified file 
and  closes the file handle. A file handle cannot be deleted if there are any 
other separately  opened file handles open to the same file (".FOPEN" error). 
If  there are any duplicates of the file handle (created by a "duplicate file 
handle" or  "fork" function), then these duplicates will be marked as invalid 
and any attempt to use them will produce an ".HDEAD" error.

   The  error conditions  for this  function are  the same as for the "delete 
file or  sub-directory" function  (function 4Dh). The file handle will always 
be closed, even if there is an error condition such as ".FILRO" or ".FOPEN".

  3.63   RENAME FILE HANDLE (53H)

     Parameters:    C = 53H (_HRENAME) 
                    B = File handle
                   HL = New filename ASCIIZ string 
     Results:       A = Error

   This  function renames  the file associated with the specified file handle 
with the  new name  in the  string pointed to by HL. Apart from the fact that 
the  file is  specified by  a file  handle rather  than an ASCIIZ string or a 
fileinfo  block,   this  function   is  identical  to  the  "rename  file  or 
subdirectory" function (function 4Eh), and has the same error conditions.

   A file  handle cannot  be renamed if there are any other separately opened 
file  handles for  this file  (".FOPEN" error), although it can be renamed if 
there are  copies of  this file  handle, and  in this case the copies will be 
renamed.  Renaming a  file handle will not alter the file pointer but it will 
do an implicit "ensure" operation.

  3.64   MOVE FILE HANDLE (54H)

     Parameters:    C = 54H (_HMOVE) 
                    B = File handle
                   HL = New path ASCIIZ string 
     Results:       A = Error

   This function  moves the file associated with the specified file handle to 
the  directory specified  by the new path string pointed to by HL. Apart from 
the fact  that the  file is  specified by a file handle rather than an ASCIIZ 
string  or a  fileinfo block, this function is identical to the "move file or 
subdirectory" function (function 4Fh), and has the same error conditions.

   A file  handle cannot  be moved  if there  are any other separately opened 
file  handles for  this file  (".FOPEN" error),  although it  can be moved if 
there are  copies of  this file handle, and in this case the copies will also 
be moved. Moving a file handle will not alter the file pointer but it will do 
an implicit "ensure" operation.

  3.65   GET/SET FILE HANDLE ATTRIBUTES (55H)

     Parameters:    C = 55H (_HATTR) 
                    B = File handle
                    A = 0 => get attributes
                        1 => set attributes
                    L = New attributes byte (only if A=1)
     Results:       A = Error
                    L = Current attributes byte

   This function gets or sets the attributes byte of the file associated with
the specified  file handle. Apart from the fact that the file is specified by 
a file handle rather than an ASCIIZ string or a fileinfo block, this function 
is  identical to  the "get/set  file attributes" function (function 50h), and 
has the same error conditions.

   A  file handle  cannot have  its attributes  changed (although they can be 
read) if  there are  any other  separately opened  file handles for this file 
(".FOPEN"  error).  The  file pointer  will not  be altered  but an  implicit 
"ensure" operation will be done.

  3.66   GET/SET FILE HANDLE DATE AND TIME (56H)

     Parameters:    C = 56H (_HFTIME) 
                    B = File handle
                    A = 0 => get date and time
                        1 => set date and time 
                   IX = New time value (only if A=1)
                   HL = New date value (only if A=1)
     Results:       A = Error
                   DE = Current file time value
                   HL = Current file date value 

   This  function gets  or sets the date and time of the file associated with 
the specified  file handle. Apart from the fact that the file is specified by 
a file handle rather than an ASCIIZ string or a fileinfo block, this function 
is identical to the "get/set file date and time" function (function 51h), and 
has the same error conditions.

   A  file handle cannot have its date and time changed (although they can be 
read) if  there are  any other  separately opened  file handles for this file 
(".FOPEN"  error).  The  file pointer  will not  be altered  but an  implicit 
"ensure" operation will be done.

  3.67   GET DISK TRANSFER ADDRESS (57H)

     Parameters:    C = 57H (_GETDTA) 
     Results:      DE = Current disk transfer address

   This  function returns  the current disk transfer address. This address is 
only used  for the  "traditional" CP/M  style FCB  functions and the absolute 
sector read and write functions.
 
  3.68   GET VERIFY FLAG SETTING (58H)

     Parameters:    C = 58H (_GETVFY) 
     Results:       B = 00H => verify disabled
                        FFH => verify enabled

   This  function simply  returns the  current state of the verify flag which
can be set with MSX-DOS function 2Eh.

  3.69   GET CURRENT DIRECTORY (59H)

     Parameters:    C = 59H (_GETCD) 
                    B = Drive number (0=current, 1=A: etc)
                   DE = Pointer to 64 byte buffer 
     Results:       A = Error
                   DE = Filled in with current path

    This  function  simply  gets  an  ASCIIZ  string representing  the current
directory of the specified drive into the buffer pointed to by DE. The string 
will not  include a drive name or a leading or trailing "\" character, so the 
root directory is represented by a null string. The drive will be accessed to 
make sure that the current directory actually exists on the current disk, and 
if  not then  the current  directory will  be set back to the root and a null 
string returned.

  3.70   CHANGE CURRENT DIRECTORY (5AH)

     Parameters:    C = 5AH (_CHDIR) 
                   DE = Drive/path/file ASCIIZ string
     Results:       A = Error

   The drive/path/file  string must  specify a  directory rather than a file. 
The  current directory  of the drive will be changed to be this directory. If 
the  specified  directory does  not exist  then the  current setting  will be 
unaltered and a ".NODIR" error returned.

  3.71   PARSE PATHNAME (5BH)

     Parameters:    C = 5BH (_PARSE) 
                    B = Volume name flag (bit 4)
                        DE = ASCIIZ string for parsing
     Results:       A = Error
                   DE = Pointer to termination character
                   HL = Pointer to start of last item
                    B = Parse flags
                    C = Logical drive number (1=A: etc)

   This function is purely a string manipulation function, it will not access
the disks  at all  and it  will not  modify the  user's string  at all. It is 
intended to help transient programs in parsing command lines.

   The volume  name flag (bit 4 of register B; it is in the same bit position
as  the volume  name bit in an attributes byte) determines whether the string 
will be  parsed as  a "drive/path/file"  string (if  the bit is cleared) or a 
"drive/volume" string (if the bit is set).

   The pointer  returned in DE will point to the first character which is not 
valid in a pathname string, and may be the null at the end of the string. See 
the "Command Specification" for details of the syntax of pathname strings and 
also for a list of valid characters.

   The  pointer returned  in HL will point to the first character of the last 
item of  a string  (filename portion). For example, when a string "A:\XYZ\P.Q 
/F" was passed, DE will point to the white space character before "/F" and HL 
will  point to "P". If the parsed string ends with a character "\" or is null 
(apart from  drive name),  then there  will be no "last item", thus HL and DE 
will  point to the same character. In this case, some special procedures will 
be needed to all the programs which use this function.

   The  drive number returned in register C is the logical drive specified in
the string.  If the  string did not start with a drive letter then register C 
will  contain the  default drive  number, since  the default  drive has  been 
implicitly specified. Register C will never be zero.

   The  parse flags  returned in  register B  indicate various  useful things 
about the  string. For  a volume  name bits  1, 4,  5, 6 and 7 will always be 
clear. For a filename, bits 3 to 7 relate to the last item on the string (the 
"filename" component). The bit assignments are as follows: 

b0 - set if any characters parsed other than drive name
b1 - set if any directory path specified
b2 - set if drive name specified
b3 - set if main filename specified in last item
b4 - set if filename extension specified in last item
b5 - set if last item is ambiguous
b6 - set if last item is "." or ".."
b7 - set if last item is ".."

  3.72   PARSE FILENAME (5CH)

     Parameters:    C = 5CH (_PFILE) 
                   DE = ASCIIZ string for parsing
                   HL = Pointer to 11 byte buffer
     Results:       A = Error (always zero)
                   DE = Pointer to termination character
                   HL = Preserved, buffer filled in
                    B = Parse flags

   This function is purely a string manipulation function, it will not access
disks at  all and will not modify the string at all. It is intended mainly to 
help  transient programs  in printing  out filenames  in a formatted way. The 
ASCIIZ string will be parsed as a single filename item, and the filename will 
be  stored  in the  user's 11  byte buffer  in expanded  form, with  both the 
filename and the extension padded out with spaces.

   The parse  flags returned  in register  B are  identical to  those for the 
"parse  pathname" function  above (function 5Bh), except that bits 0, 1 and 2 
will always  be clear.  The user's  buffer will  always be filled in, even if 
there  is no  valid filename  in the string, in which case the buffer will be 
filled with spaces. "*" characters will be expanded to the appropriate number 
of "?"s.  If either  the filename  or the filename extension is too long then 
the excess characters will be ignored.

   The pointer  returned in  register DE will point to the first character in 
the  string which  was not part of the filename, which may be the null at the 
end of  the string.  This character  will never be a valid filename character 
(see the "Command Specification" for details of valid filename characters).

  3.73   CHECK CHARACTER (5DH)

     Parameters:    C = 5DH (_CHKCHR) 
                    D = Character flags
                    E = Character to be checked
     Results:       A = 0 (never returns an error)
                    D = Updated character flags
                    E = Checked (upper cased) character

   This  function allow  language independent  upper casing of characters and 
also helps with handling 16-bit characters and manipulation of filenames. The 
bit assignments in the character flags are as follows:

   b0   - set to suppress upper casing
   b1   - set if first byte of 16-bit character
   b2   - set if second byte of 16-bit character
   b3   - set => volume name (rather than filename)
   b4   - set => not a valid file/volume name character
b5...b7 - reserved (always clear)

   Bit 0  is used  to control upper casing. If it is clear then the character
will be upper cased according to the language setting of the machine. If this 
bit  is  set  then the  returned character  will always  be the  same as  the 
character passed.

   The two  16-bit character  flags (bits 1 and 2) can both be clear when the 
first  character of  a string  is checked  and the  settings returned  can be 
passed straight  back to  this function  for each  subsequent character. Care 
must  be taken  with these  flags when moving backwards through strings which 
may contain 16-bit characters.

   Bit  4 is  set on return if the character is one of the set of filename or 
volume name  terminator characters. Bit 3 is simply used to determine whether 
to  test for filename or volume name characters since the sets are different. 
16-bit characters  (either byte)  are never  considered as volume or filename 
terminators.

  3.74   GET WHOLE PATH STRING (5EH)

     Parameters:    C = 5EH (_WPATH) 
                        DE = Pointer to 64 byte buffer 
     Results:       A = Error
                   DE = Filled in with whole path string
                   HL = Pointer to start of last item 

   This  function simply copies an ASCIIZ path string from an internal buffer 
into the  user's buffer.  The string  represents the whole path and filename, 
from  the root  directory, of  a file  or sub-directory located by a previous 
"find first entry" or "find new entry" function. The returned string will not 
include a  drive, or  an initial "\" character. Register HL will point at the 
first  character of  the last  item on  the string, exactly as for the "parse 
path" function (function 5Bh).

   If a  "find first entry" or "find new entry" function call is done with DE 
pointing to an ASCIIZ string then a subsequent "get whole path" function call 
will  return a string representing the sub-directory or file corresponding to 
the  fileinfo   block  returned   by  the  "find"  function.  If  this  is  a 
sub-directory  then the  fileinfo block  may be passed back in register DE to 
another "find  first entry"  function call,  which will  locate a file within 
this  sub-directory. In  this case  the newly located file will be added onto 
the already  existing whole  path string internally, and so a subsequent "get 
whole  path string" function call will return a correct whole path string for 
the located file.

   Great care must be taken in using this function because the internal whole
path  string is modified by many of the function calls, and in many cases can 
be invalid.  The "get  whole path"  function call  should be done immediately 
after  the  "find  first  entry"  or "find  new entry"  function to  which it 
relates.

  3.75   FLUSH DISK BUFFERS (5FH)

     Parameters:    C = 5FH (_FLUSH) 
                    B = Drive number (0=current, FFH=all)
                    D = 00H => Flush only
                      = FFH => Flush and invalidate 
     Results:       A = Error

   This  function flushes  any dirty disk buffers for the specified drive, or
for all drives if B=FFh. If register D is FFh then all buffers for that drive 
will also be invalidated. 

  3.76   FORK TO CHILD PROCESS (60H)

     Parameters:    C = 60H (_FORK) 
     Results:       A = Error
                    B = Process id of parent process

   This function  informs the  system that  a child  process is  about to  be 
started.  Typically this  is a new program or sub-command being executed. For 
example COMMAND2.COM does a "fork" function call before executing any command 
or transient program.

A new set of file handles is created, and any current file handles which were 
opened with the "inheritable" access mode bit set (see the "open file handle" 
function -  function 43h),  are copied  into the new set of file handles. Any 
file handles which were  opened with  the "inheritable" bit clear will not be copied and so will 
not be  available to the child process. The standard file handles (00h...05h) 
are inheritable and so these will be copied.

   A new process id is allocated for the child process and the process id. of
the parent  process is  returned so  that a  later "join"  function call  can 
switch  back to  the parent process. A ".NORAM" error can be produced by this 
function if there is insufficient memory to duplicate the file handles.

   Because  the child  process now  has a  copy of  the previous file handles 
rather than  the originals,  if one  of them is closed then the original will 
remain  open. So  for example if the child process closes the standard output 
file handle  (file handle number 1) an re-opens it to a new file, then when a 
"join" function is done to return to the parent process the original standard 
output channel will still be there.

  3.77   REJOIN PARENT PROCESS (61H)

     Parameters:    C = 61H (_JOIN) 
                    B = Process id of parent, or zero
     Results:       A = Error
                    B = Primary error code from child
                    C = Secondary error code from child

   This function  switches back  to the  specified parent process and returns
the  error code  which the child process terminated with in register B, and a 
secondary error  code from the child in register C. Although the relationship 
between  parent and  childprocesses is strictly one-to-one, this function can 
jump back several levels by giving it a suitable process id. A ".IPROC" error 
will be returned if the process id is invalid.

   The child  process's set  of file handles are automatically closed and the 
parent  process's set of file handles becomes active again. Also any user RAM 
segments which the child process had allocated will be freed.

   If the  process id  passed to  this function is zero then a partial system 
re-initialisatin  is done. All file handles are closed and the standard input 
and output handles re-opened and all user segments are freed. This should not 
normally be  done by  a user  program if  it intends to return to the command 
interpreter  since the  command interpreter will not be in a consistent state 
after this.

   This function takes great care that the freeing of memory and adjusting of 
process id  is done  before actually closing any file handles and thus before 
accessing  the disk. This ensures that if a disk error occurs and is aborted, 
the join  operation will  have been  done successfully. However if a "join 0" 
produces a disk error which is aborted, then the re-initialization of default 
file  handles will not have been done. In this case another "join 0" function 
call should  be done  and this  will not attempt access disk (because all the 
files have been closed) and so will be successful.

   Note that  if this function call is made via 0F37Dh then registers B and C
will  not return  the error  codes. This  is because  program termination and 
abort handling  must be  done by the application program. The error code will 
have  been passed  to the abort vector and code there must remember the error 
code if  it needs  to. See the "terminate with error code" function (function 
62h) for the meaning of the primary and secondary error code. 

  3.78   TERMINATE WITH ERROR CODE (62H)

     Parameters:    C = 62H (_TERM) 
                    B = Error code for termination
     Results:       Does not return


   This  function terminates the program with the specified error code, which 
may be  zero indicating no error. This function call will never return to the 
caller  (unless a  user abort  routine executes  forces it  to - see function 
63h). The operation of this function is different depending on whether it was 
called  from  the  MSX-DOS  environment  via  00005h or  from the  disk BASIC 
environment via 0F37Dh.

   If called  via 00005h  then if  a user  abort routine  has been defined by 
function  63h it  will be  called with  the specified  error code (and a zero 
secondary error code). Assuming that this routine returns, or if there was no 
user abort  routine defined,  then control  will be  passed back  to whatever 
loaded  the transient program via a jump at location 00000h. This will almost 
always  be  the command  interpreter, but  in some  cases it  may be  another 
transient program.  The error  code will  be remembered by the system and the 
next  "join" function  (function 61h)  which is  done will  return this error 
code. The command interpreter will print an error message for any code in the 
range 20h...FFh, but will not print a message for errors below this.

   If this function is called from the disk BASIC environment via 0F37Dh then 
control  will be  passed to the abort vector at location "BREAKVECT". In this 
environment there  is no  separately defined user abort routine and the error 
code  must be  remembered by  the code at "BREAKVECT" because "join" will not 
return the error code.

  3.79   DEFINE ABORT EXIT ROUTINE (63H)

     Parameters:    C = 63H (_DEFAB) 
                   DE = Address of abort exit routine 
                        0000H to un-define routine 
     Results:       A = 0 (never generates errors)

   This function  is only  available when  called via  location 00005h in the
MSX-DOS  environment. It  cannot be  called at  location 0F37Dh from the disk 
BASIC environment.

   If  register DE  is zero  then a  previously defined abort routine will be 
undefined, otherwise  a new  one will  be defined.  The abort routine will be 
called by the system whenever the transient program is about to terminate for 
any  reason other  than a direct jump to location 0000h. Programs written for 
MSX-DOS  2  should  exit  with a  "terminate with  error code"  function call 
(function 061h) rather than a jump to location 0000h.

   The user  abort routine  will be  entered with the user stack active, with 
IX,  IY and  the alternate  register set as it was when the function call was 
made and  with the  whole TPA  paged in.  The termination  error code will be 
passed to the routine in register A with a secondary error code in register B 
and  if the  routine executes a "RET" then the values returned in registers A 
and  B  will  be  stored as  the error  codes to  be returned  by the  "join" 
function, and  normally printed out by the command interpreter. Alternatively 
the  routine may jump to some warm start code in the transient program rather 
than returning. The system will be in a perfectly stable state able to accept 
any function calls.

   The primary  error code  passed to  the routine  in register A will be the
code  which the  program itself  passed to  the "terminate  with error  code" 
function (which  may be  zero) if this is the reason for the termination. The 
routine will also be called if a Ctrl-C or Ctrl-STOP is detected (".CTRLC" or 
".STOP"  error), if  a disk error is aborted (".ABORT" error), or if an error 
occurred  on  one of  the standard  input or  output channels  being accessed 
through MSX-DOS function calls 01h...0Bh (".INERR" or ".OUTERR").
   
   The errors ".ABORT", ".INERR" and ".OUTERR" are generated by the system as 
a  result of  some other  error. For  example a  ".ABORT" can  result from  a 
".NRDY" error,  or a  ".INERR" can result from a ".EOF" error. In these cases 
the original error code (".NRDY" or ".EOF") is passed to the abort routine in 
register  B as  the secondary  error code.  For all  other errors there is no 
secondary error code and register B will be zero.
   
   If the abort routine executes "POP HL : RET" (or equivalent) rather than a 
simple  return,  then  control  will  pass  to  the  instruction  immediately 
following the MSX-DOS call or BIOS call in which the error occurred. This may 
be useful in conjunction with a disk error handler routine (see function 64h) 
to  allow  an option  to abort  the current  MSX-DOS call  when a  disk error 
occurs.

    

Index

Vorige

Volgende