Files
DR-DOS-OpenDOS/IBMDOS/BIN/FCBS.LST
2020-11-04 23:59:28 +01:00

1681 lines
103 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 1
= 0001 __RASM__ EQU 1
title 'FCB - DOS file system FCB support'
; File : $FCBS.A86$
;
; Description :
;
; Original Author : DIGITAL RESEARCH
;
; Last Edited By : $CALDERA$
;
;-----------------------------------------------------------------------;
; Copyright Work of Caldera, Inc. All Rights Reserved.
;
; THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
; PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
; ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
; WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
; THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
; HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
; AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
; AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
; COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
; CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
; TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
; CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
; AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
; CIVIL LIABILITY.
;-----------------------------------------------------------------------;
;
; *** Current Edit History ***
; *** End of Current Edit History ***
; $Log$
; FCBS.A86 1.10 93/11/11 15:38:14
; Chart Master fix - fcb_readblk over > 64k is truncated to 64k and
; error 2 (Segment boundry overlap) is returned
; FCBS.A86 1.9 93/10/18 17:37:06
; fix for >255 open files (PNW Server)
; ENDLOG
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 2
= eject ! include i:fdos.equ
= ; File : $FDOS.EQU$
= ;
= ; Description :
= ;
= ; Original Author : DIGITAL RESEARCH
= ;
= ; Last Edited By : $CALDERA$
= ;
= ;-----------------------------------------------------------------------;
= ; Copyright Work of Caldera, Inc. All Rights Reserved.
= ;
= ; THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
= ; PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
= ; ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
= ; WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
= ; THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
= ; HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
= ; AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
= ; AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
= ; COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
= ; CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
= ; TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
= ; CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
= ; AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
= ; CIVIL LIABILITY.
= ;-----------------------------------------------------------------------;
= ;
= ; *** Current Edit History ***
= ; *** End of Current Edit History ***
= ;
= ; $Log$
= ;
= ; ENDLOG
= ;
= ; Structure of Buffer Control Blocks
= ; ----------------------------------
= ; These BCBs immediately preceed the data buffers. BCBs are
= ; always shared for all drives and therefore must be big
= ; enough for the largest drive.
= ;
=
= 0000 BCB_NEXT equ word ptr 00h ; link to next buffer
= 0002 BCB_PREV equ word ptr 02h ; link to previous buffer
= 0004 BCB_DRV equ byte ptr 04h ; drive of this buffer or 0FFh
= 0005 BCB_FLAGS equ byte ptr 05h ; buffer flags
= 0006 BCB_REC equ word ptr 06h ; low 16 bits of sector address
= 0008 BCB_REC2 equ byte ptr 08h ; top 8 bits of record address
= 000A BCB_COPIES equ byte ptr 0Ah ; number of copies to write
= 000B BCB_SEPARATION equ word ptr 0Bh ; # sectors copies are apart
= 000D BCB_DDSC equ dword ptr 0Dh ; DWORD ptr to DDSC_
= 0011 BCB_REMOTE equ word ptr 11h ; remote in-use count
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 3
= 0014 BCB_DATA equ byte ptr 14h ; buffer data
=
= 0002 BF_ISFAT equ 0002h ; buffer marked as FAT sector
= 0004 BF_ISDIR equ 0004h ; buffer marked as Directory sector
= 0008 BF_ISDAT equ 0008h ; buffer marked as Data sector
= 0040 BF_DIRTY equ 0040h ; buffer marked as modified
= 0080 BF_REMOTE equ 0080h ; buffer is remote
=
= 0FF6 MAX12 equ 0FF6h ; max. disk size w/ 12-bit media
=
= ; Structure of Hash Control Block
= ; -------------------------------
= ; Each hash control block refers to the hash codes of one
= ; disrectory cluster or a root directory.
=
= 0000 HCB_LINK equ word ptr 0 ; link to next control block
= 0002 HCB_DRV equ byte ptr 2 ; drive for this entry or 0FFh
= 0004 HCB_CLU equ word ptr 4 ; cluster number or 0000 if root
= 0006 HCB_CNT equ word ptr 6 ; number of hashed entries
= 0008 HCB_DATA equ word ptr 8 ; hash buffer data
=
=
= ; Structure of DOS FCB
= ; --------------------
= ; This is hopefully consistent with what DOS stores in an
= ; open file control block for DOS 1.x functions
=
= 0000 MSF_EXTFLG equ byte ptr 0 ; if this is 0xFF, skip 1st 7 byte
= 0006 MSF_ATTRIB equ byte ptr 6 ; file attributes if MSF_EXTFLG
= 0000 MSF_DRIVE equ byte ptr 0 ; 1st byte normally drive code
= 0001 MSF_NAME equ byte ptr 1 ; 8-bit ASCII file name, 11 characters
= 000C MSF_BLOCK equ word ptr 12 ; current block number
= 000E MSF_RECSIZE equ word ptr 14 ; current logical record size
= 0010 MSF_SIZE equ word ptr 16 ; 32-bit file size
= 0014 MSF_DATE equ word ptr 20 ; last date stamp
= 0016 MSF_TIME equ word ptr 22 ; last time stamp
= 0018 MSF_IFN equ byte ptr 24 ;; internal file number
= 0019 MSF_IOCTL equ byte ptr 25 ;; file status
= 001A MSF_BLOCK1 equ word ptr 26 ;; 1st block of file
= 001C MSF_DBLK equ word ptr 28 ;; directory block
= 001C MSF_DEVPTR equ dword ptr 28 ;; address of device driver
= 001E MSF_DCNT equ word ptr 30 ;; directory count
= 0020 MSF_CR equ byte ptr 32 ; current sequential record
= 0021 MSF_RR equ word ptr 33 ; random record address (3 or 4 byte)
= 0023 MSF_RR2 equ byte ptr 35 ; random record overflow
=
=
= ; Structure of DOS DPB
= ; --------------------
= ; The layout of this structure is a guess based on
= ; examples. It is returned by PC MODE on functions 1Fh and
= ; 32h and is required by various disk-related utilities
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 4
= ; like disk editors and CHKDSK.
=
= 0000 DDSC_UNIT equ byte ptr 0 ; absolute drive number
= 0001 DDSC_RUNIT equ byte ptr 1 ; relative unit number
= 0002 DDSC_SECSIZE equ word ptr 2 ; sector size in bytes
= 0004 DDSC_CLMSK equ byte ptr 4 ; sectors/cluster - 1
= 0005 DDSC_CLSHF equ byte ptr 5 ; log2 (sectors/cluster)
= 0006 DDSC_FATADDR equ word ptr 6 ; sector address of FAT
= 0008 DDSC_NFATS equ byte ptr 8 ; # of FAT copies
= 0009 DDSC_DIRENT equ word ptr 9 ; size of root directory
= 000B DDSC_DATADDR equ word ptr 11 ; sector address of cluster #2
= 000D DDSC_NCLSTRS equ word ptr 13 ; # of clusters on disk
= 000F DDSC_NFATRECS equ word ptr 15 ; # of sectors per FAT
= 0011 DDSC_DIRADDR equ word ptr 17 ; sector address of root dir
= 0013 DDSC_DEVHEAD equ dword ptr 19 ; device driver header
= 0013 DDSC_DEVOFF equ word ptr 19
= 0015 DDSC_DEVSEG equ word ptr 21
= 0017 DDSC_MEDIA equ byte ptr 23 ; current media byte
= 0018 DDSC_FIRST equ byte ptr 24 ; "drive never accessed" flag
= 0019 DDSC_LINK equ dword ptr 25 ; next drive's DDSC
= 001D DDSC_BLOCK equ word ptr 29 ; next block to allocate
= 001F DDSC_FREE equ word ptr 31 ; total free clusters on drive
= 0021 DDSC_LEN equ 33
=
=
=
= ; DELWATCH hooks called by OS
=
= 0000 DELW_RDMASK equ 0 ; delete dir search mask
= 0002 DELW_DELETE equ 2 ; delete this dir entry
= 0003 DELW_FREECLU equ 3 ; free some clusters
= 0004 DELW_FREERD equ 4 ; free root dir entry
= 0005 DELW_SPACE equ 5 ; add "deletes" to free space
= 0007 DELW_NEWDISK equ 7 ; new disk logged in
= 000E DELW_PURGE equ 14 ; perge pd file
= 000F DELW_UNDEL equ 15 ; undelete pd file
=
= ; SuperStore hook called by OS
=
= 0010 SSTOR_SPACE equ 10h ; enquire # physical free space
=
= ; Password hooks called by OS
=
= 0020 PASSWD_CREAT equ 20h ; initialise an entry
= 0021 PASSWD_CHMOD equ 21h ; change an entry
= 0022 PASSWD_CHECK equ 22h ; check an entry
=
= ; Share hooks in PCMODE data segment
= ;
= ; These point to a stub which does a "STC, RETF"
= ;
=
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 5
= 000F NUM_SHARE_STUB_ENTRIES equ 15
=
= 0000 S_LOCKS equ DWORD*0 ; share lock/unlock region
= 0004 S_UPDATE equ DWORD*1 ; update DHNDL from share
= 0008 S_RECORD equ DWORD*2 ; update share from DHNDL
= 000C S_FDOSRW equ DWORD*3 ; validate proposed operation
= 0010 S_DISCARD equ DWORD*4 ; discard all files on drive
= 0014 S_OPEN equ DWORD*5 ; files is opening, remember it
= 0018 S_CLOSE equ DWORD*6 ; files is closing, forget it
= 001C S_OM_COMPAT equ DWORD*7 ; check open mode compatible
= 0020 S_CLOSE_IF_OPEN equ DWORD*8 ; close if compat open, else deny
= 0024 S_DENY_IF_OPEN equ DWORD*9 ; deny if open shared/by others
= 0028 S_GET_LIST_ENTRY equ DWORD*10 ; get open file list entry
= 002C S_CLOSE_FILES equ DWORD*11 ; close all files for given PSP/UID
=
= ; struct dirfcb
=
= 0000 DNAME equ byte ptr 0 ;file name & type
= 000B DATTS equ byte ptr 11
= 0001 DA_RO equ 01h ; 0x01 - read/only
= 0002 DA_HIDDEN equ 02h ; 0x02 - hidden
= 0004 DA_SYSTEM equ 04h ; 0x04 - system
= 0008 DA_VOLUME equ 08h ; 0x08 - volume label
= 0010 DA_DIR equ 10h ; 0x10 - sub-directory
= 0020 DA_ARCHIVE equ 20h ; 0x20 - archive
= 0080 DA_CLUSTER equ 80h ; 0x80 - return starting cluster from search (API ex
tenti
= 0080 DA_DELWATCH equ 80h ; 0x88 - return pending delete files
= 00D8 DA_FIXED equ 11011000b ; can't CHMOD label, dir, unused bits
= FF27 DA_CHANGE equ not DA_FIXED ; all others are changeable
=
= ;DATTS2 equ 12 ;CP/M attributes
= ; ; 0x80 - f1' modify default open rules
= ; ; 0x40 - f2' partial close default
= ; ; 0x20 - f3' ignore close checksum errors
= ; ; 0x10 - f4' disable checksums
= ; ; 0x08 - (reserved)
= ; ; 0x04 - DELETE password
= ; ; 0x02 - WRITE password
= ; ; 0x01 - READ password
= 000D DUNDEL equ 13 ;1st letter of deleted file
= 000E DPWD equ word ptr 14 ;16-bit password hash code
= 0010 DMODTIME equ word ptr 16 ;delwatch time (hhhhhmmmmmmsssss)
= 0012 DMODDATE equ word ptr 18 ;delwatch date (yyyyyyymmmmddddd)
= ;DRECSIZE equ 16 ;FlexOS record size
= ;DUSER equ 18 ;FlexOS user ID of creator
= ;DGROUP equ 19 ;FlexOS group ID of creator
= 0014 DPWM equ word ptr 20 ;FlexOS access rights
= 0016 DTIME equ 22 ;time (hhhhhmmmmmmsssss)
= 0018 DDATE equ 24 ;date (yyyyyyymmmmddddd)
= 001A DBLOCK1 equ 26 ;first block in file
= 001C DSIZE equ 28 ;current file size
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 6
=
= ; DOS Media Password Definitions
= ; ------------------------------
=
= 000F PWM_OWNER equ 000Fh ; PWD Owner mask
= 00F0 PWM_GROUP equ 00F0h ; PWD Group mask
= 0F00 PWM_WORLD equ 0F00h ; PWD World mask
= 0888 PWM_R equ 0888h ; PWD required for reading
= 0444 PWM_W equ 0444h ; PWD required for writing
= 0222 PWM_E equ 0222h ; PWD req'd for executing
= 0111 PWM_D equ 0111h ; PWD required for deleting
= 0DDD PWM_ANY equ PWM_R+PWM_W+PWM_D ; PWD required for anything
=
=
= ; literal constants
=
= 0FFF FAT12 equ 00fffh ; 12 bit fat
= FFFF FAT16 equ 0ffffh ; 16 bit fat
=
= FFFF ENDDIR equ 0ffffh ;end of directory
=
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 7
= eject ! include i:msdos.equ
= ; File : $MSDOS.EQU$
= ;
= ; Description :
= ;
= ; Original Author : DIGITAL RESEARCH
= ;
= ; Last Edited By : $CALDERA$
= ;
= ;-----------------------------------------------------------------------;
= ; Copyright Work of Caldera, Inc. All Rights Reserved.
= ;
= ; THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
= ; PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
= ; ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
= ; WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
= ; THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
= ; HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
= ; AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
= ; AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
= ; COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
= ; CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
= ; TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
= ; CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
= ; AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
= ; CIVIL LIABILITY.
= ;-----------------------------------------------------------------------;
= ;
= ; *** Current Edit History ***
= ; *** End of Current Edit History ***
= ;
= ; $Log$
= ;
= ; ENDLOG
=
=
= 0000 MS_P_TERMCPM equ 00H
= 0001 MS_C_READ equ 01H
= 0002 MS_C_WRITE equ 02H
= 0003 MS_A_READ equ 03H
= 0004 MS_A_WRITE equ 04H
= 0005 MS_L_WRITE equ 05H
= 0006 MS_C_RAWIO equ 06H
= 0007 MS_C_RAWIN equ 07H
= 0008 MS_C_NOECHO equ 08H
= 0009 MS_C_WRITESTR equ 09H
= 000A MS_C_READSTR equ 0aH
= 000B MS_C_STAT equ 0bH
= 000C MS_C_FLUSH equ 0cH
= 000D MS_DRV_ALLRESET equ 0dH
= 000E MS_DRV_SET equ 0eH
= 000F MS_F_OPEN equ 0fH
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 8
= 0010 MS_F_CLOSE equ 10H
= 0011 MS_F_SFIRST equ 11H
= 0012 MS_F_SNEXT equ 12H
= 0013 MS_F_DELETE equ 13H
= 0014 MS_F_READ equ 14H
= 0015 MS_F_WRITE equ 15H
= 0016 MS_F_MAKE equ 16H
= 0017 MS_F_RENAME equ 17H
= 0019 MS_DRV_GET equ 19H
= 001A MS_F_DMAOFF equ 1aH
= 001B MS_DRV_ALLOC equ 1bH
= 001C MS_DRV_ALLOCSPEC equ 1cH
= 0021 MS_F_READRAND equ 21H
= 0022 MS_F_WRITERAND equ 22H
= 0023 MS_F_SIZE equ 23H
= 0024 MS_F_RANDREC equ 24H
= 0025 MS_S_SETINT equ 25H
= 0026 MS_P_MKPSP equ 26H
= 0027 MS_F_READBLK equ 27H
= 0028 MS_F_WRITEBLK equ 28H
= 0029 MS_F_PARSE equ 29H
= 002A MS_T_GETDATE equ 2aH
= 002B MS_T_SETDATE equ 2bH
= 002C MS_T_GETTIME equ 2cH
= 002D MS_T_SETTIME equ 2dH
= 002E MS_F_VERIFY equ 2eH
= 002F MS_F_DMAGET equ 2fH
= 0030 MS_S_BDOSVER equ 30H
= 0031 MS_P_TERMKEEP equ 31H
= 0033 MS_S_BREAK equ 33H
= 0035 MS_S_GETINT equ 35H
= 0036 MS_DRV_SPACE equ 36H
= 0038 MS_S_COUNTRY equ 38H
= 0039 MS_X_MKDIR equ 39H
= 003A MS_X_RMDIR equ 3aH
= 003B MS_X_CHDIR equ 3bH
= 003C MS_X_CREAT equ 3cH
= 003D MS_X_OPEN equ 3dH
= 003E MS_X_CLOSE equ 3eH
= 003F MS_X_READ equ 3fH
= 0040 MS_X_WRITE equ 40H
= 0041 MS_X_UNLINK equ 41H
= 0042 MS_X_LSEEK equ 42H
= 0043 MS_X_CHMOD equ 43H
= 0044 MS_X_IOCTL equ 44H
= 0045 MS_X_DUP equ 45H
= 0046 MS_X_DUP2 equ 46H
= 0047 MS_X_CURDIR equ 47H
= 0048 MS_M_ALLOC equ 48H
= 0049 MS_M_FREE equ 49H
= 004A MS_M_SETBLOCK equ 4aH
= 004B MS_X_EXEC equ 4bH
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 9
= 004C MS_X_EXIT equ 4cH
= 004D MS_X_WAIT equ 4dH
= 004E MS_X_FIRST equ 4eH
= 004F MS_X_NEXT equ 4fH
= 0050 MS_P_SETPSP equ 50H
= 0054 MS_F_GETVERIFY equ 54H
= 0056 MS_X_RENAME equ 56H
= 0057 MS_X_DATETIME equ 57H
= 0058 MS_M_STRATEGY equ 58h
= 0059 MS_F_ERROR equ 59H
= 005A MS_X_MKTEMP equ 5aH
= 005B MS_X_MKNEW equ 5bH
= 005C MS_F_LOCK equ 5cH
= 0060 MS_X_EXPAND equ 60H
= 0062 MS_P_GETPSP equ 62H
= 6601 MS_X_GETCP equ 6601h
= 6602 MS_X_SETCP equ 6602h
= 0067 MS_X_SETHC equ 67h
= 0068 MS_X_COMMIT equ 68h
=
= 0021 DOS_INT equ 21h ; DOS Entry Point
= ;
= 0000 STDIN equ 0 ; Standard Console Input Handle
= 0001 STDOUT equ 1 ; Standard Console Output Handle
= 0002 STDERR equ 2 ; Standard Error Output
= 0003 STDAUX equ 3 ; Auxilary Device Handle
= 0004 STDPRN equ 4 ; Printer Device Handle
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 10
= eject ! include i:mserror.equ
= ; File : $MSERROR.EQU$
= ;
= ; Description :
= ;
= ; Original Author : DIGITAL RESEARCH
= ;
= ; Last Edited By : $CALDERA$
= ;
= ;-----------------------------------------------------------------------;
= ; Copyright Work of Caldera, Inc. All Rights Reserved.
= ;
= ; THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
= ; PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
= ; ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
= ; WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
= ; THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
= ; HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
= ; AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
= ; AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
= ; COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
= ; CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
= ; TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
= ; CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
= ; AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
= ; CIVIL LIABILITY.
= ;-----------------------------------------------------------------------;
= ;
= ; *** Current Edit History ***
= ; *** End of Current Edit History ***
= ;
= ; $Log$
= ;
= ; ENDLOG
=
= FFFF ED_FUNCTION equ -01 ; invalid function number
= FFFE ED_FILE equ -02 ; file not found
= FFFD ED_PATH equ -03 ; path not found
= FFFC ED_HANDLE equ -04 ; too many open files
= FFFB ED_ACCESS equ -05 ; file access denied
= FFFA ED_H_MATCH equ -06 ; invalid handle number
= FFF9 ED_DMD equ -07 ; memory descriptor destroyed
= FFF8 ED_MEMORY equ -08 ; insufficient memory
= FFF7 ED_BLOCK equ -09 ; invalid memory block addr
= FFF6 ED_ENVIRON equ -10 ; invalid environment
= FFF5 ED_FORMAT equ -11 ; invalid format
= FFF4 ED_ACC_CODE equ -12 ; invalid access code
= FFF3 ED_DATA equ -13 ; invalid data
= FFF1 ED_DRIVE equ -15 ; invalid drive specified
= FFF0 ED_DIR equ -16 ; can't remove current dir
= FFEF ED_DEVICE equ -17 ; not same device
= FFEE ED_ROOM equ -18 ; no more files
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 11
=
= FFED ED_PROTECT equ -19 ; disk write protected
= FFEC ED_BADUNIT equ -20 ; invalid drive specified
= FFEB ED_NOTREADY equ -21 ; drive doesn't respond
= FFEA ED_BADCMD equ -22 ; invalid command to driver
= FFE9 ED_BADDATA equ -23 ; data CRC error
= FFE8 ED_BADRHLEN equ -24 ; (shouldn't happen)
= FFE7 ED_BADSEEK equ -25 ; can't seek to track
= FFE6 ED_BADMEDIA equ -26 ; unrecognizable medium
= FFE5 ED_RNF equ -27 ; record/sector not found
= FFE4 ED_NOPAPER equ -28 ; printer error
= FFE3 ED_WRFAIL equ -29 ; write failed
= FFE2 ED_RDFAIL equ -30 ; read failed
= FFE1 ED_GENFAIL equ -31 ; anything failed
= FFE0 ED_SHAREFAIL equ -32 ; sharing conflict
= FFDF ED_LOCKFAIL equ -33 ; locking conflict
= FFDE ED_DISKCHG equ -34 ; invalid disk change
= FFDD ED_NOFCBS equ -35 ; FCB table exhausted
= FFDC ED_NOLOCKS equ -36 ; lock list items exhausted
= FFCE ED_NET equ -50 ; Network Request Not Supported
=
= FFBF ED_NETACCESS equ -65 ; file access denied
=
= FFB7 ED_NETPWD equ -73 ; Server Password Error
= FFB6 ED_NETVER equ -74 ; Incorrect Server version
= FFB5 ED_NETREQ equ -75 ; No Local Network Resources
= FFB4 ED_NETTIME equ -76 ; Network Time Out Error
= FFB3 ED_NETCOMM equ -77 ; Network Communications Error
= FFB2 ED_NETSRVR equ -78 ; No Server Network Resources
= FFB1 ED_NETLOG equ -79 ; Server Not Logged In
=
= FFB0 ED_EXISTS equ -80 ; file already exists
= FFAE ED_MAKE equ -82 ; Cannot Make (Files ??)
= FFAD ED_FAIL equ -83 ; FAIL code returned from INT 24
= FFAC ED_STRUCT equ -84 ; Out of Structures
= FFAB ED_ASSIGN equ -85 ; Already Assigned
= FFAA ED_PASSWORD equ -86 ; Invalid Password
= FFA9 ED_PARAM equ -87 ; Invalid Parameter
= FFA8 ED_NETWRITE equ -88 ; Network write fault
= FFA7 ED_NETFUNC equ -89 ; Function not supported on network
= FFA6 ED_COMPONENT equ -90 ; system component not installed
= FFA6 ED_LASTERROR equ -90 ; Last Error Number Used
=
=
= 0001 CLASS_RESOURCE equ 1 ; Out of Resource
= 0002 CLASS_TEMP equ 2 ; Temporary Situation
= 0003 CLASS_AUTHOR equ 3 ; Authorization Error
= 0004 CLASS_INTERNAL equ 4 ; Internal System Software Error
= 0005 CLASS_HARDWARE equ 5 ; Hardware Failure
= 0006 CLASS_SYSTEM equ 6 ; Serious System Failure
= 0007 CLASS_APPLIC equ 7 ; Application Program Error
= 0008 CLASS_LOST equ 8 ; File/Item Not Found
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 12
= 0009 CLASS_FORMAT equ 9 ; File/Item Illegal Format
= 000A CLASS_LOCKED equ 10 ; File/Item Locked
= 000B CLASS_MEDIA equ 11 ; Media Failure
= 000C CLASS_EXISTS equ 12 ; Item Already Exists
= 000D CLASS_UNKNOWN equ 13 ; Unknown Classification
=
= 0001 ACT_RETRY equ 1 ; Retry a few times then prompt user
= 0002 ACT_DELAY equ 2 ; Delay then as ACT_RETRY
= 0003 ACT_USER equ 3 ; Prompt user to re-enter data
= 0004 ACT_ABORT equ 4 ; Clean Up then ABORT the process
= 0005 ACT_TERM equ 5 ; Terminate immeadiately NO CLEAN UP
= 0006 ACT_IGNORE equ 6 ; Ignore the Error
= 0007 ACT_URETRY equ 7 ; Retry the error after user intervention
=
= 0001 LOC_UNKNOWN equ 1 ; Unknown error location
= 0002 LOC_BLOCK equ 2 ; Block Device Failure
= 0003 LOC_NET equ 3 ; Network Failure
= 0004 LOC_CHAR equ 4 ; Related to Serial/Character devices
= 0005 LOC_MEMORY equ 5 ; Failure related to Memory
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 13
= eject ! include i:doshndl.def ; DOS Handle Structures
= ; File : $DOSHNDL.DEF$
= ;
= ; Description :
= ;
= ; Original Author : DIGITAL RESEARCH
= ;
= ; Last Edited By : $CALDERA$
= ;
= ;-----------------------------------------------------------------------;
= ; Copyright Work of Caldera, Inc. All Rights Reserved.
= ;
= ; THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
= ; PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
= ; ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
= ; WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
= ; THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
= ; HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
= ; AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
= ; AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
= ; COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
= ; CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
= ; TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
= ; CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
= ; AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
= ; CIVIL LIABILITY.
= ;-----------------------------------------------------------------------;
= ;
= ; *** Current Edit History ***
= ; *** End of Current Edit History ***
= ;
= ; $Log$
= ;
= ; ENDLOG
=
= 0000 DCNTRL_DSADD equ dword ptr 0000h
= 0000 DCNTRL_DSOFF equ word ptr 0000h
= 0002 DCNTRL_DSSEG equ word ptr 0002h
= 0004 DCNTRL_COUNT equ word ptr 0004h
= 0006 DCNTRL_LEN equ 6
=
= 0000 DHNDL_COUNT equ word ptr 00h ; 00 - Usage Count
= 0002 DHNDL_MODE equ word ptr 02h ; 02 - File Mode
=
= 8000 DHM_FCB equ 8000h ; marks as FCB
= 4000 DHM_COMMIT equ 4000h ; auto-commit file
= 2000 DHM_NOCRIT equ 2000h ; no critical errors
= 0080 DHM_LOCAL equ 10000000b ; file is not inherited
= 0070 DHM_SHAREMSK equ 01110000b ; sharing bits
= 0000 DHM_COMPAT equ 00000000b
= 0010 DHM_DENY_ALL equ 00010000b ; exclusive - deny all
= 0020 DHM_DENY_WRITE equ 00100000b
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 14
= 0030 DHM_DENY_READ equ 00110000b
= 0040 DHM_DENY_NONE equ 01000000b
= 000F DHM_RWMSK equ 00001111b ; read write bits
= 0002 DHM_RW equ 00000010b ; file opened read/write
= 0001 DHM_WO equ 00000001b ; file opened write only
= 0000 DHM_RO equ 00000000b ; file opened read only
=
= ;
= ; 01h to 03h To be Determined
= ;
= 0004 DHNDL_DATRB equ byte ptr 04h ; Disk attribute byte
= 0005 DHNDL_ATTR equ byte ptr 05h ; Attribute Byte
= 0005 DHNDL_WATTR equ word ptr 05h ; Attribute Word
=
= 8000 DHAT_REMOTE equ 8000h ; set if file remote
= 4000 DHAT_TIMEOK equ 4000h ; set if timestamp up to date
= 1000 DHAT_LOCAL equ 1000h ; file is not inherited
= 0800 DHAT_NETPRN equ 0800h ; device is networked printer
= 0080 DHAT_DEV equ 0080h ; device/file bit
= 0040 DHAT_READY equ 0040h ; ready/not ready bit
= 0040 DHAT_CLEAN equ 0040h ; this bit CLEAR if dirty
= 0020 DHAT_BIN equ 0020h ; raw/cooked bit
= 001F DHAT_DRVMSK equ 001Fh ; drive in bottom bits
= 0008 DHAT_CLK equ 0008h ; -reserved-
= 0004 DHAT_NUL equ 0004h ; handle is null device
= 0002 DHAT_COT equ 0002h ; handle is console output device
= 0001 DHAT_CIN equ 0001h ; handle is console input device
=
= 0007 DHNDL_DEVPTR equ dword ptr 07h ; 07 - pointer to device
= 0007 DHNDL_DEVOFF equ word ptr 07h ; 07 - offset of device
= 0009 DHNDL_DEVSEG equ word ptr 09h ; 09 - segment of device
= 000B DHNDL_BLK1 equ word ptr 0Bh ; 0B - first cluster in file
= 000D DHNDL_TIME equ word ptr 0Dh ; 0D - file time stamp
= 000F DHNDL_DATE equ word ptr 0Fh ; 0F - file date stamp
= 0011 DHNDL_SIZE equ dword ptr 11h ; 11 - file length
= 0011 DHNDL_SIZELO equ word ptr 11h
= 0013 DHNDL_SIZEHI equ word ptr 13h
= 0015 DHNDL_POS equ dword ptr 15h ; 15 - current file position
= 0015 DHNDL_POSLO equ word ptr 15h
= 0017 DHNDL_POSHI equ word ptr 17h
= 0019 DHNDL_IDX equ word ptr 19h ; 19 - relative cluster within file of last
read
= 001B DHNDL_DBLK equ word ptr 1Bh ; 1B - cluster # of dir entry
= 001E DHNDL_DCNTHI equ byte ptr 1Eh ; 1E - dir offset # within cluster
= 001F DHNDL_DCNTLO equ byte ptr 1Fh ; 1F - dir offset # within cluster
= 0020 DHNDL_NAME equ byte ptr 20h ; 20 - File/Device Name
= 0028 DHNDL_EXT equ byte ptr 28h ; 28 - File extension
= 002B DHNDL_SFT equ dword ptr 2Bh ; 2B - pointer to previous SFT
= 002F DHNDL_UID equ word ptr 2Fh ; 2F - Owning Machine ID
= 0031 DHNDL_PSP equ word ptr 31h ; 31 - Owning PSP
= 0033 DHNDL_SHARE equ word ptr 33h ; 33 - Offset of sharing record
= 0035 DHNDL_BLK equ word ptr 35h ; 35 - absolute cluster of last read
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 15
= ; 37 - dword reserved for IFS
= 003B DHNDL_LEN equ 3Bh
=
= ; With DOS 3 structures _DBLK is a 16 bit
=
=
= ; Logical Drive Table format
= 0000 LDT_NAME equ byte ptr 00h ; 00 - Ascii Name field
= 0043 LDT_FLAGS equ word ptr 43h ; 43 - Flag field
= 0045 LDT_PDT equ dword ptr 45h ; 45 - PDT for this drive
= 0049 LDT_BLK equ word ptr 49h ; 49 - directory sector
= 004B LDT_ROOT equ word ptr 4bh ; 4B - virtual block root
= 004D LDT_DRV equ byte ptr 4dh ; 4D - physical drive
= 004F LDT_ROOTLEN equ word ptr 4fh ; 4F - Length of root portion
= 0058 LDT_LEN equ 58h
=
= 8000 LFLG_NETWRKD equ 8000h
= 4000 LFLG_PHYSICAL equ 4000h
= 2000 LFLG_JOINED equ 2000h
= 1000 LFLG_SUBST equ 1000h
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 16
eject
BDOS_DATA dseg word
BDOS_CODE cseg
extrn ifn2dhndl:near
extrn parse_one:near
extrn fdos_entry:near
Public fdos_exit
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 17
eject
; TERMINATE CHILD (EXIT)
; +----+----+
; | 24 |
; +----+----+
; entry:
; ------
; -none-
; exit:
; -----
; -none-
; Close down all FCB handles associated with the current PSP
;
fdos_exit:
;---------
0000 1E push ds
0001 161F push ss ! pop ds ; DS -> PCM_DSEG
0003 2BC0 sub ax,ax ; start with first DHNDL_
fdos_exit10:
0005 E80000 E call ifn2dhndl ; get DHNDL_
0008 7238 0042 jc fdos_exit40 ; stop if we have run out
000A A30200 E mov fcb_pb+2,ax ; we may close this IFN
000D 50 push ax
000E 268B0F mov cx,es:DHNDL_COUNT[bx] ; get the open count
0011 E32A 003D jcxz fdos_exit30 ; skip if nothing to do
0013 A10000 E mov ax,current_psp ; get current PSP
0016 263B4731 cmp ax,es:DHNDL_PSP[bx] ; does it belong to this PSP
001A 7521 003D jne fdos_exit30
001C 36A10000 E mov ax,ss:machine_id ; get current process
0020 263B472F cmp ax,es:DHNDL_UID[bx]
0024 7517 003D jne fdos_exit30
0026 26F747020080 test es:DHNDL_MODE[bx],DHM_FCB
002C 740A 0038 jz fdos_exit20 ; skip close if not FCB
002E 06 push es
002F 53 push bx ; save the DHNDL
0030 B83E00 mov ax,MS_X_CLOSE
0033 E8DB04 0511 call fcb_fdos ; make the FDOS do the work
0036 5B pop bx
0037 07 pop es ; recover the DHNDL
fdos_exit20:
0038 26C7070000 mov es:DHNDL_COUNT[bx],0 ; always free the handle if it's ours
fdos_exit30:
003D 58 pop ax
003E FEC0 inc al ; onto next IFN
0040 75C3 0005 jnz fdos_exit10
fdos_exit40:
0042 1F pop ds
0043 C3 ret
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 18
Public fdos_fcb
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 19
eject
; GENERIC FCB FUNCTION (FCB)
; +----+----+----+----+----+----+----+----+
; | 22 | fcbadr | count |
; +----+----+----+----+----+----+----+----+
; | func |
; +----+----+
; entry:
; ------
; fcbadr: FCB address
; count: multi-sector count for read/write
; func: FCB sub-function
; exit:
; -----
; AX: return code or error code ( < 0)
fdos_fcb:
;--------
0044 8B5E02 mov bx,2[bp] ; BX -> parameter block
0047 8B5F08 mov bx,8[bx] ; get subfunction code
004A D1E3 shl bx,1 ; make it word index
004C 80EB1E sub bl,15*WORD ; adjust to base address
004F 721E 006F jc fcb_error ; reject if too low
0051 80FB12 cmp bl,FCB_MAX1 ; is it in 1st block
0054 720F 0065 jb fdos_fcb10
0056 80EB12 sub bl,(33-24)*WORD ; adjust for gap
0059 7214 006F jc fcb_error
005B 80FB1A cmp bl,FCB_MAX2 ; is it in 2nd block
005E 7205 0065 jb fdos_fcb10
0060 80EB04 sub bl,(39-37)*WORD ; adjust for gap
0063 720A 006F jc fcb_error
fdos_fcb10:
0065 83FB1E cmp bx,FCB_MAX3 ; check the range
0068 7305 006F jae fcb_error ; skip if invalid function
006A 2EFFA77300 R jmp fcb_table[bx] ; call the right function
fcb_error:
006F BBFFFF mov bx,ED_FUNCTION
0072 C3 ret
0073 9900 R fcb_table dw fcb_open ; 15-open file
0075 3001 R dw fcb_close ; 16-close file
0077 6001 R dw fcb_first ; 17-find first
0079 6801 R dw fcb_next ; 18-find next
007B 5801 R dw fcb_delete ; 19-delete file
007D 9E01 R dw fcb_read ; 20-read from file
007F 9901 R dw fcb_write ; 21-write to file
0081 9100 R dw fcb_make ; 22-make file
0083 4D01 R dw fcb_rename ; 23-rename file
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 20
0012 FCB_MAX1 equ (offset $ - offset fcb_table)
0085 3102 R dw fcb_readrand ; 33-read from file
0087 2C02 R dw fcb_writerand ; 34-write to file
0089 9602 R dw fcb_size ; 35-compute file size
008B 7901 R dw fcb_setrecord ; 36-set relative record
001A FCB_MAX2 equ (offset $ - offset fcb_table)
008D 5102 R dw fcb_readblk ; 39-read from file
008F 4C02 R dw fcb_writeblk ; 40-write to file
001E FCB_MAX3 equ (offset $ - offset fcb_table)
fcb_make:
;--------
0091 E8C302 0357 call fcb_path_prep ; build pathname
0094 B83C00 mov ax,MS_X_CREAT
0097 EB06 009F jmps fcb_open_make_common
fcb_open:
;--------
0099 E8BB02 0357 call fcb_path_prep ; build pathname
009C B83D00 mov ax,MS_X_OPEN
fcb_open_make_common:
009F C70606000280 E mov fcb_pb+6,DHM_RW+DHM_FCB ; open as an FCB for read/write
00A5 E86904 0511 call fcb_fdos ; lets try and open the file
00A8 7301 00AB jnc fcb_open10 ; skip if we can't
00AA C3 ret
fcb_open10:
00AB E80000 E call ifn2dhndl ; ES:BX -> DHNDL_ we have opened
00AE 1E push ds
00AF 0653 push es ! push bx ; save DHNDL_
00B1 E8E802 039C call fcb_point ; ES:BX = FCB
00B4 5E1F pop si ! pop ds ; DS:SI -> DHNDL_
00B6 26884718 mov es:MSF_IFN[bx],al ; store IFN away
00BA 26C7470C0000 mov es:MSF_BLOCK[bx],0 ; current block number
00C0 26C7470E8000 mov es:MSF_RECSIZE[bx],128 ; current logical record size
00C6 E83900 0102 call fcb_update ; update misc changing fields
00C9 8B4407 mov ax,ds:DHNDL_DEVOFF[si]
00CC 2689471C mov es:word ptr MSF_DEVPTR[bx],ax
00D0 8B4409 mov ax,ds:DHNDL_DEVSEG[si]
00D3 2689471E mov es:word ptr MSF_DEVPTR+2[bx],ax
00D7 8B440B mov ax,ds:DHNDL_BLK1[si]
00DA 2689471A mov es:MSF_BLOCK1[bx],ax
00DE 8A4405 mov al,ds:DHNDL_ATTR[si]
00E1 26884719 mov es:MSF_IOCTL[bx],al
00E5 268A07 mov al,es:MSF_DRIVE[bx] ; get drive from FCB
00E8 FEC8 dec al ; was absolute drive specified ?
00EA 7904 00F0 jns fcb_open20 ; if so use it
00EC 36A00000 E mov al,ss:current_dsk ; else use default drive
fcb_open20:
00F0 FEC0 inc al ; make drive 1 rather than 0 based
00F2 268807 mov es:MSF_DRIVE[bx],al ; drive code
if 0
test ds:DHNDL_DATRB[si],DA_VOLUME
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 21
else
00F5 36F706080008 E test ss:fcb_pb+8,DA_VOLUME
00 E
endif
00FC 1F pop ds
00FD 7531 0130 jnz fcb_close ; don't leave VOL label's open
00FF 33DB xor bx,bx ; no errors !
0101 C3 ret
fcb_update:
;----------
; On Entry:
; DS:SI -> DHNDL_
; ES:BX -> FCB
; On Exit:
; DATE/TIME/SIZE/DBLK/DCNT fields updated
;
0102 8B440D mov ax,ds:DHNDL_TIME[si]
0105 26894716 mov es:MSF_TIME[bx],ax
0109 8B440F mov ax,ds:DHNDL_DATE[si]
010C 26894714 mov es:MSF_DATE[bx],ax
0110 8B4411 mov ax,ds:DHNDL_SIZELO[si]
0113 26894710 mov es:MSF_SIZE[bx],ax
0117 8B4413 mov ax,ds:DHNDL_SIZEHI[si]
011A 26894712 mov es:MSF_SIZE+2[bx],ax
011E 8B441B mov ax,ds:DHNDL_DBLK[si]
0121 2689471C mov es:MSF_DBLK[bx],ax
0125 8A441F mov al,ds:DHNDL_DCNTLO[si]
0128 8A641E mov ah,ds:DHNDL_DCNTHI[si]
012B 2689471E mov es:MSF_DCNT[bx],ax
012F C3 ret
fcb_close:
;---------
; close file (DOS function 10h)
0130 E86902 039C call fcb_point ; ES:BX -> FCB
0133 B0FF mov al,0FFh
0135 263A4718 cmp al,es:MSF_IFN[bx] ; is it a multiple close ?
0139 740F 014A je fcb_fdos_common10 ; don't re-open for this...
013B E8A201 02E0 call fcb_handle_vfy ; verify we have a sensible handle
013E 26884718 mov es:MSF_IFN[bx],al ; mark FCB as closed (it will be)
0142 B83E00 mov ax,MS_X_CLOSE ; now close it
; jmps fcb_fdos_common
fcb_fdos_common:
;---------------
0145 E8C903 0511 call fcb_fdos ; make the FDOS do the work
0148 7202 014C jc fcb_fdos_common20 ; return any error codes
fcb_fdos_common10:
014A 33DB xor bx,bx ; else return zero
fcb_fdos_common20:
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 22
014C C3 ret
fcb_rename:
;----------
014D E80702 0357 call fcb_path_prep
0150 E8EE01 0341 call fcb_path2_prep
0153 B85600 mov ax,MS_X_RENAME ; it's a rename
0156 EBED 0145 jmps fcb_fdos_common
fcb_delete:
;----------
0158 E8FC01 0357 call fcb_path_prep
015B B84100 mov ax,MS_X_UNLINK ; it's a delete
015E EBE5 0145 jmps fcb_fdos_common
fcb_first:
;---------
0160 E8F401 0357 call fcb_path_prep ; prepare pathname
0163 B84E00 mov ax,MS_X_FIRST ; we want to search 1st
0166 EB06 016E jmps fcb_search_common
fcb_next:
;--------
0168 E88C03 04F7 call fcb_restore_search_state
016B B84F00 mov ax,MS_X_NEXT
fcb_search_common:
016E E8F502 0466 call fcb_search ; 0 of OK, otherwise ED_..
0171 7205 0178 jc fcb_search_common10
0173 E81503 048B call fcb_save_search_state ; save sucessful state
0176 33DB xor bx,bx ; return code in BX
fcb_search_common10:
0178 C3 ret
fcb_setrecord:
;-------------
0179 E82002 039C call fcb_point ; ES:BX -> FCB
017C B88000 mov ax,128 ; multiply current block by 128
017F 26F7670C mul es:MSF_BLOCK[bx] ; to give current record number
0183 33C9 xor cx,cx
0185 268A4F20 mov cl,es:MSF_CR[bx] ; Add in the current record
0189 03C1 add ax,cx ; to DX:AX to give the
018B 83D200 adc dx,0 ; relative record
018E 26894721 mov es:MSF_RR[bx],ax ; save the result
0192 26885723 mov es:MSF_RR2[bx],dl
0196 33DB xor bx,bx ; we did OK
0198 C3 ret
fcb_write:
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 23
;---------
0199 B84000 mov ax,MS_X_WRITE ; make it a write
019C EB03 01A1 jmps fcb_seq_rw
fcb_read:
;--------
019E B83F00 mov ax,MS_X_READ ; make it a read
fcb_seq_rw:
01A1 E83C01 02E0 call fcb_handle_vfy ; verify we have a sensible handle
01A4 50 push ax ; save the operation
01A5 E80402 03AC call fcb_get_count ; AX = bytes to read
01A8 50 push ax ; save byte count
01A9 E86402 0410 call fcb_seek_seq ; Seek to position in the file
01AC 59 pop cx ; recover byte to xfer
01AD 58 pop ax ; and the Operation Code
01AE 720A 01BA jc fcb_seq_rw10
01B0 E80800 01BB call fcb_rw ; do the Op
01B3 7205 01BA jc fcb_seq_rw10
01B5 53 push bx ; save the error code
01B6 E80102 03BA call fcb_update_seq ; update FCB filepos
01B9 5B pop bx ; recover error
fcb_seq_rw10:
01BA C3 ret
fcb_rw:
; On Entry:
; AX = operation code
; CX = count
; fcb_pb+2 = IFN
; On Exit:
; BX = error code
01BB 36C4160000 E les dx,ss:dword ptr dma_offset
01C0 03CA add cx,dx ; see if we overflow
01C2 7236 01FA jc fcb_rw20
01C4 2BCA sub cx,dx ; count back to normal
01C6 51 push cx ; save target count
01C7 89160400 E mov fcb_pb+4,dx
01CB 8C060600 E mov fcb_pb+6,es ; setup buffer address
01CF 890E0800 E mov fcb_pb+8,cx ; and target count
01D3 E83B03 0511 call fcb_fdos ; ask the FDOS to do the read/write
01D6 7220 01F8 jc fcb_rw10 ; we got a real error...
01D8 1E push ds
01D9 06 push es
01DA A10200 E mov ax,fcb_pb+2 ; get IFN
01DD E80000 E call ifn2dhndl ; ES:BX -> DHNDL_ we have open
01E0 0653 push es ! push bx ; save DHNDL_
01E2 E8B701 039C call fcb_point ; ES:BX = FCB
01E5 5E1F pop si ! pop ds ; DS:SI -> DHNDL_
01E7 E818FF 0102 call fcb_update ; update file size/time-stamp
01EA 07 pop es
01EB 1F pop ds
01EC 58 pop ax ; recover target count
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 24
01ED 8B0E0800 E mov cx,fcb_pb+8 ; we xfered this much
01F1 3BC8 cmp cx,ax ; did we xfer enough
01F3 7209 01FE jb fcb_rw30 ; nope..
01F5 33DB xor bx,bx ; xfer went OK
01F7 C3 ret
fcb_rw10:
01F8 58 pop ax ; discard target count
01F9 C3 ret
fcb_rw20:
; Our DTA is too small - return 2
01FA BB0200 mov bx,2 ; indicate the DTA is too small
; stc ; error - don't update FCB
01FD C3 ret
fcb_rw30:
; We have some form of EOF - lets look into it
01FE E89B01 039C call fcb_point ; ES:BX = FCB
0201 268B5F0E mov bx,es:MSF_RECSIZE[bx] ; BX = record size
0205 8BC1 mov ax,cx
0207 33D2 xor dx,dx ; DX:AX = bytes xfer'd
0209 F7F3 div bx ; did we xfer a complete
020B 85D2 test dx,dx ; number of records ?
020D 7419 0228 jz fcb_rw40 ; if so return 1
; Partial data was read - fill out with zero's and return 3
020F 40 inc ax ; allow for incomplete record
0210 50 push ax ; save rounded up xfer count
0211 36C43E0000 E les di,ss:dword ptr dma_offset
0216 03F9 add di,cx ; point to 1st byte after xfer
0218 8BCB mov cx,bx ; this many in a record
021A 2BCA sub cx,dx ; so this many weren't xfer'd
021C 33C0 xor ax,ax ; fill them with zero's
021E F3AA rep stosb ; zap the bytes we didn't xfer to
0220 58 pop ax ; recover xfer count
0221 F7E3 mul bx ; and work out # bytes xfered
0223 91 xchg ax,cx ; return bytes in CX
0224 BB0300 mov bx,3 ; indicate EOF (partial read)
; clc ; update FCB
0227 C3 ret
fcb_rw40:
; No Data was xfered - return 1
0228 BB0100 mov bx,1 ; indicate EOF (no data read)
; clc ; update FCB
022B C3 ret
fcb_writerand:
;-------------
022C B84000 mov ax,MS_X_WRITE ; make it a write
022F EB03 0234 jmps fcb_random_rw
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 25
fcb_readrand:
;------------
0231 B83F00 mov ax,MS_X_READ ; make it a read
fcb_random_rw:
0234 E8A900 02E0 call fcb_handle_vfy ; check the handle is OK
0237 50 push ax ; save the code
0238 E87101 03AC call fcb_get_count ; AX = bytes to read
023B 50 push ax ; save byte count
023C 33C9 xor cx,cx ; cause update of seq posn from
023E E8A101 03E2 call fcb_update_rr ; random record position
0241 E8ED01 0431 call fcb_seek_rr ; Seek to position in the file
0244 59 pop cx ; recover byte to xfer
0245 58 pop ax ; and the Operation Code
0246 7203 024B jc fcb_random_rw10
0248 E870FF 01BB call fcb_rw ; do the Op
fcb_random_rw10:
024B C3 ret
fcb_writeblk:
;------------
024C B84000 mov ax,MS_X_WRITE ; make it a write
024F EB03 0254 jmps fcb_block_rw
fcb_readblk:
;-----------
0251 B83F00 mov ax,MS_X_READ ; make it a read
fcb_block_rw:
0254 E88900 02E0 call fcb_handle_vfy ; check the handle is OK
0257 50 push ax ; save the code
0258 E85101 03AC call fcb_get_count ; AX = bytes per record, CX = # records
025B 91 xchg ax,cx ; CX = bytes per record
025C F7E1 mul cx ; AX = bytes to xfer
025E 85D2 test dx,dx ; more than 64K ?
0260 740F 0271 jz fcb_block_rw10 ; then we should truncate it
0262 B80F00 mov ax,15 ; AX = handy mask
0265 99 cwd ; DX = 0
0266 3623060000 E and ax,ss:dma_offset ; get dma offset for para
026B F7D0 not ax ; DX/AX = maximum bytes we can xfer
026D F7F1 div cx ; AX = maximum blocks we can xfer
026F F7E1 mul cx ; AX = bytes to xfer (now < 64K)
fcb_block_rw10:
0271 50 push ax ; save byte count
0272 E8BC01 0431 call fcb_seek_rr ; Seek to position in the file
0275 59 pop cx ; recover byte to xfer
0276 58 pop ax ; and the Operation Code
0277 721C 0295 jc fcb_block_rw20
0279 E83FFF 01BB call fcb_rw ; do the Op
027C 7217 0295 jc fcb_block_rw20
027E 53 push bx ; save the error code
027F E86001 03E2 call fcb_update_rr ; update FCB filepos, get records xferd
0282 8B5E02 mov bx,2[bp] ; BX -> parameter block
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 26
0285 874F06 xchg cx,6[bx] ; update amount xfered
0288 2B4F06 sub cx,6[bx] ; CX = # we didn't xfer (normally 0)
028B 5B pop bx ; recover (possible) error
028C E307 0295 jcxz fcb_block_rw20 ; skip if we read all we wanted to
028E 85DB test bx,bx ; did we have a partial read for
0290 7503 0295 jnz fcb_block_rw20 ; a reason like EOF ?
0292 BB0200 mov bx,2 ; no, we must have truncated it
fcb_block_rw20:
0295 C3 ret
fcb_size:
;--------
0296 E8BE00 0357 call fcb_path_prep
0299 B84300 mov ax,MS_X_CHMOD ; it's a get info
029C C70606000000 E mov fcb_pb+6,0
02A2 E86C02 0511 call fcb_fdos
02A5 7238 02DF jc fcb_size40
02A7 E8F200 039C call fcb_point ; ES:BX = FCB
02AA 268B4F0E mov cx,es:MSF_RECSIZE[bx] ; get the record size
02AE 85C9 test cx,cx ; is it non-zero ?
02B0 7503 02B5 jnz fcb_size10 ; if not
02B2 B98000 mov cx,128 ; make it 128 bytes
fcb_size10:
02B5 A10A00 E mov ax,fcb_pb+10
02B8 8B160C00 E mov dx,fcb_pb+12 ; DX:AX = file length in bytes
02BC E87002 052F call div_32 ; DX:AX = file length in records
02BF E306 02C7 jcxz fcb_size20 ; was there an overflow
02C1 050100 add ax,1
02C4 83D200 adc dx,0 ; include an extra record
fcb_size20:
02C7 E8D200 039C call fcb_point ; ES:BX = FCB
02CA 26894721 mov es:MSF_RR[bx],ax ; low word of size
02CE 26885723 mov es:MSF_RR2[bx],dl ; hi byte of size
02D2 26837F0E40 cmp es:MSF_RECSIZE[bx],64 ; if record size < 64 bytes
02D7 7304 02DD jae fcb_size30 ; then we use a 4 byte
02D9 26887724 mov es:MSF_RR2+1[bx],dh ; random record position
fcb_size30:
02DD 33DB xor bx,bx ; good return
fcb_size40:
02DF C3 ret
; Utility FCB subroutines
;========================
fcb_handle_vfy:
;--------------
; Verify FCB is valid and open, do not return if it isn't
; nb. Called with nothing on stack
;
; On Entry:
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 27
; FCB address in parameter block
; On Exit:
; AX preserved
; ES:BX -> FCB (skipping EXT bit if present)
; fcb_pb+2 = IFN of handle
; On Error - blow away caller and return error in BX
;
; DEBUG - on reopen we could do more checks to ensure we are re-opening the
; same file
02E0 50 push ax
02E1 E8B800 039C call fcb_point
02E4 26837F0E00 cmp es:MSF_RECSIZE[bx],0
02E9 7506 02F1 jne fcb_handle_vfy10
02EB 26C7470E8000 mov es:MSF_RECSIZE[bx],128
fcb_handle_vfy10:
02F1 268A4718 mov al,es:MSF_IFN[bx] ; get IFN
02F5 E80000 E call ifn2dhndl ; ES:BX -> DHNDL_
02F8 720E 0308 jc fcb_handle_vfy20 ; it must be a valid IFN
02FA 26F747020080 test es:DHNDL_MODE[bx],DHM_FCB
0300 7406 0308 jz fcb_handle_vfy20 ; it must be an FCB..
0302 26833F00 cmp es:DHNDL_COUNT[bx],0
0306 7520 0328 jne fcb_handle_vfy30 ; it must also be open..
fcb_handle_vfy20:
0308 E89100 039C call fcb_point
030B 26FF770E push es:MSF_RECSIZE[bx] ; save current record size
030F 26FF770C push es:MSF_BLOCK[bx] ; save current block number
0313 0653 push es ! push bx
0315 E881FD 0099 call fcb_open ; try to re-open the file
0318 5B07 pop bx ! pop es ; point back at FCB
031A 268F470C pop es:MSF_BLOCK[bx] ; restore current block number
031E 268F470E pop es:MSF_RECSIZE[bx] ; restore record size
0322 720F 0333 jc fcb_handle_err
0324 268A4718 mov al,es:MSF_IFN[bx] ; get new IFN
fcb_handle_vfy30:
0328 32E4 xor ah,ah
032A A30200 E mov fcb_pb+2,ax ; set parameter block accordingly
032D E86C00 039C call fcb_point ; ES:BX -> MSF_
0330 58 pop ax
0331 F8 clc
0332 C3 ret
fcb_handle_err:
0333 83C404 add sp,2*WORD ; discard AX and near return address
0336 3DFCFF cmp ax,ED_HANDLE ; if we have run out of handles then
0339 7503 033E jne fcb_handle_err10 ; say no FCB's, else return error
033B B8DDFF mov ax,ED_NOFCBS
fcb_handle_err10:
033E 93 xchg ax,bx ; error code in BX
033F F9 stc
0340 C3 ret
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 28
fcb_path2_prep:
;--------------
; On Entry:
; FCB address in parameter block
; On Exit:
; ES:BX -> FCB (skipping EXT bit if present)
; fcb_pb+6/8 -> unparse name from FCB
;
0341 E85800 039C call fcb_point ; point at the FCB
0344 268A07 mov al,es:MSF_DRIVE[bx] ; get drive
0347 83C310 add bx,16 ; point at 2nd name in FCB
034A BF0000 E mov di,offset fcb_path2
034D 893E0600 E mov fcb_pb+6,di
0351 8C1E0800 E mov fcb_pb+8,ds ; point at buffer we want
0355 EB26 037D jmps fcb_path_prep_common
fcb_path_prep:
;-------------
; On Entry:
; FCB address in parameter block
; On Exit:
; ES:BX -> FCB (skipping EXT bit if present)
; fcb_pb+2/4 -> unparse name from FCB
;
0357 33C0 xor ax,ax ; assume no attribute
0359 8B5E02 mov bx,2[bp] ; BX -> parameter block
035C C45F02 les bx,2[bx] ; ES:BX -> FCB
035F 26803FFF cmp es:MSF_EXTFLG[bx],0ffh ; is it an extended FCB
0363 7507 036C jne fcb_path_prep10
0365 260A4706 or al,es:MSF_ATTRIB[bx] ; we can use file mode from XFCB
0369 83C307 add bx,7 ; skip EXT bit of FCB
fcb_path_prep10:
036C A30800 E mov fcb_pb+8,ax ; remember the attribute
036F 268A07 mov al,es:MSF_DRIVE[bx] ; get drive
0372 BF0000 E mov di,offset fcb_path
0375 893E0200 E mov fcb_pb+2,di
0379 8C1E0400 E mov fcb_pb+4,ds ; point at buffer we want
fcb_path_prep_common:
037D FEC8 dec al ; 0 = default drive
037F 7903 0384 jns fcb_path_prep20
0381 A00000 E mov al,current_dsk ; use default drive
fcb_path_prep20:
0384 1E push ds
0385 1E06 push ds ! push es
0387 1F07 pop ds ! pop es ; ES:DI -> name buffer
0389 0441 add al,'A' ; make drive ASCII
038B AA stosb
038C B03A mov al,':'
038E AA stosb ; now we have 'd:'
038F 8D7701 lea si,MSF_NAME[bx] ; DS:SI -> source name
0392 A5A5 movsw ! movsw
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 29
0394 A5A5 movsw ! movsw ; copy the name leaving spaces intact
0396 B02E mov al,'.'
0398 AA stosb
0399 A5A4 movsw ! movsb ; copy the extention
039B 1F pop ds
; jmps fcb_point ; point ES:BX at FCB again
fcb_point:
;---------
; On Entry:
; FCB address in parameter block
; On Exit:
; ES:BX -> FCB (skipping EXT bit if present)
; (All other regs preserved)
;
039C 8B5E02 mov bx,2[bp] ; BX -> parameter block
039F C45F02 les bx,2[bx] ; ES:BX -> FCB
03A2 26803FFF cmp es:MSF_EXTFLG[bx],0ffh ; is it an extended FCB
03A6 7503 03AB jne fcb_point10
03A8 83C307 add bx,7 ; skip EXT bit of FCB
fcb_point10:
03AB C3 ret
fcb_get_count:
;-------------
; On Entry:
; none
; On Exit:
; AX = bytes per record
; CX = callers CX count
; All regs fair game
;
03AC E8EDFF 039C call fcb_point ; ES:BX -> FCB
03AF 8B7602 mov si,2[bp] ; SI -> parameter block
03B2 8B4C06 mov cx,6[si] ; CX = count
03B5 268B470E mov ax,es:MSF_RECSIZE[bx] ; get record size
03B9 C3 ret
fcb_update_seq:
;--------------
; On Entry:
; CX = byte count actually transferred
; On Exit:
; CX = record count transferred
; All other regs fair game
; CR/BLOCK updated with new value
;
03BA 8BC1 mov ax,cx
03BC 33D2 xor dx,dx ; DX:AX = byte count transfered
03BE E8DBFF 039C call fcb_point ; ES:BX -> FCB
03C1 26F7770E div es:MSF_RECSIZE[bx] ; make records xfered
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 30
03C5 50 push ax ; save records xfered
03C6 91 xchg ax,cx ; also in CX for later
03C7 B88000 mov ax,128
03CA 26F7670C mul es:MSF_BLOCK[bx] ; DX:AX = record of block
03CE 03C1 add ax,cx
03D0 83D200 adc dx,0 ; add in amount just xfered
03D3 268A4F20 mov cl,es:MSF_CR[bx]
03D7 32ED xor ch,ch ; now add in CR as a word
03D9 03C1 add ax,cx
03DB 83D200 adc dx,0 ; DX:AX = record
03DE 8AF2 mov dh,dl ; DH:AX = record for common code
03E0 EB1C 03FE jmps fcb_update_common
fcb_update_rr:
;-------------
; On Entry:
; CX = byte count actually transferred
; On Exit:
; CX = record count transferred
; All other regs fair game
; Random Record and CR/BLOCK updated with new value
;
03E2 91 xchg ax,cx
03E3 33D2 xor dx,dx ; DX:AX = byte count transfered
03E5 E8B4FF 039C call fcb_point ; ES:BX -> FCB
03E8 26F7770E div es:MSF_RECSIZE[bx] ; make records xfered
03EC 50 push ax ; save records xfered
03ED 26014721 add es:MSF_RR[bx],ax ; update the RR field
03F1 2680572300 adc es:MSF_RR2[bx],0 ; and the overflow
03F6 268B4721 mov ax,es:MSF_RR[bx] ; get low part of RR
03FA 268A7723 mov dh,es:MSF_RR2[bx] ; and the hi part
fcb_update_common:
03FE 8AD4 mov dl,ah ; DX will be block number
0400 D0E0 shl al,1 ; get top bit of CR into CY
0402 13D2 adc dx,dx ; then into DX
0404 D0E8 shr al,1 ; AL = CR (remember mod 128)
0406 26884720 mov es:MSF_CR[bx],al ; set the CR field
040A 2689570C mov es:MSF_BLOCK[bx],dx ; and the block field
040E 59 pop cx ; recover records xfered
040F C3 ret
fcb_seek_seq:
;------------
; Seek to position in file indicated by the RR position
; On Entry:
; ES:BX -> FCB_
; On Exit:
; CY clear if no problem, fcb_pb+2=IFN
; else
; CY set, AX = BX = error code
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 31
; All other regs fair game
;
0410 E889FF 039C call fcb_point ; ES:BX -> FCB_
0413 B88000 mov ax,128
0416 26F7670C mul es:MSF_BLOCK[bx] ; get record in DX:AX
041A 268A4F20 mov cl,es:MSF_CR[bx]
041E 32ED xor ch,ch
0420 03C1 add ax,cx ; add in CR
0422 83D200 adc dx,0 ; so DX:AX is really the record
0425 50 push ax ; save low word of record
0426 8BC2 mov ax,dx
0428 26F7670E mul es:MSF_RECSIZE[bx] ; DX:AX = byte offset in file/10000h
042C 8BC8 mov cx,ax ; save the important word
042E 58 pop ax ; recover low word of record
042F EB13 0444 jmps fcb_seek_common
fcb_seek_rr:
;-----------
; Seek to position in file indicated by the RR position
; On Entry:
; ES:BX -> FCB_
; On Exit:
; CY clear if no problem, fcb_pb+2=IFN
; else
; CY set, AX = BX = error code
; All other regs fair game
;
0431 E868FF 039C call fcb_point ; ES:BX -> FCB_
0434 268A4723 mov al,es:MSF_RR2[bx]
0438 32E4 xor ah,ah
043A 26F7670E mul es:MSF_RECSIZE[bx] ; DX:AX = byte offset in file/10000h
043E 8BC8 mov cx,ax ; save the important word
0440 268B4721 mov ax,es:MSF_RR[bx]
fcb_seek_common:
0444 26F7670E mul es:MSF_RECSIZE[bx] ; DX:AX = byte offset in file
0448 03D1 add dx,cx ; add the two bits together
044A A30400 E mov fcb_pb+4,ax
044D 89160600 E mov fcb_pb+6,dx ; save position
0451 C70608000000 E mov fcb_pb+8,0 ; seek from start
0457 33C0 xor ax,ax
0459 268A4718 mov al,es:MSF_IFN[bx] ; AX = IFN
045D A30200 E mov fcb_pb+2,ax ; save IFN
0460 B84200 mov ax,MS_X_LSEEK
0463 E9AB00 0511 jmp fcb_fdos ; try and seek to this position
fcb_search:
;----------
; On Entry:
; AX = operation to perform
; On Exit:
; AX = 0, or ED_ error code (CY set if error)
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 32
0466 FF360000 E push dma_offset
046A FF360000 E push dma_segment
046E C70600000000 E mov dma_offset,offset fcb_search_buf
0474 8C1E0000 E mov dma_segment,ds
0478 E89600 0511 call fcb_fdos ; do the search
047B 8F060000 E pop dma_segment
047F 8F060000 E pop dma_offset
0483 85C0 test ax,ax ; was there an error
0485 F9 stc ; assume there was
0486 7802 048A js fcb_search10 ; return the error
0488 33C0 xor ax,ax ; no problems
fcb_search10:
048A C3 ret
fcb_save_search_state:
;---------------------
; On entry DS=PCMODE
048B E80EFF 039C call fcb_point
048E 8D7F01 lea di,MSF_NAME[bx] ; ES:DI -> FCB name
0491 BE0000 E mov si,offset fcb_search_buf
0494 AC lodsb ; get 1st byte = drive info
0495 B90A00 mov cx,20/WORD ; copy 20 bytes to FCB
0498 F3A5 rep movsw ; (the rest of the search template)
049A AA stosb ; drive info byte follow them
049B C43E0000 E les di,dword ptr dma_offset ; ES:DI -> search state in DMA address
049F 8B7602 mov si,2[bp] ; SI -> parameter block
04A2 C57402 lds si,2[si] ; DS:SI -> FCB_
04A5 803CFF cmp ds:MSF_EXTFLG[si],0ffh ; extended FCB ?
04A8 7505 04AF jne fcb_sss10
04AA B90700 mov cx,7 ; copy extended FCB portions too
04AD F3A4 rep movsb ; we have copied up to name
fcb_sss10:
04AF AA stosb ; save drive byte info
04B0 57 push di
04B1 B020 mov al,' ' ; space fill name
04B3 B90B00 mov cx,11
04B6 F3AA rep stosb ; all blanks now
04B8 5F pop di
04B9 161F push ss ! pop ds ; DS:SI -> pathname
04BB BE1E00 E mov si,offset fcb_search_buf+1Eh
04BE 57 push di ; unparse knowing name is good
04BF B90800 mov cx,8 ; length of name field
fcb_sss20:
04C2 AC lodsb ; treat '.' and '..' specially
04C3 3C2E cmp al,'.' ; is either possible ?
04C5 7505 04CC jne fcb_sss30 ; no, continue as normal
04C7 AA stosb ; copy the '.'
04C8 E2F8 04C2 loop fcb_sss20 ; go around for another '.'
04CA EB04 04D0 jmps fcb_sss40 ; this name is rubbish!!
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 33
fcb_sss30:
04CC 4E dec si ; forget the non '.'
04CD E80000 E call parse_one ; parse just the name
fcb_sss40:
04D0 5F pop di
04D1 83C708 add di,8 ; di -> fcb ext field
04D4 3C2E cmp al,'.' ; do we have an extention ?
04D6 7508 04E0 jne fcb_sss50
04D8 B90300 mov cx,3 ; length of ext field
04DB 57 push di
04DC E80000 E call parse_one ; parse just extension
04DF 5F pop di
fcb_sss50:
04E0 83C703 add di,3 ; di -> rest of fcb
04E3 BE1500 E mov si,offset fcb_search_buf+15h
04E6 A4 movsb ; copy the attribute field
04E7 33C0 xor ax,ax
04E9 B90500 mov cx,10/WORD
04EC F3AB rep stosw ; 10 bytes of zeros
04EE A5 movsw ; copy time
04EF A5 movsw ; copy date
04F0 A12F00 E mov ax,word ptr srch_buf+21+DBLOCK1
04F3 AB stosw ; 1st block
04F4 A5A5 movsw ! movsw ; copy filesize
04F6 C3 ret
fcb_restore_search_state:
;------------------------
; On entry DS=PCMODE
04F7 1E push ds
04F8 E8A1FE 039C call fcb_point ; ES:BX -> FCB_
04FB 061E push es ! push ds
04FD 071F pop es ! pop ds ; swap DS/ES
04FF BF0100 E mov di,offset fcb_search_buf+1
; ES:DI -> internal state
0502 8D7701 lea si,1[bx] ; DS:SI -> FCB+1
0505 B90A00 mov cx,10
0508 F3A5 rep movsw ; copy info from FCB
050A AC lodsb ; get "drive" info
050B 26A20000 E mov es:fcb_search_buf,al ; it's the 1st byte in the srch state
050F 1F pop ds
0510 C3 ret
fcb_fdos:
;--------
; Make an FDOS call (NB. We don't have MX here, so it's OK)
; Set top bit of remote_call flag so we use IFN's not XFN's
; On Entry:
; AX = FDOS operation
; fcb_pb -> FDOS parameter block
; On Exit:
; As FDOS call
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 34
;
0511 A30000 E mov fcb_pb,ax ; save operation type
0514 810E00000080 E or remote_call,DHM_FCB ; forget about PSP during FCB call
051A BA0000 E mov dx,offset fcb_pb ; DS:DX -> parameter block
051D 1E push ds
051E 55 push bp
051F E80000 E call fdos_entry ; call the FDOS
0522 5D pop bp
0523 1F pop ds
0524 81260000FF7F E and remote_call,not DHM_FCB ; FCB operation over
052A 3DA6FF cmp ax,ED_LASTERROR
052D F5 cmc ; CY set if an error occurred
052E C3 ret
div_32:
; Entry: DX,AX = long dividend
; CX = word divisor
; Exit: DX,AX = long result
; CX = remainder
052F E31F 0550 jcxz div0 ; divide by 0
0531 83F901 cmp cx,1
0534 7420 0556 je div1 ; divide by 1
0536 57 push di
0537 53 push bx
0538 33DB xor bx,bx ; BX = 0
053A 93 xchg ax,bx ; low word in BX, AX = 0
053B 92 xchg ax,dx ; high word in DX:AX
053C 50 push ax ; save high word
053D F7F1 div cx ; divide high part
053F 8BF8 mov di,ax ; save result
0541 F7E1 mul cx ; AX = even divisor part
0543 5A pop dx ; old high in DX
0544 2BD0 sub dx,ax ; eliminate even part
0546 93 xchg ax,bx ; AX = low word
0547 F7F1 div cx ; low part in AX
0549 8BCA mov cx,dx ; CX = remainder
054B 8BD7 mov dx,di ; high result in DX
054D 5B pop bx
054E 5F pop di
054F C3 ret
div0:
0550 B8FFFF mov ax,-1
0553 8BD0 mov dx,ax
0555 C3 ret
div1:
0556 49 dec cx ; CX = remainder = 0
0557 C3 ret
PCMODE_DATA DSEG WORD
PC-DOS RASM-86 1.4a Source: FCBS.A86 FCB - DOS file system FCB supp Page 35
extrn fcb_pb:word
extrn fcb_path:byte
extrn fcb_path2:byte
extrn fcb_search_buf:byte
extrn current_dsk:byte
extrn current_psp:word
extrn dma_offset:word
extrn dma_segment:word
extrn machine_id:word
extrn remote_call:word
extrn srch_buf:byte
end
End of assembly. Number of errors: 0. Use factor: 23%
 extrn fcb_search_buf:byte