Metropoli BBS
VIEWER: _vbeaf.asm MODE: TEXT (ASCII)
;****************************************************************************
;*
;*               VESA BIOS Extensions/Accelerator Functions
;*                              Version 1.0
;*
;*                   Copyright (C) 1996 SciTech Software.
;*                           All rights reserved.
;*
;* Filename:     $Workfile:   _vbeaf.asm  $
;* Developed by: SciTech Software
;*
;* Language:     80386 Assembler (TASM ideal mode)
;* Environment:  IBM PC 32 bit Protected Mode.
;*
;* Description:  Assembly language support routines for the Graphics
;*               Accelerator API. This module provides a small, sample
;*               C API showing how to call the device context functions
;*               from assembler. For time critical code the device context
;*               functions should be called directly from assembly language
;*               rather than via these C callable functions. However for
;*               many operations these C function will suffice.
;*
;* $Date:   20 Jun 1996 13:32:36  $ $Author:   KendallB  $
;*
;****************************************************************************

        IDEAL

include "model.mac"             ; Memory model macros
include "vbeaf.inc"             ; Structure definitions etc

if flatmodel

header  _vbeaf

        EXTRN   __AF_int86_C:FPTR
        EXTRN   __AF_callRealMode_C:FPTR

begcodeseg  _vbeaf

; Macros to setup and call a generic function that takes a parameter block
; in DS:ESI given the parameters passed on the stack

MACRO   CallGeneric name

        ARG     dc:DPTR, firstParm:UINT

        push    ebp
        mov     ebp,esp
        push    ebx
        push    esi

        mov     ebx,[dc]
        lea     esi,[firstParm]
        call    [AF_devCtx.name]

        pop     esi
        pop     ebx
        pop     ebp
        ret

ENDM

MACRO   CallGeneric1Color name

        ARG     dc:DPTR, color:UINT, firstParm:UINT

        push    ebp
        mov     ebp,esp
        push    ebx
        push    esi

        mov     eax,[color]
        mov     ebx,[dc]
        lea     esi,[firstParm]
        call    [AF_devCtx.name]

        pop     esi
        pop     ebx
        pop     ebp
        ret

ENDM

MACRO   CallGeneric2Color name

        ARG     dc:DPTR, color:UINT, backColor:UINT, firstParm:UINT

        push    ebp
        mov     ebp,esp
        push    ebx
        push    esi

        mov     eax,[color]
        mov     ebx,[dc]
        mov     ecx,[backColor]
        lea     esi,[firstParm]
        call    [AF_devCtx.name]

        pop     esi
        pop     ebx
        pop     ebp
        ret

ENDM

;----------------------------------------------------------------------------
; _AF_int86     Issue a real mode interrupt
;----------------------------------------------------------------------------
; Entry:        BL      - Interrupt number
;               DS:EDI  - Pointer to DPMI register structure
;
; Exit:         DS:EDI  - Pointer to modifed DPMI register structure
;----------------------------------------------------------------------------
procstart   __AF_int86

		movzx   ebx,bl
        push    edi
        push    ebx
        call    __AF_int86_C            ; Call C version to handle it
        add     esp,8
        ret

procend     __AF_int86

;----------------------------------------------------------------------------
; _AF_callRealMode  Issue a real mode interrupt
;----------------------------------------------------------------------------
; Entry:        BL      - Interrupt number
;               DS:EDI  - Pointer to DPMI register structure
;
; Exit:         DS:EDI  - Pointer to modifed DPMI register structure
;----------------------------------------------------------------------------
procstart   __AF_callRealMode

		push    edi
        call    __AF_callRealMode_C     ; Call C version to handle it
        add     esp,4
        ret

procend     __AF_callRealMode

;----------------------------------------------------------------------------
; AF_int32 _AF_initDriver(AF_devCtx *dc);
;----------------------------------------------------------------------------
procstartdll    __AF_initDriver

        ARG     dc:DPTR

        push    ebp
        mov     ebp,esp
        push    ebx

        mov     ebx,[dc]
        mov     eax,[AF_devCtx.initDriver]
        add     eax,ebx
        call    eax

        pop     ebx
        pop     ebp
        ret

procend         __AF_initDriver

