Remove ancient trunk folder from svn repository
[synfig.git] / gtkmm-osx / jpeg-6b / jmemdosa.asm
diff --git a/gtkmm-osx/jpeg-6b/jmemdosa.asm b/gtkmm-osx/jpeg-6b/jmemdosa.asm
new file mode 100644 (file)
index 0000000..ecd4372
--- /dev/null
@@ -0,0 +1,379 @@
+;
+; jmemdosa.asm
+;
+; Copyright (C) 1992, Thomas G. Lane.
+; This file is part of the Independent JPEG Group's software.
+; For conditions of distribution and use, see the accompanying README file.
+;
+; This file contains low-level interface routines to support the MS-DOS
+; backing store manager (jmemdos.c).  Routines are provided to access disk
+; files through direct DOS calls, and to access XMS and EMS drivers.
+;
+; This file should assemble with Microsoft's MASM or any compatible
+; assembler (including Borland's Turbo Assembler).  If you haven't got
+; a compatible assembler, better fall back to jmemansi.c or jmemname.c.
+;
+; To minimize dependence on the C compiler's register usage conventions,
+; we save and restore all 8086 registers, even though most compilers only
+; require SI,DI,DS to be preserved.  Also, we use only 16-bit-wide return
+; values, which everybody returns in AX.
+;
+; Based on code contributed by Ge' Weijers.
+;
+
+JMEMDOSA_TXT   segment byte public 'CODE'
+
+               assume  cs:JMEMDOSA_TXT
+
+               public  _jdos_open
+               public  _jdos_close
+               public  _jdos_seek
+               public  _jdos_read
+               public  _jdos_write
+               public  _jxms_getdriver
+               public  _jxms_calldriver
+               public  _jems_available
+               public  _jems_calldriver
+
+;
+; short far jdos_open (short far * handle, char far * filename)
+;
+; Create and open a temporary file
+;
+_jdos_open     proc    far
+               push    bp                      ; linkage
+               mov     bp,sp
+               push    si                      ; save all registers for safety
+               push    di
+               push    bx
+               push    cx
+               push    dx
+               push    es
+               push    ds
+               mov     cx,0                    ; normal file attributes
+               lds     dx,dword ptr [bp+10]    ; get filename pointer
+               mov     ah,3ch                  ; create file
+               int     21h
+               jc      open_err                ; if failed, return error code
+               lds     bx,dword ptr [bp+6]     ; get handle pointer
+               mov     word ptr [bx],ax        ; save the handle
+               xor     ax,ax                   ; return zero for OK
+open_err:      pop     ds                      ; restore registers and exit
+               pop     es
+               pop     dx
+               pop     cx
+               pop     bx
+               pop     di
+               pop     si
+               pop     bp
+               ret
+_jdos_open     endp
+
+
+;
+; short far jdos_close (short handle)
+;
+; Close the file handle
+;
+_jdos_close    proc    far
+               push    bp                      ; linkage
+               mov     bp,sp
+               push    si                      ; save all registers for safety
+               push    di
+               push    bx
+               push    cx
+               push    dx
+               push    es
+               push    ds
+               mov     bx,word ptr [bp+6]      ; file handle
+               mov     ah,3eh                  ; close file
+               int     21h
+               jc      close_err               ; if failed, return error code
+               xor     ax,ax                   ; return zero for OK
+close_err:     pop     ds                      ; restore registers and exit
+               pop     es
+               pop     dx
+               pop     cx
+               pop     bx
+               pop     di
+               pop     si
+               pop     bp
+               ret
+_jdos_close    endp
+
+
+;
+; short far jdos_seek (short handle, long offset)
+;
+; Set file position
+;
+_jdos_seek     proc    far
+               push    bp                      ; linkage
+               mov     bp,sp
+               push    si                      ; save all registers for safety
+               push    di
+               push    bx
+               push    cx
+               push    dx
+               push    es
+               push    ds
+               mov     bx,word ptr [bp+6]      ; file handle
+               mov     dx,word ptr [bp+8]      ; LS offset
+               mov     cx,word ptr [bp+10]     ; MS offset
+               mov     ax,4200h                ; absolute seek
+               int     21h
+               jc      seek_err                ; if failed, return error code
+               xor     ax,ax                   ; return zero for OK
+seek_err:      pop     ds                      ; restore registers and exit
+               pop     es
+               pop     dx
+               pop     cx
+               pop     bx
+               pop     di
+               pop     si
+               pop     bp
+               ret
+_jdos_seek     endp
+
+
+;
+; short far jdos_read (short handle, void far * buffer, unsigned short count)
+;
+; Read from file
+;
+_jdos_read     proc    far
+               push    bp                      ; linkage
+               mov     bp,sp
+               push    si                      ; save all registers for safety
+               push    di
+               push    bx
+               push    cx
+               push    dx
+               push    es
+               push    ds
+               mov     bx,word ptr [bp+6]      ; file handle
+               lds     dx,dword ptr [bp+8]     ; buffer address
+               mov     cx,word ptr [bp+12]     ; number of bytes
+               mov     ah,3fh                  ; read file
+               int     21h
+               jc      read_err                ; if failed, return error code
+               cmp     ax,word ptr [bp+12]     ; make sure all bytes were read
+               je      read_ok
+               mov     ax,1                    ; else return 1 for not OK
+               jmp     short read_err
+read_ok:       xor     ax,ax                   ; return zero for OK
+read_err:      pop     ds                      ; restore registers and exit
+               pop     es
+               pop     dx
+               pop     cx
+               pop     bx
+               pop     di
+               pop     si
+               pop     bp
+               ret
+_jdos_read     endp
+
+
+;
+; short far jdos_write (short handle, void far * buffer, unsigned short count)
+;
+; Write to file
+;
+_jdos_write    proc    far
+               push    bp                      ; linkage
+               mov     bp,sp
+               push    si                      ; save all registers for safety
+               push    di
+               push    bx
+               push    cx
+               push    dx
+               push    es
+               push    ds
+               mov     bx,word ptr [bp+6]      ; file handle
+               lds     dx,dword ptr [bp+8]     ; buffer address
+               mov     cx,word ptr [bp+12]     ; number of bytes
+               mov     ah,40h                  ; write file
+               int     21h
+               jc      write_err               ; if failed, return error code
+               cmp     ax,word ptr [bp+12]     ; make sure all bytes written
+               je      write_ok
+               mov     ax,1                    ; else return 1 for not OK
+               jmp     short write_err
+write_ok:      xor     ax,ax                   ; return zero for OK
+write_err:     pop     ds                      ; restore registers and exit
+               pop     es
+               pop     dx
+               pop     cx
+               pop     bx
+               pop     di
+               pop     si
+               pop     bp
+               ret
+_jdos_write    endp
+
+
+;
+; void far jxms_getdriver (XMSDRIVER far *)
+;
+; Get the address of the XMS driver, or NULL if not available
+;
+_jxms_getdriver        proc    far
+               push    bp                      ; linkage
+               mov     bp,sp
+               push    si                      ; save all registers for safety
+               push    di
+               push    bx
+               push    cx
+               push    dx
+               push    es
+               push    ds
+               mov     ax,4300h                ; call multiplex interrupt with
+               int     2fh                     ; a magic cookie, hex 4300
+               cmp     al,80h                  ; AL should contain hex 80
+               je      xmsavail
+               xor     dx,dx                   ; no XMS driver available
+               xor     ax,ax                   ; return a nil pointer
+               jmp     short xmsavail_done
+xmsavail:      mov     ax,4310h                ; fetch driver address with
+               int     2fh                     ; another magic cookie
+               mov     dx,es                   ; copy address to dx:ax
+               mov     ax,bx
+xmsavail_done: les     bx,dword ptr [bp+6]     ; get pointer to return value
+               mov     word ptr es:[bx],ax
+               mov     word ptr es:[bx+2],dx
+               pop     ds                      ; restore registers and exit
+               pop     es
+               pop     dx
+               pop     cx
+               pop     bx
+               pop     di
+               pop     si
+               pop     bp
+               ret
+_jxms_getdriver        endp
+
+
+;
+; void far jxms_calldriver (XMSDRIVER, XMScontext far *)
+;
+; The XMScontext structure contains values for the AX,DX,BX,SI,DS registers.
+; These are loaded, the XMS call is performed, and the new values of the
+; AX,DX,BX registers are written back to the context structure.
+;
+_jxms_calldriver       proc    far
+               push    bp                      ; linkage
+               mov     bp,sp
+               push    si                      ; save all registers for safety
+               push    di
+               push    bx
+               push    cx
+               push    dx
+               push    es
+               push    ds
+               les     bx,dword ptr [bp+10]    ; get XMScontext pointer
+               mov     ax,word ptr es:[bx]     ; load registers
+               mov     dx,word ptr es:[bx+2]
+               mov     si,word ptr es:[bx+6]
+               mov     ds,word ptr es:[bx+8]
+               mov     bx,word ptr es:[bx+4]
+               call    dword ptr [bp+6]        ; call the driver
+               mov     cx,bx                   ; save returned BX for a sec
+               les     bx,dword ptr [bp+10]    ; get XMScontext pointer
+               mov     word ptr es:[bx],ax     ; put back ax,dx,bx
+               mov     word ptr es:[bx+2],dx
+               mov     word ptr es:[bx+4],cx
+               pop     ds                      ; restore registers and exit
+               pop     es
+               pop     dx
+               pop     cx
+               pop     bx
+               pop     di
+               pop     si
+               pop     bp
+               ret
+_jxms_calldriver       endp
+
+
+;
+; short far jems_available (void)
+;
+; Have we got an EMS driver? (this comes straight from the EMS 4.0 specs)
+;
+_jems_available        proc    far
+               push    si                      ; save all registers for safety
+               push    di
+               push    bx
+               push    cx
+               push    dx
+               push    es
+               push    ds
+               mov     ax,3567h                ; get interrupt vector 67h
+               int     21h
+               push    cs
+               pop     ds
+               mov     di,000ah                ; check offs 10 in returned seg
+               lea     si,ASCII_device_name    ; against literal string
+               mov     cx,8
+               cld
+               repe cmpsb
+               jne     no_ems
+               mov     ax,1                    ; match, it's there
+               jmp     short avail_done
+no_ems:                xor     ax,ax                   ; it's not there
+avail_done:    pop     ds                      ; restore registers and exit
+               pop     es
+               pop     dx
+               pop     cx
+               pop     bx
+               pop     di
+               pop     si
+               ret
+
+ASCII_device_name      db      "EMMXXXX0"
+
+_jems_available        endp
+
+
+;
+; void far jems_calldriver (EMScontext far *)
+;
+; The EMScontext structure contains values for the AX,DX,BX,SI,DS registers.
+; These are loaded, the EMS trap is performed, and the new values of the
+; AX,DX,BX registers are written back to the context structure.
+;
+_jems_calldriver       proc far
+               push    bp                      ; linkage
+               mov     bp,sp
+               push    si                      ; save all registers for safety
+               push    di
+               push    bx
+               push    cx
+               push    dx
+               push    es
+               push    ds
+               les     bx,dword ptr [bp+6]     ; get EMScontext pointer
+               mov     ax,word ptr es:[bx]     ; load registers
+               mov     dx,word ptr es:[bx+2]
+               mov     si,word ptr es:[bx+6]
+               mov     ds,word ptr es:[bx+8]
+               mov     bx,word ptr es:[bx+4]
+               int     67h                     ; call the EMS driver
+               mov     cx,bx                   ; save returned BX for a sec
+               les     bx,dword ptr [bp+6]     ; get EMScontext pointer
+               mov     word ptr es:[bx],ax     ; put back ax,dx,bx
+               mov     word ptr es:[bx+2],dx
+               mov     word ptr es:[bx+4],cx
+               pop     ds                      ; restore registers and exit
+               pop     es
+               pop     dx
+               pop     cx
+               pop     bx
+               pop     di
+               pop     si
+               pop     bp
+               ret
+_jems_calldriver       endp
+
+JMEMDOSA_TXT   ends
+
+               end