home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR2 / DVPG30FS.ZIP / JMEMDOSA.ASM < prev    next >
Assembly Source File  |  1993-02-19  |  9KB  |  380 lines

  1. ;
  2. ; jmemdosa.asm
  3. ;
  4. ; Copyright (C) 1992, Thomas G. Lane.
  5. ; This file is part of the Independent JPEG Group's software.
  6. ; For conditions of distribution and use, see the accompanying README file.
  7. ;
  8. ; This file contains low-level interface routines to support the MS-DOS
  9. ; backing store manager (jmemdos.c).  Routines are provided to access disk
  10. ; files through direct DOS calls, and to access XMS and EMS drivers.
  11. ;
  12. ; This file should assemble with Microsoft's MASM or any compatible
  13. ; assembler (including Borland's Turbo Assembler).  If you haven't got
  14. ; a compatible assembler, better fall back to jmemansi.c or jmemname.c.
  15. ;
  16. ; To minimize dependence on the C compiler's register usage conventions,
  17. ; we save and restore all 8086 registers, even though most compilers only
  18. ; require SI,DI,DS to be preserved.  Also, we use only 16-bit-wide return
  19. ; values, which everybody returns in AX.
  20. ;
  21. ; Based on code contributed by Ge' Weijers.
  22. ;
  23.  
  24. JMEMDOSA_TXT    segment byte public 'CODE'
  25.  
  26.         assume    cs:JMEMDOSA_TXT
  27.  
  28.         public    _jdos_open
  29.         public    _jdos_close
  30.         public    _jdos_seek
  31.         public    _jdos_read
  32.         public    _jdos_write
  33.         public    _jxms_getdriver
  34.         public    _jxms_calldriver
  35.         public    _jems_available
  36.         public    _jems_calldriver
  37.  
  38. ;
  39. ; short far jdos_open (short far * handle, char far * filename)
  40. ;
  41. ; Create and open a temporary file
  42. ;
  43. _jdos_open    proc    far
  44.         push    bp            ; linkage
  45.         mov     bp,sp
  46.         push    si            ; save all registers for safety
  47.         push    di
  48.         push    bx
  49.         push    cx
  50.         push    dx
  51.         push    es
  52.         push    ds
  53.         mov    cx,0            ; normal file attributes
  54.         lds    dx,dword ptr [bp+10]    ; get filename pointer
  55.         mov    ah,3ch            ; create file
  56.         int    21h
  57.         jc    open_err        ; if failed, return error code
  58.         lds    bx,dword ptr [bp+6]    ; get handle pointer
  59.         mov    word ptr [bx],ax    ; save the handle
  60.         xor    ax,ax            ; return zero for OK
  61. open_err:    pop    ds            ; restore registers and exit
  62.         pop    es
  63.         pop    dx
  64.         pop    cx
  65.         pop    bx
  66.         pop    di
  67.         pop    si
  68.         pop     bp
  69.         ret
  70. _jdos_open    endp
  71.  
  72.  
  73. ;
  74. ; short far jdos_close (short handle)
  75. ;
  76. ; Close the file handle
  77. ;
  78. _jdos_close    proc    far
  79.         push    bp            ; linkage
  80.         mov     bp,sp
  81.         push    si            ; save all registers for safety
  82.         push    di
  83.         push    bx
  84.         push    cx
  85.         push    dx
  86.         push    es
  87.         push    ds
  88.         mov    bx,word ptr [bp+6]    ; file handle
  89.         mov    ah,3eh            ; close file
  90.         int    21h
  91.         jc    close_err        ; if failed, return error code
  92.         xor    ax,ax            ; return zero for OK
  93. close_err:    pop    ds            ; restore registers and exit
  94.         pop    es
  95.         pop    dx
  96.         pop    cx
  97.         pop    bx
  98.         pop    di
  99.         pop    si
  100.         pop     bp
  101.         ret
  102. _jdos_close    endp
  103.  
  104.  
  105. ;
  106. ; short far jdos_seek (short handle, long offset)
  107. ;
  108. ; Set file position
  109. ;
  110. _jdos_seek    proc    far
  111.         push    bp            ; linkage
  112.         mov     bp,sp
  113.         push    si            ; save all registers for safety
  114.         push    di
  115.         push    bx
  116.         push    cx
  117.         push    dx
  118.         push    es
  119.         push    ds
  120.         mov    bx,word ptr [bp+6]    ; file handle
  121.         mov    dx,word ptr [bp+8]    ; LS offset
  122.         mov    cx,word ptr [bp+10]    ; MS offset
  123.         mov    ax,4200h        ; absolute seek
  124.         int    21h
  125.         jc    seek_err        ; if failed, return error code
  126.         xor    ax,ax            ; return zero for OK
  127. seek_err:    pop    ds            ; restore registers and exit
  128.         pop    es
  129.         pop    dx
  130.         pop    cx
  131.         pop    bx
  132.         pop    di
  133.         pop    si
  134.         pop     bp
  135.         ret
  136. _jdos_seek    endp
  137.  
  138.  
  139. ;
  140. ; short far jdos_read (short handle, void far * buffer, unsigned short count)
  141. ;
  142. ; Read from file
  143. ;
  144. _jdos_read    proc    far
  145.         push    bp            ; linkage
  146.         mov     bp,sp
  147.         push    si            ; save all registers for safety
  148.         push    di
  149.         push    bx
  150.         push    cx
  151.         push    dx
  152.         push    es
  153.         push    ds
  154.         mov    bx,word ptr [bp+6]    ; file handle
  155.         lds    dx,dword ptr [bp+8]    ; buffer address
  156.         mov    cx,word ptr [bp+12]    ; number of bytes
  157.         mov    ah,3fh            ; read file
  158.         int    21h
  159.         jc    read_err        ; if failed, return error code
  160.         cmp    ax,word ptr [bp+12]    ; make sure all bytes were read
  161.         je    read_ok
  162.         mov    ax,1            ; else return 1 for not OK
  163.         jmp    short read_err
  164. read_ok:    xor    ax,ax            ; return zero for OK
  165. read_err:    pop    ds            ; restore registers and exit
  166.         pop    es
  167.         pop    dx
  168.         pop    cx
  169.         pop    bx
  170.         pop    di
  171.         pop    si
  172.         pop     bp
  173.         ret
  174. _jdos_read    endp
  175.  
  176.  
  177. ;
  178. ; short far jdos_write (short handle, void far * buffer, unsigned short count)
  179. ;
  180. ; Write to file
  181. ;
  182. _jdos_write    proc    far
  183.         push    bp            ; linkage
  184.         mov     bp,sp
  185.         push    si            ; save all registers for safety
  186.         push    di
  187.         push    bx
  188.         push    cx
  189.         push    dx
  190.         push    es
  191.         push    ds
  192.         mov    bx,word ptr [bp+6]    ; file handle
  193.         lds    dx,dword ptr [bp+8]    ; buffer address
  194.         mov    cx,word ptr [bp+12]    ; number of bytes
  195.         mov    ah,40h            ; write file
  196.         int    21h
  197.         jc    write_err        ; if failed, return error code
  198.         cmp    ax,word ptr [bp+12]    ; make sure all bytes written
  199.         je    write_ok
  200.         mov    ax,1            ; else return 1 for not OK
  201.         jmp    short write_err
  202. write_ok:    xor    ax,ax            ; return zero for OK
  203. write_err:    pop    ds            ; restore registers and exit
  204.         pop    es
  205.         pop    dx
  206.         pop    cx
  207.         pop    bx
  208.         pop    di
  209.         pop    si
  210.         pop     bp
  211.         ret
  212. _jdos_write    endp
  213.  
  214.  
  215. ;
  216. ; void far jxms_getdriver (XMSDRIVER far *)
  217. ;
  218. ; Get the address of the XMS driver, or NULL if not available
  219. ;
  220. _jxms_getdriver    proc    far
  221.         push    bp            ; linkage
  222.         mov     bp,sp
  223.         push    si            ; save all registers for safety
  224.         push    di
  225.         push    bx
  226.         push    cx
  227.         push    dx
  228.         push    es
  229.         push    ds
  230.         mov     ax,4300h        ; call multiplex interrupt with
  231.         int    2fh            ; a magic cookie, hex 4300
  232.         cmp     al,80h            ; AL should contain hex 80
  233.         je    xmsavail
  234.         xor     dx,dx            ; no XMS driver available
  235.         xor     ax,ax            ; return a nil pointer
  236.         jmp    short xmsavail_done
  237. xmsavail:    mov     ax,4310h        ; fetch driver address with
  238.         int    2fh            ; another magic cookie
  239.         mov     dx,es            ; copy address to dx:ax
  240.         mov     ax,bx
  241. xmsavail_done:    les     bx,dword ptr [bp+6]    ; get pointer to return value
  242.         mov    word ptr es:[bx],ax
  243.         mov    word ptr es:[bx+2],dx
  244.         pop    ds            ; restore registers and exit
  245.         pop    es
  246.         pop    dx
  247.         pop    cx
  248.         pop    bx
  249.         pop    di
  250.         pop    si
  251.         pop    bp
  252.         ret
  253. _jxms_getdriver    endp
  254.  
  255.  
  256. ;
  257. ; void far jxms_calldriver (XMSDRIVER, XMScontext far *)
  258. ;
  259. ; The XMScontext structure contains values for the AX,DX,BX,SI,DS registers.
  260. ; These are loaded, the XMS call is performed, and the new values of the
  261. ; AX,DX,BX registers are written back to the context structure.
  262. ;
  263. _jxms_calldriver     proc    far
  264.         push    bp            ; linkage
  265.         mov     bp,sp
  266.         push    si            ; save all registers for safety
  267.         push    di
  268.         push    bx
  269.         push    cx
  270.         push    dx
  271.         push    es
  272.         push    ds
  273.         les     bx,dword ptr [bp+10]    ; get XMScontext pointer
  274.         mov     ax,word ptr es:[bx]    ; load registers
  275.         mov     dx,word ptr es:[bx+2]
  276.         mov     si,word ptr es:[bx+6]
  277.         mov     ds,word ptr es:[bx+8]
  278.         mov     bx,word ptr es:[bx+4]
  279.         call    dword ptr [bp+6]    ; call the driver
  280.         mov    cx,bx            ; save returned BX for a sec
  281.         les     bx,dword ptr [bp+10]    ; get XMScontext pointer
  282.         mov     word ptr es:[bx],ax    ; put back ax,dx,bx
  283.         mov     word ptr es:[bx+2],dx
  284.         mov     word ptr es:[bx+4],cx
  285.         pop    ds            ; restore registers and exit
  286.         pop    es
  287.         pop    dx
  288.         pop    cx
  289.         pop    bx
  290.         pop    di
  291.         pop    si
  292.         pop     bp
  293.         ret
  294. _jxms_calldriver     endp
  295.  
  296.  
  297. ;
  298. ; short far jems_available (void)
  299. ;
  300. ; Have we got an EMS driver? (this comes straight from the EMS 4.0 specs)
  301. ;
  302. _jems_available    proc    far
  303.         push    si            ; save all registers for safety
  304.         push    di
  305.         push    bx
  306.         push    cx
  307.         push    dx
  308.         push    es
  309.         push    ds
  310.         mov    ax,3567h        ; get interrupt vector 67h
  311.         int    21h
  312.         push    cs
  313.         pop    ds
  314.         mov    di,000ah        ; check offs 10 in returned seg
  315.         lea    si,ASCII_device_name    ; against literal string
  316.         mov    cx,8
  317.         cld
  318.         repe cmpsb
  319.         jne    no_ems
  320.         mov    ax,1            ; match, it's there
  321.         jmp    short avail_done
  322. no_ems:        xor    ax,ax            ; it's not there
  323. avail_done:    pop    ds            ; restore registers and exit
  324.         pop    es
  325.         pop    dx
  326.         pop    cx
  327.         pop    bx
  328.         pop    di
  329.         pop    si
  330.         ret
  331.  
  332. ASCII_device_name    db    "EMMXXXX0"
  333.  
  334. _jems_available    endp
  335.  
  336.  
  337. ;
  338. ; void far jems_calldriver (EMScontext far *)
  339. ;
  340. ; The EMScontext structure contains values for the AX,DX,BX,SI,DS registers.
  341. ; These are loaded, the EMS trap is performed, and the new values of the
  342. ; AX,DX,BX registers are written back to the context structure.
  343. ;
  344. _jems_calldriver    proc far
  345.         push    bp            ; linkage
  346.         mov     bp,sp
  347.         push    si            ; save all registers for safety
  348.         push    di
  349.         push    bx
  350.         push    cx
  351.         push    dx
  352.         push    es
  353.         push    ds
  354.         les     bx,dword ptr [bp+6]    ; get EMScontext pointer
  355.         mov     ax,word ptr es:[bx]    ; load registers
  356.         mov     dx,word ptr es:[bx+2]
  357.         mov     si,word ptr es:[bx+6]
  358.         mov     ds,word ptr es:[bx+8]
  359.         mov     bx,word ptr es:[bx+4]
  360.         int    67h            ; call the EMS driver
  361.         mov    cx,bx            ; save returned BX for a sec
  362.         les     bx,dword ptr [bp+6]    ; get EMScontext pointer
  363.         mov     word ptr es:[bx],ax    ; put back ax,dx,bx
  364.         mov     word ptr es:[bx+2],dx
  365.         mov     word ptr es:[bx+4],cx
  366.         pop    ds            ; restore registers and exit
  367.         pop    es
  368.         pop    dx
  369.         pop    cx
  370.         pop    bx
  371.         pop    di
  372.         pop    si
  373.         pop     bp
  374.         ret
  375. _jems_calldriver    endp
  376.  
  377. JMEMDOSA_TXT    ends
  378.  
  379.         end
  380.