home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR13 / OS2ASM.ZIP / GETDOS.ASM < prev    next >
Assembly Source File  |  1991-08-29  |  7KB  |  327 lines

  1. ;_ GETDOS.ASM   Mon Dec 18 1989   Modified by: Walter Bright */
  2. ; $Header$
  3. ;Copyright (C) 1984-1989 by Walter Bright
  4. ;All rights reserved.
  5. ;Written by Walter Bright
  6. ;Modified 22 May 90 by Bob Stout
  7.  
  8. include    macros.asm
  9.  
  10.     begdata
  11.     c_extrn    errno,word
  12.     c_extrn _osmajor,byte
  13. D4CB    STRUC                ;DOS 4 control block
  14.         start       dw      ?
  15.     fill        dw      0
  16.     number      dw      ?
  17.     bufl         dw      ?
  18.     bufh         dw      ?
  19.     d4cbsz        dw    0
  20. D4CB    ENDS
  21.     enddata
  22.  
  23.     c_extrn    _flushterm,near
  24.  
  25.     begcode    getdos
  26.  
  27.     c_public dos_set_verify,dos_get_verify
  28.     c_public dos_set_ctrl_break,dos_get_ctrl_break
  29.     c_public dos_getdiskfreespace
  30. if 0  ;not currently supported
  31.     c_public dos_abs_disk_read,dos_abs_disk_write
  32. endif
  33.     c_public kbhit,getch,getche
  34.     c_public mkdir,rmdir,chdir
  35.     c_public _chdrive,_getdrive
  36.  
  37. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  38. ; Return 1 if key is available from console, else 0
  39.  
  40. func    kbhit
  41.     clr    EAX
  42.     bdos    0Bh    ;check standard input status
  43.     cbw        ;clear AX is now 0 or -1
  44.     neg    AX    ;0 or 1
  45. kbhret:
  46.     ret
  47. c_endp    kbhit
  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 short G1
  56. c_endp    getch
  57.  
  58. ;;;;;;;;;;;;;;;;;;;;;;;;;
  59. ; Get character from keyboard, echo it.
  60.  
  61. func    getche
  62.     call    _flushterm
  63.     mov    AH,1
  64. G1:    bdos            ;get char from kbd, echo it
  65.     clr    AH
  66. gceret:
  67.     ret
  68. c_endp    getche
  69.  
  70. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  71. ; Set/reset verify switch for disk writes.
  72. ; Use:
  73. ;    dos_set_verify(TRUE);    /* turn on verify    */
  74. ;    dos_set_verify(FALSE);    /* turn off verify    */
  75.  
  76. func    dos_set_verify
  77.     push    EBP
  78.     mov    EBP,ESP
  79.     mov    AL,P[EBP]    ;get verify flag
  80.     clr    DL        ;must be 0 for some reason
  81.     bdos    2Eh
  82.     pop    EBP
  83.     ret
  84. c_endp    dos_set_verify
  85.  
  86. ;;;;;;;;;;;;;;;;;;;;;;;;;
  87. ; Get disk verify state.
  88. ; Returns:
  89. ;    TRUE if disk verify is on
  90.  
  91. func    dos_get_verify
  92.     bdos    54h
  93.     cbw            ;clear AH
  94.     ret
  95. c_endp    dos_get_verify
  96.  
  97. ;;;;;;;;;;;;;;;;;;;;;;;;
  98. ; Set/reset Ctrl-Break check.
  99. ; Use:
  100. ;    dos_set_ctrl_break(TRUE);    /* turn on cntrl-break check    */
  101. ;    dos_set_ctrl_break(FALSE);    /* turn off cntrl-break check    */
  102.  
  103. func    dos_set_ctrl_break
  104.     push    EBP
  105.     mov    EBP,ESP
  106.     mov    DX,P[EBP]
  107.     mov    AL,1
  108.     bdos    33h
  109.     pop    EBP
  110.     ret
  111. c_endp    dos_set_ctrl_break
  112.  
  113. ;;;;;;;;;;;;;;;;;;;;;;;;;
  114. ; Get state of Ctrl-Break checking.
  115. ; Returns:
  116. ;    TRUE    on
  117. ;    FALSE    off
  118.  
  119. func    dos_get_ctrl_break
  120.     mov    AX,03300h
  121.     bdos
  122.     mov    AL,DL
  123.     cbw            ;clear    AH
  124.     ret
  125. c_endp    dos_get_ctrl_break
  126.  
  127. ;;;;;;;;;;;;;;;;;;;;;;;;;
  128. ; Get disk free space in bytes.
  129. ; Use:
  130. ;    long = dos_getdiskfreespace(drive);
  131. ; Input:
  132. ;    drive == 0:    default drive
  133. ;    drive == 1:    drive = A:, etc.
  134. ; Returns:
  135. ;    a long
  136. ;    -1L if drive was invalid
  137.  
  138. func    dos_getdiskfreespace
  139.     push    EBP
  140.     mov    EBP,ESP
  141.     uses    EBX
  142.     mov    DX,P[EBP]    ;DL = drive
  143.     bdos    36h
  144.     _ifs    AX ne -1, L1
  145.       clr     EAX
  146.       dec     EAX
  147.       unuse   EBX
  148.       pop     EBP
  149.       ret                     ;return -1L
  150.     ;Compute EAX = EAX*EBX*ECX
  151. L1:    movzx    EAX,AX
  152.     movzx    EBX,BX
  153.     movzx    ECX,CX
  154.     mul    EBX
  155.     mul    ECX
  156.     unuse    EBX
  157.     pop    EBP
  158.     ret
  159. c_endp    dos_getdiskfreespace
  160.  
  161. if 0     ;abs_disk_read and abs_disk_write are not currently supported
  162. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  163. ; Absolute disk read.
  164. ;    int dos_abs_disk_read(drive,numsec,startsec,buffer)
  165. ;    int drive;    /* drive number 0=A, 1=B, ...            */
  166. ;    int numsec;    /* number of sectors to read            */
  167. ;    int startsec;    /* starting logical sector number        */
  168. ;    char *buffer;    /* where the result will be stored        */
  169. ; Returns:
  170. ;    0        /* success                    */
  171. ;    != 0        /* failure (the value is what is described in    */
  172. ;            /* the DOS manual)                */
  173.  
  174. func    dos_abs_disk_read
  175.     mov    AH,1
  176. A4:
  177.     push    EBP
  178.     mov    EBP,ESP
  179.     uses    <ESI,EDI>
  180.     sub    ESP,d4cbsz
  181.     movzx    ECX,byte ptr __osmajor
  182.     mov    ESI,ECX
  183.     mov    AL,P[EBP]        ;drive
  184.     mov    CX,P+2[EBP]        ;numsec
  185.     mov    DX,P+4[EBP]        ;startsec
  186.     push    DS
  187.     push    EBP
  188.     mov    EBX,P+6[EBP]        ;buffer
  189.         cmp    ESI,4            ;DOS 4+?
  190.     jb    A5            ;No, skip it
  191.       mov     -4-d4cbsz+start[EBP],DX  ;Yes, fill in D4CB structure
  192.       mov     -4-d4cbsz+fill[EBP],0
  193.       mov     -4-d4cbsz+number[EBP],CX
  194.       mov     -4-d4cbsz+bufl[EBP],BX
  195.       mov     -4-d4cbsz+bufh[EBP],DS
  196.       mov     CX,-1
  197.       push    SS                      ;Point to DCB
  198.       pop     DS
  199.       mov     EBX,EBP
  200.       sub     EBX,4+d4cbsz
  201. A5:    tst    AH            ;do read or write?
  202.     jz    A3
  203.     int    25h            ;read
  204.     jmps    A2
  205.  
  206. A3:    int    26h            ;write
  207. A2:    jc    A1            ;error (AX has error code)
  208.     clr    EAX            ;no error
  209. A1:    popf                ;clean stack
  210.     pop    EBP
  211.     pop    DS
  212.         add    ESP,d4cbsz        ;forget D4CB structure
  213.     unuse    <EDI,ESI>
  214. adrret:
  215.     pop    EBP
  216.     ret
  217. c_endp    dos_abs_disk_read
  218.  
  219. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  220. ; Absolute disk write.
  221. ;    int dos_abs_disk_write(drive,numsec,startsec,buffer)
  222. ;    int drive;    /* drive number 0=A, 1=B, ...            */
  223. ;    int numsec;    /* number of sectors to write            */
  224. ;    int startsec;    /* starting logical sector number        */
  225. ;    char *buffer;    /* where the result will be read from        */
  226. ; Returns:
  227. ;    0        /* success                    */
  228. ;    != 0        /* failure (the value is what is described in    */
  229. ;            /* the DOS manual)                */
  230.  
  231. func    dos_abs_disk_write
  232.     clr    AH
  233.     jmp    A4        ;use common code
  234. c_endp    dos_abs_disk_write
  235. endif
  236.  
  237. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  238. ; Change directory to that specified by pathname.
  239. ; Usage:
  240. ;    int chdir(char *pathname);
  241. ; Returns:
  242. ;    0    success
  243. ;    -1    failure (errno is set to ENOENT)
  244.  
  245. func    chdir
  246.     mov    AH,03Bh
  247.  
  248. _dodir:    push    EBP
  249.     mov    EBP,ESP
  250.     mov    EDX,P[EBP]
  251.     bdos
  252.     jnc    D1        ;no error
  253.       mov     errno,AX
  254. D1:    sbb    EAX,EAX
  255.     pop    EBP
  256.     ret
  257. c_endp    chdir
  258.  
  259. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  260. ; Create subdirectory given by pathname.
  261. ; Usage:
  262. ;    int mkdir(char *pathname);
  263. ; Returns:
  264. ;    0    success
  265. ;    -1    failure, in which case errno is set to:
  266. ;        ENOENT:    path not found
  267. ;        EACCES:    access denied
  268.  
  269. func    mkdir
  270.     mov    AH,039h
  271.     jmp    _dodir
  272. c_endp    mkdir
  273.  
  274. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  275. ; Remove subdirectory given by pathname.
  276. ; Usage:
  277. ;    int rmdir(char *pathname);
  278. ; Returns:
  279. ;    0    success
  280. ;    -1    failure, in which case errno is set to:
  281. ;        ENOENT:    path not found
  282. ;        EACCES:    access denied or directory is not empty
  283.  
  284. func    rmdir
  285.     mov    AH,03Ah
  286.     jmp    _dodir
  287. c_endp    rmdir
  288.  
  289. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  290. ; int _chdrive(int drive);
  291. ; Returns:
  292. ;    0    success
  293. ;    -1    failure
  294.  
  295. func    _chdrive
  296.     push    EBP
  297.     mov    EBP,ESP
  298.     mov    DL,P[EBP]    ;get drive number
  299.     dec    DL        ;to 0=A, 1=B, etc.
  300.     bdos    0Eh        ;select drive
  301.     bdos    19h        ;read current drive
  302.     sub    AL,DL        ;see if it matches
  303.     jz    CH1        ;yes they do
  304.       mov     AL,0FFh         ;error (return -1)
  305. CH1:    cbw
  306.     pop    EBP
  307.     ret
  308. c_endp    _chdrive
  309.  
  310. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  311. ; int _getdrive(void);
  312. ; Returns:
  313. ;    1=A, 2=B, etc.
  314.  
  315. func    _getdrive
  316.     clr    EAX
  317.     bdos    19h        ;read current drive
  318.     cbw
  319.     inc    EAX
  320.     ret
  321. c_endp    _getdrive
  322.  
  323.     endcode    getdos
  324.  
  325.     end
  326.  
  327.