 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-1
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 	 	 	 	 	TITLE	MS-DOS version 1.25 by Tim Pate
	 	 	 	rson     March 3, 1982
 	 	 	 	 	PAGE	60,132
 	 	 	 	; Use the following booleans to set the switches 
 = 0000	 	 	 	FALSE	EQU	0
 = FFFF	 	 	 	TRUE	EQU	NOT FALSE
 	 	 	 	
 	 	 	 	; Use the switches below to produce the standard Microsoft version of the IBM
 	 	 	 	; version of the operating system
 =	 	 	 	MSVER	EQU	TRUE
 =	 	 	 	IBM	EQU	FALSE
 	 	 	 	
 	 	 	 	; Set this switch to cause DOS to move itself to the end of memory
 =	 	 	 	HIGHMEM	EQU	FALSE
 	 	 	 	
 	 	 	 	; Turn on switch below to allow testing disk code with DEBUG. It sets
 	 	 	 	; up a different stack for disk I/O (functions > 11) than that used for
 	 	 	 	; character I/O which effectively makes the DOS re-entrant.
 	 	 	 	
 =	 	 	 	DSKTEST	EQU	FALSE
 	 	 	 	
                             C	 	INCLUDE	MSDOS.ASM
                             C	; 86-DOS  High-performance operating system for the 8086  version 1.25
                             C	;       by Tim Paterson
                             C	
                             C	
                             C	; ****************** Revision History *************************
                             C	;          >> EVERY change must noted below!! <<
                             C	;
                             C	; 0.34 12/29/80 General release, updating all past customers
                             C	; 0.42 02/25/81 32-byte directory entries added
                             C	; 0.56 03/23/81 Variable record and sector sizes
                             C	; 0.60 03/27/81 Ctrl-C exit changes, including register save on user stack
                             C	; 0.74 04/15/81 Recognize I/O devices with file names
                             C	; 0.75 04/17/81 Improve and correct buffer handling
                             C	; 0.76 04/23/81 Correct directory size when not 2^N entries
                             C	; 0.80 04/27/81 Add console input without echo, Functions 7 & 8
                             C	; 1.00 04/28/81 Renumber for general release
                             C	; 1.01 05/12/81 Fix bug in `STORE'
                             C	; 1.10 07/21/81 Fatal error trapping, NUL device, hidden files, date & time,
                             C	;               RENAME fix, general cleanup
                             C	; 1.11 09/03/81 Don't set CURRENT BLOCK to 0 on open; fix SET FILE SIZE
                             C	; 1.12 10/09/81 Zero high half of CURRENT BLOCK after all (CP/M programs don't)
                             C	; 1.13 10/29/81 Fix classic "no write-through" error in buffer handling
                             C	; 1.20 12/31/81 Add time to FCB; separate FAT from DPT; Kill SMALLDIR;
                             C	;               Add FLUSH and MAPDEV calls; allow disk mapping in DSKCHG;
                             C	;               Lots of smaller improvements
                             C	; 1.21 01/06/82 HIGHMEM switch to run DOS in high memory
                             C	; 1.22 01/12/82 Add VERIFY system call to enable/disable verify after write
                             C	; 1.23 02/11/82 Add defaulting to parser; use variable escape character
                             C	;               Don't zero extent field in IBM version (back to 1.01!)
                             C	; 1.24 03/01/82 Restore fcn. 27 to 1.0 level; add fcn. 28
                             C	; 1.25 03/03/82 Put marker (00) at end of directory to speed searches
                             C	;
                             C	; *************************************************************
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-2
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


                             C	
                             C	
                             C	; Interrupt Entry Points:
                             C	
                             C	; INTBASE:      ABORT
                             C	; INTBASE+4:    COMMAND
                             C	; INTBASE+8:    BASE EXIT ADDRESS
                             C	; INTBASE+C:    CONTROL-C ABORT
                             C	; INTBASE+10H:  FATAL ERROR ABORT
                             C	; INTBASE+14H:  BIOS DISK READ
                             C	; INTBASE+18H:  BIOS DISK WRITE
                             C	; INTBASE+40H:  Long jump to CALL entry point
                             C	
                             C	        ELSE
 = 001B                      C	ESCCH   EQU     1BH
 = 0018                      C	CANCEL  EQU     "X"-"@"         ;Cancel with Ctrl-X
 =                           C	TOGLINS EQU     FALSE           ;Separate keys for insert mode on and off
 =                           C	TOGLPRN EQU     FALSE           ;Separate keys for printer echo on and off
 = 0005                      C	NUMDEV  EQU     5               ;Number of I/O device names
 =                           C	ZEROEXT EQU     FALSE
                             C	        ENDIF
                             C	
 = 0024                      C	MAXCALL EQU     36
 = 002E                      C	MAXCOM  EQU     46
 = 0080                      C	INTBASE EQU     80H
 = 0020                      C	INTTAB  EQU     20H
 = 000C                      C	ENTRYPOINTSEG   EQU     0CH
 = 00C0                      C	ENTRYPOINT      EQU     INTBASE+40H
 = 0023                      C	CONTC   EQU     INTTAB+3
 = 0088                      C	EXIT    EQU     INTBASE+8
 = 00EA                      C	LONGJUMP EQU    0EAH
 = 009A                      C	LONGCALL EQU    9AH
 = 0FFF                      C	MAXDIF  EQU     0FFFH
 = 000A                      C	SAVEXIT EQU     10
                             C	
                             C	; Field definition for FCBs
                             C	
                             C	FCBLOCK STRUC
 0000     0C [               C	        DB      12 DUP (?)              ;Drive code and name
                ??           C	
                    ]        C	
                             C	
 000C  ????                  C	EXTENT  DW      ?
 000E  ????                  C	RECSIZ  DW      ?       ;Size of record (user settable)
 0010  ????                  C	FILSIZ  DW      ?       ;Size of file in bytes
 0012  ????                  C	DRVBP   DW      ?       ;BP for SEARCH FIRST and SEARCH NEXT
 0014  ????                  C	FDATE   DW      ?       ;Date of last writing
 0016  ????                  C	FTIME   DW      ?       ;Time of last writing
 0018  ??                    C	DEVID   DB      ?       ;Device ID number, bits 0-5
                             C	                        ;bit 7=0 for file, bit 7=1 for I/O device
                             C	                        ;If file, bit 6=0 if dirty
                             C	                        ;If I/O device, bit 6=0 if EOF (input)
 0019  ????                  C	FIRCLUS DW      ?       ;First cluster of file
 001B  ????                  C	LSTCLUS DW      ?       ;Last cluster accessed
 001D  ????                  C	CLUSPOS DW      ?       ;Position of last cluster accessed
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-3
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 001F  ??                    C	        DB      ?       ;Forces NR to offset 32
 0020  ??                    C	NR      DB      ?       ;Next record
 0021     03 [               C	RR      DB      3 DUP (?)               ;Random record
                ??           C	
                    ]        C	
                             C	
 0024                        C	FCBLOCK ENDS
 = 0010                      C	FILDIRENT       = FILSIZ                ;Used only by SEARCH FIRST and SEARCH NEXT
                             C	
                             C	; Description of 32-byte directory entry (same as returned by SEARCH FIRST
                             C	; and SEARCH NEXT, functions 17 and 18).
                             C	;
                             C	; Location      bytes   Description
                             C	;
                             C	;    0          11      File name and extension ( 0E5H if empty)
                             C	;   11           1      Attributes. Bits 1 or 2 make file hidden
                             C	;   12          10      Zero field (for expansion)
                             C	;   22           2      Time. Bits 0-4=seconds/2, bits 5-10=minute, 11-15=hour
                             C	;   24           2      Date. Bits 0-4=day, bits 5-8=month, bits 9-15=year-1980
                             C	;   26           2      First allocation unit ( < 4080 )
                             C	;   28           4      File size, in bytes (LSB first, 30 bits max.)
                             C	;
                             C	; The File Allocation Table uses a 12-bit entry for each allocation unit on
                             C	; the disk. These entries are packed, two for every three bytes. The contents
                             C	; of entry number N is found by 1) multiplying N by 1.5; 2) adding the result
                             C	; to the base address of the Allocation Table; 3) fetching the 16-bit word at
                             C	; this address; 4) If N was odd (so that N*1.5 was not an integer), shift the
                             C	; word right four bits; 5) mask to 12 bits (AND with 0FFF hex). Entry number
                             C	; zero is used as an end-of-file trap in the OS and as a flag for directory
                             C	; entry size (if SMALLDIR selected). Entry 1 is reserved for future use. The
                             C	; first available allocation unit is assigned entry number two, and even
                             C	; though it is the first, is called cluster 2. Entries greater than 0FF8H are
                             C	; end of file marks; entries of zero are unallocated. Otherwise, the contents
                             C	; of a FAT entry is the number of the next cluster in the file.
                             C	
                             C	
                             C	; Field definition for Drive Parameter Block
                             C	
                             C	DPBLOCK STRUC
 0000  ??                    C	DEVNUM  DB      ?       ;I/O driver number
 0001  ??                    C	DRVNUM  DB      ?       ;Physical Unit number
 0002  ????                  C	SECSIZ  DW      ?       ;Size of physical sector in bytes
 0004  ??                    C	CLUSMSK DB      ?       ;Sectors/cluster - 1
 0005  ??                    C	CLUSSHFT DB     ?       ;Log2 of sectors/cluster
 0006  ????                  C	FIRFAT  DW      ?       ;Starting record of FATs
 0008  ??                    C	FATCNT  DB      ?       ;Number of FATs for this drive
 0009  ????                  C	MAXENT  DW      ?       ;Number of directory entries
 000B  ????                  C	FIRREC  DW      ?       ;First sector of first cluster
 000D  ????                  C	MAXCLUS DW      ?       ;Number of clusters on drive + 1
 000F  ??                    C	FATSIZ  DB      ?       ;Number of records occupied by FAT
 0010  ????                  C	FIRDIR  DW      ?       ;Starting record of directory
 0012  ????                  C	FAT     DW      ?       ;Pointer to start of FAT
 0014                        C	DPBLOCK ENDS
                             C	
 = 0014                      C	DPBSIZ  EQU     20      ;Size of the structure in bytes
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-4
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 = 000B                      C	DIRSEC  =       FIRREC  ;Number of dir. sectors (init temporary)
 = 000D                      C	DSKSIZ  =       MAXCLUS ;Size of disk (temp used during init only)
                             C	
                             C	;The following are all of the segments used
                             C	;They are declared in the order that they should be placed in the executable
                             C	
 0000                        C	CODE    SEGMENT
 0000                        C	CODE    ENDS
                             C	
 0000                        C	CONSTANTS       SEGMENT BYTE
 0000                        C	CONSTANTS       ENDS
                             C	
 0000                        C	DATA    SEGMENT WORD
 0000                        C	DATA    ENDS
                             C	
                             C	DOSGROUP        GROUP   CODE,CONSTANTS,DATA
                             C	
 0000                        C	SEGBIOS SEGMENT
 0000                        C	SEGBIOS ENDS
                             C	
                             C	
                             C	; BOIS entry point definitions
                             C	
                             C	        ENDIF
                             C	        IF      NOT IBM
 = 0040                      C	BIOSSEG EQU     40H
                             C	        ENDIF
                             C	
 0000                        C	SEGBIOS         SEGMENT AT BIOSSEG
 0000                        C	                ORG     0
 0000     03 [               C	                DB      3 DUP (?)       ;Reserve room for jump to init code
                ??           C	
                    ]        C	
                             C	
 0003     03 [               C	BIOSSTAT        DB      3 DUP (?)       ;Console input status check
                ??           C	
                    ]        C	
                             C	
 0006     03 [               C	BIOSIN          DB      3 DUP (?)       ;Get console character
                ??           C	
                    ]        C	
                             C	
 0009     03 [               C	BIOSOUT         DB      3 DUP (?)       ;Output console character
                ??           C	
                    ]        C	
                             C	
 000C     03 [               C	BIOSPRINT       DB      3 DUP (?)       ;Output to printer
                ??           C	
                    ]        C	
                             C	
 000F     03 [               C	BIOSAUXIN       DB      3 DUP (?)       ;Get byte from auxilliary
                ??           C	
                    ]        C	
                             C	
 0012     03 [               C	BIOSAUXOUT      DB      3 DUP (?)       ;Output byte to auxilliary
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-5
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


                ??           C	
                    ]        C	
                             C	
 0015     03 [               C	BIOSREAD        DB      3 DUP (?)       ;Disk read
                ??           C	
                    ]        C	
                             C	
 0018     03 [               C	BIOSWRITE       DB      3 DUP (?)       ;Disk write
                ??           C	
                    ]        C	
                             C	
 001B     03 [               C	BIOSDSKCHG      DB      3 DUP (?)       ;Dsik-change status
                ??           C	
                    ]        C	
                             C	
 001E     03 [               C	BIOSSETDATE     DB      3 DUP (?)       ;Set date
                ??           C	
                    ]        C	
                             C	
 0021     03 [               C	BIOSSETTIME     DB      3 DUP (?)       ;Set time
                ??           C	
                    ]        C	
                             C	
 0024     03 [               C	BIOSGETTIME     DB      3 DUP (?)       ;Get time and date
                ??           C	
                    ]        C	
                             C	
 0027     03 [               C	BIOSFLUSH       DB      3 DUP (?)       ;Clear console input buffer
                ??           C	
                    ]        C	
                             C	
 002A     03 [               C	BIOSMAPDEV      DB      3 DUP (?)       ;Dynamic disk table mapper
                ??           C	
                    ]        C	
                             C	
                             C	
 002D                        C	SEGBIOS ENDS
                             C	; Location of user registers relative user stack pointer
                             C	
                             C	STKPTRS STRUC
 0000  ????                  C	AXSAVE  DW      ?
 0002  ????                  C	BXSAVE  DW      ?
 0004  ????                  C	CXSAVE  DW      ?
 0006  ????                  C	DXSAVE  DW      ?
 0008  ????                  C	SISAVE  DW      ?
 000A  ????                  C	DISAVE  DW      ?
 000C  ????                  C	BPSAVE  DW      ?
 000E  ????                  C	DSSAVE  DW      ?
 0010  ????                  C	ESSAVE  DW      ?
 0012  ????                  C	IPSAVE  DW      ?
 0014  ????                  C	CSSAVE  DW      ?
 0016  ????                  C	FSAVE   DW      ?
 0018                        C	STKPTRS ENDS
                             C	
                             C	; Start of code
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-6
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


                             C	
 0000                        C	CODE    SEGMENT
                             C	ASSUME  CS:DOSGROUP,DS:DOSGROUP,ES:DOSGROUP,SS:DOSGROUP
                             C	
 0000                        C	        ORG     0
 = 0000                      C	CODSTRT EQU     $
 0000  E9 0024 R             C	        JMP     DOSINIT
                             C	
 0003  1B                    C	ESCCHAR DB      ESCCH   ;Lead-in character for escape sequences
 0004                        C	ESCTAB: 
                             C	        IF      NOT IBM
 0004  53                    C	        DB      "S"     ;Copy one char
 0005  56                    C	        DB      "V"     ;Skip one char
 0006  54                    C	        DB      "T"     ;Copy to char
 0007  57                    C	        DB      "W"     ;Skip to char
 0008  55                    C	        DB      "U"     ;Copy line
 0009  45                    C	        DB      "E"     ;Kill line (no change in template)
 000A  4A                    C	        DB      "J"     ;Reedit line (new template)
 000B  44                    C	        DB      "D"     ;Backspace
 000C  50                    C	        DB      "P"     ;Enter insert mode
 000D  51                    C	        DB      "Q"     ;Exit insert mode
 000E  52                    C	        DB      "R"     ;Escape character
 000F  52                    C	        DB      "R"     ;End of table
                             C	        ENDIF
                             C	        ENDIF
                             C	
 = 000C                      C	ESCTABLEN EQU   $-ESCTAB
                             C	        IF      NOT IBM
 0010  0D 0A 4D 53 2D 44     C	HEADER  DB      13,10,"MS-DOS version 1.25"
       4F 53 20 76 65 72     C	
       73 69 6F 6E 20 31     C	
       2E 32 35              C	
                             C	        ENDIF
                             C	        ENDIF
                             C	
 0025  0D 0A                 C	        DB      13,10
 0027  43 6F 70 79 72 69     C	        DB      "Copyright 1981,82 Microsoft, Inc.",13,10,"$"
       67 68 74 20 31 39     C	
       38 31 2C 38 32 20     C	
       4D 69 63 72 6F 73     C	
       6F 66 74 2C 20 49     C	
       6E 63 2E 0D 0A 24     C	
                             C	        ENDIF
                             C	
 004B                        C	QUIT:
 004B  B4 00                 C	        MOV     AH,0
 004D  EB 1E                 C	        JMP     SHORT SAVREGS
                             C	
 004F                        C	COMMAND: ;Interrupt call entry point
 004F  80 FC 2E              C	        CMP     AH,MAXCOM
 0052  76 19                 C	        JBE     SAVREGS
 0054                        C	BADCALL:
 0054  B0 00                 C	        MOV     AL,0
 0056  CF                    C	IRET:   IRET
                             C	
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-7
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0057                        C	ENTRY:  ;System call entry point and dispatcher
 0057  58                    C	        POP     AX              ;IP from the long call at 5
 0058  58                    C	        POP     AX              ;Segment from the long call at 5
 0059  2E: 8F 06 0131 R      C	        POP     CS:[TEMP]       ;IP from the CALL 5
 005E  9C                    C	        PUSHF                   ;Start re-ordering the stack
 005F  FA                    C	        CLI
 0060  50                    C	        PUSH    AX              ;Save segment
 0061  2E: FF 36 0131 R      C	        PUSH    CS:[TEMP]       ;Stack now ordered as if INT had been used
 0066  80 F9 24              C	        CMP     CL,MAXCALL      ;This entry point doesn't get as many calls
 0069  77 E9                 C	        JA      BADCALL
 006B  8A E1                 C	        MOV     AH,CL
 006D                        C	SAVREGS:
 006D  06                    C	        PUSH    ES
 006E  1E                    C	        PUSH    DS
 006F  55                    C	        PUSH    BP
 0070  57                    C	        PUSH    DI
 0071  56                    C	        PUSH    SI
 0072  52                    C	        PUSH    DX
 0073  51                    C	        PUSH    CX
 0074  53                    C	        PUSH    BX
 0075  50                    C	        PUSH    AX
                             C	
                             C	        ENDIF
                             C	
 0076  2E: 89 26 0131 R      C	        MOV     CS:[SPSAVE],SP
 007B  2E: 8C 16 0133 R      C	        MOV     CS:[SSSAVE],SS
 0080  8C CC                 C	        MOV     SP,CS
 0082  8E D4                 C	        MOV     SS,SP
 0084                        C	REDISP:
 0084  BC 01DE R             C	        MOV     SP,OFFSET DOSGROUP:IOSTACK
 0087  FB                    C	        STI                     ;Stack OK now
 0088  8A DC                 C	        MOV     BL,AH
 008A  B7 00                 C	        MOV     BH,0
 008C  D1 E3                 C	        SHL     BX,1
 008E  FC                    C	        CLD
 008F  80 FC 0C              C	        CMP     AH,12
 0092  7E 03                 C	        JLE     SAMSTK
 0094  BC 025E R             C	        MOV     SP,OFFSET DOSGROUP:DSKSTACK
 0097                        C	SAMSTK:
 0097  2E: FF 97 00B6 R      C	        CALL    CS:[BX+DISPATCH]
 009C                        C	LEAVE:
 009C  FA                    C	        CLI
 009D  2E: 8B 26 0131 R      C	        MOV     SP,CS:[SPSAVE]
 00A2  2E: 8E 16 0133 R      C	        MOV     SS,CS:[SSSAVE]
 00A7  8B EC                 C	        MOV     BP,SP
 00A9  88 46 00              C	        MOV     BYTE PTR [BP.AXSAVE],AL
                             C	
                             C	        ENDIF
                             C	
 00AC  58                    C	        POP     AX
 00AD  5B                    C	        POP     BX
 00AE  59                    C	        POP     CX
 00AF  5A                    C	        POP     DX
 00B0  5E                    C	        POP     SI
 00B1  5F                    C	        POP     DI
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-8
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 00B2  5D                    C	        POP     BP
 00B3  1F                    C	        POP     DS
 00B4  07                    C	        POP     ES
 00B5  CF                    C	        IRET
                             C	; Standard Functions
 00B6  06B1 R                C	DISPATCH DW     ABORT           ;0
 00B8  1253 R                C	        DW      CONIN
 00BA  119D R                C	        DW      CONOUT
 00BC  0141 R                C	        DW      READER
 00BE  014A R                C	        DW      PUNCH
 00C0  128B R                C	        DW      LIST            ;5
 00C2  1262 R                C	        DW      RAWIO
 00C4  127F R                C	        DW      RAWINP
 00C6  125C R                C	        DW      IN
 00C8  1298 R                C	        DW      PRTBUF
 00CA  0FBD R                C	        DW      BUFIN           ;10
 00CC  1249 R                C	        DW      CONSTAT
 00CE  011E R                C	        DW      FLUSHKB
 00D0  0F64 R                C	        DW      DSKRESET
 00D2  0FAF R                C	        DW      SELDSK
 00D4  03CD R                C	        DW      OPEN            ;15
 00D6  04BB R                C	        DW      CLOSE
 00D8  0E50 R                C	        DW      SRCHFRST
 00DA  0EB3 R                C	        DW      SRCHNXT
 00DC  029B R                C	        DW      DELETE
 00DE  06F6 R                C	        DW      SEQRD           ;20
 00E0  06FE R                C	        DW      SEQWRT
 00E2  056D R                C	        DW      CREATE
 00E4  02F3 R                C	        DW      RENAME
 00E6  0114 R                C	        DW      INUSE
 00E8  0F97 R                C	        DW      GETDRV          ;25
 00EA  0F12 R                C	        DW      SETDMA
 00EC  0F20 R                C	        DW      GETFATPT
 00EE  0F22 R                C	        DW      GETFATPTDL
 00F0  0114 R                C	        DW      GETRDONLY
 00F2  0114 R                C	        DW      SETATTRIB       ;30
 00F4  0F4E R                C	        DW      GETDSKPT
 00F6  0114 R                C	        DW      USERCODE
 00F8  070E R                C	        DW      RNDRD
 00FA  0716 R                C	        DW      RNDWRT
 00FC  0ED2 R                C	        DW      FILESIZE        ;35
 00FE  0F9C R                C	        DW      SETRNDREC
                             C	; Extended Functions
 0100  1396 R                C	        DW      SETVECT
 0102  13A8 R                C	        DW      NEWBASE
 0104  071E R                C	        DW      BLKRD
 0106  0726 R                C	        DW      BLKWRT          ;40
 0108  12AF R                C	        DW      MAKEFCB
 010A  14A6 R                C	        DW      GETDATE
 010C  14C4 R                C	        DW      SETDATE
 010E  1546 R                C	        DW      GETTIME
 0110  1558 R                C	        DW      SETTIME         ;45
 0112  0117 R                C	        DW      VERIFY
                             C	
 0114                        C	INUSE:
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-9
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0114                        C	GETIO:
 0114                        C	SETIO:
 0114                        C	GETRDONLY:
 0114                        C	SETATTRIB:
 0114                        C	USERCODE:
 0114  B0 00                 C	        MOV     AL,0
 0116  C3                    C	        RET
                             C	
 0117                        C	VERIFY:
 0117  24 01                 C	        AND     AL,1
 0119  2E: A2 002E R         C	        MOV     CS:VERFLG,AL
 011D  C3                    C	        RET
                             C	
 011E                        C	FLUSHKB:
 011E  50                    C	        PUSH    AX
 011F  9A 0027 ---- R        C	        CALL    FAR PTR BIOSFLUSH
 0124  58                    C	        POP     AX
 0125  8A E0                 C	        MOV     AH,AL
 0127  3C 01                 C	        CMP     AL,1
 0129  74 13                 C	        JZ      REDISPJ
 012B  3C 06                 C	        CMP     AL,6
 012D  74 0F                 C	        JZ      REDISPJ
 012F  3C 07                 C	        CMP     AL,7
 0131  74 0B                 C	        JZ      REDISPJ
 0133  3C 08                 C	        CMP     AL,8
 0135  74 07                 C	        JZ      REDISPJ
 0137  3C 0A                 C	        CMP     AL,10
 0139  74 03                 C	        JZ      REDISPJ
 013B  B0 00                 C	        MOV     AL,0
 013D  C3                    C	        RET
                             C	
 013E  E9 0084 R             C	REDISPJ:JMP     REDISP
                             C	
 0141                        C	READER:
 0141                        C	AUXIN:
 0141  E8 11C4 R             C	        CALL    STATCHK
 0144  9A 000F ---- R        C	        CALL    FAR PTR BIOSAUXIN 
 0149  C3                    C	        RET
                             C	
 014A                        C	PUNCH:
 014A  8A C2                 C	        MOV     AL,DL
 014C                        C	AUXOUT:
 014C  50                    C	        PUSH    AX
 014D  E8 11C4 R             C	        CALL    STATCHK
 0150  58                    C	        POP     AX
 0151  9A 0012 ---- R        C	        CALL    FAR PTR BIOSAUXOUT 
 0156  C3                    C	        RET
                             C	
                             C	
 0157                        C	UNPACK:
                             C	
                             C	; Inputs:
                             C	;       DS = CS
                             C	;       BX = Cluster number
                             C	;       BP = Base of drive parameters
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-10
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


                             C	;       SI = Pointer to drive FAT
                             C	; Outputs:
                             C	;       DI = Contents of FAT for given cluster
                             C	;       Zero set means DI=0 (free cluster)
                             C	; No other registers affected. Fatal error if cluster too big.
                             C	
 0157  3B 5E 0D              C	        CMP     BX,[BP.MAXCLUS]
 015A  77 18                 C	        JA      HURTFAT
 015C  8D 38                 C	        LEA     DI,[SI+BX]
 015E  D1 EB                 C	        SHR     BX,1
 0160  8B 39                 C	        MOV     DI,[DI+BX]
 0162  73 09                 C	        JNC     HAVCLUS
 0164  D1 EF                 C	        SHR     DI,1
 0166  D1 EF                 C	        SHR     DI,1
 0168  D1 EF                 C	        SHR     DI,1
 016A  D1 EF                 C	        SHR     DI,1
 016C  F9                    C	        STC
 016D                        C	HAVCLUS:
 016D  D1 D3                 C	        RCL     BX,1
 016F  81 E7 0FFF            C	        AND     DI,0FFFH
 0173  C3                    C	        RET
 0174                        C	HURTFAT:
 0174  50                    C	        PUSH    AX
 0175  B4 80                 C	        MOV     AH,80H          ;Signal Bad FAT to INT 24H handler
 0177  BF 0FFF               C	        MOV     DI,0FFFH        ;In case INT 24H returns (it shouldn't)
 017A  E8 0639 R             C	        CALL    FATAL
 017D  58                    C	        POP     AX              ;Try to ignore bad FAT
 017E  C3                    C	        RET
                             C	
                             C	
 017F                        C	PACK:
                             C	
                             C	; Inputs:
                             C	;       DS = CS
                             C	;       BX = Cluster number
                             C	;       DX = Data
                             C	;       SI = Pointer to drive FAT
                             C	; Outputs:
                             C	;       The data is stored in the FAT at the given cluster.
                             C	;       BX,DX,DI all destroyed
                             C	;       No other registers affected
                             C	
 017F  8B FB                 C	        MOV     DI,BX
 0181  D1 EB                 C	        SHR     BX,1
 0183  03 DE                 C	        ADD     BX,SI
 0185  03 DF                 C	        ADD     BX,DI
 0187  D1 EF                 C	        SHR     DI,1
 0189  8B 3F                 C	        MOV     DI,[BX]
 018B  73 0E                 C	        JNC     ALIGNED
 018D  D1 E2                 C	        SHL     DX,1
 018F  D1 E2                 C	        SHL     DX,1
 0191  D1 E2                 C	        SHL     DX,1
 0193  D1 E2                 C	        SHL     DX,1
 0195  81 E7 000F            C	        AND     DI,0FH
 0199  EB 04                 C	        JMP     SHORT PACKIN
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-11
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 019B                        C	ALIGNED:
 019B  81 E7 F000            C	        AND     DI,0F000H
 019F                        C	PACKIN:
 019F  0B FA                 C	        OR      DI,DX
 01A1  89 3F                 C	        MOV     [BX],DI
 01A3  C3                    C	        RET
                             C	
 01A4                        C	DEVNAME:
 01A4  BE 0000 R             C	        MOV     SI,OFFSET DOSGROUP:IONAME       ;List of I/O devices with file names
 01A7  B7 05                 C	        MOV     BH,NUMDEV               ;BH = number of device names
 01A9                        C	LOOKIO:
 01A9  BF 010B R             C	        MOV     DI,OFFSET DOSGROUP:NAME1
 01AC  B9 0004               C	        MOV     CX,4                    ;All devices are 4 letters
 01AF  F3/ A6                C	        REPE    CMPSB                   ;Check for name in list
 01B1  74 08                 C	        JZ      IOCHK                   ;If first 3 letters OK, check for the rest
 01B3  03 F1                 C	        ADD     SI,CX                   ;Point to next device name
 01B5  FE CF                 C	        DEC     BH
 01B7  75 F0                 C	        JNZ     LOOKIO
 01B9                        C	CRET:
 01B9  F9                    C	        STC                             ;Not found
 01BA  C3                    C	        RET
                             C	
 01BB                        C	IOCHK:
                             C	        ENDIF
 01BB  F6 DF                 C	        NEG     BH
 01BD  B9 0002               C	        MOV     CX,2            ;Check rest of name but not extension
 01C0  B8 2020               C	        MOV     AX,2020H
 01C3  F3/ AF                C	        REPE    SCASW           ;Make sure rest of name is blanks
 01C5  75 F2                 C	        JNZ     CRET
 01C7  C3                    C	RET1:   RET                     ;Zero set so CREATE works
                             C	
 01C8                        C	GETFILE:
                             C	; Same as GETNAME except ES:DI points to FCB on successful return
 01C8  E8 0372 R             C	        CALL    MOVNAME
 01CB  72 FA                 C	        JC      RET1
 01CD  52                    C	        PUSH    DX
 01CE  1E                    C	        PUSH    DS
 01CF  E8 01DA R             C	        CALL    FINDNAME
 01D2  07                    C	        POP     ES
 01D3  5F                    C	        POP     DI
 01D4  C3                    C	RET2:   RET
                             C	
                             C	
 01D5                        C	GETNAME:
                             C	
                             C	; Inputs:
                             C	;       DS,DX point to FCB
                             C	; Function:
                             C	;       Find file name in disk directory. First byte is
                             C	;       drive number (0=current disk). "?" matches any
                             C	;       character.
                             C	; Outputs:
                             C	;       Carry set if file not found
                             C	;       ELSE
                             C	;       Zero set if attributes match (always except when creating)
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-12
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


                             C	;       BP = Base of drive parameters
                             C	;       DS = CS
                             C	;       ES = CS
                             C	;       BX = Pointer into directory buffer
                             C	;       SI = Pointer to First Cluster field in directory entry
                             C	;       [DIRBUF] has directory record with match
                             C	;       [NAME1] has file name
                             C	; All other registers destroyed.
                             C	
 01D5  E8 0372 R             C	        CALL    MOVNAME
 01D8  72 FA                 C	        JC      RET2            ;Bad file name?
 01DA                        C	FINDNAME:
 01DA  8C C8                 C	        MOV     AX,CS
 01DC  8E D8                 C	        MOV     DS,AX
 01DE  E8 01A4 R             C	        CALL    DEVNAME
 01E1  73 F1                 C	        JNC     RET2
 01E3  E8 0423 R             C	        CALL    STARTSRCH
 01E6                        C	CONTSRCH:
 01E6  E8 023E R             C	        CALL    GETENTRY
 01E9  72 E9                 C	        JC      RET2
 01EB                        C	SRCH:
 01EB  8A 27                 C	        MOV     AH,BYTE PTR [BX]
 01ED  0A E4                 C	        OR      AH,AH                   ;End of directory?
 01EF  74 1E                 C	        JZ      FREE
 01F1  3A 26 0130 R          C	        CMP     AH,[DELALL]             ;Free entry?
 01F5  74 18                 C	        JZ      FREE
 01F7  8B F3                 C	        MOV     SI,BX
 01F9  BF 010B R             C	        MOV     DI,OFFSET DOSGROUP:NAME1
 01FC  B9 000B               C	        MOV     CX,11
 01FF                        C	WILDCRD:
 01FF  F3/ A6                C	        REPE    CMPSB
 0201  74 23                 C	        JZ      FOUND
 0203  80 7D FF 3F           C	        CMP     BYTE PTR [DI-1],"?"
 0207  74 F6                 C	        JZ      WILDCRD
 0209                        C	NEXTENT:
 0209  E8 0275 R             C	        CALL    NEXTENTRY
 020C  73 DD                 C	        JNC     SRCH
 020E  C3                    C	RET3:   RET
                             C	
 020F                        C	FREE:
 020F  83 3E 015C R FF       C	        CMP     [ENTFREE],-1            ;Found a free entry before?
 0214  75 08                 C	        JNZ     TSTALL                  ;If so, ignore this one
 0216  8B 0E 0103 R          C	        MOV     CX,[LASTENT]
 021A  89 0E 015C R          C	        MOV     [ENTFREE],CX
 021E                        C	TSTALL:
 021E  3A 26 0130 R          C	        CMP     AH,[DELALL]             ;At end of directory?
 0222  74 E5                 C	        JZ      NEXTENT                 ;No - continue search
 0224  F9                    C	        STC                             ;Report not found
 0225  C3                    C	        RET
                             C	 
 0226                        C	FOUND:
                             C	;Check if attributes allow finding it
 0226  8A 26 0116 R          C	        MOV     AH,[ATTRIB]             ;Attributes of search
 022A  F6 D4                 C	        NOT     AH
 022C  22 24                 C	        AND     AH,[SI]                 ;Compare with attributes of file
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-13
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 022E  83 C6 0F              C	        ADD     SI,15   
 0231  80 E4 06              C	        AND     AH,6                    ;Only look at bits 1 and 2
 0234  74 D8                 C	        JZ      RET3
 0236  F6 06 012F R FF       C	        TEST    BYTE PTR [CREATING],-1  ;Pass back mismatch if creating
 023B  74 CC                 C	        JZ      NEXTENT                 ;Otherwise continue searching
 023D  C3                    C	        RET
                             C	
                             C	
 023E                        C	GETENTRY:
                             C	
                             C	; Inputs:
                             C	;       [LASTENT] has previously searched directory entry
                             C	; Function:
                             C	;       Locates next sequential directory entry in preparation for search
                             C	; Outputs:
                             C	;       Carry set if none
                             C	;       ELSE
                             C	;       AL = Current directory block
                             C	;       BX = Pointer to next directory entry in [DIRBUF]
                             C	;       DX = Pointer to first byte after end of DIRBUF
                             C	;       [LASTENT] = New directory entry number
                             C	
 023E  A1 0103 R             C	        MOV     AX,[LASTENT]
 0241  40                    C	        INC     AX                      ;Start with next entry
 0242  3B 46 09              C	        CMP     AX,[BP.MAXENT]
 0245  73 4F                 C	        JAE     NONE
 0247                        C	GETENT:
 0247  A3 0103 R             C	        MOV     [LASTENT],AX
 024A  B1 04                 C	        MOV     CL,4
 024C  D3 E0                 C	        SHL     AX,CL
 024E  33 D2                 C	        XOR     DX,DX
 0250  D1 E0                 C	        SHL     AX,1
 0252  D1 D2                 C	        RCL     DX,1                    ;Account for overflow in last shift
 0254  8B 5E 02              C	        MOV     BX,[BP.SECSIZ]
 0257  80 E3 E0              C	        AND     BL,255-31               ;Must be multiple of 32
 025A  F7 F3                 C	        DIV     BX
 025C  8B DA                 C	        MOV     BX,DX                   ;Position within sector
 025E  8A 66 00              C	        MOV     AH,[BP.DEVNUM]          ;AL=Directory sector no.
 0261  3B 06 0041 R          C	        CMP     AX,[DIRBUFID]
 0265  74 05                 C	        JZ      HAVDIRBUF
 0267  53                    C	        PUSH    BX
 0268  E8 05E8 R             C	        CALL    DIRREAD
 026B  5B                    C	        POP     BX
 026C                        C	HAVDIRBUF:
 026C  BA 025E R             C	        MOV     DX,OFFSET DOSGROUP:DIRBUF
 026F  03 DA                 C	        ADD     BX,DX
 0271  03 56 02              C	        ADD     DX,[BP.SECSIZ]
 0274  C3                    C	        RET
                             C	
 0275                        C	NEXTENTRY:
                             C	
                             C	; Inputs:
                             C	;       Same as outputs of GETENTRY, above
                             C	; Function:
                             C	;       Update AL, BX, and [LASTENT] for next directory entry.
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-14
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


                             C	;       Carry set if no more.
                             C	
 0275  8B 3E 0103 R          C	        MOV     DI,[LASTENT]
 0279  47                    C	        INC     DI
 027A  3B 7E 09              C	        CMP     DI,[BP.MAXENT]
 027D  73 17                 C	        JAE     NONE
 027F  89 3E 0103 R          C	        MOV     [LASTENT],DI
 0283  83 C3 20              C	        ADD     BX,32
 0286  3B DA                 C	        CMP     BX,DX
 0288  72 0A                 C	        JB      HAVIT
 028A  FE C0                 C	        INC     AL                      ;Next directory sector
 028C  52                    C	        PUSH    DX                      ;Save limit
 028D  E8 05E8 R             C	        CALL    DIRREAD
 0290  5A                    C	        POP     DX
 0291  BB 025E R             C	        MOV     BX,OFFSET DOSGROUP:DIRBUF
 0294                        C	HAVIT:
 0294  F8                    C	        CLC
 0295  C3                    C	        RET
                             C	
 0296                        C	NONE:
 0296  E8 067A R             C	        CALL    CHKDIRWRITE
 0299  F9                    C	        STC
 029A  C3                    C	RET4:   RET
                             C	
                             C	
 029B                        C	DELETE: ; System call 19
 029B  E8 0372 R             C	        CALL    MOVNAME
 029E  B0 FF                 C	        MOV     AL,-1
 02A0  72 F8                 C	        JC      RET4
 02A2  2E: A0 0116 R         C	        MOV     AL,CS:[ATTRIB]
 02A6  24 06                 C	        AND     AL,6                    ;Look only at hidden bits
 02A8  3C 06                 C	        CMP     AL,6                    ;Both must be set
 02AA  75 12                 C	        JNZ     NOTALL
 02AC  B9 000B               C	        MOV     CX,11
 02AF  B0 3F                 C	        MOV     AL,"?"
 02B1  BF 010B R             C	        MOV     DI,OFFSET DOSGROUP:NAME1
 02B4  F3/ AE                C	        REPE    SCASB                   ;See if name is *.*
 02B6  75 06                 C	        JNZ     NOTALL
 02B8  2E: C6 06 0130 R 00   C	        MOV     BYTE PTR CS:[DELALL],0  ;DEL *.* - flag deleting all
 02BE                        C	NOTALL:
 02BE  E8 01DA R             C	        CALL    FINDNAME
 02C1  B0 FF                 C	        MOV     AL,-1
 02C3  72 D5                 C	        JC      RET4
 02C5  0A FF                 C	        OR      BH,BH           ;Check if device name
 02C7  78 D1                 C	        JS      RET4            ;Can't delete I/O devices
 02C9                        C	DELFILE:
 02C9  C6 06 002B R FF       C	        MOV     BYTE PTR [DIRTYDIR],-1
 02CE  8A 26 0130 R          C	        MOV     AH,[DELALL]
 02D2  88 27                 C	        MOV     BYTE PTR [BX],AH
 02D4  8B 1C                 C	        MOV     BX,[SI]
 02D6  8B 76 12              C	        MOV     SI,[BP.FAT]
 02D9  0B DB                 C	        OR      BX,BX
 02DB  74 08                 C	        JZ      DELNXT
 02DD  3B 5E 0D              C	        CMP     BX,[BP.MAXCLUS]
 02E0  77 03                 C	        JA      DELNXT
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-15
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 02E2  E8 0E2F R             C	        CALL    RELEASE
 02E5                        C	DELNXT:
 02E5  E8 01E6 R             C	        CALL    CONTSRCH
 02E8  73 DF                 C	        JNC     DELFILE
 02EA  E8 052C R             C	        CALL    FATWRT
 02ED  E8 067A R             C	        CALL    CHKDIRWRITE
 02F0  32 C0                 C	        XOR     AL,AL
 02F2  C3                    C	        RET
                             C	
                             C	
 02F3                        C	RENAME: ;System call 23
 02F3  E8 0372 R             C	        CALL    MOVNAME
 02F6  72 77                 C	        JC      ERRET
 02F8  83 C6 05              C	        ADD     SI,5
 02FB  BF 0117 R             C	        MOV     DI,OFFSET DOSGROUP:NAME2
 02FE  E8 039F R             C	        CALL    LODNAME
 0301  72 6C                 C	        JC      ERRET           ;Report error if second name invalid
 0303  E8 01DA R             C	        CALL    FINDNAME
 0306  72 67                 C	        JC      ERRET
 0308  0A FF                 C	        OR      BH,BH           ;Check if I/O device name
 030A  78 63                 C	        JS      ERRET           ;If so, can't rename it
 030C  BE 010B R             C	        MOV     SI,OFFSET DOSGROUP:NAME1
 030F  BF 0122 R             C	        MOV     DI,OFFSET DOSGROUP:NAME3
 0312  B9 0006               C	        MOV     CX,6            ;6 words (12 bytes)--include attribute byte
 0315  F3/ A5                C	        REP     MOVSW           ;Copy name to search for
 0317                        C	RENFIL:
 0317  BF 010B R             C	        MOV     DI,OFFSET DOSGROUP:NAME1
 031A  BE 0117 R             C	        MOV     SI,OFFSET DOSGROUP:NAME2
 031D  B9 000B               C	        MOV     CX,11
 0320                        C	NEWNAM:
 0320  AC                    C	        LODSB
 0321  3C 3F                 C	        CMP     AL,"?"
 0323  75 02                 C	        JNZ     NOCHG
 0325  8A 07                 C	        MOV     AL,[BX]
 0327                        C	NOCHG:
 0327  AA                    C	        STOSB
 0328  43                    C	        INC     BX
 0329  E2 F5                 C	        LOOP    NEWNAM
 032B  C6 05 06              C	        MOV     BYTE PTR [DI],6 ;Stop duplicates with any attributes
 032E  E8 01A4 R             C	        CALL    DEVNAME         ;Check if giving it a device name
 0331  73 39                 C	        JNC     RENERR
 0333  FF 36 0103 R          C	        PUSH    [LASTENT]       ;Save position of match
 0337  C7 06 0103 R FFFF     C	        MOV     [LASTENT],-1    ;Search entire directory for duplicate
 033D  E8 01E6 R             C	        CALL    CONTSRCH        ;See if new name already exists
 0340  58                    C	        POP     AX
 0341  73 29                 C	        JNC     RENERR                  ;Error if found
 0343  E8 0247 R             C	        CALL    GETENT                  ;Re-read matching entry
 0346  8B FB                 C	        MOV     DI,BX
 0348  BE 010B R             C	        MOV     SI,OFFSET DOSGROUP:NAME1
 034B  B9 0005               C	        MOV     CX,5
 034E  A4                    C	        MOVSB
 034F  F3/ A5                C	        REP     MOVSW                   ;Replace old name with new one
 0351  C6 06 002B R FF       C	        MOV     BYTE PTR [DIRTYDIR],-1  ;Flag change in directory
 0356  BE 0122 R             C	        MOV     SI,OFFSET DOSGROUP:NAME3
 0359  BF 010B R             C	        MOV     DI,OFFSET DOSGROUP:NAME1
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-16
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 035C  B9 0006               C	        MOV     CX,6                    ;Include attribute byte
 035F  F3/ A5                C	        REP     MOVSW                   ;Copy name back into search buffer
 0361  E8 01E6 R             C	        CALL    CONTSRCH
 0364  73 B1                 C	        JNC     RENFIL
 0366  E8 067A R             C	        CALL    CHKDIRWRITE
 0369  32 C0                 C	        XOR     AL,AL
 036B  C3                    C	        RET
                             C	
 036C                        C	RENERR:
 036C  E8 067A R             C	        CALL    CHKDIRWRITE
 036F                        C	ERRET:
 036F  B0 FF                 C	        MOV     AL,-1
 0371  C3                    C	RET5:   RET
                             C	
                             C	
 0372                        C	MOVNAME:
                             C	
                             C	; Inputs:
                             C	;       DS, DX point to FCB or extended FCB
                             C	; Outputs:
                             C	;       DS:DX point to normal FCB
                             C	;       ES = CS
                             C	;       If file name OK:
                             C	;       BP has base of driver parameters
                             C	;       [NAME1] has name in upper case
                             C	; All registers except DX destroyed
                             C	; Carry set if bad file name or drive
                             C	
 0372  2E: C7 06 012F R E500 C	        MOV     CS:WORD PTR [CREATING],0E500H   ;Not creating, not DEL *.*
 0379  8C C8                 C	        MOV     AX,CS
 037B  8E C0                 C	        MOV     ES,AX
 037D  BF 010B R             C	        MOV     DI,OFFSET DOSGROUP:NAME1
 0380  8B F2                 C	        MOV     SI,DX
 0382  AC                    C	        LODSB
 0383  2E: A2 012E R         C	        MOV     CS:[EXTFCB],AL  ;Set flag if extended FCB in use
 0387  B4 00                 C	        MOV     AH,0            ;Set default attributes
 0389  3C FF                 C	        CMP     AL,-1           ;Is it an extended FCB?
 038B  75 0A                 C	        JNZ     HAVATTRB
 038D  83 C2 07              C	        ADD     DX,7            ;Adjust to point to normal FCB
 0390  83 C6 06              C	        ADD     SI,6            ;Point to drive select byte
 0393  8A 64 FF              C	        MOV     AH,[SI-1]       ;Get attribute byte
 0396  AC                    C	        LODSB           ;Get drive select byte
 0397                        C	HAVATTRB:
 0397  2E: 88 26 0116 R      C	        MOV     CS:[ATTRIB],AH  ;Save attributes
 039C  E8 03B9 R             C	        CALL    GETTHISDRV
 039F                        C	LODNAME:
                             C	; This entry point copies a file name from DS,SI
                             C	; to ES,DI converting to upper case.
 039F  80 3C 20              C	        CMP     BYTE PTR [SI]," "       ;Don't allow blank as first letter
 03A2  F9                    C	        STC                     ;In case of error
 03A3  74 CC                 C	        JZ      RET5
 03A5  B9 000B               C	        MOV     CX,11
 03A8                        C	MOVCHK:
 03A8  E8 135A R             C	        CALL    GETLET
 03AB  72 C4                 C	        JB      RET5
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-17
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 03AD  75 05                 C	        JNZ     STOLET          ;Is it a delimiter?
 03AF  3C 20                 C	        CMP     AL," "          ;This is the only delimiter allowed
 03B1  F9                    C	        STC                     ;In case of error
 03B2  75 BD                 C	        JNZ     RET5
 03B4                        C	STOLET:
 03B4  AA                    C	        STOSB
 03B5  E2 F1                 C	        LOOP    MOVCHK
 03B7  F8                    C	        CLC                     ;Got through whole name - no error
 03B8  C3                    C	RET6:   RET
                             C	
 03B9                        C	GETTHISDRV:
 03B9  2E: 38 06 002C R      C	        CMP     CS:[NUMDRV],AL
 03BE  72 F8                 C	        JC      RET6
 03C0  FE C8                 C	        DEC     AL
 03C2  79 04                 C	        JNS     PHYDRV
 03C4  2E: A0 004A R         C	        MOV     AL,CS:[CURDRV]
 03C8                        C	PHYDRV:
 03C8  2E: A2 013C R         C	        MOV     CS:[THISDRV],AL
 03CC  C3                    C	        RET
                             C	        
                             C	
 03CD                        C	OPEN:   ;System call 15
 03CD  E8 01C8 R             C	        CALL    GETFILE
 03D0                        C	DOOPEN:
                             C	; Enter here to perform OPEN on file already found
                             C	; in directory. DS=CS, BX points to directory
                             C	; entry in DIRBUF, SI points to First Cluster field, and
                             C	; ES:DI point to the FCB to be opened. This entry point
                             C	; is used by CREATE.
 03D0  72 9D                 C	        JC      ERRET
 03D2  0A FF                 C	        OR      BH,BH           ;Check if file is I/O device
 03D4  78 29                 C	        JS      OPENDEV         ;Special handler if so
 03D6  A0 013C R             C	        MOV     AL,[THISDRV]
 03D9  40                    C	        INC     AX
 03DA  AA                    C	        STOSB
 03DB  33 C0                 C	        XOR     AX,AX
                             C	        ENDIF
                             C	        IF      NOT ZEROEXT
 03DD  83 C7 0C              C	        ADD     DI,12           ;Point to high half of CURRENT BLOCK field
 03E0  AA                    C	        STOSB                   ;Set it to zero (CP/M programs set low byte)
                             C	        ENDIF
 03E1  B0 80                 C	        MOV     AL,128          ;Default record size
 03E3  AB                    C	        STOSW                   ;Set record size
 03E4  AD                    C	        LODSW                   ;Get starting cluster
 03E5  8B D0                 C	        MOV     DX,AX           ;Save it for the moment
 03E7  A5                    C	        MOVSW                   ;Transfer size to FCB
 03E8  A5                    C	        MOVSW
 03E9  8B 44 F8              C	        MOV     AX,[SI-8]       ;Get date
 03EC  AB                    C	        STOSW                   ;Save date in FCB
 03ED  8B 44 F6              C	        MOV     AX,[SI-10]      ;Get time
 03F0  AB                    C	        STOSW                   ;Save it in FCB
 03F1  8A 46 00              C	        MOV     AL,[BP.DEVNUM]
 03F4  0C 40                 C	        OR      AL,40H
 03F6  AA                    C	        STOSB
 03F7  8B C2                 C	        MOV     AX,DX           ;Restore starting cluster
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-18
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 03F9  AB                    C	        STOSW                   ; first cluster
 03FA  AB                    C	        STOSW                   ; last cluster accessed
 03FB  33 C0                 C	        XOR     AX,AX
 03FD  AB                    C	        STOSW                   ; position of last cluster
 03FE  C3                    C	        RET
                             C	
                             C	
 03FF                        C	OPENDEV:
 03FF  83 C7 0D              C	        ADD     DI,13           ;point to 2nd half of extent field
 0402  33 C0                 C	        XOR     AX,AX
 0404  AA                    C	        STOSB                   ;Set it to zero
 0405  B0 80                 C	        MOV     AL,128
 0407  AB                    C	        STOSW                   ;Set record size to 128
 0408  33 C0                 C	        XOR     AX,AX
 040A  AB                    C	        STOSW
 040B  AB                    C	        STOSW                   ;Set current size to zero
 040C  E8 1400 R             C	        CALL    DATE16
 040F  AB                    C	        STOSW                   ;Date is todays
 0410  92                    C	        XCHG    AX,DX
 0411  AB                    C	        STOSW                   ;Use current time
 0412  8A C7                 C	        MOV     AL,BH           ;Get device number
 0414  AA                    C	        STOSB
 0415  32 C0                 C	        XOR     AL,AL           ;No error
 0417  C3                    C	        RET
 0418                        C	FATERR:
 0418  97                    C	        XCHG    AX,DI           ;Put error code in DI
 0419  B4 02                 C	        MOV     AH,2            ;While trying to read FAT
 041B  A0 013C R             C	        MOV     AL,[THISDRV]    ;Tell which drive
 041E  E8 063C R             C	        CALL    FATAL1
 0421  EB 09                 C	        JMP     SHORT FATREAD
 0423                        C	STARTSRCH:
 0423  B8 FFFF               C	        MOV     AX,-1
 0426  A3 0103 R             C	        MOV     [LASTENT],AX
 0429  A3 015C R             C	        MOV     [ENTFREE],AX
 042C                        C	FATREAD:
                             C	
                             C	; Inputs:
                             C	;       DS = CS
                             C	; Function:
                             C	;       If disk may have been changed, FAT is read in and buffers are
                             C	;       flagged invalid. If not, no action is taken.
                             C	; Outputs:
                             C	;       BP = Base of drive parameters
                             C	;       Carry set if invalid drive returned by MAPDEV
                             C	; All other registers destroyed
                             C	
 042C  A0 013C R             C	        MOV     AL,[THISDRV]
 042F  32 E4                 C	        XOR     AH,AH           ;Set default response to zero & clear carry
 0431  9A 001B ---- R        C	        CALL    FAR PTR BIOSDSKCHG      ;See what BIOS has to say
 0436  72 E0                 C	        JC      FATERR
 0438  E8 0492 R             C	        CALL    GETBP
 043B  A0 013C R             C	        MOV     AL,[THISDRV]    ;Use physical unit number
 043E  8B 76 12              C	        MOV     SI,[BP.FAT]
 0441  0A 64 FF              C	        OR      AH,[SI-1]       ;Dirty byte for FAT
 0444  78 0A                 C	        JS      NEWDSK          ;If either say new disk, then it's so
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-19
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0446  75 47                 C	        JNZ     MAPDRV
 0448  B4 01                 C	        MOV     AH,1
 044A  3B 06 003D R          C	        CMP     AX,WORD PTR [BUFDRVNO]  ;Does buffer have dirty sector of this drive?
 044E  74 3F                 C	        JZ      MAPDRV
 0450                        C	NEWDSK:
 0450  3A 06 003D R          C	        CMP     AL,[BUFDRVNO]   ;See if buffer is for this drive
 0454  75 0C                 C	        JNZ     BUFOK           ;If not, don't touch it
 0456  C7 06 003B R 0000     C	        MOV     [BUFSECNO],0    ;Flag buffers invalid
 045C  C7 06 003D R 00FF     C	        MOV     WORD PTR [BUFDRVNO],00FFH
 0462                        C	BUFOK:
 0462  C7 06 0041 R FFFF     C	        MOV     [DIRBUFID],-1
 0468  E8 0551 R             C	        CALL    FIGFAT
 046B                        C	NEXTFAT:
 046B  50                    C	        PUSH    AX
 046C  E8 0669 R             C	        CALL    DSKREAD
 046F  58                    C	        POP     AX
 0470  72 36                 C	        JC      BADFAT
 0472  2A 46 08              C	        SUB     AL,[BP.FATCNT]
 0475  74 03                 C	        JZ      NEWFAT
 0477  E8 052C R             C	        CALL    FATWRT
 047A                        C	NEWFAT:
 047A  8B 76 12              C	        MOV     SI,[BP.FAT]
 047D  8A 46 00              C	        MOV     AL,[BP.DEVNUM]
 0480  8A 24                 C	        MOV     AH,[SI]         ;Get first byte of FAT
 0482  80 CC F8              C	        OR      AH,0F8H         ;Put in range
 0485  9A 002A ---- R        C	        CALL    FAR PTR BIOSMAPDEV
 048A  B4 00                 C	        MOV     AH,0
 048C  89 44 FE              C	        MOV     [SI-2],AX       ;Set device no. and reset dirty bit
 048F                        C	MAPDRV:
 048F  8A 44 FE              C	        MOV     AL,[SI-2]       ;Get device number
 0492                        C	GETBP:
 0492  8B 2E 004B R          C	        MOV     BP,[DRVTAB]     ;Just in case drive isn't valid
 0496  24 3F                 C	        AND     AL,3FH          ;Mask out dirty bit
 0498  3A 06 002D R          C	        CMP     AL,[NUMIO]
 049C  F5                    C	        CMC
 049D  72 08                 C	        JC      RET7
 049F  50                    C	        PUSH    AX
 04A0  B4 14                 C	        MOV     AH,DPBSIZ
 04A2  F6 E4                 C	        MUL     AH
 04A4  03 E8                 C	        ADD     BP,AX
 04A6  58                    C	        POP     AX
 04A7  C3                    C	RET7:   RET
                             C	
 04A8                        C	BADFAT:
 04A8  8B CF                 C	        MOV     CX,DI
 04AA  03 D1                 C	        ADD     DX,CX
 04AC  FE C8                 C	        DEC     AL
 04AE  75 BB                 C	        JNZ     NEXTFAT
 04B0  E8 0551 R             C	        CALL    FIGFAT                          ;Reset registers
 04B3  E8 05FC R             C	        CALL    DREAD                           ;Try first FAT once more
 04B6  EB C2                 C	        JMP     SHORT NEWFAT
                             C	
 04B8                        C	OKRET1:
 04B8  B0 00                 C	        MOV     AL,0
 04BA  C3                    C	        RET
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-20
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


                             C	
 04BB                        C	CLOSE:  ;System call 16
 04BB  8B FA                 C	        MOV     DI,DX
 04BD  80 3D FF              C	        CMP     BYTE PTR [DI],-1                ;Check for extended FCB
 04C0  75 03                 C	        JNZ     NORMFCB3
 04C2  83 C7 07              C	        ADD     DI,7
 04C5                        C	NORMFCB3:
 04C5  F6 45 18 C0           C	        TEST    BYTE PTR [DI.DEVID],0C0H        ;Allow only dirty files
 04C9  75 ED                 C	        JNZ     OKRET1                          ;can't close if I/O device, or not writen
 04CB  8A 05                 C	        MOV     AL,[DI]                         ;Get physical unit number
 04CD  FE C8                 C	        DEC     AL                              ;Make zero = drive A
 04CF  B4 01                 C	        MOV     AH,1                            ;Look for dirty buffer
 04D1  2E: 3B 06 003D R      C	        CMP     AX,CS:WORD PTR [BUFDRVNO]
 04D6  75 1D                 C	        JNZ     FNDDIR
                             C	;Write back dirty buffer if on same drive
 04D8  52                    C	        PUSH    DX
 04D9  1E                    C	        PUSH    DS
 04DA  0E                    C	        PUSH    CS
 04DB  1F                    C	        POP     DS
 04DC  C6 06 003E R 00       C	        MOV     BYTE PTR [DIRTYBUF],0
 04E1  8B 1E 0039 R          C	        MOV     BX,[BUFFER]
 04E5  B9 0001               C	        MOV     CX,1
 04E8  8B 16 003B R          C	        MOV     DX,[BUFSECNO]
 04EC  8B 2E 003F R          C	        MOV     BP,[BUFDRVBP]
 04F0  E8 068C R             C	        CALL    DWRITE
 04F3  1F                    C	        POP     DS
 04F4  5A                    C	        POP     DX
 04F5                        C	FNDDIR:
 04F5  E8 01C8 R             C	        CALL    GETFILE
 04F8                        C	BADCLOSEJ:
 04F8  72 4D                 C	        JC      BADCLOSE
 04FA  26: 8B 4D 19          C	        MOV     CX,ES:[DI.FIRCLUS]
 04FE  89 0C                 C	        MOV     [SI],CX
 0500  26: 8B 55 10          C	        MOV     DX,ES:WORD PTR [DI.FILSIZ]
 0504  89 54 02              C	        MOV     [SI+2],DX
 0507  26: 8B 55 12          C	        MOV     DX,ES:WORD PTR [DI.FILSIZ+2]
 050B  89 54 04              C	        MOV     [SI+4],DX
 050E  26: 8B 55 14          C	        MOV     DX,ES:[DI.FDATE]
 0512  89 54 FE              C	        MOV     [SI-2],DX
 0515  26: 8B 55 16          C	        MOV     DX,ES:[DI.FTIME]
 0519  89 54 FC              C	        MOV     [SI-4],DX
 051C  E8 0681 R             C	        CALL    DIRWRITE
                             C	
 051F                        C	CHKFATWRT:
                             C	; Do FATWRT only if FAT is dirty and uses same I/O driver
 051F  8B 76 12              C	        MOV     SI,[BP.FAT]
 0522  8A 46 00              C	        MOV     AL,[BP.DEVNUM]
 0525  B4 01                 C	        MOV     AH,1
 0527  39 44 FE              C	        CMP     [SI-2],AX       ;See if FAT dirty and uses same driver
 052A  75 18                 C	        JNZ     OKRET
                             C	
 052C                        C	FATWRT:
                             C	
                             C	; Inputs:
                             C	;       DS = CS
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-21
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


                             C	;       BP = Base of drive parameter table
                             C	; Function:
                             C	;       Write the FAT back to disk and reset FAT
                             C	;       dirty bit.
                             C	; Outputs:
                             C	;       AL = 0
                             C	;       BP unchanged
                             C	; All other registers destroyed
                             C	
 052C  E8 0551 R             C	        CALL    FIGFAT
 052F  C6 47 FF 00           C	        MOV     BYTE PTR [BX-1],0
 0533                        C	EACHFAT:
 0533  52                    C	        PUSH    DX
 0534  51                    C	        PUSH    CX
 0535  53                    C	        PUSH    BX
 0536  50                    C	        PUSH    AX
 0537  E8 068C R             C	        CALL    DWRITE
 053A  58                    C	        POP     AX
 053B  5B                    C	        POP     BX
 053C  59                    C	        POP     CX
 053D  5A                    C	        POP     DX
 053E  03 D1                 C	        ADD     DX,CX
 0540  FE C8                 C	        DEC     AL
 0542  75 EF                 C	        JNZ     EACHFAT
 0544                        C	OKRET:
 0544  B0 00                 C	        MOV     AL,0
 0546  C3                    C	        RET
                             C	
 0547                        C	BADCLOSE:
 0547  8B 76 12              C	        MOV     SI,[BP.FAT]
 054A  C6 44 FF 00           C	        MOV     BYTE PTR [SI-1],0
 054E  B0 FF                 C	        MOV     AL,-1
 0550  C3                    C	        RET
                             C	
                             C	
 0551                        C	FIGFAT:
                             C	; Loads registers with values needed to read or
                             C	; write a FAT.
 0551  8A 46 08              C	        MOV     AL,[BP.FATCNT]
 0554  8B 5E 12              C	        MOV     BX,[BP.FAT]
 0557  8A 4E 0F              C	        MOV     CL,[BP.FATSIZ]  ;No. of records occupied by FAT
 055A  B5 00                 C	        MOV     CH,0
 055C  8B 56 06              C	        MOV     DX,[BP.FIRFAT]  ;Record number of start of FATs
 055F  C3                    C	        RET
                             C	
                             C	
 0560                        C	DIRCOMP:
                             C	; Prepare registers for directory read or write
 0560  98                    C	        CBW
 0561  03 46 10              C	        ADD     AX,[BP.FIRDIR]
 0564  8B D0                 C	        MOV     DX,AX
 0566  BB 025E R             C	        MOV     BX,OFFSET DOSGROUP:DIRBUF
 0569  B9 0001               C	        MOV     CX,1
 056C  C3                    C	        RET
                             C	
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-22
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


                             C	
 056D                        C	CREATE: ;System call 22
 056D  E8 0372 R             C	        CALL    MOVNAME
 0570  72 28                 C	        JC      ERRET3
 0572  BF 010B R             C	        MOV     DI,OFFSET DOSGROUP:NAME1
 0575  B9 000B               C	        MOV     CX,11
 0578  B0 3F                 C	        MOV     AL,"?"
 057A  F2/ AE                C	        REPNE   SCASB
 057C  74 1C                 C	        JZ      ERRET3
 057E  2E: C6 06 012F R FF   C	        MOV     CS:BYTE PTR [CREATING],-1
 0584  52                    C	        PUSH    DX
 0585  1E                    C	        PUSH    DS
 0586  E8 01DA R             C	        CALL    FINDNAME
 0589  73 12                 C	        JNC     EXISTENT
 058B  A1 015C R             C	        MOV     AX,[ENTFREE]    ;First free entry found in FINDNAME
 058E  3D FFFF               C	        CMP     AX,-1
 0591  74 05                 C	        JZ      ERRPOP
 0593  E8 0247 R             C	        CALL    GETENT          ;Point at that free entry
 0596  EB 21                 C	        JMP     SHORT FREESPOT
 0598                        C	ERRPOP:
 0598  1F                    C	        POP     DS
 0599  5A                    C	        POP     DX
 059A                        C	ERRET3:
 059A  B0 FF                 C	        MOV     AL,-1
 059C  C3                    C	        RET
                             C	
 059D                        C	EXISTENT:
 059D  75 F9                 C	        JNZ     ERRPOP          ;Error if attributes don't match
 059F  0A FF                 C	        OR      BH,BH           ;Check if file is I/O device
 05A1  78 3F                 C	        JS      OPENJMP         ;If so, no action
 05A3  8B 0C                 C	        MOV     CX,[SI]         ;Get pointer to clusters
 05A5  E3 12                 C	        JCXZ    FREESPOT
 05A7  3B 4E 0D              C	        CMP     CX,[BP.MAXCLUS]
 05AA  77 0D                 C	        JA      FREESPOT
 05AC  53                    C	        PUSH    BX
 05AD  8B D9                 C	        MOV     BX,CX
 05AF  8B 76 12              C	        MOV     SI,[BP.FAT]
 05B2  E8 0E2F R             C	        CALL    RELEASE         ;Free any data already allocated
 05B5  E8 052C R             C	        CALL    FATWRT
 05B8  5B                    C	        POP     BX
 05B9                        C	FREESPOT:
 05B9  8B FB                 C	        MOV     DI,BX
 05BB  BE 010B R             C	        MOV     SI,OFFSET DOSGROUP:NAME1
 05BE  B9 0005               C	        MOV     CX,5
 05C1  A4                    C	        MOVSB
 05C2  F3/ A5                C	        REP     MOVSW
 05C4  A0 0116 R             C	        MOV     AL,[ATTRIB]
 05C7  AA                    C	        STOSB
 05C8  33 C0                 C	        XOR     AX,AX
 05CA  B1 05                 C	        MOV     CL,5
 05CC  F3/ AB                C	        REP     STOSW
 05CE  E8 1400 R             C	        CALL    DATE16
 05D1  92                    C	        XCHG    AX,DX
 05D2  AB                    C	        STOSW
 05D3  92                    C	        XCHG    AX,DX
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-23
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 05D4  AB                    C	        STOSW
 05D5  33 C0                 C	        XOR     AX,AX
 05D7  57                    C	        PUSH    DI
 05D8  B1 06                 C	        MOV     CL,6
 05DA                        C	SMALLENT:
 05DA  F3/ AA                C	        REP     STOSB
 05DC  53                    C	        PUSH    BX
 05DD  E8 0681 R             C	        CALL    DIRWRITE
 05E0  5B                    C	        POP     BX
 05E1  5E                    C	        POP     SI
 05E2                        C	OPENJMP:
 05E2  F8                    C	        CLC                     ;Clear carry so OPEN won't fail
 05E3  07                    C	        POP     ES
 05E4  5F                    C	        POP     DI
 05E5  E9 03D0 R             C	        JMP     DOOPEN
                             C	
                             C	
 05E8                        C	DIRREAD:
                             C	
                             C	; Inputs:
                             C	;       DS = CS
                             C	;       AL = Directory block number
                             C	;       BP = Base of drive parameters
                             C	; Function:
                             C	;       Read the directory block into DIRBUF.
                             C	; Outputs:
                             C	;       AX,BP unchanged
                             C	; All other registers destroyed.
                             C	
 05E8  50                    C	        PUSH    AX
 05E9  E8 067A R             C	        CALL    CHKDIRWRITE
 05EC  58                    C	        POP     AX
 05ED  50                    C	        PUSH    AX
 05EE  8A 66 00              C	        MOV     AH,[BP.DEVNUM]
 05F1  A3 0041 R             C	        MOV     [DIRBUFID],AX
 05F4  E8 0560 R             C	        CALL    DIRCOMP
 05F7  E8 05FC R             C	        CALL    DREAD
 05FA  58                    C	        POP     AX
 05FB  C3                    C	RET8:   RET
                             C	
                             C	
 05FC                        C	DREAD:
                             C	
                             C	; Inputs:
                             C	;       BX,DS = Transfer address
                             C	;       CX = Number of sectors
                             C	;       DX = Absolute record number
                             C	;       BP = Base of drive parameters
                             C	; Function:
                             C	;       Calls BIOS to perform disk read. If BIOS reports
                             C	;       errors, will call HARDERR for further action.
                             C	; BP preserved. All other registers destroyed.
                             C	
 05FC  E8 0669 R             C	        CALL    DSKREAD
 05FF  73 FA                 C	        JNC     RET8
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-24
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0601  2E: C6 06 013B R 00   C	        MOV     CS:BYTE PTR [READOP],0
 0607  E8 060F R             C	        CALL    HARDERR
 060A  3C 01                 C	        CMP     AL,1            ;Check for retry
 060C  74 EE                 C	        JZ      DREAD
 060E  C3                    C	        RET                     ;Ignore otherwise
                             C	
                             C	
 060F                        C	HARDERR:
                             C	
                             C	;Hard disk error handler. Entry conditions:
                             C	;       DS:BX = Original disk transfer address
                             C	;       DX = Original logical sector number
                             C	;       CX = Number of sectors to go (first one gave the error)
                             C	;       AX = Hardware error code
                             C	;       DI = Original sector transfer count
                             C	;       BP = Base of drive parameters
                             C	;       [READOP] = 0 for read, 1 for write
                             C	
 060F  97                    C	        XCHG    AX,DI           ;Error code in DI, count in AX
 0610  2B C1                 C	        SUB     AX,CX           ;Number of sectors successfully transferred
 0612  03 D0                 C	        ADD     DX,AX           ;First sector number to retry
 0614  52                    C	        PUSH    DX
 0615  F7 66 02              C	        MUL     [BP.SECSIZ]     ;Number of bytes transferred
 0618  5A                    C	        POP     DX
 0619  03 D8                 C	        ADD     BX,AX           ;First address for retry
 061B  B4 00                 C	        MOV     AH,0            ;Flag disk section in error
 061D  3B 56 06              C	        CMP     DX,[BP.FIRFAT]  ;In reserved area?
 0620  72 10                 C	        JB      ERRINT
 0622  FE C4                 C	        INC     AH              ;Flag for FAT
 0624  3B 56 10              C	        CMP     DX,[BP.FIRDIR]  ;In FAT?
 0627  72 09                 C	        JB      ERRINT
 0629  FE C4                 C	        INC     AH
 062B  3B 56 0B              C	        CMP     DX,[BP.FIRREC]  ;In directory?
 062E  72 02                 C	        JB      ERRINT
 0630  FE C4                 C	        INC     AH              ;Must be in data area
 0632                        C	ERRINT:
 0632  D0 E4                 C	        SHL     AH,1            ;Make room for read/write bit
 0634  2E: 0A 26 013B R      C	        OR      AH,CS:[READOP]
 0639                        C	FATAL:
 0639  8A 46 01              C	        MOV     AL,[BP.DRVNUM]  ;Get drive number
 063C                        C	FATAL1:
 063C  55                    C	        PUSH    BP              ;The only thing we preserve
 063D  2E: 89 26 0135 R      C	        MOV     CS:[CONTSTK],SP
 0642  FA                    C	        CLI                     ;Prepare to play with stack
 0643  2E: 8E 16 0133 R      C	        MOV     SS,CS:[SSSAVE]
 0648  2E: 8B 26 0131 R      C	        MOV     SP,CS:[SPSAVE]  ;User stack pointer restored
 064D  CD 24                 C	        INT     24H             ;Fatal error interrupt vector
 064F  2E: 89 26 0131 R      C	        MOV     CS:[SPSAVE],SP
 0654  2E: 8C 16 0133 R      C	        MOV     CS:[SSSAVE],SS
 0659  8C CC                 C	        MOV     SP,CS
 065B  8E D4                 C	        MOV     SS,SP
 065D  2E: 8B 26 0135 R      C	        MOV     SP,CS:[CONTSTK]
 0662  FB                    C	        STI
 0663  5D                    C	        POP     BP
 0664  3C 02                 C	        CMP     AL,2
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-25
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0666  74 61                 C	        JZ      ERROR
 0668  C3                    C	        RET
                             C	
 0669                        C	DSKREAD:
 0669  8A 46 00              C	        MOV     AL,[BP.DEVNUM]
 066C  55                    C	        PUSH    BP
 066D  53                    C	        PUSH    BX
 066E  51                    C	        PUSH    CX
 066F  52                    C	        PUSH    DX
 0670  9A 0015 ---- R        C	        CALL    FAR PTR BIOSREAD 
 0675  5A                    C	        POP     DX
 0676  5F                    C	        POP     DI
 0677  5B                    C	        POP     BX
 0678  5D                    C	        POP     BP
 0679  C3                    C	RET9:   RET
                             C	
                             C	
 067A                        C	CHKDIRWRITE:
 067A  F6 06 002B R FF       C	        TEST    BYTE PTR [DIRTYDIR],-1
 067F  74 F8                 C	        JZ      RET9
                             C	
 0681                        C	DIRWRITE:
                             C	
                             C	; Inputs:
                             C	;       DS = CS
                             C	;       AL = Directory block number
                             C	;       BP = Base of drive parameters
                             C	; Function:
                             C	;       Write the directory block into DIRBUF.
                             C	; Outputs:
                             C	;       BP unchanged
                             C	; All other registers destroyed.
                             C	
 0681  C6 06 002B R 00       C	        MOV     BYTE PTR [DIRTYDIR],0
 0686  A0 0041 R             C	        MOV     AL,BYTE PTR [DIRBUFID]
 0689  E8 0560 R             C	        CALL    DIRCOMP
                             C	
                             C	
 068C                        C	DWRITE:
                             C	
                             C	; Inputs:
                             C	;       BX,DS = Transfer address
                             C	;       CX = Number of sectors
                             C	;       DX = Absolute record number
                             C	;       BP = Base of drive parameters
                             C	; Function:
                             C	;       Calls BIOS to perform disk write. If BIOS reports
                             C	;       errors, will call HARDERR for further action.
                             C	; BP preserved. All other registers destroyed.
                             C	
 068C  8A 46 00              C	        MOV     AL,[BP.DEVNUM]
 068F  2E: 8A 26 002E R      C	        MOV     AH,CS:VERFLG
 0694  55                    C	        PUSH    BP
 0695  53                    C	        PUSH    BX
 0696  51                    C	        PUSH    CX
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-26
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0697  52                    C	        PUSH    DX
 0698  9A 0018 ---- R        C	        CALL    FAR PTR BIOSWRITE 
 069D  5A                    C	        POP     DX
 069E  5F                    C	        POP     DI
 069F  5B                    C	        POP     BX
 06A0  5D                    C	        POP     BP
 06A1  73 D6                 C	        JNC     RET9
 06A3  2E: C6 06 013B R 01   C	        MOV     CS:BYTE PTR [READOP],1
 06A9  E8 060F R             C	        CALL    HARDERR
 06AC  3C 01                 C	        CMP     AL,1            ;Check for retry
 06AE  74 DC                 C	        JZ      DWRITE
 06B0  C3                    C	        RET
                             C	
                             C	
 06B1                        C	ABORT:
 06B1  2E: C5 36 0131 R      C	        LDS     SI,CS:DWORD PTR [SPSAVE]
 06B6  8E 5C 14              C	        MOV     DS,[SI.CSSAVE]
 06B9  33 C0                 C	        XOR     AX,AX
 06BB  8E C0                 C	        MOV     ES,AX
 06BD  BE 000A               C	        MOV     SI,SAVEXIT
 06C0  BF 0088               C	        MOV     DI,EXIT
 06C3  A5                    C	        MOVSW
 06C4  A5                    C	        MOVSW
 06C5  A5                    C	        MOVSW
 06C6  A5                    C	        MOVSW
 06C7  A5                    C	        MOVSW
 06C8  A5                    C	        MOVSW
 06C9                        C	ERROR:
 06C9  8C C8                 C	        MOV     AX,CS
 06CB  8E D8                 C	        MOV     DS,AX
 06CD  8E C0                 C	        MOV     ES,AX
 06CF  E8 0F66 R             C	        CALL    WRTFATS
 06D2  33 C0                 C	        XOR     AX,AX
 06D4  FA                    C	        CLI
 06D5  8E 16 0133 R          C	        MOV     SS,[SSSAVE]
 06D9  8B 26 0131 R          C	        MOV     SP,[SPSAVE]
 06DD  8E D8                 C	        MOV     DS,AX
 06DF  BE 0088               C	        MOV     SI,EXIT
 06E2  BF 0105 R             C	        MOV     DI,OFFSET DOSGROUP:EXITHOLD
 06E5  A5                    C	        MOVSW
 06E6  A5                    C	        MOVSW
 06E7  58                    C	        POP     AX
 06E8  5B                    C	        POP     BX
 06E9  59                    C	        POP     CX
 06EA  5A                    C	        POP     DX
 06EB  5E                    C	        POP     SI
 06EC  5F                    C	        POP     DI
 06ED  5D                    C	        POP     BP
 06EE  1F                    C	        POP     DS
 06EF  07                    C	        POP     ES
 06F0  FB                    C	        STI             ;Stack OK now
 06F1  2E: FF 2E 0105 R      C	        JMP     CS:DWORD PTR [EXITHOLD]
                             C	
                             C	
 06F6                        C	SEQRD:  ;System call 20
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-27
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 06F6  E8 0D9A R             C	        CALL    GETREC
 06F9  E8 0A1E R             C	        CALL    LOAD
 06FC  EB 06                 C	        JMP     SHORT FINSEQ
                             C	
 06FE                        C	SEQWRT: ;System call 21
 06FE  E8 0D9A R             C	        CALL    GETREC
 0701  E8 0BA9 R             C	        CALL    STORE
 0704                        C	FINSEQ:
 0704  E3 45                 C	        JCXZ    SETNREX
 0706  05 0001               C	        ADD     AX,1
 0709  83 D2 00              C	        ADC     DX,0
 070C  EB 3D                 C	        JMP     SHORT SETNREX
                             C	
 070E                        C	RNDRD:  ;System call 33
 070E  E8 0767 R             C	        CALL    GETRRPOS1
 0711  E8 0A1E R             C	        CALL    LOAD
 0714  EB 25                 C	        JMP     SHORT FINRND
                             C	
 0716                        C	RNDWRT: ;System call 34
 0716  E8 0767 R             C	        CALL    GETRRPOS1
 0719  E8 0BA9 R             C	        CALL    STORE
 071C  EB 1D                 C	        JMP     SHORT FINRND
                             C	
 071E                        C	BLKRD:  ;System call 39
 071E  E8 076A R             C	        CALL    GETRRPOS
 0721  E8 0A1E R             C	        CALL    LOAD
 0724  EB 06                 C	        JMP     SHORT FINBLK
                             C	
 0726                        C	BLKWRT: ;System call 40
 0726  E8 076A R             C	        CALL    GETRRPOS
 0729  E8 0BA9 R             C	        CALL    STORE
 072C                        C	FINBLK:
 072C  C5 36 0131 R          C	        LDS     SI,DWORD PTR [SPSAVE]
 0730  89 4C 04              C	        MOV     [SI.CXSAVE],CX
 0733  E3 06                 C	        JCXZ    FINRND
 0735  05 0001               C	        ADD     AX,1
 0738  83 D2 00              C	        ADC     DX,0
 073B                        C	FINRND:
 073B  26: 89 45 21          C	        MOV     ES:WORD PTR [DI.RR],AX
 073F  26: 88 55 23          C	        MOV     ES:[DI.RR+2],DL
 0743  0A F6                 C	        OR      DH,DH
 0745  74 04                 C	        JZ      SETNREX
 0747  26: 88 75 24          C	        MOV     ES:[DI.RR+3],DH ;Save 4 byte of RECPOS only if significant
 074B                        C	SETNREX:
 074B  8B C8                 C	        MOV     CX,AX
 074D  24 7F                 C	        AND     AL,7FH
 074F  26: 88 45 20          C	        MOV     ES:[DI.NR],AL
 0753  80 E1 80              C	        AND     CL,80H
 0756  D1 E1                 C	        SHL     CX,1
 0758  D1 D2                 C	        RCL     DX,1
 075A  8A C5                 C	        MOV     AL,CH
 075C  8A E2                 C	        MOV     AH,DL
 075E  26: 89 45 0C          C	        MOV     ES:[DI.EXTENT],AX
 0762  2E: A0 0138 R         C	        MOV     AL,CS:[DSKERR]
 0766  C3                    C	        RET
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-28
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


                             C	
 0767                        C	GETRRPOS1:
 0767  B9 0001               C	        MOV     CX,1
 076A                        C	GETRRPOS:
 076A  8B FA                 C	        MOV     DI,DX
 076C  80 3D FF              C	        CMP     BYTE PTR [DI],-1
 076F  75 03                 C	        JNZ     NORMFCB1
 0771  83 C7 07              C	        ADD     DI,7
 0774                        C	NORMFCB1:
 0774  8B 45 21              C	        MOV     AX,WORD PTR [DI.RR]
 0777  8B 55 23              C	        MOV     DX,WORD PTR [DI.RR+2]
 077A  C3                    C	        RET
                             C	
 077B                        C	NOFILERR:
 077B  33 C9                 C	        XOR     CX,CX
 077D  C6 06 0138 R 04       C	        MOV     BYTE PTR [DSKERR],4
 0782  5B                    C	        POP     BX
 0783  C3                    C	        RET
                             C	
 0784                        C	SETUP:
                             C	
                             C	; Inputs:
                             C	;       DS:DI point to FCB
                             C	;       DX:AX = Record position in file of disk transfer
                             C	;       CX = Record count
                             C	; Outputs:
                             C	;       DS = CS
                             C	;       ES:DI point to FCB
                             C	;       BL = DEVID from FCB
                             C	;       CX = No. of bytes to transfer
                             C	;       BP = Base of drive parameters
                             C	;       SI = FAT pointer
                             C	;       [RECCNT] = Record count
                             C	;       [RECPOS] = Record position in file
                             C	;       [FCB] = DI
                             C	;       [NEXTADD] = Displacement of disk transfer within segment
                             C	;       [SECPOS] = Position of first sector
                             C	;       [BYTPOS] = Byte position in file
                             C	;       [BYTSECPOS] = Byte position in first sector
                             C	;       [CLUSNUM] = First cluster
                             C	;       [SECCLUSPOS] = Sector within first cluster
                             C	;       [DSKERR] = 0 (no errors yet)
                             C	;       [TRANS] = 0 (No transfers yet)
                             C	;       [THISDRV] = Physical drive unit number
                             C	; If SETUP detects no records will be transfered, it returns 1 level up 
                             C	; with CX = 0.
                             C	
 0784  50                    C	        PUSH    AX
 0785  8A 05                 C	        MOV     AL,[DI]
 0787  FE C8                 C	        DEC     AL
 0789  2E: A2 013C R         C	        MOV     CS:[THISDRV],AL
 078D  8A 45 18              C	        MOV     AL,[DI.DEVID]
 0790  8B 75 0E              C	        MOV     SI,[DI.RECSIZ]
 0793  0B F6                 C	        OR      SI,SI
 0795  75 06                 C	        JNZ     HAVRECSIZ
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-29
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0797  BE 0080               C	        MOV     SI,128
 079A  89 75 0E              C	        MOV     [DI.RECSIZ],SI
 079D                        C	HAVRECSIZ:
 079D  1E                    C	        PUSH    DS
 079E  07                    C	        POP     ES              ;Set ES to DS
 079F  0E                    C	        PUSH    CS
 07A0  1F                    C	        POP     DS              ;Set DS to CS
 07A1  0A C0                 C	        OR      AL,AL           ;Is it a device?
 07A3  79 02                 C	        JNS     NOTDEVICE
 07A5  B0 00                 C	        MOV     AL,0            ;Fake in drive 0 so we can get SP
 07A7                        C	NOTDEVICE:
 07A7  E8 0492 R             C	        CALL    GETBP
 07AA  58                    C	        POP     AX
 07AB  72 CE                 C	        JC      NOFILERR
 07AD  83 FE 40              C	        CMP     SI,64           ;Check if highest byte of RECPOS is significant
 07B0  72 02                 C	        JB      SMALREC
 07B2  B6 00                 C	        MOV     DH,0            ;Ignore MSB if record >= 64 bytes
 07B4                        C	SMALREC:
 07B4  89 0E 0146 R          C	        MOV     [RECCNT],CX
 07B8  A3 0142 R             C	        MOV     WORD PTR [RECPOS],AX
 07BB  89 16 0144 R          C	        MOV     WORD PTR [RECPOS+2],DX
 07BF  89 3E 013E R          C	        MOV     [FCB],DI
 07C3  8B 1E 0031 R          C	        MOV     BX,[DMAADD]
 07C7  89 1E 0140 R          C	        MOV     [NEXTADD],BX
 07CB  C6 06 0138 R 00       C	        MOV     BYTE PTR [DSKERR],0
 07D0  C6 06 0139 R 00       C	        MOV     BYTE PTR [TRANS],0
 07D5  8B DA                 C	        MOV     BX,DX
 07D7  F7 E6                 C	        MUL     SI
 07D9  A3 0152 R             C	        MOV     WORD PTR [BYTPOS],AX
 07DC  52                    C	        PUSH    DX
 07DD  8B C3                 C	        MOV     AX,BX
 07DF  F7 E6                 C	        MUL     SI
 07E1  5B                    C	        POP     BX
 07E2  03 C3                 C	        ADD     AX,BX
 07E4  83 D2 00              C	        ADC     DX,0            ;Ripple carry
 07E7  75 5A                 C	        JNZ     EOFERR
 07E9  A3 0154 R             C	        MOV     WORD PTR [BYTPOS+2],AX
 07EC  8B D0                 C	        MOV     DX,AX
 07EE  A1 0152 R             C	        MOV     AX,WORD PTR [BYTPOS]
 07F1  8B 5E 02              C	        MOV     BX,[BP.SECSIZ]
 07F4  3B D3                 C	        CMP     DX,BX           ;See if divide will overflow
 07F6  73 4B                 C	        JNC     EOFERR
 07F8  F7 F3                 C	        DIV     BX
 07FA  A3 014C R             C	        MOV     [SECPOS],AX
 07FD  89 16 0150 R          C	        MOV     [BYTSECPOS],DX
 0801  8B D0                 C	        MOV     DX,AX
 0803  22 46 04              C	        AND     AL,[BP.CLUSMSK]
 0806  A2 0137 R             C	        MOV     [SECCLUSPOS],AL
 0809  8B C1                 C	        MOV     AX,CX           ;Record count
 080B  8A 4E 05              C	        MOV     CL,[BP.CLUSSHFT]
 080E  D3 EA                 C	        SHR     DX,CL
 0810  89 16 014A R          C	        MOV     [CLUSNUM],DX
 0814  F7 E6                 C	        MUL     SI              ;Multiply by bytes per record
 0816  8B C8                 C	        MOV     CX,AX
 0818  03 06 0031 R          C	        ADD     AX,[DMAADD]     ;See if it will fit in one segment
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-30
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 081C  83 D2 00              C	        ADC     DX,0
 081F  74 1A                 C	        JZ      OK              ;Must be less than 64K
 0821  A1 0031 R             C	        MOV     AX,[DMAADD]
 0824  F7 D8                 C	        NEG     AX              ;Amount of room left in segment
 0826  75 01                 C	        JNZ     PARTSEG         ;All 64K available?
 0828  48                    C	        DEC     AX              ;If so, reduce by one
 0829                        C	PARTSEG:
 0829  33 D2                 C	        XOR     DX,DX
 082B  F7 F6                 C	        DIV     SI              ;How many records will fit?
 082D  A3 0146 R             C	        MOV     [RECCNT],AX
 0830  F7 E6                 C	        MUL     SI              ;Translate that back into bytes
 0832  C6 06 0138 R 02       C	        MOV     BYTE PTR [DSKERR],2     ;Flag that trimming took place
 0837  8B C8                 C	        MOV     CX,AX
 0839  E3 0F                 C	        JCXZ    NOROOM
 083B                        C	OK:
 083B  26: 8A 5D 18          C	        MOV     BL,ES:[DI.DEVID]
 083F  8B 76 12              C	        MOV     SI,[BP.FAT]
 0842  C3                    C	        RET
                             C	
 0843                        C	EOFERR:
 0843  C6 06 0138 R 01       C	        MOV     BYTE PTR [DSKERR],1
 0848  33 C9                 C	        XOR     CX,CX
 084A                        C	NOROOM:
 084A  5B                    C	        POP     BX              ;Kill return address
 084B  C3                    C	        RET
                             C	
 084C                        C	BREAKDOWN:
                             C	
                             C	;Inputs:
                             C	;       DS = CS
                             C	;       CX = Length of disk transfer in bytes
                             C	;       BP = Base of drive parameters
                             C	;       [BYTSECPOS] = Byte position witin first sector
                             C	;Outputs:
                             C	;       [BYTCNT1] = Bytes to transfer in first sector
                             C	;       [SECCNT] = No. of whole sectors to transfer
                             C	;       [BYTCNT2] = Bytes to transfer in last sector
                             C	;AX, BX, DX destroyed. No other registers affected.
                             C	
 084C  A1 0150 R             C	        MOV     AX,[BYTSECPOS]
 084F  8B D9                 C	        MOV     BX,CX
 0851  0B C0                 C	        OR      AX,AX
 0853  74 0D                 C	        JZ      SAVFIR          ;Partial first sector?
 0855  2B 46 02              C	        SUB     AX,[BP.SECSIZ]
 0858  F7 D8                 C	        NEG     AX              ;Max number of bytes left in first sector
 085A  2B D8                 C	        SUB     BX,AX           ;Subtract from total length
 085C  73 04                 C	        JAE     SAVFIR
 085E  03 C3                 C	        ADD     AX,BX           ;Don't use all of the rest of the sector
 0860  33 DB                 C	        XOR     BX,BX           ;And no bytes are left
 0862                        C	SAVFIR:
 0862  A3 0156 R             C	        MOV     [BYTCNT1],AX
 0865  8B C3                 C	        MOV     AX,BX
 0867  33 D2                 C	        XOR     DX,DX
 0869  F7 76 02              C	        DIV     [BP.SECSIZ]     ;How many whole sectors?
 086C  A3 015A R             C	        MOV     [SECCNT],AX
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-31
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 086F  89 16 0158 R          C	        MOV     [BYTCNT2],DX    ;Bytes remaining for last sector
 0873  C3                    C	RET10:  RET
                             C	
                             C	
 0874                        C	FNDCLUS:
                             C	
                             C	; Inputs:
                             C	;       DS = CS
                             C	;       CX = No. of clusters to skip
                             C	;       BP = Base of drive parameters
                             C	;       SI = FAT pointer
                             C	;       ES:DI point to FCB
                             C	; Outputs:
                             C	;       BX = Last cluster skipped to
                             C	;       CX = No. of clusters remaining (0 unless EOF)
                             C	;       DX = Position of last cluster
                             C	; DI destroyed. No other registers affected.
                             C	
 0874  26: 8B 5D 1B          C	        MOV     BX,ES:[DI.LSTCLUS]
 0878  26: 8B 55 1D          C	        MOV     DX,ES:[DI.CLUSPOS]
 087C  0B DB                 C	        OR      BX,BX
 087E  74 1D                 C	        JZ      NOCLUS
 0880  2B CA                 C	        SUB     CX,DX
 0882  73 08                 C	        JNB     FINDIT
 0884  03 CA                 C	        ADD     CX,DX
 0886  33 D2                 C	        XOR     DX,DX
 0888  26: 8B 5D 19          C	        MOV     BX,ES:[DI.FIRCLUS]
 088C                        C	FINDIT:
 088C  E3 E5                 C	        JCXZ    RET10
 088E                        C	SKPCLP:
 088E  E8 0157 R             C	        CALL    UNPACK
 0891  81 FF 0FF8            C	        CMP     DI,0FF8H
 0895  73 DC                 C	        JAE     RET10
 0897  87 DF                 C	        XCHG    BX,DI
 0899  42                    C	        INC     DX
 089A  E2 F2                 C	        LOOP    SKPCLP
 089C  C3                    C	        RET
 089D                        C	NOCLUS:
 089D  41                    C	        INC     CX
 089E  4A                    C	        DEC     DX
 089F  C3                    C	        RET
                             C	
                             C	
 08A0                        C	BUFSEC:
                             C	; Inputs:
                             C	;       AL = 0 if buffer must be read, 1 if no pre-read needed
                             C	;       BP = Base of drive parameters
                             C	;       [CLUSNUM] = Physical cluster number
                             C	;       [SECCLUSPOS] = Sector position of transfer within cluster
                             C	;       [BYTCNT1] = Size of transfer
                             C	; Function:
                             C	;       Insure specified sector is in buffer, flushing buffer before
                             C	;       read if necessary.
                             C	; Outputs:
                             C	;       SI = Pointer to buffer
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-32
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


                             C	;       DI = Pointer to transfer address
                             C	;       CX = Number of bytes
                             C	;       [NEXTADD] updated
                             C	;       [TRANS] set to indicate a transfer will occur
                             C	
 08A0  8B 16 014A R          C	        MOV     DX,[CLUSNUM]
 08A4  8A 1E 0137 R          C	        MOV     BL,[SECCLUSPOS]
 08A8  E8 0D8B R             C	        CALL    FIGREC
 08AB  A2 013A R             C	        MOV     [PREREAD],AL
 08AE  3B 16 003B R          C	        CMP     DX,[BUFSECNO]
 08B2  75 09                 C	        JNZ     GETSEC
 08B4  A0 003D R             C	        MOV     AL,[BUFDRVNO]
 08B7  3A 06 013C R          C	        CMP     AL,[THISDRV]
 08BB  74 4A                 C	        JZ      FINBUF          ;Already have it?
 08BD                        C	GETSEC:
 08BD  32 C0                 C	        XOR     AL,AL
 08BF  86 06 003E R          C	        XCHG    [DIRTYBUF],AL   ;Read dirty flag and reset it
 08C3  0A C0                 C	        OR      AL,AL
 08C5  74 16                 C	        JZ      RDSEC
 08C7  52                    C	        PUSH    DX
 08C8  55                    C	        PUSH    BP
 08C9  8B 2E 003F R          C	        MOV     BP,[BUFDRVBP]
 08CD  8B 1E 0039 R          C	        MOV     BX,[BUFFER]
 08D1  B9 0001               C	        MOV     CX,1
 08D4  8B 16 003B R          C	        MOV     DX,[BUFSECNO]
 08D8  E8 068C R             C	        CALL    DWRITE
 08DB  5D                    C	        POP     BP
 08DC  5A                    C	        POP     DX
 08DD                        C	RDSEC:
 08DD  F6 06 013A R FF       C	        TEST    BYTE PTR [PREREAD],-1
 08E2  75 15                 C	        JNZ     SETBUF
 08E4  33 C0                 C	        XOR     AX,AX
 08E6  A3 003B R             C	        MOV     [BUFSECNO],AX           ;Set buffer valid in case of disk error
 08E9  48                    C	        DEC     AX
 08EA  A2 003D R             C	        MOV     [BUFDRVNO],AL
 08ED  8B 1E 0039 R          C	        MOV     BX,[BUFFER]
 08F1  B9 0001               C	        MOV     CX,1
 08F4  52                    C	        PUSH    DX
 08F5  E8 05FC R             C	        CALL    DREAD
 08F8  5A                    C	        POP     DX
 08F9                        C	SETBUF:
 08F9  89 16 003B R          C	        MOV     [BUFSECNO],DX
 08FD  A0 013C R             C	        MOV     AL,[THISDRV]
 0900  A2 003D R             C	        MOV     [BUFDRVNO],AL
 0903  89 2E 003F R          C	        MOV     [BUFDRVBP],BP
 0907                        C	FINBUF:
 0907  C6 06 0139 R 01       C	        MOV     BYTE PTR [TRANS],1      ;A transfer is taking place
 090C  8B 3E 0140 R          C	        MOV     DI,[NEXTADD]
 0910  8B F7                 C	        MOV     SI,DI
 0912  8B 0E 0156 R          C	        MOV     CX,[BYTCNT1]
 0916  03 F1                 C	        ADD     SI,CX
 0918  89 36 0140 R          C	        MOV     [NEXTADD],SI
 091C  8B 36 0039 R          C	        MOV     SI,[BUFFER]
 0920  03 36 0150 R          C	        ADD     SI,[BYTSECPOS]
 0924  C3                    C	        RET
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-33
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


                             C	
 0925                        C	BUFRD:
 0925  32 C0                 C	        XOR     AL,AL           ;Pre-read necessary
 0927  E8 08A0 R             C	        CALL    BUFSEC
 092A  06                    C	        PUSH    ES
 092B  8E 06 0033 R          C	        MOV     ES,[DMAADD+2]
 092F  D1 E9                 C	        SHR     CX,1
 0931  73 01                 C	        JNC     EVENRD
 0933  A4                    C	        MOVSB
 0934                        C	EVENRD:
 0934  F3/ A5                C	        REP     MOVSW
 0936  07                    C	        POP     ES
 0937  C3                    C	        RET
                             C	
 0938                        C	BUFWRT:
 0938  A1 014C R             C	        MOV     AX,[SECPOS]
 093B  40                    C	        INC     AX              ;Set for next sector
 093C  A3 014C R             C	        MOV     [SECPOS],AX
 093F  3B 06 014E R          C	        CMP     AX,[VALSEC]     ;Has sector been written before?
 0943  B0 01                 C	        MOV     AL,1
 0945  77 02                 C	        JA      NOREAD          ;Skip preread if SECPOS>VALSEC
 0947  B0 00                 C	        MOV     AL,0
 0949                        C	NOREAD:
 0949  E8 08A0 R             C	        CALL    BUFSEC
 094C  87 FE                 C	        XCHG    DI,SI
 094E  1E                    C	        PUSH    DS
 094F  06                    C	        PUSH    ES
 0950  0E                    C	        PUSH    CS
 0951  07                    C	        POP     ES
 0952  8E 1E 0033 R          C	        MOV     DS,[DMAADD+2]
 0956  D1 E9                 C	        SHR     CX,1
 0958  73 01                 C	        JNC     EVENWRT
 095A  A4                    C	        MOVSB
 095B                        C	EVENWRT:
 095B  F3/ A5                C	        REP     MOVSW
 095D  07                    C	        POP     ES
 095E  1F                    C	        POP     DS
 095F  C6 06 003E R 01       C	        MOV     BYTE PTR [DIRTYBUF],1
 0964  C3                    C	        RET
                             C	
 0965                        C	NEXTSEC:
 0965  F6 06 0139 R FF       C	        TEST    BYTE PTR [TRANS],-1
 096A  74 27                 C	        JZ      CLRET
 096C  A0 0137 R             C	        MOV     AL,[SECCLUSPOS]
 096F  FE C0                 C	        INC     AL
 0971  3A 46 04              C	        CMP     AL,[BP.CLUSMSK]
 0974  76 1A                 C	        JBE     SAVPOS
 0976  8B 1E 014A R          C	        MOV     BX,[CLUSNUM]
 097A  81 FB 0FF8            C	        CMP     BX,0FF8H
 097E  73 15                 C	        JAE     NONEXT
 0980  8B 76 12              C	        MOV     SI,[BP.FAT]
 0983  E8 0157 R             C	        CALL    UNPACK
 0986  89 3E 014A R          C	        MOV     [CLUSNUM],DI
 098A  FF 06 0148 R          C	        INC     [LASTPOS]
 098E  B0 00                 C	        MOV     AL,0
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-34
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0990                        C	SAVPOS:
 0990  A2 0137 R             C	        MOV     [SECCLUSPOS],AL
 0993                        C	CLRET:
 0993  F8                    C	        CLC
 0994  C3                    C	        RET
 0995                        C	NONEXT:
 0995  F9                    C	        STC
 0996  C3                    C	        RET
                             C	
 0997                        C	TRANBUF:
 0997  AC                    C	        LODSB
 0998  AA                    C	        STOSB
 0999  3C 0D                 C	        CMP     AL,13           ;Check for carriage return
 099B  75 03                 C	        JNZ     NORMCH
 099D  C6 04 0A              C	        MOV     BYTE PTR [SI],10
 09A0                        C	NORMCH:
 09A0  3C 0A                 C	        CMP     AL,10
 09A2  E0 F3                 C	        LOOPNZ  TRANBUF
 09A4  75 0B                 C	        JNZ     ENDRDCON
 09A6  E8 119F R             C	        CALL    OUT             ;Transmit linefeed
 09A9  33 F6                 C	        XOR     SI,SI
 09AB  0B C9                 C	        OR      CX,CX
 09AD  75 47                 C	        JNZ     GETBUF
 09AF  0C 01                 C	        OR      AL,1            ;Clear zero flag--not end of file
 09B1                        C	ENDRDCON:
 09B1  89 36 002F R          C	        MOV     [CONTPOS],SI
 09B5                        C	ENDRDDEV:
 09B5  89 3E 0140 R          C	        MOV     [NEXTADD],DI
 09B9  07                    C	        POP     ES
 09BA  75 09                 C	        JNZ     SETFCBJ         ;Zero set if Ctrl-Z found in input
 09BC  8B 3E 013E R          C	        MOV     DI,[FCB]
 09C0  26: 80 65 18 BF       C	        AND     ES:BYTE PTR [DI.DEVID],0FFH-40H ;Mark as no more data available
 09C5                        C	SETFCBJ:
 09C5  E9 0ACD R             C	        JMP     SETFCB
                             C	
 09C8                        C	READDEV:
 09C8  06                    C	        PUSH    ES
 09C9  C4 3E 0031 R          C	        LES     DI,DWORD PTR [DMAADD]
 09CD  FE C3                 C	        INC     BL
 09CF  74 0E                 C	        JZ      READCON
 09D1  FE C3                 C	        INC     BL
 09D3  75 E0                 C	        JNZ     ENDRDDEV
 09D5                        C	READAUX:
 09D5  E8 0141 R             C	        CALL    AUXIN
 09D8  AA                    C	        STOSB
 09D9  3C 1A                 C	        CMP     AL,1AH
 09DB  E0 F8                 C	        LOOPNZ  READAUX
 09DD  EB D6                 C	        JMP     SHORT ENDRDDEV
                             C	
 09DF                        C	READCON:
 09DF  0E                    C	        PUSH    CS
 09E0  1F                    C	        POP     DS
 09E1  8B 36 002F R          C	        MOV     SI,[CONTPOS]
 09E5  0B F6                 C	        OR      SI,SI
 09E7  75 AE                 C	        JNZ     TRANBUF
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-35
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 09E9  80 3E 0080 R 80       C	        CMP     BYTE PTR [CONBUF],128
 09EE  74 06                 C	        JZ      GETBUF
 09F0  C7 06 0080 R FF80     C	        MOV     WORD PTR [CONBUF],0FF80H        ;Set up 128-byte buffer with no template
 09F6                        C	GETBUF:
 09F6  51                    C	        PUSH    CX
 09F7  06                    C	        PUSH    ES
 09F8  57                    C	        PUSH    DI
 09F9  BA 0080 R             C	        MOV     DX,OFFSET DOSGROUP:CONBUF
 09FC  E8 0FBD R             C	        CALL    BUFIN           ;Get input buffer
 09FF  5F                    C	        POP     DI
 0A00  07                    C	        POP     ES
 0A01  59                    C	        POP     CX
 0A02  BE 0082 R             C	        MOV     SI,2 + OFFSET DOSGROUP:CONBUF
 0A05  80 3C 1A              C	        CMP     BYTE PTR [SI],1AH       ;Check for Ctrl-Z in first character
 0A08  75 8D                 C	        JNZ     TRANBUF
 0A0A  B0 1A                 C	        MOV     AL,1AH
 0A0C  AA                    C	        STOSB
 0A0D  B0 0A                 C	        MOV     AL,10
 0A0F  E8 119F R             C	        CALL    OUT             ;Send linefeed
 0A12  33 F6                 C	        XOR     SI,SI
 0A14  EB 9B                 C	        JMP     SHORT ENDRDCON
                             C	
 0A16                        C	RDERR:
 0A16  33 C9                 C	        XOR     CX,CX
 0A18  E9 0B92 R             C	        JMP     WRTERR
                             C	
 0A1B  E9 0B2D R             C	RDLASTJ:JMP     RDLAST
                             C	
 0A1E                        C	LOAD:
                             C	
                             C	; Inputs:
                             C	;       DS:DI point to FCB
                             C	;       DX:AX = Position in file to read
                             C	;       CX = No. of records to read
                             C	; Outputs:
                             C	;       DX:AX = Position of last record read
                             C	;       CX = No. of bytes read
                             C	;       ES:DI point to FCB
                             C	;       LSTCLUS, CLUSPOS fields in FCB set
                             C	
 0A1E  E8 0784 R             C	        CALL    SETUP
 0A21  0A DB                 C	        OR      BL,BL           ;Check for named device I/O
 0A23  78 A3                 C	        JS      READDEV
 0A25  26: 8B 45 10          C	        MOV     AX,ES:WORD PTR [DI.FILSIZ]
 0A29  26: 8B 5D 12          C	        MOV     BX,ES:WORD PTR [DI.FILSIZ+2]
 0A2D  2B 06 0152 R          C	        SUB     AX,WORD PTR [BYTPOS]
 0A31  1B 1E 0154 R          C	        SBB     BX,WORD PTR [BYTPOS+2]
 0A35  72 DF                 C	        JB      RDERR
 0A37  75 0A                 C	        JNZ     ENUF
 0A39  0B C0                 C	        OR      AX,AX
 0A3B  74 D9                 C	        JZ      RDERR
 0A3D  3B C1                 C	        CMP     AX,CX
 0A3F  73 02                 C	        JAE     ENUF
 0A41  8B C8                 C	        MOV     CX,AX
 0A43                        C	ENUF:
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-36
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0A43  E8 084C R             C	        CALL    BREAKDOWN
 0A46  8B 0E 014A R          C	        MOV     CX,[CLUSNUM]
 0A4A  E8 0874 R             C	        CALL    FNDCLUS
 0A4D  0B C9                 C	        OR      CX,CX
 0A4F  75 C5                 C	        JNZ     RDERR
 0A51  89 16 0148 R          C	        MOV     [LASTPOS],DX
 0A55  89 1E 014A R          C	        MOV     [CLUSNUM],BX
 0A59  83 3E 0156 R 00       C	        CMP     [BYTCNT1],0
 0A5E  74 03                 C	        JZ      RDMID
 0A60  E8 0925 R             C	        CALL    BUFRD
 0A63                        C	RDMID:
 0A63  83 3E 015A R 00       C	        CMP     [SECCNT],0
 0A68  74 B1                 C	        JZ      RDLASTJ
 0A6A  E8 0965 R             C	        CALL    NEXTSEC
 0A6D  72 5E                 C	        JC      SETFCB
 0A6F  C6 06 0139 R 01       C	        MOV     BYTE PTR [TRANS],1      ;A transfer is taking place
 0A74                        C	ONSEC:
 0A74  8A 16 0137 R          C	        MOV     DL,[SECCLUSPOS]
 0A78  8B 0E 015A R          C	        MOV     CX,[SECCNT]
 0A7C  8B 1E 014A R          C	        MOV     BX,[CLUSNUM]
 0A80                        C	RDLP:
 0A80  E8 0D15 R             C	        CALL    OPTIMIZE
 0A83  57                    C	        PUSH    DI
 0A84  50                    C	        PUSH    AX
 0A85  1E                    C	        PUSH    DS
 0A86  8E 1E 0033 R          C	        MOV     DS,[DMAADD+2]
 0A8A  52                    C	        PUSH    DX
 0A8B  53                    C	        PUSH    BX
 0A8C  9C                    C	        PUSHF                   ;Save carry flag
 0A8D  E8 05FC R             C	        CALL DREAD
 0A90  9D                    C	        POPF                    ;Restore carry flag
 0A91  5F                    C	        POP     DI              ;Initial transfer address
 0A92  58                    C	        POP     AX              ;First sector transfered
 0A93  1F                    C	        POP     DS
 0A94  72 25                 C	        JC      NOTBUFFED       ;Was one of those sectors in the buffer?
 0A96  80 3E 003E R 00       C	        CMP     BYTE PTR [DIRTYBUF],0   ;Is buffer dirty?
 0A9B  74 1E                 C	        JZ      NOTBUFFED       ;If not no problem
                             C	;We have transfered in a sector from disk when a dirty copy of it is in the buffer.
                             C	;We must transfer the sector from the buffer to correct memory address
 0A9D  2B 06 003B R          C	        SUB     AX,[BUFSECNO]   ;How many sectors into the transfer?
 0AA1  F7 D8                 C	        NEG     AX
 0AA3  8B 4E 02              C	        MOV     CX,[BP.SECSIZ]
 0AA6  F7 E1                 C	        MUL     CX              ;How many bytes into the transfer?
 0AA8  03 F8                 C	        ADD     DI,AX
 0AAA  8B 36 0039 R          C	        MOV     SI,[BUFFER]
 0AAE  06                    C	        PUSH    ES
 0AAF  8E 06 0033 R          C	        MOV     ES,[DMAADD+2]   ;Get disk transfer segment
 0AB3  D1 E9                 C	        SHR     CX,1
 0AB5  F3/ A5                C	        REP     MOVSW
 0AB7  73 01                 C	        JNC     EVENMOV
 0AB9  A4                    C	        MOVSB
 0ABA                        C	EVENMOV:
 0ABA  07                    C	        POP     ES
 0ABB                        C	NOTBUFFED:
 0ABB  59                    C	        POP     CX
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-37
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0ABC  5B                    C	        POP     BX
 0ABD  E3 6E                 C	        JCXZ    RDLAST
 0ABF  81 FB 0FF8            C	        CMP     BX,0FF8H
 0AC3  73 08                 C	        JAE     SETFCB
 0AC5  B2 00                 C	        MOV     DL,0
 0AC7  FF 06 0148 R          C	        INC     [LASTPOS]       ;We'll be using next cluster
 0ACB  EB B3                 C	        JMP     SHORT RDLP
                             C	
 0ACD                        C	SETFCB:
 0ACD  8B 36 013E R          C	        MOV     SI,[FCB]
 0AD1  A1 0140 R             C	        MOV     AX,[NEXTADD]
 0AD4  8B F8                 C	        MOV     DI,AX
 0AD6  2B 06 0031 R          C	        SUB     AX,[DMAADD]     ;Number of bytes transfered
 0ADA  33 D2                 C	        XOR     DX,DX
 0ADC  26: 8B 4C 0E          C	        MOV     CX,ES:[SI.RECSIZ]
 0AE0  F7 F1                 C	        DIV     CX              ;Number of records
 0AE2  3B 06 0146 R          C	        CMP     AX,[RECCNT]     ;Check if all records transferred
 0AE6  74 22                 C	        JZ      FULLREC
 0AE8  C6 06 0138 R 01       C	        MOV     BYTE PTR [DSKERR],1
 0AED  0B D2                 C	        OR      DX,DX
 0AEF  74 19                 C	        JZ      FULLREC         ;If remainder 0, then full record transfered
 0AF1  C6 06 0138 R 03       C	        MOV     BYTE PTR [DSKERR],3     ;Flag partial last record
 0AF6  2B CA                 C	        SUB     CX,DX           ;Bytes left in last record
 0AF8  06                    C	        PUSH    ES
 0AF9  8E 06 0033 R          C	        MOV     ES,[DMAADD+2]
 0AFD  93                    C	        XCHG    AX,BX           ;Save the record count temporarily
 0AFE  33 C0                 C	        XOR     AX,AX           ;Fill with zeros
 0B00  D1 E9                 C	        SHR     CX,1
 0B02  73 01                 C	        JNC     EVENFIL
 0B04  AA                    C	        STOSB
 0B05                        C	EVENFIL:
 0B05  F3/ AB                C	        REP     STOSW
 0B07  93                    C	        XCHG    AX,BX           ;Restore record count to AX
 0B08  07                    C	        POP     ES
 0B09  40                    C	        INC     AX              ;Add last (partial) record to total
 0B0A                        C	FULLREC:
 0B0A  8B C8                 C	        MOV     CX,AX
 0B0C  8B FE                 C	        MOV     DI,SI           ;ES:DI point to FCB
 0B0E                        C	SETCLUS:
 0B0E  A1 014A R             C	        MOV     AX,[CLUSNUM]
 0B11  26: 89 45 1B          C	        MOV     ES:[DI.LSTCLUS],AX
 0B15  A1 0148 R             C	        MOV     AX,[LASTPOS]
 0B18  26: 89 45 1D          C	        MOV     ES:[DI.CLUSPOS],AX
 0B1C                        C	ADDREC:
 0B1C  A1 0142 R             C	        MOV     AX,WORD PTR [RECPOS]
 0B1F  8B 16 0144 R          C	        MOV     DX,WORD PTR [RECPOS+2]
 0B23  E3 07                 C	        JCXZ    RET28           ;If no records read, don't change position
 0B25  49                    C	        DEC     CX
 0B26  03 C1                 C	        ADD     AX,CX           ;Update current record position
 0B28  83 D2 00              C	        ADC     DX,0
 0B2B  41                    C	        INC     CX      
 0B2C  C3                    C	RET28:  RET
                             C	
 0B2D                        C	RDLAST:
 0B2D  A1 0158 R             C	        MOV     AX,[BYTCNT2]
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-38
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0B30  0B C0                 C	        OR      AX,AX
 0B32  74 99                 C	        JZ      SETFCB
 0B34  A3 0156 R             C	        MOV     [BYTCNT1],AX
 0B37  E8 0965 R             C	        CALL    NEXTSEC
 0B3A  72 91                 C	        JC      SETFCB
 0B3C  C7 06 0150 R 0000     C	        MOV     [BYTSECPOS],0
 0B42  E8 0925 R             C	        CALL    BUFRD
 0B45  EB 86                 C	        JMP     SHORT SETFCB
                             C	
 0B47                        C	WRTDEV:
 0B47  1E                    C	        PUSH    DS
 0B48  C5 36 0031 R          C	        LDS     SI,DWORD PTR [DMAADD]
 0B4C  80 CB 40              C	        OR      BL,40H
 0B4F  FE C3                 C	        INC     BL
 0B51  74 1E                 C	        JZ      WRTCON
 0B53  FE C3                 C	        INC     BL
 0B55  74 10                 C	        JZ      WRTAUX
 0B57  FE C3                 C	        INC     BL
 0B59  74 20                 C	        JZ      ENDWRDEV        ;Done if device is NUL
 0B5B                        C	WRTLST:
 0B5B  AC                    C	        LODSB
 0B5C  3C 1A                 C	        CMP     AL,1AH
 0B5E  74 1B                 C	        JZ      ENDWRDEV
 0B60  E8 128D R             C	        CALL    LISTOUT
 0B63  E2 F6                 C	        LOOP    WRTLST
 0B65  EB 14                 C	        JMP     SHORT ENDWRDEV
                             C	
 0B67                        C	WRTAUX:
 0B67  AC                    C	        LODSB
 0B68  E8 014C R             C	        CALL    AUXOUT
 0B6B  3C 1A                 C	        CMP     AL,1AH
 0B6D  E0 F8                 C	        LOOPNZ  WRTAUX
 0B6F  EB 0A                 C	        JMP     SHORT ENDWRDEV
                             C	
 0B71                        C	WRTCON:
 0B71  AC                    C	        LODSB
 0B72  3C 1A                 C	        CMP     AL,1AH
 0B74  74 05                 C	        JZ      ENDWRDEV
 0B76  E8 119F R             C	        CALL    OUT
 0B79  E2 F6                 C	        LOOP    WRTCON
 0B7B                        C	ENDWRDEV:
 0B7B  1F                    C	        POP     DS
 0B7C  8B 0E 0146 R          C	        MOV     CX,[RECCNT]
 0B80  8B 3E 013E R          C	        MOV     DI,[FCB]
 0B84  EB 96                 C	        JMP     SHORT ADDREC
                             C	
 0B86                        C	HAVSTART:
 0B86  8B C8                 C	        MOV     CX,AX
 0B88  E8 088E R             C	        CALL    SKPCLP
 0B8B  E3 16                 C	        JCXZ    DOWRTJ
 0B8D  E8 0DBA R             C	        CALL    ALLOCATE
 0B90  73 11                 C	        JNC     DOWRTJ
 0B92                        C	WRTERR:
 0B92  C6 06 0138 R 01       C	        MOV     BYTE PTR [DSKERR],1
 0B97                        C	LVDSK:
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-39
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0B97  A1 0142 R             C	        MOV     AX,WORD PTR [RECPOS]
 0B9A  8B 16 0144 R          C	        MOV     DX,WORD PTR [RECPOS+2]
 0B9E  8B 3E 013E R          C	        MOV     DI,[FCB]
 0BA2  C3                    C	        RET
                             C	
 0BA3  EB 7F 90              C	DOWRTJ: JMP     DOWRT
                             C	
 0BA6                        C	WRTEOFJ:
 0BA6  E9 0CC3 R             C	        JMP     WRTEOF
                             C	
 0BA9                        C	STORE:
                             C	
                             C	; Inputs:
                             C	;       DS:DI point to FCB
                             C	;       DX:AX = Position in file of disk transfer
                             C	;       CX = Record count
                             C	; Outputs:
                             C	;       DX:AX = Position of last record written
                             C	;       CX = No. of records written
                             C	;       ES:DI point to FCB
                             C	;       LSTCLUS, CLUSPOS fields in FCB set
                             C	
 0BA9  E8 0784 R             C	        CALL    SETUP
 0BAC  E8 1400 R             C	        CALL    DATE16
 0BAF  26: 89 45 14          C	        MOV     ES:[DI.FDATE],AX
 0BB3  26: 89 55 16          C	        MOV     ES:[DI.FTIME],DX
 0BB7  0A DB                 C	        OR      BL,BL
 0BB9  78 8C                 C	        JS      WRTDEV
 0BBB  80 E3 3F              C	        AND     BL,3FH          ;Mark file as dirty
 0BBE  26: 88 5D 18          C	        MOV     ES:[DI.DEVID],BL
 0BC2  E8 084C R             C	        CALL    BREAKDOWN
 0BC5  A1 0152 R             C	        MOV     AX,WORD PTR [BYTPOS]
 0BC8  8B 16 0154 R          C	        MOV     DX,WORD PTR [BYTPOS+2]
 0BCC  E3 D8                 C	        JCXZ    WRTEOFJ
 0BCE  49                    C	        DEC     CX
 0BCF  03 C1                 C	        ADD     AX,CX
 0BD1  83 D2 00              C	        ADC     DX,0            ;AX:DX=last byte accessed
 0BD4  F7 76 02              C	        DIV     [BP.SECSIZ]     ;AX=last sector accessed
 0BD7  8A 4E 05              C	        MOV     CL,[BP.CLUSSHFT]
 0BDA  D3 E8                 C	        SHR     AX,CL           ;Last cluster to be accessed
 0BDC  50                    C	        PUSH    AX
 0BDD  26: 8B 45 10          C	        MOV     AX,ES:WORD PTR [DI.FILSIZ]
 0BE1  26: 8B 55 12          C	        MOV     DX,ES:WORD PTR [DI.FILSIZ+2]
 0BE5  F7 76 02              C	        DIV     [BP.SECSIZ]
 0BE8  0B D2                 C	        OR      DX,DX
 0BEA  74 01                 C	        JZ      NORNDUP
 0BEC  40                    C	        INC     AX              ;Round up if any remainder
 0BED                        C	NORNDUP:
 0BED  A3 014E R             C	        MOV     [VALSEC],AX     ;Number of sectors that have been written
 0BF0  58                    C	        POP     AX
 0BF1  8B 0E 014A R          C	        MOV     CX,[CLUSNUM]    ;First cluster accessed
 0BF5  E8 0874 R             C	        CALL    FNDCLUS
 0BF8  89 1E 014A R          C	        MOV     [CLUSNUM],BX
 0BFC  89 16 0148 R          C	        MOV     [LASTPOS],DX
 0C00  2B C2                 C	        SUB     AX,DX           ;Last cluster minus current cluster
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-40
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0C02  74 20                 C	        JZ      DOWRT           ;If we have last clus, we must have first
 0C04  E3 80                 C	        JCXZ    HAVSTART        ;See if no more data
 0C06  51                    C	        PUSH    CX              ;No. of clusters short of first
 0C07  8B C8                 C	        MOV     CX,AX
 0C09  E8 0DBA R             C	        CALL    ALLOCATE
 0C0C  58                    C	        POP     AX
 0C0D  72 83                 C	        JC      WRTERR
 0C0F  8B C8                 C	        MOV     CX,AX
 0C11  8B 16 0148 R          C	        MOV     DX,[LASTPOS]
 0C15  42                    C	        INC     DX
 0C16  49                    C	        DEC     CX
 0C17  74 03                 C	        JZ      NOSKIP
 0C19  E8 088E R             C	        CALL    SKPCLP
 0C1C                        C	NOSKIP:
 0C1C  89 1E 014A R          C	        MOV     [CLUSNUM],BX
 0C20  89 16 0148 R          C	        MOV     [LASTPOS],DX
 0C24                        C	DOWRT:
 0C24  83 3E 0156 R 00       C	        CMP     [BYTCNT1],0
 0C29  74 07                 C	        JZ      WRTMID
 0C2B  8B 1E 014A R          C	        MOV     BX,[CLUSNUM]
 0C2F  E8 0938 R             C	        CALL    BUFWRT  
 0C32                        C	WRTMID:
 0C32  A1 015A R             C	        MOV     AX,[SECCNT]
 0C35  0B C0                 C	        OR      AX,AX
 0C37  74 40                 C	        JZ      WRTLAST
 0C39  01 06 014C R          C	        ADD     [SECPOS],AX
 0C3D  E8 0965 R             C	        CALL    NEXTSEC
 0C40  C6 06 0139 R 01       C	        MOV     BYTE PTR [TRANS],1      ;A transfer is taking place
 0C45  8A 16 0137 R          C	        MOV     DL,[SECCLUSPOS]
 0C49  8B 1E 014A R          C	        MOV     BX,[CLUSNUM]
 0C4D  8B 0E 015A R          C	        MOV     CX,[SECCNT]
 0C51                        C	WRTLP:
 0C51  E8 0D15 R             C	        CALL    OPTIMIZE
 0C54  72 0C                 C	        JC      NOTINBUF        ;Is one of the sectors buffered?
 0C56  C7 06 003B R 0000     C	        MOV     [BUFSECNO],0    ;If so, invalidate the buffer since we're
 0C5C  C7 06 003D R 00FF     C	        MOV     WORD PTR [BUFDRVNO],0FFH        ;       completely rewritting it
 0C62                        C	NOTINBUF:
 0C62  57                    C	        PUSH    DI
 0C63  50                    C	        PUSH    AX
 0C64  1E                    C	        PUSH    DS
 0C65  8E 1E 0033 R          C	        MOV     DS,[DMAADD+2]
 0C69  E8 068C R             C	        CALL    DWRITE
 0C6C  1F                    C	        POP     DS
 0C6D  59                    C	        POP     CX
 0C6E  5B                    C	        POP     BX
 0C6F  E3 08                 C	        JCXZ    WRTLAST
 0C71  B2 00                 C	        MOV     DL,0
 0C73  FF 06 0148 R          C	        INC     [LASTPOS]       ;We'll be using next cluster
 0C77  EB D8                 C	        JMP     SHORT WRTLP
 0C79                        C	WRTLAST:
 0C79  A1 0158 R             C	        MOV     AX,[BYTCNT2]
 0C7C  0B C0                 C	        OR      AX,AX
 0C7E  74 0F                 C	        JZ      FINWRT
 0C80  A3 0156 R             C	        MOV     [BYTCNT1],AX
 0C83  E8 0965 R             C	        CALL    NEXTSEC
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-41
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0C86  C7 06 0150 R 0000     C	        MOV     [BYTSECPOS],0
 0C8C  E8 0938 R             C	        CALL    BUFWRT
 0C8F                        C	FINWRT:
 0C8F  A1 0140 R             C	        MOV     AX,[NEXTADD]
 0C92  2B 06 0031 R          C	        SUB     AX,[DMAADD]
 0C96  03 06 0152 R          C	        ADD     AX,WORD PTR [BYTPOS]
 0C9A  8B 16 0154 R          C	        MOV     DX,WORD PTR [BYTPOS+2]
 0C9E  83 D2 00              C	        ADC     DX,0
 0CA1  8B CA                 C	        MOV     CX,DX
 0CA3  8B 3E 013E R          C	        MOV     DI,[FCB]
 0CA7  26: 3B 45 10          C	        CMP     AX,ES:WORD PTR [DI.FILSIZ]
 0CAB  26: 1B 4D 12          C	        SBB     CX,ES:WORD PTR [DI.FILSIZ+2]
 0CAF  72 08                 C	        JB      SAMSIZ
 0CB1  26: 89 45 10          C	        MOV     ES:WORD PTR [DI.FILSIZ],AX
 0CB5  26: 89 55 12          C	        MOV     ES:WORD PTR [DI.FILSIZ+2],DX
 0CB9                        C	SAMSIZ:
 0CB9  8B 0E 0146 R          C	        MOV     CX,[RECCNT]
 0CBD  E9 0B0E R             C	        JMP     SETCLUS
                             C	
                             C	
 0CC0  E9 0B92 R             C	WRTERRJ:JMP     WRTERR
                             C	
 0CC3                        C	WRTEOF:
 0CC3  8B C8                 C	        MOV     CX,AX
 0CC5  0B CA                 C	        OR      CX,DX
 0CC7  74 3D                 C	        JZ      KILLFIL
 0CC9  2D 0001               C	        SUB     AX,1
 0CCC  83 DA 00              C	        SBB     DX,0
 0CCF  F7 76 02              C	        DIV     [BP.SECSIZ]
 0CD2  8A 4E 05              C	        MOV     CL,[BP.CLUSSHFT]
 0CD5  D3 E8                 C	        SHR     AX,CL
 0CD7  8B C8                 C	        MOV     CX,AX
 0CD9  E8 0874 R             C	        CALL    FNDCLUS
 0CDC  E3 1C                 C	        JCXZ    RELFILE
 0CDE  E8 0DBA R             C	        CALL    ALLOCATE
 0CE1  72 DD                 C	        JC      WRTERRJ
 0CE3                        C	UPDATE:
 0CE3  8B 3E 013E R          C	        MOV     DI,[FCB]
 0CE7  A1 0152 R             C	        MOV     AX,WORD PTR [BYTPOS]
 0CEA  26: 89 45 10          C	        MOV     ES:WORD PTR [DI.FILSIZ],AX
 0CEE  A1 0154 R             C	        MOV     AX,WORD PTR [BYTPOS+2]
 0CF1  26: 89 45 12          C	        MOV     ES:WORD PTR [DI.FILSIZ+2],AX
 0CF5  33 C9                 C	        XOR     CX,CX
 0CF7  E9 0B1C R             C	        JMP     ADDREC
                             C	
 0CFA                        C	RELFILE:
 0CFA  BA 0FFF               C	        MOV     DX,0FFFH
 0CFD  E8 0E31 R             C	        CALL    RELBLKS
 0D00                        C	SETDIRT:
 0D00  C6 44 FF 01           C	        MOV     BYTE PTR [SI-1],1
 0D04  EB DD                 C	        JMP     SHORT UPDATE
                             C	
 0D06                        C	KILLFIL:
 0D06  33 DB                 C	        XOR     BX,BX
 0D08  26: 87 5D 19          C	        XCHG    BX,ES:[DI.FIRCLUS]
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-42
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0D0C  0B DB                 C	        OR      BX,BX
 0D0E  74 D3                 C	        JZ      UPDATE
 0D10  E8 0E2F R             C	        CALL    RELEASE
 0D13  EB EB                 C	        JMP     SHORT SETDIRT
                             C	
                             C	
 0D15                        C	OPTIMIZE:
                             C	
                             C	; Inputs:
                             C	;       DS = CS
                             C	;       BX = Physical cluster
                             C	;       CX = No. of records
                             C	;       DL = sector within cluster
                             C	;       BP = Base of drives parameters
                             C	;       [NEXTADD] = transfer address
                             C	; Outputs:
                             C	;       AX = No. of records remaining
                             C	;       BX = Transfer address
                             C	;       CX = No. or records to be transferred
                             C	;       DX = Physical sector address
                             C	;       DI = Next cluster
                             C	;       Carry clear if a sector to transfer is in the buffer
                             C	;       Carry set otherwise
                             C	;       [CLUSNUM] = Last cluster accessed
                             C	;       [NEXTADD] updated
                             C	; BP unchanged. Note that segment of transfer not set.
                             C	
 0D15  52                    C	        PUSH    DX
 0D16  53                    C	        PUSH    BX
 0D17  8A 46 04              C	        MOV     AL,[BP.CLUSMSK]
 0D1A  FE C0                 C	        INC     AL              ;Number of sectors per cluster
 0D1C  8A E0                 C	        MOV     AH,AL
 0D1E  2A C2                 C	        SUB     AL,DL           ;AL = Number of sectors left in first cluster
 0D20  8B D1                 C	        MOV     DX,CX
 0D22  8B 76 12              C	        MOV     SI,[BP.FAT]
 0D25  B9 0000               C	        MOV     CX,0
 0D28                        C	OPTCLUS:
                             C	;AL has number of sectors available in current cluster
                             C	;AH has number of sectors available in next cluster
                             C	;BX has current physical cluster
                             C	;CX has number of sequential sectors found so far
                             C	;DX has number of sectors left to transfer
                             C	;SI has FAT pointer
 0D28  E8 0157 R             C	        CALL    UNPACK
 0D2B  02 C8                 C	        ADD     CL,AL
 0D2D  80 D5 00              C	        ADC     CH,0
 0D30  3B CA                 C	        CMP     CX,DX
 0D32  73 49                 C	        JAE     BLKDON
 0D34  8A C4                 C	        MOV     AL,AH
 0D36  43                    C	        INC     BX
 0D37  3B FB                 C	        CMP     DI,BX
 0D39  74 ED                 C	        JZ      OPTCLUS
 0D3B  4B                    C	        DEC     BX
 0D3C                        C	FINCLUS:
 0D3C  89 1E 014A R          C	        MOV     [CLUSNUM],BX    ;Last cluster accessed
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-43
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0D40  2B D1                 C	        SUB     DX,CX           ;Number of sectors still needed
 0D42  52                    C	        PUSH    DX
 0D43  8B C1                 C	        MOV     AX,CX
 0D45  F7 66 02              C	        MUL     [BP.SECSIZ]     ;Number of sectors times sector size
 0D48  8B 36 0140 R          C	        MOV     SI,[NEXTADD]
 0D4C  03 C6                 C	        ADD     AX,SI           ;Adjust by size of transfer
 0D4E  A3 0140 R             C	        MOV     [NEXTADD],AX
 0D51  58                    C	        POP     AX              ;Number of sectors still needed
 0D52  5A                    C	        POP     DX              ;Starting cluster
 0D53  2B DA                 C	        SUB     BX,DX           ;Number of new clusters accessed
 0D55  01 1E 0148 R          C	        ADD     [LASTPOS],BX
 0D59  5B                    C	        POP     BX              ;BL = sector postion within cluster
 0D5A  E8 0D8B R             C	        CALL    FIGREC
 0D5D  8B DE                 C	        MOV     BX,SI
                             C	;Now let's see if any of these sectors are already in the buffer
 0D5F  39 16 003B R          C	        CMP     [BUFSECNO],DX
 0D63  72 17                 C	        JC      RET100          ;If DX > [BUFSECNO] then not in buffer
 0D65  8B F2                 C	        MOV     SI,DX
 0D67  03 F1                 C	        ADD     SI,CX           ;Last sector + 1
 0D69  39 36 003B R          C	        CMP     [BUFSECNO],SI
 0D6D  F5                    C	        CMC
 0D6E  72 0C                 C	        JC      RET100          ;If SI <= [BUFSECNO] then not in buffer
 0D70  50                    C	        PUSH    AX
 0D71  8A 46 00              C	        MOV     AL,[BP.DEVNUM]
 0D74  3A 06 003D R          C	        CMP     AL,[BUFDRVNO]   ;Is buffer for this drive?
 0D78  58                    C	        POP     AX
 0D79  74 01                 C	        JZ      RET100          ;If so, then we match 
 0D7B  F9                    C	        STC                     ;No match
 0D7C  C3                    C	RET100: RET
 0D7D                        C	BLKDON:
 0D7D  2B CA                 C	        SUB     CX,DX           ;Number of sectors in cluster we don't want
 0D7F  2A E1                 C	        SUB     AH,CL           ;Number of sectors in cluster we accepted
 0D81  FE CC                 C	        DEC     AH              ;Adjust to mean position within cluster
 0D83  88 26 0137 R          C	        MOV     [SECCLUSPOS],AH
 0D87  8B CA                 C	        MOV     CX,DX           ;Anyway, make the total equal to the request
 0D89  EB B1                 C	        JMP     SHORT FINCLUS
                             C	
                             C	
 0D8B                        C	FIGREC:
                             C	
                             C	;Inputs:
                             C	;       DX = Physical cluster number
                             C	;       BL = Sector postion within cluster
                             C	;       BP = Base of drive parameters
                             C	;Outputs:
                             C	;       DX = physical sector number
                             C	;No other registers affected.
                             C	
 0D8B  51                    C	        PUSH    CX
 0D8C  8A 4E 05              C	        MOV     CL,[BP.CLUSSHFT]
 0D8F  4A                    C	        DEC     DX
 0D90  4A                    C	        DEC     DX
 0D91  D3 E2                 C	        SHL     DX,CL
 0D93  0A D3                 C	        OR      DL,BL
 0D95  03 56 0B              C	        ADD     DX,[BP.FIRREC]
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-44
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0D98  59                    C	        POP     CX
 0D99  C3                    C	        RET
                             C	
 0D9A                        C	GETREC:
                             C	
                             C	; Inputs:
                             C	;       DS:DX point to FCB
                             C	; Outputs:
                             C	;       CX = 1
                             C	;       DX:AX = Record number determined by EXTENT and NR fields
                             C	;       DS:DI point to FCB
                             C	; No other registers affected.
                             C	
 0D9A  8B FA                 C	        MOV     DI,DX
 0D9C  80 3D FF              C	        CMP     BYTE PTR [DI],-1        ;Check for extended FCB
 0D9F  75 03                 C	        JNZ     NORMFCB2
 0DA1  83 C7 07              C	        ADD     DI,7
 0DA4                        C	NORMFCB2:
 0DA4  B9 0001               C	        MOV     CX,1
 0DA7  8A 45 20              C	        MOV     AL,[DI.NR]
 0DAA  8B 55 0C              C	        MOV     DX,[DI.EXTENT]
 0DAD  D0 E0                 C	        SHL     AL,1
 0DAF  D1 EA                 C	        SHR     DX,1
 0DB1  D0 D8                 C	        RCR     AL,1
 0DB3  8A E2                 C	        MOV     AH,DL
 0DB5  8A D6                 C	        MOV     DL,DH
 0DB7  B6 00                 C	        MOV     DH,0
 0DB9  C3                    C	        RET
                             C	
                             C	
 0DBA                        C	ALLOCATE:
                             C	
                             C	; Inputs:
                             C	;       DS = CS
                             C	;       ES = Segment of FCB
                             C	;       BX = Last cluster of file (0 if null file)
                             C	;       CX = No. of clusters to allocate
                             C	;       DX = Position of cluster BX
                             C	;       BP = Base of drive parameters
                             C	;       SI = FAT pointer
                             C	;       [FCB] = Displacement of FCB within segment
                             C	; Outputs:
                             C	;       IF insufficient space
                             C	;         THEN
                             C	;       Carry set
                             C	;       CX = max. no. of records that could be added to file
                             C	;         ELSE
                             C	;       Carry clear
                             C	;       BX = First cluster allocated
                             C	;       FAT is fully updated including dirty bit
                             C	;       FIRCLUS field of FCB set if file was null
                             C	; SI,BP unchanged. All other registers destroyed.
                             C	
 0DBA  FF 34                 C	        PUSH    [SI]
 0DBC  52                    C	        PUSH    DX
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-45
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0DBD  51                    C	        PUSH    CX
 0DBE  53                    C	        PUSH    BX
 0DBF  8B C3                 C	        MOV     AX,BX
 0DC1                        C	ALLOC:
 0DC1  8B D3                 C	        MOV     DX,BX
 0DC3                        C	FINDFRE:
 0DC3  43                    C	        INC     BX
 0DC4  3B 5E 0D              C	        CMP     BX,[BP.MAXCLUS]
 0DC7  7E 29                 C	        JLE     TRYOUT
 0DC9  3D 0001               C	        CMP     AX,1
 0DCC  7F 29                 C	        JG      TRYIN
 0DCE  5B                    C	        POP     BX
 0DCF  BA 0FFF               C	        MOV     DX,0FFFH
 0DD2  E8 0E31 R             C	        CALL    RELBLKS
 0DD5  58                    C	        POP     AX              ;No. of clusters requested
 0DD6  2B C1                 C	        SUB     AX,CX           ;AX=No. of clusters allocated
 0DD8  5A                    C	        POP     DX
 0DD9  8F 04                 C	        POP     [SI]
 0DDB  42                    C	        INC     DX              ;Position of first cluster allocated
 0DDC  03 C2                 C	        ADD     AX,DX           ;AX=max no. of cluster in file
 0DDE  8A 56 04              C	        MOV     DL,[BP.CLUSMSK]
 0DE1  B6 00                 C	        MOV     DH,0
 0DE3  42                    C	        INC     DX              ;DX=records/cluster
 0DE4  F7 E2                 C	        MUL     DX              ;AX=max no. of records in file
 0DE6  8B C8                 C	        MOV     CX,AX
 0DE8  2B 0E 0142 R          C	        SUB     CX,WORD PTR [RECPOS]    ;CX=max no. of records that could be written
 0DEC  77 02                 C	        JA      MAXREC
 0DEE  33 C9                 C	        XOR     CX,CX           ;If CX was negative, zero it
 0DF0                        C	MAXREC:
 0DF0  F9                    C	        STC
 0DF1  C3                    C	RET11:  RET
                             C	
 0DF2                        C	TRYOUT:
 0DF2  E8 0157 R             C	        CALL    UNPACK
 0DF5  74 0C                 C	        JZ      HAVFRE
 0DF7                        C	TRYIN:
 0DF7  48                    C	        DEC     AX
 0DF8  7E C9                 C	        JLE     FINDFRE
 0DFA  93                    C	        XCHG    AX,BX
 0DFB  E8 0157 R             C	        CALL    UNPACK
 0DFE  74 03                 C	        JZ      HAVFRE
 0E00  93                    C	        XCHG    AX,BX
 0E01  EB C0                 C	        JMP     SHORT FINDFRE
 0E03                        C	HAVFRE:
 0E03  87 DA                 C	        XCHG    BX,DX
 0E05  8B C2                 C	        MOV     AX,DX
 0E07  E8 017F R             C	        CALL    PACK
 0E0A  8B D8                 C	        MOV     BX,AX
 0E0C  E2 B3                 C	        LOOP    ALLOC
 0E0E  BA 0FFF               C	        MOV     DX,0FFFH
 0E11  E8 017F R             C	        CALL    PACK
 0E14  C6 44 FF 01           C	        MOV     BYTE PTR [SI-1],1
 0E18  5B                    C	        POP     BX
 0E19  59                    C	        POP     CX              ;Don't need this stuff since we're successful
 0E1A  5A                    C	        POP     DX
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-46
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0E1B  E8 0157 R             C	        CALL    UNPACK
 0E1E  8F 04                 C	        POP     [SI]
 0E20  87 DF                 C	        XCHG    BX,DI
 0E22  0B FF                 C	        OR      DI,DI
 0E24  75 CB                 C	        JNZ     RET11
 0E26  8B 3E 013E R          C	        MOV     DI,[FCB]
 0E2A  26: 89 5D 19          C	        MOV     ES:[DI.FIRCLUS],BX
 0E2E  C3                    C	RET12:  RET
                             C	
                             C	
 0E2F                        C	RELEASE:
                             C	
                             C	; Inputs:
                             C	;       DS = CS
                             C	;       BX = Cluster in file
                             C	;       SI = FAT pointer
                             C	;       BP = Base of drive parameters
                             C	; Function:
                             C	;       Frees cluster chain starting with [BX]
                             C	; AX,BX,DX,DI all destroyed. Other registers unchanged.
                             C	
 0E2F  33 D2                 C	        XOR     DX,DX
 0E31                        C	RELBLKS:
                             C	; Enter here with DX=0FFFH to put an end-of-file mark
                             C	; in the first cluster and free the rest in the chain.
 0E31  E8 0157 R             C	        CALL    UNPACK
 0E34  74 F8                 C	        JZ      RET12
 0E36  8B C7                 C	        MOV     AX,DI
 0E38  E8 017F R             C	        CALL    PACK
 0E3B  3D 0FF8               C	        CMP     AX,0FF8H
 0E3E  8B D8                 C	        MOV     BX,AX
 0E40  72 ED                 C	        JB      RELEASE
 0E42  C3                    C	RET13:  RET
                             C	
                             C	
 0E43                        C	GETEOF:
                             C	
                             C	; Inputs:
                             C	;       BX = Cluster in a file
                             C	;       SI = Base of drive FAT
                             C	;       DS = CS
                             C	; Outputs:
                             C	;       BX = Last cluster in the file
                             C	; DI destroyed. No other registers affected.
                             C	
 0E43  E8 0157 R             C	        CALL    UNPACK
 0E46  81 FF 0FF8            C	        CMP     DI,0FF8H
 0E4A  73 F6                 C	        JAE     RET13
 0E4C  8B DF                 C	        MOV     BX,DI
 0E4E  EB F3                 C	        JMP     SHORT GETEOF
                             C	
                             C	
 0E50                        C	SRCHFRST: ;System call 17
 0E50  E8 01C8 R             C	        CALL    GETFILE
 0E53                        C	SAVPLCE:
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-47
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


                             C	; Search-for-next enters here to save place and report
                             C	; findings.
 0E53  72 35                 C	        JC      KILLSRCH
 0E55  0A FF                 C	        OR      BH,BH
 0E57  78 3A                 C	        JS      SRCHDEV
 0E59  A1 0103 R             C	        MOV     AX,[LASTENT]
 0E5C  26: 89 45 10          C	        MOV     ES:[DI.FILDIRENT],AX
 0E60  26: 89 6D 12          C	        MOV     ES:[DI.DRVBP],BP
                             C	;Information in directory entry must be copied into the first
                             C	; 33 bytes starting at the disk transfer address.
 0E64  8B F3                 C	        MOV     SI,BX
 0E66  C4 3E 0031 R          C	        LES     DI,DWORD PTR [DMAADD]
 0E6A  B8 00FF               C	        MOV     AX,00FFH
 0E6D  3A 06 012E R          C	        CMP     AL,[EXTFCB]
 0E71  75 09                 C	        JNZ     NORMFCB
 0E73  AB                    C	        STOSW
 0E74  FE C0                 C	        INC     AL
 0E76  AB                    C	        STOSW
 0E77  AB                    C	        STOSW
 0E78  A0 0116 R             C	        MOV     AL,[ATTRIB]
 0E7B  AA                    C	        STOSB
 0E7C                        C	NORMFCB:
 0E7C  A0 013C R             C	        MOV     AL,[THISDRV]
 0E7F  FE C0                 C	        INC     AL
 0E81  AA                    C	        STOSB   ;Set drive number
 0E82  B9 0010               C	        MOV     CX,16
 0E85  F3/ A5                C	        REP     MOVSW   ;Copy remaining 10 characters of name
 0E87  32 C0                 C	        XOR     AL,AL
 0E89  C3                    C	        RET
                             C	
 0E8A                        C	KILLSRCH:
 = 0E8B                      C	KILLSRCH1       EQU     KILLSRCH+1
                             C	;The purpose of the KILLSRCH1 label is to provide a jump label to the following
                             C	;   instruction which leaves out the segment override.
 0E8A  26: C7 45 10 FFFF     C	        MOV     WORD PTR ES:[DI.FILDIRENT],-1
 0E90  B0 FF                 C	        MOV     AL,-1
 0E92  C3                    C	        RET
                             C	
 0E93                        C	SRCHDEV:
 0E93  26: 89 5D 10          C	        MOV     ES:[DI.FILDIRENT],BX
 0E97  C4 3E 0031 R          C	        LES     DI,DWORD PTR [DMAADD]
 0E9B  33 C0                 C	        XOR     AX,AX
 0E9D  AA                    C	        STOSB           ;Zero drive byte
 0E9E  83 EE 04              C	        SUB     SI,4            ;Point to device name
 0EA1  A5                    C	        MOVSW
 0EA2  A5                    C	        MOVSW
 0EA3  B8 2020               C	        MOV     AX,2020H
 0EA6  AA                    C	        STOSB
 0EA7  AB                    C	        STOSW
 0EA8  AB                    C	        STOSW
 0EA9  AB                    C	        STOSW                   ;Fill with 8 blanks
 0EAA  33 C0                 C	        XOR     AX,AX
 0EAC  B9 000A               C	        MOV     CX,10
 0EAF  F3/ AB                C	        REP     STOSW
 0EB1  AA                    C	        STOSB
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-48
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0EB2  C3                    C	RET14:  RET
                             C	
 0EB3                        C	SRCHNXT: ;System call 18
 0EB3  E8 0372 R             C	        CALL    MOVNAME
 0EB6  8B FA                 C	        MOV     DI,DX
 0EB8  72 D1                 C	        JC      NEAR PTR KILLSRCH1
 0EBA  8B 6D 12              C	        MOV     BP,[DI.DRVBP]
 0EBD  8B 45 10              C	        MOV     AX,[DI.FILDIRENT]
 0EC0  0B C0                 C	        OR      AX,AX
 0EC2  78 C7                 C	        JS      NEAR PTR KILLSRCH1
 0EC4  52                    C	        PUSH    DX
 0EC5  1E                    C	        PUSH    DS
 0EC6  0E                    C	        PUSH    CS
 0EC7  1F                    C	        POP     DS
 0EC8  A3 0103 R             C	        MOV     [LASTENT],AX
 0ECB  E8 01E6 R             C	        CALL    CONTSRCH
 0ECE  07                    C	        POP     ES
 0ECF  5F                    C	        POP     DI
 0ED0  EB 81                 C	        JMP     SAVPLCE
                             C	
                             C	
 0ED2                        C	FILESIZE: ;System call 35
 0ED2  E8 01C8 R             C	        CALL    GETFILE
 0ED5  B0 FF                 C	        MOV     AL,-1
 0ED7  72 D9                 C	        JC      RET14
 0ED9  83 C7 21              C	        ADD     DI,33           ;Write size in RR field
 0EDC  26: 8B 4D ED          C	        MOV     CX,ES:[DI.RECSIZ-33]
 0EE0  0B C9                 C	        OR      CX,CX
 0EE2  75 03                 C	        JNZ     RECOK
 0EE4  B9 0080               C	        MOV     CX,128
 0EE7                        C	RECOK:
 0EE7  33 C0                 C	        XOR     AX,AX
 0EE9  33 D2                 C	        XOR     DX,DX           ;Intialize size to zero
 0EEB  0A FF                 C	        OR      BH,BH           ;Check for named I/O device
 0EED  78 14                 C	        JS      DEVSIZ
 0EEF  46                    C	        INC     SI
 0EF0  46                    C	        INC     SI              ;Point to length field
 0EF1  8B 44 02              C	        MOV     AX,[SI+2]       ;Get high word of size
 0EF4  F7 F1                 C	        DIV     CX
 0EF6  50                    C	        PUSH    AX              ;Save high part of result
 0EF7  AD                    C	        LODSW           ;Get low word of size
 0EF8  F7 F1                 C	        DIV     CX
 0EFA  0B D2                 C	        OR      DX,DX           ;Check for zero remainder
 0EFC  5A                    C	        POP     DX
 0EFD  74 04                 C	        JZ      DEVSIZ
 0EFF  40                    C	        INC     AX              ;Round up for partial record
 0F00  75 01                 C	        JNZ     DEVSIZ          ;Propagate carry?
 0F02  42                    C	        INC     DX
 0F03                        C	DEVSIZ:
 0F03  AB                    C	        STOSW
 0F04  8B C2                 C	        MOV     AX,DX
 0F06  AA                    C	        STOSB
 0F07  B0 00                 C	        MOV     AL,0
 0F09  83 F9 40              C	        CMP     CX,64
 0F0C  73 A4                 C	        JAE     RET14           ;Only 3-byte field if RECSIZ >= 64
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-49
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0F0E  26: 88 25             C	        MOV     ES:[DI],AH
 0F11  C3                    C	        RET
                             C	
                             C	
 0F12                        C	SETDMA: ;System call 26
 0F12  2E: 89 16 0031 R      C	        MOV     CS:[DMAADD],DX
 0F17  2E: 8C 1E 0033 R      C	        MOV     CS:[DMAADD+2],DS
 0F1C  C3                    C	        RET
                             C	
 0F1D                        C	NOSUCHDRV:
 0F1D  B0 FF                 C	        MOV     AL,-1
 0F1F  C3                    C	        RET
                             C	
 0F20                        C	GETFATPT: ;System call 27
 0F20  B2 00                 C	        MOV     DL,0                    ;Use default drive
                             C	
 0F22                        C	GETFATPTDL:     ;System call 28
 0F22  0E                    C	        PUSH    CS
 0F23  1F                    C	        POP     DS
 0F24  8A C2                 C	        MOV     AL,DL
 0F26  E8 03B9 R             C	        CALL    GETTHISDRV
 0F29  72 F2                 C	        JC      NOSUCHDRV
 0F2B  E8 042C R             C	        CALL    FATREAD
 0F2E  8B 5E 12              C	        MOV     BX,[BP.FAT]
 0F31  8A 46 04              C	        MOV     AL,[BP.CLUSMSK]
 0F34  FE C0                 C	        INC     AL
 0F36  8B 56 0D              C	        MOV     DX,[BP.MAXCLUS]
 0F39  4A                    C	        DEC     DX
 0F3A  8B 4E 02              C	        MOV     CX,[BP.SECSIZ]
 0F3D  C5 36 0131 R          C	        LDS     SI,DWORD PTR [SPSAVE]
 0F41  89 5C 02              C	        MOV     [SI.BXSAVE],BX
 0F44  89 54 06              C	        MOV     [SI.DXSAVE],DX
 0F47  89 4C 04              C	        MOV     [SI.CXSAVE],CX
 0F4A  8C 4C 0E              C	        MOV     [SI.DSSAVE],CS
 0F4D  C3                    C	        RET
                             C	
                             C	
 0F4E                        C	GETDSKPT: ;System call 31
 0F4E  0E                    C	        PUSH    CS
 0F4F  1F                    C	        POP     DS
 0F50  A0 004A R             C	        MOV     AL,[CURDRV]
 0F53  A2 013C R             C	        MOV     [THISDRV],AL
 0F56  E8 042C R             C	        CALL    FATREAD
 0F59  C5 36 0131 R          C	        LDS     SI,DWORD PTR [SPSAVE]
 0F5D  89 6C 02              C	        MOV     [SI.BXSAVE],BP
 0F60  8C 4C 0E              C	        MOV     [SI.DSSAVE],CS
 0F63  C3                    C	        RET
                             C	
                             C	
 0F64                        C	DSKRESET: ;System call 13
 0F64  0E                    C	        PUSH    CS
 0F65  1F                    C	        POP     DS
 0F66                        C	WRTFATS:
                             C	; DS=CS. Writes back all dirty FATs. All registers destroyed.
 0F66  32 C0                 C	        XOR     AL,AL
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-50
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0F68  86 06 003E R          C	        XCHG    AL,[DIRTYBUF]
 0F6C  0A C0                 C	        OR      AL,AL
 0F6E  74 12                 C	        JZ      NOBUF
 0F70  8B 2E 003F R          C	        MOV     BP,[BUFDRVBP]
 0F74  8B 16 003B R          C	        MOV     DX,[BUFSECNO]
 0F78  8B 1E 0039 R          C	        MOV     BX,[BUFFER]
 0F7C  B9 0001               C	        MOV     CX,1
 0F7F  E8 068C R             C	        CALL    DWRITE
 0F82                        C	NOBUF:
 0F82  8A 0E 002D R          C	        MOV     CL,[NUMIO]
 0F86  B5 00                 C	        MOV     CH,0
 0F88  8B 2E 004B R          C	        MOV     BP,[DRVTAB]
 0F8C                        C	WRTFAT:
 0F8C  51                    C	        PUSH    CX
 0F8D  E8 051F R             C	        CALL    CHKFATWRT
 0F90  59                    C	        POP     CX
 0F91  83 C5 14              C	        ADD     BP,DPBSIZ
 0F94  E2 F6                 C	        LOOP    WRTFAT
 0F96  C3                    C	        RET
                             C	
                             C	
 0F97                        C	GETDRV: ;System call 25
 0F97  2E: A0 004A R         C	        MOV     AL,CS:[CURDRV]
 0F9B  C3                    C	RET15:  RET
                             C	
                             C	
 0F9C                        C	SETRNDREC: ;System call 36
 0F9C  E8 0D9A R             C	        CALL    GETREC
 0F9F  89 45 21              C	        MOV     [DI+33],AX
 0FA2  88 55 23              C	        MOV     [DI+35],DL
 0FA5  83 7D 0E 40           C	        CMP     [DI.RECSIZ],64
 0FA9  73 F0                 C	        JAE     RET15
 0FAB  88 75 24              C	        MOV     [DI+36],DH      ;Set 4th byte only if record size < 64
 0FAE  C3                    C	RET16:  RET
                             C	
                             C	
 0FAF                        C	SELDSK: ;System call 14
 0FAF  2E: A0 002C R         C	        MOV     AL,CS:[NUMDRV]
 0FB3  3A D0                 C	        CMP     DL,AL
 0FB5  73 05                 C	        JNB     RET17
 0FB7  2E: 88 16 004A R      C	        MOV     CS:[CURDRV],DL
 0FBC  C3                    C	RET17:  RET
                             C	
 0FBD                        C	BUFIN:  ;System call 10
 0FBD  8C C8                 C	        MOV     AX,CS
 0FBF  8E C0                 C	        MOV     ES,AX
 0FC1  8B F2                 C	        MOV     SI,DX
 0FC3  B5 00                 C	        MOV     CH,0
 0FC5  AD                    C	        LODSW
 0FC6  0A C0                 C	        OR      AL,AL
 0FC8  74 F2                 C	        JZ      RET17
 0FCA  8A DC                 C	        MOV     BL,AH
 0FCC  8A FD                 C	        MOV     BH,CH
 0FCE  3A C3                 C	        CMP     AL,BL
 0FD0  76 05                 C	        JBE     NOEDIT
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-51
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0FD2  80 38 0D              C	        CMP     BYTE PTR [BX+SI],0DH
 0FD5  74 02                 C	        JZ      EDITON
 0FD7                        C	NOEDIT:
 0FD7  8A DD                 C	        MOV     BL,CH
 0FD9                        C	EDITON:
 0FD9  8A D0                 C	        MOV     DL,AL
 0FDB  4A                    C	        DEC     DX
 0FDC                        C	NEWLIN:
 0FDC  2E: A0 0028 R         C	        MOV     AL,CS:[CARPOS]
 0FE0  2E: A2 0029 R         C	        MOV     CS:[STARTPOS],AL
 0FE4  56                    C	        PUSH    SI
 0FE5  BF 0000 R             C	        MOV     DI,OFFSET DOSGROUP:INBUF
 0FE8  8A E5                 C	        MOV     AH,CH
 0FEA  8A FD                 C	        MOV     BH,CH
 0FEC  8A F5                 C	        MOV     DH,CH
 0FEE                        C	GETCH:
 0FEE  E8 125C R             C	        CALL    IN
 0FF1  3C 06                 C	        CMP     AL,"F"-"@"      ;Ignore ^F
 0FF3  74 F9                 C	        JZ      GETCH
 0FF5  2E: 3A 06 0003 R      C	        CMP     AL,CS:ESCCHAR
 0FFA  74 32                 C	        JZ      ESC
 0FFC  3C 7F                 C	        CMP     AL,7FH
 0FFE  74 7E                 C	        JZ      BACKSP
 1000  3C 08                 C	        CMP     AL,8
 1002  74 7A                 C	        JZ      BACKSP
 1004  3C 0D                 C	        CMP     AL,13
 1006  74 3A                 C	        JZ      ENDLIN
 1008  3C 0A                 C	        CMP     AL,10
 100A  74 5A                 C	        JZ      PHYCRLF
 100C  3C 18                 C	        CMP     AL,CANCEL
 100E  74 5B                 C	        JZ      KILNEW
 1010                        C	SAVCH:
 1010  3A F2                 C	        CMP     DH,DL
 1012  73 13                 C	        JAE     BUFFUL
 1014  AA                    C	        STOSB
 1015  FE C6                 C	        INC     DH
 1017  E8 117D R             C	        CALL    BUFOUT
 101A  0A E4                 C	        OR      AH,AH
 101C  75 D0                 C	        JNZ     GETCH
 101E  3A FB                 C	        CMP     BH,BL
 1020  73 CC                 C	        JAE     GETCH
 1022  46                    C	        INC     SI
 1023  FE C7                 C	        INC     BH
 1025  EB C7                 C	        JMP     SHORT GETCH
                             C	
 1027                        C	BUFFUL:
 1027  B0 07                 C	        MOV     AL,7
 1029  E8 119F R             C	        CALL    OUT
 102C  EB C0                 C	        JMP     SHORT GETCH
                             C	
 102E                        C	ESC:
 102E  E8 125C R             C	        CALL    IN
 1031  B1 0C                 C	        MOV     CL,ESCTABLEN
 1033  57                    C	        PUSH    DI
 1034  BF 0004 R             C	        MOV     DI,OFFSET DOSGROUP:ESCTAB
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-52
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 1037  F2/ AE                C	        REPNE   SCASB
 1039  5F                    C	        POP     DI
 103A  D1 E1                 C	        SHL     CX,1
 103C  8B E9                 C	        MOV     BP,CX
 103E  FF A6 1165 R          C	        JMP     [BP+OFFSET DOSGROUP:ESCFUNC]
                             C	
 1042                        C	ENDLIN:
 1042  AA                    C	        STOSB
 1043  E8 119F R             C	        CALL    OUT
 1046  5F                    C	        POP     DI
 1047  88 75 FF              C	        MOV     [DI-1],DH
 104A  FE C6                 C	        INC     DH
 104C                        C	COPYNEW:
 104C  8C C5                 C	        MOV     BP,ES
 104E  8C DB                 C	        MOV     BX,DS
 1050  8E C3                 C	        MOV     ES,BX
 1052  8E DD                 C	        MOV     DS,BP
 1054  BE 0000 R             C	        MOV     SI,OFFSET DOSGROUP:INBUF
 1057  8A CE                 C	        MOV     CL,DH
 1059  F3/ A4                C	        REP     MOVSB
 105B  C3                    C	        RET
 105C                        C	CRLF:
 105C  B0 0D                 C	        MOV     AL,13
 105E  E8 119F R             C	        CALL    OUT
 1061  B0 0A                 C	        MOV     AL,10
 1063  E9 119F R             C	        JMP     OUT
                             C	
 1066                        C	PHYCRLF:
 1066  E8 105C R             C	        CALL    CRLF
 1069  EB 83                 C	        JMP     SHORT GETCH
                             C	
 106B                        C	KILNEW:
 106B  B0 5C                 C	        MOV     AL,"\"
 106D  E8 119F R             C	        CALL    OUT
 1070  5E                    C	        POP     SI
 1071                        C	PUTNEW:
 1071  E8 105C R             C	        CALL    CRLF
 1074  2E: A0 0029 R         C	        MOV     AL,CS:[STARTPOS]
 1078  E8 1228 R             C	        CALL    TAB
 107B  E9 0FDC R             C	        JMP     NEWLIN
                             C	
 107E                        C	BACKSP:
 107E  0A F6                 C	        OR      DH,DH
 1080  74 11                 C	        JZ      OLDBAK
 1082  E8 10D3 R             C	        CALL    BACKUP
 1085  26: 8A 05             C	        MOV     AL,ES:[DI]
 1088  3C 20                 C	        CMP     AL," "
 108A  73 07                 C	        JAE     OLDBAK
 108C  3C 09                 C	        CMP     AL,9
 108E  74 11                 C	        JZ      BAKTAB
 1090  E8 10D6 R             C	        CALL    BACKMES
 1093                        C	OLDBAK:
 1093  0A E4                 C	        OR      AH,AH
 1095  75 07                 C	        JNZ     GETCH1
 1097  0A FF                 C	        OR      BH,BH
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-53
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 1099  74 03                 C	        JZ      GETCH1
 109B  FE CF                 C	        DEC     BH
 109D  4E                    C	        DEC     SI
 109E                        C	GETCH1:
 109E  E9 0FEE R             C	        JMP     GETCH
 10A1                        C	BAKTAB:
 10A1  57                    C	        PUSH    DI
 10A2  4F                    C	        DEC     DI
 10A3  FD                    C	        STD
 10A4  8A CE                 C	        MOV     CL,DH
 10A6  B0 20                 C	        MOV     AL," "
 10A8  53                    C	        PUSH    BX
 10A9  B3 07                 C	        MOV     BL,7
 10AB  E3 0E                 C	        JCXZ    FIGTAB
 10AD                        C	FNDPOS:
 10AD  AE                    C	        SCASB
 10AE  76 09                 C	        JNA     CHKCNT
 10B0  26: 80 7D 01 09       C	        CMP     ES:BYTE PTR [DI+1],9
 10B5  74 09                 C	        JZ      HAVTAB
 10B7  FE CB                 C	        DEC     BL
 10B9                        C	CHKCNT:
 10B9  E2 F2                 C	        LOOP    FNDPOS
 10BB                        C	FIGTAB:
 10BB  2E: 2A 1E 0029 R      C	        SUB     BL,CS:[STARTPOS]
 10C0                        C	HAVTAB:
 10C0  2A DE                 C	        SUB     BL,DH
 10C2  02 CB                 C	        ADD     CL,BL
 10C4  80 E1 07              C	        AND     CL,7
 10C7  FC                    C	        CLD
 10C8  5B                    C	        POP     BX
 10C9  5F                    C	        POP     DI
 10CA  74 C7                 C	        JZ      OLDBAK
 10CC                        C	TABBAK:
 10CC  E8 10D6 R             C	        CALL    BACKMES
 10CF  E2 FB                 C	        LOOP    TABBAK
 10D1  EB C0                 C	        JMP     SHORT OLDBAK
 10D3                        C	BACKUP:
 10D3  FE CE                 C	        DEC     DH
 10D5  4F                    C	        DEC     DI
 10D6                        C	BACKMES:
 10D6  B0 08                 C	        MOV     AL,8
 10D8  E8 119F R             C	        CALL    OUT
 10DB  B0 20                 C	        MOV     AL," "
 10DD  E8 119F R             C	        CALL    OUT
 10E0  B0 08                 C	        MOV     AL,8
 10E2  E9 119F R             C	        JMP     OUT
                             C	
 10E5                        C	TWOESC:
 10E5  B0 1B                 C	        MOV     AL,ESCCH
 10E7  E9 1010 R             C	        JMP     SAVCH
                             C	
 10EA                        C	COPYLIN:
 10EA  8A CB                 C	        MOV     CL,BL
 10EC  2A CF                 C	        SUB     CL,BH
 10EE  EB 07                 C	        JMP     SHORT COPYEACH
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-54
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


                             C	
 10F0                        C	COPYSTR:
 10F0  E8 1123 R             C	        CALL    FINDOLD
 10F3  EB 02                 C	        JMP     SHORT COPYEACH
                             C	
 10F5                        C	COPYONE:
 10F5  B1 01                 C	        MOV     CL,1
 10F7                        C	COPYEACH:
 10F7  B4 00                 C	        MOV     AH,0
 10F9  3A F2                 C	        CMP     DH,DL
 10FB  74 0F                 C	        JZ      GETCH2
 10FD  3A FB                 C	        CMP     BH,BL
 10FF  74 0B                 C	        JZ      GETCH2
 1101  AC                    C	        LODSB
 1102  AA                    C	        STOSB
 1103  E8 117D R             C	        CALL    BUFOUT
 1106  FE C7                 C	        INC     BH
 1108  FE C6                 C	        INC     DH
 110A  E2 EB                 C	        LOOP    COPYEACH
 110C                        C	GETCH2:
 110C  E9 0FEE R             C	        JMP     GETCH
                             C	
 110F                        C	SKIPONE:
 110F  3A FB                 C	        CMP     BH,BL
 1111  74 F9                 C	        JZ      GETCH2
 1113  FE C7                 C	        INC     BH
 1115  46                    C	        INC     SI
 1116  E9 0FEE R             C	        JMP     GETCH
                             C	
 1119                        C	SKIPSTR:
 1119  E8 1123 R             C	        CALL    FINDOLD
 111C  03 F1                 C	        ADD     SI,CX
 111E  02 F9                 C	        ADD     BH,CL
 1120  E9 0FEE R             C	        JMP     GETCH
                             C	
 1123                        C	FINDOLD:
 1123  E8 125C R             C	        CALL    IN
 1126  8A CB                 C	        MOV     CL,BL
 1128  2A CF                 C	        SUB     CL,BH
 112A  74 17                 C	        JZ      NOTFND
 112C  49                    C	        DEC     CX
 112D  74 14                 C	        JZ      NOTFND
 112F  06                    C	        PUSH    ES
 1130  1E                    C	        PUSH    DS
 1131  07                    C	        POP     ES
 1132  57                    C	        PUSH    DI
 1133  8B FE                 C	        MOV     DI,SI
 1135  47                    C	        INC     DI
 1136  F2/ AE                C	        REPNE   SCASB
 1138  5F                    C	        POP     DI
 1139  07                    C	        POP     ES
 113A  75 07                 C	        JNZ     NOTFND
 113C  F6 D1                 C	        NOT     CL
 113E  02 CB                 C	        ADD     CL,BL
 1140  2A CF                 C	        SUB     CL,BH
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-55
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 1142  C3                    C	RET30:  RET
 1143                        C	NOTFND:
 1143  5D                    C	        POP     BP
 1144  E9 0FEE R             C	        JMP     GETCH
                             C	
 1147                        C	REEDIT:
 1147  B0 40                 C	        MOV     AL,"@"
 1149  E8 119F R             C	        CALL    OUT
 114C  5F                    C	        POP     DI
 114D  57                    C	        PUSH    DI
 114E  06                    C	        PUSH    ES
 114F  1E                    C	        PUSH    DS
 1150  E8 104C R             C	        CALL    COPYNEW
 1153  1F                    C	        POP     DS
 1154  07                    C	        POP     ES
 1155  5E                    C	        POP     SI
 1156  8A DE                 C	        MOV     BL,DH
 1158  E9 1071 R             C	        JMP     PUTNEW
                             C	
 115B                        C	ENTERINS:
                             C	        ENDIF
                             C	        IF      NOT TOGLINS
 115B  B4 FF                 C	        MOV     AH,-1
 115D  E9 0FEE R             C	        JMP     GETCH
                             C	
 1160                        C	EXITINS:
 1160  B4 00                 C	        MOV     AH,0
 1162  E9 0FEE R             C	        JMP     GETCH
                             C	        ENDIF
                             C	
 1165  0FEE R                C	ESCFUNC DW      GETCH
 1167  10E5 R                C	        DW      TWOESC
                             C	        IF      NOT TOGLINS
 1169  1160 R                C	        DW      EXITINS
                             C	        ENDIF
 116B  115B R                C	        DW      ENTERINS
 116D  107E R                C	        DW      BACKSP
 116F  1147 R                C	        DW      REEDIT
 1171  106B R                C	        DW      KILNEW
 1173  10EA R                C	        DW      COPYLIN
 1175  1119 R                C	        DW      SKIPSTR
 1177  10F0 R                C	        DW      COPYSTR
 1179  110F R                C	        DW      SKIPONE
 117B  10F5 R                C	        DW      COPYONE
                             C	
                             C	        ENDIF
 117D                        C	BUFOUT:
 117D  3C 20                 C	        CMP     AL," "
 117F  73 1E                 C	        JAE     OUT
 1181  3C 09                 C	        CMP     AL,9
 1183  74 1A                 C	        JZ      OUT
 1185  50                    C	        PUSH    AX
 1186  B0 5E                 C	        MOV     AL,"^"
 1188  E8 119F R             C	        CALL    OUT
 118B  58                    C	        POP     AX
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-56
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 118C  0C 40                 C	        OR      AL,40H
 118E  EB 0F                 C	        JMP     SHORT OUT
                             C	
 1190                        C	NOSTOP:
 1190  3C 10                 C	        CMP     AL,"P"-"@"
 1192  74 40                 C	        JZ      INCHK
                             C	        IF      NOT TOGLPRN
 1194  3C 0E                 C	        CMP     AL,"N"-"@"
 1196  74 3C                 C	        JZ      INCHK
                             C	        ENDIF
 1198  3C 03                 C	        CMP     AL,"C"-"@"
 119A  74 38                 C	        JZ      INCHK
 119C  C3                    C	        RET
                             C	
 119D                        C	CONOUT: ;System call 2
 119D  8A C2                 C	        MOV     AL,DL
 119F                        C	OUT:
 119F  3C 20                 C	        CMP     AL,20H
 11A1  72 71                 C	        JB      CTRLOUT
 11A3  3C 7F                 C	        CMP     AL,7FH
 11A5  74 05                 C	        JZ      OUTCH
 11A7  2E: FE 06 0028 R      C	        INC     CS:BYTE PTR [CARPOS]
 11AC                        C	OUTCH:
 11AC  50                    C	        PUSH    AX
 11AD  E8 11C4 R             C	        CALL    STATCHK
 11B0  58                    C	        POP     AX
 11B1  9A 0009 ---- R        C	        CALL    FAR PTR BIOSOUT 
 11B6  2E: F6 06 002A R FF   C	        TEST    CS:BYTE PTR [PFLAG],-1
 11BC  74 05                 C	        JZ      RET18
 11BE  9A 000C ---- R        C	        CALL    FAR PTR BIOSPRINT 
 11C3  C3                    C	RET18:  RET
                             C	
 11C4                        C	STATCHK:
 11C4  9A 0003 ---- R        C	        CALL    FAR PTR BIOSSTAT 
 11C9  74 F8                 C	        JZ      RET18
 11CB  3C 13                 C	        CMP     AL,'S'-'@'
 11CD  75 C1                 C	        JNZ     NOSTOP
 11CF  9A 0006 ---- R        C	        CALL    FAR PTR BIOSIN          ;Eat Cntrl-S
 11D4                        C	INCHK:
 11D4  9A 0006 ---- R        C	        CALL    FAR PTR BIOSIN 
 11D9  3C 10                 C	        CMP     AL,'P'-'@'
 11DB  74 29                 C	        JZ      PRINTON
                             C	        IF      NOT TOGLPRN
 11DD  3C 0E                 C	        CMP     AL,'N'-'@'
 11DF  74 2C                 C	        JZ      PRINTOFF
                             C	        ENDIF
 11E1  3C 03                 C	        CMP     AL,'C'-'@'
 11E3  75 DE                 C	        JNZ     RET18
                             C	; Ctrl-C handler.
                             C	; "^C" and CR/LF is printed. Then the user registers are restored and the
                             C	; user CTRL-C handler is executed. At this point the top of the stack has
                             C	; 1) the interrupt return address should the user CTRL-C handler wish to
                             C	; allow processing to continue; 2) the original interrupt return address
                             C	; to the code that performed the function call in the first place. If the
                             C	; user CTRL-C handler wishes to continue, it must leave all registers
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-57
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


                             C	; unchanged and IRET. The function that was interrupted will simply be
                             C	; repeated.
 11E5  B0 03                 C	        MOV     AL,3            ;Display "^C"
 11E7  E8 117D R             C	        CALL    BUFOUT
 11EA  E8 105C R             C	        CALL    CRLF
 11ED  FA                    C	        CLI                     ;Prepare to play with stack
 11EE  2E: 8E 16 0133 R      C	        MOV     SS,CS:[SSSAVE]
 11F3  2E: 8B 26 0131 R      C	        MOV     SP,CS:[SPSAVE]  ;User stack now restored
 11F8  58                    C	        POP     AX
 11F9  5B                    C	        POP     BX
 11FA  59                    C	        POP     CX
 11FB  5A                    C	        POP     DX
 11FC  5E                    C	        POP     SI
 11FD  5F                    C	        POP     DI
 11FE  5D                    C	        POP     BP
 11FF  1F                    C	        POP     DS
 1200  07                    C	        POP     ES              ;User registers now restored
 1201  CD 23                 C	        INT     CONTC           ;Execute user Ctrl-C handler
 1203  E9 004F R             C	        JMP     COMMAND         ;Repeat command otherwise
                             C	
 1206                        C	PRINTON:
                             C	        ENDIF
                             C	        IF      NOT TOGLPRN
 1206  2E: C6 06 002A R 01   C	        MOV     CS:BYTE PTR [PFLAG],1
 120C  C3                    C	        RET
                             C	
 120D                        C	PRINTOFF:
 120D  2E: C6 06 002A R 00   C	        MOV     CS:BYTE PTR [PFLAG],0
 1213  C3                    C	        RET
                             C	        ENDIF
                             C	
 1214                        C	CTRLOUT:
 1214  3C 0D                 C	        CMP     AL,13
 1216  74 20                 C	        JZ      ZERPOS
 1218  3C 08                 C	        CMP     AL,8
 121A  74 25                 C	        JZ      BACKPOS
 121C  3C 09                 C	        CMP     AL,9
 121E  75 1E                 C	        JNZ     OUTCHJ
 1220  2E: A0 0028 R         C	        MOV     AL,CS:[CARPOS]
 1224  0C F8                 C	        OR      AL,0F8H
 1226  F6 D8                 C	        NEG     AL
 1228                        C	TAB:
 1228  51                    C	        PUSH    CX
 1229  8A C8                 C	        MOV     CL,AL
 122B  B5 00                 C	        MOV     CH,0
 122D  E3 07                 C	        JCXZ    POPTAB
 122F                        C	TABLP:
 122F  B0 20                 C	        MOV     AL," "
 1231  E8 119F R             C	        CALL    OUT
 1234  E2 F9                 C	        LOOP    TABLP
 1236                        C	POPTAB:
 1236  59                    C	        POP     CX
 1237  C3                    C	RET19:  RET
                             C	
 1238                        C	ZERPOS:
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-58
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 1238  2E: C6 06 0028 R 00   C	        MOV     CS:BYTE PTR [CARPOS],0
 123E  E9 11AC R             C	OUTCHJ: JMP     OUTCH
                             C	
 1241                        C	BACKPOS:
 1241  2E: FE 0E 0028 R      C	        DEC     CS:BYTE PTR [CARPOS]
 1246  E9 11AC R             C	        JMP     OUTCH
                             C	
                             C	
 1249                        C	CONSTAT: ;System call 11
 1249  E8 11C4 R             C	        CALL    STATCHK
 124C  B0 00                 C	        MOV     AL,0 
 124E  74 E7                 C	        JZ      RET19
 1250  0C FF                 C	        OR      AL,-1
 1252  C3                    C	        RET
                             C	
                             C	
 1253                        C	CONIN:  ;System call 1
 1253  E8 125C R             C	        CALL    IN
 1256  50                    C	        PUSH    AX
 1257  E8 119F R             C	        CALL    OUT
 125A  58                    C	        POP     AX
 125B  C3                    C	        RET
                             C	
                             C	
 125C                        C	IN:     ;System call 8
 125C  E8 11D4 R             C	        CALL    INCHK
 125F  74 FB                 C	        JZ      IN
 1261  C3                    C	RET29:  RET
                             C	
 1262                        C	RAWIO:  ;System call 6
 1262  8A C2                 C	        MOV     AL,DL
 1264  3C FF                 C	        CMP     AL,-1
 1266  75 1D                 C	        JNZ     RAWOUT
 1268  2E: C5 36 0131 R      C	        LDS     SI,DWORD PTR CS:[SPSAVE]                ;Get pointer to register save area
 126D  9A 0003 ---- R        C	        CALL    FAR PTR BIOSSTAT
 1272  75 07                 C	        JNZ     RESFLG
 1274  80 4C 16 40           C	        OR      BYTE PTR [SI.FSAVE],40H ;Set user's zero flag
 1278  32 C0                 C	        XOR     AL,AL
 127A  C3                    C	        RET
                             C	
 127B                        C	RESFLG:
 127B  80 64 16 BF           C	        AND     BYTE PTR [SI.FSAVE],0FFH-40H    ;Reset user's zero flag
 127F                        C	RAWINP: ;System call 7
 127F  9A 0006 ---- R        C	        CALL    FAR PTR BIOSIN 
 1284  C3                    C	        RET
 1285                        C	RAWOUT:
 1285  9A 0009 ---- R        C	        CALL    FAR PTR BIOSOUT 
 128A  C3                    C	        RET
                             C	
 128B                        C	LIST:   ;System call 5
 128B  8A C2                 C	        MOV     AL,DL
 128D                        C	LISTOUT:
 128D  50                    C	        PUSH    AX
 128E  E8 11C4 R             C	        CALL    STATCHK
 1291  58                    C	        POP     AX
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-59
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 1292  9A 000C ---- R        C	        CALL    FAR PTR BIOSPRINT 
 1297  C3                    C	RET20:  RET
                             C	
 1298                        C	PRTBUF: ;System call 9
 1298  8B F2                 C	        MOV     SI,DX
 129A                        C	OUTSTR:
 129A  AC                    C	        LODSB
 129B  3C 24                 C	        CMP     AL,"$"
 129D  74 F8                 C	        JZ      RET20
 129F  E8 119F R             C	        CALL    OUT
 12A2  EB F6                 C	        JMP     SHORT OUTSTR
                             C	
 12A4                        C	OUTMES: ;String output for internal messages
 12A4  2E: AC                C	        LODS    CS:BYTE PTR [SI]
 12A6  3C 24                 C	        CMP     AL,"$"
 12A8  74 ED                 C	        JZ      RET20
 12AA  E8 119F R             C	        CALL    OUT
 12AD  EB F5                 C	        JMP     SHORT OUTMES
                             C	
                             C	
 12AF                        C	MAKEFCB: ;Interrupt call 41
 = 0002                      C	DRVBIT  EQU     2
 = 0004                      C	NAMBIT  EQU     4
 = 0008                      C	EXTBIT  EQU     8
 12AF  B2 00                 C	        MOV     DL,0            ;Flag--not ambiguous file name
 12B1  A8 02                 C	        TEST    AL,DRVBIT       ;Use current drive field if default?
 12B3  75 04                 C	        JNZ     DEFDRV
 12B5  26: C6 05 00          C	        MOV     BYTE PTR ES:[DI],0      ;No - use default drive
 12B9                        C	DEFDRV:
 12B9  47                    C	        INC     DI
 12BA  B9 0008               C	        MOV     CX,8
 12BD  A8 04                 C	        TEST    AL,NAMBIT       ;Use current name fiels as defualt?
 12BF  93                    C	        XCHG    AX,BX           ;Save bits in BX
 12C0  B0 20                 C	        MOV     AL," "
 12C2  74 04                 C	        JZ      FILLB           ;If not, go fill with blanks
 12C4  03 F9                 C	        ADD     DI,CX
 12C6  33 C9                 C	        XOR     CX,CX           ;Don't fill any
 12C8                        C	FILLB:
 12C8  F3/ AA                C	        REP     STOSB
 12CA  B1 03                 C	        MOV     CL,3
 12CC  F6 C3 08              C	        TEST    BL,EXTBIT       ;Use current extension as default
 12CF  74 04                 C	        JZ      FILLB2
 12D1  03 F9                 C	        ADD     DI,CX
 12D3  33 C9                 C	        XOR     CX,CX
 12D5                        C	FILLB2:
 12D5  F3/ AA                C	        REP     STOSB
 12D7  91                    C	        XCHG    AX,CX           ;Put zero in AX
 12D8  AB                    C	        STOSW
 12D9  AB                    C	        STOSW                   ;Initialize two words after to zero
 12DA  83 EF 10              C	        SUB     DI,16           ;Point back at start
 12DD  F6 C3 01              C	        TEST    BL,1            ;Scan off separators if not zero
 12E0  74 09                 C	        JZ      SKPSPC
 12E2  E8 1352 R             C	        CALL    SCANB           ;Peel off blanks and tabs
 12E5  E8 137F R             C	        CALL    DELIM           ;Is it a one-time-only delimiter?
 12E8  75 04                 C	        JNZ     NOSCAN
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-60
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 12EA  46                    C	        INC     SI              ;Skip over the delimiter
 12EB                        C	SKPSPC:
 12EB  E8 1352 R             C	        CALL    SCANB           ;Always kill preceding blanks and tabs
 12EE                        C	NOSCAN:
 12EE  E8 135A R             C	        CALL    GETLET
 12F1  76 16                 C	        JBE     NODRV           ;Quit if termination character
 12F3  80 3C 3A              C	        CMP     BYTE PTR[SI],":"        ;Check for potential drive specifier
 12F6  75 11                 C	        JNZ     NODRV
 12F8  46                    C	        INC     SI              ;Skip over colon
 12F9  2C 40                 C	        SUB     AL,"@"          ;Convert drive letter to binary drive number
 12FB  76 07                 C	        JBE     BADDRV          ;Valid drive numbers are 1-15
 12FD  2E: 3A 06 002C R      C	        CMP     AL,CS:[NUMDRV]
 1302  76 02                 C	        JBE     HAVDRV
 1304                        C	BADDRV:
 1304  B2 FF                 C	        MOV     DL,-1
 1306                        C	HAVDRV:
 1306  AA                    C	        STOSB           ;Put drive specifier in first byte
 1307  46                    C	        INC     SI
 1308  4F                    C	        DEC     DI      ;Counteract next two instructions
 1309                        C	NODRV:
 1309  4E                    C	        DEC     SI      ;Back up
 130A  47                    C	        INC     DI      ;Skip drive byte
 130B  B9 0008               C	        MOV     CX,8
 130E  E8 132C R             C	        CALL    GETWORD         ;Get 8-letter file name
 1311  80 3C 2E              C	        CMP     BYTE PTR [SI],"."
 1314  75 07                 C	        JNZ     NODOT
 1316  46                    C	        INC     SI              ;Skip over dot if present
 1317  B9 0003               C	        MOV     CX,3            ;Get 3-letter extension
 131A  E8 1332 R             C	        CALL    MUSTGETWORD
 131D                        C	NODOT:
 131D  2E: C5 1E 0131 R      C	        LDS     BX,CS:DWORD PTR [SPSAVE]
 1322  89 77 08              C	        MOV     [BX.SISAVE],SI
 1325  8A C2                 C	        MOV     AL,DL
 1327  C3                    C	        RET
                             C	
 1328                        C	NONAM:
 1328  03 F9                 C	        ADD     DI,CX
 132A  4E                    C	        DEC     SI
 132B  C3                    C	        RET
                             C	
 132C                        C	GETWORD:
 132C  E8 135A R             C	        CALL    GETLET
 132F  76 F7                 C	        JBE     NONAM           ;Exit if invalid character
 1331  4E                    C	        DEC     SI
 1332                        C	MUSTGETWORD:
 1332  E8 135A R             C	        CALL    GETLET
 1335  76 15                 C	        JBE     FILLNAM
 1337  E3 F9                 C	        JCXZ    MUSTGETWORD
 1339  49                    C	        DEC     CX
 133A  3C 2A                 C	        CMP     AL,"*"          ;Check for ambiguous file specifier
 133C  75 04                 C	        JNZ     NOSTAR
 133E  B0 3F                 C	        MOV     AL,"?"
 1340  F3/ AA                C	        REP     STOSB
 1342                        C	NOSTAR:
 1342  AA                    C	        STOSB
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-61
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 1343  3C 3F                 C	        CMP     AL,"?"
 1345  75 EB                 C	        JNZ     MUSTGETWORD
 1347  80 CA 01              C	        OR      DL,1            ;Flag ambiguous file name
 134A  EB E6                 C	        JMP     MUSTGETWORD
 134C                        C	FILLNAM:
 134C  B0 20                 C	        MOV     AL," "
 134E  F3/ AA                C	        REP     STOSB
 1350  4E                    C	        DEC     SI
 1351  C3                    C	RET21:  RET
                             C	
 1352                        C	SCANB:
 1352  AC                    C	        LODSB
 1353  E8 138F R             C	        CALL    SPCHK
 1356  74 FA                 C	        JZ      SCANB
 1358  4E                    C	        DEC     SI
 1359  C3                    C	        RET
                             C	
 135A                        C	GETLET:
                             C	;Get a byte from [SI], convert it to upper case, and compare for delimiter.
                             C	;ZF set if a delimiter, CY set if a control character (other than TAB).
 135A  AC                    C	        LODSB
 135B  24 7F                 C	        AND     AL,7FH
 135D  3C 61                 C	        CMP     AL,"a"
 135F  72 06                 C	        JB      CHK
 1361  3C 7A                 C	        CMP     AL,"z"
 1363  77 02                 C	        JA      CHK
 1365  2C 20                 C	        SUB     AL,20H          ;Convert to upper case
 1367                        C	CHK:
 1367  3C 2E                 C	        CMP     AL,"."
 1369  74 E6                 C	        JZ      RET21
 136B  3C 22                 C	        CMP     AL,'"'
 136D  74 E2                 C	        JZ      RET21
 136F  3C 2F                 C	        CMP     AL,"/"
 1371  74 DE                 C	        JZ      RET21
 1373  3C 5B                 C	        CMP     AL,"["
 1375  74 DA                 C	        JZ      RET21
 1377  3C 5D                 C	        CMP     AL,"]"
 1379  74 D6                 C	        JZ      RET21
                             C	
                             C	        ENDIF
 137B  3C 3A                 C	        CMP     AL,":"          ;Allow ":" as separator in IBM version
 137D  74 D2                 C	        JZ      RET21
                             C	        IF      NOT IBM
 137F                        C	DELIM:
                             C	        ENDIF
                             C	
 137F  3C 2B                 C	        CMP     AL,"+"
 1381  74 12                 C	        JZ      RET101
 1383  3C 3D                 C	        CMP     AL,"="
 1385  74 0E                 C	        JZ      RET101
 1387  3C 3B                 C	        CMP     AL,";"
 1389  74 0A                 C	        JZ      RET101
 138B  3C 2C                 C	        CMP     AL,","
 138D  74 06                 C	        JZ      RET101
 138F                        C	SPCHK:
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-62
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 138F  3C 09                 C	        CMP     AL,9            ;Filter out tabs too
 1391  74 02                 C	        JZ      RET101
                             C	;WARNING! " " MUST be the last compare
 1393  3C 20                 C	        CMP     AL," "
 1395  C3                    C	RET101: RET
                             C	
 1396                        C	SETVECT: ; Interrupt call 37
 1396  33 DB                 C	        XOR     BX,BX
 1398  8E C3                 C	        MOV     ES,BX
 139A  8A D8                 C	        MOV     BL,AL
 139C  D1 E3                 C	        SHL     BX,1
 139E  D1 E3                 C	        SHL     BX,1
 13A0  26: 89 17             C	        MOV     ES:[BX],DX
 13A3  26: 8C 5F 02          C	        MOV     ES:[BX+2],DS
 13A7  C3                    C	        RET
                             C	
                             C	
 13A8                        C	NEWBASE: ; Interrupt call 38
 13A8  8E C2                 C	        MOV     ES,DX
 13AA  2E: C5 36 0131 R      C	        LDS     SI,CS:DWORD PTR [SPSAVE]
 13AF  8E 5C 14              C	        MOV     DS,[SI.CSSAVE]
 13B2  33 F6                 C	        XOR     SI,SI
 13B4  8B FE                 C	        MOV     DI,SI
 13B6  A1 0002               C	        MOV     AX,DS:[2]
 13B9  B9 0080               C	        MOV     CX,80H
 13BC  F3/ A5                C	        REP     MOVSW
                             C	
 13BE                        C	SETMEM:
                             C	
                             C	; Inputs:
                             C	;       AX = Size of memory in paragraphs
                             C	;       DX = Segment
                             C	; Function:
                             C	;       Completely prepares a program base at the 
                             C	;       specified segment.
                             C	; Outputs:
                             C	;       DS = DX
                             C	;       ES = DX
                             C	;       [0] has INT 20H
                             C	;       [2] = First unavailable segment ([ENDMEM])
                             C	;       [5] to [9] form a long call to the entry point
                             C	;       [10] to [13] have exit address (from INT 22H)
                             C	;       [14] to [17] have ctrl-C exit address (from INT 23H)
                             C	;       [18] to [21] have fatal error address (from INT 24H)
                             C	; DX,BP unchanged. All other registers destroyed.
                             C	
 13BE  33 C9                 C	        XOR     CX,CX
 13C0  8E D9                 C	        MOV     DS,CX
 13C2  8E C2                 C	        MOV     ES,DX
 13C4  BE 0088               C	        MOV     SI,EXIT
 13C7  BF 000A               C	        MOV     DI,SAVEXIT
 13CA  A5                    C	        MOVSW
 13CB  A5                    C	        MOVSW
 13CC  A5                    C	        MOVSW
 13CD  A5                    C	        MOVSW
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-63
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 13CE  A5                    C	        MOVSW
 13CF  A5                    C	        MOVSW
 13D0  26: A3 0002           C	        MOV     ES:[2],AX
 13D4  2B C2                 C	        SUB     AX,DX
 13D6  3D 0FFF               C	        CMP     AX,MAXDIF
 13D9  76 03                 C	        JBE     HAVDIF
 13DB  B8 0FFF               C	        MOV     AX,MAXDIF
 13DE                        C	HAVDIF:
 13DE  BB 000C               C	        MOV     BX,ENTRYPOINTSEG
 13E1  2B D8                 C	        SUB     BX,AX
 13E3  D1 E0                 C	        SHL     AX,1
 13E5  D1 E0                 C	        SHL     AX,1
 13E7  D1 E0                 C	        SHL     AX,1
 13E9  D1 E0                 C	        SHL     AX,1
 13EB  8E DA                 C	        MOV     DS,DX
 13ED  A3 0006               C	        MOV     DS:[6],AX
 13F0  89 1E 0008            C	        MOV     DS:[8],BX
 13F4  C7 06 0000 20CD       C	        MOV     DS:[0],20CDH    ;"INT INTTAB"
 13FA  C6 06 0005 9A         C	        MOV     DS:(BYTE PTR [5]),LONGCALL
 13FF  C3                    C	        RET
                             C	
 1400                        C	DATE16:
 1400  51                    C	        PUSH    CX
 1401  E8 1427 R             C	        CALL    READTIME
 1404  D0 E1                 C	        SHL     CL,1            ;Minutes to left part of byte
 1406  D0 E1                 C	        SHL     CL,1
 1408  D1 E1                 C	        SHL     CX,1            ;Push hours and minutes to left end
 140A  D1 E1                 C	        SHL     CX,1
 140C  D1 E1                 C	        SHL     CX,1
 140E  D0 EE                 C	        SHR     DH,1            ;Count every two seconds
 1410  0A CE                 C	        OR      CL,DH           ;Combine seconds with hours and minutes
 1412  8B D1                 C	        MOV     DX,CX
 1414  59                    C	        POP     CX
 1415  A1 0044 R             C	        MOV     AX,WORD PTR [MONTH]     ;Fetch month and year
 1418  D0 E0                 C	        SHL     AL,1                    ;Push month to left to make room for day
 141A  D0 E0                 C	        SHL     AL,1
 141C  D0 E0                 C	        SHL     AL,1
 141E  D0 E0                 C	        SHL     AL,1
 1420  D1 E0                 C	        SHL     AX,1
 1422  0A 06 0043 R          C	        OR      AL,[DAY]
 1426  C3                    C	RET22:  RET
                             C	
 = 05B5                      C	FOURYEARS       EQU     3*365+366
                             C	
 1427                        C	READTIME:
                             C	;Gets time in CX:DX. Figures new date if it has changed.
                             C	;Uses AX, CX, DX.
 1427  9A 0024 ---- R        C	        CALL    FAR PTR BIOSGETTIME 
 142C  3B 06 0047 R          C	        CMP     AX,[DAYCNT]     ;See if day count is the same
 1430  74 F4                 C	        JZ      RET22
 1432  3D AB36               C	        CMP     AX,FOURYEARS*30 ;Number of days in 120 years
 1435  73 EF                 C	        JAE     RET22           ;Ignore if too large
 1437  A3 0047 R             C	        MOV     [DAYCNT],AX
 143A  56                    C	        PUSH    SI
 143B  51                    C	        PUSH    CX
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-64
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 143C  52                    C	        PUSH    DX              ;Save time
 143D  33 D2                 C	        XOR     DX,DX
 143F  B9 05B5               C	        MOV     CX,FOURYEARS    ;Number of days in 4 years
 1442  F7 F1                 C	        DIV     CX              ;Compute number of 4-year units
 1444  D1 E0                 C	        SHL     AX,1
 1446  D1 E0                 C	        SHL     AX,1
 1448  D1 E0                 C	        SHL     AX,1            ;Multiply by 8 (no. of half-years)
 144A  8B C8                 C	        MOV     CX,AX           ;<240 implies AH=0
 144C  BE 1492 R             C	        MOV     SI,OFFSET DOSGROUP:YRTAB        ;Table of days in each year
 144F  E8 1475 R             C	        CALL    DSLIDE          ;Find out which of four years we're in
 1452  D1 E9                 C	        SHR     CX,1            ;Convert half-years to whole years
 1454  73 04                 C	        JNC     SK              ;Extra half-year?
 1456  81 C2 00C8            C	        ADD     DX,200
 145A                        C	SK:
 145A  E8 1481 R             C	        CALL    SETYEAR
 145D  B1 01                 C	        MOV     CL,1            ;At least at first month in year
 145F  BE 149A R             C	        MOV     SI,OFFSET DOSGROUP:MONTAB       ;Table of days in each month
 1462  E8 1475 R             C	        CALL    DSLIDE          ;Find out which month we're in
 1465  88 0E 0044 R          C	        MOV     [MONTH],CL
 1469  42                    C	        INC     DX              ;Remainder is day of month (start with one)
 146A  88 16 0043 R          C	        MOV     [DAY],DL
 146E  E8 1529 R             C	        CALL    WKDAY           ;Set day of week
 1471  5A                    C	        POP     DX
 1472  59                    C	        POP     CX
 1473  5E                    C	        POP     SI
 1474  C3                    C	RET23:  RET
                             C	
 1475                        C	DSLIDE:
 1475  B4 00                 C	        MOV     AH,0
 1477                        C	DSLIDE1:
 1477  AC                    C	        LODSB           ;Get count of days
 1478  3B D0                 C	        CMP     DX,AX           ;See if it will fit
 147A  72 F8                 C	        JB      RET23           ;If not, done
 147C  2B D0                 C	        SUB     DX,AX
 147E  41                    C	        INC     CX              ;Count one more month/year
 147F  EB F6                 C	        JMP     SHORT DSLIDE1
                             C	
 1481                        C	SETYEAR:
                             C	;Set year with value in CX. Adjust length of February for this year.
 1481  88 0E 0045 R          C	        MOV     BYTE PTR [YEAR],CL
 1485                        C	CHKYR:
 1485  F6 C1 03              C	        TEST    CL,3            ;Check for leap year
 1488  B0 1C                 C	        MOV     AL,28
 148A  75 02                 C	        JNZ     SAVFEB          ;28 days if no leap year
 148C  FE C0                 C	        INC     AL              ;Add leap day
 148E                        C	SAVFEB:
 148E  A2 149B R             C	        MOV     [MONTAB+1],AL   ;Store for February
 1491  C3                    C	        RET
                             C	
                             C	;Days in year
 1492  C8 A6                 C	YRTAB   DB      200,166         ;Leap year
 1494  C8 A5                 C	        DB      200,165
 1496  C8 A5                 C	        DB      200,165
 1498  C8 A5                 C	        DB      200,165
                             C	
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-65
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


                             C	;Days of each month
 149A  1F                    C	MONTAB  DB      31              ;January
 149B  1C                    C	        DB      28              ;February--reset each time year changes
 149C  1F                    C	        DB      31              ;March
 149D  1E                    C	        DB      30              ;April
 149E  1F                    C	        DB      31              ;May
 149F  1E                    C	        DB      30              ;June
 14A0  1F                    C	        DB      31              ;July
 14A1  1F                    C	        DB      31              ;August
 14A2  1E                    C	        DB      30              ;September
 14A3  1F                    C	        DB      31              ;October
 14A4  1E                    C	        DB      30              ;November
 14A5  1F                    C	        DB      31              ;December
                             C	
 14A6                        C	GETDATE: ;Function call 42
 14A6  0E                    C	        PUSH    CS
 14A7  1F                    C	        POP     DS
 14A8  E8 1427 R             C	        CALL    READTIME        ;Check for rollover to next day
 14AB  A1 0045 R             C	        MOV     AX,[YEAR]
 14AE  8B 1E 0043 R          C	        MOV     BX,WORD PTR [DAY]
 14B2  C5 36 0131 R          C	        LDS     SI,DWORD PTR [SPSAVE]   ;Get pointer to user registers
 14B6  89 5C 06              C	        MOV     [SI.DXSAVE],BX  ;DH=month, DL=day
 14B9  05 07BC               C	        ADD     AX,1980         ;Put bias back
 14BC  89 44 04              C	        MOV     [SI.CXSAVE],AX  ;CX=year
 14BF  2E: A0 0049 R         C	        MOV     AL,CS:[WEEKDAY]
 14C3  C3                    C	RET24:  RET
                             C	
 14C4                        C	SETDATE: ;Function call 43
 14C4  B0 FF                 C	        MOV     AL,-1           ;Be ready to flag error
 14C6  81 E9 07BC            C	        SUB     CX,1980         ;Fix bias in year
 14CA  72 F7                 C	        JC      RET24           ;Error if not big enough
 14CC  83 F9 77              C	        CMP     CX,119          ;Year must be less than 2100
 14CF  77 F2                 C	        JA      RET24
 14D1  0A F6                 C	        OR      DH,DH
 14D3  74 EE                 C	        JZ      RET24
 14D5  0A D2                 C	        OR      DL,DL
 14D7  74 EA                 C	        JZ      RET24           ;Error if either month or day is 0
 14D9  80 FE 0C              C	        CMP     DH,12           ;Check against max. month
 14DC  77 E5                 C	        JA      RET24
 14DE  0E                    C	        PUSH    CS
 14DF  1F                    C	        POP     DS
 14E0  E8 1485 R             C	        CALL    CHKYR           ;Set Feb. up for new year
 14E3  8A C6                 C	        MOV     AL,DH
 14E5  BB 1499 R             C	        MOV     BX,OFFSET DOSGROUP:MONTAB-1
 14E8  D7                    C	        XLAT                    ;Look up days in month
 14E9  3A C2                 C	        CMP     AL,DL
 14EB  B0 FF                 C	        MOV     AL,-1           ;Restore error flag, just in case
 14ED  72 D4                 C	        JB      RET24           ;Error if too many days
 14EF  E8 1481 R             C	        CALL    SETYEAR
 14F2  89 16 0043 R          C	        MOV     WORD PTR [DAY],DX       ;Set both day and month
 14F6  D1 E9                 C	        SHR     CX,1
 14F8  D1 E9                 C	        SHR     CX,1
 14FA  B8 05B5               C	        MOV     AX,FOURYEARS
 14FD  8B DA                 C	        MOV     BX,DX
 14FF  F7 E1                 C	        MUL     CX
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-66
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 1501  8A 0E 0045 R          C	        MOV     CL,BYTE PTR [YEAR]
 1505  80 E1 03              C	        AND     CL,3
 1508  BE 1492 R             C	        MOV     SI,OFFSET DOSGROUP:YRTAB
 150B  8B D0                 C	        MOV     DX,AX
 150D  D1 E1                 C	        SHL     CX,1            ;Two entries per year, so double count
 150F  E8 153C R             C	        CALL    DSUM            ;Add up the days in each year
 1512  8A CF                 C	        MOV     CL,BH           ;Month of year
 1514  BE 149A R             C	        MOV     SI,OFFSET DOSGROUP:MONTAB
 1517  49                    C	        DEC     CX              ;Account for months starting with one
 1518  E8 153C R             C	        CALL    DSUM            ;Add up days in each month
 151B  8A CB                 C	        MOV     CL,BL           ;Day of month
 151D  49                    C	        DEC     CX              ;Account for days starting with one
 151E  03 D1                 C	        ADD     DX,CX           ;Add in to day total
 1520  92                    C	        XCHG    AX,DX           ;Get day count in AX
 1521  A3 0047 R             C	        MOV     [DAYCNT],AX
 1524  9A 001E ---- R        C	        CALL    FAR PTR BIOSSETDATE 
 1529                        C	WKDAY:
 1529  A1 0047 R             C	        MOV     AX,[DAYCNT]
 152C  33 D2                 C	        XOR     DX,DX
 152E  B9 0007               C	        MOV     CX,7
 1531  40                    C	        INC     AX
 1532  40                    C	        INC     AX              ;First day was Tuesday
 1533  F7 F1                 C	        DIV     CX              ;Compute day of week
 1535  88 16 0049 R          C	        MOV     [WEEKDAY],DL
 1539  32 C0                 C	        XOR     AL,AL           ;Flag OK
 153B  C3                    C	RET25:  RET
                             C	
 153C                        C	DSUM:
 153C  B4 00                 C	        MOV     AH,0
 153E  E3 FB                 C	        JCXZ    RET25
 1540                        C	DSUM1:
 1540  AC                    C	        LODSB
 1541  03 D0                 C	        ADD     DX,AX
 1543  E2 FB                 C	        LOOP    DSUM1
 1545  C3                    C	        RET
                             C	
 1546                        C	GETTIME: ;Function call 44
 1546  0E                    C	        PUSH    CS
 1547  1F                    C	        POP     DS
 1548  E8 1427 R             C	        CALL    READTIME
 154B  C5 36 0131 R          C	        LDS     SI,DWORD PTR [SPSAVE]   ;Get pointer to user registers
 154F  89 54 06              C	        MOV     [SI.DXSAVE],DX
 1552  89 4C 04              C	        MOV     [SI.CXSAVE],CX
 1555  32 C0                 C	        XOR     AL,AL
 1557  C3                    C	RET26:  RET
                             C	
 1558                        C	SETTIME: ;Function call 45
                             C	;Time is in CX:DX in hours, minutes, seconds, 1/100 sec.
 1558  B0 FF                 C	        MOV     AL,-1           ;Flag in case of error
 155A  80 FD 18              C	        CMP     CH,24           ;Check hours
 155D  73 F8                 C	        JAE     RET26
 155F  80 F9 3C              C	        CMP     CL,60           ;Check minutes
 1562  73 F3                 C	        JAE     RET26
 1564  80 FE 3C              C	        CMP     DH,60           ;Check seconds
 1567  73 EE                 C	        JAE     RET26
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-67
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 1569  80 FA 64              C	        CMP     DL,100          ;Check 1/100's
 156C  73 E9                 C	        JAE     RET26
 156E  9A 0021 ---- R        C	        CALL    FAR PTR BIOSSETTIME 
 1573  32 C0                 C	        XOR     AL,AL
 1575  C3                    C	        RET
                             C	
                             C	
                             C	; Default handler for division overflow trap
 1576                        C	DIVOV:
 1576  56                    C	        PUSH    SI
 1577  50                    C	        PUSH    AX
 1578  BE 0014 R             C	        MOV     SI,OFFSET DOSGROUP:DIVMES
 157B  E8 12A4 R             C	        CALL    OUTMES
 157E  58                    C	        POP     AX
 157F  5E                    C	        POP     SI
 1580  CD 23                 C	        INT     23H             ;Use Ctrl-C abort on divide overflow
 1582  CF                    C	        IRET
                             C	
 = 1583                      C	CODSIZ  EQU     $-CODSTRT       ;Size of code segment
 1583                        C	CODE    ENDS
                             C	
                             C	
                             C	;***** DATA AREA *****
 0000                        C	CONSTANTS       SEGMENT BYTE
 0000                        C	        ORG     0
 = 0000                      C	CONSTRT EQU     $               ;Start of constants segment
                             C	
 0000                        C	IONAME:
                             C	        IF      NOT IBM
 0000  50 52 4E 20 4C 53     C	        DB      "PRN ","LST ","NUL ","AUX ","CON "
       54 20 4E 55 4C 20     C	
       41 55 58 20 43 4F     C	
       4E 20                 C	
                             C	        ENDIF
                             C	        ENDIF
 0014  0D 0A 44 69 76 69     C	DIVMES  DB      13,10,"Divide overflow",13,10,"$"
       64 65 20 6F 76 65     C	
       72 66 6C 6F 77 0D     C	
       0A 24                 C	
 0028  00                    C	CARPOS  DB      0
 0029  00                    C	STARTPOS DB     0
 002A  00                    C	PFLAG   DB      0
 002B  00                    C	DIRTYDIR DB     0               ;Dirty buffer flag
 002C  00                    C	NUMDRV  DB      0       ;Number of drives
 002D  ??                    C	NUMIO   DB      ?       ;Number of disk tables
 002E  00                    C	VERFLG  DB      0       ;Initialize with verify off
 002F  0000                  C	CONTPOS DW      0
 0031  0080                  C	DMAADD  DW      80H             ;User's disk transfer address (disp/seg)
 0033  ????                  C	        DW      ?
 0035  ????                  C	ENDMEM  DW      ?
 0037  0000                  C	MAXSEC  DW      0
 0039  ????                  C	BUFFER  DW      ?
 003B  0000                  C	BUFSECNO DW     0
 003D  FF                    C	BUFDRVNO DB     -1
 003E  00                    C	DIRTYBUF DB     0
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-68
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 003F  ????                  C	BUFDRVBP DW     ?
 0041  FFFF                  C	DIRBUFID DW     -1
 0043  00                    C	DAY     DB      0
 0044  00                    C	MONTH   DB      0
 0045  0000                  C	YEAR    DW      0
 0047  FFFF                  C	DAYCNT  DW      -1
 0049  00                    C	WEEKDAY DB      0
 004A  00                    C	CURDRV  DB      0               ;Default to drive A
 004B  0000                  C	DRVTAB  DW      0               ;Address of start of DPBs
 = 15D0                      C	DOSLEN  EQU     CODSIZ+($-CONSTRT)      ;Size of CODE + CONSTANTS segments
 004D                        C	CONSTANTS       ENDS
                             C	
 0000                        C	DATA    SEGMENT WORD
                             C	; Init code overlaps with data area below
                             C	
 0000                        C	        ORG     0
 0000     80 [               C	INBUF   DB      128 DUP (?)
                ??           C	
                    ]        C	
                             C	
 0080     83 [               C	CONBUF  DB      131 DUP (?)             ;The rest of INBUF and console buffer
                ??           C	
                    ]        C	
                             C	
 0103  ????                  C	LASTENT DW      ?
 0105     04 [               C	EXITHOLD DB     4 DUP (?)
                ??           C	
                    ]        C	
                             C	
 0109  ????                  C	FATBASE DW      ?
 010B     0B [               C	NAME1   DB      11 DUP (?)              ;File name buffer
                ??           C	
                    ]        C	
                             C	
 0116  ??                    C	ATTRIB  DB      ?
 0117     0B [               C	NAME2   DB      11 DUP (?)
                ??           C	
                    ]        C	
                             C	
 0122     0C [               C	NAME3   DB      12 DUP (?)
                ??           C	
                    ]        C	
                             C	
 012E  ??                    C	EXTFCB  DB      ?
                             C	;WARNING - the following two items are accessed as a word
 012F  ??                    C	CREATING DB     ?
 0130  ??                    C	DELALL  DB      ?
 0131                        C	TEMP    LABEL   WORD
 0131  ????                  C	SPSAVE  DW      ?
 0133  ????                  C	SSSAVE  DW      ?
 0135  ????                  C	CONTSTK DW      ?
 0137  ??                    C	SECCLUSPOS DB   ?       ;Position of first sector within cluster
 0138  ??                    C	DSKERR  DB      ?
 0139  ??                    C	TRANS   DB      ?
 013A  ??                    C	PREREAD DB      ?       ;0 means preread; 1 means optional
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-69
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 013B  ??                    C	READOP  DB      ?
 013C  ??                    C	THISDRV DB      ?
                             C	
 013D  90                    C	        EVEN
 013E  ????                  C	FCB     DW      ?       ;Address of user FCB
 0140  ????                  C	NEXTADD DW      ?
 0142     04 [               C	RECPOS  DB      4 DUP (?)
                ??           C	
                    ]        C	
                             C	
 0146  ????                  C	RECCNT  DW      ?
 0148  ????                  C	LASTPOS DW      ?
 014A  ????                  C	CLUSNUM DW      ?
 014C  ????                  C	SECPOS  DW      ?       ;Position of first sector accessed
 014E  ????                  C	VALSEC  DW      ?       ;Number of valid (previously written) sectors
 0150  ????                  C	BYTSECPOS DW    ?       ;Position of first byte within sector
 0152     04 [               C	BYTPOS  DB      4 DUP (?)               ;Byte position in file of access
                ??           C	
                    ]        C	
                             C	
 0156  ????                  C	BYTCNT1 DW      ?       ;No. of bytes in first sector
 0158  ????                  C	BYTCNT2 DW      ?       ;No. of bytes in last sector
 015A  ????                  C	SECCNT  DW      ?       ;No. of whole sectors
 015C  ????                  C	ENTFREE DW      ?
                             C	
 015E     80 [               C	        DB      80H DUP (?)     ;Stack space
                ??           C	
                    ]        C	
                             C	
 01DE                        C	IOSTACK LABEL   BYTE
 01DE     80 [               C	        DB      80H DUP (?)
                ??           C	
                    ]        C	
                             C	
 025E                        C	DSKSTACK LABEL  BYTE 
                             C	
                             C	        ENDIF
                             C	
 025E                        C	DIRBUF LABEL    WORD
                             C	
                             C	;Init code below overlaps with data area above
                             C	
 0000                        C	        ORG     0
                             C	
 0000                        C	MOVFAT:
                             C	;This section of code is safe from being overwritten by block move
 0000  F3/ A4                C	        REP     MOVS    BYTE PTR [DI],[SI]
 0002  FC                    C	        CLD
 0003  26: 89 16 0033 R      C	        MOV     ES:[DMAADD+2],DX
 0008  8B 36 004B R          C	        MOV     SI,[DRVTAB]     ;Address of first DPB
 000C  B0 FF                 C	        MOV     AL,-1
 000E  8A 0E 002D R          C	        MOV     CL,[NUMIO]      ;Number of DPBs
 0012                        C	FLGFAT:
 0012  26: 8B 7C 12          C	        MOV     DI,ES:[SI.FAT]  ;get pointer to FAT
 0016  4F                    C	        DEC     DI              ;Point to dirty byte
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-70
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0017  AA                    C	        STOSB                   ;Flag as unused
 0018  83 C6 14              C	        ADD     SI,DPBSIZ       ;Point to next DPB
 001B  E2 F5                 C	        LOOP    FLGFAT
 001D  A1 0035 R             C	        MOV     AX,[ENDMEM]
 0020  E8 13BE R             C	        CALL    SETMEM          ;Set up segment
                             C	
 0023                        C	XXX     PROC FAR
 0023  CB                    C	        RET
 0024                        C	XXX     ENDP
                             C	
 0024                        C	DOSINIT:
 0024  FA                    C	        CLI
 0025  FC                    C	        CLD
 0026  0E                    C	        PUSH    CS
 0027  07                    C	        POP     ES
 0028  26: 89 16 0035 R      C	        MOV     ES:[ENDMEM],DX
 002D  AC                    C	        LODSB                   ;Get no. of drives & no. of I/O drivers
 002E  26: A2 002D R         C	        MOV     ES:[NUMIO],AL
 0032  BF 0247 R             C	        MOV     DI,OFFSET DOSGROUP:MEMSTRT
 0035                        C	PERDRV:
 0035  8B EF                 C	        MOV     BP,DI
 0037  26: A0 0246 R         C	        MOV     AL,ES:[DRVCNT]
 003B  AA                    C	        STOSB           ;DEVNUM
 003C  AC                    C	        LODSB           ;Physical unit no.
 003D  AA                    C	        STOSB           ;DRVNUM
 003E  3C 0F                 C	        CMP     AL,15
 0040  77 5C                 C	        JA      BADINIT
 0042  98                    C	        CBW             ;Index into FAT size table
 0043  D1 E0                 C	        SHL     AX,1
 0045  05 0226 R             C	        ADD     AX,OFFSET DOSGROUP:FATSIZTAB
 0048  93                    C	        XCHG    BX,AX
 0049  AD                    C	        LODSW           ;Pointer to DPT
 004A  56                    C	        PUSH    SI
 004B  8B F0                 C	        MOV     SI,AX
 004D  AD                    C	        LODSW
 004E  AB                    C	        STOSW           ;SECSIZ
 004F  8B D0                 C	        MOV     DX,AX
 0051  26: 3B 06 0037 R      C	        CMP     AX,ES:[MAXSEC]
 0056  76 04                 C	        JBE     NOTMAX
 0058  26: A3 0037 R         C	        MOV     ES:[MAXSEC],AX
 005C                        C	NOTMAX:
 005C  AC                    C	        LODSB
 005D  FE C8                 C	        DEC     AL
 005F  AA                    C	        STOSB           ;CLUSMSK
 0060  74 09                 C	        JZ      HAVSHFT
 0062  98                    C	        CBW
 0063                        C	FIGSHFT:
 0063  FE C4                 C	        INC     AH
 0065  D0 F8                 C	        SAR     AL,1
 0067  75 FA                 C	        JNZ     FIGSHFT
 0069  8A C4                 C	        MOV     AL,AH
 006B                        C	HAVSHFT:
 006B  AA                    C	        STOSB           ;CLUSSHFT
 006C  A5                    C	        MOVSW           ;FIRFAT (= number of reserved sectors)
 006D  A4                    C	        MOVSB           ;FATCNT
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-71
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 006E  A5                    C	        MOVSW           ;MAXENT
 006F  8B C2                 C	        MOV     AX,DX           ;SECSIZ again
 0071  B1 05                 C	        MOV     CL,5
 0073  D3 E8                 C	        SHR     AX,CL
 0075  8B C8                 C	        MOV     CX,AX           ;Directory entries per sector
 0077  48                    C	        DEC     AX
 0078  26: 03 46 09          C	        ADD     AX,ES:[BP.MAXENT]
 007C  33 D2                 C	        XOR     DX,DX
 007E  F7 F1                 C	        DIV     CX
 0080  AB                    C	        STOSW           ;DIRSEC (temporarily)
 0081  A5                    C	        MOVSW                   ;DSKSIZ (temporarily)
 0082                        C	FNDFATSIZ:
 0082  B0 01                 C	        MOV     AL,1
 0084  BA 0001               C	        MOV     DX,1
 0087                        C	GETFATSIZ:
 0087  52                    C	        PUSH    DX
 0088  E8 01E5 R             C	        CALL    FIGFATSIZ
 008B  5A                    C	        POP     DX
 008C  3A C2                 C	        CMP     AL,DL           ;Compare newly computed FAT size with trial
 008E  74 16                 C	        JZ      HAVFATSIZ       ;Has sequence converged?
 0090  3A C6                 C	        CMP     AL,DH           ;Compare with previous trial
 0092  8A F2                 C	        MOV     DH,DL
 0094  8A D0                 C	        MOV     DL,AL           ;Shuffle trials
 0096  75 EF                 C	        JNZ     GETFATSIZ       ;Continue iterations if not oscillating
 0098  26: FF 4E 0D          C	        DEC     WORD PTR ES:[BP.DSKSIZ] ;Damp those oscillations
 009C  EB E4                 C	        JMP     SHORT FNDFATSIZ ;Try again
                             C	
 009E                        C	BADINIT:
 009E  BE 0213 R             C	        MOV     SI,OFFSET DOSGROUP:BADMES
 00A1  E8 12A4 R             C	        CALL    OUTMES
 00A4  FB                    C	        STI
 00A5  F4                    C	        HLT
                             C	
 00A6                        C	HAVFATSIZ:
 00A6  AA                    C	        STOSB                   ;FATSIZ
 00A7  26: F6 66 08          C	        MUL     ES:BYTE PTR[BP.FATCNT]  ;Space occupied by all FATs
 00AB  26: 03 46 06          C	        ADD     AX,ES:[BP.FIRFAT]
 00AF  AB                    C	        STOSW                   ;FIRDIR
 00B0  26: 03 46 0B          C	        ADD     AX,ES:[BP.DIRSEC]
 00B4  26: 89 46 0B          C	        MOV     ES:[BP.FIRREC],AX       ;Destroys DIRSEC
 00B8  E8 01F1 R             C	        CALL    FIGMAX
 00BB  26: 89 4E 0D          C	        MOV     ES:[BP.MAXCLUS],CX
 00BF  8B C3                 C	        MOV     AX,BX           ;Pointer into FAT size table
 00C1  AB                    C	        STOSW                   ;Allocate space for FAT pointer
 00C2  26: 8A 46 0F          C	        MOV     AL,ES:[BP.FATSIZ]
 00C6  32 E4                 C	        XOR     AH,AH
 00C8  26: F7 66 02          C	        MUL     ES:[BP.SECSIZ]
 00CC  26: 3B 07             C	        CMP     AX,ES:[BX]      ;Bigger than already allocated
 00CF  76 03                 C	        JBE     SMFAT
 00D1  26: 89 07             C	        MOV     ES:[BX],AX
 00D4                        C	SMFAT:
 00D4  5E                    C	        POP     SI              ;Restore pointer to init. table
 00D5  26: A0 0246 R         C	        MOV     AL,ES:[DRVCNT]
 00D9  FE C0                 C	        INC     AL
 00DB  26: A2 0246 R         C	        MOV     ES:[DRVCNT],AL
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-72
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 00DF  26: 3A 06 002D R      C	        CMP     AL,ES:[NUMIO]
 00E4  73 05                 C	        JAE     CONTINIT
 00E6  E9 0035 R             C	        JMP     PERDRV  
                             C	
 00E9                        C	BADINITJ:
 00E9  EB B3                 C	        JMP     BADINIT
                             C	
 00EB                        C	CONTINIT:
 00EB  0E                    C	        PUSH    CS
 00EC  1F                    C	        POP     DS
                             C	;Calculate true address of buffers, FATs, free space
 00ED  8B 2E 0037 R          C	        MOV     BP,[MAXSEC]
 00F1  B8 025E R             C	        MOV     AX,OFFSET DOSGROUP:DIRBUF
 00F4  03 C5                 C	        ADD     AX,BP
 00F6  A3 0039 R             C	        MOV     [BUFFER],AX     ;Start of buffer
 00F9  03 C5                 C	        ADD     AX,BP
 00FB  A3 004B R             C	        MOV     [DRVTAB],AX     ;Start of DPBs
 00FE  D1 E5                 C	        SHL     BP,1            ;Two sectors - directory and buffer
 0100  03 EF                 C	        ADD     BP,DI           ;Allocate buffer space
 0102  81 C5 0017            C	        ADD     BP,ADJFAC       ;True address of FATs
 0106  55                    C	        PUSH    BP
 0107  BE 0226 R             C	        MOV     SI,OFFSET DOSGROUP:FATSIZTAB
 010A  8B FE                 C	        MOV     DI,SI
 010C  B9 0010               C	        MOV     CX,16
 010F                        C	TOTFATSIZ:
 010F  45                    C	        INC     BP              ;Add one for Dirty byte
 0110  45                    C	        INC     BP              ;Add one for I/O device number
 0111  AD                    C	        LODSW                   ;Get size of this FAT
 0112  95                    C	        XCHG    AX,BP
 0113  AB                    C	        STOSW                   ;Save address of this FAT
 0114  03 E8                 C	        ADD     BP,AX           ;Compute size of next FAT
 0116  3B C5                 C	        CMP     AX,BP           ;If size was zero done
 0118  E0 F5                 C	        LOOPNZ  TOTFATSIZ
 011A  B0 0F                 C	        MOV     AL,15
 011C  2A C1                 C	        SUB     AL,CL           ;Compute number of FATs used
 011E  A2 002C R             C	        MOV     [NUMDRV],AL
 0121  33 C0                 C	        XOR     AX,AX           ;Set zero flag
 0123  F3/ AF                C	        REPZ    SCASW           ;Make sure all other entries are zero
 0125  75 C2                 C	        JNZ     BADINITJ
 0127  83 C5 0F              C	        ADD     BP,15           ;True start of free space
 012A  B1 04                 C	        MOV     CL,4
 012C  D3 ED                 C	        SHR     BP,CL           ;First free segment
 012E  8C CA                 C	        MOV     DX,CS
 0130  03 D5                 C	        ADD     DX,BP
 0132  BB 000F               C	        MOV     BX,0FH
 0135  8B 0E 0035 R          C	        MOV     CX,[ENDMEM]
 0139  83 F9 01              C	        CMP     CX,1            ;Use memory scan?
 013C  75 15                 C	        JNZ     SETEND
 013E  8B CA                 C	        MOV     CX,DX           ;Start scanning just after DOS
 0140                        C	MEMSCAN:
 0140  41                    C	        INC     CX
 0141  74 10                 C	        JZ      SETEND
 0143  8E D9                 C	        MOV     DS,CX
 0145  8A 07                 C	        MOV     AL,[BX]
 0147  F6 D0                 C	        NOT     AL
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-73
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 0149  88 07                 C	        MOV     [BX],AL
 014B  3A 07                 C	        CMP     AL,[BX]
 014D  F6 D0                 C	        NOT     AL
 014F  88 07                 C	        MOV     [BX],AL
 0151  74 ED                 C	        JZ      MEMSCAN
 0153                        C	SETEND:
                             C	        ENDIF
                             C	        IF      NOT HIGHMEM
 0153  8C CD                 C	        MOV     BP,CS
                             C	        ENDIF
                             C	; BP has segment of DOS (whether to load high or run in place)
                             C	; DX has program segment (whether after DOS or overlaying DOS)
                             C	; CX has size of memory in paragraphs (reduced by DOS size if HIGHMEM)
 0155  2E: 89 0E 0035 R      C	        MOV     CS:[ENDMEM],CX
                             C	        ENDIF
 015A  33 C0                 C	        XOR     AX,AX
 015C  8E D8                 C	        MOV     DS,AX
 015E  8E C0                 C	        MOV     ES,AX
 0160  BF 0080               C	        MOV     DI,INTBASE
 0163  B8 004B R             C	        MOV     AX,OFFSET DOSGROUP:QUIT
 0166  AB                    C	        STOSW                   ;Set abort address--displacement
 0167  8B C5                 C	        MOV     AX,BP
 0169  C6 06 00C0 EA         C	        MOV     BYTE PTR DS:[ENTRYPOINT],LONGJUMP
 016E  C7 06 00C1 0057 R     C	        MOV     WORD PTR DS:[ENTRYPOINT+1],OFFSET DOSGROUP:ENTRY
 0174  A3 00C3               C	        MOV     WORD PTR DS:[ENTRYPOINT+3],AX
 0177  C7 06 0000 1576 R     C	        MOV     WORD PTR DS:[0],OFFSET DOSGROUP:DIVOV   ;Set default divide trap address
 017D  A3 0002               C	        MOV     DS:[2],AX
 0180  B9 0009               C	        MOV     CX,9
 0183  F3/ AB                C	        REP STOSW               ;Set 5 segments (skip 2 between each)
 0185  C7 06 0084 004F R     C	        MOV     WORD PTR DS:[INTBASE+4],OFFSET DOSGROUP:COMMAND
 018B  C7 06 008C 0056 R     C	        MOV     WORD PTR DS:[INTBASE+12],OFFSET DOSGROUP:IRET   ;Ctrl-C exit
 0191  C7 06 0090 0056 R     C	        MOV     WORD PTR DS:[INTBASE+16],OFFSET DOSGROUP:IRET   ;Fatal error exit
 0197  B8 0015 R             C	        MOV     AX,OFFSET BIOSREAD
 019A  AB                    C	        STOSW
 019B  B8 0040               C	        MOV     AX,BIOSSEG
 019E  AB                    C	        STOSW
 019F  AB                    C	        STOSW                   ;Add 2 to DI
 01A0  AB                    C	        STOSW
 01A1  C7 06 0098 0018 R     C	        MOV     WORD PTR DS:[INTBASE+18H],OFFSET BIOSWRITE
 01A7  C7 06 0088 0100       C	        MOV     WORD PTR DS:[EXIT],100H
 01AD  89 16 008A            C	        MOV     WORD PTR DS:[EXIT+2],DX
                             C	        IF      NOT IBM
 01B1  BE 0010 R             C	        MOV     SI,OFFSET DOSGROUP:HEADER
 01B4  E8 12A4 R             C	        CALL    OUTMES
                             C	        ENDIF
 01B7  0E                    C	        PUSH    CS
 01B8  1F                    C	        POP     DS
 01B9  0E                    C	        PUSH    CS
 01BA  07                    C	        POP     ES
                             C	;Move the FATs into position
 01BB  A0 002D R             C	        MOV     AL,[NUMIO]
 01BE  98                    C	        CBW
 01BF  91                    C	        XCHG    AX,CX
 01C0  BF 0259 R             C	        MOV     DI,OFFSET DOSGROUP:MEMSTRT.FAT
 01C3                        C	FATPOINT:
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-74
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


 01C3  8B 35                 C	        MOV     SI,WORD PTR [DI]        ;Get address within FAT address table
 01C5  A5                    C	        MOVSW                           ;Set address of this FAT
 01C6  83 C7 12              C	        ADD     DI,DPBSIZ-2             ;Point to next DPB
 01C9  E2 F8                 C	        LOOP    FATPOINT
 01CB  59                    C	        POP     CX                      ;True address of first FAT
 01CC  BE 0247 R             C	        MOV     SI,OFFSET DOSGROUP:MEMSTRT      ;Place to move DPBs from
 01CF  8B 3E 004B R          C	        MOV     DI,[DRVTAB]             ;Place to move DPBs to
 01D3  2B CF                 C	        SUB     CX,DI                   ;Total length of DPBs
 01D5  3B FE                 C	        CMP     DI,SI
 01D7  76 07                 C	        JBE     MOVJMP                  ;Are we moving to higher or lower memory?
 01D9  49                    C	        DEC     CX                      ;Move backwards to higher memory
 01DA  03 F9                 C	        ADD     DI,CX
 01DC  03 F1                 C	        ADD     SI,CX
 01DE  41                    C	        INC     CX
 01DF  FD                    C	        STD
 01E0                        C	MOVJMP:
 01E0  8E C5                 C	        MOV     ES,BP
 01E2  E9 0000 R             C	        JMP     MOVFAT
                             C	
 01E5                        C	FIGFATSIZ:
 01E5  26: F6 66 08          C	        MUL     ES:BYTE PTR[BP.FATCNT]
 01E9  26: 03 46 06          C	        ADD     AX,ES:[BP.FIRFAT]
 01ED  26: 03 46 0B          C	        ADD     AX,ES:[BP.DIRSEC]
 01F1                        C	FIGMAX:
                             C	;AX has equivalent of FIRREC
 01F1  26: 2B 46 0D          C	        SUB     AX,ES:[BP.DSKSIZ]
 01F5  F7 D8                 C	        NEG     AX
 01F7  26: 8A 4E 05          C	        MOV     CL,ES:[BP.CLUSSHFT]
 01FB  D3 E8                 C	        SHR     AX,CL
 01FD  40                    C	        INC     AX
 01FE  8B C8                 C	        MOV     CX,AX           ;MAXCLUS
 0200  40                    C	        INC     AX
 0201  8B D0                 C	        MOV     DX,AX
 0203  D1 EA                 C	        SHR     DX,1
 0205  13 C2                 C	        ADC     AX,DX           ;Size of FAT in bytes
 0207  26: 8B 76 02          C	        MOV     SI,ES:[BP.SECSIZ]
 020B  03 C6                 C	        ADD     AX,SI
 020D  48                    C	        DEC     AX
 020E  33 D2                 C	        XOR     DX,DX
 0210  F7 F6                 C	        DIV     SI
 0212  C3                    C	        RET
                             C	
 0213                        C	BADMES:
 0213  0D 0A 49 4E 49 54     C	        DB      13,10,"INIT TABLE BAD",13,10,"$"
       20 54 41 42 4C 45     C	
       20 42 41 44 0D 0A     C	
       24                    C	
                             C	
 0226                        C	FATSIZTAB:
 0226  0000 0000 0000 0000   C	        DW      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
       0000 0000 0000 0000   C	
       0000 0000 0000 0000   C	
       0000 0000 0000 0000   C	
                             C	
 0246  00                    C	DRVCNT  DB      0
 The Microsoft MACRO Assembler             01-26-83    	PAGE	1-75
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


                             C	
 0247                        C	MEMSTRT LABEL   WORD
 = 0017                      C	ADJFAC  EQU     DIRBUF-MEMSTRT
 0247                        C	DATA    ENDS
                             C	        END

 The Microsoft MACRO Assembler             01-26-83    	PAGE	Symbols-1
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


Structures and records:

	 	N a m e	 	 	Width	# fields
	 	 	 	 	Shift	Width	Mask	Initial

DPBLOCK. . . . . . . . . . . . .	0014	000D
  DEVNUM . . . . . . . . . . . . .	0000
  DRVNUM . . . . . . . . . . . . .	0001
  SECSIZ . . . . . . . . . . . . .	0002
  CLUSMSK. . . . . . . . . . . . .	0004
  CLUSSHFT . . . . . . . . . . . .	0005
  FIRFAT . . . . . . . . . . . . .	0006
  FATCNT . . . . . . . . . . . . .	0008
  MAXENT . . . . . . . . . . . . .	0009
  FIRREC . . . . . . . . . . . . .	000B
  MAXCLUS. . . . . . . . . . . . .	000D
  FATSIZ . . . . . . . . . . . . .	000F
  FIRDIR . . . . . . . . . . . . .	0010
  FAT. . . . . . . . . . . . . . .	0012
FCBLOCK. . . . . . . . . . . . .	0024	000E
  EXTENT . . . . . . . . . . . . .	000C
  RECSIZ . . . . . . . . . . . . .	000E
  FILSIZ . . . . . . . . . . . . .	0010
  DRVBP. . . . . . . . . . . . . .	0012
  FDATE. . . . . . . . . . . . . .	0014
  FTIME. . . . . . . . . . . . . .	0016
  DEVID. . . . . . . . . . . . . .	0018
  FIRCLUS. . . . . . . . . . . . .	0019
  LSTCLUS. . . . . . . . . . . . .	001B
  CLUSPOS. . . . . . . . . . . . .	001D
  NR . . . . . . . . . . . . . . .	0020
  RR . . . . . . . . . . . . . . .	0021
STKPTRS. . . . . . . . . . . . .	0018	000C
  AXSAVE . . . . . . . . . . . . .	0000
  BXSAVE . . . . . . . . . . . . .	0002
  CXSAVE . . . . . . . . . . . . .	0004
  DXSAVE . . . . . . . . . . . . .	0006
  SISAVE . . . . . . . . . . . . .	0008
  DISAVE . . . . . . . . . . . . .	000A
  BPSAVE . . . . . . . . . . . . .	000C
  DSSAVE . . . . . . . . . . . . .	000E
  ESSAVE . . . . . . . . . . . . .	0010
  IPSAVE . . . . . . . . . . . . .	0012
  CSSAVE . . . . . . . . . . . . .	0014
  FSAVE. . . . . . . . . . . . . .	0016

Segments and groups:

	 	N a m e	 	 	Size	align	combine	class

DOSGROUP . . . . . . . . . . . .	GROUP
  CODE . . . . . . . . . . . . . .	1583	PARA  	NONE	
  CONSTANTS. . . . . . . . . . . .	004D	BYTE  	NONE	
  DATA . . . . . . . . . . . . . .	025E	WORD  	NONE	
SEGBIOS. . . . . . . . . . . . .	002D	AT    	0040	

 The Microsoft MACRO Assembler             01-26-83    	PAGE	Symbols-2
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


Symbols:            

	 	N a m e	 	 	Type	Value	Attr         

ABORT. . . . . . . . . . . . . .	L NEAR 	06B1	CODE
ADDREC . . . . . . . . . . . . .	L NEAR 	0B1C	CODE
ADJFAC . . . . . . . . . . . . .	Number	0017	
ALIGNED. . . . . . . . . . . . .	L NEAR 	019B	CODE
ALLOC. . . . . . . . . . . . . .	L NEAR 	0DC1	CODE
ALLOCATE . . . . . . . . . . . .	L NEAR 	0DBA	CODE
ATTRIB . . . . . . . . . . . . .	L BYTE 	0116	DATA
AUXIN. . . . . . . . . . . . . .	L NEAR 	0141	CODE
AUXOUT . . . . . . . . . . . . .	L NEAR 	014C	CODE
BACKMES. . . . . . . . . . . . .	L NEAR 	10D6	CODE
BACKPOS. . . . . . . . . . . . .	L NEAR 	1241	CODE
BACKSP . . . . . . . . . . . . .	L NEAR 	107E	CODE
BACKUP . . . . . . . . . . . . .	L NEAR 	10D3	CODE
BADCALL. . . . . . . . . . . . .	L NEAR 	0054	CODE
BADCLOSE . . . . . . . . . . . .	L NEAR 	0547	CODE
BADCLOSEJ. . . . . . . . . . . .	L NEAR 	04F8	CODE
BADDRV . . . . . . . . . . . . .	L NEAR 	1304	CODE
BADFAT . . . . . . . . . . . . .	L NEAR 	04A8	CODE
BADINIT. . . . . . . . . . . . .	L NEAR 	009E	DATA
BADINITJ . . . . . . . . . . . .	L NEAR 	00E9	DATA
BADMES . . . . . . . . . . . . .	L NEAR 	0213	DATA
BAKTAB . . . . . . . . . . . . .	L NEAR 	10A1	CODE
BIOSAUXIN. . . . . . . . . . . .	L BYTE 	000F	SEGBIOS	Length =0003
BIOSAUXOUT . . . . . . . . . . .	L BYTE 	0012	SEGBIOS	Length =0003
BIOSDSKCHG . . . . . . . . . . .	L BYTE 	001B	SEGBIOS	Length =0003
BIOSFLUSH. . . . . . . . . . . .	L BYTE 	0027	SEGBIOS	Length =0003
BIOSGETTIME. . . . . . . . . . .	L BYTE 	0024	SEGBIOS	Length =0003
BIOSIN . . . . . . . . . . . . .	L BYTE 	0006	SEGBIOS	Length =0003
BIOSMAPDEV . . . . . . . . . . .	L BYTE 	002A	SEGBIOS	Length =0003
BIOSOUT. . . . . . . . . . . . .	L BYTE 	0009	SEGBIOS	Length =0003
BIOSPRINT. . . . . . . . . . . .	L BYTE 	000C	SEGBIOS	Length =0003
BIOSREAD . . . . . . . . . . . .	L BYTE 	0015	SEGBIOS	Length =0003
BIOSSEG. . . . . . . . . . . . .	Number	0040	
BIOSSETDATE. . . . . . . . . . .	L BYTE 	001E	SEGBIOS	Length =0003
BIOSSETTIME. . . . . . . . . . .	L BYTE 	0021	SEGBIOS	Length =0003
BIOSSTAT . . . . . . . . . . . .	L BYTE 	0003	SEGBIOS	Length =0003
BIOSWRITE. . . . . . . . . . . .	L BYTE 	0018	SEGBIOS	Length =0003
BLKDON . . . . . . . . . . . . .	L NEAR 	0D7D	CODE
BLKRD. . . . . . . . . . . . . .	L NEAR 	071E	CODE
BLKWRT . . . . . . . . . . . . .	L NEAR 	0726	CODE
BREAKDOWN. . . . . . . . . . . .	L NEAR 	084C	CODE
BUFDRVBP . . . . . . . . . . . .	L WORD 	003F	CONSTANTS
BUFDRVNO . . . . . . . . . . . .	L BYTE 	003D	CONSTANTS
BUFFER . . . . . . . . . . . . .	L WORD 	0039	CONSTANTS
BUFFUL . . . . . . . . . . . . .	L NEAR 	1027	CODE
BUFIN. . . . . . . . . . . . . .	L NEAR 	0FBD	CODE
BUFOK. . . . . . . . . . . . . .	L NEAR 	0462	CODE
BUFOUT . . . . . . . . . . . . .	L NEAR 	117D	CODE
BUFRD. . . . . . . . . . . . . .	L NEAR 	0925	CODE
BUFSEC . . . . . . . . . . . . .	L NEAR 	08A0	CODE
BUFSECNO . . . . . . . . . . . .	L WORD 	003B	CONSTANTS
 The Microsoft MACRO Assembler             01-26-83    	PAGE	Symbols-3
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


BUFWRT . . . . . . . . . . . . .	L NEAR 	0938	CODE
BYTCNT1. . . . . . . . . . . . .	L WORD 	0156	DATA
BYTCNT2. . . . . . . . . . . . .	L WORD 	0158	DATA
BYTPOS . . . . . . . . . . . . .	L BYTE 	0152	DATA	Length =0004
BYTSECPOS. . . . . . . . . . . .	L WORD 	0150	DATA
CANCEL . . . . . . . . . . . . .	Number	0018	
CARPOS . . . . . . . . . . . . .	L BYTE 	0028	CONSTANTS
CHK. . . . . . . . . . . . . . .	L NEAR 	1367	CODE
CHKCNT . . . . . . . . . . . . .	L NEAR 	10B9	CODE
CHKDIRWRITE. . . . . . . . . . .	L NEAR 	067A	CODE
CHKFATWRT. . . . . . . . . . . .	L NEAR 	051F	CODE
CHKYR. . . . . . . . . . . . . .	L NEAR 	1485	CODE
CLOSE. . . . . . . . . . . . . .	L NEAR 	04BB	CODE
CLRET. . . . . . . . . . . . . .	L NEAR 	0993	CODE
CLUSNUM. . . . . . . . . . . . .	L WORD 	014A	DATA
CODSIZ . . . . . . . . . . . . .	Number	1583	
CODSTRT. . . . . . . . . . . . .	Number	0000	CODE
COMMAND. . . . . . . . . . . . .	L NEAR 	004F	CODE
CONBUF . . . . . . . . . . . . .	L BYTE 	0080	DATA	Length =0083
CONIN. . . . . . . . . . . . . .	L NEAR 	1253	CODE
CONOUT . . . . . . . . . . . . .	L NEAR 	119D	CODE
CONSTAT. . . . . . . . . . . . .	L NEAR 	1249	CODE
CONSTRT. . . . . . . . . . . . .	Number	0000	CONSTANTS
CONTC. . . . . . . . . . . . . .	Number	0023	
CONTINIT . . . . . . . . . . . .	L NEAR 	00EB	DATA
CONTPOS. . . . . . . . . . . . .	L WORD 	002F	CONSTANTS
CONTSRCH . . . . . . . . . . . .	L NEAR 	01E6	CODE
CONTSTK. . . . . . . . . . . . .	L WORD 	0135	DATA
COPYEACH . . . . . . . . . . . .	L NEAR 	10F7	CODE
COPYLIN. . . . . . . . . . . . .	L NEAR 	10EA	CODE
COPYNEW. . . . . . . . . . . . .	L NEAR 	104C	CODE
COPYONE. . . . . . . . . . . . .	L NEAR 	10F5	CODE
COPYSTR. . . . . . . . . . . . .	L NEAR 	10F0	CODE
CREATE . . . . . . . . . . . . .	L NEAR 	056D	CODE
CREATING . . . . . . . . . . . .	L BYTE 	012F	DATA
CRET . . . . . . . . . . . . . .	L NEAR 	01B9	CODE
CRLF . . . . . . . . . . . . . .	L NEAR 	105C	CODE
CTRLOUT. . . . . . . . . . . . .	L NEAR 	1214	CODE
CURDRV . . . . . . . . . . . . .	L BYTE 	004A	CONSTANTS
DATE16 . . . . . . . . . . . . .	L NEAR 	1400	CODE
DAY. . . . . . . . . . . . . . .	L BYTE 	0043	CONSTANTS
DAYCNT . . . . . . . . . . . . .	L WORD 	0047	CONSTANTS
DEFDRV . . . . . . . . . . . . .	L NEAR 	12B9	CODE
DELALL . . . . . . . . . . . . .	L BYTE 	0130	DATA
DELETE . . . . . . . . . . . . .	L NEAR 	029B	CODE
DELFILE. . . . . . . . . . . . .	L NEAR 	02C9	CODE
DELIM. . . . . . . . . . . . . .	L NEAR 	137F	CODE
DELNXT . . . . . . . . . . . . .	L NEAR 	02E5	CODE
DEVNAME. . . . . . . . . . . . .	L NEAR 	01A4	CODE
DEVSIZ . . . . . . . . . . . . .	L NEAR 	0F03	CODE
DIRBUF . . . . . . . . . . . . .	L WORD 	025E	DATA
DIRBUFID . . . . . . . . . . . .	L WORD 	0041	CONSTANTS
DIRCOMP. . . . . . . . . . . . .	L NEAR 	0560	CODE
DIRREAD. . . . . . . . . . . . .	L NEAR 	05E8	CODE
DIRSEC . . . . . . . . . . . . .	Number	000B	
 The Microsoft MACRO Assembler             01-26-83    	PAGE	Symbols-4
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


DIRTYBUF . . . . . . . . . . . .	L BYTE 	003E	CONSTANTS
DIRTYDIR . . . . . . . . . . . .	L BYTE 	002B	CONSTANTS
DIRWRITE . . . . . . . . . . . .	L NEAR 	0681	CODE
DISPATCH . . . . . . . . . . . .	L WORD 	00B6	CODE
DIVMES . . . . . . . . . . . . .	L BYTE 	0014	CONSTANTS
DIVOV. . . . . . . . . . . . . .	L NEAR 	1576	CODE
DMAADD . . . . . . . . . . . . .	L WORD 	0031	CONSTANTS
DOOPEN . . . . . . . . . . . . .	L NEAR 	03D0	CODE
DOSINIT. . . . . . . . . . . . .	L NEAR 	0024	DATA
DOSLEN . . . . . . . . . . . . .	Number	15D0	
DOWRT. . . . . . . . . . . . . .	L NEAR 	0C24	CODE
DOWRTJ . . . . . . . . . . . . .	L NEAR 	0BA3	CODE
DPBSIZ . . . . . . . . . . . . .	Number	0014	
DREAD. . . . . . . . . . . . . .	L NEAR 	05FC	CODE
DRVBIT . . . . . . . . . . . . .	Number	0002	
DRVCNT . . . . . . . . . . . . .	L BYTE 	0246	DATA
DRVTAB . . . . . . . . . . . . .	L WORD 	004B	CONSTANTS
DSKERR . . . . . . . . . . . . .	L BYTE 	0138	DATA
DSKREAD. . . . . . . . . . . . .	L NEAR 	0669	CODE
DSKRESET . . . . . . . . . . . .	L NEAR 	0F64	CODE
DSKSIZ . . . . . . . . . . . . .	Number	000D	
DSKSTACK . . . . . . . . . . . .	L BYTE 	025E	DATA
DSKTEST. . . . . . . . . . . . .	Alias	FALSE	 	
DSLIDE . . . . . . . . . . . . .	L NEAR 	1475	CODE
DSLIDE1. . . . . . . . . . . . .	L NEAR 	1477	CODE
DSUM . . . . . . . . . . . . . .	L NEAR 	153C	CODE
DSUM1. . . . . . . . . . . . . .	L NEAR 	1540	CODE
DWRITE . . . . . . . . . . . . .	L NEAR 	068C	CODE
EACHFAT. . . . . . . . . . . . .	L NEAR 	0533	CODE
EDITON . . . . . . . . . . . . .	L NEAR 	0FD9	CODE
ENDLIN . . . . . . . . . . . . .	L NEAR 	1042	CODE
ENDMEM . . . . . . . . . . . . .	L WORD 	0035	CONSTANTS
ENDRDCON . . . . . . . . . . . .	L NEAR 	09B1	CODE
ENDRDDEV . . . . . . . . . . . .	L NEAR 	09B5	CODE
ENDWRDEV . . . . . . . . . . . .	L NEAR 	0B7B	CODE
ENTERINS . . . . . . . . . . . .	L NEAR 	115B	CODE
ENTFREE. . . . . . . . . . . . .	L WORD 	015C	DATA
ENTRY. . . . . . . . . . . . . .	L NEAR 	0057	CODE
ENTRYPOINT . . . . . . . . . . .	Number	00C0	
ENTRYPOINTSEG. . . . . . . . . .	Number	000C	
ENUF . . . . . . . . . . . . . .	L NEAR 	0A43	CODE
EOFERR . . . . . . . . . . . . .	L NEAR 	0843	CODE
ERRET. . . . . . . . . . . . . .	L NEAR 	036F	CODE
ERRET3 . . . . . . . . . . . . .	L NEAR 	059A	CODE
ERRINT . . . . . . . . . . . . .	L NEAR 	0632	CODE
ERROR. . . . . . . . . . . . . .	L NEAR 	06C9	CODE
ERRPOP . . . . . . . . . . . . .	L NEAR 	0598	CODE
ESC. . . . . . . . . . . . . . .	L NEAR 	102E	CODE
ESCCH. . . . . . . . . . . . . .	Number	001B	
ESCCHAR. . . . . . . . . . . . .	L BYTE 	0003	CODE
ESCFUNC. . . . . . . . . . . . .	L WORD 	1165	CODE
ESCTAB . . . . . . . . . . . . .	L NEAR 	0004	CODE
ESCTABLEN. . . . . . . . . . . .	Number	000C	
EVENFIL. . . . . . . . . . . . .	L NEAR 	0B05	CODE
EVENMOV. . . . . . . . . . . . .	L NEAR 	0ABA	CODE
 The Microsoft MACRO Assembler             01-26-83    	PAGE	Symbols-5
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


EVENRD . . . . . . . . . . . . .	L NEAR 	0934	CODE
EVENWRT. . . . . . . . . . . . .	L NEAR 	095B	CODE
EXISTENT . . . . . . . . . . . .	L NEAR 	059D	CODE
EXIT . . . . . . . . . . . . . .	Number	0088	
EXITHOLD . . . . . . . . . . . .	L BYTE 	0105	DATA	Length =0004
EXITINS. . . . . . . . . . . . .	L NEAR 	1160	CODE
EXTBIT . . . . . . . . . . . . .	Number	0008	
EXTFCB . . . . . . . . . . . . .	L BYTE 	012E	DATA
FALSE. . . . . . . . . . . . . .	Number	0000	
FATAL. . . . . . . . . . . . . .	L NEAR 	0639	CODE
FATAL1 . . . . . . . . . . . . .	L NEAR 	063C	CODE
FATBASE. . . . . . . . . . . . .	L WORD 	0109	DATA
FATERR . . . . . . . . . . . . .	L NEAR 	0418	CODE
FATPOINT . . . . . . . . . . . .	L NEAR 	01C3	DATA
FATREAD. . . . . . . . . . . . .	L NEAR 	042C	CODE
FATSIZTAB. . . . . . . . . . . .	L NEAR 	0226	DATA
FATWRT . . . . . . . . . . . . .	L NEAR 	052C	CODE
FCB. . . . . . . . . . . . . . .	L WORD 	013E	DATA
FIGFAT . . . . . . . . . . . . .	L NEAR 	0551	CODE
FIGFATSIZ. . . . . . . . . . . .	L NEAR 	01E5	DATA
FIGMAX . . . . . . . . . . . . .	L NEAR 	01F1	DATA
FIGREC . . . . . . . . . . . . .	L NEAR 	0D8B	CODE
FIGSHFT. . . . . . . . . . . . .	L NEAR 	0063	DATA
FIGTAB . . . . . . . . . . . . .	L NEAR 	10BB	CODE
FILDIRENT. . . . . . . . . . . .	Number	0010	
FILESIZE . . . . . . . . . . . .	L NEAR 	0ED2	CODE
FILLB. . . . . . . . . . . . . .	L NEAR 	12C8	CODE
FILLB2 . . . . . . . . . . . . .	L NEAR 	12D5	CODE
FILLNAM. . . . . . . . . . . . .	L NEAR 	134C	CODE
FINBLK . . . . . . . . . . . . .	L NEAR 	072C	CODE
FINBUF . . . . . . . . . . . . .	L NEAR 	0907	CODE
FINCLUS. . . . . . . . . . . . .	L NEAR 	0D3C	CODE
FINDFRE. . . . . . . . . . . . .	L NEAR 	0DC3	CODE
FINDIT . . . . . . . . . . . . .	L NEAR 	088C	CODE
FINDNAME . . . . . . . . . . . .	L NEAR 	01DA	CODE
FINDOLD. . . . . . . . . . . . .	L NEAR 	1123	CODE
FINRND . . . . . . . . . . . . .	L NEAR 	073B	CODE
FINSEQ . . . . . . . . . . . . .	L NEAR 	0704	CODE
FINWRT . . . . . . . . . . . . .	L NEAR 	0C8F	CODE
FLGFAT . . . . . . . . . . . . .	L NEAR 	0012	DATA
FLUSHKB. . . . . . . . . . . . .	L NEAR 	011E	CODE
FNDCLUS. . . . . . . . . . . . .	L NEAR 	0874	CODE
FNDDIR . . . . . . . . . . . . .	L NEAR 	04F5	CODE
FNDFATSIZ. . . . . . . . . . . .	L NEAR 	0082	DATA
FNDPOS . . . . . . . . . . . . .	L NEAR 	10AD	CODE
FOUND. . . . . . . . . . . . . .	L NEAR 	0226	CODE
FOURYEARS. . . . . . . . . . . .	Number	05B5	
FREE . . . . . . . . . . . . . .	L NEAR 	020F	CODE
FREESPOT . . . . . . . . . . . .	L NEAR 	05B9	CODE
FULLREC. . . . . . . . . . . . .	L NEAR 	0B0A	CODE
GETBP. . . . . . . . . . . . . .	L NEAR 	0492	CODE
GETBUF . . . . . . . . . . . . .	L NEAR 	09F6	CODE
GETCH. . . . . . . . . . . . . .	L NEAR 	0FEE	CODE
GETCH1 . . . . . . . . . . . . .	L NEAR 	109E	CODE
GETCH2 . . . . . . . . . . . . .	L NEAR 	110C	CODE
 The Microsoft MACRO Assembler             01-26-83    	PAGE	Symbols-6
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


GETDATE. . . . . . . . . . . . .	L NEAR 	14A6	CODE
GETDRV . . . . . . . . . . . . .	L NEAR 	0F97	CODE
GETDSKPT . . . . . . . . . . . .	L NEAR 	0F4E	CODE
GETENT . . . . . . . . . . . . .	L NEAR 	0247	CODE
GETENTRY . . . . . . . . . . . .	L NEAR 	023E	CODE
GETEOF . . . . . . . . . . . . .	L NEAR 	0E43	CODE
GETFATPT . . . . . . . . . . . .	L NEAR 	0F20	CODE
GETFATPTDL . . . . . . . . . . .	L NEAR 	0F22	CODE
GETFATSIZ. . . . . . . . . . . .	L NEAR 	0087	DATA
GETFILE. . . . . . . . . . . . .	L NEAR 	01C8	CODE
GETIO. . . . . . . . . . . . . .	L NEAR 	0114	CODE
GETLET . . . . . . . . . . . . .	L NEAR 	135A	CODE
GETNAME. . . . . . . . . . . . .	L NEAR 	01D5	CODE
GETRDONLY. . . . . . . . . . . .	L NEAR 	0114	CODE
GETREC . . . . . . . . . . . . .	L NEAR 	0D9A	CODE
GETRRPOS . . . . . . . . . . . .	L NEAR 	076A	CODE
GETRRPOS1. . . . . . . . . . . .	L NEAR 	0767	CODE
GETSEC . . . . . . . . . . . . .	L NEAR 	08BD	CODE
GETTHISDRV . . . . . . . . . . .	L NEAR 	03B9	CODE
GETTIME. . . . . . . . . . . . .	L NEAR 	1546	CODE
GETWORD. . . . . . . . . . . . .	L NEAR 	132C	CODE
HARDERR. . . . . . . . . . . . .	L NEAR 	060F	CODE
HAVATTRB . . . . . . . . . . . .	L NEAR 	0397	CODE
HAVCLUS. . . . . . . . . . . . .	L NEAR 	016D	CODE
HAVDIF . . . . . . . . . . . . .	L NEAR 	13DE	CODE
HAVDIRBUF. . . . . . . . . . . .	L NEAR 	026C	CODE
HAVDRV . . . . . . . . . . . . .	L NEAR 	1306	CODE
HAVFATSIZ. . . . . . . . . . . .	L NEAR 	00A6	DATA
HAVFRE . . . . . . . . . . . . .	L NEAR 	0E03	CODE
HAVIT. . . . . . . . . . . . . .	L NEAR 	0294	CODE
HAVRECSIZ. . . . . . . . . . . .	L NEAR 	079D	CODE
HAVSHFT. . . . . . . . . . . . .	L NEAR 	006B	DATA
HAVSTART . . . . . . . . . . . .	L NEAR 	0B86	CODE
HAVTAB . . . . . . . . . . . . .	L NEAR 	10C0	CODE
HEADER . . . . . . . . . . . . .	L BYTE 	0010	CODE
HIGHMEM. . . . . . . . . . . . .	Alias	FALSE	 	
HURTFAT. . . . . . . . . . . . .	L NEAR 	0174	CODE
IBM. . . . . . . . . . . . . . .	Alias	FALSE	 	
IN . . . . . . . . . . . . . . .	L NEAR 	125C	CODE
INBUF. . . . . . . . . . . . . .	L BYTE 	0000	DATA	Length =0080
INCHK. . . . . . . . . . . . . .	L NEAR 	11D4	CODE
INTBASE. . . . . . . . . . . . .	Number	0080	
INTTAB . . . . . . . . . . . . .	Number	0020	
INUSE. . . . . . . . . . . . . .	L NEAR 	0114	CODE
IOCHK. . . . . . . . . . . . . .	L NEAR 	01BB	CODE
IONAME . . . . . . . . . . . . .	L NEAR 	0000	CONSTANTS
IOSTACK. . . . . . . . . . . . .	L BYTE 	01DE	DATA
IRET . . . . . . . . . . . . . .	L NEAR 	0056	CODE
KILLFIL. . . . . . . . . . . . .	L NEAR 	0D06	CODE
KILLSRCH . . . . . . . . . . . .	L NEAR 	0E8A	CODE
KILLSRCH1. . . . . . . . . . . .	E NEAR 	0E8B	CODE
KILNEW . . . . . . . . . . . . .	L NEAR 	106B	CODE
LASTENT. . . . . . . . . . . . .	L WORD 	0103	DATA
LASTPOS. . . . . . . . . . . . .	L WORD 	0148	DATA
LEAVE. . . . . . . . . . . . . .	L NEAR 	009C	CODE
 The Microsoft MACRO Assembler             01-26-83    	PAGE	Symbols-7
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


LIST . . . . . . . . . . . . . .	L NEAR 	128B	CODE
LISTOUT. . . . . . . . . . . . .	L NEAR 	128D	CODE
LOAD . . . . . . . . . . . . . .	L NEAR 	0A1E	CODE
LODNAME. . . . . . . . . . . . .	L NEAR 	039F	CODE
LONGCALL . . . . . . . . . . . .	Number	009A	
LONGJUMP . . . . . . . . . . . .	Number	00EA	
LOOKIO . . . . . . . . . . . . .	L NEAR 	01A9	CODE
LVDSK. . . . . . . . . . . . . .	L NEAR 	0B97	CODE
MAKEFCB. . . . . . . . . . . . .	L NEAR 	12AF	CODE
MAPDRV . . . . . . . . . . . . .	L NEAR 	048F	CODE
MAXCALL. . . . . . . . . . . . .	Number	0024	
MAXCOM . . . . . . . . . . . . .	Number	002E	
MAXDIF . . . . . . . . . . . . .	Number	0FFF	
MAXREC . . . . . . . . . . . . .	L NEAR 	0DF0	CODE
MAXSEC . . . . . . . . . . . . .	L WORD 	0037	CONSTANTS
MEMSCAN. . . . . . . . . . . . .	L NEAR 	0140	DATA
MEMSTRT. . . . . . . . . . . . .	L WORD 	0247	DATA
MONTAB . . . . . . . . . . . . .	L BYTE 	149A	CODE
MONTH. . . . . . . . . . . . . .	L BYTE 	0044	CONSTANTS
MOVCHK . . . . . . . . . . . . .	L NEAR 	03A8	CODE
MOVFAT . . . . . . . . . . . . .	L NEAR 	0000	DATA
MOVJMP . . . . . . . . . . . . .	L NEAR 	01E0	DATA
MOVNAME. . . . . . . . . . . . .	L NEAR 	0372	CODE
MSVER. . . . . . . . . . . . . .	Alias	TRUE	 	
MUSTGETWORD. . . . . . . . . . .	L NEAR 	1332	CODE
NAMBIT . . . . . . . . . . . . .	Number	0004	
NAME1. . . . . . . . . . . . . .	L BYTE 	010B	DATA	Length =000B
NAME2. . . . . . . . . . . . . .	L BYTE 	0117	DATA	Length =000B
NAME3. . . . . . . . . . . . . .	L BYTE 	0122	DATA	Length =000C
NEWBASE. . . . . . . . . . . . .	L NEAR 	13A8	CODE
NEWDSK . . . . . . . . . . . . .	L NEAR 	0450	CODE
NEWFAT . . . . . . . . . . . . .	L NEAR 	047A	CODE
NEWLIN . . . . . . . . . . . . .	L NEAR 	0FDC	CODE
NEWNAM . . . . . . . . . . . . .	L NEAR 	0320	CODE
NEXTADD. . . . . . . . . . . . .	L WORD 	0140	DATA
NEXTENT. . . . . . . . . . . . .	L NEAR 	0209	CODE
NEXTENTRY. . . . . . . . . . . .	L NEAR 	0275	CODE
NEXTFAT. . . . . . . . . . . . .	L NEAR 	046B	CODE
NEXTSEC. . . . . . . . . . . . .	L NEAR 	0965	CODE
NOBUF. . . . . . . . . . . . . .	L NEAR 	0F82	CODE
NOCHG. . . . . . . . . . . . . .	L NEAR 	0327	CODE
NOCLUS . . . . . . . . . . . . .	L NEAR 	089D	CODE
NODOT. . . . . . . . . . . . . .	L NEAR 	131D	CODE
NODRV. . . . . . . . . . . . . .	L NEAR 	1309	CODE
NOEDIT . . . . . . . . . . . . .	L NEAR 	0FD7	CODE
NOFILERR . . . . . . . . . . . .	L NEAR 	077B	CODE
NONAM. . . . . . . . . . . . . .	L NEAR 	1328	CODE
NONE . . . . . . . . . . . . . .	L NEAR 	0296	CODE
NONEXT . . . . . . . . . . . . .	L NEAR 	0995	CODE
NOREAD . . . . . . . . . . . . .	L NEAR 	0949	CODE
NORMCH . . . . . . . . . . . . .	L NEAR 	09A0	CODE
NORMFCB. . . . . . . . . . . . .	L NEAR 	0E7C	CODE
NORMFCB1 . . . . . . . . . . . .	L NEAR 	0774	CODE
NORMFCB2 . . . . . . . . . . . .	L NEAR 	0DA4	CODE
NORMFCB3 . . . . . . . . . . . .	L NEAR 	04C5	CODE
 The Microsoft MACRO Assembler             01-26-83    	PAGE	Symbols-8
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


NORNDUP. . . . . . . . . . . . .	L NEAR 	0BED	CODE
NOROOM . . . . . . . . . . . . .	L NEAR 	084A	CODE
NOSCAN . . . . . . . . . . . . .	L NEAR 	12EE	CODE
NOSKIP . . . . . . . . . . . . .	L NEAR 	0C1C	CODE
NOSTAR . . . . . . . . . . . . .	L NEAR 	1342	CODE
NOSTOP . . . . . . . . . . . . .	L NEAR 	1190	CODE
NOSUCHDRV. . . . . . . . . . . .	L NEAR 	0F1D	CODE
NOTALL . . . . . . . . . . . . .	L NEAR 	02BE	CODE
NOTBUFFED. . . . . . . . . . . .	L NEAR 	0ABB	CODE
NOTDEVICE. . . . . . . . . . . .	L NEAR 	07A7	CODE
NOTFND . . . . . . . . . . . . .	L NEAR 	1143	CODE
NOTINBUF . . . . . . . . . . . .	L NEAR 	0C62	CODE
NOTMAX . . . . . . . . . . . . .	L NEAR 	005C	DATA
NUMDEV . . . . . . . . . . . . .	Number	0005	
NUMDRV . . . . . . . . . . . . .	L BYTE 	002C	CONSTANTS
NUMIO. . . . . . . . . . . . . .	L BYTE 	002D	CONSTANTS
OK . . . . . . . . . . . . . . .	L NEAR 	083B	CODE
OKRET. . . . . . . . . . . . . .	L NEAR 	0544	CODE
OKRET1 . . . . . . . . . . . . .	L NEAR 	04B8	CODE
OLDBAK . . . . . . . . . . . . .	L NEAR 	1093	CODE
ONSEC. . . . . . . . . . . . . .	L NEAR 	0A74	CODE
OPEN . . . . . . . . . . . . . .	L NEAR 	03CD	CODE
OPENDEV. . . . . . . . . . . . .	L NEAR 	03FF	CODE
OPENJMP. . . . . . . . . . . . .	L NEAR 	05E2	CODE
OPTCLUS. . . . . . . . . . . . .	L NEAR 	0D28	CODE
OPTIMIZE . . . . . . . . . . . .	L NEAR 	0D15	CODE
OUT. . . . . . . . . . . . . . .	L NEAR 	119F	CODE
OUTCH. . . . . . . . . . . . . .	L NEAR 	11AC	CODE
OUTCHJ . . . . . . . . . . . . .	L NEAR 	123E	CODE
OUTMES . . . . . . . . . . . . .	L NEAR 	12A4	CODE
OUTSTR . . . . . . . . . . . . .	L NEAR 	129A	CODE
PACK . . . . . . . . . . . . . .	L NEAR 	017F	CODE
PACKIN . . . . . . . . . . . . .	L NEAR 	019F	CODE
PARTSEG. . . . . . . . . . . . .	L NEAR 	0829	CODE
PERDRV . . . . . . . . . . . . .	L NEAR 	0035	DATA
PFLAG. . . . . . . . . . . . . .	L BYTE 	002A	CONSTANTS
PHYCRLF. . . . . . . . . . . . .	L NEAR 	1066	CODE
PHYDRV . . . . . . . . . . . . .	L NEAR 	03C8	CODE
POPTAB . . . . . . . . . . . . .	L NEAR 	1236	CODE
PREREAD. . . . . . . . . . . . .	L BYTE 	013A	DATA
PRINTOFF . . . . . . . . . . . .	L NEAR 	120D	CODE
PRINTON. . . . . . . . . . . . .	L NEAR 	1206	CODE
PRTBUF . . . . . . . . . . . . .	L NEAR 	1298	CODE
PUNCH. . . . . . . . . . . . . .	L NEAR 	014A	CODE
PUTNEW . . . . . . . . . . . . .	L NEAR 	1071	CODE
QUIT . . . . . . . . . . . . . .	L NEAR 	004B	CODE
RAWINP . . . . . . . . . . . . .	L NEAR 	127F	CODE
RAWIO. . . . . . . . . . . . . .	L NEAR 	1262	CODE
RAWOUT . . . . . . . . . . . . .	L NEAR 	1285	CODE
RDERR. . . . . . . . . . . . . .	L NEAR 	0A16	CODE
RDLAST . . . . . . . . . . . . .	L NEAR 	0B2D	CODE
RDLASTJ. . . . . . . . . . . . .	L NEAR 	0A1B	CODE
RDLP . . . . . . . . . . . . . .	L NEAR 	0A80	CODE
RDMID. . . . . . . . . . . . . .	L NEAR 	0A63	CODE
RDSEC. . . . . . . . . . . . . .	L NEAR 	08DD	CODE
 The Microsoft MACRO Assembler             01-26-83    	PAGE	Symbols-9
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


READAUX. . . . . . . . . . . . .	L NEAR 	09D5	CODE
READCON. . . . . . . . . . . . .	L NEAR 	09DF	CODE
READDEV. . . . . . . . . . . . .	L NEAR 	09C8	CODE
READER . . . . . . . . . . . . .	L NEAR 	0141	CODE
READOP . . . . . . . . . . . . .	L BYTE 	013B	DATA
READTIME . . . . . . . . . . . .	L NEAR 	1427	CODE
RECCNT . . . . . . . . . . . . .	L WORD 	0146	DATA
RECOK. . . . . . . . . . . . . .	L NEAR 	0EE7	CODE
RECPOS . . . . . . . . . . . . .	L BYTE 	0142	DATA	Length =0004
REDISP . . . . . . . . . . . . .	L NEAR 	0084	CODE
REDISPJ. . . . . . . . . . . . .	L NEAR 	013E	CODE
REEDIT . . . . . . . . . . . . .	L NEAR 	1147	CODE
RELBLKS. . . . . . . . . . . . .	L NEAR 	0E31	CODE
RELEASE. . . . . . . . . . . . .	L NEAR 	0E2F	CODE
RELFILE. . . . . . . . . . . . .	L NEAR 	0CFA	CODE
RENAME . . . . . . . . . . . . .	L NEAR 	02F3	CODE
RENERR . . . . . . . . . . . . .	L NEAR 	036C	CODE
RENFIL . . . . . . . . . . . . .	L NEAR 	0317	CODE
RESFLG . . . . . . . . . . . . .	L NEAR 	127B	CODE
RET1 . . . . . . . . . . . . . .	L NEAR 	01C7	CODE
RET10. . . . . . . . . . . . . .	L NEAR 	0873	CODE
RET100 . . . . . . . . . . . . .	L NEAR 	0D7C	CODE
RET101 . . . . . . . . . . . . .	L NEAR 	1395	CODE
RET11. . . . . . . . . . . . . .	L NEAR 	0DF1	CODE
RET12. . . . . . . . . . . . . .	L NEAR 	0E2E	CODE
RET13. . . . . . . . . . . . . .	L NEAR 	0E42	CODE
RET14. . . . . . . . . . . . . .	L NEAR 	0EB2	CODE
RET15. . . . . . . . . . . . . .	L NEAR 	0F9B	CODE
RET16. . . . . . . . . . . . . .	L NEAR 	0FAE	CODE
RET17. . . . . . . . . . . . . .	L NEAR 	0FBC	CODE
RET18. . . . . . . . . . . . . .	L NEAR 	11C3	CODE
RET19. . . . . . . . . . . . . .	L NEAR 	1237	CODE
RET2 . . . . . . . . . . . . . .	L NEAR 	01D4	CODE
RET20. . . . . . . . . . . . . .	L NEAR 	1297	CODE
RET21. . . . . . . . . . . . . .	L NEAR 	1351	CODE
RET22. . . . . . . . . . . . . .	L NEAR 	1426	CODE
RET23. . . . . . . . . . . . . .	L NEAR 	1474	CODE
RET24. . . . . . . . . . . . . .	L NEAR 	14C3	CODE
RET25. . . . . . . . . . . . . .	L NEAR 	153B	CODE
RET26. . . . . . . . . . . . . .	L NEAR 	1557	CODE
RET28. . . . . . . . . . . . . .	L NEAR 	0B2C	CODE
RET29. . . . . . . . . . . . . .	L NEAR 	1261	CODE
RET3 . . . . . . . . . . . . . .	L NEAR 	020E	CODE
RET30. . . . . . . . . . . . . .	L NEAR 	1142	CODE
RET4 . . . . . . . . . . . . . .	L NEAR 	029A	CODE
RET5 . . . . . . . . . . . . . .	L NEAR 	0371	CODE
RET6 . . . . . . . . . . . . . .	L NEAR 	03B8	CODE
RET7 . . . . . . . . . . . . . .	L NEAR 	04A7	CODE
RET8 . . . . . . . . . . . . . .	L NEAR 	05FB	CODE
RET9 . . . . . . . . . . . . . .	L NEAR 	0679	CODE
RNDRD. . . . . . . . . . . . . .	L NEAR 	070E	CODE
RNDWRT . . . . . . . . . . . . .	L NEAR 	0716	CODE
SAMSIZ . . . . . . . . . . . . .	L NEAR 	0CB9	CODE
SAMSTK . . . . . . . . . . . . .	L NEAR 	0097	CODE
SAVCH. . . . . . . . . . . . . .	L NEAR 	1010	CODE
 The Microsoft MACRO Assembler             01-26-83    	PAGE	Symbols-10
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


SAVEXIT. . . . . . . . . . . . .	Number	000A	
SAVFEB . . . . . . . . . . . . .	L NEAR 	148E	CODE
SAVFIR . . . . . . . . . . . . .	L NEAR 	0862	CODE
SAVPLCE. . . . . . . . . . . . .	L NEAR 	0E53	CODE
SAVPOS . . . . . . . . . . . . .	L NEAR 	0990	CODE
SAVREGS. . . . . . . . . . . . .	L NEAR 	006D	CODE
SCANB. . . . . . . . . . . . . .	L NEAR 	1352	CODE
SECCLUSPOS . . . . . . . . . . .	L BYTE 	0137	DATA
SECCNT . . . . . . . . . . . . .	L WORD 	015A	DATA
SECPOS . . . . . . . . . . . . .	L WORD 	014C	DATA
SELDSK . . . . . . . . . . . . .	L NEAR 	0FAF	CODE
SEQRD. . . . . . . . . . . . . .	L NEAR 	06F6	CODE
SEQWRT . . . . . . . . . . . . .	L NEAR 	06FE	CODE
SETATTRIB. . . . . . . . . . . .	L NEAR 	0114	CODE
SETBUF . . . . . . . . . . . . .	L NEAR 	08F9	CODE
SETCLUS. . . . . . . . . . . . .	L NEAR 	0B0E	CODE
SETDATE. . . . . . . . . . . . .	L NEAR 	14C4	CODE
SETDIRT. . . . . . . . . . . . .	L NEAR 	0D00	CODE
SETDMA . . . . . . . . . . . . .	L NEAR 	0F12	CODE
SETEND . . . . . . . . . . . . .	L NEAR 	0153	DATA
SETFCB . . . . . . . . . . . . .	L NEAR 	0ACD	CODE
SETFCBJ. . . . . . . . . . . . .	L NEAR 	09C5	CODE
SETIO. . . . . . . . . . . . . .	L NEAR 	0114	CODE
SETMEM . . . . . . . . . . . . .	L NEAR 	13BE	CODE
SETNREX. . . . . . . . . . . . .	L NEAR 	074B	CODE
SETRNDREC. . . . . . . . . . . .	L NEAR 	0F9C	CODE
SETTIME. . . . . . . . . . . . .	L NEAR 	1558	CODE
SETUP. . . . . . . . . . . . . .	L NEAR 	0784	CODE
SETVECT. . . . . . . . . . . . .	L NEAR 	1396	CODE
SETYEAR. . . . . . . . . . . . .	L NEAR 	1481	CODE
SK . . . . . . . . . . . . . . .	L NEAR 	145A	CODE
SKIPONE. . . . . . . . . . . . .	L NEAR 	110F	CODE
SKIPSTR. . . . . . . . . . . . .	L NEAR 	1119	CODE
SKPCLP . . . . . . . . . . . . .	L NEAR 	088E	CODE
SKPSPC . . . . . . . . . . . . .	L NEAR 	12EB	CODE
SMALLENT . . . . . . . . . . . .	L NEAR 	05DA	CODE
SMALREC. . . . . . . . . . . . .	L NEAR 	07B4	CODE
SMFAT. . . . . . . . . . . . . .	L NEAR 	00D4	DATA
SPCHK. . . . . . . . . . . . . .	L NEAR 	138F	CODE
SPSAVE . . . . . . . . . . . . .	L WORD 	0131	DATA
SRCH . . . . . . . . . . . . . .	L NEAR 	01EB	CODE
SRCHDEV. . . . . . . . . . . . .	L NEAR 	0E93	CODE
SRCHFRST . . . . . . . . . . . .	L NEAR 	0E50	CODE
SRCHNXT. . . . . . . . . . . . .	L NEAR 	0EB3	CODE
SSSAVE . . . . . . . . . . . . .	L WORD 	0133	DATA
STARTPOS . . . . . . . . . . . .	L BYTE 	0029	CONSTANTS
STARTSRCH. . . . . . . . . . . .	L NEAR 	0423	CODE
STATCHK. . . . . . . . . . . . .	L NEAR 	11C4	CODE
STOLET . . . . . . . . . . . . .	L NEAR 	03B4	CODE
STORE. . . . . . . . . . . . . .	L NEAR 	0BA9	CODE
TAB. . . . . . . . . . . . . . .	L NEAR 	1228	CODE
TABBAK . . . . . . . . . . . . .	L NEAR 	10CC	CODE
TABLP. . . . . . . . . . . . . .	L NEAR 	122F	CODE
TEMP . . . . . . . . . . . . . .	L WORD 	0131	DATA
THISDRV. . . . . . . . . . . . .	L BYTE 	013C	DATA
 The Microsoft MACRO Assembler             01-26-83    	PAGE	Symbols-11
MS-DOS version 1.25 by Tim Paterson     March 3, 1982


TOGLINS. . . . . . . . . . . . .	Alias	FALSE	 	
TOGLPRN. . . . . . . . . . . . .	Alias	FALSE	 	
TOTFATSIZ. . . . . . . . . . . .	L NEAR 	010F	DATA
TRANBUF. . . . . . . . . . . . .	L NEAR 	0997	CODE
TRANS. . . . . . . . . . . . . .	L BYTE 	0139	DATA
TRUE . . . . . . . . . . . . . .	Number	FFFF	
TRYIN. . . . . . . . . . . . . .	L NEAR 	0DF7	CODE
TRYOUT . . . . . . . . . . . . .	L NEAR 	0DF2	CODE
TSTALL . . . . . . . . . . . . .	L NEAR 	021E	CODE
TWOESC . . . . . . . . . . . . .	L NEAR 	10E5	CODE
UNPACK . . . . . . . . . . . . .	L NEAR 	0157	CODE
UPDATE . . . . . . . . . . . . .	L NEAR 	0CE3	CODE
USERCODE . . . . . . . . . . . .	L NEAR 	0114	CODE
VALSEC . . . . . . . . . . . . .	L WORD 	014E	DATA
VERFLG . . . . . . . . . . . . .	L BYTE 	002E	CONSTANTS
VERIFY . . . . . . . . . . . . .	L NEAR 	0117	CODE
WEEKDAY. . . . . . . . . . . . .	L BYTE 	0049	CONSTANTS
WILDCRD. . . . . . . . . . . . .	L NEAR 	01FF	CODE
WKDAY. . . . . . . . . . . . . .	L NEAR 	1529	CODE
WRTAUX . . . . . . . . . . . . .	L NEAR 	0B67	CODE
WRTCON . . . . . . . . . . . . .	L NEAR 	0B71	CODE
WRTDEV . . . . . . . . . . . . .	L NEAR 	0B47	CODE
WRTEOF . . . . . . . . . . . . .	L NEAR 	0CC3	CODE
WRTEOFJ. . . . . . . . . . . . .	L NEAR 	0BA6	CODE
WRTERR . . . . . . . . . . . . .	L NEAR 	0B92	CODE
WRTERRJ. . . . . . . . . . . . .	L NEAR 	0CC0	CODE
WRTFAT . . . . . . . . . . . . .	L NEAR 	0F8C	CODE
WRTFATS. . . . . . . . . . . . .	L NEAR 	0F66	CODE
WRTLAST. . . . . . . . . . . . .	L NEAR 	0C79	CODE
WRTLP. . . . . . . . . . . . . .	L NEAR 	0C51	CODE
WRTLST . . . . . . . . . . . . .	L NEAR 	0B5B	CODE
WRTMID . . . . . . . . . . . . .	L NEAR 	0C32	CODE
XXX. . . . . . . . . . . . . . .	F PROC	0023	DATA	Length =0001
YEAR . . . . . . . . . . . . . .	L WORD 	0045	CONSTANTS
YRTAB. . . . . . . . . . . . . .	L BYTE 	1492	CODE
ZEROEXT. . . . . . . . . . . . .	Alias	FALSE	 	
ZERPOS . . . . . . . . . . . . .	L NEAR 	1238	CODE

Warning Severe
Errors	Errors 
0	0
