mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
247 lines
5.3 KiB
247 lines
5.3 KiB
/*++
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
Jaguar.s
|
|
|
|
Abstract:
|
|
|
|
This module contains the Jaguar specific routines for the GDI driver.
|
|
|
|
Environment:
|
|
|
|
User mode.
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "kxmips.h"
|
|
|
|
#define FG_COLOR 0x48
|
|
#define BG_COLOR 0x50
|
|
#define USED_ENTRIES 0x20
|
|
|
|
#define FifoSize 16
|
|
|
|
.globl FifoRegs // extern PJAGUAR_FIFO FifoRegs;
|
|
.globl Jaguar // extern PJAGUAR_REGISTERS Jaguar;
|
|
.globl FreeEntries
|
|
.data
|
|
|
|
FifoRegs:
|
|
.word 0
|
|
Jaguar:
|
|
.word 0
|
|
FreeEntries:
|
|
.byte 0 // UCHAR FreeEntries = 0;
|
|
|
|
|
|
.text
|
|
|
|
|
|
/*++
|
|
VOID
|
|
FifoWrite(
|
|
IN ULONG DstAdr,
|
|
IN ULONG SrcAdr,
|
|
IN ULONG XYCmd
|
|
)
|
|
|
|
|
|
Routine Description:
|
|
|
|
This routine writes a command to the jaguar fifo.
|
|
|
|
Arguments:
|
|
|
|
DstAdr - Src Address to write to the SrcAdr FIFO register
|
|
SrcAdr Dst Address to write to the DstAdr FIFO register
|
|
XYCmd XYCmd value to write to the XYCmd FIFO register
|
|
|
|
Return Value:
|
|
|
|
NONE
|
|
|
|
{
|
|
while (FreeEntries == 0) {
|
|
UsedEntries = READ_REGISTER_UCHAR(&Jaguar->FifoUsedEntries.Byte);
|
|
FreeEntries = FifoSize - UsedEntries;
|
|
}
|
|
|
|
WRITE_REGISTER_ULONG(&FifoRegs->DstAddr.Long,DstAdr);
|
|
WRITE_REGISTER_ULONG(&FifoRegs->SrcAddr.Long,SrcAdr);
|
|
WRITE_REGISTER_ULONG(&FifoRegs->XYCmd.Long,XYCmd);
|
|
|
|
FreeEntries--;
|
|
}
|
|
--*/
|
|
LEAF_ENTRY(FifoWrite)
|
|
|
|
lbu t0,FreeEntries // get number of Free Entries
|
|
lw t1,FifoRegs // get base of Fifo
|
|
bne t0,zero,Write // if Free Entries go to write
|
|
lw t2,Jaguar // load base of Jaguar
|
|
Poll:
|
|
lbu t3,USED_ENTRIES(t2) // read used entries
|
|
li t4,FifoSize // Compute free entries
|
|
subu t0,t4,t3 // if none is free
|
|
beq t0,zero,Poll // keep polling.
|
|
|
|
Write:
|
|
sw a0,0x0(t1) // Write command to fifo
|
|
sw a1,0x8(t1) //
|
|
sw a2,0x10(t1) //
|
|
addiu t0,t0,-1 // update free entries.
|
|
sb t0,FreeEntries //
|
|
j ra
|
|
.end
|
|
|
|
|
|
/*++
|
|
VOID
|
|
WaitForJaguarIdle(
|
|
)
|
|
|
|
|
|
Routine Description:
|
|
|
|
This routine must wait for the FIFO to drain.
|
|
This routine is called to make sure the accelerator
|
|
has completed all pending commands and the GDI engine can
|
|
do the operations the driver does not support.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
It returns when the FIFO is empty.
|
|
|
|
{
|
|
|
|
if (FreeEntries != FifoSize) {
|
|
while (READ_REGISTER_UCHAR(&Jaguar->FifoUsedEntries.Byte) != 0) {
|
|
}
|
|
FreeEntries = FifoSize;
|
|
}
|
|
}
|
|
--*/
|
|
|
|
LEAF_ENTRY(WaitForJaguarIdle)
|
|
lbu t2,FreeEntries // read free entries
|
|
li t3,FifoSize // if the number of FreeEntries is
|
|
beq t2,t3,10f // the FifoSize then it's empty
|
|
lw t0,Jaguar
|
|
Loop:
|
|
lbu t1,USED_ENTRIES(t0) // read used entries
|
|
bne t1,zero,Loop
|
|
|
|
sb t3,FreeEntries // when we exit jaguar is idle -> we have
|
|
// FifoSize free entries
|
|
10:
|
|
j ra
|
|
.end
|
|
|
|
/*++
|
|
VOID
|
|
DevSetFgColor(
|
|
IN ULONG Color
|
|
)
|
|
|
|
|
|
Routine Description:
|
|
|
|
This routine sets the Jaguar Foreground color register with the given
|
|
color. It first waits for the accelerator to be idle to ensure that
|
|
the color register is not changed while it's being used.
|
|
|
|
|
|
Arguments:
|
|
|
|
Color.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
{
|
|
if (FreeEntries != FifoSize) {
|
|
while (READ_REGISTER_UCHAR(&Jaguar->FifoUsedEntries.Byte) != 0) {
|
|
}
|
|
FreeEntries = FifoSize;
|
|
}
|
|
WRITE_REGISTER_ULONG(&Jaguar->ForegroundColor.Long,Color);
|
|
}
|
|
--*/
|
|
|
|
LEAF_ENTRY(DevSetFgColor)
|
|
lbu t2,FreeEntries // read free entries
|
|
li t3,FifoSize // if the number of FreeEntries is
|
|
lw t0,Jaguar
|
|
beq t2,t3,10f // the FifoSize then it's empty
|
|
|
|
LoopFg:
|
|
lbu t1,USED_ENTRIES(t0) // read used entries
|
|
bne t1,zero,LoopFg
|
|
|
|
sb t3,FreeEntries // when we exit jaguar is idle -> we have
|
|
// FifoSize free entries
|
|
10:
|
|
sw a0,FG_COLOR(t0) // write foreground color
|
|
j ra
|
|
.end
|
|
|
|
|
|
|
|
/*++
|
|
VOID
|
|
DevSetBgColor(
|
|
IN ULONG Color
|
|
)
|
|
|
|
|
|
Routine Description:
|
|
|
|
This routine sets the Jaguar Background color register with the given
|
|
color. The accelerator must be idle to ensure that the color register
|
|
is not changed while it's being used.
|
|
|
|
|
|
Arguments:
|
|
|
|
Color.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
{
|
|
if (FreeEntries != FifoSize) {
|
|
while (READ_REGISTER_UCHAR(&Jaguar->FifoUsedEntries.Byte) != 0) {
|
|
}
|
|
FreeEntries = FifoSize;
|
|
}
|
|
WRITE_REGISTER_ULONG(&Jaguar->BackgroundColor.Long,Color);
|
|
}
|
|
--*/
|
|
|
|
LEAF_ENTRY(DevSetBgColor)
|
|
lbu t2,FreeEntries // read free entries
|
|
li t3,FifoSize // if the number of FreeEntries is
|
|
lw t0,Jaguar
|
|
beq t2,t3,10f // the FifoSize then it's empty
|
|
|
|
LoopBg:
|
|
lbu t1,USED_ENTRIES(t0) // read used entries
|
|
bne t1,zero,LoopBg
|
|
|
|
sb t3,FreeEntries // when we exit jaguar is idle -> we have
|
|
// FifoSize free entries
|
|
10:
|
|
sw a0,BG_COLOR(t0) // write foreground color
|
|
j ra
|
|
.end
|