/******************************Module*Header*******************************\
* Module Name: misc.c
*
* Miscellaneous common routines.
*
* Copyright (c) 1992-1994 Microsoft Corporation
*
\**************************************************************************/

#include "precomp.h"

/******************************Public*Routine******************************\
* VOID vDataPortOutB
\**************************************************************************/

VOID vDataPortOutB(
PDEV*   ppdev,
VOID*   pb,
ULONG   cj)
{
    ULONG pixtrans = (ULONG) (ppdev->ioPix_trans);

    _asm {
        mov ecx, cj
        mov esi, pb
        mov edx, pixtrans

        rep outsb
    }
}

/******************************Public*Routine******************************\
* VOID vDataPortOut
\**************************************************************************/

VOID vDataPortOut(
PDEV*   ppdev,
VOID*   pw,
ULONG   cw)
{
    ULONG pixtrans = (ULONG) (ppdev->ioPix_trans);

    _asm {
        mov ecx, cw
        mov esi, pw
        mov edx, pixtrans

        rep outsw
    }
}

/******************************Public*Routine******************************\
* VOID vDataPortIn
\**************************************************************************/

VOID vDataPortIn(
PDEV*   ppdev,
VOID*   pw,
ULONG   cw)
{
    ULONG pixtrans = (ULONG) (ppdev->ioPix_trans);

    _asm {
        mov ecx, cw
        mov edi, pw
        mov edx, pixtrans

        rep insw
    }
}

/******************************Public*Routine******************************\
* VOID vResetClipping
\**************************************************************************/

VOID vResetClipping(
PDEV*   ppdev)
{
    IO_FIFO_WAIT(ppdev, 4);

    IO_ABS_SCISSORS_L(ppdev, 0);
    IO_ABS_SCISSORS_T(ppdev, 0);
    IO_ABS_SCISSORS_R(ppdev, ppdev->cxMemory - 1);
    IO_ABS_SCISSORS_B(ppdev, ppdev->cyMemory - 1);
}

/******************************Public*Routine******************************\
* VOID vSetClipping
\**************************************************************************/

VOID vSetClipping(
PDEV*   ppdev,
RECTL*  prclClip)           // In relative coordinates
{
    LONG xOffset;
    LONG yOffset;

    ASSERTDD(prclClip->left + ppdev->xOffset >= 0,
                    "Can't have a negative left!");
    ASSERTDD(prclClip->top + ppdev->yOffset >= 0,
                    "Can't have a negative top!");

    IO_FIFO_WAIT(ppdev, 4);

    xOffset = ppdev->xOffset;
    IO_ABS_SCISSORS_L(ppdev, prclClip->left      + xOffset);
    IO_ABS_SCISSORS_R(ppdev, prclClip->right - 1 + xOffset);
    ASSERTDD(prclClip->right + xOffset <= 1024,
            "Exceeded right scissors bounds");

    yOffset = ppdev->yOffset;
    IO_ABS_SCISSORS_T(ppdev, prclClip->top        + yOffset);
    IO_ABS_SCISSORS_B(ppdev, prclClip->bottom - 1 + yOffset);
    ASSERTDD(prclClip->bottom + yOffset <= 1024,
            "Exceeded bottom scissors bounds");
}