MILC logo

IndexVorigeVolgendeLeeg

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


    
  3.80   DEFINE DISK ERROR HANDLER ROUTINE (64H)

     Parameters:    C = 64H (_DEFER) 
                   DE = Address of disk error routine
                        0000H to un-define routine 
     Results:       A = 0 (never generates errors)

   This function specifies the address of a user routine which will be called
if a  disk error  occurs. The routine will be entered with the full TPA paged 
in, but with the system stack in page-3 active and none of the registers will 
be preserved from when the MSX-DOS function call was made.

   The error routine can make MSX-DOS calls but must be very careful to avoid
recursion. The list of function calls in section 2 of this document indicates 
which function  calls can  be safely  made from  a user  error routine.  This 
routine  is called  with the redirection status being temporarily invalidated 
in case  the standard  I/O channels  have been  redirected. See  the "get/set 
redirection state" function (function 70h) for details of this.

   The  specification of  parameters and results for the routine itself is as
below. All  registers including  IX, IY and the alternate register set may be 
destroyed but the paging and stack must be preserved. The routine must return 
to the system, it must not jump away to continue the transient program. If it 
wants to do this then it should return A=1 ("abort") and a user abort routine 
will then get control and this may do whatever it wants to.

     Parameters:    A = Error code which caused error
                    B = Physical drive 
                    C = b0 - set if writing
                        b1 - set if ignore not recommended
                        b2 - set if auto-abort suggested
                        b3 - set if sector number is valid 
                   DE = Sector number (if b3 of C is set)
     Results:       A = 0 => Call system error routine
                        1 => Abort
                        2 => Retry
                        3 => Ignore

  3.81   GET PREVIOUS ERROR CODE (65H)

     Parameters:    C = 65H (_ERROR) 
     Results:       A = 0
                    B = Error code from previous function

   This  function allows  a user  program to  find out  the error  code which 
caused the  previous MSX-DOS  function call  to fail.  It is intended for use 
with the old CP/M compatible functions which do not return an error code. For 
example  if a  "create file  FCB" function  returns A=0FFh thee could be many 
reasons  for  the  failure  and  doing  this  function  call will  return the 
appropriate on, for example ".DRFUL" or ".SYSX".

  3.82   EXPLAIN ERROR CODE (66H)

     Parameters:    C = 66H (_EXPLAIN) 
                    B = Error code to be explained
                   DE = Pointer to 64 byte string buffer
     Results:       A = 0
                    B = 0 or unchanged
                   DE = Filled in with error message 

   This  function allows  a user  program to get an ASCIIZ explanation string 
for a  particular error  code returned by any of the MSX-DOS functions. If an 
error comes from one of the old functions then "get previous error code" must 
be  called first  to get  the real  error code  and then this function can be 
called to get an explanation string.

   The "Program Interface Specification" contains a list of all the currently 
defined  error codes  and the messages for them. Foreign language versions of 
the system  will of  course have  different messages.  If the error code does 
have  a built  in explanation  string then  this string  will be returned and 
register B  will be  set to  zero. If  there is  no explanation string then a 
string  of the  form: "System error 194" or "User error 45" will be returned, 
and register  B will  be unchanged.  (System errors  are those  in the  range 
40h...FFh and user errors are 00h...3Fh.) 

  3.83   FORMAT A DISK (67H)

     Parameters:    C = 67H (_FORMAT)
                    B = Drive number (0=>current, 1=>A:)
                    A =    00H    => return choice string
                        01H...09H => format this choice
                        0AH...FDH => illegal
                        FEH, FFH  => new boot sector 
                   HL = Pointer to buffer (if A=1...9)
                   DE = Size of buffer (if A=1...9)  
     Results:       A = Error
                    B = Slot of choice string (only if A=0 on entry)
                   HL = Address of choice string (only if A=0 on entry)

