home *** CD-ROM | disk | FTP | other *** search
- ;_ getdos.asm Thu Feb 4 1988 Modified by: Walter Bright */
- ; $Header$
- ;Copyright (C) 1984-1988 by Northwest Software
- ;All rights reserved.
- ;Written by Walter Bright
-
- include macros.asm
-
- begdata
- c_extrn errno,word
- enddata
-
- if LCODE
- c_extrn _flushterm,far
- else
- c_extrn _flushterm,near
- endif
-
- begcode getdos
-
- c_public dos_set_verify,dos_get_verify
- c_public dos_set_ctrl_break,dos_get_ctrl_break
- c_public dos_getdiskfreespace
- c_public dos_abs_disk_read,dos_abs_disk_write
- c_public kbhit,getch,getche
- c_public mkdir,rmdir,chdir
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Return 1 if key is available from console, else 0
-
- func kbhit
- bdos 0Bh ;check standard input status
- cbw ;clear AX is now 0 or -1
- neg AX ;0 or 1
- ret
- c_endp kbhit
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Get character from keyboard, echo it.
-
- func getche
- call _flushterm
- mov AH,1
- G1: bdos ;get char from kbd, echo it
- clr AH
- ret
- c_endp getche
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Get character from keyboard, don't echo it.
-
- func getch
- call _flushterm
- mov AH,8 ;get char from kbd, no echo
- jmp G1
- c_endp getch
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Set/reset verify switch for disk writes.
- ; Use:
- ; dos_set_verify(TRUE); /* turn on verify */
- ; dos_set_verify(FALSE); /* turn off verify */
-
- func dos_set_verify
- push BP
- mov BP,SP
- mov AL,P[BP] ;get verify flag
- clr DL ;must be 0 for some reason
- bdos 2Eh
- pop BP
- ret
- c_endp dos_set_verify
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Get disk verify state.
- ; Returns:
- ; TRUE if disk verify is on
-
- func dos_get_verify
- bdos 54h
- cbw ;clear AH
- ret
- c_endp dos_get_verify
-
- ;;;;;;;;;;;;;;;;;;;;;;;;
- ; Set/reset Ctrl-Break check.
- ; Use:
- ; dos_set_ctrl_break(TRUE); /* turn on cntrl-break check */
- ; dos_set_ctrl_break(FALSE); /* turn off cntrl-break check */
-
- func dos_set_ctrl_break
- push BP
- mov BP,SP
- mov DX,P[BP]
- mov AL,1
- bdos 33h
- pop BP
- ret
- c_endp dos_set_ctrl_break
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Get state of Ctrl-Break checking.
- ; Returns:
- ; TRUE on
- ; FALSE off
-
- func dos_get_ctrl_break
- mov AX,03300h
- bdos
- mov AL,DL
- cbw ;clear AH
- ret
- c_endp dos_get_ctrl_break
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Get disk free space in bytes.
- ; Use:
- ; long = dos_getdiskfreespace(drive);
- ; Input:
- ; drive == 0: default drive
- ; drive == 1: drive = A:, etc.
- ; Returns:
- ; a long
- ; -1L if drive was invalid
-
- func dos_getdiskfreespace
- push BP
- mov BP,SP
- mov DX,P[BP] ;DL = drive
- bdos 36h
- .if AX ne -1, L1
- cwd
- pop BP
- ret ;return -1L
-
- ;Compute DX,AX = AX*BX*CX
- L1:
- mul BX
- mov BX,DX
- mul CX
- add DX,BX
- pop BP
- ret
- c_endp dos_getdiskfreespace
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Absolute disk read.
- ; int dos_abs_disk_read(drive,numsec,startsec,buffer)
- ; int drive; /* drive number 0=A, 1=B, ... */
- ; int numsec; /* number of sectors to read */
- ; int startsec; /* starting logical sector number */
- ; char *buffer; /* where the result will be stored */
- ; Returns:
- ; 0 /* success */
- ; != 0 /* failure (the value is what is described in */
- ; /* the DOS manual) */
-
- func dos_abs_disk_read
- mov AH,1
- A4: push BP
- mov BP,SP
- .save <SI,DI>
- mov AL,P[BP] ;drive
- mov CX,P+2[BP] ;numsec
- mov DX,P+4[BP] ;startsec
- if SPTR
- mov BX,P+6[BP] ;buffer
- else
- push DS
- lds BX,P+6[BP] ;buffer
- endif
- tst AH ;do read or write?
- jz A3
- int 25h ;read
- jmps A2
-
- A3: int 26h ;write
- A2: jc A1 ;error (AX has error code)
- clr AX ;no error
- A1: popf ;clean stack
- if LPTR
- pop DS
- endif
- .restore <DI,SI>
- pop BP
- ret
- c_endp dos_abs_disk_read
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Absolute disk write.
- ; int dos_abs_disk_write(drive,numsec,startsec,buffer)
- ; int drive; /* drive number 0=A, 1=B, ... */
- ; int numsec; /* number of sectors to write */
- ; int startsec; /* starting logical sector number */
- ; char *buffer; /* where the result will be read from */
- ; Returns:
- ; 0 /* success */
- ; != 0 /* failure (the value is what is described in */
- ; /* the DOS manual) */
-
- func dos_abs_disk_write
- clr AH
- jmp A4 ;use common code
- c_endp dos_abs_disk_write
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Change directory to that specified by pathname.
- ; Usage:
- ; int chdir(char *pathname);
- ; Returns:
- ; 0 success
- ; -1 failure (errno is set to ENOENT)
-
- func chdir
- mov AH,03Bh
-
- _dodir: push BP
- mov BP,SP
- if SPTR
- mov DX,P[BP]
- else
- push DS
- lds DX,P[BP]
- endif
- bdos
- if LPTR
- pop DS
- endif
- jnc D1 ;no error
- mov errno,AX
- D1: sbb AX,AX
- pop BP
- ret
- c_endp chdir
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Create subdirectory given by pathname.
- ; Usage:
- ; int mkdir(char *pathname);
- ; Returns:
- ; 0 success
- ; -1 failure, in which case errno is set to:
- ; ENOENT: path not found
- ; EACCES: access denied
-
- func mkdir
- mov AH,039h
- jmp _dodir
- c_endp mkdir
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Remove subdirectory given by pathname.
- ; Usage:
- ; int rmdir(char *pathname);
- ; Returns:
- ; 0 success
- ; -1 failure, in which case errno is set to:
- ; ENOENT: path not found
- ; EACCES: access denied or directory is not empty
-
- func rmdir
- mov AH,03Ah
- jmp _dodir
- c_endp rmdir
-
- endcode getdos
-
- end
-
-