Windows NT 4.0 source code leak
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

/*++
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