This function  is used  to format  disks and  is really only provided for the 
"FORMAT"  command although other programs may use it (with care) if they find 
it useful.  It has  three different  options which  are selected  by the code 
passed in register A.

   If  A=0  then  registers  B  and  HL  return the  slot number  and address
respectively  of an ASCIIZ string which specifies the choice of formats which 
is  available.  A ".IFORM"  error will  be returned  if this  disk cannot  be 
formatted (for  example the RAM disk). Normally the string will be read using 
the  "RDSLT" routine  and displayed  on the screen followed by a "? " prompt. 
The user  then specifies a choice "1"..."9" and this choice is passed back to 
the  "format" function,  after a  suitable warning prompt, to actually format 
the disk. If A=0, in some cases zero is returned in HL. This means that there 
is only  one kind of the format and no prompt is required. There is no way of 
knowing  what  disk  format  a  particular  choice  refers to  since this  is 
dependant on the particular disk driver.

   If A=01h...09h then this is interpreted as a format choice and a disk will
be formatted  in the  specified drive  with no further prompting. Register HL 
and  DE must specify a buffer area to be used by the disk driver. There is no 
way of  knowing how big this buffer should be so it is best to make it as big 
as  possible. If  the buffer  crosses page boundaries then this function will 
select the largest portion of it which is in one page for passing to the disk 
driver. Many disk drivers do not use this buffer at all.


   If  A=FFh then  the disk  will not  actually be  formatted, but it will be 
given a  new boot  sector to  make the  disk a  true MSX-DOS  2 disk. This is 
designed  to update  old MSX-DOS 1.0 disks to have a volume id and thus allow 
the full  disk checking and undeletion which MSX-DOS 2 allows. The case A=FEh 
is  the  same  as  A=FFh  except that  only the  disk parameters  are updated 
correctly  and the  volume id does not overwrite the boot program. Also there 
are some  MSX-DOS 1.0  implementations which  put an incorrect boot sector on 
the  disk and  these disks  cannot be  used by MSX-DOS 2 until they have been 
corrected by this function.

   The  "new  boot  sector"  function  is mainly  intended for  the "FIXDISK" 
utility program, but may be used by other programs if they find it useful. If 
it  is used  then a  "get format  choice" function  call (A=0) should be done 
first and  if this  returns an  error (typically ".IFORM") then the operation 
should be aborted because this is a drive which does not like to be formatted 
and the disk could be damaged by this function.
 
  3.84   CREATE OR DESTROY RAMDISK (68H)

     Parameters:    C = 68H (_RAMD) 
                    B =     00H => destroy RAM disk
                        1...FEH => create new RAM disk
                            FFH => return RAM disk size
     Results:       A = Error
                    B = RAM disk size

   If  register B=0FFh  then this  routine just returns the number of 16k RAM
segments which  are allocated  to the  RAM disk  currently. A  value of  zero 
indicates  that  there  is no  RAM disk  currently defined.  If B=0  then the 
current  RAM disk  will be destroyed, loosing all data which it contained and 
no error will be returned if there was no RAM disk.

   Otherwise, if  B is in the range 01h...FEh then this function will attempt
to  create a  new RAM  disk using  the number  of 16k  segments specified  in 
register  B.  An  error  will  be  returned if  there is  already a  RAM disk 
(".RAMDX") or  if there is not even one segment free (".NORAM"). If there are 
insufficient  free RAM segments to make a RAM disk of the specified size then 
the largest one possible will be created. No error is returned in this case.
 
   In  all cases the size of the RAM disk will be returned in register B as a
number of segments. Note that some of the RAM is used for the file allocation 
tables and  the root  directory so  the size  of the RAM disk as indicated by 
"DIR" or "CHKDSK" will be somewhat smaller than the total amount of RAM used. 
The  RAM will  always be  assigned the  drive letter  "H:" regardless  of the 
number of drives in the system.

  3.85   ALLOCATE SECTOR BUFFERS (69H)

     Parameters:    C = 69H (_BUFFER) 
                    B = 0 => return number of buffers
                        else number of buffers required
     Results:       A = Error
                    B = Current number of buffers 

   If  B=0 then this function just returns the number of sector buffers which
