home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CASM.ARJ / GETDOS.ASM < prev    next >
Encoding:
Assembly Source File  |  1988-08-25  |  5.2 KB  |  270 lines

  1. ;_ getdos.asm   Thu Feb  4 1988   Modified by: Walter Bright */
  2. ; $Header$
  3. ;Copyright (C) 1984-1988 by Northwest Software
  4. ;All rights reserved.
  5. ;Written by Walter Bright
  6.  
  7. include    macros.asm
  8.  
  9.     begdata
  10.     c_extrn    errno,word
  11.     enddata
  12.  
  13.     if LCODE
  14.     c_extrn    _flushterm,far
  15.     else
  16.     c_extrn    _flushterm,near
  17.     endif
  18.  
  19.     begcode    getdos
  20.  
  21.     c_public dos_set_verify,dos_get_verify
  22.     c_public dos_set_ctrl_break,dos_get_ctrl_break
  23.     c_public dos_getdiskfreespace
  24.     c_public dos_abs_disk_read,dos_abs_disk_write
  25.     c_public kbhit,getch,getche
  26.     c_public mkdir,rmdir,chdir
  27.  
  28. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  29. ; Return 1 if key is available from console, else 0
  30.  
  31. func    kbhit
  32.     bdos    0Bh    ;check standard input status
  33.     cbw        ;clear AX is now 0 or -1
  34.     neg    AX    ;0 or 1
  35.     ret
  36. c_endp    kbhit
  37.  
  38. ;;;;;;;;;;;;;;;;;;;;;;;;;
  39. ; Get character from keyboard, echo it.
  40.  
  41. func    getche
  42.     call    _flushterm
  43.     mov    AH,1
  44. G1:    bdos            ;get char from kbd, echo it
  45.     clr    AH
  46.     ret
  47. c_endp    getche
  48.  
  49. ;;;;;;;;;;;;;;;;;;;;;;;;;
  50. ; Get character from keyboard, don't echo it.
  51.  
  52. func    getch
  53.     call    _flushterm
  54.     mov    AH,8            ;get char from kbd, no echo
  55.     jmp    G1
  56. c_endp    getch
  57.  
  58. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  59. ; Set/reset verify switch for disk writes.
  60. ; Use:
  61. ;    dos_set_verify(TRUE);    /* turn on verify    */
  62. ;    dos_set_verify(FALSE);    /* turn off verify    */
  63.  
  64. func    dos_set_verify
  65.     push    BP
  66.     mov    BP,SP
  67.     mov    AL,P[BP]    ;get verify flag
  68.     clr    DL        ;must be 0 for some reason
  69.     bdos    2Eh
  70.     pop    BP
  71.     ret
  72. c_endp    dos_set_verify
  73.  
  74. ;;;;;;;;;;;;;;;;;;;;;;;;;
  75. ; Get disk verify state.
  76. ; Returns:
  77. ;    TRUE if disk verify is on
  78.  
  79. func    dos_get_verify
  80.     bdos    54h
  81.     cbw            ;clear AH
  82.     ret
  83. c_endp    dos_get_verify
  84.  
  85. ;;;;;;;;;;;;;;;;;;;;;;;;
  86. ; Set/reset Ctrl-Break check.
  87. ; Use:
  88. ;    dos_set_ctrl_break(TRUE);    /* turn on cntrl-break check    */
  89. ;    dos_set_ctrl_break(FALSE);    /* turn off cntrl-break check    */
  90.  
  91. func    dos_set_ctrl_break
  92.     push    BP
  93.     mov    BP,SP
  94.     mov    DX,P[BP]
  95.     mov    AL,1
  96.     bdos    33h
  97.     pop    BP
  98.     ret
  99. c_endp    dos_set_ctrl_break
  100.  
  101. ;;;;;;;;;;;;;;;;;;;;;;;;;
  102. ; Get state of Ctrl-Break checking.
  103. ; Returns:
  104. ;    TRUE    on
  105. ;    FALSE    off
  106.  
  107. func    dos_get_ctrl_break
  108.     mov    AX,03300h
  109.     bdos
  110.     mov    AL,DL
  111.     cbw            ;clear    AH
  112.     ret
  113. c_endp    dos_get_ctrl_break
  114.  
  115. ;;;;;;;;;;;;;;;;;;;;;;;;;
  116. ; Get disk free space in bytes.
  117. ; Use:
  118. ;    long = dos_getdiskfreespace(drive);
  119. ; Input:
  120. ;    drive == 0:    default drive
  121. ;    drive == 1:    drive = A:, etc.
  122. ; Returns:
  123. ;    a long
  124. ;    -1L if drive was invalid
  125.  
  126. func    dos_getdiskfreespace
  127.     push    BP
  128.     mov    BP,SP
  129.     mov    DX,P[BP]    ;DL = drive
  130.     bdos    36h
  131.     .if    AX ne -1, L1
  132.     cwd
  133.     pop    BP
  134.     ret            ;return -1L
  135.  
  136.     ;Compute DX,AX = AX*BX*CX
  137. L1:
  138.     mul    BX
  139.     mov    BX,DX
  140.     mul    CX
  141.     add    DX,BX
  142.     pop    BP
  143.     ret
  144. c_endp    dos_getdiskfreespace
  145.  
  146. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  147. ; Absolute disk read.
  148. ;    int dos_abs_disk_read(drive,numsec,startsec,buffer)
  149. ;    int drive;    /* drive number 0=A, 1=B, ...            */
  150. ;    int numsec;    /* number of sectors to read            */
  151. ;    int startsec;    /* starting logical sector number        */
  152. ;    char *buffer;    /* where the result will be stored        */
  153. ; Returns:
  154. ;    0        /* success                    */
  155. ;    != 0        /* failure (the value is what is described in    */
  156. ;            /* the DOS manual)                */
  157.  
  158. func    dos_abs_disk_read
  159.     mov    AH,1
  160. A4:    push    BP
  161.     mov    BP,SP
  162.     .save    <SI,DI>
  163.     mov    AL,P[BP]    ;drive
  164.     mov    CX,P+2[BP]    ;numsec
  165.     mov    DX,P+4[BP]    ;startsec
  166.     if SPTR
  167.     mov    BX,P+6[BP]    ;buffer
  168.     else
  169.     push    DS
  170.     lds    BX,P+6[BP]    ;buffer
  171.     endif
  172.     tst    AH        ;do read or write?
  173.     jz    A3
  174.     int    25h        ;read
  175.     jmps    A2
  176.  
  177. A3:    int    26h        ;write
  178. A2:    jc    A1        ;error (AX has error code)
  179.     clr    AX        ;no error
  180. A1:    popf            ;clean stack
  181.     if LPTR
  182.     pop    DS
  183.     endif
  184.     .restore <DI,SI>
  185.     pop    BP
  186.     ret
  187. c_endp    dos_abs_disk_read
  188.  
  189. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  190. ; Absolute disk write.
  191. ;    int dos_abs_disk_write(drive,numsec,startsec,buffer)
  192. ;    int drive;    /* drive number 0=A, 1=B, ...            */
  193. ;    int numsec;    /* number of sectors to write            */
  194. ;    int startsec;    /* starting logical sector number        */
  195. ;    char *buffer;    /* where the result will be read from        */
  196. ; Returns:
  197. ;    0        /* success                    */
  198. ;    != 0        /* failure (the value is what is described in    */
  199. ;            /* the DOS manual)                */
  200.  
  201. func    dos_abs_disk_write
  202.     clr    AH
  203.     jmp    A4        ;use common code
  204. c_endp    dos_abs_disk_write
  205.  
  206. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  207. ; Change directory to that specified by pathname.
  208. ; Usage:
  209. ;    int chdir(char *pathname);
  210. ; Returns:
  211. ;    0    success
  212. ;    -1    failure (errno is set to ENOENT)
  213.  
  214. func    chdir
  215.     mov    AH,03Bh
  216.  
  217. _dodir:    push    BP
  218.     mov    BP,SP
  219.     if SPTR
  220.     mov    DX,P[BP]
  221.     else
  222.     push    DS
  223.     lds    DX,P[BP]
  224.     endif
  225.     bdos
  226.     if LPTR
  227.     pop    DS
  228.     endif
  229.     jnc    D1        ;no error
  230.     mov    errno,AX
  231. D1:    sbb    AX,AX
  232.     pop    BP
  233.     ret
  234. c_endp    chdir
  235.  
  236. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  237. ; Create subdirectory given by pathname.
  238. ; Usage:
  239. ;    int mkdir(char *pathname);
  240. ; Returns:
  241. ;    0    success
  242. ;    -1    failure, in which case errno is set to:
  243. ;        ENOENT:    path not found
  244. ;        EACCES:    access denied
  245.  
  246. func    mkdir
  247.     mov    AH,039h
  248.     jmp    _dodir
  249. c_endp    mkdir
  250.  
  251. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  252. ; Remove subdirectory given by pathname.
  253. ; Usage:
  254. ;    int rmdir(char *pathname);
  255. ; Returns:
  256. ;    0    success
  257. ;    -1    failure, in which case errno is set to:
  258. ;        ENOENT:    path not found
  259. ;        EACCES:    access denied or directory is not empty
  260.  
  261. func    rmdir
  262.     mov    AH,03Ah
  263.     jmp    _dodir
  264. c_endp    rmdir
  265.  
  266.     endcode    getdos
  267.  
  268.     end
  269.  
  270.