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