are currently  allocated. If B<>0 then this function will attempt to use this 
number  of sector  buffers (must always be at least 2). If it cannot allocate 
as many as requested then it will allocate as many as possible and return the 
number in  register B  but will  not return  an error.  The number  of sector 
buffers can be reduced as well as increased.

   The  sector buffers  are allocated in a 16k RAM segment outside the normal 
64k so  the number  of buffers  does not  detract from  the size  of the TPA. 
However  the number of buffers does affect efficiency since with more buffers 
allow more  FAT and directory sectors to be kept resident. The maximum number 
of buffers will be about 20.

  3.86   LOGICAL DRIVE ASSIGNMENT (6AH)

     Parameters:    C = 6AH (_ASSIGN) 
                    B = Logical drive number (1=A: etc)
                    D = Physical drive number (1=A: etc)
     Results:       A = Error
                    D = Physical drive number (1=A: etc)

   This  function controls the logical to physical drive assignment facility.
It is  primarily intended for the "ASSIGN" command although user programs may 
want to use it to translate logical drive numbers to physical drive numbers.

   If both  B and  D are  non-zero then  a new  assignment will be set up. If 
register  B is  non-zero and  register D  is zero then any assignment for the 
logical drive  specified by B will be cancelled. If both register B and D are 
zero  then all  assignments will  be cancelled. If register B is non-zero and 
register D is FFh then the current assignment for the logical drive specified 
by register B will simply be returned in register D.

   All  drives used  in the  various function calls, including drive names in 
strings  and  drive  numbers  as parameters  to function  calls, are  logical 
drives. However  the drive number passed to disk error routines is a physical 
drive  so  if  "ASSIGN"  has  been  used  these  may  be  different  from the 
corresponding logical drive.

  3.87   GET ENVIRONMENT ITEM (6BH)

     Parameters:    C = 6BH (_GENV)
                   HL = ASCIIZ name string
                   DE = Pointer to buffer for value
                    B = Size of buffer
     Results:       A = Error
                   DE = Preserved, buffer filled in if A=0

   This function gets the current value of the environment item whose name is 
passed  in register  HL. A  ".IENV" error  is returned  if the name string is 
invalid. If there is no environment item of that name then a null string will 
be returned  in the  buffer. If  there is an item of that name then its value 
string  will be  copied to  the buffer.  If the  buffer is too small then the 
value string  will be truncated with no terminating null and a ".ELONG" error 
will  be returned. A buffer 255 bytes will always be large enough since value 
strings cannot be longer than this (including the terminating null).

  3.88   SET ENVIRONMENT ITEM (6CH)

     Parameters:    C = 6CH (_SENV)
                   HL = ASCIIZ name string
                   DE = ASCIIZ value string
     Results:       A = Error

   This  function sets  a new environment item. If the name string is invalid
then a ".IENV" error is returned, otherwise the value string is checked and a 
".ELONG" error  returned if  it is  longer than 255 characters, or a ".NORAM" 
error  if there  is insufficient memory to store the new item. If all is well 
then any  old item  of this  name is deleted and the new item is added to the 
beginning  of the  environment list.  If the  value string  is null  then the 
environment item will be removed.

  3.89   FIND ENVIRONMENT ITEM (6DH)

     Parameters:    C = 6DH (_FENV)
                   DE = Environment item number
                   HL = Pointer to buffer for name string
     Results:       A = Error
                   HL = Preserved, buffer filled in

   This  function is  used to  find out  what environment items are currently 
