DOS操作系统源码相关资料知识
DOS操作系统源码相关资料知识
你还在为不知道DOS操作系统源码相关资料知识而烦恼么?接下来是小编为大家收集的DOS操作系统源码相关资料知识教程,希望能帮到大家。
DOS操作系统源码相关资料知识
微软DOS早期源码,现已公开;下了一份,看下其大致结构;
包括1.1和2.0版本的源码和编译后的结果;
学习啦在线学习网 贴出其1.1版本 MSDOS.ASM 源码;有空研究;
[plain] view plain copy ; 86-DOS High-performance operating system for the 8086 version 1.25; by Tim Paterson
学习啦在线学习网 ; ****************** Revision History *************************
学习啦在线学习网 ; >> EVERY change must noted below!! <<
;
; 0.34 12/29/80 General release, updating all past customers
学习啦在线学习网 ; 0.42 02/25/81 32-byte directory entries added
学习啦在线学习网 ; 0.56 03/23/81 Variable record and sector sizes
学习啦在线学习网 ; 0.60 03/27/81 Ctrl-C exit changes, including register save on user stack
; 0.74 04/15/81 Recognize I/O devices with file names
学习啦在线学习网 ; 0.75 04/17/81 Improve and correct buffer handling
; 0.76 04/23/81 Correct directory size when not 2^N entries
; 0.80 04/27/81 Add console input without echo, Functions 7 & 8
学习啦在线学习网 ; 1.00 04/28/81 Renumber for general release
; 1.01 05/12/81 Fix bug in `STORE'
; 1.10 07/21/81 Fatal error trapping, NUL device, hidden files, date & time,
; RENAME fix, general cleanup
; 1.11 09/03/81 Don't set CURRENT BLOCK to 0 on open; fix SET FILE SIZE
; 1.12 10/09/81 Zero high half of CURRENT BLOCK after all (CP/M programs don't)
; 1.13 10/29/81 Fix classic "no write-through" error in buffer handling
; 1.20 12/31/81 Add time to FCB; separate FAT from DPT; Kill SMALLDIR;
; Add FLUSH and MAPDEV calls; allow disk mapping in DSKCHG;
学习啦在线学习网 ; Lots of smaller improvements
学习啦在线学习网 ; 1.21 01/06/82 HIGHMEM switch to run DOS in high memory
学习啦在线学习网 ; 1.22 01/12/82 Add VERIFY system call to enable/disable verify after write
学习啦在线学习网 ; 1.23 02/11/82 Add defaulting to parser; use variable escape character
; Don't zero extent field in IBM version (back to 1.01!)
; 1.24 03/01/82 Restore fcn. 27 to 1.0 level; add fcn. 28
学习啦在线学习网 ; 1.25 03/03/82 Put marker (00) at end of directory to speed searches
;
; *************************************************************
; Interrupt Entry Points:
; INTBASE: ABORT
学习啦在线学习网 ; INTBASE+4: COMMAND
学习啦在线学习网 ; INTBASE+8: BASE EXIT ADDRESS
; INTBASE+C: CONTROL-C ABORT
学习啦在线学习网 ; INTBASE+10H: FATAL ERROR ABORT
; INTBASE+14H: BIOS DISK READ
; INTBASE+18H: BIOS DISK WRITE
; INTBASE+40H: Long jump to CALL entry point
IF IBM
ESCCH EQU 0
CANCEL EQU 1BH ;Cancel with ESC
TOGLINS EQU TRUE ;One key toggles insert mode
TOGLPRN EQU TRUE ;One key toggles printer echo
NUMDEV EQU 6 ;Include "COM1" as I/O device name
学习啦在线学习网 ZEROEXT EQU TRUE
ELSE
学习啦在线学习网 ESCCH EQU 1BH
学习啦在线学习网 CANCEL EQU "X"-"@" ;Cancel with Ctrl-X
TOGLINS EQU FALSE ;Separate keys for insert mode on and off
TOGLPRN EQU FALSE ;Separate keys for printer echo on and off
学习啦在线学习网 NUMDEV EQU 5 ;Number of I/O device names
学习啦在线学习网 ZEROEXT EQU FALSE
ENDIF
MAXCALL EQU 36
学习啦在线学习网 MAXCOM EQU 46
学习啦在线学习网 INTBASE EQU 80H
INTTAB EQU 20H
ENTRYPOINTSEG EQU 0CH
ENTRYPOINT EQU INTBASE+40H
CONTC EQU INTTAB+3
学习啦在线学习网 EXIT EQU INTBASE+8
学习啦在线学习网 LONGJUMP EQU 0EAH
LONGCALL EQU 9AH
学习啦在线学习网 MAXDIF EQU 0FFFH
SAVEXIT EQU 10
; Field definition for FCBs
学习啦在线学习网 FCBLOCK STRUC
学习啦在线学习网 DB 12 DUP (?) ;Drive code and name
学习啦在线学习网 EXTENT DW ?
学习啦在线学习网 RECSIZ DW ? ;Size of record (user settable)
FILSIZ DW ? ;Size of file in bytes
学习啦在线学习网 DRVBP DW ? ;BP for SEARCH FIRST and SEARCH NEXT
学习啦在线学习网 FDATE DW ? ;Date of last writing
学习啦在线学习网 FTIME DW ? ;Time of last writing
学习啦在线学习网 DEVID DB ? ;Device ID number, bits 0-5
;bit 7=0 for file, bit 7=1 for I/O device
学习啦在线学习网 ;If file, bit 6=0 if dirty
;If I/O device, bit 6=0 if EOF (input)
FIRCLUS DW ? ;First cluster of file
学习啦在线学习网 LSTCLUS DW ? ;Last cluster accessed
CLUSPOS DW ? ;Position of last cluster accessed
DB ? ;Forces NR to offset 32
NR DB ? ;Next record
RR DB 3 DUP (?) ;Random record
FCBLOCK ENDS
FILDIRENT = FILSIZ ;Used only by SEARCH FIRST and SEARCH NEXT
; Description of 32-byte directory entry (same as returned by SEARCH FIRST
; and SEARCH NEXT, functions 17 and 18).
;
; Location bytes Description
;
; 0 11 File name and extension ( 0E5H if empty)
学习啦在线学习网 ; 11 1 Attributes. Bits 1 or 2 make file hidden
; 12 10 Zero field (for expansion)
学习啦在线学习网 ; 22 2 Time. Bits 0-4=seconds/2, bits 5-10=minute, 11-15=hour
; 24 2 Date. Bits 0-4=day, bits 5-8=month, bits 9-15=year-1980
学习啦在线学习网 ; 26 2 First allocation unit ( < 4080 )
学习啦在线学习网 ; 28 4 File size, in bytes (LSB first, 30 bits max.)
;
学习啦在线学习网 ; The File Allocation Table uses a 12-bit entry for each allocation unit on
; the disk. These entries are packed, two for every three bytes. The contents
; of entry number N is found by 1) multiplying N by 1.5; 2) adding the result
; to the base address of the Allocation Table; 3) fetching the 16-bit word at
; this address; 4) If N was odd (so that N*1.5 was not an integer), shift the
; word right four bits; 5) mask to 12 bits (AND with 0FFF hex). Entry number
; zero is used as an end-of-file trap in the OS and as a flag for directory
; entry size (if SMALLDIR selected). Entry 1 is reserved for future use. The
; first available allocation unit is assigned entry number two, and even
; though it is the first, is called cluster 2. Entries greater than 0FF8H are
; end of file marks; entries of zero are unallocated. Otherwise, the contents
; of a FAT entry is the number of the next cluster in the file.
学习啦在线学习网 ; Field definition for Drive Parameter Block
学习啦在线学习网 DPBLOCK STRUC
DEVNUM DB ? ;I/O driver number
学习啦在线学习网 DRVNUM DB ? ;Physical Unit number
SECSIZ DW ? ;Size of physical sector in bytes
CLUSMSK DB ? ;Sectors/cluster - 1
学习啦在线学习网 CLUSSHFT DB ? ;Log2 of sectors/cluster
学习啦在线学习网 FIRFAT DW ? ;Starting record of FATs
学习啦在线学习网 FATCNT DB ? ;Number of FATs for this drive
学习啦在线学习网 MAXENT DW ? ;Number of directory entries
FIRREC DW ? ;First sector of first cluster
MAXCLUS DW ? ;Number of clusters on drive + 1
学习啦在线学习网 FATSIZ DB ? ;Number of records occupied by FAT
FIRDIR DW ? ;Starting record of directory
FAT DW ? ;Pointer to start of FAT
DPBLOCK ENDS
学习啦在线学习网 DPBSIZ EQU 20 ;Size of the structure in bytes
DIRSEC = FIRREC ;Number of dir. sectors (init temporary)
学习啦在线学习网 DSKSIZ = MAXCLUS ;Size of disk (temp used during init only)
;The following are all of the segments used
;They are declared in the order that they should be placed in the executable
学习啦在线学习网 CODE SEGMENT
CODE ENDS
CONSTANTS SEGMENT BYTE
CONSTANTS ENDS
DATA SEGMENT WORD
学习啦在线学习网 DATA ENDS
学习啦在线学习网 DOSGROUP GROUP CODE,CONSTANTS,DATA
学习啦在线学习网 SEGBIOS SEGMENT
学习啦在线学习网 SEGBIOS ENDS
; BOIS entry point definitions
IF IBM
学习啦在线学习网 BIOSSEG EQU 60H
ENDIF
学习啦在线学习网 IF NOT IBM
BIOSSEG EQU 40H
ENDIF
SEGBIOS SEGMENT AT BIOSSEG
ORG 0
学习啦在线学习网 DB 3 DUP (?) ;Reserve room for jump to init code
BIOSSTAT DB 3 DUP (?) ;Console input status check
BIOSIN DB 3 DUP (?) ;Get console character
BIOSOUT DB 3 DUP (?) ;Output console character
BIOSPRINT DB 3 DUP (?) ;Output to printer
BIOSAUXIN DB 3 DUP (?) ;Get byte from auxilliary
学习啦在线学习网 BIOSAUXOUT DB 3 DUP (?) ;Output byte to auxilliary
BIOSREAD DB 3 DUP (?) ;Disk read
BIOSWRITE DB 3 DUP (?) ;Disk write
BIOSDSKCHG DB 3 DUP (?) ;Dsik-change status
学习啦在线学习网 BIOSSETDATE DB 3 DUP (?) ;Set date
BIOSSETTIME DB 3 DUP (?) ;Set time
BIOSGETTIME DB 3 DUP (?) ;Get time and date
BIOSFLUSH DB 3 DUP (?) ;Clear console input buffer
学习啦在线学习网 BIOSMAPDEV DB 3 DUP (?) ;Dynamic disk table mapper
SEGBIOS ENDS
; Location of user registers relative user stack pointer
STKPTRS STRUC
AXSAVE DW ?
BXSAVE DW ?
CXSAVE DW ?
DXSAVE DW ?
SISAVE DW ?
学习啦在线学习网 DISAVE DW ?
BPSAVE DW ?
DSSAVE DW ?
ESSAVE DW ?
学习啦在线学习网 IPSAVE DW ?
CSSAVE DW ?
FSAVE DW ?
学习啦在线学习网 STKPTRS ENDS
; Start of code
CODE SEGMENT
ASSUME CS:DOSGROUP,DS:DOSGROUP,ES:DOSGROUP,SS:DOSGROUP
ORG 0
学习啦在线学习网 CODSTRT EQU $
JMP DOSINIT
学习啦在线学习网 ESCCHAR DB ESCCH ;Lead-in character for escape sequences
ESCTAB:
学习啦在线学习网 IF NOT IBM
学习啦在线学习网 DB "S" ;Copy one char
学习啦在线学习网 DB "V" ;Skip one char
学习啦在线学习网 DB "T" ;Copy to char
学习啦在线学习网 DB "W" ;Skip to char
DB "U" ;Copy line
学习啦在线学习网 DB "E" ;Kill line (no change in template)
DB "J" ;Reedit line (new template)
DB "D" ;Backspace
学习啦在线学习网 DB "P" ;Enter insert mode
学习啦在线学习网 DB "Q" ;Exit insert mode
DB "R" ;Escape character
学习啦在线学习网 DB "R" ;End of table
ENDIF
IF IBM
学习啦在线学习网 DB 64 ;Crtl-Z - F6
DB 77 ;Copy one char - -->
DB 59 ;Copy one char - F1
DB 83 ;Skip one char - DEL
DB 60 ;Copy to char - F2
DB 62 ;Skip to char - F4
学习啦在线学习网 DB 61 ;Copy line - F3
学习啦在线学习网 DB 61 ;Kill line (no change to template ) - Not used
DB 63 ;Reedit line (new template) - F5
DB 75 ;Backspace - <--
DB 82 ;Enter insert mode - INS (toggle)
学习啦在线学习网 DB 65 ;Escape character - F7
DB 65 ;End of table
ENDIF
ESCTABLEN EQU $-ESCTAB
学习啦在线学习网 IF NOT IBM
HEADER DB 13,10,"MS-DOS version 1.25"
IF HIGHMEM
学习啦在线学习网 DB "H"
ENDIF
IF DSKTEST
DB "D"
ENDIF
DB 13,10
学习啦在线学习网 DB "Copyright 1981,82 Microsoft, Inc.",13,10,"$"
ENDIF
QUIT:
MOV AH,0
JMP SHORT SAVREGS
COMMAND: ;Interrupt call entry point
CMP AH,MAXCOM
学习啦在线学习网 JBE SAVREGS
学习啦在线学习网 BADCALL:
学习啦在线学习网 MOV AL,0
IRET: IRET
学习啦在线学习网 ENTRY: ;System call entry point and dispatcher
POP AX ;IP from the long call at 5
学习啦在线学习网 POP AX ;Segment from the long call at 5
学习啦在线学习网 POP CS:[TEMP] ;IP from the CALL 5
PUSHF ;Start re-ordering the stack
CLI
学习啦在线学习网 PUSH AX ;Save segment
PUSH CS:[TEMP] ;Stack now ordered as if INT had been used
学习啦在线学习网 CMP CL,MAXCALL ;This entry point doesn't get as many calls
学习啦在线学习网 JA BADCALL
MOV AH,CL
SAVREGS:
PUSH ES
PUSH DS
PUSH BP
PUSH DI
PUSH SI
PUSH DX
PUSH CX
PUSH BX
PUSH AX
IF DSKTEST
MOV AX,CS:[SPSAVE]
MOV CS:[NSP],AX
MOV AX,CS:[SSSAVE]
MOV CS:[NSS],AX
POP AX
PUSH AX
ENDIF
学习啦在线学习网 MOV CS:[SPSAVE],SP
学习啦在线学习网 MOV CS:[SSSAVE],SS
MOV SP,CS
学习啦在线学习网 MOV SS,SP
REDISP:
学习啦在线学习网 MOV SP,OFFSET DOSGROUP:IOSTACK
学习啦在线学习网 STI ;Stack OK now
MOV BL,AH
学习啦在线学习网 MOV BH,0
SHL BX,1
CLD
CMP AH,12
JLE SAMSTK
MOV SP,OFFSET DOSGROUP:DSKSTACK
SAMSTK:
CALL CS:[BX+DISPATCH]
LEAVE:
CLI
MOV SP,CS:[SPSAVE]
MOV SS,CS:[SSSAVE]
MOV BP,SP
学习啦在线学习网 MOV BYTE PTR [BP.AXSAVE],AL
学习啦在线学习网 IF DSKTEST
学习啦在线学习网 MOV AX,CS:[NSP]
学习啦在线学习网 MOV CS:[SPSAVE],AX
MOV AX,CS:[NSS]
学习啦在线学习网 MOV CS:[SSSAVE],AX
ENDIF
POP AX
POP BX
POP CX
POP DX
POP SI
POP DI
POP BP
POP DS
POP ES
IRET
; Standard Functions
DISPATCH DW ABORT ;0
DW CONIN
DW CONOUT
学习啦在线学习网 DW READER
学习啦在线学习网 DW PUNCH
DW LIST ;5
DW RAWIO
学习啦在线学习网 DW RAWINP
DW IN
DW PRTBUF
DW BUFIN ;10
DW CONSTAT
学习啦在线学习网 DW FLUSHKB
DW DSKRESET
学习啦在线学习网 DW SELDSK
DW OPEN ;15
DW CLOSE
DW SRCHFRST
DW SRCHNXT
DW DELETE
学习啦在线学习网 DW SEQRD ;20
DW SEQWRT
DW CREATE
学习啦在线学习网 DW RENAME
DW INUSE
学习啦在线学习网 DW GETDRV ;25
DW SETDMA
DW GETFATPT
学习啦在线学习网 DW GETFATPTDL
DW GETRDONLY
学习啦在线学习网 DW SETATTRIB ;30
DW GETDSKPT
DW USERCODE
学习啦在线学习网 DW RNDRD
DW RNDWRT
DW FILESIZE ;35
DW SETRNDREC
学习啦在线学习网 ; Extended Functions
DW SETVECT
DW NEWBASE
DW BLKRD
DW BLKWRT ;40
DW MAKEFCB
学习啦在线学习网 DW GETDATE
DW SETDATE
DW GETTIME
DW SETTIME ;45
DW VERIFY
INUSE:
GETIO:
SETIO:
学习啦在线学习网 GETRDONLY:
SETATTRIB:
学习啦在线学习网 USERCODE:
MOV AL,0
RET
VERIFY:
学习啦在线学习网 AND AL,1
学习啦在线学习网 MOV CS:VERFLG,AL
RET
FLUSHKB:
PUSH AX
CALL FAR PTR BIOSFLUSH
POP AX
MOV AH,AL
学习啦在线学习网 CMP AL,1
学习啦在线学习网 JZ REDISPJ
CMP AL,6
JZ REDISPJ
学习啦在线学习网 CMP AL,7
JZ REDISPJ
CMP AL,8
学习啦在线学习网 JZ REDISPJ
CMP AL,10
学习啦在线学习网 JZ REDISPJ
学习啦在线学习网 MOV AL,0
RET
学习啦在线学习网 REDISPJ:JMP REDISP
READER:
AUXIN:
CALL STATCHK
学习啦在线学习网 CALL FAR PTR BIOSAUXIN
RET
PUNCH:
MOV AL,DL
AUXOUT:
PUSH AX
CALL STATCHK
POP AX
CALL FAR PTR BIOSAUXOUT
RET
UNPACK:
; Inputs:
学习啦在线学习网 ; DS = CS
; BX = Cluster number
; BP = Base of drive parameters
学习啦在线学习网 ; SI = Pointer to drive FAT
; Outputs:
学习啦在线学习网 ; DI = Contents of FAT for given cluster
学习啦在线学习网 ; Zero set means DI=0 (free cluster)
; No other registers affected. Fatal error if cluster too big.
CMP BX,[BP.MAXCLUS]
JA HURTFAT
LEA DI,[SI+BX]
SHR BX,1
MOV DI,[DI+BX]
JNC HAVCLUS
SHR DI,1
SHR DI,1
学习啦在线学习网 SHR DI,1
学习啦在线学习网 SHR DI,1
STC
学习啦在线学习网 HAVCLUS:
学习啦在线学习网 RCL BX,1
学习啦在线学习网 AND DI,0FFFH
RET
HURTFAT:
PUSH AX
MOV AH,80H ;Signal Bad FAT to INT 24H handler
学习啦在线学习网 MOV DI,0FFFH ;In case INT 24H returns (it shouldn't)
CALL FATAL
POP AX ;Try to ignore bad FAT
RET
PACK:
; Inputs:
; DS = CS
学习啦在线学习网 ; BX = Cluster number
; DX = Data
; SI = Pointer to drive FAT
学习啦在线学习网 ; Outputs:
; The data is stored in the FAT at the given cluster.
; BX,DX,DI all destroyed
学习啦在线学习网 ; No other registers affected
MOV DI,BX
SHR BX,1
ADD BX,SI
ADD BX,DI
学习啦在线学习网 SHR DI,1
学习啦在线学习网 MOV DI,[BX]
JNC ALIGNED
SHL DX,1
学习啦在线学习网 SHL DX,1
学习啦在线学习网 SHL DX,1
SHL DX,1
AND DI,0FH
JMP SHORT PACKIN
ALIGNED:
AND DI,0F000H
PACKIN:
OR DI,DX
MOV [BX],DI
RET
DEVNAME:
MOV SI,OFFSET DOSGROUP:IONAME ;List of I/O devices with file names
学习啦在线学习网 MOV BH,NUMDEV ;BH = number of device names
LOOKIO:
学习啦在线学习网 MOV DI,OFFSET DOSGROUP:NAME1
MOV CX,4 ;All devices are 4 letters
REPE CMPSB ;Check for name in list
JZ IOCHK ;If first 3 letters OK, check for the rest
学习啦在线学习网 ADD SI,CX ;Point to next device name
DEC BH
学习啦在线学习网 JNZ LOOKIO
CRET:
STC ;Not found
RET
IOCHK:
IF IBM
CMP BH,NUMDEV ;Is it the first device?
JNZ NOTCOM1
MOV BH,2 ;Make it the same as AUX
学习啦在线学习网 NOTCOM1:
ENDIF
NEG BH
MOV CX,2 ;Check rest of name but not extension
MOV AX,2020H
REPE SCASW ;Make sure rest of name is blanks
JNZ CRET
RET1: RET ;Zero set so CREATE works
学习啦在线学习网 GETFILE:
; Same as GETNAME except ES:DI points to FCB on successful return
CALL MOVNAME
JC RET1
PUSH DX
PUSH DS
CALL FINDNAME
POP ES
POP DI
学习啦在线学习网 RET2: RET
GETNAME:
; Inputs:
学习啦在线学习网 ; DS,DX point to FCB
学习啦在线学习网 ; Function:
; Find file name in disk directory. First byte is
学习啦在线学习网 ; drive number (0=current disk). "?" matches any
; character.
; Outputs:
学习啦在线学习网 ; Carry set if file not found
; ELSE
; Zero set if attributes match (always except when creating)
; BP = Base of drive parameters
; DS = CS
; ES = CS
; BX = Pointer into directory buffer
学习啦在线学习网 ; SI = Pointer to First Cluster field in directory entry
; [DIRBUF] has directory record with match
; [NAME1] has file name
; All other registers destroyed.
学习啦在线学习网 CALL MOVNAME
JC RET2 ;Bad file name?
FINDNAME:
MOV AX,CS
MOV DS,AX
CALL DEVNAME
JNC RET2
学习啦在线学习网 CALL STARTSRCH
CONTSRCH:
CALL GETENTRY
JC RET2
SRCH:
MOV AH,BYTE PTR [BX]
学习啦在线学习网 OR AH,AH ;End of directory?
JZ FREE
学习啦在线学习网 CMP AH,[DELALL] ;Free entry?
JZ FREE
学习啦在线学习网 MOV SI,BX
学习啦在线学习网 MOV DI,OFFSET DOSGROUP:NAME1
MOV CX,11
WILDCRD:
REPE CMPSB
JZ FOUND
学习啦在线学习网 CMP BYTE PTR [DI-1],"?"
学习啦在线学习网 JZ WILDCRD
NEXTENT:
CALL NEXTENTRY
学习啦在线学习网 JNC SRCH
学习啦在线学习网 RET3: RET
FREE:
学习啦在线学习网 CMP [ENTFREE],-1 ;Found a free entry before?
学习啦在线学习网 JNZ TSTALL ;If so, ignore this one
MOV CX,[LASTENT]
学习啦在线学习网 MOV [ENTFREE],CX
TSTALL:
CMP AH,[DELALL] ;At end of directory?
学习啦在线学习网 JZ NEXTENT ;No - continue search
STC ;Report not found
RET
FOUND:
;Check if attributes allow finding it
MOV AH,[ATTRIB] ;Attributes of search
NOT AH
学习啦在线学习网 AND AH,[SI] ;Compare with attributes of file
ADD SI,15
学习啦在线学习网 AND AH,6 ;Only look at bits 1 and 2
JZ RET3
学习啦在线学习网 TEST BYTE PTR [CREATING],-1 ;Pass back mismatch if creating
JZ NEXTENT ;Otherwise continue searching
RET
学习啦在线学习网 GETENTRY:
学习啦在线学习网 ; Inputs:
学习啦在线学习网 ; [LASTENT] has previously searched directory entry
; Function:
; Locates next sequential directory entry in preparation for search
学习啦在线学习网 ; Outputs:
学习啦在线学习网 ; Carry set if none
; ELSE
; AL = Current directory block
; BX = Pointer to next directory entry in [DIRBUF]
; DX = Pointer to first byte after end of DIRBUF
学习啦在线学习网 ; [LASTENT] = New directory entry number
学习啦在线学习网 MOV AX,[LASTENT]
学习啦在线学习网 INC AX ;Start with next entry
CMP AX,[BP.MAXENT]
学习啦在线学习网 JAE NONE
GETENT:
学习啦在线学习网 MOV [LASTENT],AX
MOV CL,4
SHL AX,CL
学习啦在线学习网 XOR DX,DX
SHL AX,1
学习啦在线学习网 RCL DX,1 ;Account for overflow in last shift
MOV BX,[BP.SECSIZ]
AND BL,255-31 ;Must be multiple of 32
DIV BX
MOV BX,DX ;Position within sector
学习啦在线学习网 MOV AH,[BP.DEVNUM] ;AL=Directory sector no.
CMP AX,[DIRBUFID]
JZ HAVDIRBUF
PUSH BX
学习啦在线学习网 CALL DIRREAD
POP BX
HAVDIRBUF:
MOV DX,OFFSET DOSGROUP:DIRBUF
ADD BX,DX
ADD DX,[BP.SECSIZ]
RET
NEXTENTRY:
学习啦在线学习网 ; Inputs:
学习啦在线学习网 ; Same as outputs of GETENTRY, above
学习啦在线学习网 ; Function:
; Update AL, BX, and [LASTENT] for next directory entry.
; Carry set if no more.
MOV DI,[LASTENT]
INC DI
学习啦在线学习网 CMP DI,[BP.MAXENT]
JAE NONE
学习啦在线学习网 MOV [LASTENT],DI
ADD BX,32
CMP BX,DX
学习啦在线学习网 JB HAVIT
学习啦在线学习网 INC AL ;Next directory sector
PUSH DX ;Save limit
CALL DIRREAD
POP DX
学习啦在线学习网 MOV BX,OFFSET DOSGROUP:DIRBUF
HAVIT:
CLC
RET
NONE:
学习啦在线学习网 CALL CHKDIRWRITE
STC
RET4: RET
DELETE: ; System call 19
学习啦在线学习网 CALL MOVNAME
MOV AL,-1
JC RET4
MOV AL,CS:[ATTRIB]
AND AL,6 ;Look only at hidden bits
CMP AL,6 ;Both must be set
JNZ NOTALL
学习啦在线学习网 MOV CX,11
学习啦在线学习网 MOV AL,"?"
学习啦在线学习网 MOV DI,OFFSET DOSGROUP:NAME1
REPE SCASB ;See if name is *.*
学习啦在线学习网 JNZ NOTALL
学习啦在线学习网 MOV BYTE PTR CS:[DELALL],0 ;DEL *.* - flag deleting all
NOTALL:
学习啦在线学习网 CALL FINDNAME
MOV AL,-1
JC RET4
学习啦在线学习网 OR BH,BH ;Check if device name
JS RET4 ;Can't delete I/O devices
学习啦在线学习网 DELFILE:
MOV BYTE PTR [DIRTYDIR],-1
MOV AH,[DELALL]
学习啦在线学习网 MOV BYTE PTR [BX],AH
学习啦在线学习网 MOV BX,[SI]
MOV SI,[BP.FAT]
学习啦在线学习网 OR BX,BX
JZ DELNXT
学习啦在线学习网 CMP BX,[BP.MAXCLUS]
JA DELNXT
CALL RELEASE
DELNXT:
CALL CONTSRCH
JNC DELFILE
CALL FATWRT
学习啦在线学习网 CALL CHKDIRWRITE
学习啦在线学习网 XOR AL,AL
RET
学习啦在线学习网 RENAME: ;System call 23
CALL MOVNAME
JC ERRET
学习啦在线学习网 ADD SI,5
学习啦在线学习网 MOV DI,OFFSET DOSGROUP:NAME2
学习啦在线学习网 CALL LODNAME
JC ERRET ;Report error if second name invalid
CALL FINDNAME
学习啦在线学习网 JC ERRET
OR BH,BH ;Check if I/O device name
JS ERRET ;If so, can't rename it
学习啦在线学习网 MOV SI,OFFSET DOSGROUP:NAME1
学习啦在线学习网 MOV DI,OFFSET DOSGROUP:NAME3
MOV CX,6 ;6 words (12 bytes)--include attribute byte
学习啦在线学习网 REP MOVSW ;Copy name to search for
RENFIL:
学习啦在线学习网 MOV DI,OFFSET DOSGROUP:NAME1
MOV SI,OFFSET DOSGROUP:NAME2
学习啦在线学习网 MOV CX,11
NEWNAM:
LODSB
学习啦在线学习网 CMP AL,"?"
JNZ NOCHG
MOV AL,[BX]
NOCHG:
STOSB
INC BX
LOOP NEWNAM
MOV BYTE PTR [DI],6 ;Stop duplicates with any attributes
学习啦在线学习网 CALL DEVNAME ;Check if giving it a device name
学习啦在线学习网 JNC RENERR
学习啦在线学习网 PUSH [LASTENT] ;Save position of match
MOV [LASTENT],-1 ;Search entire directory for duplicate
学习啦在线学习网 CALL CONTSRCH ;See if new name already exists
POP AX
学习啦在线学习网 JNC RENERR ;Error if found
CALL GETENT ;Re-read matching entry
学习啦在线学习网 MOV DI,BX
学习啦在线学习网 MOV SI,OFFSET DOSGROUP:NAME1
学习啦在线学习网 MOV CX,5
MOVSB
学习啦在线学习网 REP MOVSW ;Replace old name with new one
MOV BYTE PTR [DIRTYDIR],-1 ;Flag change in directory
学习啦在线学习网 MOV SI,OFFSET DOSGROUP:NAME3
MOV DI,OFFSET DOSGROUP:NAME1
学习啦在线学习网 MOV CX,6 ;Include attribute byte
REP MOVSW ;Copy name back into search buffer
CALL CONTSRCH
JNC RENFIL
CALL CHKDIRWRITE
XOR AL,AL
RET
RENERR:
CALL CHKDIRWRITE
ERRET:
MOV AL,-1
学习啦在线学习网 RET5: RET
MOVNAME:
学习啦在线学习网 ; Inputs:
; DS, DX point to FCB or extended FCB
学习啦在线学习网 ; Outputs:
学习啦在线学习网 ; DS:DX point to normal FCB
; ES = CS
; If file name OK:
; BP has base of driver parameters
学习啦在线学习网 ; [NAME1] has name in upper case
学习啦在线学习网 ; All registers except DX destroyed
; Carry set if bad file name or drive
MOV CS:WORD PTR [CREATING],0E500H ;Not creating, not DEL *.*
学习啦在线学习网 MOV AX,CS
学习啦在线学习网 MOV ES,AX
MOV DI,OFFSET DOSGROUP:NAME1
学习啦在线学习网 MOV SI,DX
LODSB
MOV CS:[EXTFCB],AL ;Set flag if extended FCB in use
MOV AH,0 ;Set default attributes
CMP AL,-1 ;Is it an extended FCB?
JNZ HAVATTRB
ADD DX,7 ;Adjust to point to normal FCB
ADD SI,6 ;Point to drive select byte
MOV AH,[SI-1] ;Get attribute byte
学习啦在线学习网 LODSB ;Get drive select byte
学习啦在线学习网 HAVATTRB:
学习啦在线学习网 MOV CS:[ATTRIB],AH ;Save attributes
CALL GETTHISDRV
LODNAME:
学习啦在线学习网 ; This entry point copies a file name from DS,SI
学习啦在线学习网 ; to ES,DI converting to upper case.
CMP BYTE PTR [SI]," " ;Don't allow blank as first letter
STC ;In case of error
JZ RET5
MOV CX,11
MOVCHK:
学习啦在线学习网 CALL GETLET
JB RET5
JNZ STOLET ;Is it a delimiter?
CMP AL," " ;This is the only delimiter allowed
STC ;In case of error
JNZ RET5
STOLET:
STOSB
LOOP MOVCHK
CLC ;Got through whole name - no error
RET6: RET
学习啦在线学习网 GETTHISDRV:
CMP CS:[NUMDRV],AL
JC RET6
DEC AL
JNS PHYDRV
学习啦在线学习网 MOV AL,CS:[CURDRV]
PHYDRV:
MOV CS:[THISDRV],AL
RET
学习啦在线学习网 OPEN: ;System call 15
CALL GETFILE
DOOPEN:
学习啦在线学习网 ; Enter here to perform OPEN on file already found
; in directory. DS=CS, BX points to directory
学习啦在线学习网 ; entry in DIRBUF, SI points to First Cluster field, and
; ES:DI point to the FCB to be opened. This entry point
; is used by CREATE.
学习啦在线学习网 JC ERRET
OR BH,BH ;Check if file is I/O device
JS OPENDEV ;Special handler if so
MOV AL,[THISDRV]
INC AX
STOSB
XOR AX,AX
学习啦在线学习网 IF ZEROEXT
ADD DI,11
STOSW ;Zero low byte of extent field if IBM only
ENDIF
IF NOT ZEROEXT
ADD DI,12 ;Point to high half of CURRENT BLOCK field
STOSB ;Set it to zero (CP/M programs set low byte)
ENDIF
学习啦在线学习网 MOV AL,128 ;Default record size
STOSW ;Set record size
学习啦在线学习网 LODSW ;Get starting cluster
MOV DX,AX ;Save it for the moment
学习啦在线学习网 MOVSW ;Transfer size to FCB
MOVSW
MOV AX,[SI-8] ;Get date
STOSW ;Save date in FCB
学习啦在线学习网 MOV AX,[SI-10] ;Get time
STOSW ;Save it in FCB
学习啦在线学习网 MOV AL,[BP.DEVNUM]
OR AL,40H
STOSB
MOV AX,DX ;Restore starting cluster
STOSW ; first cluster
STOSW ; last cluster accessed
XOR AX,AX
STOSW ; position of last cluster
RET
OPENDEV:
ADD DI,13 ;point to 2nd half of extent field
XOR AX,AX
学习啦在线学习网 STOSB ;Set it to zero
学习啦在线学习网 MOV AL,128
STOSW ;Set record size to 128
XOR AX,AX
STOSW
学习啦在线学习网 STOSW ;Set current size to zero
学习啦在线学习网 CALL DATE16
STOSW ;Date is todays
学习啦在线学习网 XCHG AX,DX
学习啦在线学习网 STOSW ;Use current time
MOV AL,BH ;Get device number
STOSB
学习啦在线学习网 XOR AL,AL ;No error
RET
FATERR:
XCHG AX,DI ;Put error code in DI
学习啦在线学习网 MOV AH,2 ;While trying to read FAT
学习啦在线学习网 MOV AL,[THISDRV] ;Tell which drive
学习啦在线学习网 CALL FATAL1
JMP SHORT FATREAD
STARTSRCH:
MOV AX,-1
MOV [LASTENT],AX
学习啦在线学习网 MOV [ENTFREE],AX
学习啦在线学习网 FATREAD:
; Inputs:
学习啦在线学习网 ; DS = CS
学习啦在线学习网 ; Function:
学习啦在线学习网 ; If disk may have been changed, FAT is read in and buffers are
学习啦在线学习网 ; flagged invalid. If not, no action is taken.
; Outputs:
; BP = Base of drive parameters
学习啦在线学习网 ; Carry set if invalid drive returned by MAPDEV
; All other registers destroyed
MOV AL,[THISDRV]
学习啦在线学习网 XOR AH,AH ;Set default response to zero & clear carry
学习啦在线学习网 CALL FAR PTR BIOSDSKCHG ;See what BIOS has to say
JC FATERR
CALL GETBP
学习啦在线学习网 MOV AL,[THISDRV] ;Use physical unit number
学习啦在线学习网 MOV SI,[BP.FAT]
学习啦在线学习网 OR AH,[SI-1] ;Dirty byte for FAT
学习啦在线学习网 JS NEWDSK ;If either say new disk, then it's so
学习啦在线学习网 JNZ MAPDRV
MOV AH,1
CMP AX,WORD PTR [BUFDRVNO] ;Does buffer have dirty sector of this drive?
学习啦在线学习网 JZ MAPDRV
NEWDSK:
学习啦在线学习网 CMP AL,[BUFDRVNO] ;See if buffer is for this drive
JNZ BUFOK ;If not, don't touch it
学习啦在线学习网 MOV [BUFSECNO],0 ;Flag buffers invalid
MOV WORD PTR [BUFDRVNO],00FFH
BUFOK:
MOV [DIRBUFID],-1
学习啦在线学习网 CALL FIGFAT
学习啦在线学习网 NEXTFAT:
PUSH AX
学习啦在线学习网 CALL DSKREAD
POP AX
JC BADFAT
SUB AL,[BP.FATCNT]
JZ NEWFAT
CALL FATWRT
NEWFAT:
学习啦在线学习网 MOV SI,[BP.FAT]
MOV AL,[BP.DEVNUM]
MOV AH,[SI] ;Get first byte of FAT
学习啦在线学习网 OR AH,0F8H ;Put in range
CALL FAR PTR BIOSMAPDEV
学习啦在线学习网 MOV AH,0
学习啦在线学习网 MOV [SI-2],AX ;Set device no. and reset dirty bit
MAPDRV:
学习啦在线学习网 MOV AL,[SI-2] ;Get device number
GETBP:
学习啦在线学习网 MOV BP,[DRVTAB] ;Just in case drive isn't valid
AND AL,3FH ;Mask out dirty bit
CMP AL,[NUMIO]
CMC
JC RET7
PUSH AX
MOV AH,DPBSIZ
MUL AH
学习啦在线学习网 ADD BP,AX
POP AX
RET7: RET
BADFAT:
学习啦在线学习网 MOV CX,DI
ADD DX,CX
DEC AL
学习啦在线学习网 JNZ NEXTFAT
CALL FIGFAT ;Reset registers
CALL DREAD ;Try first FAT once more
JMP SHORT NEWFAT
OKRET1:
MOV AL,0
RET
CLOSE: ;System call 16
学习啦在线学习网 MOV DI,DX
CMP BYTE PTR [DI],-1 ;Check for extended FCB
学习啦在线学习网 JNZ NORMFCB3
ADD DI,7
NORMFCB3:
TEST BYTE PTR [DI.DEVID],0C0H ;Allow only dirty files
JNZ OKRET1 ;can't close if I/O device, or not writen
学习啦在线学习网 MOV AL,[DI] ;Get physical unit number
学习啦在线学习网 DEC AL ;Make zero = drive A
MOV AH,1 ;Look for dirty buffer
学习啦在线学习网 CMP AX,CS:WORD PTR [BUFDRVNO]
JNZ FNDDIR
学习啦在线学习网 ;Write back dirty buffer if on same drive
PUSH DX
PUSH DS
PUSH CS
POP DS
学习啦在线学习网 MOV BYTE PTR [DIRTYBUF],0
MOV BX,[BUFFER]
MOV CX,1
MOV DX,[BUFSECNO]
学习啦在线学习网 MOV BP,[BUFDRVBP]
CALL DWRITE
POP DS
POP DX
FNDDIR:
学习啦在线学习网 CALL GETFILE
BADCLOSEJ:
JC BADCLOSE
MOV CX,ES:[DI.FIRCLUS]
学习啦在线学习网 MOV [SI],CX
MOV DX,ES:WORD PTR [DI.FILSIZ]
学习啦在线学习网 MOV [SI+2],DX
MOV DX,ES:WORD PTR [DI.FILSIZ+2]
MOV [SI+4],DX
学习啦在线学习网 MOV DX,ES:[DI.FDATE]
MOV [SI-2],DX
MOV DX,ES:[DI.FTIME]
学习啦在线学习网 MOV [SI-4],DX
学习啦在线学习网 CALL DIRWRITE
CHKFATWRT:
; Do FATWRT only if FAT is dirty and uses same I/O driver
MOV SI,[BP.FAT]
MOV AL,[BP.DEVNUM]
学习啦在线学习网 MOV AH,1
CMP [SI-2],AX ;See if FAT dirty and uses same driver
学习啦在线学习网 JNZ OKRET
FATWRT:
学习啦在线学习网 ; Inputs:
学习啦在线学习网 ; DS = CS
学习啦在线学习网 ; BP = Base of drive parameter table
; Function:
; Write the FAT back to disk and reset FAT
学习啦在线学习网 ; dirty bit.
学习啦在线学习网 ; Outputs:
学习啦在线学习网 ; AL = 0
学习啦在线学习网 ; BP unchanged
学习啦在线学习网 ; All other registers destroyed
学习啦在线学习网 CALL FIGFAT
MOV BYTE PTR [BX-1],0
EACHFAT:
PUSH DX
PUSH CX
PUSH BX
PUSH AX
CALL DWRITE
POP AX
POP BX
POP CX
POP DX
ADD DX,CX
DEC AL
学习啦在线学习网 JNZ EACHFAT
OKRET:
MOV AL,0
RET
学习啦在线学习网 BADCLOSE:
学习啦在线学习网 MOV SI,[BP.FAT]
MOV BYTE PTR [SI-1],0
学习啦在线学习网 MOV AL,-1
RET
FIGFAT:
; Loads registers with values needed to read or
学习啦在线学习网 ; write a FAT.
MOV AL,[BP.FATCNT]
MOV BX,[BP.FAT]
MOV CL,[BP.FATSIZ] ;No. of records occupied by FAT
学习啦在线学习网 MOV CH,0
MOV DX,[BP.FIRFAT] ;Record number of start of FATs
RET
DIRCOMP:
; Prepare registers for directory read or write
CBW
学习啦在线学习网 ADD AX,[BP.FIRDIR]
MOV DX,AX
MOV BX,OFFSET DOSGROUP:DIRBUF
MOV CX,1
RET
学习啦在线学习网 CREATE: ;System call 22
学习啦在线学习网 CALL MOVNAME
JC ERRET3
MOV DI,OFFSET DOSGROUP:NAME1
MOV CX,11
学习啦在线学习网 MOV AL,"?"
REPNE SCASB
JZ ERRET3
MOV CS:BYTE PTR [CREATING],-1
PUSH DX
PUSH DS
CALL FINDNAME
JNC EXISTENT
学习啦在线学习网 MOV AX,[ENTFREE] ;First free entry found in FINDNAME
学习啦在线学习网 CMP AX,-1
学习啦在线学习网 JZ ERRPOP
CALL GETENT ;Point at that free entry
JMP SHORT FREESPOT
ERRPOP:
POP DS
POP DX
ERRET3:
MOV AL,-1
RET
EXISTENT:
学习啦在线学习网 JNZ ERRPOP ;Error if attributes don't match
学习啦在线学习网 OR BH,BH ;Check if file is I/O device
JS OPENJMP ;If so, no action
学习啦在线学习网 MOV CX,[SI] ;Get pointer to clusters
JCXZ FREESPOT
CMP CX,[BP.MAXCLUS]
JA FREESPOT
PUSH BX
学习啦在线学习网 MOV BX,CX
MOV SI,[BP.FAT]
CALL RELEASE ;Free any data already allocated
学习啦在线学习网 CALL FATWRT
POP BX
FREESPOT:
学习啦在线学习网 MOV DI,BX
MOV SI,OFFSET DOSGROUP:NAME1
MOV CX,5
MOVSB
REP MOVSW
MOV AL,[ATTRIB]
STOSB
XOR AX,AX
学习啦在线学习网 MOV CL,5
REP STOSW
学习啦在线学习网 CALL DATE16
学习啦在线学习网 XCHG AX,DX
STOSW
XCHG AX,DX
STOSW
学习啦在线学习网 XOR AX,AX
PUSH DI
MOV CL,6
学习啦在线学习网 SMALLENT:
REP STOSB
PUSH BX
学习啦在线学习网 CALL DIRWRITE
POP BX
POP SI
OPENJMP:
学习啦在线学习网 CLC ;Clear carry so OPEN won't fail
POP ES
POP DI
JMP DOOPEN
DIRREAD:
; Inputs:
; DS = CS
; AL = Directory block number
; BP = Base of drive parameters
; Function:
学习啦在线学习网 ; Read the directory block into DIRBUF.
; Outputs:
; AX,BP unchanged
学习啦在线学习网 ; All other registers destroyed.
PUSH AX
学习啦在线学习网 CALL CHKDIRWRITE
POP AX
PUSH AX
学习啦在线学习网 MOV AH,[BP.DEVNUM]
MOV [DIRBUFID],AX
学习啦在线学习网 CALL DIRCOMP
CALL DREAD
POP AX
学习啦在线学习网 RET8: RET
DREAD:
学习啦在线学习网 ; Inputs:
; BX,DS = Transfer address
; CX = Number of sectors
学习啦在线学习网 ; DX = Absolute record number
学习啦在线学习网 ; BP = Base of drive parameters
; Function:
学习啦在线学习网 ; Calls BIOS to perform disk read. If BIOS reports
学习啦在线学习网 ; errors, will call HARDERR for further action.
; BP preserved. All other registers destroyed.
学习啦在线学习网 CALL DSKREAD
JNC RET8
MOV CS:BYTE PTR [READOP],0
CALL HARDERR
CMP AL,1 ;Check for retry
学习啦在线学习网 JZ DREAD
学习啦在线学习网 RET ;Ignore otherwise
HARDERR:
学习啦在线学习网 ;Hard disk error handler. Entry conditions:
学习啦在线学习网 ; DS:BX = Original disk transfer address
; DX = Original logical sector number
; CX = Number of sectors to go (first one gave the error)
; AX = Hardware error code
学习啦在线学习网 ; DI = Original sector transfer count
; BP = Base of drive parameters
; [READOP] = 0 for read, 1 for write
XCHG AX,DI ;Error code in DI, count in AX
学习啦在线学习网 SUB AX,CX ;Number of sectors successfully transferred
ADD DX,AX ;First sector number to retry
PUSH DX
MUL [BP.SECSIZ] ;Number of bytes transferred
POP DX
学习啦在线学习网 ADD BX,AX ;First address for retry
MOV AH,0 ;Flag disk section in error
学习啦在线学习网 CMP DX,[BP.FIRFAT] ;In reserved area?
JB ERRINT
INC AH ;Flag for FAT
学习啦在线学习网 CMP DX,[BP.FIRDIR] ;In FAT?
学习啦在线学习网 JB ERRINT
INC AH
CMP DX,[BP.FIRREC] ;In directory?
JB ERRINT
INC AH ;Must be in data area
ERRINT:
SHL AH,1 ;Make room for read/write bit
OR AH,CS:[READOP]
FATAL:
MOV AL,[BP.DRVNUM] ;Get drive number
FATAL1:
PUSH BP ;The only thing we preserve
MOV CS:[CONTSTK],SP
学习啦在线学习网 CLI ;Prepare to play with stack
MOV SS,CS:[SSSAVE]
MOV SP,CS:[SPSAVE] ;User stack pointer restored
INT 24H ;Fatal error interrupt vector
MOV CS:[SPSAVE],SP
学习啦在线学习网 MOV CS:[SSSAVE],SS
MOV SP,CS
MOV SS,SP
MOV SP,CS:[CONTSTK]
STI
POP BP
CMP AL,2
JZ ERROR
RET
学习啦在线学习网 DSKREAD:
MOV AL,[BP.DEVNUM]
PUSH BP
PUSH BX
PUSH CX
PUSH DX
CALL FAR PTR BIOSREAD
POP DX
POP DI
POP BX
POP BP
学习啦在线学习网 RET9: RET
CHKDIRWRITE:
TEST BYTE PTR [DIRTYDIR],-1
JZ RET9
学习啦在线学习网 DIRWRITE:
; Inputs:
; DS = CS
; AL = Directory block number
; BP = Base of drive parameters
; Function:
; Write the directory block into DIRBUF.
学习啦在线学习网 ; Outputs:
学习啦在线学习网 ; BP unchanged
; All other registers destroyed.
学习啦在线学习网 MOV BYTE PTR [DIRTYDIR],0
学习啦在线学习网 MOV AL,BYTE PTR [DIRBUFID]
CALL DIRCOMP
DWRITE:
; Inputs:
学习啦在线学习网 ; BX,DS = Transfer address
; CX = Number of sectors
; DX = Absolute record number
; BP = Base of drive parameters
学习啦在线学习网 ; Function:
; Calls BIOS to perform disk write. If BIOS reports
; errors, will call HARDERR for further action.
; BP preserved. All other registers destroyed.
MOV AL,[BP.DEVNUM]
MOV AH,CS:VERFLG
PUSH BP
PUSH BX
PUSH CX
PUSH DX
CALL FAR PTR BIOSWRITE
POP DX
POP DI
POP BX
POP BP
JNC RET9
学习啦在线学习网 MOV CS:BYTE PTR [READOP],1
CALL HARDERR
学习啦在线学习网 CMP AL,1 ;Check for retry
JZ DWRITE
RET
ABORT:
学习啦在线学习网 LDS SI,CS:DWORD PTR [SPSAVE]
学习啦在线学习网 MOV DS,[SI.CSSAVE]
XOR AX,AX
学习啦在线学习网 MOV ES,AX
MOV SI,SAVEXIT
MOV DI,EXIT
MOVSW
MOVSW
MOVSW
MOVSW
MOVSW
MOVSW
ERROR:
学习啦在线学习网 MOV AX,CS
MOV DS,AX
MOV ES,AX
CALL WRTFATS
学习啦在线学习网 XOR AX,AX
CLI
学习啦在线学习网 MOV SS,[SSSAVE]
MOV SP,[SPSAVE]
学习啦在线学习网 MOV DS,AX
学习啦在线学习网 MOV SI,EXIT
MOV DI,OFFSET DOSGROUP:EXITHOLD
MOVSW
MOVSW
POP AX
POP BX
POP CX
POP DX
POP SI
POP DI
POP BP
POP DS
POP ES
STI ;Stack OK now
学习啦在线学习网 JMP CS:DWORD PTR [EXITHOLD]
学习啦在线学习网 SEQRD: ;System call 20
CALL GETREC
CALL LOAD
学习啦在线学习网 JMP SHORT FINSEQ
学习啦在线学习网 SEQWRT: ;System call 21
学习啦在线学习网 CALL GETREC
学习啦在线学习网 CALL STORE
FINSEQ:
JCXZ SETNREX
ADD AX,1
学习啦在线学习网 ADC DX,0
JMP SHORT SETNREX
RNDRD: ;System call 33
CALL GETRRPOS1
CALL LOAD
学习啦在线学习网 JMP SHORT FINRND
学习啦在线学习网 RNDWRT: ;System call 34
CALL GETRRPOS1
CALL STORE
JMP SHORT FINRND
BLKRD: ;System call 39
CALL GETRRPOS
学习啦在线学习网 CALL LOAD
学习啦在线学习网 JMP SHORT FINBLK
学习啦在线学习网 BLKWRT: ;System call 40
CALL GETRRPOS
学习啦在线学习网 CALL STORE
FINBLK:
学习啦在线学习网 LDS SI,DWORD PTR [SPSAVE]
MOV [SI.CXSAVE],CX
JCXZ FINRND
学习啦在线学习网 ADD AX,1
学习啦在线学习网 ADC DX,0
FINRND:
MOV ES:WORD PTR [DI.RR],AX
MOV ES:[DI.RR+2],DL
学习啦在线学习网 OR DH,DH
学习啦在线学习网 JZ SETNREX
学习啦在线学习网 MOV ES:[DI.RR+3],DH ;Save 4 byte of RECPOS only if significant
SETNREX:
学习啦在线学习网 MOV CX,AX
学习啦在线学习网 AND AL,7FH
MOV ES:[DI.NR],AL
学习啦在线学习网 AND CL,80H
SHL CX,1
学习啦在线学习网 RCL DX,1
MOV AL,CH
学习啦在线学习网 MOV AH,DL
MOV ES:[DI.EXTENT],AX
MOV AL,CS:[DSKERR]
RET
GETRRPOS1:
学习啦在线学习网 MOV CX,1
GETRRPOS:
学习啦在线学习网 MOV DI,DX
学习啦在线学习网 CMP BYTE PTR [DI],-1
学习啦在线学习网 JNZ NORMFCB1
学习啦在线学习网 ADD DI,7
NORMFCB1:
MOV AX,WORD PTR [DI.RR]
学习啦在线学习网 MOV DX,WORD PTR [DI.RR+2]
RET
NOFILERR:
XOR CX,CX
学习啦在线学习网 MOV BYTE PTR [DSKERR],4
POP BX
RET
SETUP:
; Inputs:
; DS:DI point to FCB
; DX:AX = Record position in file of disk transfer
学习啦在线学习网 ; CX = Record count
; Outputs:
学习啦在线学习网 ; DS = CS
; ES:DI point to FCB
; BL = DEVID from FCB
; CX = No. of bytes to transfer
学习啦在线学习网 ; BP = Base of drive parameters
学习啦在线学习网 ; SI = FAT pointer
学习啦在线学习网 ; [RECCNT] = Record count
; [RECPOS] = Record position in file
学习啦在线学习网 ; [FCB] = DI
; [NEXTADD] = Displacement of disk transfer within segment
学习啦在线学习网 ; [SECPOS] = Position of first sector
; [BYTPOS] = Byte position in file
学习啦在线学习网 ; [BYTSECPOS] = Byte position in first sector
; [CLUSNUM] = First cluster
; [SECCLUSPOS] = Sector within first cluster
; [DSKERR] = 0 (no errors yet)
; [TRANS] = 0 (No transfers yet)
; [THISDRV] = Physical drive unit number
; If SETUP detects no records will be transfered, it returns 1 level up
; with CX = 0.
PUSH AX
MOV AL,[DI]
DEC AL
MOV CS:[THISDRV],AL
MOV AL,[DI.DEVID]
MOV SI,[DI.RECSIZ]
OR SI,SI
学习啦在线学习网 JNZ HAVRECSIZ
MOV SI,128
MOV [DI.RECSIZ],SI
学习啦在线学习网 HAVRECSIZ:
PUSH DS
学习啦在线学习网 POP ES ;Set ES to DS
PUSH CS
学习啦在线学习网 POP DS ;Set DS to CS
OR AL,AL ;Is it a device?
JNS NOTDEVICE
MOV AL,0 ;Fake in drive 0 so we can get SP
NOTDEVICE:
学习啦在线学习网 CALL GETBP
POP AX
JC NOFILERR
CMP SI,64 ;Check if highest byte of RECPOS is significant
学习啦在线学习网 JB SMALREC
学习啦在线学习网 MOV DH,0 ;Ignore MSB if record >= 64 bytes
学习啦在线学习网 SMALREC:
学习啦在线学习网 MOV [RECCNT],CX
学习啦在线学习网 MOV WORD PTR [RECPOS],AX
MOV WORD PTR [RECPOS+2],DX
MOV [FCB],DI
MOV BX,[DMAADD]
MOV [NEXTADD],BX
MOV BYTE PTR [DSKERR],0
MOV BYTE PTR [TRANS],0
MOV BX,DX
MUL SI
MOV WORD PTR [BYTPOS],AX
PUSH DX
MOV AX,BX
MUL SI
POP BX
ADD AX,BX
ADC DX,0 ;Ripple carry
JNZ EOFERR
MOV WORD PTR [BYTPOS+2],AX
学习啦在线学习网 MOV DX,AX
学习啦在线学习网 MOV AX,WORD PTR [BYTPOS]
学习啦在线学习网 MOV BX,[BP.SECSIZ]
CMP DX,BX ;See if divide will overflow
学习啦在线学习网 JNC EOFERR
DIV BX
学习啦在线学习网 MOV [SECPOS],AX
MOV [BYTSECPOS],DX
学习啦在线学习网 MOV DX,AX
学习啦在线学习网 AND AL,[BP.CLUSMSK]
学习啦在线学习网 MOV [SECCLUSPOS],AL
MOV AX,CX ;Record count
MOV CL,[BP.CLUSSHFT]
学习啦在线学习网 SHR DX,CL
学习啦在线学习网 MOV [CLUSNUM],DX
MUL SI ;Multiply by bytes per record
学习啦在线学习网 MOV CX,AX
ADD AX,[DMAADD] ;See if it will fit in one segment
学习啦在线学习网 ADC DX,0
JZ OK ;Must be less than 64K
学习啦在线学习网 MOV AX,[DMAADD]
NEG AX ;Amount of room left in segment
JNZ PARTSEG ;All 64K available?
学习啦在线学习网 DEC AX ;If so, reduce by one
PARTSEG:
XOR DX,DX
DIV SI ;How many records will fit?
MOV [RECCNT],AX
学习啦在线学习网 MUL SI ;Translate that back into bytes
学习啦在线学习网 MOV BYTE PTR [DSKERR],2 ;Flag that trimming took place
MOV CX,AX
JCXZ NOROOM
OK:
学习啦在线学习网 MOV BL,ES:[DI.DEVID]
MOV SI,[BP.FAT]
RET
EOFERR:
MOV BYTE PTR [DSKERR],1
学习啦在线学习网 XOR CX,CX
NOROOM:
POP BX ;Kill return address
RET
学习啦在线学习网 BREAKDOWN:
;Inputs:
; DS = CS
; CX = Length of disk transfer in bytes
学习啦在线学习网 ; BP = Base of drive parameters
; [BYTSECPOS] = Byte position witin first sector
;Outputs:
; [BYTCNT1] = Bytes to transfer in first sector
; [SECCNT] = No. of whole sectors to transfer
; [BYTCNT2] = Bytes to transfer in last sector
学习啦在线学习网 ;AX, BX, DX destroyed. No other registers affected.
学习啦在线学习网 MOV AX,[BYTSECPOS]
学习啦在线学习网 MOV BX,CX
OR AX,AX
学习啦在线学习网 JZ SAVFIR ;Partial first sector?
SUB AX,[BP.SECSIZ]
NEG AX ;Max number of bytes left in first sector
学习啦在线学习网 SUB BX,AX ;Subtract from total length
学习啦在线学习网 JAE SAVFIR
ADD AX,BX ;Don't use all of the rest of the sector
XOR BX,BX ;And no bytes are left
SAVFIR:
学习啦在线学习网 MOV [BYTCNT1],AX
MOV AX,BX
学习啦在线学习网 XOR DX,DX
DIV [BP.SECSIZ] ;How many whole sectors?
MOV [SECCNT],AX
MOV [BYTCNT2],DX ;Bytes remaining for last sector
RET10: RET
FNDCLUS:
; Inputs:
; DS = CS
; CX = No. of clusters to skip
; BP = Base of drive parameters
; SI = FAT pointer
; ES:DI point to FCB
; Outputs:
学习啦在线学习网 ; BX = Last cluster skipped to
学习啦在线学习网 ; CX = No. of clusters remaining (0 unless EOF)
; DX = Position of last cluster
学习啦在线学习网 ; DI destroyed. No other registers affected.
学习啦在线学习网 MOV BX,ES:[DI.LSTCLUS]
MOV DX,ES:[DI.CLUSPOS]
OR BX,BX
JZ NOCLUS
SUB CX,DX
JNB FINDIT
ADD CX,DX
XOR DX,DX
学习啦在线学习网 MOV BX,ES:[DI.FIRCLUS]
FINDIT:
JCXZ RET10
SKPCLP:
学习啦在线学习网 CALL UNPACK
学习啦在线学习网 CMP DI,0FF8H
JAE RET10
XCHG BX,DI
INC DX
学习啦在线学习网 LOOP SKPCLP
RET
NOCLUS:
INC CX
DEC DX
RET
BUFSEC:
学习啦在线学习网 ; Inputs:
学习啦在线学习网 ; AL = 0 if buffer must be read, 1 if no pre-read needed
; BP = Base of drive parameters
学习啦在线学习网 ; [CLUSNUM] = Physical cluster number
学习啦在线学习网 ; [SECCLUSPOS] = Sector position of transfer within cluster
学习啦在线学习网 ; [BYTCNT1] = Size of transfer
学习啦在线学习网 ; Function:
; Insure specified sector is in buffer, flushing buffer before
学习啦在线学习网 ; read if necessary.
; Outputs:
学习啦在线学习网 ; SI = Pointer to buffer
; DI = Pointer to transfer address
; CX = Number of bytes
; [NEXTADD] updated
; [TRANS] set to indicate a transfer will occur
学习啦在线学习网 MOV DX,[CLUSNUM]
学习啦在线学习网 MOV BL,[SECCLUSPOS]
学习啦在线学习网 CALL FIGREC
MOV [PREREAD],AL
CMP DX,[BUFSECNO]
JNZ GETSEC
MOV AL,[BUFDRVNO]
学习啦在线学习网 CMP AL,[THISDRV]
学习啦在线学习网 JZ FINBUF ;Already have it?
GETSEC:
学习啦在线学习网 XOR AL,AL
XCHG [DIRTYBUF],AL ;Read dirty flag and reset it
OR AL,AL
JZ RDSEC
PUSH DX
PUSH BP
学习啦在线学习网 MOV BP,[BUFDRVBP]
MOV BX,[BUFFER]
学习啦在线学习网 MOV CX,1
MOV DX,[BUFSECNO]
CALL DWRITE
POP BP
POP DX
RDSEC:
TEST BYTE PTR [PREREAD],-1
JNZ SETBUF
学习啦在线学习网 XOR AX,AX
学习啦在线学习网 MOV [BUFSECNO],AX ;Set buffer valid in case of disk error
DEC AX
MOV [BUFDRVNO],AL
MOV BX,[BUFFER]
学习啦在线学习网 MOV CX,1
PUSH DX
CALL DREAD
POP DX
SETBUF:
学习啦在线学习网 MOV [BUFSECNO],DX
学习啦在线学习网 MOV AL,[THISDRV]
MOV [BUFDRVNO],AL
学习啦在线学习网 MOV [BUFDRVBP],BP
FINBUF:
学习啦在线学习网 MOV BYTE PTR [TRANS],1 ;A transfer is taking place
学习啦在线学习网 MOV DI,[NEXTADD]
MOV SI,DI
MOV CX,[BYTCNT1]
ADD SI,CX
MOV [NEXTADD],SI
MOV SI,[BUFFER]
学习啦在线学习网 ADD SI,[BYTSECPOS]
RET
BUFRD:
学习啦在线学习网 XOR AL,AL ;Pre-read necessary
CALL BUFSEC
PUSH ES
学习啦在线学习网 MOV ES,[DMAADD+2]
学习啦在线学习网 SHR CX,1
学习啦在线学习网 JNC EVENRD
MOVSB
EVENRD:
REP MOVSW
POP ES
RET
BUFWRT:
MOV AX,[SECPOS]
INC AX ;Set for next sector
MOV [SECPOS],AX
CMP AX,[VALSEC] ;Has sector been written before?
MOV AL,1
JA NOREAD ;Skip preread if SECPOS>VALSEC
MOV AL,0
NOREAD:
学习啦在线学习网 CALL BUFSEC
学习啦在线学习网 XCHG DI,SI
PUSH DS
PUSH ES
PUSH CS
POP ES
MOV DS,[DMAADD+2]
SHR CX,1
JNC EVENWRT
MOVSB
学习啦在线学习网 EVENWRT:
学习啦在线学习网 REP MOVSW
POP ES
POP DS
MOV BYTE PTR [DIRTYBUF],1
RET
NEXTSEC:
学习啦在线学习网 TEST BYTE PTR [TRANS],-1
学习啦在线学习网 JZ CLRET
MOV AL,[SECCLUSPOS]
INC AL
学习啦在线学习网 CMP AL,[BP.CLUSMSK]
学习啦在线学习网 JBE SAVPOS
MOV BX,[CLUSNUM]
CMP BX,0FF8H
JAE NONEXT
MOV SI,[BP.FAT]
CALL UNPACK
MOV [CLUSNUM],DI
INC [LASTPOS]
MOV AL,0
SAVPOS:
MOV [SECCLUSPOS],AL
CLRET:
CLC
RET
NONEXT:
STC
RET
学习啦在线学习网 TRANBUF:
LODSB
STOSB
CMP AL,13 ;Check for carriage return
JNZ NORMCH
学习啦在线学习网 MOV BYTE PTR [SI],10
NORMCH:
CMP AL,10
LOOPNZ TRANBUF
学习啦在线学习网 JNZ ENDRDCON
学习啦在线学习网 CALL OUT ;Transmit linefeed
XOR SI,SI
OR CX,CX
JNZ GETBUF
OR AL,1 ;Clear zero flag--not end of file
学习啦在线学习网 ENDRDCON:
学习啦在线学习网 MOV [CONTPOS],SI
ENDRDDEV:
学习啦在线学习网 MOV [NEXTADD],DI
POP ES
学习啦在线学习网 JNZ SETFCBJ ;Zero set if Ctrl-Z found in input
MOV DI,[FCB]
AND ES:BYTE PTR [DI.DEVID],0FFH-40H ;Mark as no more data available
学习啦在线学习网 SETFCBJ:
学习啦在线学习网 JMP SETFCB
READDEV:
PUSH ES
LES DI,DWORD PTR [DMAADD]
INC BL
学习啦在线学习网 JZ READCON
INC BL
学习啦在线学习网 JNZ ENDRDDEV
READAUX:
CALL AUXIN
STOSB
学习啦在线学习网 CMP AL,1AH
LOOPNZ READAUX
学习啦在线学习网 JMP SHORT ENDRDDEV
学习啦在线学习网 READCON:
PUSH CS
POP DS
学习啦在线学习网 MOV SI,[CONTPOS]
OR SI,SI
学习啦在线学习网 JNZ TRANBUF
学习啦在线学习网 CMP BYTE PTR [CONBUF],128
JZ GETBUF
MOV WORD PTR [CONBUF],0FF80H ;Set up 128-byte buffer with no template
GETBUF:
PUSH CX
PUSH ES
PUSH DI
学习啦在线学习网 MOV DX,OFFSET DOSGROUP:CONBUF
学习啦在线学习网 CALL BUFIN ;Get input buffer
POP DI
POP ES
POP CX
学习啦在线学习网 MOV SI,2 + OFFSET DOSGROUP:CONBUF
CMP BYTE PTR [SI],1AH ;Check for Ctrl-Z in first character
学习啦在线学习网 JNZ TRANBUF
学习啦在线学习网 MOV AL,1AH
STOSB
学习啦在线学习网 MOV AL,10
学习啦在线学习网 CALL OUT ;Send linefeed
学习啦在线学习网 XOR SI,SI
学习啦在线学习网 JMP SHORT ENDRDCON
RDERR:
学习啦在线学习网 XOR CX,CX
JMP WRTERR
RDLASTJ:JMP RDLAST
LOAD:
; Inputs:
; DS:DI point to FCB
; DX:AX = Position in file to read
; CX = No. of records to read
; Outputs:
; DX:AX = Position of last record read
; CX = No. of bytes read
; ES:DI point to FCB
学习啦在线学习网 ; LSTCLUS, CLUSPOS fields in FCB set
CALL SETUP
学习啦在线学习网 OR BL,BL ;Check for named device I/O
学习啦在线学习网 JS READDEV
MOV AX,ES:WORD PTR [DI.FILSIZ]
MOV BX,ES:WORD PTR [DI.FILSIZ+2]
学习啦在线学习网 SUB AX,WORD PTR [BYTPOS]
SBB BX,WORD PTR [BYTPOS+2]
JB RDERR
学习啦在线学习网 JNZ ENUF
学习啦在线学习网 OR AX,AX
JZ RDERR
CMP AX,CX
JAE ENUF
学习啦在线学习网 MOV CX,AX
ENUF:
CALL BREAKDOWN
MOV CX,[CLUSNUM]
学习啦在线学习网 CALL FNDCLUS
OR CX,CX
JNZ RDERR
学习啦在线学习网 MOV [LASTPOS],DX
MOV [CLUSNUM],BX
CMP [BYTCNT1],0
JZ RDMID
CALL BUFRD
RDMID:
CMP [SECCNT],0
JZ RDLASTJ
CALL NEXTSEC
学习啦在线学习网 JC SETFCB
MOV BYTE PTR [TRANS],1 ;A transfer is taking place
ONSEC:
MOV DL,[SECCLUSPOS]
学习啦在线学习网 MOV CX,[SECCNT]
MOV BX,[CLUSNUM]
RDLP:
学习啦在线学习网 CALL OPTIMIZE
PUSH DI
PUSH AX
PUSH DS
学习啦在线学习网 MOV DS,[DMAADD+2]
PUSH DX
PUSH BX
学习啦在线学习网 PUSHF ;Save carry flag
CALL DREAD
POPF ;Restore carry flag
学习啦在线学习网 POP DI ;Initial transfer address
POP AX ;First sector transfered
POP DS
学习啦在线学习网 JC NOTBUFFED ;Was one of those sectors in the buffer?
CMP BYTE PTR [DIRTYBUF],0 ;Is buffer dirty?
JZ NOTBUFFED ;If not no problem
;We have transfered in a sector from disk when a dirty copy of it is in the buffer.
学习啦在线学习网 ;We must transfer the sector from the buffer to correct memory address
SUB AX,[BUFSECNO] ;How many sectors into the transfer?
NEG AX
MOV CX,[BP.SECSIZ]
MUL CX ;How many bytes into the transfer?
学习啦在线学习网 ADD DI,AX
MOV SI,[BUFFER]
PUSH ES
MOV ES,[DMAADD+2] ;Get disk transfer segment
学习啦在线学习网 SHR CX,1
REP MOVSW
JNC EVENMOV
MOVSB
学习啦在线学习网 EVENMOV:
POP ES
学习啦在线学习网 NOTBUFFED:
POP CX
POP BX
JCXZ RDLAST
学习啦在线学习网 CMP BX,0FF8H
学习啦在线学习网 JAE SETFCB
学习啦在线学习网 MOV DL,0
学习啦在线学习网 INC [LASTPOS] ;We'll be using next cluster
学习啦在线学习网 JMP SHORT RDLP
SETFCB:
MOV SI,[FCB]
MOV AX,[NEXTADD]
MOV DI,AX
学习啦在线学习网 SUB AX,[DMAADD] ;Number of bytes transfered
XOR DX,DX
MOV CX,ES:[SI.RECSIZ]
学习啦在线学习网 DIV CX ;Number of records
CMP AX,[RECCNT] ;Check if all records transferred
JZ FULLREC
学习啦在线学习网 MOV BYTE PTR [DSKERR],1
OR DX,DX
学习啦在线学习网 JZ FULLREC ;If remainder 0, then full record transfered
MOV BYTE PTR [DSKERR],3 ;Flag partial last record
SUB CX,DX ;Bytes left in last record
PUSH ES
MOV ES,[DMAADD+2]
学习啦在线学习网 XCHG AX,BX ;Save the record count temporarily
XOR AX,AX ;Fill with zeros
SHR CX,1
JNC EVENFIL
STOSB
学习啦在线学习网 EVENFIL:
REP STOSW
XCHG AX,BX ;Restore record count to AX
POP ES
INC AX ;Add last (partial) record to total
FULLREC:
学习啦在线学习网 MOV CX,AX
学习啦在线学习网 MOV DI,SI ;ES:DI point to FCB
学习啦在线学习网 SETCLUS:
MOV AX,[CLUSNUM]
MOV ES:[DI.LSTCLUS],AX
MOV AX,[LASTPOS]
学习啦在线学习网 MOV ES:[DI.CLUSPOS],AX
ADDREC:
MOV AX,WORD PTR [RECPOS]
MOV DX,WORD PTR [RECPOS+2]
JCXZ RET28 ;If no records read, don't change position
DEC CX
学习啦在线学习网 ADD AX,CX ;Update current record position
ADC DX,0
INC CX
学习啦在线学习网 RET28: RET
RDLAST:
MOV AX,[BYTCNT2]
OR AX,AX
学习啦在线学习网 JZ SETFCB
学习啦在线学习网 MOV [BYTCNT1],AX
学习啦在线学习网 CALL NEXTSEC
JC SETFCB
MOV [BYTSECPOS],0
CALL BUFRD
学习啦在线学习网 JMP SHORT SETFCB
WRTDEV:
PUSH DS
LDS SI,DWORD PTR [DMAADD]
OR BL,40H
INC BL
学习啦在线学习网 JZ WRTCON
INC BL
学习啦在线学习网 JZ WRTAUX
INC BL
JZ ENDWRDEV ;Done if device is NUL
WRTLST:
LODSB
学习啦在线学习网 CMP AL,1AH
学习啦在线学习网 JZ ENDWRDEV
学习啦在线学习网 CALL LISTOUT
学习啦在线学习网 LOOP WRTLST
学习啦在线学习网 JMP SHORT ENDWRDEV
WRTAUX:
LODSB
CALL AUXOUT
学习啦在线学习网 CMP AL,1AH
LOOPNZ WRTAUX
JMP SHORT ENDWRDEV
WRTCON:
LODSB
学习啦在线学习网 CMP AL,1AH
JZ ENDWRDEV
CALL OUT
LOOP WRTCON
学习啦在线学习网 ENDWRDEV:
POP DS
学习啦在线学习网 MOV CX,[RECCNT]
学习啦在线学习网 MOV DI,[FCB]
JMP SHORT ADDREC
HAVSTART:
学习啦在线学习网 MOV CX,AX
CALL SKPCLP
JCXZ DOWRTJ
CALL ALLOCATE
JNC DOWRTJ
WRTERR:
MOV BYTE PTR [DSKERR],1
LVDSK:
学习啦在线学习网 MOV AX,WORD PTR [RECPOS]
学习啦在线学习网 MOV DX,WORD PTR [RECPOS+2]
MOV DI,[FCB]
RET
学习啦在线学习网 DOWRTJ: JMP DOWRT
学习啦在线学习网 WRTEOFJ:
学习啦在线学习网 JMP WRTEOF
STORE:
学习啦在线学习网 ; Inputs:
; DS:DI point to FCB
; DX:AX = Position in file of disk transfer
学习啦在线学习网 ; CX = Record count
; Outputs:
; DX:AX = Position of last record written
; CX = No. of records written
; ES:DI point to FCB
; LSTCLUS, CLUSPOS fields in FCB set
学习啦在线学习网 CALL SETUP
学习啦在线学习网 CALL DATE16
学习啦在线学习网 MOV ES:[DI.FDATE],AX
MOV ES:[DI.FTIME],DX
OR BL,BL
JS WRTDEV
AND BL,3FH ;Mark file as dirty
MOV ES:[DI.DEVID],BL
CALL BREAKDOWN
MOV AX,WORD PTR [BYTPOS]
MOV DX,WORD PTR [BYTPOS+2]
学习啦在线学习网 JCXZ WRTEOFJ
DEC CX
学习啦在线学习网 ADD AX,CX
ADC DX,0 ;AX:DX=last byte accessed
DIV [BP.SECSIZ] ;AX=last sector accessed
学习啦在线学习网 MOV CL,[BP.CLUSSHFT]
SHR AX,CL ;Last cluster to be accessed
PUSH AX
MOV AX,ES:WORD PTR [DI.FILSIZ]
MOV DX,ES:WORD PTR [DI.FILSIZ+2]
DIV [BP.SECSIZ]
OR DX,DX
JZ NORNDUP
学习啦在线学习网 INC AX ;Round up if any remainder
NORNDUP:
MOV [VALSEC],AX ;Number of sectors that have been written
POP AX
MOV CX,[CLUSNUM] ;First cluster accessed
CALL FNDCLUS
MOV [CLUSNUM],BX
学习啦在线学习网 MOV [LASTPOS],DX
SUB AX,DX ;Last cluster minus current cluster
JZ DOWRT ;If we have last clus, we must have first
学习啦在线学习网 JCXZ HAVSTART ;See if no more data
PUSH CX ;No. of clusters short of first
学习啦在线学习网 MOV CX,AX
CALL ALLOCATE
POP AX
学习啦在线学习网 JC WRTERR
MOV CX,AX
MOV DX,[LASTPOS]
INC DX
DEC CX
JZ NOSKIP
CALL SKPCLP
NOSKIP:
MOV [CLUSNUM],BX
学习啦在线学习网 MOV [LASTPOS],DX
DOWRT:
CMP [BYTCNT1],0
学习啦在线学习网 JZ WRTMID
MOV BX,[CLUSNUM]
CALL BUFWRT
WRTMID:
MOV AX,[SECCNT]
OR AX,AX
JZ WRTLAST
学习啦在线学习网 ADD [SECPOS],AX
CALL NEXTSEC
MOV BYTE PTR [TRANS],1 ;A transfer is taking place
MOV DL,[SECCLUSPOS]
学习啦在线学习网 MOV BX,[CLUSNUM]
MOV CX,[SECCNT]
WRTLP:
CALL OPTIMIZE
学习啦在线学习网 JC NOTINBUF ;Is one of the sectors buffered?
MOV [BUFSECNO],0 ;If so, invalidate the buffer since we're
学习啦在线学习网 MOV WORD PTR [BUFDRVNO],0FFH ; completely rewritting it
NOTINBUF:
PUSH DI
PUSH AX
PUSH DS
MOV DS,[DMAADD+2]
CALL DWRITE
POP DS
POP CX
POP BX
学习啦在线学习网 JCXZ WRTLAST
学习啦在线学习网 MOV DL,0
学习啦在线学习网 INC [LASTPOS] ;We'll be using next cluster
JMP SHORT WRTLP
WRTLAST:
学习啦在线学习网 MOV AX,[BYTCNT2]
OR AX,AX
JZ FINWRT
学习啦在线学习网 MOV [BYTCNT1],AX
CALL NEXTSEC
学习啦在线学习网 MOV [BYTSECPOS],0
CALL BUFWRT
FINWRT:
MOV AX,[NEXTADD]
SUB AX,[DMAADD]
ADD AX,WORD PTR [BYTPOS]
MOV DX,WORD PTR [BYTPOS+2]
ADC DX,0
学习啦在线学习网 MOV CX,DX
MOV DI,[FCB]
CMP AX,ES:WORD PTR [DI.FILSIZ]
SBB CX,ES:WORD PTR [DI.FILSIZ+2]
学习啦在线学习网 JB SAMSIZ
学习啦在线学习网 MOV ES:WORD PTR [DI.FILSIZ],AX
学习啦在线学习网 MOV ES:WORD PTR [DI.FILSIZ+2],DX
SAMSIZ:
MOV CX,[RECCNT]
学习啦在线学习网 JMP SETCLUS
WRTERRJ:JMP WRTERR
WRTEOF:
学习啦在线学习网 MOV CX,AX
学习啦在线学习网 OR CX,DX
学习啦在线学习网 JZ KILLFIL
SUB AX,1
SBB DX,0
DIV [BP.SECSIZ]
MOV CL,[BP.CLUSSHFT]
学习啦在线学习网 SHR AX,CL
学习啦在线学习网 MOV CX,AX
CALL FNDCLUS
JCXZ RELFILE
CALL ALLOCATE
学习啦在线学习网 JC WRTERRJ
UPDATE:
学习啦在线学习网 MOV DI,[FCB]
MOV AX,WORD PTR [BYTPOS]
学习啦在线学习网 MOV ES:WORD PTR [DI.FILSIZ],AX
学习啦在线学习网 MOV AX,WORD PTR [BYTPOS+2]
MOV ES:WORD PTR [DI.FILSIZ+2],AX
XOR CX,CX
JMP ADDREC
RELFILE:
MOV DX,0FFFH
CALL RELBLKS
SETDIRT:
MOV BYTE PTR [SI-1],1
JMP SHORT UPDATE
学习啦在线学习网 KILLFIL:
XOR BX,BX
XCHG BX,ES:[DI.FIRCLUS]
OR BX,BX
学习啦在线学习网 JZ UPDATE
CALL RELEASE
JMP SHORT SETDIRT
学习啦在线学习网 OPTIMIZE:
; Inputs:
; DS = CS
学习啦在线学习网 ; BX = Physical cluster
; CX = No. of records
; DL = sector within cluster
; BP = Base of drives parameters
; [NEXTADD] = transfer address
学习啦在线学习网 ; Outputs:
学习啦在线学习网 ; AX = No. of records remaining
学习啦在线学习网 ; BX = Transfer address
; CX = No. or records to be transferred
学习啦在线学习网 ; DX = Physical sector address
; DI = Next cluster
学习啦在线学习网 ; Carry clear if a sector to transfer is in the buffer
学习啦在线学习网 ; Carry set otherwise
; [CLUSNUM] = Last cluster accessed
学习啦在线学习网 ; [NEXTADD] updated
; BP unchanged. Note that segment of transfer not set.
PUSH DX
PUSH BX
MOV AL,[BP.CLUSMSK]
INC AL ;Number of sectors per cluster
MOV AH,AL
学习啦在线学习网 SUB AL,DL ;AL = Number of sectors left in first cluster
MOV DX,CX
MOV SI,[BP.FAT]
MOV CX,0
学习啦在线学习网 OPTCLUS:
学习啦在线学习网 ;AL has number of sectors available in current cluster
;AH has number of sectors available in next cluster
;BX has current physical cluster
学习啦在线学习网 ;CX has number of sequential sectors found so far
学习啦在线学习网 ;DX has number of sectors left to transfer
学习啦在线学习网 ;SI has FAT pointer
学习啦在线学习网 CALL UNPACK
学习啦在线学习网 ADD CL,AL
ADC CH,0
学习啦在线学习网 CMP CX,DX
学习啦在线学习网 JAE BLKDON
MOV AL,AH
INC BX
CMP DI,BX
JZ OPTCLUS
DEC BX
学习啦在线学习网 FINCLUS:
MOV [CLUSNUM],BX ;Last cluster accessed
SUB DX,CX ;Number of sectors still needed
PUSH DX
MOV AX,CX
学习啦在线学习网 MUL [BP.SECSIZ] ;Number of sectors times sector size
学习啦在线学习网 MOV SI,[NEXTADD]
ADD AX,SI ;Adjust by size of transfer
MOV [NEXTADD],AX
POP AX ;Number of sectors still needed
学习啦在线学习网 POP DX ;Starting cluster
学习啦在线学习网 SUB BX,DX ;Number of new clusters accessed
ADD [LASTPOS],BX
学习啦在线学习网 POP BX ;BL = sector postion within cluster
学习啦在线学习网 CALL FIGREC
MOV BX,SI
;Now let's see if any of these sectors are already in the buffer
CMP [BUFSECNO],DX
学习啦在线学习网 JC RET100 ;If DX > [BUFSECNO] then not in buffer
MOV SI,DX
ADD SI,CX ;Last sector + 1
CMP [BUFSECNO],SI
CMC
JC RET100 ;If SI <= [BUFSECNO] then not in buffer
PUSH AX
学习啦在线学习网 MOV AL,[BP.DEVNUM]
学习啦在线学习网 CMP AL,[BUFDRVNO] ;Is buffer for this drive?
POP AX
JZ RET100 ;If so, then we match
STC ;No match
学习啦在线学习网 RET100: RET
BLKDON:
SUB CX,DX ;Number of sectors in cluster we don't want
学习啦在线学习网 SUB AH,CL ;Number of sectors in cluster we accepted
DEC AH ;Adjust to mean position within cluster
MOV [SECCLUSPOS],AH
MOV CX,DX ;Anyway, make the total equal to the request
学习啦在线学习网 JMP SHORT FINCLUS
FIGREC:
;Inputs:
; DX = Physical cluster number
; BL = Sector postion within cluster
学习啦在线学习网 ; BP = Base of drive parameters
学习啦在线学习网 ;Outputs:
; DX = physical sector number
学习啦在线学习网 ;No other registers affected.
PUSH CX
MOV CL,[BP.CLUSSHFT]
DEC DX
DEC DX
SHL DX,CL
OR DL,BL
学习啦在线学习网 ADD DX,[BP.FIRREC]
POP CX
RET
GETREC:
学习啦在线学习网 ; Inputs:
; DS:DX point to FCB
学习啦在线学习网 ; Outputs:
学习啦在线学习网 ; CX = 1
; DX:AX = Record number determined by EXTENT and NR fields
; DS:DI point to FCB
学习啦在线学习网 ; No other registers affected.
学习啦在线学习网 MOV DI,DX
CMP BYTE PTR [DI],-1 ;Check for extended FCB
学习啦在线学习网 JNZ NORMFCB2
ADD DI,7
学习啦在线学习网 NORMFCB2:
MOV CX,1
MOV AL,[DI.NR]
MOV DX,[DI.EXTENT]
学习啦在线学习网 SHL AL,1
学习啦在线学习网 SHR DX,1
RCR AL,1
MOV AH,DL
MOV DL,DH
MOV DH,0
RET
学习啦在线学习网 ALLOCATE:
; Inputs:
学习啦在线学习网 ; DS = CS
学习啦在线学习网 ; ES = Segment of FCB
; BX = Last cluster of file (0 if null file)
学习啦在线学习网 ; CX = No. of clusters to allocate
学习啦在线学习网 ; DX = Position of cluster BX
; BP = Base of drive parameters
; SI = FAT pointer
学习啦在线学习网 ; [FCB] = Displacement of FCB within segment
; Outputs:
; IF insufficient space
; THEN
; Carry set
; CX = max. no. of records that could be added to file
; ELSE
; Carry clear
学习啦在线学习网 ; BX = First cluster allocated
学习啦在线学习网 ; FAT is fully updated including dirty bit
; FIRCLUS field of FCB set if file was null
; SI,BP unchanged. All other registers destroyed.
PUSH [SI]
PUSH DX
PUSH CX
PUSH BX
学习啦在线学习网 MOV AX,BX
ALLOC:
学习啦在线学习网 MOV DX,BX
学习啦在线学习网 FINDFRE:
INC BX
学习啦在线学习网 CMP BX,[BP.MAXCLUS]
JLE TRYOUT
CMP AX,1
JG TRYIN
POP BX
MOV DX,0FFFH
CALL RELBLKS
学习啦在线学习网 POP AX ;No. of clusters requested
SUB AX,CX ;AX=No. of clusters allocated
POP DX
POP [SI]
INC DX ;Position of first cluster allocated
学习啦在线学习网 ADD AX,DX ;AX=max no. of cluster in file
学习啦在线学习网 MOV DL,[BP.CLUSMSK]
MOV DH,0
INC DX ;DX=records/cluster
学习啦在线学习网 MUL DX ;AX=max no. of records in file
学习啦在线学习网 MOV CX,AX
SUB CX,WORD PTR [RECPOS] ;CX=max no. of records that could be written
学习啦在线学习网 JA MAXREC
XOR CX,CX ;If CX was negative, zero it
MAXREC:
STC
RET11: RET
TRYOUT:
CALL UNPACK
学习啦在线学习网 JZ HAVFRE
TRYIN:
DEC AX
JLE FINDFRE
学习啦在线学习网 XCHG AX,BX
CALL UNPACK
JZ HAVFRE
XCHG AX,BX
JMP SHORT FINDFRE
HAVFRE:
学习啦在线学习网 XCHG BX,DX
MOV AX,DX
CALL PACK
MOV BX,AX
LOOP ALLOC
学习啦在线学习网 MOV DX,0FFFH
学习啦在线学习网 CALL PACK
学习啦在线学习网 MOV BYTE PTR [SI-1],1
POP BX
POP CX ;Don't need this stuff since we're successful
POP DX
学习啦在线学习网 CALL UNPACK
学习啦在线学习网 POP [SI]
XCHG BX,DI
学习啦在线学习网 OR DI,DI
JNZ RET11
MOV DI,[FCB]
MOV ES:[DI.FIRCLUS],BX
RET12: RET
学习啦在线学习网 RELEASE:
; Inputs:
; DS = CS
; BX = Cluster in file
学习啦在线学习网 ; SI = FAT pointer
; BP = Base of drive parameters
; Function:
学习啦在线学习网 ; Frees cluster chain starting with [BX]
学习啦在线学习网 ; AX,BX,DX,DI all destroyed. Other registers unchanged.
XOR DX,DX
学习啦在线学习网 RELBLKS:
; Enter here with DX=0FFFH to put an end-of-file mark
学习啦在线学习网 ; in the first cluster and free the rest in the chain.
CALL UNPACK
JZ RET12
MOV AX,DI
学习啦在线学习网 CALL PACK
CMP AX,0FF8H
学习啦在线学习网 MOV BX,AX
JB RELEASE
学习啦在线学习网 RET13: RET
GETEOF:
; Inputs:
学习啦在线学习网 ; BX = Cluster in a file
; SI = Base of drive FAT
; DS = CS
学习啦在线学习网 ; Outputs:
; BX = Last cluster in the file
学习啦在线学习网 ; DI destroyed. No other registers affected.
学习啦在线学习网 CALL UNPACK
CMP DI,0FF8H
JAE RET13
学习啦在线学习网 MOV BX,DI
JMP SHORT GETEOF
学习啦在线学习网 SRCHFRST: ;System call 17
学习啦在线学习网 CALL GETFILE
SAVPLCE:
; Search-for-next enters here to save place and report
; findings.
学习啦在线学习网 JC KILLSRCH
OR BH,BH
JS SRCHDEV
学习啦在线学习网 MOV AX,[LASTENT]
MOV ES:[DI.FILDIRENT],AX
学习啦在线学习网 MOV ES:[DI.DRVBP],BP
学习啦在线学习网 ;Information in directory entry must be copied into the first
; 33 bytes starting at the disk transfer address.
学习啦在线学习网 MOV SI,BX
LES DI,DWORD PTR [DMAADD]
学习啦在线学习网 MOV AX,00FFH
CMP AL,[EXTFCB]
JNZ NORMFCB
STOSW
INC AL
STOSW
STOSW
MOV AL,[ATTRIB]
STOSB
学习啦在线学习网 NORMFCB:
MOV AL,[THISDRV]
INC AL
STOSB ;Set drive number
学习啦在线学习网 MOV CX,16
REP MOVSW ;Copy remaining 10 characters of name
XOR AL,AL
RET
学习啦在线学习网 KILLSRCH:
KILLSRCH1 EQU KILLSRCH+1
;The purpose of the KILLSRCH1 label is to provide a jump label to the following
; instruction which leaves out the segment override.
MOV WORD PTR ES:[DI.FILDIRENT],-1
MOV AL,-1
RET
学习啦在线学习网 SRCHDEV:
MOV ES:[DI.FILDIRENT],BX
LES DI,DWORD PTR [DMAADD]
学习啦在线学习网 XOR AX,AX
学习啦在线学习网 STOSB ;Zero drive byte
SUB SI,4 ;Point to device name
MOVSW
MOVSW
MOV AX,2020H
STOSB
STOSW
STOSW
STOSW ;Fill with 8 blanks
学习啦在线学习网 XOR AX,AX
学习啦在线学习网 MOV CX,10
REP STOSW
STOSB
学习啦在线学习网 RET14: RET
SRCHNXT: ;System call 18
CALL MOVNAME
MOV DI,DX
JC NEAR PTR KILLSRCH1
学习啦在线学习网 MOV BP,[DI.DRVBP]
MOV AX,[DI.FILDIRENT]
学习啦在线学习网 OR AX,AX
JS NEAR PTR KILLSRCH1
PUSH DX
PUSH DS
PUSH CS
POP DS
MOV [LASTENT],AX
CALL CONTSRCH
POP ES
POP DI
JMP SAVPLCE
学习啦在线学习网 FILESIZE: ;System call 35
CALL GETFILE
学习啦在线学习网 MOV AL,-1
JC RET14
ADD DI,33 ;Write size in RR field
学习啦在线学习网 MOV CX,ES:[DI.RECSIZ-33]
OR CX,CX
JNZ RECOK
MOV CX,128
RECOK:
XOR AX,AX
学习啦在线学习网 XOR DX,DX ;Intialize size to zero
学习啦在线学习网 OR BH,BH ;Check for named I/O device
JS DEVSIZ
INC SI
学习啦在线学习网 INC SI ;Point to length field
MOV AX,[SI+2] ;Get high word of size
DIV CX
PUSH AX ;Save high part of result
学习啦在线学习网 LODSW ;Get low word of size
DIV CX
OR DX,DX ;Check for zero remainder
POP DX
JZ DEVSIZ
INC AX ;Round up for partial record
学习啦在线学习网 JNZ DEVSIZ ;Propagate carry?
INC DX
DEVSIZ:
STOSW
MOV AX,DX
STOSB
MOV AL,0
CMP CX,64
学习啦在线学习网 JAE RET14 ;Only 3-byte field if RECSIZ >= 64
MOV ES:[DI],AH
RET
学习啦在线学习网 SETDMA: ;System call 26
MOV CS:[DMAADD],DX
学习啦在线学习网 MOV CS:[DMAADD+2],DS
RET
NOSUCHDRV:
MOV AL,-1
RET
学习啦在线学习网 GETFATPT: ;System call 27
MOV DL,0 ;Use default drive
学习啦在线学习网 GETFATPTDL: ;System call 28
PUSH CS
POP DS
MOV AL,DL
CALL GETTHISDRV
JC NOSUCHDRV
CALL FATREAD
学习啦在线学习网 MOV BX,[BP.FAT]
学习啦在线学习网 MOV AL,[BP.CLUSMSK]
INC AL
MOV DX,[BP.MAXCLUS]
DEC DX
学习啦在线学习网 MOV CX,[BP.SECSIZ]
LDS SI,DWORD PTR [SPSAVE]
MOV [SI.BXSAVE],BX
学习啦在线学习网 MOV [SI.DXSAVE],DX
MOV [SI.CXSAVE],CX
MOV [SI.DSSAVE],CS
RET
GETDSKPT: ;System call 31
PUSH CS
POP DS
MOV AL,[CURDRV]
MOV [THISDRV],AL
CALL FATREAD
LDS SI,DWORD PTR [SPSAVE]
学习啦在线学习网 MOV [SI.BXSAVE],BP
学习啦在线学习网 MOV [SI.DSSAVE],CS
RET
DSKRESET: ;System call 13
PUSH CS
POP DS
WRTFATS:
学习啦在线学习网 ; DS=CS. Writes back all dirty FATs. All registers destroyed.
XOR AL,AL
XCHG AL,[DIRTYBUF]
学习啦在线学习网 OR AL,AL
学习啦在线学习网 JZ NOBUF
MOV BP,[BUFDRVBP]
MOV DX,[BUFSECNO]
MOV BX,[BUFFER]
学习啦在线学习网 MOV CX,1
CALL DWRITE
NOBUF:
MOV CL,[NUMIO]
学习啦在线学习网 MOV CH,0
MOV BP,[DRVTAB]
WRTFAT:
PUSH CX
学习啦在线学习网 CALL CHKFATWRT
POP CX
ADD BP,DPBSIZ
学习啦在线学习网 LOOP WRTFAT
RET
学习啦在线学习网 GETDRV: ;System call 25
MOV AL,CS:[CURDRV]
学习啦在线学习网 RET15: RET
学习啦在线学习网 SETRNDREC: ;System call 36
CALL GETREC
学习啦在线学习网 MOV [DI+33],AX
MOV [DI+35],DL
CMP [DI.RECSIZ],64
JAE RET15
MOV [DI+36],DH ;Set 4th byte only if record size < 64
学习啦在线学习网 RET16: RET
学习啦在线学习网 SELDSK: ;System call 14
MOV AL,CS:[NUMDRV]
CMP DL,AL
学习啦在线学习网 JNB RET17
学习啦在线学习网 MOV CS:[CURDRV],DL
RET17: RET
BUFIN: ;System call 10
MOV AX,CS
学习啦在线学习网 MOV ES,AX
学习啦在线学习网 MOV SI,DX
MOV CH,0
LODSW
学习啦在线学习网 OR AL,AL
JZ RET17
MOV BL,AH
MOV BH,CH
CMP AL,BL
学习啦在线学习网 JBE NOEDIT
CMP BYTE PTR [BX+SI],0DH
JZ EDITON
NOEDIT:
MOV BL,CH
EDITON:
MOV DL,AL
DEC DX
NEWLIN:
MOV AL,CS:[CARPOS]
MOV CS:[STARTPOS],AL
PUSH SI
MOV DI,OFFSET DOSGROUP:INBUF
学习啦在线学习网 MOV AH,CH
MOV BH,CH
MOV DH,CH
GETCH:
CALL IN
学习啦在线学习网 CMP AL,"F"-"@" ;Ignore ^F
JZ GETCH
CMP AL,CS:ESCCHAR
JZ ESC
CMP AL,7FH
学习啦在线学习网 JZ BACKSP
CMP AL,8
学习啦在线学习网 JZ BACKSP
CMP AL,13
学习啦在线学习网 JZ ENDLIN
学习啦在线学习网 CMP AL,10
学习啦在线学习网 JZ PHYCRLF
学习啦在线学习网 CMP AL,CANCEL
学习啦在线学习网 JZ KILNEW
SAVCH:
CMP DH,DL
JAE BUFFUL
STOSB
INC DH
CALL BUFOUT
OR AH,AH
学习啦在线学习网 JNZ GETCH
CMP BH,BL
JAE GETCH
INC SI
INC BH
学习啦在线学习网 JMP SHORT GETCH
BUFFUL:
MOV AL,7
学习啦在线学习网 CALL OUT
JMP SHORT GETCH
ESC:
CALL IN
学习啦在线学习网 MOV CL,ESCTABLEN
PUSH DI
学习啦在线学习网 MOV DI,OFFSET DOSGROUP:ESCTAB
学习啦在线学习网 REPNE SCASB
POP DI
SHL CX,1
MOV BP,CX
JMP [BP+OFFSET DOSGROUP:ESCFUNC]
ENDLIN:
STOSB
学习啦在线学习网 CALL OUT
POP DI
学习啦在线学习网 MOV [DI-1],DH
INC DH
学习啦在线学习网 COPYNEW:
学习啦在线学习网 MOV BP,ES
MOV BX,DS
学习啦在线学习网 MOV ES,BX
MOV DS,BP
MOV SI,OFFSET DOSGROUP:INBUF
MOV CL,DH
学习啦在线学习网 REP MOVSB
RET
CRLF:
MOV AL,13
CALL OUT
MOV AL,10
JMP OUT
PHYCRLF:
CALL CRLF
学习啦在线学习网 JMP SHORT GETCH
KILNEW:
MOV AL,"\"
CALL OUT
POP SI
PUTNEW:
CALL CRLF
学习啦在线学习网 MOV AL,CS:[STARTPOS]
CALL TAB
学习啦在线学习网 JMP NEWLIN
BACKSP:
OR DH,DH
JZ OLDBAK
CALL BACKUP
学习啦在线学习网 MOV AL,ES:[DI]
CMP AL," "
JAE OLDBAK
CMP AL,9
JZ BAKTAB
学习啦在线学习网 CALL BACKMES
OLDBAK:
OR AH,AH
JNZ GETCH1
学习啦在线学习网 OR BH,BH
JZ GETCH1
DEC BH
DEC SI
GETCH1:
JMP GETCH
BAKTAB:
PUSH DI
DEC DI
STD
学习啦在线学习网 MOV CL,DH
学习啦在线学习网 MOV AL," "
PUSH BX
MOV BL,7
学习啦在线学习网 JCXZ FIGTAB
FNDPOS:
SCASB
学习啦在线学习网 JNA CHKCNT
CMP ES:BYTE PTR [DI+1],9
JZ HAVTAB
DEC BL
CHKCNT:
学习啦在线学习网 LOOP FNDPOS
FIGTAB:
SUB BL,CS:[STARTPOS]
HAVTAB:
学习啦在线学习网 SUB BL,DH
ADD CL,BL
AND CL,7
CLD
POP BX
POP DI
学习啦在线学习网 JZ OLDBAK
TABBAK:
CALL BACKMES
LOOP TABBAK
学习啦在线学习网 JMP SHORT OLDBAK
BACKUP:
DEC DH
DEC DI
学习啦在线学习网 BACKMES:
MOV AL,8
CALL OUT
MOV AL," "
CALL OUT
MOV AL,8
JMP OUT
TWOESC:
MOV AL,ESCCH
学习啦在线学习网 JMP SAVCH
COPYLIN:
学习啦在线学习网 MOV CL,BL
学习啦在线学习网 SUB CL,BH
JMP SHORT COPYEACH
COPYSTR:
学习啦在线学习网 CALL FINDOLD
JMP SHORT COPYEACH
COPYONE:
MOV CL,1
COPYEACH:
MOV AH,0
CMP DH,DL
学习啦在线学习网 JZ GETCH2
学习啦在线学习网 CMP BH,BL
JZ GETCH2
LODSB
STOSB
CALL BUFOUT
INC BH
INC DH
学习啦在线学习网 LOOP COPYEACH
GETCH2:
JMP GETCH
学习啦在线学习网 SKIPONE:
CMP BH,BL
JZ GETCH2
INC BH
INC SI
学习啦在线学习网 JMP GETCH
学习啦在线学习网 SKIPSTR:
CALL FINDOLD
ADD SI,CX
ADD BH,CL
学习啦在线学习网 JMP GETCH
学习啦在线学习网 FINDOLD:
CALL IN
MOV CL,BL
学习啦在线学习网 SUB CL,BH
学习啦在线学习网 JZ NOTFND
DEC CX
JZ NOTFND
PUSH ES
PUSH DS
POP ES
PUSH DI
MOV DI,SI
INC DI
学习啦在线学习网 REPNE SCASB
POP DI
POP ES
学习啦在线学习网 JNZ NOTFND
NOT CL
ADD CL,BL
SUB CL,BH
学习啦在线学习网 RET30: RET
NOTFND:
POP BP
学习啦在线学习网 JMP GETCH
REEDIT:
学习啦在线学习网 MOV AL,"@"
CALL OUT
POP DI
PUSH DI
PUSH ES
PUSH DS
学习啦在线学习网 CALL COPYNEW
POP DS
POP ES
POP SI
学习啦在线学习网 MOV BL,DH
JMP PUTNEW
学习啦在线学习网 ENTERINS:
学习啦在线学习网 IF TOGLINS
NOT AH
JMP GETCH
ENDIF
IF NOT TOGLINS
MOV AH,-1
JMP GETCH
学习啦在线学习网 EXITINS:
MOV AH,0
JMP GETCH
ENDIF
ESCFUNC DW GETCH
学习啦在线学习网 DW TWOESC
IF NOT TOGLINS
DW EXITINS
ENDIF
DW ENTERINS
DW BACKSP
学习啦在线学习网 DW REEDIT
DW KILNEW
DW COPYLIN
DW SKIPSTR
DW COPYSTR
DW SKIPONE
学习啦在线学习网 DW COPYONE
IF IBM
学习啦在线学习网 DW COPYONE
DW CTRLZ
CTRLZ:
学习啦在线学习网 MOV AL,"Z"-"@"
学习啦在线学习网 JMP SAVCH
ENDIF
BUFOUT:
CMP AL," "
JAE OUT
学习啦在线学习网 CMP AL,9
JZ OUT
PUSH AX
MOV AL,"^"
学习啦在线学习网 CALL OUT
POP AX
OR AL,40H
学习啦在线学习网 JMP SHORT OUT
NOSTOP:
CMP AL,"P"-"@"
JZ INCHK
学习啦在线学习网 IF NOT TOGLPRN
学习啦在线学习网 CMP AL,"N"-"@"
JZ INCHK
ENDIF
学习啦在线学习网 CMP AL,"C"-"@"
JZ INCHK
RET
学习啦在线学习网 CONOUT: ;System call 2
学习啦在线学习网 MOV AL,DL
OUT:
CMP AL,20H
JB CTRLOUT
CMP AL,7FH
JZ OUTCH
学习啦在线学习网 INC CS:BYTE PTR [CARPOS]
OUTCH:
PUSH AX
CALL STATCHK
POP AX
CALL FAR PTR BIOSOUT
TEST CS:BYTE PTR [PFLAG],-1
学习啦在线学习网 JZ RET18
CALL FAR PTR BIOSPRINT
学习啦在线学习网 RET18: RET
学习啦在线学习网 STATCHK:
CALL FAR PTR BIOSSTAT
学习啦在线学习网 JZ RET18
CMP AL,'S'-'@'
学习啦在线学习网 JNZ NOSTOP
学习啦在线学习网 CALL FAR PTR BIOSIN ;Eat Cntrl-S
INCHK:
学习啦在线学习网 CALL FAR PTR BIOSIN
CMP AL,'P'-'@'
学习啦在线学习网 JZ PRINTON
学习啦在线学习网 IF NOT TOGLPRN
CMP AL,'N'-'@'
JZ PRINTOFF
ENDIF
CMP AL,'C'-'@'
JNZ RET18
; Ctrl-C handler.
; "^C" and CR/LF is printed. Then the user registers are restored and the
; user CTRL-C handler is executed. At this point the top of the stack has
学习啦在线学习网 ; 1) the interrupt return address should the user CTRL-C handler wish to
学习啦在线学习网 ; allow processing to continue; 2) the original interrupt return address
; to the code that performed the function call in the first place. If the
; user CTRL-C handler wishes to continue, it must leave all registers
; unchanged and IRET. The function that was interrupted will simply be
学习啦在线学习网 ; repeated.
学习啦在线学习网 MOV AL,3 ;Display "^C"
CALL BUFOUT
学习啦在线学习网 CALL CRLF
学习啦在线学习网 CLI ;Prepare to play with stack
MOV SS,CS:[SSSAVE]
MOV SP,CS:[SPSAVE] ;User stack now restored
POP AX
POP BX
POP CX
POP DX
POP SI
POP DI
POP BP
POP DS
学习啦在线学习网 POP ES ;User registers now restored
INT CONTC ;Execute user Ctrl-C handler
JMP COMMAND ;Repeat command otherwise
PRINTON:
IF TOGLPRN
NOT CS:BYTE PTR [PFLAG]
RET
ENDIF
学习啦在线学习网 IF NOT TOGLPRN
MOV CS:BYTE PTR [PFLAG],1
RET
PRINTOFF:
学习啦在线学习网 MOV CS:BYTE PTR [PFLAG],0
RET
ENDIF
学习啦在线学习网 CTRLOUT:
学习啦在线学习网 CMP AL,13
JZ ZERPOS
CMP AL,8
JZ BACKPOS
CMP AL,9
JNZ OUTCHJ
MOV AL,CS:[CARPOS]
OR AL,0F8H
NEG AL
TAB:
PUSH CX
MOV CL,AL
学习啦在线学习网 MOV CH,0
学习啦在线学习网 JCXZ POPTAB
TABLP:
学习啦在线学习网 MOV AL," "
CALL OUT
LOOP TABLP
POPTAB:
POP CX
RET19: RET
ZERPOS:
MOV CS:BYTE PTR [CARPOS],0
学习啦在线学习网 OUTCHJ: JMP OUTCH
学习啦在线学习网 BACKPOS:
DEC CS:BYTE PTR [CARPOS]
JMP OUTCH
学习啦在线学习网 CONSTAT: ;System call 11
CALL STATCHK
MOV AL,0
学习啦在线学习网 JZ RET19
学习啦在线学习网 OR AL,-1
RET
学习啦在线学习网 CONIN: ;System call 1
CALL IN
PUSH AX
CALL OUT
POP AX
RET
IN: ;System call 8
CALL INCHK
JZ IN
RET29: RET
RAWIO: ;System call 6
MOV AL,DL
CMP AL,-1
JNZ RAWOUT
LDS SI,DWORD PTR CS:[SPSAVE] ;Get pointer to register save area
学习啦在线学习网 CALL FAR PTR BIOSSTAT
学习啦在线学习网 JNZ RESFLG
学习啦在线学习网 OR BYTE PTR [SI.FSAVE],40H ;Set user's zero flag
学习啦在线学习网 XOR AL,AL
RET
RESFLG:
学习啦在线学习网 AND BYTE PTR [SI.FSAVE],0FFH-40H ;Reset user's zero flag
RAWINP: ;System call 7
CALL FAR PTR BIOSIN
RET
RAWOUT:
学习啦在线学习网 CALL FAR PTR BIOSOUT
RET
LIST: ;System call 5
MOV AL,DL
学习啦在线学习网 LISTOUT:
PUSH AX
CALL STATCHK
POP AX
学习啦在线学习网 CALL FAR PTR BIOSPRINT
RET20: RET
PRTBUF: ;System call 9
MOV SI,DX
OUTSTR:
LODSB
学习啦在线学习网 CMP AL,"$"
JZ RET20
学习啦在线学习网 CALL OUT
JMP SHORT OUTSTR
OUTMES: ;String output for internal messages
LODS CS:BYTE PTR [SI]
CMP AL,"$"
JZ RET20
学习啦在线学习网 CALL OUT
学习啦在线学习网 JMP SHORT OUTMES
学习啦在线学习网 MAKEFCB: ;Interrupt call 41
学习啦在线学习网 DRVBIT EQU 2
学习啦在线学习网 NAMBIT EQU 4
EXTBIT EQU 8
MOV DL,0 ;Flag--not ambiguous file name
学习啦在线学习网 TEST AL,DRVBIT ;Use current drive field if default?
JNZ DEFDRV
学习啦在线学习网 MOV BYTE PTR ES:[DI],0 ;No - use default drive
DEFDRV:
INC DI
MOV CX,8
TEST AL,NAMBIT ;Use current name fiels as defualt?
学习啦在线学习网 XCHG AX,BX ;Save bits in BX
MOV AL," "
JZ FILLB ;If not, go fill with blanks
学习啦在线学习网 ADD DI,CX
XOR CX,CX ;Don't fill any
FILLB:
REP STOSB
MOV CL,3
TEST BL,EXTBIT ;Use current extension as default
学习啦在线学习网 JZ FILLB2
ADD DI,CX
学习啦在线学习网 XOR CX,CX
FILLB2:
REP STOSB
XCHG AX,CX ;Put zero in AX
STOSW
学习啦在线学习网 STOSW ;Initialize two words after to zero
SUB DI,16 ;Point back at start
学习啦在线学习网 TEST BL,1 ;Scan off separators if not zero
学习啦在线学习网 JZ SKPSPC
学习啦在线学习网 CALL SCANB ;Peel off blanks and tabs
CALL DELIM ;Is it a one-time-only delimiter?
JNZ NOSCAN
学习啦在线学习网 INC SI ;Skip over the delimiter
SKPSPC:
学习啦在线学习网 CALL SCANB ;Always kill preceding blanks and tabs
NOSCAN:
学习啦在线学习网 CALL GETLET
学习啦在线学习网 JBE NODRV ;Quit if termination character
CMP BYTE PTR[SI],":" ;Check for potential drive specifier
学习啦在线学习网 JNZ NODRV
INC SI ;Skip over colon
学习啦在线学习网 SUB AL,"@" ;Convert drive letter to binary drive number
JBE BADDRV ;Valid drive numbers are 1-15
CMP AL,CS:[NUMDRV]
JBE HAVDRV
BADDRV:
MOV DL,-1
HAVDRV:
STOSB ;Put drive specifier in first byte
INC SI
DEC DI ;Counteract next two instructions
NODRV:
学习啦在线学习网 DEC SI ;Back up
INC DI ;Skip drive byte
MOV CX,8
CALL GETWORD ;Get 8-letter file name
CMP BYTE PTR [SI],"."
学习啦在线学习网 JNZ NODOT
学习啦在线学习网 INC SI ;Skip over dot if present
学习啦在线学习网 MOV CX,3 ;Get 3-letter extension
学习啦在线学习网 CALL MUSTGETWORD
NODOT:
学习啦在线学习网 LDS BX,CS:DWORD PTR [SPSAVE]
学习啦在线学习网 MOV [BX.SISAVE],SI
MOV AL,DL
RET
NONAM:
学习啦在线学习网 ADD DI,CX
DEC SI
RET
学习啦在线学习网 GETWORD:
学习啦在线学习网 CALL GETLET
JBE NONAM ;Exit if invalid character
DEC SI
MUSTGETWORD:
CALL GETLET
学习啦在线学习网 JBE FILLNAM
JCXZ MUSTGETWORD
DEC CX
学习啦在线学习网 CMP AL,"*" ;Check for ambiguous file specifier
JNZ NOSTAR
学习啦在线学习网 MOV AL,"?"
REP STOSB
NOSTAR:
STOSB
CMP AL,"?"
JNZ MUSTGETWORD
OR DL,1 ;Flag ambiguous file name
学习啦在线学习网 JMP MUSTGETWORD
FILLNAM:
MOV AL," "
REP STOSB
DEC SI
RET21: RET
SCANB:
LODSB
CALL SPCHK
学习啦在线学习网 JZ SCANB
DEC SI
RET
GETLET:
;Get a byte from [SI], convert it to upper case, and compare for delimiter.
学习啦在线学习网 ;ZF set if a delimiter, CY set if a control character (other than TAB).
LODSB
AND AL,7FH
CMP AL,"a"
JB CHK
学习啦在线学习网 CMP AL,"z"
JA CHK
SUB AL,20H ;Convert to upper case
CHK:
学习啦在线学习网 CMP AL,"."
JZ RET21
CMP AL,'"'
JZ RET21
CMP AL,"/"
JZ RET21
CMP AL,"["
JZ RET21
CMP AL,"]"
学习啦在线学习网 JZ RET21
IF IBM
DELIM:
ENDIF
学习啦在线学习网 CMP AL,":" ;Allow ":" as separator in IBM version
学习啦在线学习网 JZ RET21
学习啦在线学习网 IF NOT IBM
DELIM:
ENDIF
CMP AL,"+"
学习啦在线学习网 JZ RET101
CMP AL,"="
学习啦在线学习网 JZ RET101
学习啦在线学习网 CMP AL,";"
JZ RET101
学习啦在线学习网 CMP AL,","
JZ RET101
SPCHK:
学习啦在线学习网 CMP AL,9 ;Filter out tabs too
学习啦在线学习网 JZ RET101
;WARNING! " " MUST be the last compare
学习啦在线学习网 CMP AL," "
学习啦在线学习网 RET101: RET
学习啦在线学习网 SETVECT: ; Interrupt call 37
学习啦在线学习网 XOR BX,BX
MOV ES,BX
MOV BL,AL
SHL BX,1
学习啦在线学习网 SHL BX,1
MOV ES:[BX],DX
MOV ES:[BX+2],DS
RET
NEWBASE: ; Interrupt call 38
MOV ES,DX
学习啦在线学习网 LDS SI,CS:DWORD PTR [SPSAVE]
MOV DS,[SI.CSSAVE]
XOR SI,SI
MOV DI,SI
学习啦在线学习网 MOV AX,DS:[2]
MOV CX,80H
REP MOVSW
SETMEM:
学习啦在线学习网 ; Inputs:
; AX = Size of memory in paragraphs
学习啦在线学习网 ; DX = Segment
学习啦在线学习网 ; Function:
学习啦在线学习网 ; Completely prepares a program base at the
学习啦在线学习网 ; specified segment.
学习啦在线学习网 ; Outputs:
学习啦在线学习网 ; DS = DX
学习啦在线学习网 ; ES = DX
学习啦在线学习网 ; [0] has INT 20H
; [2] = First unavailable segment ([ENDMEM])
学习啦在线学习网 ; [5] to [9] form a long call to the entry point
; [10] to [13] have exit address (from INT 22H)
; [14] to [17] have ctrl-C exit address (from INT 23H)
; [18] to [21] have fatal error address (from INT 24H)
学习啦在线学习网 ; DX,BP unchanged. All other registers destroyed.
XOR CX,CX
MOV DS,CX
学习啦在线学习网 MOV ES,DX
MOV SI,EXIT
学习啦在线学习网 MOV DI,SAVEXIT
MOVSW
MOVSW
MOVSW
MOVSW
MOVSW
MOVSW
学习啦在线学习网 MOV ES:[2],AX
SUB AX,DX
CMP AX,MAXDIF
JBE HAVDIF
MOV AX,MAXDIF
HAVDIF:
MOV BX,ENTRYPOINTSEG
学习啦在线学习网 SUB BX,AX
学习啦在线学习网 SHL AX,1
SHL AX,1
学习啦在线学习网 SHL AX,1
SHL AX,1
学习啦在线学习网 MOV DS,DX
MOV DS:[6],AX
学习啦在线学习网 MOV DS:[8],BX
MOV DS:[0],20CDH ;"INT INTTAB"
学习啦在线学习网 MOV DS:(BYTE PTR [5]),LONGCALL
RET
DATE16:
PUSH CX
学习啦在线学习网 CALL READTIME
SHL CL,1 ;Minutes to left part of byte
SHL CL,1
SHL CX,1 ;Push hours and minutes to left end
SHL CX,1
SHL CX,1
学习啦在线学习网 SHR DH,1 ;Count every two seconds
学习啦在线学习网 OR CL,DH ;Combine seconds with hours and minutes
MOV DX,CX
POP CX
学习啦在线学习网 MOV AX,WORD PTR [MONTH] ;Fetch month and year
SHL AL,1 ;Push month to left to make room for day
SHL AL,1
学习啦在线学习网 SHL AL,1
学习啦在线学习网 SHL AL,1
学习啦在线学习网 SHL AX,1
学习啦在线学习网 OR AL,[DAY]
学习啦在线学习网 RET22: RET
FOURYEARS EQU 3*365+366
READTIME:
学习啦在线学习网 ;Gets time in CX:DX. Figures new date if it has changed.
;Uses AX, CX, DX.
CALL FAR PTR BIOSGETTIME
学习啦在线学习网 CMP AX,[DAYCNT] ;See if day count is the same
JZ RET22
CMP AX,FOURYEARS*30 ;Number of days in 120 years
学习啦在线学习网 JAE RET22 ;Ignore if too large
MOV [DAYCNT],AX
PUSH SI
PUSH CX
PUSH DX ;Save time
XOR DX,DX
MOV CX,FOURYEARS ;Number of days in 4 years
DIV CX ;Compute number of 4-year units
SHL AX,1
SHL AX,1
学习啦在线学习网 SHL AX,1 ;Multiply by 8 (no. of half-years)
MOV CX,AX ;<240 implies AH=0
学习啦在线学习网 MOV SI,OFFSET DOSGROUP:YRTAB ;Table of days in each year
CALL DSLIDE ;Find out which of four years we're in
SHR CX,1 ;Convert half-years to whole years
JNC SK ;Extra half-year?
学习啦在线学习网 ADD DX,200
SK:
CALL SETYEAR
MOV CL,1 ;At least at first month in year
学习啦在线学习网 MOV SI,OFFSET DOSGROUP:MONTAB ;Table of days in each month
学习啦在线学习网 CALL DSLIDE ;Find out which month we're in
MOV [MONTH],CL
INC DX ;Remainder is day of month (start with one)
MOV [DAY],DL
CALL WKDAY ;Set day of week
POP DX
POP CX
POP SI
RET23: RET
DSLIDE:
MOV AH,0
学习啦在线学习网 DSLIDE1:
LODSB ;Get count of days
CMP DX,AX ;See if it will fit
JB RET23 ;If not, done
SUB DX,AX
学习啦在线学习网 INC CX ;Count one more month/year
JMP SHORT DSLIDE1
SETYEAR:
学习啦在线学习网 ;Set year with value in CX. Adjust length of February for this year.
MOV BYTE PTR [YEAR],CL
CHKYR:
TEST CL,3 ;Check for leap year
学习啦在线学习网 MOV AL,28
学习啦在线学习网 JNZ SAVFEB ;28 days if no leap year
INC AL ;Add leap day
SAVFEB:
学习啦在线学习网 MOV [MONTAB+1],AL ;Store for February
RET
学习啦在线学习网 ;Days in year
YRTAB DB 200,166 ;Leap year
DB 200,165
DB 200,165
DB 200,165
;Days of each month
学习啦在线学习网 MONTAB DB 31 ;January
DB 28 ;February--reset each time year changes
DB 31 ;March
DB 30 ;April
学习啦在线学习网 DB 31 ;May
学习啦在线学习网 DB 30 ;June
学习啦在线学习网 DB 31 ;July
DB 31 ;August
DB 30 ;September
学习啦在线学习网 DB 31 ;October
DB 30 ;November
DB 31 ;December
学习啦在线学习网 GETDATE: ;Function call 42
PUSH CS
POP DS
学习啦在线学习网 CALL READTIME ;Check for rollover to next day
学习啦在线学习网 MOV AX,[YEAR]
MOV BX,WORD PTR [DAY]
LDS SI,DWORD PTR [SPSAVE] ;Get pointer to user registers
MOV [SI.DXSAVE],BX ;DH=month, DL=day
学习啦在线学习网 ADD AX,1980 ;Put bias back
学习啦在线学习网 MOV [SI.CXSAVE],AX ;CX=year
学习啦在线学习网 MOV AL,CS:[WEEKDAY]
RET24: RET
SETDATE: ;Function call 43
MOV AL,-1 ;Be ready to flag error
SUB CX,1980 ;Fix bias in year
学习啦在线学习网 JC RET24 ;Error if not big enough
学习啦在线学习网 CMP CX,119 ;Year must be less than 2100
JA RET24
OR DH,DH
学习啦在线学习网 JZ RET24
学习啦在线学习网 OR DL,DL
学习啦在线学习网 JZ RET24 ;Error if either month or day is 0
CMP DH,12 ;Check against max. month
JA RET24
PUSH CS
POP DS
CALL CHKYR ;Set Feb. up for new year
MOV AL,DH
学习啦在线学习网 MOV BX,OFFSET DOSGROUP:MONTAB-1
XLAT ;Look up days in month
CMP AL,DL
学习啦在线学习网 MOV AL,-1 ;Restore error flag, just in case
JB RET24 ;Error if too many days
学习啦在线学习网 CALL SETYEAR
学习啦在线学习网 MOV WORD PTR [DAY],DX ;Set both day and month
SHR CX,1
SHR CX,1
学习啦在线学习网 MOV AX,FOURYEARS
学习啦在线学习网 MOV BX,DX
MUL CX
MOV CL,BYTE PTR [YEAR]
AND CL,3
学习啦在线学习网 MOV SI,OFFSET DOSGROUP:YRTAB
学习啦在线学习网 MOV DX,AX
学习啦在线学习网 SHL CX,1 ;Two entries per year, so double count
学习啦在线学习网 CALL DSUM ;Add up the days in each year
学习啦在线学习网 MOV CL,BH ;Month of year
MOV SI,OFFSET DOSGROUP:MONTAB
学习啦在线学习网 DEC CX ;Account for months starting with one
CALL DSUM ;Add up days in each month
学习啦在线学习网 MOV CL,BL ;Day of month
DEC CX ;Account for days starting with one
ADD DX,CX ;Add in to day total
学习啦在线学习网 XCHG AX,DX ;Get day count in AX
MOV [DAYCNT],AX
CALL FAR PTR BIOSSETDATE
WKDAY:
MOV AX,[DAYCNT]
学习啦在线学习网 XOR DX,DX
学习啦在线学习网 MOV CX,7
INC AX
INC AX ;First day was Tuesday
DIV CX ;Compute day of week
MOV [WEEKDAY],DL
XOR AL,AL ;Flag OK
学习啦在线学习网 RET25: RET
DSUM:
学习啦在线学习网 MOV AH,0
学习啦在线学习网 JCXZ RET25
DSUM1:
LODSB
学习啦在线学习网 ADD DX,AX
学习啦在线学习网 LOOP DSUM1
RET
学习啦在线学习网 GETTIME: ;Function call 44
PUSH CS
POP DS
学习啦在线学习网 CALL READTIME
LDS SI,DWORD PTR [SPSAVE] ;Get pointer to user registers
MOV [SI.DXSAVE],DX
MOV [SI.CXSAVE],CX
学习啦在线学习网 XOR AL,AL
RET26: RET
学习啦在线学习网 SETTIME: ;Function call 45
;Time is in CX:DX in hours, minutes, seconds, 1/100 sec.
MOV AL,-1 ;Flag in case of error
CMP CH,24 ;Check hours
学习啦在线学习网 JAE RET26
CMP CL,60 ;Check minutes
学习啦在线学习网 JAE RET26
CMP DH,60 ;Check seconds
JAE RET26
学习啦在线学习网 CMP DL,100 ;Check 1/100's
学习啦在线学习网 JAE RET26
CALL FAR PTR BIOSSETTIME
学习啦在线学习网 XOR AL,AL
RET
; Default handler for division overflow trap
DIVOV:
PUSH SI
PUSH AX
MOV SI,OFFSET DOSGROUP:DIVMES
学习啦在线学习网 CALL OUTMES
POP AX
POP SI
学习啦在线学习网 INT 23H ;Use Ctrl-C abort on divide overflow
IRET
CODSIZ EQU $-CODSTRT ;Size of code segment
学习啦在线学习网 CODE ENDS
;***** DATA AREA *****
CONSTANTS SEGMENT BYTE
ORG 0
CONSTRT EQU $ ;Start of constants segment
IONAME:
IF NOT IBM
学习啦在线学习网 DB "PRN ","LST ","NUL ","AUX ","CON "
ENDIF
IF IBM
学习啦在线学习网 DB "COM1","PRN ","LPT1","NUL ","AUX ","CON "
ENDIF
学习啦在线学习网 DIVMES DB 13,10,"Divide overflow",13,10,"$"
学习啦在线学习网 CARPOS DB 0
学习啦在线学习网 STARTPOS DB 0
学习啦在线学习网 PFLAG DB 0
DIRTYDIR DB 0 ;Dirty buffer flag
NUMDRV DB 0 ;Number of drives
NUMIO DB ? ;Number of disk tables
VERFLG DB 0 ;Initialize with verify off
CONTPOS DW 0
DMAADD DW 80H ;User's disk transfer address (disp/seg)
DW ?
学习啦在线学习网 ENDMEM DW ?
学习啦在线学习网 MAXSEC DW 0
BUFFER DW ?
BUFSECNO DW 0
学习啦在线学习网 BUFDRVNO DB -1
DIRTYBUF DB 0
BUFDRVBP DW ?
DIRBUFID DW -1
DAY DB 0
学习啦在线学习网 MONTH DB 0
学习啦在线学习网 YEAR DW 0
学习啦在线学习网 DAYCNT DW -1
WEEKDAY DB 0
CURDRV DB 0 ;Default to drive A
学习啦在线学习网 DRVTAB DW 0 ;Address of start of DPBs
DOSLEN EQU CODSIZ+($-CONSTRT) ;Size of CODE + CONSTANTS segments
CONSTANTS ENDS
DATA SEGMENT WORD
; Init code overlaps with data area below
ORG 0
INBUF DB 128 DUP (?)
CONBUF DB 131 DUP (?) ;The rest of INBUF and console buffer
学习啦在线学习网 LASTENT DW ?
EXITHOLD DB 4 DUP (?)
FATBASE DW ?
学习啦在线学习网 NAME1 DB 11 DUP (?) ;File name buffer
ATTRIB DB ?
NAME2 DB 11 DUP (?)
NAME3 DB 12 DUP (?)
EXTFCB DB ?
;WARNING - the following two items are accessed as a word
学习啦在线学习网 CREATING DB ?
DELALL DB ?
学习啦在线学习网 TEMP LABEL WORD
SPSAVE DW ?
学习啦在线学习网 SSSAVE DW ?
学习啦在线学习网 CONTSTK DW ?
学习啦在线学习网 SECCLUSPOS DB ? ;Position of first sector within cluster
学习啦在线学习网 DSKERR DB ?
TRANS DB ?
PREREAD DB ? ;0 means preread; 1 means optional
学习啦在线学习网 READOP DB ?
THISDRV DB ?
EVEN
FCB DW ? ;Address of user FCB
学习啦在线学习网 NEXTADD DW ?
学习啦在线学习网 RECPOS DB 4 DUP (?)
学习啦在线学习网 RECCNT DW ?
LASTPOS DW ?
CLUSNUM DW ?
SECPOS DW ? ;Position of first sector accessed
VALSEC DW ? ;Number of valid (previously written) sectors
学习啦在线学习网 BYTSECPOS DW ? ;Position of first byte within sector
BYTPOS DB 4 DUP (?) ;Byte position in file of access
学习啦在线学习网 BYTCNT1 DW ? ;No. of bytes in first sector
BYTCNT2 DW ? ;No. of bytes in last sector
学习啦在线学习网 SECCNT DW ? ;No. of whole sectors
学习啦在线学习网 ENTFREE DW ?
学习啦在线学习网 DB 80H DUP (?) ;Stack space
学习啦在线学习网 IOSTACK LABEL BYTE
学习啦在线学习网 DB 80H DUP (?)
学习啦在线学习网 DSKSTACK LABEL BYTE
IF DSKTEST
NSS DW ?
学习啦在线学习网 NSP DW ?
ENDIF
DIRBUF LABEL WORD
;Init code below overlaps with data area above
ORG 0
MOVFAT:
;This section of code is safe from being overwritten by block move
REP MOVS BYTE PTR [DI],[SI]
CLD
MOV ES:[DMAADD+2],DX
MOV SI,[DRVTAB] ;Address of first DPB
学习啦在线学习网 MOV AL,-1
MOV CL,[NUMIO] ;Number of DPBs
FLGFAT:
MOV DI,ES:[SI.FAT] ;get pointer to FAT
DEC DI ;Point to dirty byte
学习啦在线学习网 STOSB ;Flag as unused
学习啦在线学习网 ADD SI,DPBSIZ ;Point to next DPB
LOOP FLGFAT
学习啦在线学习网 MOV AX,[ENDMEM]
学习啦在线学习网 CALL SETMEM ;Set up segment
学习啦在线学习网 XXX PROC FAR
RET
学习啦在线学习网 XXX ENDP
DOSINIT:
CLI
CLD
PUSH CS
POP ES
MOV ES:[ENDMEM],DX
LODSB ;Get no. of drives & no. of I/O drivers
MOV ES:[NUMIO],AL
MOV DI,OFFSET DOSGROUP:MEMSTRT
PERDRV:
MOV BP,DI
MOV AL,ES:[DRVCNT]
STOSB ;DEVNUM
LODSB ;Physical unit no.
学习啦在线学习网 STOSB ;DRVNUM
CMP AL,15
学习啦在线学习网 JA BADINIT
学习啦在线学习网 CBW ;Index into FAT size table
SHL AX,1
ADD AX,OFFSET DOSGROUP:FATSIZTAB
XCHG BX,AX
LODSW ;Pointer to DPT
PUSH SI
学习啦在线学习网 MOV SI,AX
LODSW
学习啦在线学习网 STOSW ;SECSIZ
MOV DX,AX
CMP AX,ES:[MAXSEC]
JBE NOTMAX
学习啦在线学习网 MOV ES:[MAXSEC],AX
NOTMAX:
LODSB
DEC AL
学习啦在线学习网 STOSB ;CLUSMSK
学习啦在线学习网 JZ HAVSHFT
CBW
学习啦在线学习网 FIGSHFT:
INC AH
SAR AL,1
学习啦在线学习网 JNZ FIGSHFT
学习啦在线学习网 MOV AL,AH
HAVSHFT:
学习啦在线学习网 STOSB ;CLUSSHFT
学习啦在线学习网 MOVSW ;FIRFAT (= number of reserved sectors)
MOVSB ;FATCNT
MOVSW ;MAXENT
MOV AX,DX ;SECSIZ again
MOV CL,5
SHR AX,CL
学习啦在线学习网 MOV CX,AX ;Directory entries per sector
DEC AX
学习啦在线学习网 ADD AX,ES:[BP.MAXENT]
XOR DX,DX
DIV CX
学习啦在线学习网 STOSW ;DIRSEC (temporarily)
MOVSW ;DSKSIZ (temporarily)
FNDFATSIZ:
MOV AL,1
MOV DX,1
学习啦在线学习网 GETFATSIZ:
PUSH DX
CALL FIGFATSIZ
POP DX
学习啦在线学习网 CMP AL,DL ;Compare newly computed FAT size with trial
JZ HAVFATSIZ ;Has sequence converged?
学习啦在线学习网 CMP AL,DH ;Compare with previous trial
MOV DH,DL
MOV DL,AL ;Shuffle trials
JNZ GETFATSIZ ;Continue iterations if not oscillating
DEC WORD PTR ES:[BP.DSKSIZ] ;Damp those oscillations
学习啦在线学习网 JMP SHORT FNDFATSIZ ;Try again
BADINIT:
MOV SI,OFFSET DOSGROUP:BADMES
学习啦在线学习网 CALL OUTMES
STI
HLT
学习啦在线学习网 HAVFATSIZ:
学习啦在线学习网 STOSB ;FATSIZ
MUL ES:BYTE PTR[BP.FATCNT] ;Space occupied by all FATs
ADD AX,ES:[BP.FIRFAT]
STOSW ;FIRDIR
学习啦在线学习网 ADD AX,ES:[BP.DIRSEC]
MOV ES:[BP.FIRREC],AX ;Destroys DIRSEC
学习啦在线学习网 CALL FIGMAX
学习啦在线学习网 MOV ES:[BP.MAXCLUS],CX
学习啦在线学习网 MOV AX,BX ;Pointer into FAT size table
学习啦在线学习网 STOSW ;Allocate space for FAT pointer
MOV AL,ES:[BP.FATSIZ]
学习啦在线学习网 XOR AH,AH
MUL ES:[BP.SECSIZ]
学习啦在线学习网 CMP AX,ES:[BX] ;Bigger than already allocated
学习啦在线学习网 JBE SMFAT
学习啦在线学习网 MOV ES:[BX],AX
SMFAT:
POP SI ;Restore pointer to init. table
MOV AL,ES:[DRVCNT]
INC AL
MOV ES:[DRVCNT],AL
CMP AL,ES:[NUMIO]
学习啦在线学习网 JAE CONTINIT
JMP PERDRV
BADINITJ:
JMP BADINIT
CONTINIT:
PUSH CS
POP DS
;Calculate true address of buffers, FATs, free space
MOV BP,[MAXSEC]
学习啦在线学习网 MOV AX,OFFSET DOSGROUP:DIRBUF
学习啦在线学习网 ADD AX,BP
学习啦在线学习网 MOV [BUFFER],AX ;Start of buffer
ADD AX,BP
MOV [DRVTAB],AX ;Start of DPBs
学习啦在线学习网 SHL BP,1 ;Two sectors - directory and buffer
ADD BP,DI ;Allocate buffer space
ADD BP,ADJFAC ;True address of FATs
PUSH BP
学习啦在线学习网 MOV SI,OFFSET DOSGROUP:FATSIZTAB
MOV DI,SI
学习啦在线学习网 MOV CX,16
学习啦在线学习网 TOTFATSIZ:
学习啦在线学习网 INC BP ;Add one for Dirty byte
INC BP ;Add one for I/O device number
学习啦在线学习网 LODSW ;Get size of this FAT
学习啦在线学习网 XCHG AX,BP
STOSW ;Save address of this FAT
ADD BP,AX ;Compute size of next FAT
学习啦在线学习网 CMP AX,BP ;If size was zero done
学习啦在线学习网 LOOPNZ TOTFATSIZ
MOV AL,15
学习啦在线学习网 SUB AL,CL ;Compute number of FATs used
学习啦在线学习网 MOV [NUMDRV],AL
学习啦在线学习网 XOR AX,AX ;Set zero flag
学习啦在线学习网 REPZ SCASW ;Make sure all other entries are zero
JNZ BADINITJ
ADD BP,15 ;True start of free space
MOV CL,4
学习啦在线学习网 SHR BP,CL ;First free segment
MOV DX,CS
学习啦在线学习网 ADD DX,BP
学习啦在线学习网 MOV BX,0FH
学习啦在线学习网 MOV CX,[ENDMEM]
CMP CX,1 ;Use memory scan?
学习啦在线学习网 JNZ SETEND
MOV CX,DX ;Start scanning just after DOS
MEMSCAN:
INC CX
JZ SETEND
MOV DS,CX
MOV AL,[BX]
NOT AL
MOV [BX],AL
学习啦在线学习网 CMP AL,[BX]
NOT AL
学习啦在线学习网 MOV [BX],AL
JZ MEMSCAN
SETEND:
学习啦在线学习网 IF HIGHMEM
SUB CX,BP
MOV BP,CX ;Segment of DOS
学习啦在线学习网 MOV DX,CS ;Program segment
ENDIF
学习啦在线学习网 IF NOT HIGHMEM
学习啦在线学习网 MOV BP,CS
ENDIF
; BP has segment of DOS (whether to load high or run in place)
; DX has program segment (whether after DOS or overlaying DOS)
学习啦在线学习网 ; CX has size of memory in paragraphs (reduced by DOS size if HIGHMEM)
学习啦在线学习网 MOV CS:[ENDMEM],CX
IF HIGHMEM
MOV ES,BP
XOR SI,SI
MOV DI,SI
MOV CX,(DOSLEN+1)/2
PUSH CS
POP DS
REP MOVSW ;Move DOS to high memory
ENDIF
学习啦在线学习网 XOR AX,AX
MOV DS,AX
MOV ES,AX
MOV DI,INTBASE
MOV AX,OFFSET DOSGROUP:QUIT
STOSW ;Set abort address--displacement
学习啦在线学习网 MOV AX,BP
MOV BYTE PTR DS:[ENTRYPOINT],LONGJUMP
MOV WORD PTR DS:[ENTRYPOINT+1],OFFSET DOSGROUP:ENTRY
学习啦在线学习网 MOV WORD PTR DS:[ENTRYPOINT+3],AX
学习啦在线学习网 MOV WORD PTR DS:[0],OFFSET DOSGROUP:DIVOV ;Set default divide trap address
学习啦在线学习网 MOV DS:[2],AX
MOV CX,9
REP STOSW ;Set 5 segments (skip 2 between each)
学习啦在线学习网 MOV WORD PTR DS:[INTBASE+4],OFFSET DOSGROUP:COMMAND
MOV WORD PTR DS:[INTBASE+12],OFFSET DOSGROUP:IRET ;Ctrl-C exit
MOV WORD PTR DS:[INTBASE+16],OFFSET DOSGROUP:IRET ;Fatal error exit
学习啦在线学习网 MOV AX,OFFSET BIOSREAD
STOSW
MOV AX,BIOSSEG
STOSW
STOSW ;Add 2 to DI
STOSW
学习啦在线学习网 MOV WORD PTR DS:[INTBASE+18H],OFFSET BIOSWRITE
MOV WORD PTR DS:[EXIT],100H
学习啦在线学习网 MOV WORD PTR DS:[EXIT+2],DX
学习啦在线学习网 IF NOT IBM
MOV SI,OFFSET DOSGROUP:HEADER
CALL OUTMES
ENDIF
PUSH CS
POP DS
PUSH CS
POP ES
;Move the FATs into position
MOV AL,[NUMIO]
CBW
XCHG AX,CX
MOV DI,OFFSET DOSGROUP:MEMSTRT.FAT
学习啦在线学习网 FATPOINT:
MOV SI,WORD PTR [DI] ;Get address within FAT address table
MOVSW ;Set address of this FAT
学习啦在线学习网 ADD DI,DPBSIZ-2 ;Point to next DPB
LOOP FATPOINT
POP CX ;True address of first FAT
MOV SI,OFFSET DOSGROUP:MEMSTRT ;Place to move DPBs from
学习啦在线学习网 MOV DI,[DRVTAB] ;Place to move DPBs to
SUB CX,DI ;Total length of DPBs
CMP DI,SI
学习啦在线学习网 JBE MOVJMP ;Are we moving to higher or lower memory?
学习啦在线学习网 DEC CX ;Move backwards to higher memory
学习啦在线学习网 ADD DI,CX
ADD SI,CX
INC CX
STD
MOVJMP:
学习啦在线学习网 MOV ES,BP
JMP MOVFAT
FIGFATSIZ:
MUL ES:BYTE PTR[BP.FATCNT]
ADD AX,ES:[BP.FIRFAT]
ADD AX,ES:[BP.DIRSEC]
FIGMAX:
学习啦在线学习网 ;AX has equivalent of FIRREC
学习啦在线学习网 SUB AX,ES:[BP.DSKSIZ]
NEG AX
学习啦在线学习网 MOV CL,ES:[BP.CLUSSHFT]
学习啦在线学习网 SHR AX,CL
INC AX
MOV CX,AX ;MAXCLUS
INC AX
MOV DX,AX
学习啦在线学习网 SHR DX,1
ADC AX,DX ;Size of FAT in bytes
MOV SI,ES:[BP.SECSIZ]
学习啦在线学习网 ADD AX,SI
DEC AX
XOR DX,DX
DIV SI
RET
BADMES:
DB 13,10,"INIT TABLE BAD",13,10,"$"
FATSIZTAB:
学习啦在线学习网 DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DRVCNT DB 0
学习啦在线学习网 MEMSTRT LABEL WORD
ADJFAC EQU DIRBUF-MEMSTRT
DATA ENDS
END
学习啦在线学习网 看了“DOS操作系统源码相关资料知识”还想看:
5.操作系统发展简史