;----------------------------------------------------------------------------
; AF_int32 AF_getVideoModeInfo(AF_devCtx *dc,AF_int16 mode,
;   AF_modeInfo *modeInfo)
;----------------------------------------------------------------------------
procstartdll    _AF_getVideoModeInfo

        ARG     dc:DPTR, mode:S_USHORT, modeInfo:DPTR

        push    ebp
        mov     ebp,esp
        push    ebx
        push    edi

        movzx   eax,[mode]
        mov     ebx,[dc]
        mov     edi,[modeInfo]
        call    [AF_devCtx.GetVideoModeInfo]

        pop     edi
        pop     ebx
        pop     ebp
        ret

procend         _AF_getVideoModeInfo

;----------------------------------------------------------------------------
; AF_int32 AF_setVideoMode(AF_devCtx *dc,AF_int16 mode,
;   AF_int32 *bytesPerLine,int numBuffers)
;----------------------------------------------------------------------------
procstartdll    _AF_setVideoMode

        ARG     dc:DPTR, mode:S_USHORT, bytesPerLine:DPTR, numBuffers:UINT

        push    ebp
        mov     ebp,esp
        push    ebx
        push    edi

        movzx   eax,[mode]
        mov     ebx,[dc]
        mov     ecx,[bytesPerLine]
        mov     ecx,[ecx]
        mov     edi,[numBuffers]
        call    [AF_devCtx.SetVideoMode]
        mov     edx,[bytesPerLine]
        mov     [edx],ecx

        pop     edi
        pop     ebx
        pop     ebp
        ret

procend         _AF_setVideoMode

;----------------------------------------------------------------------------
; AF_int32 AF_setVirtualVideoMode(AF_devCtx *dc,AF_int16 mode,
;   AF_int32 virtualX,AF_int32 virtualY,AF_int32 *bytesPerLine,int numBuffers)
;----------------------------------------------------------------------------
procstartdll    _AF_setVirtualVideoMode

        ARG     dc:DPTR, mode:S_USHORT, virtualX:UINT, virtualY:UINT,   \
                bytesPerLine:DPTR, numBuffers:UINT

        push    ebp
        mov     ebp,esp
        push    ebx
        push    esi
        push    edi

        movzx   eax,[mode]
        mov     ebx,[dc]
        mov     ecx,[bytesPerLine]
        mov     ecx,[ecx]
        mov     edx,[virtualX]
        mov     esi,[virtualY]
        mov     edi,[numBuffers]
        call    [AF_devCtx.SetVideoMode]
        mov     edx,[bytesPerLine]
        mov     [edx],ecx

        pop     edi
        pop     esi
        pop     ebx
        pop     ebp
        ret

procend         _AF_setVirtualVideoMode

;----------------------------------------------------------------------------
; void AF_restoreTextMode(AF_devCtx *dc)
;----------------------------------------------------------------------------
procstartdll    _AF_restoreTextMode

        ARG     dc:DPTR

        push    ebp
        mov     ebp,esp
        push    ebx

        mov     ebx,[dc]
        call    [AF_devCtx.RestoreTextMode]

        pop     ebx
        pop     ebp
        ret

procend         _AF_restoreTextMode

;----------------------------------------------------------------------------
; void AF_setBank(AF_devCtx *dc,AF_int32 bank)
;----------------------------------------------------------------------------
procstartdll    _AF_setBank

        ARG     dc:DPTR, bank:UINT

        push    ebp
        mov     ebp,esp
        push    ebx

        mov     ebx,[dc]
        mov     edx,[bank]
        call    [AF_devCtx.SetBank]

        pop     ebx
        pop     ebp
        ret

procend         _AF_setBank

;----------------------------------------------------------------------------
; void AF_waitTillIdle(AF_devCtx *dc)
;----------------------------------------------------------------------------
procstartdll    _AF_waitTillIdle

        ARG     dc:DPTR

        push    ebp
        mov     ebp,esp
        push    ebx

        mov     ebx,[dc]
        call    [AF_devCtx.WaitTillIdle]

        pop     ebx
        pop     ebp
        ret

procend         _AF_waitTillIdle

