|
|
1.1 ! root 1: /*++ ! 2: ! 3: Copyright (c) 1992 Microsoft Corporation ! 4: ! 5: Module Name: ! 6: ! 7: Jaguar.s ! 8: ! 9: Abstract: ! 10: ! 11: This module contains the Jaguar specific routines for the GDI driver. ! 12: ! 13: Environment: ! 14: ! 15: User mode. ! 16: ! 17: Revision History: ! 18: ! 19: --*/ ! 20: ! 21: #include "kxmips.h" ! 22: ! 23: #define FG_COLOR 0x48 ! 24: #define BG_COLOR 0x50 ! 25: #define USED_ENTRIES 0x20 ! 26: ! 27: #define FifoSize 16 ! 28: ! 29: .globl FifoRegs // extern PJAGUAR_FIFO FifoRegs; ! 30: .globl Jaguar // extern PJAGUAR_REGISTERS Jaguar; ! 31: .globl FreeEntries ! 32: .data ! 33: ! 34: FifoRegs: ! 35: .word 0 ! 36: Jaguar: ! 37: .word 0 ! 38: FreeEntries: ! 39: .byte 0 // UCHAR FreeEntries = 0; ! 40: ! 41: ! 42: .text ! 43: ! 44: ! 45: /*++ ! 46: VOID ! 47: FifoWrite( ! 48: IN ULONG DstAdr, ! 49: IN ULONG SrcAdr, ! 50: IN ULONG XYCmd ! 51: ) ! 52: ! 53: ! 54: Routine Description: ! 55: ! 56: This routine writes a command to the jaguar fifo. ! 57: ! 58: Arguments: ! 59: ! 60: DstAdr - Src Address to write to the SrcAdr FIFO register ! 61: SrcAdr Dst Address to write to the DstAdr FIFO register ! 62: XYCmd XYCmd value to write to the XYCmd FIFO register ! 63: ! 64: Return Value: ! 65: ! 66: NONE ! 67: ! 68: { ! 69: while (FreeEntries == 0) { ! 70: UsedEntries = READ_REGISTER_UCHAR(&Jaguar->FifoUsedEntries.Byte); ! 71: FreeEntries = FifoSize - UsedEntries; ! 72: } ! 73: ! 74: WRITE_REGISTER_ULONG(&FifoRegs->DstAddr.Long,DstAdr); ! 75: WRITE_REGISTER_ULONG(&FifoRegs->SrcAddr.Long,SrcAdr); ! 76: WRITE_REGISTER_ULONG(&FifoRegs->XYCmd.Long,XYCmd); ! 77: ! 78: FreeEntries--; ! 79: } ! 80: --*/ ! 81: LEAF_ENTRY(FifoWrite) ! 82: ! 83: lbu t0,FreeEntries // get number of Free Entries ! 84: lw t1,FifoRegs // get base of Fifo ! 85: bne t0,zero,Write // if Free Entries go to write ! 86: lw t2,Jaguar // load base of Jaguar ! 87: Poll: ! 88: lbu t3,USED_ENTRIES(t2) // read used entries ! 89: li t4,FifoSize // Compute free entries ! 90: subu t0,t4,t3 // if none is free ! 91: beq t0,zero,Poll // keep polling. ! 92: ! 93: Write: ! 94: sw a0,0x0(t1) // Write command to fifo ! 95: sw a1,0x8(t1) // ! 96: sw a2,0x10(t1) // ! 97: addiu t0,t0,-1 // update free entries. ! 98: sb t0,FreeEntries // ! 99: j ra ! 100: .end ! 101: ! 102: ! 103: /*++ ! 104: VOID ! 105: WaitForJaguarIdle( ! 106: ) ! 107: ! 108: ! 109: Routine Description: ! 110: ! 111: This routine must wait for the FIFO to drain. ! 112: This routine is called to make sure the accelerator ! 113: has completed all pending commands and the GDI engine can ! 114: do the operations the driver does not support. ! 115: ! 116: Arguments: ! 117: ! 118: None. ! 119: ! 120: Return Value: ! 121: ! 122: It returns when the FIFO is empty. ! 123: ! 124: { ! 125: ! 126: if (FreeEntries != FifoSize) { ! 127: while (READ_REGISTER_UCHAR(&Jaguar->FifoUsedEntries.Byte) != 0) { ! 128: } ! 129: FreeEntries = FifoSize; ! 130: } ! 131: } ! 132: --*/ ! 133: ! 134: LEAF_ENTRY(WaitForJaguarIdle) ! 135: lbu t2,FreeEntries // read free entries ! 136: li t3,FifoSize // if the number of FreeEntries is ! 137: beq t2,t3,10f // the FifoSize then it's empty ! 138: lw t0,Jaguar ! 139: Loop: ! 140: lbu t1,USED_ENTRIES(t0) // read used entries ! 141: bne t1,zero,Loop ! 142: ! 143: sb t3,FreeEntries // when we exit jaguar is idle -> we have ! 144: // FifoSize free entries ! 145: 10: ! 146: j ra ! 147: .end ! 148: ! 149: /*++ ! 150: VOID ! 151: DevSetFgColor( ! 152: IN ULONG Color ! 153: ) ! 154: ! 155: ! 156: Routine Description: ! 157: ! 158: This routine sets the Jaguar Foreground color register with the given ! 159: color. It first waits for the accelerator to be idle to ensure that ! 160: the color register is not changed while it's being used. ! 161: ! 162: ! 163: Arguments: ! 164: ! 165: Color. ! 166: ! 167: Return Value: ! 168: ! 169: None. ! 170: ! 171: { ! 172: if (FreeEntries != FifoSize) { ! 173: while (READ_REGISTER_UCHAR(&Jaguar->FifoUsedEntries.Byte) != 0) { ! 174: } ! 175: FreeEntries = FifoSize; ! 176: } ! 177: WRITE_REGISTER_ULONG(&Jaguar->ForegroundColor.Long,Color); ! 178: } ! 179: --*/ ! 180: ! 181: LEAF_ENTRY(DevSetFgColor) ! 182: lbu t2,FreeEntries // read free entries ! 183: li t3,FifoSize // if the number of FreeEntries is ! 184: lw t0,Jaguar ! 185: beq t2,t3,10f // the FifoSize then it's empty ! 186: ! 187: LoopFg: ! 188: lbu t1,USED_ENTRIES(t0) // read used entries ! 189: bne t1,zero,LoopFg ! 190: ! 191: sb t3,FreeEntries // when we exit jaguar is idle -> we have ! 192: // FifoSize free entries ! 193: 10: ! 194: sw a0,FG_COLOR(t0) // write foreground color ! 195: j ra ! 196: .end ! 197: ! 198: ! 199: ! 200: /*++ ! 201: VOID ! 202: DevSetBgColor( ! 203: IN ULONG Color ! 204: ) ! 205: ! 206: ! 207: Routine Description: ! 208: ! 209: This routine sets the Jaguar Background color register with the given ! 210: color. The accelerator must be idle to ensure that the color register ! 211: is not changed while it's being used. ! 212: ! 213: ! 214: Arguments: ! 215: ! 216: Color. ! 217: ! 218: Return Value: ! 219: ! 220: None. ! 221: ! 222: { ! 223: if (FreeEntries != FifoSize) { ! 224: while (READ_REGISTER_UCHAR(&Jaguar->FifoUsedEntries.Byte) != 0) { ! 225: } ! 226: FreeEntries = FifoSize; ! 227: } ! 228: WRITE_REGISTER_ULONG(&Jaguar->BackgroundColor.Long,Color); ! 229: } ! 230: --*/ ! 231: ! 232: LEAF_ENTRY(DevSetBgColor) ! 233: lbu t2,FreeEntries // read free entries ! 234: li t3,FifoSize // if the number of FreeEntries is ! 235: lw t0,Jaguar ! 236: beq t2,t3,10f // the FifoSize then it's empty ! 237: ! 238: LoopBg: ! 239: lbu t1,USED_ENTRIES(t0) // read used entries ! 240: bne t1,zero,LoopBg ! 241: ! 242: sb t3,FreeEntries // when we exit jaguar is idle -> we have ! 243: // FifoSize free entries ! 244: 10: ! 245: sw a0,BG_COLOR(t0) // write foreground color ! 246: j ra ! 247: .end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.