set. The  item number  in register DE identifies which item in the list is to 
be  found (the  first item  corresponds to  DE=1). If there is an item number 
<DE> then the name string of this item will be copied into the buffer pointed 
to by  HL. If the buffer is too small then the name will be truncated with no 
terminating null, and a ".ELONG" error returned. A 255 byte buffer will never 
be  too small.  If there  is no  item number  <DE> then a null string will be 
returned, since an item can never have a null name string.

  3.90   GET/SET DISK CHECK STATUS (6EH)

     Parameters:    C = 6EH (_DSKCHK)
                    A = 00H => get disk check status
                        01H => set disk check status
                    B = 00H => enable (only if A=01H)
                        FFH => disable (only if A=01H)
     Results:       A = Error
                    B = Current disk check setting

   If A=0  then the  current value  of the disk check variable is returned in 
register  B. If  A=01h then the variable is set to the value in register B. A 
value of 00h means that disk checking is enabled and a non-zero means that it 
is disabled. The default state is enabled.

   The disk check variable controls whether the system will re-check the boot
sector of  a disk  to see  whether it  has changed,  each time a file handle, 
fileinfo  block  or  FCB  is  accessed.  If  it is  enabled then  it will  be 
impossible  to accidentally  access the  wrong disk by changing a disk in the 
middle of  an operation,  otherwise this will be possible and may result in a 
corrupted  disk. Depending  on the  type of disk interface, there may be some 
additional overhead  in having  this feature enabled although with many types 
of  disk (those with explicit disk change detection hardware) it will make no 
difference and the additional security is well worth having.

  3.91   GET MSX-DOS VERSION NUMBER (6FH)

     Parameters:    C = 6FH (_DOSVER)
     Results:       A = Error (always zero)
                   BC = MSX-DOS kernel version
                        DE = MSXDOS2.SYS version number

   This function allows a program to determine which version of MSX-DOS it is
running  under. Two  version numbers  are returned, one in BC for the MSX-DOS 
kernel in  ROM and  the other  is DE for the MSXDOS2.SYS system file. Both of 
these  version numbers  are BCD  values with  the major version number in the 
high byte  and the  two digit  version number in the low byte. For example if 
there were a version 2.34 of the system, it would be represented as 0234h.

   For compatibility  with MSX-DOS 1.0, the following procedure should always
be followed in using this function. Firstly if there is any error (A<>0) then 
it  is not  MSX-DOS at  all. Next  look at register B. If this is less than 2 
then the system is earlier than 2.00 and registers C and DE are undefined. If 
register B  is 2 or greater then registers BC and DE can be used as described 
above.  In general  the version  number which  should be  checked (after this 
procedure) is the MSXDOS2.SYS version in register DE.

  3.92   GET/SET REDIRECTION STATE (70H)

     Parameters:    C = 70H (_REDIR)
                    A = 00H => get redirection state
                        01H => set redirection state
                    B = New state.   b0 - standard input
                                     b1 - standard output
     Results:       A = Error
                    B = Redirection state before command
                         b0 set => input is redirected
                         b1 set => output is redirected

   This  function is  provided primarily  for disk  error routines  and other 
character  I/O  which  must  always  go  to  the  console  regardless  of any 
redirection.  When  the CP/M  character functions  (functions 01h...0Bh)  are 
used, they  normally refer  to the  console. However if the standard input or 
output file handles (file handles 0 and 1) have been closed and reopened to a 
disk  file, then  the CP/M character functions will also go to the disk file. 
However certain output such as disk error output must always go to the screen 
regardless.

   This  function allows  any such redirection to be temporarily cancelled by 
calling this  function with A=1 and B=0. This will ensure that any subsequent 
CP/M  console I/O  will go  to the console, and will also return the previous 
setting so  that this  can be  restored afterwards.  The system is a somewhat 
unstable  state when  the redirection  state has  been altered  like this and 
there are  many function  calls which  will reset the redirection to its real 
state   over-riding  this  function.  In  general  any  function  call  which 
manipulates file  handles, such  as "open",  "close", "duplicate"  and so on, 
will  reset the  redirection state.  The effect of this function is therefore 
purely temporary.

    

Index

Vorige

Volgende