;----------------------------------------------------------------------------
; void AF_enableDirectAccess(AF_devCtx *dc)
;----------------------------------------------------------------------------
procstartdll    _AF_enableDirectAccess

        ARG     dc:DPTR

        push    ebp
        mov     ebp,esp
        push    ebx

        mov     ebx,[dc]
        call    [AF_devCtx.EnableDirectAccess]

        pop     ebx
        pop     ebp
        ret

procend         _AF_enableDirectAccess

;----------------------------------------------------------------------------
; void AF_disableDirectAccess(AF_devCtx *dc)
;----------------------------------------------------------------------------
procstartdll    _AF_disableDirectAccess

        ARG     dc:DPTR

        push    ebp
        mov     ebp,esp
        push    ebx

        mov     ebx,[dc]
        call    [AF_devCtx.DisableDirectAccess]

        pop     ebx
        pop     ebp
        ret

procend         _AF_disableDirectAccess

;----------------------------------------------------------------------------
; void AF_setDisplayStart(AF_devCtx *dc,AF_int32 x,AF_int32 y,
;   AF_int32 waitVRT)
;----------------------------------------------------------------------------
procstartdll    _AF_setDisplayStart

        ARG     dc:DPTR, x:UINT, y:UINT, waitVRT:UINT

        push    ebp
        mov     ebp,esp
        push    ebx

        mov     eax,[waitVRT]
        mov     ebx,[dc]
        mov     ecx,[x]
        mov     edx,[y]
        call    [AF_devCtx.SetDisplayStart]

        pop     ebx
        pop     ebp
        ret

procend         _AF_setDisplayStart

;----------------------------------------------------------------------------
; void AF_setActiveBuffer(AF_devCtx *dc,AF_int32 index)
;----------------------------------------------------------------------------
procstartdll    _AF_setActiveBuffer

        ARG     dc:DPTR, index:UINT

        push    ebp
        mov     ebp,esp
        push    ebx

        mov     eax,[index]
        mov     ebx,[dc]
        call    [AF_devCtx.SetActiveBuffer]

        pop     ebx
        pop     ebp
        ret

procend         _AF_setActiveBuffer

;----------------------------------------------------------------------------
; void AF_setVisibleBuffer(AF_devCtx *dc,AF_int32 index,AF_int32 waitVRT)
;----------------------------------------------------------------------------
procstartdll    _AF_setVisibleBuffer

        ARG     dc:DPTR, index:UINT, waitVRT:UINT

        push    ebp
        mov     ebp,esp
        push    ebx

        mov     eax,[index]
        mov     ebx,[dc]
        mov     edx,[waitVRT]
        call    [AF_devCtx.SetVisibleBuffer]

        pop     ebx
        pop     ebp
        ret

procend         _AF_setVisibleBuffer

;----------------------------------------------------------------------------
; void AF_setPaletteData(AF_devCtx *dc,AF_palette *pal,AF_int32 num,
;   AF_int32 index,AF_int32 waitVRT)
;----------------------------------------------------------------------------
procstartdll    _AF_setPaletteData

        ARG     dc:DPTR, pal:DPTR, num:UINT, index:UINT, waitVRT:UINT

        push    ebp
        mov     ebp,esp
        push    ebx
        push    esi

        mov     eax,[waitVRT]
        mov     ebx,[dc]
        mov     ecx,[num]
        mov     edx,[index]
        mov     esi,[pal]
        call    [AF_devCtx.SetPaletteData]

        pop     esi
        pop     ebx
        pop     ebp
        ret

procend         _AF_setPaletteData

;----------------------------------------------------------------------------
; void AF_setGammaCorrectData(AF_devCtx *dc,AF_palette *pal,AF_int32 num,
;   AF_int32 index)
;----------------------------------------------------------------------------
procstartdll    _AF_setGammaCorrectData

        ARG     dc:DPTR, pal:DPTR, num:UINT, index:UINT

        push    ebp
        mov     ebp,esp
        push    ebx
        push    esi

        mov     eax,[index]
        mov     ebx,[dc]
        mov     ecx,[num]
        mov     esi,[pal]
        call    [AF_devCtx.SetGammaCorrectData]

        pop     esi
        pop     ebx
        pop     ebp
        ret

procend         _AF_setGammaCorrectData

