home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CASM.ARJ / IO.ASM < prev    next >
Assembly Source File  |  1988-05-17  |  7KB  |  381 lines

  1. ;_ io.asm   Thu Apr 21 1988   Modified by: Walter Bright */
  2. ;Copyright (C) 1985-1988 by Northwest Software
  3. ;All Rights Reserved
  4. ;Written by Walter Bright
  5.  
  6.     include    MACROS.ASM
  7.  
  8.     begdata
  9.     c_extrn    errno,word
  10.     enddata
  11.  
  12.     begcode    io
  13.  
  14.     c_public read,write,open,close,creat,unlink,lseek,getDS,filesize,rename
  15.     c_public dos_creat
  16.     c_public isatty,remove
  17.     if SPTR
  18.     c_public _readx,_writex
  19.     endif
  20.  
  21. ;;;;;;;;;;;;;;;;;;;;;;;;;
  22. ; Read data from a file.
  23. ; Use:
  24. ;    read(fd,buffer,length)
  25. ; Returns:
  26. ;    -1    error
  27. ;    0    end of file
  28. ;    n    number of bytes actually read
  29. ;
  30.  
  31. func    read
  32.     mov    AH,3Fh            ;read from file or device
  33. F4:    push    BP
  34.     mov     BP,SP
  35.     mov    BX,P[BP]        ;BX = fd (file handle)
  36.     if SPTR
  37.     mov    DX,P+2[BP]        ;DX = buffer address
  38.     mov    CX,P+2+SIZEPTR[BP]    ;CX = number of bytes to read/write
  39.     bdos                ;read/write from/to file or device
  40.     else
  41.     push    DS
  42.     lds    DX,P+2[BP]        ;DS:DX = buffer address
  43.     mov    CX,P+2+SIZEPTR[BP]    ;CX = number of bytes to read
  44.     bdos                ;read from file or device
  45.     pop    DS
  46.     endif
  47. F2:    jnc    F1            ;no error
  48.     mov    errno,AX        ;save DOS error number
  49.     sbb    AX,AX            ;error
  50. F1:    pop     BP
  51.     ret
  52. c_endp    read
  53.  
  54.  
  55. ;;;;;;;;;;;;;;;;;;;;;;;;;
  56. ; Read data from a file.
  57. ; Use:
  58. ;    _readx(fd,buffer,length,segment)
  59. ; Returns:
  60. ;    -1    error
  61. ;    0    end of file
  62. ;    n    number of bytes actually read
  63. ;
  64.  
  65.     if SPTR
  66. func    _readx
  67.     mov    AH,3Fh            ;read from file or device
  68. F3:    push    BP
  69.     mov     BP,SP
  70.     mov    BX,P[BP]        ;BX = fd (file handle)
  71.     mov    DX,P+2[BP]        ;DX = buffer address
  72.     mov    CX,P+4[BP]        ;CX = number of bytes to read/write
  73.     push    DS
  74.     mov    DS,P+6[BP]        ;DS = segment of buffer
  75.     bdos                ;read/write from file or device
  76.     pop    DS
  77.     jmps    F2
  78. c_endp    _readx
  79.     endif
  80.  
  81.  
  82. ;;;;;;;;;;;;;;;;;;;;;;;;;
  83. ; Write data to a file.
  84. ; Use:
  85. ;    int write(fd,buffer,length)
  86. ; Returns:
  87. ;    -1    error
  88. ;    n    number of bytes actually written
  89. ;
  90.  
  91. func    write
  92.     mov    AH,40h            ;write to file or device
  93.     jmps    F4
  94. c_endp    write
  95.  
  96. ;;;;;;;;;;;;;;;;;;;;;;;;;
  97. ; Write data to a file.
  98. ; Use:
  99. ;    int _writex(fd,buffer,length,segment)
  100. ; Returns:
  101. ;    -1    error
  102. ;    n    number of bytes actually written
  103. ;
  104.  
  105.     if SPTR
  106. func    _writex
  107.     mov    AH,40h            ;write to file or device
  108.     jmps    F3
  109. c_endp    _writex
  110.     endif
  111.  
  112. ;;;;;;;;;;;;;;;;;;;;;;;;;
  113. ; Return data segment.
  114.  
  115. func    getDS
  116.     mov    AX,DS
  117.     ret
  118. c_endp    getDS
  119.  
  120. ;;;;;;;;;;;;;;;;;;;;;;;;;
  121. ; Open a file
  122. ; Use:
  123. ;    int open(name,rwmode)
  124. ; Returns:
  125. ;    -1    error
  126. ;    fd    file handle
  127. ;
  128.  
  129. func    open
  130.     push    BP
  131.     mov     BP,SP
  132.     mov    AH,3Dh            ;open file
  133.     mov    AL,P+SIZEPTR[BP]    ;AL = rwmode (0,1,2)
  134. OPEN1:
  135.     if SPTR
  136.     mov    DX,P[BP]        ;DX -> name
  137.     bdos
  138.     else
  139.     push    DS
  140.     lds    DX,P[BP]        ;DS:DX -> name
  141.     bdos
  142.     pop    DS
  143.     endif
  144.     jmp    F2
  145. c_endp    open
  146.  
  147. ;;;;;;;;;;;;;;;;;;;;;;;;;
  148. ; Create a file
  149. ; Use:
  150. ;    int creat(name,pmode)
  151. ; Returns:
  152. ;    -1    error
  153. ;    fd    file handle
  154. ;
  155.  
  156. func    creat
  157.     push    BP
  158.     mov     BP,SP
  159.     clr    CX            ;always ignore file attribute
  160.     jmps    creat1
  161. c_endp    creat
  162.  
  163. func    dos_creat
  164.     push    BP
  165.     mov     BP,SP
  166.     mov    CX,P+SIZEPTR[BP]    ;CX = file attribute
  167. creat1:
  168.     mov    AH,3Ch            ;create file
  169.     jmp    OPEN1
  170. c_endp    dos_creat
  171.  
  172. ;;;;;;;;;;;;;;;;;;;;;;;;;
  173. ; Close a file
  174. ; Use:
  175. ;    int close(fd)
  176. ; Returns:
  177. ;    -1    error
  178. ;    0    successful
  179. ;
  180.  
  181. func    close
  182.     push    BP
  183.     mov     BP,SP
  184.     mov    BX,P[BP]        ;file handle
  185.     bdos    3Eh            ;write to file or device
  186.     jmp    U2
  187. c_endp    close
  188.  
  189. ;;;;;;;;;;;;;;;;;;;;;;;;
  190. ; Rename a file.                J.K.H. 2/15/86
  191. ; Use:
  192. ;    int rename (from, to)
  193. ; Returns:
  194. ;       -1      error
  195. ;       0       successful
  196. ;
  197.  
  198. func    rename
  199.     push    BP
  200.     mov    BP,SP
  201.     .save    DI
  202.     mov    AH,56h            ;DOS rename function
  203.     if SPTR
  204.       ife ESeqDS
  205.     mov    BX,DS
  206.     mov    ES,BX
  207.       endif
  208.         mov     DI,P+SIZEPTR[bp]        ;The new name.
  209.     else    ;LPTR
  210.         les     DI,P+SIZEPTR[bp]        ;The new name.
  211.     endif
  212.     jmps    U1
  213. c_endp    rename
  214.  
  215. ;;;;;;;;;;;;;;;;;;;;;;;;;
  216. ; Delete a file
  217. ; Use:
  218. ;    int unlink(name)
  219. ; Returns:
  220. ;    -1    error
  221. ;    0    successful
  222. ;
  223.  
  224. func    remove
  225. c_endp    remove
  226.  
  227. func    unlink
  228.     push    BP
  229.     mov     BP,SP
  230.     .save    DI
  231.     mov    AH,41h            ;delete file function
  232. U1:
  233.     if SPTR
  234.     mov    DX,P[BP]        ;DX -> name
  235.     bdos
  236.     else
  237.     push    DS
  238.     lds    DX,P[BP]        ;DS:DX -> name
  239.     bdos
  240.     pop    DS
  241.     endif
  242.     .restore DI
  243. U2:    jnc    L7            ;no error
  244.     mov    errno,AX
  245. L7:    sbb    AX,AX            ;-1 if error, 0 if not
  246.     pop     BP
  247.     ret
  248. c_endp    unlink
  249.  
  250. ;;;;;;;;;;;;;;;;;;;;;;;;;
  251. ; Seek to specified file position.
  252. ; Use:
  253. ;    long lseek(int fd,long offset,int mode)
  254. ; Input:
  255. ;    mode =    SEEK_SET or SEEK_CUR or SEEK_END
  256. ; Returns:
  257. ;    -1L    error
  258. ;    n    new file position
  259. ;
  260.  
  261. func    lseek
  262.     push    BP
  263.     mov     BP,SP
  264.     mov    BX,P[BP]        ;file handle
  265.     mov    DX,P+2[BP]        ;lsw of offset
  266.     mov    CX,P+4[BP]        ;msw of offset
  267.     mov    AL,P+6[BP]        ;mode (0,1,2)
  268.     bdos    42h            ;write to file or device
  269.     jnc    L9            ;no error
  270.     mov    errno,AX        ;save DOS error number
  271.     sbb    AX,AX            ;AX = -1
  272.     if MSC
  273.     cwd                ;DX = -1
  274. L9:
  275.     else
  276.     mov    BX,AX            ;error
  277.     pop    BP
  278.     ret
  279.  
  280. L9:    mov    BX,AX            ;lsw
  281.     mov    AX,DX            ;msw
  282.     endif
  283.     pop     BP
  284.     ret
  285. c_endp    lseek
  286.  
  287. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  288. ; Get and return the size of a file.
  289. ; Use:
  290. ;    long filesize(filename)
  291. ;    char *filename;
  292. ; Returns:
  293. ;    -1L    error
  294.  
  295. func    filesize
  296.     push    BP
  297.     push    DS
  298.     sub    SP,44        ;44 bytes for DTA
  299.     mov    BP,SP
  300.  
  301.     ;Set DTA to the 44 bytes on the stack (SS:BP)
  302.     if LPTR
  303.     push    SS
  304.     pop    DS
  305.     endif
  306.     mov    DX,BP        ;DS:DX is DTA
  307.     bdos    1Ah        ;set DTA
  308.  
  309.     ;Find first matching file
  310.     if SPTR
  311.     mov    DX,44+2+P[BP]
  312.     else
  313.     lds    DX,44+2+P[BP]
  314.     endif
  315.     mov    CX,6        ;find all normal files, plus system and hidden
  316.     bdos    4Eh        ;findfirst (DS:DX -> filename)
  317.     jc    L11        ;no error
  318.  
  319.     ;Load file size from DTA
  320.     if MSC
  321.     mov    DX,28[BP]
  322.     mov    AX,26[BP]
  323.     else
  324.     mov    AX,28[BP]
  325.     mov    BX,26[BP]
  326.     endif
  327.  
  328. L12:    add    SP,44
  329.     pop    DS
  330.     pop    BP
  331.     ret
  332.  
  333. L11:
  334.     if LPTR
  335.     mov    DS,44[BP]    ;restore DS
  336.     endif
  337.     mov    errno,AX    ;remember error code
  338.     sbb    AX,AX
  339.     if MSC
  340.     cwd
  341.     else
  342.     mov    BX,AX        ;return -1L on error
  343.     endif
  344.     jmp    L12
  345. c_endp    filesize
  346.  
  347. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  348. ; Determine if handle is a tty.
  349. ; Use:
  350. ;    int isatty(fd)
  351. ;    int fd;
  352. ; Returns:
  353. ;    !=0    character device
  354. ;    0    not a character device or error
  355.  
  356. func    isatty
  357.     mov    BX,SP
  358.     if SPTR
  359.     mov    BX,P-2[BX]    ;get fd (file handle)
  360.     else
  361.     mov    BX,SS:P-2[BX]    ;get fd (file handle)
  362.     endif
  363.     mov    AX,04400h    ;get device information
  364.     bdos            ;IOCTL
  365.     jc    I2
  366.  
  367.     ;If sign bit is set in DL, it is a character device.
  368.     mov    AL,DL
  369.     cbw            ;AH = 0FFh if char dev, else 0
  370.     mov    AL,AH
  371.     ret
  372.  
  373. I2:    mov    errno,AX
  374.     clr    AX
  375.     ret
  376. c_endp    isatty
  377.  
  378.     endcode    io
  379.  
  380.     end
  381.