;----------------------------------------------------------------------------
; void AF_setCursor(AF_devCtx *dc,AF_cursor *cursor)
;----------------------------------------------------------------------------
procstartdll    _AF_setCursor

        ARG     dc:DPTR, cursor:DPTR

        push    ebp
        mov     ebp,esp
        push    ebx
        push    esi

        mov     ebx,[dc]
        mov     esi,[cursor]
        call    [AF_devCtx.SetCursor]

        pop     esi
        pop     ebx
        pop     ebp
        ret

procend         _AF_setCursor

;----------------------------------------------------------------------------
; void AF_setCursorPos(AF_devCtx *dc,AF_int32 x,AF_int32 y)
;----------------------------------------------------------------------------
procstartdll    _AF_setCursorPos

        ARG     dc:DPTR, x:UINT, y:UINT

        push    ebp
        mov     ebp,esp
        push    ebx

        mov     eax,[x]
        mov     ebx,[dc]
        mov     ecx,[y]
        call    [AF_devCtx.SetCursorPos]

        pop     ebx
        pop     ebp
        ret

procend         _AF_setCursorPos

;----------------------------------------------------------------------------
; void AF_setCursorColor(AF_devCtx *dc,AF_uint8 red,AF_uint8 green,
;   AF_uint8 blue)
;----------------------------------------------------------------------------
procstartdll    _AF_setCursorColor

        ARG     dc:DPTR, red:S_UCHAR, green:S_UCHAR, blue:S_UCHAR

        push    ebp
        mov     ebp,esp
        push    ebx

        mov     al,[red]
        mov     ah,[green]
        mov     ebx,[dc]
        mov     cl,[blue]
        call    [AF_devCtx.SetCursorColor]

        pop     ebx
        pop     ebp
        ret

procend         _AF_setCursorColor

;----------------------------------------------------------------------------
; void AF_showCursor(AF_devCtx *dc,AF_int32 visible)
;----------------------------------------------------------------------------
procstartdll    _AF_showCursor

        ARG     dc:DPTR, visible:UINT

        push    ebp
        mov     ebp,esp
        push    ebx

        mov     eax,[visible]
        mov     ebx,[dc]
        call    [AF_devCtx.ShowCursor]

        pop     ebx
        pop     ebp
        ret

procend         _AF_showCursor

;----------------------------------------------------------------------------
; void AF_setMix(AF_devCtx *dc,AF_int32 foreMix,AF_int32 backMix)
;----------------------------------------------------------------------------
procstartdll    _AF_setMix

        ARG     dc:DPTR, foreMix:UINT, backMix:UINT

        push    ebp
        mov     ebp,esp
        push    ebx

        mov     eax,[foreMix]
        mov     ebx,[dc]
        mov     ecx,[backMix]
        call    [AF_devCtx.SetMix]

        pop     ebx
        pop     ebp
        ret

procend         _AF_setMix

;----------------------------------------------------------------------------
; void AF_set8x8Pattern(AF_devCtx *dc,AF_pattern *pattern)
;----------------------------------------------------------------------------
procstartdll    _AF_set8x8MonoPattern

        ARG     dc:DPTR, pattern:DPTR

        push    ebp
        mov     ebp,esp
        push    ebx
        push    esi

        mov     ebx,[dc]
        mov     esi,[pattern]
        call    [AF_devCtx.Set8x8MonoPattern]

        pop     esi
        pop     ebx
        pop     ebp
        ret

procend         _AF_set8x8MonoPattern

;----------------------------------------------------------------------------
; void AF_setLineStipple(AF_devCtx *dc,AF_stipple stipple)
;----------------------------------------------------------------------------
procstartdll    _AF_setLineStipple

        ARG     dc:DPTR, stipple:S_USHORT

        push    ebp
        mov     ebp,esp
        push    ebx

        mov     ax,[stipple]
        mov     ebx,[dc]
        call    [AF_devCtx.SetLineStipple]

        pop     ebx
        pop     ebp
        ret

procend         _AF_setLineStipple

;----------------------------------------------------------------------------
; void AF_setClipRect(AF_devCtx *dc,AF_int32 minx,AF_int32 miny,
;   AF_int32 maxx,AF_int32 maxy)
;----------------------------------------------------------------------------
procstartdll    _AF_setClipRect

        CallGeneric SetClipRect

procend         _AF_setClipRect

;----------------------------------------------------------------------------
; void AF_drawScan(AF_devCtx *dc,AF_int32 color,AF_int32 y,AF_int32 x1,
;   AF_int32 x2)
;----------------------------------------------------------------------------
procstartdll    _AF_drawScan

        ARG     dc:DPTR, color:UINT, y:UINT, x1:UINT, x2:UINT

        push    ebp
        mov     ebp,esp
        push    ebx
        push    esi

        mov     eax,[y]
        mov     ebx,[dc]
        mov     ecx,[x1]
        mov     edx,[x2]
        mov     esi,[color]
        call    [AF_devCtx.DrawScan]

        pop     esi
        pop     ebx
        pop     ebp
        ret

procend         _AF_drawScan

;----------------------------------------------------------------------------
; void AF_drawPattScan(AF_devCtx *dc,AF_int32 foreColor,AF_int32 backColor,
;   AF_int32 y,AF_int32 x1,AF_int32 x2)
;----------------------------------------------------------------------------
procstartdll    _AF_drawPattScan

        ARG     dc:DPTR, color:UINT, backColor:UINT, y:UINT, x1:UINT, x2:UINT

        push    ebp
        mov     ebp,esp
        push    ebx
        push    esi
        push    edi

        mov     eax,[y]
        mov     ebx,[dc]
        mov     ecx,[x1]
        mov     edx,[x2]
        mov     esi,[color]
        mov     edi,[backColor]
        call    [AF_devCtx.DrawPattScan]

        pop     edi
        pop     esi
        pop     ebx
        pop     ebp
        ret

procend         _AF_drawPattScan

;----------------------------------------------------------------------------
; void AF_drawScanList(AF_devCtx *dc,AF_color color,AF_int32 y,AF_int32 len,
;   AF_int16 *scans)
;----------------------------------------------------------------------------
procstartdll    _AF_drawScanList

        ARG     dc:DPTR, color:UINT, y:UINT, len:UINT, scans:DPTR

        push    ebp
        mov     ebp,esp
        push    ebx

        mov     eax,[y]
        mov     ebx,[dc]
        mov     ecx,[len]
        mov     esi,[scans]
        mov     edx,[color]
        call    [AF_devCtx.DrawScanList]

        pop     ebx
        pop     ebp
        ret

procend         _AF_drawScanList

;----------------------------------------------------------------------------
; void AF_drawRect(AF_devCtx *dc,AF_color color,AF_int32 left,AF_int32 top,
;   AF_int32 width,AF_int32 height)
;----------------------------------------------------------------------------
procstartdll    _AF_drawRect

        CallGeneric1Color DrawRect

procend         _AF_drawRect

;----------------------------------------------------------------------------
; void AF_drawPattRect(AF_devCtx *dc,AF_color foreColor,AF_color backColor,
;   AF_int32 left,AF_int32 top,AF_int32 width,AF_int32 height)
;----------------------------------------------------------------------------
procstartdll    _AF_drawPattRect

        CallGeneric2Color DrawPattRect

procend         _AF_drawPattRect

;----------------------------------------------------------------------------
; void AF_drawLine(AF_devCtx *dc,AF_color color,AF_fix32 x1,AF_fix32 y1,
;   AF_fix32 x2,AF_fix32 y2)
;----------------------------------------------------------------------------
procstartdll    _AF_drawLine

        CallGeneric1Color DrawLine

procend         _AF_drawLine

;----------------------------------------------------------------------------
; void AF_drawStippleLine(AF_devCtx *dc,AF_color foreColor,AF_color backColor,
;   AF_fix32 x1,AF_fix32 y1,AF_fix32 x2,AF_fix32 y2)
;----------------------------------------------------------------------------
procstartdll    _AF_drawStippleLine

        CallGeneric2Color DrawStippleLine

procend         _AF_drawStippleLine

;----------------------------------------------------------------------------
; void AF_drawTrap(AF_devCtx *dc,AF_color color,AF_int32 y,AF_int32 count,
;   AF_fix32 x1,AF_fix32 x2,AF_fix32 slope1,AF_fix32 slope2)
;----------------------------------------------------------------------------
procstartdll    _AF_drawTrap

        CallGeneric1Color DrawTrap

procend         _AF_drawTrap

;----------------------------------------------------------------------------
; void AF_drawTri(AF_devCtx *dc,AF_color color,AF_fxpoint *v1,AF_fxpoint *v2,
;   AF_fxpoint *v3,AF_fix32 xOffset,AF_fix32 yOffset)
;----------------------------------------------------------------------------
procstartdll    _AF_drawTri

        CallGeneric1Color DrawTri

procend         _AF_drawTri

;----------------------------------------------------------------------------
; void AF_drawQuad(AF_devCtx *dc,AF_color color,AF_fxpoint *v1,AF_fxpoint *v2,
;   AF_fxpoint *v3,AF_fix32 xOffset,AF_fix32 yOffset)
;----------------------------------------------------------------------------
procstartdll    _AF_drawQuad

        CallGeneric1Color DrawQuad

procend         _AF_drawQuad

;----------------------------------------------------------------------------
; void AF_putMonoImage(AF_devCtx *dc,AF_int32 foreColor,AF_int32 backColor,
;   AF_int32 x,AF_int32 y,AF_int32 byteWidth,AF_int32 height,AF_uint8 *image)
;----------------------------------------------------------------------------
procstartdll    _AF_putMonoImage

        CallGeneric2Color PutMonoImage

procend         _AF_putMonoImage

;----------------------------------------------------------------------------
; void AF_bitBlt(AF_devCtx *dc,AF_int32 left,AF_int32 top,AF_int32 width,
;   AF_int32 height,AF_int32 dstLeft,AF_int32 dstTop,AF_int32 op)
;----------------------------------------------------------------------------
procstartdll    _AF_bitBlt

        CallGeneric BitBlt

procend         _AF_bitBlt

;----------------------------------------------------------------------------
; void AF_bitBltLin(AF_devCtx *dc,AF_int32 srcOfs,
;   AF_int32 left,AF_int32 top,AF_int32 width,AF_int32 height,
;   AF_int32 dstLeft,AF_int32 dstTop,AF_int32 op)
;----------------------------------------------------------------------------
procstartdll    _AF_bitBltLin

        CallGeneric BitBltLin

procend         _AF_bitBltLin

;----------------------------------------------------------------------------
; void AF_srcTransBlt(AF_devCtx *dc,AF_int32 left,AF_int32 top,AF_int32 width,
;   AF_int32 height,AF_int32 dstLeft,AF_int32 dstTop,AF_color transparent)
;----------------------------------------------------------------------------
procstartdll    _AF_srcTransBlt

        CallGeneric SrcTransBlt

procend         _AF_srcTransBlt

;----------------------------------------------------------------------------
; void AF_dstTransBlt(AF_devCtx *dc,AF_int32 left,AF_int32 top,AF_int32 width,
;   AF_int32 height,AF_int32 dstLeft,AF_int32 dstTop,AF_color transparent)
;----------------------------------------------------------------------------
procstartdll    _AF_dstTransBlt

        CallGeneric DstTransBlt

procend         _AF_dstTransBlt

;----------------------------------------------------------------------------
; void AF_srcTransBltLin(AF_devCtx *dc,AF_int32 srcOfs,
;   AF_int32 left,AF_int32 top,AF_int32 width,AF_int32 height,
;   AF_int32 dstLeft,AF_int32 dstTop,AF_color transparent)
;----------------------------------------------------------------------------
procstartdll    _AF_srcTransBltLin

        CallGeneric SrcTransBltLin

procend         _AF_srcTransBltLin

;----------------------------------------------------------------------------
; void AF_dstTransBltLin(AF_devCtx *dc,AF_int32 srcOfs,
;   AF_int32 left,AF_int32 top,AF_int32 width,AF_int32 height,
;   AF_int32 dstLeft,AF_int32 dstTop,AF_color transparent)
;----------------------------------------------------------------------------
procstartdll    _AF_dstTransBltLin

        CallGeneric DstTransBltLin

procend         _AF_dstTransBltLin

endcodeseg  _vbeaf

endif

        END
[ RETURN TO DIRECTORY ]