|
|
1.1 ! root 1: // TITLE("Glyph Scanline Output") ! 2: //++ ! 3: // ! 4: // Copyright (c) 1992 Microsoft Corporation ! 5: // ! 6: // Module Name: ! 7: // ! 8: // glyphout.s ! 9: // ! 10: // Abstract: ! 11: // ! 12: // This module implements the code necessary to output a single glyph ! 13: // either in opaque or transparent mode. ! 14: // ! 15: // Environment: ! 16: // ! 17: // User mode only. ! 18: // ! 19: // Revision History: ! 20: // ! 21: //-- ! 22: ! 23: #include "kxmips.h" ! 24: ! 25: // ! 26: // Define opaque dispatch table. ! 27: // ! 28: ! 29: .rdata ! 30: .globl DrvpOpaqueTable ! 31: DrvpOpaqueTable: // ! 32: .word DrvpOutputOpaque1.2.3.4 // 1, 2, 3, or 4 pixels ! 33: .word DrvpOutputOpaque5.6.7.8 // 5, 6, 7, or 8 pixels ! 34: .word DrvpOutputOpaque9.10.11.12 // 9, 10, 11, or 12 pixels ! 35: .word DrvpOutputOpaque13.14.15.16 // 13, 14, 15, or 16 pixels ! 36: .word DrvpOutputOpaque17.18.19.20 // 17, 18, 19, or 20 pixels ! 37: .word DrvpOutputOpaque21.22.23.24 // 21, 22, 23, or 24 pixels ! 38: .word DrvpOutputOpaque25.26.27.28 // 25. 26, 27, or 28 pixels ! 39: .word DrvpOutputOpaque29.30.31.32 // 29, 30, 31, or 32 pixels ! 40: ! 41: SBTTL("Output Glyph Opaque") ! 42: //++ ! 43: // ! 44: // VOID ! 45: // DrvpOutputGlyphOpaque ( ! 46: // IN PBYTE DrawPoint, ! 47: // IN PULONG GlyphBits, ! 48: // IN ULONG GlyphWidth, ! 49: // IN ULONG GlyphHeight ! 50: // ) ! 51: // ! 52: // Routine Description: ! 53: // ! 54: // The following routines decode and expand a single scan line of a ! 55: // glyph. If the draw point is the display surface, then the scan line ! 56: // is written directly to the display surface. Otherwise, it is buffered ! 57: // into a complete scan line and written to the display surface all at ! 58: // by the calling routine. ! 59: // ! 60: // N.B. These routines only handles glyphs from 1 to 32 pixels in width. ! 61: // ! 62: // Arguments: ! 63: // ! 64: // DrawPoint (a0) - Supplies a pointer to the starting pixel of the ! 65: // glyph scanline. ! 66: // ! 67: // GlyphBitmap (a1) - Supplies a pointer to the glyph scanline bitmap. ! 68: // ! 69: // GlyphWidth (a2) - Supplies the glyph width in pixels. ! 70: // ! 71: // GlyphHeigth (a3) - Supplies the glyph height in pixels. ! 72: // ! 73: // Return Value: ! 74: // ! 75: // None. ! 76: // ! 77: //-- ! 78: ! 79: LEAF_ENTRY(DrvpOutputGlyphOpaque) ! 80: ! 81: ! 82: // ! 83: // Glyph output for 1, 2, 3, or 4 pixel wide glyphs. ! 84: // ! 85: ! 86: ALTERNATE_ENTRY(DrvpOutputOpaque1.2.3.4) ! 87: ! 88: la t0,DrvpDrawColorTable // set base address of color table ! 89: lw t3,DrvpScanLineWidth // get scanline stride in bytes ! 90: and t1,a0,0x3 // isolate draw point alignment bits ! 91: li t2,4 // compute number of pixels to alignment ! 92: subu t2,t2,t1 // ! 93: addu t4,a3,a1 // compute ending address of glyph bits ! 94: addu a3,a2,a0 // compute trailing alignment address ! 95: subu a3,a3,1 // ! 96: nor t1,a3,zero // compute trailing byte left shift ! 97: and t1,t1,0x3 // ! 98: sll t1,t1,3 // ! 99: ! 100: .set noreorder ! 101: .set noat ! 102: sltu v0,t2,a2 // check if two nibbles required ! 103: bne zero,v0,20f // if ne, two nibbles required ! 104: sub a3,a3,t3 // offset address by scan line stride ! 105: .set at ! 106: .set reorder ! 107: ! 108: la t5,10f - (16 * 4) // get base address of code templates ! 109: sll t6,a2,6 // compute offset index ! 110: addu t5,t5,t6 // compute code dispatch address ! 111: j t5 // dispatch to routine ! 112: ! 113: // ! 114: // One pixel is required for 1, 2, 3, or 4 pixel wide glyph. ! 115: // ! 116: ! 117: .set noreorder ! 118: .set noat ! 119: 10: lbu v0,0(a1) // get next set of glyph pixels ! 120: addu a1,a1,1 // advance to next set of glyph pixels ! 121: srl v1,v0,2 // shift high nibble into position ! 122: and v1,v1,0xf << 2 // isolate color table index ! 123: addu v1,v1,t0 // compute color table address ! 124: lw v1,0(v1) // get color table entry ! 125: nop // fill ! 126: ! 127: // ! 128: // sb required. ! 129: // ! 130: ! 131: sb v1,0(a0) // store first pixel ! 132: bne a1,t4,10b // if ne, more scan lines to process ! 133: add a0,a0,t3 // compute next draw point address ! 134: j ra // return ! 135: nop // fill ! 136: nop // ! 137: nop // ! 138: nop // ! 139: nop // ! 140: .set at ! 141: .set reorder ! 142: ! 143: // ! 144: // Two pixels are required for 2, 3, or 4 pixel wide glyph. ! 145: // ! 146: ! 147: .set noreorder ! 148: .set noat ! 149: 13: lbu v0,0(a1) // get next set of glyph pixels ! 150: addu a1,a1,1 // advance to next set of glyph pixels ! 151: srl v1,v0,2 // shift high nibble into position ! 152: and v1,v1,0xf << 2 // isolate color table index ! 153: addu v1,v1,t0 // compute color table address ! 154: lw v1,0(v1) // get color table entry ! 155: nop // fill ! 156: srl t5,v1,8 // shift second pixel into position ! 157: ! 158: // ! 159: // sb, sb required. ! 160: // ! 161: ! 162: sb v1,0(a0) // store first pixel ! 163: sb t5,1(a0) // store second pixel ! 164: bne a1,t4,13b // if ne, more scan lines to process ! 165: add a0,a0,t3 // compute next draw point address ! 166: j ra // return ! 167: nop // fill ! 168: nop // ! 169: nop // ! 170: .set at ! 171: .set reorder ! 172: ! 173: // ! 174: // Three pixels are required for 3 or 4 pixel wide glyph. ! 175: // ! 176: ! 177: .set noreorder ! 178: .set noat ! 179: 15: lbu v0,0(a1) // get next set of glyph pixels ! 180: addu a1,a1,1 // advance to next set of glyph pixels ! 181: srl v1,v0,2 // shift high nibble into position ! 182: and v1,v1,0xf << 2 // isolate color table index ! 183: addu v1,v1,t0 // compute color table address ! 184: lw v1,0(v1) // get color table entry ! 185: nop // fill ! 186: srl t5,v1,8 // shift second pixel into position ! 187: srl t6,v1,16 // shift third pixel into position ! 188: ! 189: // ! 190: // sb, sb, sb required. ! 191: // ! 192: ! 193: sb v1,0(a0) // store first pixel ! 194: sb t5,1(a0) // store second pixel ! 195: sb t6,2(a0) // store third pixel ! 196: bne a1,t4,15b // if ne, more scan lines to process ! 197: add a0,a0,t3 // compute next draw point address ! 198: j ra // return ! 199: nop // fill ! 200: .set at ! 201: .set reorder ! 202: ! 203: // ! 204: // Four pixels are required for 4 pixel wide glyph. ! 205: // ! 206: ! 207: .set noreorder ! 208: .set noat ! 209: 17: lbu v0,0(a1) // get next set of glyph pixels ! 210: addu a1,a1,1 // advance to next set of glyph pixels ! 211: srl v1,v0,2 // shift high nibble into position ! 212: and v1,v1,0xf << 2 // isolate color table index ! 213: addu v1,v1,t0 // compute color table address ! 214: lw v1,0(v1) // get color table entry ! 215: nop // fill ! 216: ! 217: // ! 218: // sw required. ! 219: // ! 220: ! 221: sw v1,0(a0) // store first nibble ! 222: bne a1,t4,17b // if ne, more scan lines to process ! 223: add a0,a0,t3 // compute next draw point address ! 224: j ra // return ! 225: nop // fill ! 226: .set at ! 227: .set reorder ! 228: ! 229: // ! 230: // Two nibbles are required for 1, 2, 3, or 4 pixel wide glyph. ! 231: // ! 232: ! 233: .set noreorder ! 234: .set noat ! 235: 20: lbu v0,0(a1) // get next set of glyph pixels ! 236: addu a1,a1,1 // advance to next set of glyph pixels ! 237: srl v1,v0,2 // shift high nibble into position ! 238: and v1,v1,0xf << 2 // isolate color table index ! 239: addu v1,v1,t0 // compute color table address ! 240: lw t5,0(v1) // get color table entry ! 241: sll v0,v0,t2 // shift out alignment pixels ! 242: srl v1,v0,2 // shift next nibble into position ! 243: and v1,v1,0xf << 2 // isolate color table index ! 244: addu v1,v1,t0 // compute color table address ! 245: lw t6,0(v1) // get color table entry ! 246: add a3,a3,t3 // compute trailing byte address ! 247: sll t6,t6,t1 // shift high nibble into place ! 248: ! 249: // ! 250: // swr, swl required. ! 251: // ! 252: ! 253: swr t5,0(a0) // store left nibble ! 254: swl t6,0(a3) // store right nibble ! 255: bne a1,t4,20b // if ne, more scan lines to process ! 256: add a0,a0,t3 // compute next draw point address ! 257: .set at ! 258: .set reorder ! 259: ! 260: j ra // return ! 261: ! 262: // ! 263: // Glyph output for 5, 6, 7, or 8 pixel wide glyphs. ! 264: // ! 265: ! 266: ALTERNATE_ENTRY(DrvpOutputOpaque5.6.7.8) ! 267: ! 268: la t0,DrvpDrawColorTable // set base address of color table ! 269: lw t3,DrvpScanLineWidth // get scanline stride in bytes ! 270: and t1,a0,0x3 // isolate draw point alignment bits ! 271: li t2,4 // compute number of pixels to alignment ! 272: subu t2,t2,t1 // ! 273: addu t4,a3,a1 // compute ending address of glyph bits ! 274: addu a3,a2,a0 // compute trailing alignment address ! 275: subu a3,a3,1 // ! 276: nor t1,a3,zero // compute trailing byte left shift ! 277: and t1,t1,0x3 // ! 278: sll t1,t1,3 // ! 279: ! 280: .set noreorder ! 281: .set noat ! 282: addu t5,t2,4 // compute two nibble boundary ! 283: sltu v0,t5,a2 // check if three nibbles required ! 284: beq zero,v0,20b // if eq, two nibbles required ! 285: sub a3,a3,t3 // offset address by scan line stride ! 286: .set at ! 287: .set reorder ! 288: ! 289: // ! 290: // Three nibbles are required for 5, 6, 7, or 8 pixel wide glyph. ! 291: // ! 292: ! 293: .set noreorder ! 294: .set noat ! 295: 10: lbu v0,0(a1) // get next set of glyph pixels ! 296: addu a1,a1,1 // advance to next set of glyph pixels ! 297: srl v1,v0,2 // shift high nibble into position ! 298: and v1,v1,0xf << 2 // isolate color table index ! 299: addu v1,v1,t0 // compute color table address ! 300: lw t5,0(v1) // get color table entry ! 301: sll v0,v0,t2 // shift out alignment pixels ! 302: srl v1,v0,2 // shift next nibble into position ! 303: and v1,v1,0xf << 2 // isolate color table index ! 304: addu v1,v1,t0 // compute color table address ! 305: lw t6,0(v1) // get color table entry ! 306: sll v1,v0,2 // shift low nibble into position ! 307: and v1,v1,0xf << 2 // isolate color table index ! 308: addu v1,v1,t0 // compute color table address ! 309: lw t7,0(v1) // get color table entry ! 310: addu a2,a0,t2 // compute aligned draw point address ! 311: add a3,a3,t3 // compute trailing byte address ! 312: sll t7,t7,t1 // shift high nibble into place ! 313: ! 314: // ! 315: // swr, sw, swl required. ! 316: // ! 317: ! 318: swr t5,0(a0) // store left nibble ! 319: sw t6,0(a2) // store middle nibble ! 320: swl t7,0(a3) // store right nibble ! 321: bne a1,t4,10b // if ne, more scan lines to process ! 322: add a0,a0,t3 // compute next draw point address ! 323: .set at ! 324: .set reorder ! 325: ! 326: j ra // return ! 327: ! 328: // ! 329: // Glyph output for 9, 10, 11, and 12 pixel wide glyphs. ! 330: // ! 331: ! 332: ALTERNATE_ENTRY(DrvpOutputOpaque9.10.11.12) ! 333: ! 334: la t0,DrvpDrawColorTable // set base address of color table ! 335: lw t3,DrvpScanLineWidth // get scanline stride in bytes ! 336: and t1,a0,0x3 // isolate draw point alignment bits ! 337: li t2,4 // compute number of pixels to alignment ! 338: subu t2,t2,t1 // ! 339: addu t4,a3,a3 // compute the total size of the glyph ! 340: addu t4,t4,a1 // compute ending address of glyph bits ! 341: addu a3,a2,a0 // compute trailing alignment address ! 342: subu a3,a3,1 // ! 343: nor t1,a3,zero // compute trailing byte left shift ! 344: and t1,t1,0x3 // ! 345: sll t1,t1,3 // ! 346: ! 347: .set noreorder ! 348: .set noat ! 349: addu t5,t2,8 // compute three nibble boundary ! 350: sltu v0,t5,a2 // Check if four nibbles required ! 351: ! 352: #if defined(R4000) ! 353: ! 354: bne zero,v0,20f // if ne, four nibbles required ! 355: ! 356: #else ! 357: ! 358: bne zero,v0,30f // if ne, four nibbles required ! 359: ! 360: #endif ! 361: ! 362: sub a3,a3,t3 // offset address by scan line stride ! 363: .set at ! 364: .set reorder ! 365: ! 366: // ! 367: // Three nibbles are required for 9, 10, 11, or 12 pixel wide glyph. ! 368: // ! 369: ! 370: .set noreorder ! 371: .set noat ! 372: 10: lhu v0,0(a1) // get next set of glyph pixels ! 373: addu a1,a1,2 // advance to next set of glyph pixels ! 374: sll v1,v0,8 // shift high pixel bits into position ! 375: srl v0,v0,8 // shift low pixel bits into position ! 376: or v0,v0,v1 // merge swap big endian pixel bytes ! 377: srl v1,v0,12 - 2 // shift high nibble into position ! 378: and v1,v1,0xf << 2 // isolate color table index ! 379: addu v1,v1,t0 // compute color table address ! 380: lw t5,0(v1) // get color table entry ! 381: sll v0,v0,t2 // shift out alignment pixels ! 382: srl v1,v0,12 - 2 // shift next nibble into position ! 383: and v1,v1,0xf << 2 // isolate color table index ! 384: addu v1,v1,t0 // compute color table address ! 385: lw t6,0(v1) // get color table entry ! 386: srl v1,v0,8 - 2 // shift low nibble into position ! 387: and v1,v1,0xf << 2 // isolate color table index ! 388: addu v1,v1,t0 // compute color table address ! 389: lw t7,0(v1) // get color table entry ! 390: addu a2,a0,t2 // compute aligned draw point address ! 391: add a3,a3,t3 // compute trailing byte address ! 392: sll t7,t7,t1 // shift high nibble into place ! 393: ! 394: // ! 395: // swr, sw, swl required. ! 396: // ! 397: ! 398: swr t5,0(a0) // store left nibble ! 399: sw t6,0(a2) // store middle nibble ! 400: swl t7,0(a3) // store right nibble ! 401: bne a1,t4,10b // if ne, more scan lines to process ! 402: add a0,a0,t3 // compute next draw point address ! 403: .set at ! 404: .set reorder ! 405: ! 406: j ra // return ! 407: ! 408: // ! 409: // Four nibbles are required for 9, 10, 11, or 12 pixel wide glyph. ! 410: // ! 411: ! 412: #if defined(R4000) ! 413: ! 414: 20: and t5,a0,1 << 2 // check if middle quadword aligned ! 415: bne zero,t5,40f // if ne, middle is quadword aligned ! 416: ! 417: #endif ! 418: ! 419: .set noreorder ! 420: .set noat ! 421: 30: lhu v0,0(a1) // get next set of glyph pixels ! 422: addu a1,a1,2 // advance to next set of glyph pixels ! 423: sll v1,v0,8 // shift high pixel bits into position ! 424: srl v0,v0,8 // shift low pixel bits into position ! 425: or v0,v0,v1 // merge swap big endian pixel bytes ! 426: srl v1,v0,12 - 2 // shift high nibble into position ! 427: and v1,v1,0xf << 2 // isolate color table index ! 428: addu v1,v1,t0 // compute color table address ! 429: lw t5,0(v1) // get color table entry ! 430: sll v0,v0,t2 // shift out alignment pixels ! 431: srl v1,v0,12 - 2 // shift next nibble into position ! 432: and v1,v1,0xf << 2 // isolate color table index ! 433: addu v1,v1,t0 // compute color table address ! 434: lw t6,0(v1) // get color table entry ! 435: srl v1,v0,8 - 2 // shift next nibble into position ! 436: and v1,v1,0xf << 2 // isolate color table index ! 437: addu v1,v1,t0 // compute color table address ! 438: lw t7,0(v1) // get color table entry ! 439: srl v1,v0,4 - 2 // shift low nibble into position ! 440: and v1,v1,0xf << 2 // isolate color table index ! 441: addu v1,v1,t0 // compute color table address ! 442: lw t8,0(v1) // get color table entry ! 443: addu a2,a0,t2 // compute aligned draw point address ! 444: add a3,a3,t3 // compute trailing byte address ! 445: sll t8,t8,t1 // shift high nibble into place ! 446: ! 447: // ! 448: // swr, sw, sw, swl required. ! 449: // ! 450: ! 451: swr t5,0(a0) // store left nibble ! 452: sw t6,0(a2) // store low middle nibble ! 453: sw t7,4(a2) // store high middle nibble ! 454: swl t8,0(a3) // store right nibble ! 455: bne a1,t4,30b // if ne, more scan lines to process ! 456: add a0,a0,t3 // compute next draw point address ! 457: .set at ! 458: .set reorder ! 459: ! 460: j ra // return ! 461: ! 462: // ! 463: // Four nibbles are required for 9, 10, 11, or 12 pixel wide glyph. The ! 464: // middle pixels are quadword aligned. ! 465: // ! 466: ! 467: #if defined(R4000) ! 468: ! 469: .set noreorder ! 470: .set noat ! 471: 40: lhu v0,0(a1) // get next set of glyph pixels ! 472: addu a1,a1,2 // advance to next set of glyph pixels ! 473: sll v1,v0,8 // shift high pixel bits into position ! 474: srl v0,v0,8 // shift low pixel bits into position ! 475: or v0,v0,v1 // merge swap big endian pixel bytes ! 476: srl v1,v0,12 - 2 // shift high nibble into position ! 477: and v1,v1,0xf << 2 // isolate color table index ! 478: addu v1,v1,t0 // compute color table address ! 479: lw t5,0(v1) // get color table entry ! 480: sll v0,v0,t2 // shift out alignment pixels ! 481: srl v1,v0,12 - 2 // shift next nibble into position ! 482: and v1,v1,0xf << 2 // isolate color table index ! 483: addu v1,v1,t0 // compute color table address ! 484: lwc1 f0,0(v1) // get color table entry ! 485: srl v1,v0,8 - 2 // shift next nibble into position ! 486: and v1,v1,0xf << 2 // isolate color table index ! 487: addu v1,v1,t0 // compute color table address ! 488: lwc1 f1,0(v1) // get color table entry ! 489: srl v1,v0,4 - 2 // shift low nibble into position ! 490: and v1,v1,0xf << 2 // isolate color table index ! 491: addu v1,v1,t0 // compute color table address ! 492: lw t6,0(v1) // get color table entry ! 493: addu a2,a0,t2 // compute aligned draw point address ! 494: add a3,a3,t3 // compute trailing byte address ! 495: sll t6,t6,t1 // shift high nibble into place ! 496: ! 497: // ! 498: // swr, sw, sw, swl required. ! 499: // ! 500: ! 501: swr t5,0(a0) // store left nibble ! 502: sdc1 f0,0(a2) // store middle nibbles ! 503: swl t6,0(a3) // store right nibble ! 504: bne a1,t4,40b // if ne, more scan lines to process ! 505: add a0,a0,t3 // compute next draw point address ! 506: .set at ! 507: .set reorder ! 508: ! 509: j ra // return ! 510: ! 511: #endif ! 512: ! 513: // ! 514: // Glyph output for 13, 14, 15, and 16 pixel wide glyphs. ! 515: // ! 516: ! 517: ALTERNATE_ENTRY(DrvpOutputOpaque13.14.15.16) ! 518: ! 519: la t0,DrvpDrawColorTable // set base address of color table ! 520: lw t3,DrvpScanLineWidth // get scanline stride in bytes ! 521: and t1,a0,0x3 // isolate draw point alignment bits ! 522: li t2,4 // compute number of pixels to alignment ! 523: subu t2,t2,t1 // ! 524: addu t4,a3,a3 // compute the total size of the glyph ! 525: addu t4,t4,a1 // compute ending address of glyph bits ! 526: addu a3,a2,a0 // compute trailing alignment address ! 527: subu a3,a3,1 // ! 528: nor t1,a3,zero // compute trailing byte left shift ! 529: and t1,t1,0x3 // ! 530: sll t1,t1,3 // ! 531: ! 532: .set noreorder ! 533: .set noat ! 534: addu t5,t2,12 // compute four nibble boundary ! 535: sltu v0,t5,a2 // check if five nibbles required ! 536: ! 537: #if defined(R4000) ! 538: ! 539: beq zero,v0,20b // if eq, four nibbles required ! 540: ! 541: #else ! 542: ! 543: beq zero,v0,30b // if eq, four nibbles required ! 544: ! 545: #endif ! 546: ! 547: sub a3,a3,t3 // offset address by scan line stride ! 548: .set at ! 549: .set reorder ! 550: ! 551: // ! 552: // Five nibbles are required for 13, 14, 15, or 16 pixel wide glyph. ! 553: // ! 554: ! 555: #if defined(R4000) ! 556: ! 557: and t5,a0,1 << 2 // check if middle quadword aligned ! 558: bne zero,t5,20f // if ne, middle is quadword aligned ! 559: ! 560: #endif ! 561: ! 562: .set noreorder ! 563: .set noat ! 564: 10: lhu v0,0(a1) // get next set of glyph pixels ! 565: addu a1,a1,2 // advance to next set of glyph pixels ! 566: sll v1,v0,8 // shift high pixel bits into position ! 567: srl v0,v0,8 // shift low pixel bits into position ! 568: or v0,v0,v1 // merge swap big endian pixel bytes ! 569: srl v1,v0,12 - 2 // shift high nibble into position ! 570: and v1,v1,0xf << 2 // isolate color table index ! 571: addu v1,v1,t0 // compute color table address ! 572: lw t5,0(v1) // get color table entry ! 573: sll v0,v0,t2 // shift out alignment pixels ! 574: srl v1,v0,12 - 2 // shift next nibble into position ! 575: and v1,v1,0xf << 2 // isolate color table index ! 576: addu v1,v1,t0 // compute color table address ! 577: lw t6,0(v1) // get color table entry ! 578: srl v1,v0,8 - 2 // shift next nibble into position ! 579: and v1,v1,0xf << 2 // isolate color table index ! 580: addu v1,v1,t0 // compute color table address ! 581: lwc1 f0,0(v1) // get color table entry ! 582: srl v1,v0,4 - 2 // shift next nibble into position ! 583: and v1,v1,0xf << 2 // isolate color table index ! 584: addu v1,v1,t0 // compute color table address ! 585: lwc1 f1,0(v1) // get color table entry ! 586: sll v1,v0,2 // shift low nibble into position ! 587: and v1,v1,0xf << 2 // isolate color table index ! 588: addu v1,v1,t0 // compute color table address ! 589: lw t7,0(v1) // get color table entry ! 590: addu a2,a0,t2 // compute aligned draw point address ! 591: add a3,a3,t3 // compute trailing byte address ! 592: sll t7,t7,t1 // shift high nibble into place ! 593: ! 594: // ! 595: // swr, sw, sw, sw, swl required. ! 596: // ! 597: ! 598: swr t5,0(a0) // store left nibble ! 599: sw t6,0(a2) // store low middle nibble ! 600: ! 601: #if defined(R4000) ! 602: ! 603: sdc1 f0,4(a2) // store middle nibbles ! 604: ! 605: #else ! 606: ! 607: swc1 f0,4(a2) // store low middle nibble ! 608: swc1 f1,8(a2) // store high middle nibble ! 609: ! 610: #endif ! 611: ! 612: swl t7,0(a3) // store right nibble ! 613: bne a1,t4,10b // if ne, more scan lines to process ! 614: add a0,a0,t3 // compute next draw point address ! 615: .set at ! 616: .set reorder ! 617: ! 618: j ra // return ! 619: ! 620: // ! 621: // Five nibbles are required for 13, 14, 15, or 16 pixel wide glyph. The ! 622: // middle pixels are quadword aligned. ! 623: // ! 624: ! 625: #if defined(R4000) ! 626: ! 627: .set noreorder ! 628: .set noat ! 629: 20: lhu v0,0(a1) // get next set of glyph pixels ! 630: addu a1,a1,2 // advance to next set of glyph pixels ! 631: sll v1,v0,8 // shift high pixel bits into position ! 632: srl v0,v0,8 // shift low pixel bits into position ! 633: or v0,v0,v1 // merge swap big endian pixel bytes ! 634: srl v1,v0,12 - 2 // shift high nibble into position ! 635: and v1,v1,0xf << 2 // isolate color table index ! 636: addu v1,v1,t0 // compute color table address ! 637: lw t5,0(v1) // get color table entry ! 638: sll v0,v0,t2 // shift out alignment pixels ! 639: srl v1,v0,12 - 2 // shift next nibble into position ! 640: and v1,v1,0xf << 2 // isolate color table index ! 641: addu v1,v1,t0 // compute color table address ! 642: lwc1 f0,0(v1) // get color table entry ! 643: srl v1,v0,8 - 2 // shift next nibble into position ! 644: and v1,v1,0xf << 2 // isolate color table index ! 645: addu v1,v1,t0 // compute color table address ! 646: lwc1 f1,0(v1) // get color table entry ! 647: srl v1,v0,4 - 2 // shift next nibble into position ! 648: and v1,v1,0xf << 2 // isolate color table index ! 649: addu v1,v1,t0 // compute color table address ! 650: lw t6,0(v1) // get color table entry ! 651: sll v1,v0,2 // shift low nibble into position ! 652: and v1,v1,0xf << 2 // isolate color table index ! 653: addu v1,v1,t0 // compute color table address ! 654: lw t7,0(v1) // get color table entry ! 655: addu a2,a0,t2 // compute aligned draw point address ! 656: add a3,a3,t3 // compute trailing byte address ! 657: sll t7,t7,t1 // shift high nibble into place ! 658: ! 659: // ! 660: // swr, sw, sw, sw, swl required. ! 661: // ! 662: ! 663: swr t5,0(a0) // store left nibble ! 664: sdc1 f0,0(a2) // store middle nibbles ! 665: sw t6,8(a2) // store high middle nibble ! 666: swl t7,0(a3) // store right nibble ! 667: bne a1,t4,20b // if ne, more scan lines to process ! 668: add a0,a0,t3 // compute next draw point address ! 669: .set at ! 670: .set reorder ! 671: ! 672: j ra // return ! 673: ! 674: #endif ! 675: ! 676: // ! 677: // Glyph output for 17, 18, 19, and 20 pixel wide glyphs. ! 678: // ! 679: ! 680: ALTERNATE_ENTRY(DrvpOutputOpaque17.18.19.20) ! 681: ! 682: la t0,DrvpDrawColorTable // set base address of color table ! 683: lw t3,DrvpScanLineWidth // get scanline stride in bytes ! 684: and t1,a0,0x3 // isolate draw point alignment bits ! 685: li t2,4 // compute number of pixels to alignment ! 686: subu t2,t2,t1 // ! 687: addu t4,a3,a3 // compute the total size of the glyph ! 688: addu t4,t4,a3 // ! 689: addu t4,t4,a1 // compute ending address of glyph bits ! 690: addu a3,a2,a0 // compute trailing alignment address ! 691: subu a3,a3,1 // ! 692: nor t1,a3,zero // compute trailing byte left shift ! 693: and t1,t1,0x3 // ! 694: sll t1,t1,3 // ! 695: li t9,0xffffff // set glyph mask value ! 696: ! 697: .set noreorder ! 698: .set noat ! 699: addu t5,t2,16 // compute five nibble boundary ! 700: sltu v0,t5,a2 // check if six nibbles required ! 701: ! 702: #if defined(R4000) ! 703: ! 704: bne zero,v0,30f // if ne, six nibbles required ! 705: ! 706: #else ! 707: ! 708: bne zero,v0,40f // if ne, six nibbles required ! 709: ! 710: #endif ! 711: ! 712: sub a3,a3,t3 // offset address by scan line stride ! 713: .set at ! 714: .set reorder ! 715: ! 716: // ! 717: // Five nibbles are required for 17, 18, 19, or 20 pixel wide glyph. ! 718: // ! 719: ! 720: #if defined(R4000) ! 721: ! 722: and t5,a0,1 << 2 // check if middle quadword aligned ! 723: bne zero,t5,20f // if ne, middle is quadword aligned ! 724: ! 725: #endif ! 726: ! 727: .set noreorder ! 728: .set noat ! 729: 10: lwr v0,0(a1) // get next set of glyph pixels ! 730: lwl v0,3(a1) // ! 731: addu a1,a1,3 // advance to next set of glyph pixels ! 732: and v0,v0,t9 // isolate glyph bits ! 733: sll v1,v0,16 // shift high pixel bits into position ! 734: and t5,v0,0xff << 8 // isolate middle pixel bits ! 735: srl v0,v0,16 // shift low pixel bits into position ! 736: or v0,v0,v1 // merge swap big endian pixel bytes ! 737: or v0,v0,t5 // ! 738: srl v1,v0,20 - 2 // shift high nibble into position ! 739: and v1,v1,0xf << 2 // isolate color table index ! 740: addu v1,v1,t0 // compute color table address ! 741: lw t5,0(v1) // get color table entry ! 742: sll v0,v0,t2 // shift out alignment pixels ! 743: srl v1,v0,20 - 2 // shift next nibble into position ! 744: and v1,v1,0xf << 2 // isolate color table index ! 745: addu v1,v1,t0 // compute color table address ! 746: lw t6,0(v1) // get color table entry ! 747: srl v1,v0,16 - 2 // shift next nibble into position ! 748: and v1,v1,0xf << 2 // isolate color table index ! 749: addu v1,v1,t0 // compute color table address ! 750: lwc1 f0,0(v1) // get color table entry ! 751: srl v1,v0,12 - 2 // shift next nibble into position ! 752: and v1,v1,0xf << 2 // isolate color table index ! 753: addu v1,v1,t0 // compute color table address ! 754: lwc1 f1,0(v1) // get color table entry ! 755: srl v1,v0,8 - 2 // shift low nibble into position ! 756: and v1,v1,0xf << 2 // isolate color table index ! 757: addu v1,v1,t0 // compute color table address ! 758: lw t7,0(v1) // get color table entry ! 759: addu a2,a0,t2 // compute aligned draw point address ! 760: add a3,a3,t3 // compute trailing byte address ! 761: sll t7,t7,t1 // shift high nibble into place ! 762: ! 763: // ! 764: // swr, sw, sw, sw, swl required. ! 765: // ! 766: ! 767: swr t5,0(a0) // store left nibble ! 768: sw t6,0(a2) // store low middle nibble ! 769: ! 770: #if defined(R4000) ! 771: ! 772: sdc1 f0,4(a2) // store middle nibbles ! 773: ! 774: #else ! 775: ! 776: swc1 f0,4(a2) // store low middle nibble ! 777: swc1 f1,8(a2) // store high middle nibble ! 778: ! 779: #endif ! 780: ! 781: swl t7,0(a3) // store right nibble ! 782: bne a1,t4,10b // if ne, more scan lines to process ! 783: add a0,a0,t3 // compute next draw point address ! 784: .set at ! 785: .set reorder ! 786: ! 787: j ra // return ! 788: ! 789: // ! 790: // Five nibbles are required for 17, 18, 19, or 20 pixel wide glyph. The ! 791: // middle pixels are quadword aligned. ! 792: // ! 793: ! 794: #if defined(R4000) ! 795: ! 796: .set noreorder ! 797: .set noat ! 798: 20: lwr v0,0(a1) // get next set of glyph pixels ! 799: lwl v0,3(a1) // ! 800: addu a1,a1,3 // advance to next set of glyph pixels ! 801: and v0,v0,t9 // isolate glyph bits ! 802: sll v1,v0,16 // shift high pixel bits into position ! 803: and t5,v0,0xff << 8 // isolate middle pixel bits ! 804: srl v0,v0,16 // shift low pixel bits into position ! 805: or v0,v0,v1 // merge swap big endian pixel bytes ! 806: or v0,v0,t5 // ! 807: srl v1,v0,20 - 2 // shift high nibble into position ! 808: and v1,v1,0xf << 2 // isolate color table index ! 809: addu v1,v1,t0 // compute color table address ! 810: lw t5,0(v1) // get color table entry ! 811: sll v0,v0,t2 // shift out alignment pixels ! 812: srl v1,v0,20 - 2 // shift next nibble into position ! 813: and v1,v1,0xf << 2 // isolate color table index ! 814: addu v1,v1,t0 // compute color table address ! 815: lwc1 f0,0(v1) // get color table entry ! 816: srl v1,v0,16 - 2 // shift next nibble into position ! 817: and v1,v1,0xf << 2 // isolate color table index ! 818: addu v1,v1,t0 // compute color table address ! 819: lwc1 f1,0(v1) // get color table entry ! 820: srl v1,v0,12 - 2 // shift next nibble into position ! 821: and v1,v1,0xf << 2 // isolate color table index ! 822: addu v1,v1,t0 // compute color table address ! 823: lw t6,0(v1) // get color table entry ! 824: srl v1,v0,8 - 2 // shift low nibble into position ! 825: and v1,v1,0xf << 2 // isolate color table index ! 826: addu v1,v1,t0 // compute color table address ! 827: lw t7,0(v1) // get color table entry ! 828: addu a2,a0,t2 // compute aligned draw point address ! 829: add a3,a3,t3 // compute trailing byte address ! 830: sll t7,t7,t1 // shift high nibble into place ! 831: ! 832: // ! 833: // swr, sw, sw, sw, swl required. ! 834: // ! 835: ! 836: swr t5,0(a0) // store left nibble ! 837: sdc1 f0,0(a2) // store middle nibbles ! 838: sw t6,8(a2) // store high middle nibble ! 839: swl t7,0(a3) // store right nibble ! 840: bne a1,t4,20b // if ne, more scan lines to process ! 841: add a0,a0,t3 // compute next draw point address ! 842: .set at ! 843: .set reorder ! 844: ! 845: j ra // return ! 846: ! 847: #endif ! 848: ! 849: // ! 850: // Six nibbles are required for 17, 18, 19, or 20 pixel wide glyph. ! 851: // ! 852: ! 853: #if defined(R4000) ! 854: ! 855: 30: and t5,a0,1 << 2 // check if middle quadword aligned ! 856: bne zero,t5,50f // if ne, middle quadword aligned ! 857: ! 858: #endif ! 859: ! 860: .set noreorder ! 861: .set noat ! 862: 40: lwr v0,0(a1) // get next set of glyph pixels ! 863: lwl v0,3(a1) // ! 864: addu a1,a1,3 // advance to next set of glyph pixels ! 865: and v0,v0,t9 // isolate glyph bits ! 866: sll v1,v0,16 // shift high pixel bits into position ! 867: and t5,v0,0xff << 8 // isolate middle pixel bits ! 868: srl v0,v0,16 // shift low pixel bits into position ! 869: or v0,v0,v1 // merge swap big endian pixel bytes ! 870: or v0,v0,t5 // ! 871: srl v1,v0,20 - 2 // shift high nibble into position ! 872: and v1,v1,0xf << 2 // isolate color table index ! 873: addu v1,v1,t0 // compute color table address ! 874: lw t5,0(v1) // get color table entry ! 875: sll v0,v0,t2 // shift out alignment pixels ! 876: srl v1,v0,20 - 2 // shift next nibble into position ! 877: and v1,v1,0xf << 2 // isolate color table index ! 878: addu v1,v1,t0 // compute color table address ! 879: lw t6,0(v1) // get color table entry ! 880: srl v1,v0,16 - 2 // shift next nibble into position ! 881: and v1,v1,0xf << 2 // isolate color table index ! 882: addu v1,v1,t0 // compute color table address ! 883: lwc1 f0,0(v1) // get color table entry ! 884: srl v1,v0,12 - 2 // shift next nibble into position ! 885: and v1,v1,0xf << 2 // isolate color table index ! 886: addu v1,v1,t0 // compute color table address ! 887: lwc1 f1,0(v1) // get color table entry ! 888: srl v1,v0,8 - 2 // shift next nibble into position ! 889: and v1,v1,0xf << 2 // isolate color table index ! 890: addu v1,v1,t0 // compute color table address ! 891: lw t7,0(v1) // get color table entry ! 892: srl v1,v0,4 - 2 // shift low nibble into position ! 893: and v1,v1,0xf << 2 // isolate color table index ! 894: addu v1,v1,t0 // compute color table address ! 895: lw t8,0(v1) // get color table entry ! 896: addu a2,a0,t2 // compute aligned draw point address ! 897: add a3,a3,t3 // compute trailing byte address ! 898: sll t8,t8,t1 // shift high nibble into place ! 899: ! 900: // ! 901: // swr, sw, sw, sw, sw, swl required. ! 902: // ! 903: ! 904: swr t5,0(a0) // store left nibble ! 905: sw t6,0(a2) // store low middle nibble ! 906: ! 907: #if defined(R4000) ! 908: ! 909: sdc1 f0,4(a2) // store low middle nibbles ! 910: ! 911: #else ! 912: ! 913: swc1 f0,4(a2) // store low middle nibble ! 914: swc1 f1,8(a2) // store middle middle nibble ! 915: ! 916: #endif ! 917: ! 918: sw t7,12(a2) // store high middle nibble ! 919: swl t8,0(a3) // store right nibble ! 920: bne a1,t4,40b // if ne, more scan lines to process ! 921: add a0,a0,t3 // compute next draw point address ! 922: .set at ! 923: .set reorder ! 924: ! 925: j ra // return ! 926: ! 927: // ! 928: // Six nibbles are required for 17, 18, 19, or 20 pixel wide glyph. The ! 929: // middle pixels are quadword aligned. ! 930: // ! 931: ! 932: #if defined(R4000) ! 933: ! 934: .set noreorder ! 935: .set noat ! 936: 50: lwr v0,0(a1) // get next set of glyph pixels ! 937: lwl v0,3(a1) // ! 938: addu a1,a1,3 // advance to next set of glyph pixels ! 939: and v0,v0,t9 // isolate glyph bits ! 940: sll v1,v0,16 // shift high pixel bits into position ! 941: and t5,v0,0xff << 8 // isolate middle pixel bits ! 942: srl v0,v0,16 // shift low pixel bits into position ! 943: or v0,v0,v1 // merge swap big endian pixel bytes ! 944: or v0,v0,t5 // ! 945: srl v1,v0,20 - 2 // shift high nibble into position ! 946: and v1,v1,0xf << 2 // isolate color table index ! 947: addu v1,v1,t0 // compute color table address ! 948: lw t5,0(v1) // get color table entry ! 949: sll v0,v0,t2 // shift out alignment pixels ! 950: srl v1,v0,20 - 2 // shift next nibble into position ! 951: and v1,v1,0xf << 2 // isolate color table index ! 952: addu v1,v1,t0 // compute color table address ! 953: lwc1 f0,0(v1) // get color table entry ! 954: srl v1,v0,16 - 2 // shift next nibble into position ! 955: and v1,v1,0xf << 2 // isolate color table index ! 956: addu v1,v1,t0 // compute color table address ! 957: lwc1 f1,0(v1) // get color table entry ! 958: srl v1,v0,12 - 2 // shift next nibble into position ! 959: and v1,v1,0xf << 2 // isolate color table index ! 960: addu v1,v1,t0 // compute color table address ! 961: lwc1 f2,0(v1) // get color table entry ! 962: srl v1,v0,8 - 2 // shift next nibble into position ! 963: and v1,v1,0xf << 2 // isolate color table index ! 964: addu v1,v1,t0 // compute color table address ! 965: lwc1 f3,0(v1) // get color table entry ! 966: srl v1,v0,4 - 2 // shift low nibble into position ! 967: and v1,v1,0xf << 2 // isolate color table index ! 968: addu v1,v1,t0 // compute color table address ! 969: lw t6,0(v1) // get color table entry ! 970: addu a2,a0,t2 // compute aligned draw point address ! 971: add a3,a3,t3 // compute trailing byte address ! 972: sll t6,t6,t1 // shift high nibble into place ! 973: ! 974: // ! 975: // swr, sw, sw, sw, sw, swl required. ! 976: // ! 977: ! 978: swr t5,0(a0) // store left nibble ! 979: sdc1 f0,0(a2) // store low middle nibbles ! 980: sdc1 f2,8(a2) // store high middle nibbles ! 981: swl t6,0(a3) // store right nibble ! 982: bne a1,t4,50b // if ne, more scan lines to process ! 983: add a0,a0,t3 // compute next draw point address ! 984: .set at ! 985: .set reorder ! 986: ! 987: j ra // return ! 988: ! 989: #endif ! 990: ! 991: // ! 992: // Glyph output for 21, 22, 23, and 24 pixel wide glyphs. ! 993: // ! 994: ! 995: ALTERNATE_ENTRY(DrvpOutputOpaque21.22.23.24) ! 996: ! 997: la t0,DrvpDrawColorTable // set base address of color table ! 998: lw t3,DrvpScanLineWidth // get scanline stride in bytes ! 999: and t1,a0,0x3 // isolate draw point alignment bits ! 1000: li t2,4 // compute number of pixels to alignment ! 1001: subu t2,t2,t1 // ! 1002: addu t4,a3,a3 // compute the total size of the glyph ! 1003: addu t4,t4,a3 // ! 1004: addu t4,t4,a1 // compute ending address of glyph bits ! 1005: addu a3,a2,a0 // compute trailing alignment address ! 1006: subu a3,a3,1 // ! 1007: nor t1,a3,zero // compute trailing byte left shift ! 1008: and t1,t1,0x3 // ! 1009: sll t1,t1,3 // ! 1010: li t9,0xffffff // set glyph mask value ! 1011: ! 1012: .set noreorder ! 1013: .set noat ! 1014: addu t5,t2,20 // compute six nibble boundary ! 1015: sltu v0,t5,a2 // check if seven nibbles required ! 1016: ! 1017: #if defined(R4000) ! 1018: ! 1019: beq zero,v0,30b // if eq, six nibbles required ! 1020: ! 1021: #else ! 1022: ! 1023: beq zero,v0,40b // if eq, six nibbles required ! 1024: ! 1025: #endif ! 1026: ! 1027: sub a3,a3,t3 // offset address by scan line stride ! 1028: .set at ! 1029: .set reorder ! 1030: ! 1031: // ! 1032: // Seven nibbles are required for 21, 22, 23, or 24 pixel wide glyphs. ! 1033: // ! 1034: ! 1035: #if defined(R4000) ! 1036: ! 1037: and t5,a0,1 << 2 // check if middle quadword aligned ! 1038: bne zero,t5,20f // if ne, middle quadword aligned ! 1039: ! 1040: #endif ! 1041: ! 1042: .set noreorder ! 1043: .set noat ! 1044: 10: lwr v0,0(a1) // get next set of glyph pixels ! 1045: lwl v0,3(a1) // ! 1046: addu a1,a1,3 // advance to next set of glyph pixels ! 1047: and v0,v0,t9 // isolate glyph bits ! 1048: sll v1,v0,16 // shift high pixel bits into position ! 1049: and t5,v0,0xff << 8 // isolate middle pixel bits ! 1050: srl v0,v0,16 // shift low pixel bits into position ! 1051: or v0,v0,v1 // merge swap big endian pixel bytes ! 1052: or v0,v0,t5 // ! 1053: srl v1,v0,20 - 2 // shift high nibble into position ! 1054: and v1,v1,0xf << 2 // isolate color table index ! 1055: addu v1,v1,t0 // compute color table address ! 1056: lw t5,0(v1) // get color table entry ! 1057: sll v0,v0,t2 // shift out alignment pixels ! 1058: srl v1,v0,20 - 2 // shift next nibble into position ! 1059: and v1,v1,0xf << 2 // isolate color table index ! 1060: addu v1,v1,t0 // compute color table address ! 1061: lw t6,0(v1) // get color table entry ! 1062: srl v1,v0,16 - 2 // shift next nibble into position ! 1063: and v1,v1,0xf << 2 // isolate color table index ! 1064: addu v1,v1,t0 // compute color table address ! 1065: lwc1 f0,0(v1) // get color table entry ! 1066: srl v1,v0,12 - 2 // shift next nibble into position ! 1067: and v1,v1,0xf << 2 // isolate color table index ! 1068: addu v1,v1,t0 // compute color table address ! 1069: lwc1 f1,0(v1) // get color table entry ! 1070: srl v1,v0,8 - 2 // shift next nibble into position ! 1071: and v1,v1,0xf << 2 // isolate color table index ! 1072: addu v1,v1,t0 // compute color table address ! 1073: lwc1 f2,0(v1) // get color table entry ! 1074: srl v1,v0,4 - 2 // shift next nibble into position ! 1075: and v1,v1,0xf << 2 // isolate color table index ! 1076: addu v1,v1,t0 // compute color table address ! 1077: lwc1 f3,0(v1) // get color table entry ! 1078: sll v1,v0,2 // shift low nibble into position ! 1079: and v1,v1,0xf << 2 // isolate color table index ! 1080: addu v1,v1,t0 // compute color table address ! 1081: lw t7,0(v1) // get color table entry ! 1082: addu a2,a0,t2 // compute aligned draw point address ! 1083: add a3,a3,t3 // compute trailing byte address ! 1084: sll t7,t7,t1 // shift high nibble into place ! 1085: ! 1086: // ! 1087: // swr, sw, sw, sw, sw, sw, swl required. ! 1088: // ! 1089: ! 1090: swr t5,0(a0) // store left nibble ! 1091: sw t6,0(a2) // store low middle nibble ! 1092: ! 1093: #if defined(R4000) ! 1094: ! 1095: sdc1 f0,4(a2) // store low middle nibbles ! 1096: sdc1 f2,12(a2) // store high middle nibbles ! 1097: ! 1098: #else ! 1099: ! 1100: swc1 f0,4(a2) // store low middle nibble ! 1101: swc1 f1,8(a2) // store middle middle nibble ! 1102: swc1 f2,12(a2) // store middle middle nibble ! 1103: swc1 f3,16(a2) // store high middle nibble ! 1104: ! 1105: #endif ! 1106: ! 1107: swl t7,0(a3) // store right nibble ! 1108: bne a1,t4,10b // if ne, more scan lines to process ! 1109: add a0,a0,t3 // compute next draw point address ! 1110: .set at ! 1111: .set reorder ! 1112: ! 1113: j ra // return ! 1114: ! 1115: // ! 1116: // Seven nibbles are required for 21, 22, 23, or 24 pixel wide glyph. The ! 1117: // middle pixels are quadword aligned. ! 1118: // ! 1119: ! 1120: #if defined(R4000) ! 1121: ! 1122: .set noreorder ! 1123: .set noat ! 1124: 20: lwr v0,0(a1) // get next set of glyph pixels ! 1125: lwl v0,3(a1) // ! 1126: addu a1,a1,3 // advance to next set of glyph pixels ! 1127: and v0,v0,t9 // isolate glyph bits ! 1128: sll v1,v0,16 // shift high pixel bits into position ! 1129: and t5,v0,0xff << 8 // isolate middle pixel bits ! 1130: srl v0,v0,16 // shift low pixel bits into position ! 1131: or v0,v0,v1 // merge swap big endian pixel bytes ! 1132: or v0,v0,t5 // ! 1133: srl v1,v0,20 - 2 // shift high nibble into position ! 1134: and v1,v1,0xf << 2 // isolate color table index ! 1135: addu v1,v1,t0 // compute color table address ! 1136: lw t5,0(v1) // get color table entry ! 1137: sll v0,v0,t2 // shift out alignment pixels ! 1138: srl v1,v0,20 - 2 // shift next nibble into position ! 1139: and v1,v1,0xf << 2 // isolate color table index ! 1140: addu v1,v1,t0 // compute color table address ! 1141: lwc1 f0,0(v1) // get color table entry ! 1142: srl v1,v0,16 - 2 // shift next nibble into position ! 1143: and v1,v1,0xf << 2 // isolate color table index ! 1144: addu v1,v1,t0 // compute color table address ! 1145: lwc1 f1,0(v1) // get color table entry ! 1146: srl v1,v0,12 - 2 // shift next nibble into position ! 1147: and v1,v1,0xf << 2 // isolate color table index ! 1148: addu v1,v1,t0 // compute color table address ! 1149: lwc1 f2,0(v1) // get color table entry ! 1150: srl v1,v0,8 - 2 // shift next nibble into position ! 1151: and v1,v1,0xf << 2 // isolate color table index ! 1152: addu v1,v1,t0 // compute color table address ! 1153: lwc1 f3,0(v1) // get color table entry ! 1154: srl v1,v0,4 - 2 // shift next nibble into position ! 1155: and v1,v1,0xf << 2 // isolate color table index ! 1156: addu v1,v1,t0 // compute color table address ! 1157: lw t6,0(v1) // get color table entry ! 1158: sll v1,v0,2 // shift low nibble into position ! 1159: and v1,v1,0xf << 2 // isolate color table index ! 1160: addu v1,v1,t0 // compute color table address ! 1161: lw t7,0(v1) // get color table entry ! 1162: addu a2,a0,t2 // compute aligned draw point address ! 1163: add a3,a3,t3 // compute trailing byte address ! 1164: sll t7,t7,t1 // shift high nibble into place ! 1165: ! 1166: // ! 1167: // swr, sw, sw, sw, sw, sw, swl required. ! 1168: // ! 1169: ! 1170: swr t5,0(a0) // store left nibble ! 1171: sdc1 f0,0(a2) // store low middle nibbles ! 1172: sdc1 f2,8(a2) // store high middle nibbles ! 1173: sw t6,16(a2) // store highest middle nibble ! 1174: swl t7,0(a3) // store right nibble ! 1175: bne a1,t4,20b // if ne, more scan lines to process ! 1176: add a0,a0,t3 // compute next draw point address ! 1177: .set at ! 1178: .set reorder ! 1179: ! 1180: j ra // return ! 1181: ! 1182: #endif ! 1183: ! 1184: // ! 1185: // Glyph output for 25, 26, 27, and 28 pixel wide glyphs. ! 1186: // ! 1187: ! 1188: ALTERNATE_ENTRY(DrvpOutputOpaque25.26.27.28) ! 1189: ! 1190: la t0,DrvpDrawColorTable // set base address of color table ! 1191: lw t3,DrvpScanLineWidth // get scanline stride in bytes ! 1192: and t1,a0,0x3 // isolate draw point alignment bits ! 1193: li t2,4 // compute number of pixels to alignment ! 1194: subu t2,t2,t1 // ! 1195: sll t4,a3,2 // compute the total size of the glyph ! 1196: addu t4,t4,a1 // compute ending address of glyph bits ! 1197: addu a3,a2,a0 // compute trailing alignment address ! 1198: subu a3,a3,1 // ! 1199: nor t1,a3,zero // compute trailing byte left shift ! 1200: and t1,t1,0x3 // ! 1201: sll t1,t1,3 // ! 1202: ! 1203: .set noreorder ! 1204: .set noat ! 1205: addu t5,t2,24 // compute seven nibble boundary ! 1206: sltu v0,t5,a2 // check if eight nibbles required ! 1207: ! 1208: #if defined(R4000) ! 1209: ! 1210: bne zero,v0,30f // if ne, eight nibbles required ! 1211: ! 1212: #else ! 1213: ! 1214: bne zero,v0,40f // if ne, eight nibbles required ! 1215: ! 1216: #endif ! 1217: ! 1218: sub a3,a3,t3 // offset address by scan line stride ! 1219: .set at ! 1220: .set reorder ! 1221: ! 1222: // ! 1223: // Seven nibbles are required for 25, 26, 27, or 28 pixel wide glyphs. ! 1224: // ! 1225: ! 1226: #if defined(R4000) ! 1227: ! 1228: and t5,a0,1 << 2 // check if middle quadword aligned ! 1229: bne zero,t5,20f // if ne, middle quadword aligned ! 1230: ! 1231: #endif ! 1232: ! 1233: .set noreorder ! 1234: .set noat ! 1235: 10: lw v0,0(a1) // get next set of glyph pixels ! 1236: addu a1,a1,4 // advance to next set of glyph pixels ! 1237: sll v1,v0,24 // shift high pixel bits into position ! 1238: and t5,v0,0xff << 8 // isolate middle high pixels ! 1239: sll t5,t5,8 // shift middle high pixels into place ! 1240: srl t6,v0,8 // shift middle low pixels into place ! 1241: and t6,t6,0xff << 8 // isoalte middle low pixels ! 1242: srl v0,v0,24 // shift low pixel bits into position ! 1243: or v0,v0,v1 // merge swap big endian pixel bytes ! 1244: or t5,t5,t6 // ! 1245: or v0,v0,t5 // ! 1246: srl v1,v0,28 - 2 // shift high nibble into position ! 1247: and v1,v1,0xf << 2 // isolate color table index ! 1248: addu v1,v1,t0 // compute color table address ! 1249: lw t5,0(v1) // get color table entry ! 1250: sll v0,v0,t2 // shift out alignment pixels ! 1251: srl v1,v0,28 - 2 // shift next nibble into position ! 1252: and v1,v1,0xf << 2 // isolate color table index ! 1253: addu v1,v1,t0 // compute color table address ! 1254: lw t6,0(v1) // get color table entry ! 1255: srl v1,v0,24 - 2 // shift next nibble into position ! 1256: and v1,v1,0xf << 2 // isolate color table index ! 1257: addu v1,v1,t0 // compute color table address ! 1258: lwc1 f0,0(v1) // get color table entry ! 1259: srl v1,v0,20 - 2 // shift next nibble into position ! 1260: and v1,v1,0xf << 2 // isolate color table index ! 1261: addu v1,v1,t0 // compute color table address ! 1262: lwc1 f1,0(v1) // get color table entry ! 1263: srl v1,v0,16 - 2 // shift next nibble into position ! 1264: and v1,v1,0xf << 2 // isolate color table index ! 1265: addu v1,v1,t0 // compute color table address ! 1266: lwc1 f2,0(v1) // get color table entry ! 1267: srl v1,v0,12 - 2 // shift next nibble into position ! 1268: and v1,v1,0xf << 2 // isolate color table index ! 1269: addu v1,v1,t0 // compute color table address ! 1270: lwc1 f3,0(v1) // get color table entry ! 1271: srl v1,v0,8 - 2 // shift next nibble into position ! 1272: and v1,v1,0xf << 2 // isolate color table index ! 1273: addu v1,v1,t0 // compute color table address ! 1274: lw t7,0(v1) // get color table entry ! 1275: addu a2,a0,t2 // compute aligned draw point address ! 1276: add a3,a3,t3 // compute trailing byte address ! 1277: sll t7,t7,t1 // shift high nibble into place ! 1278: ! 1279: // ! 1280: // swr, sw, sw, sw, sw, sw, swl required. ! 1281: // ! 1282: ! 1283: swr t5,0(a0) // store left nibble ! 1284: sw t6,0(a2) // store low middle nibble ! 1285: ! 1286: #if defined(R4000) ! 1287: ! 1288: sdc1 f0,4(a2) // store low middle nibbles ! 1289: sdc1 f2,12(a2) // store high middle nibbles ! 1290: ! 1291: #else ! 1292: ! 1293: swc1 f0,4(a2) // store low middle nibble ! 1294: swc1 f1,8(a2) // store middle middle nibble ! 1295: swc1 f2,12(a2) // store middle middle nibble ! 1296: swc1 f3,16(a2) // store high middle nibble ! 1297: ! 1298: #endif ! 1299: ! 1300: swl t7,0(a3) // store right nibble ! 1301: bne a1,t4,10b // if ne, more scan lines to process ! 1302: add a0,a0,t3 // compute next draw point address ! 1303: .set at ! 1304: .set reorder ! 1305: ! 1306: j ra // return ! 1307: ! 1308: // ! 1309: // Seven nibbles are required for 25, 26, 27, or 28 pixel wide glyph. The ! 1310: // middle pixels are quadword aligned. ! 1311: // ! 1312: ! 1313: #if defined(R4000) ! 1314: ! 1315: .set noreorder ! 1316: .set noat ! 1317: 20: lw v0,0(a1) // get next set of glyph pixels ! 1318: addu a1,a1,4 // advance to next set of glyph pixels ! 1319: sll v1,v0,24 // shift high pixel bits into position ! 1320: and t5,v0,0xff << 8 // isolate middle high pixels ! 1321: sll t5,t5,8 // shift middle high pixels into place ! 1322: srl t6,v0,8 // shift middle low pixels into place ! 1323: and t6,t6,0xff << 8 // isoalte middle low pixels ! 1324: srl v0,v0,24 // shift low pixel bits into position ! 1325: or v0,v0,v1 // merge swap big endian pixel bytes ! 1326: or t5,t5,t6 // ! 1327: or v0,v0,t5 // ! 1328: srl v1,v0,28 - 2 // shift high nibble into position ! 1329: and v1,v1,0xf << 2 // isolate color table index ! 1330: addu v1,v1,t0 // compute color table address ! 1331: lw t5,0(v1) // get color table entry ! 1332: sll v0,v0,t2 // shift out alignment pixels ! 1333: srl v1,v0,28 - 2 // shift next nibble into position ! 1334: and v1,v1,0xf << 2 // isolate color table index ! 1335: addu v1,v1,t0 // compute color table address ! 1336: lwc1 f0,0(v1) // get color table entry ! 1337: srl v1,v0,24 - 2 // shift next nibble into position ! 1338: and v1,v1,0xf << 2 // isolate color table index ! 1339: addu v1,v1,t0 // compute color table address ! 1340: lwc1 f1,0(v1) // get color table entry ! 1341: srl v1,v0,20 - 2 // shift next nibble into position ! 1342: and v1,v1,0xf << 2 // isolate color table index ! 1343: addu v1,v1,t0 // compute color table address ! 1344: lwc1 f2,0(v1) // get color table entry ! 1345: srl v1,v0,16 - 2 // shift next nibble into position ! 1346: and v1,v1,0xf << 2 // isolate color table index ! 1347: addu v1,v1,t0 // compute color table address ! 1348: lwc1 f3,0(v1) // get color table entry ! 1349: srl v1,v0,12 - 2 // shift next nibble into position ! 1350: and v1,v1,0xf << 2 // isolate color table index ! 1351: addu v1,v1,t0 // compute color table address ! 1352: lw t6,0(v1) // get color table entry ! 1353: srl v1,v0,8 - 2 // shift next nibble into position ! 1354: and v1,v1,0xf << 2 // isolate color table index ! 1355: addu v1,v1,t0 // compute color table address ! 1356: lw t7,0(v1) // get color table entry ! 1357: addu a2,a0,t2 // compute aligned draw point address ! 1358: add a3,a3,t3 // compute trailing byte address ! 1359: sll t7,t7,t1 // shift high nibble into place ! 1360: ! 1361: // ! 1362: // swr, sw, sw, sw, sw, sw, swl required. ! 1363: // ! 1364: ! 1365: swr t5,0(a0) // store left nibble ! 1366: sdc1 f0,0(a2) // store low middle nibbles ! 1367: sdc1 f2,8(a2) // store high middle nibbles ! 1368: sw t6,16(a2) // store highest middle nibble ! 1369: swl t7,0(a3) // store right nibble ! 1370: bne a1,t4,20b // if ne, more scan lines to process ! 1371: add a0,a0,t3 // compute next draw point address ! 1372: .set at ! 1373: .set reorder ! 1374: ! 1375: j ra // return ! 1376: ! 1377: #endif ! 1378: ! 1379: // ! 1380: // Eight nibbles are required for 25, 26, 27, or 28 pixel wide glyphs. ! 1381: // ! 1382: ! 1383: #if defined(R4000) ! 1384: ! 1385: 30: and t5,a0,1 << 2 // check if middle quadword aligned ! 1386: bne zero,t5,50f // if ne, middle quadword aligned ! 1387: ! 1388: #endif ! 1389: ! 1390: .set noreorder ! 1391: .set noat ! 1392: 40: lw v0,0(a1) // get next set of glyph pixels ! 1393: addu a1,a1,4 // advance to next set of glyph pixels ! 1394: sll v1,v0,24 // shift high pixel bits into position ! 1395: and t5,v0,0xff << 8 // isolate middle high pixels ! 1396: sll t5,t5,8 // shift middle high pixels into place ! 1397: srl t6,v0,8 // shift middle low pixels into place ! 1398: and t6,t6,0xff << 8 // isoalte middle low pixels ! 1399: srl v0,v0,24 // shift low pixel bits into position ! 1400: or v0,v0,v1 // merge swap big endian pixel bytes ! 1401: or t5,t5,t6 // ! 1402: or v0,v0,t5 // ! 1403: srl v1,v0,28 - 2 // shift high nibble into position ! 1404: and v1,v1,0xf << 2 // isolate color table index ! 1405: addu v1,v1,t0 // compute color table address ! 1406: lw t5,0(v1) // get color table entry ! 1407: sll v0,v0,t2 // shift out alignment pixels ! 1408: srl v1,v0,28 - 2 // shift next nibble into position ! 1409: and v1,v1,0xf << 2 // isolate color table index ! 1410: addu v1,v1,t0 // compute color table address ! 1411: lw t6,0(v1) // get color table entry ! 1412: srl v1,v0,24 - 2 // shift next nibble into position ! 1413: and v1,v1,0xf << 2 // isolate color table index ! 1414: addu v1,v1,t0 // compute color table address ! 1415: lwc1 f0,0(v1) // get color table entry ! 1416: srl v1,v0,20 - 2 // shift next nibble into position ! 1417: and v1,v1,0xf << 2 // isolate color table index ! 1418: addu v1,v1,t0 // compute color table address ! 1419: lwc1 f1,0(v1) // get color table entry ! 1420: srl v1,v0,16 - 2 // shift next nibble into position ! 1421: and v1,v1,0xf << 2 // isolate color table index ! 1422: addu v1,v1,t0 // compute color table address ! 1423: lwc1 f2,0(v1) // get color table entry ! 1424: srl v1,v0,12 - 2 // shift next nibble into position ! 1425: and v1,v1,0xf << 2 // isolate color table index ! 1426: addu v1,v1,t0 // compute color table address ! 1427: lwc1 f3,0(v1) // get color table entry ! 1428: srl v1,v0,8 - 2 // shift next nibble into position ! 1429: and v1,v1,0xf << 2 // isolate color table index ! 1430: addu v1,v1,t0 // compute color table address ! 1431: lw t7,0(v1) // get color table entry ! 1432: srl v1,v0,4 - 2 // shift next nibble into position ! 1433: and v1,v1,0xf << 2 // isolate color table index ! 1434: addu v1,v1,t0 // compute color table address ! 1435: lw t8,0(v1) // get color table entry ! 1436: addu a2,a0,t2 // compute aligned draw point address ! 1437: add a3,a3,t3 // compute trailing byte address ! 1438: sll t8,t8,t1 // shift high nibble into place ! 1439: ! 1440: // ! 1441: // swr, sw, sw, sw, sw, sw, sw, swl required. ! 1442: // ! 1443: ! 1444: swr t5,0(a0) // store left nibble ! 1445: sw t6,0(a2) // store low middle nibble ! 1446: ! 1447: #if defined(R4000) ! 1448: ! 1449: sdc1 f0,4(a2) // store low middle nibbles ! 1450: sdc1 f2,12(a2) // store high middle nibbles ! 1451: ! 1452: #else ! 1453: ! 1454: swc1 f0,4(a2) // store low middle nibble ! 1455: swc1 f1,8(a2) // store middle middle nibble ! 1456: swc1 f2,12(a2) // store middle middle nibble ! 1457: swc1 f3,16(a2) // store high middle nibble ! 1458: ! 1459: #endif ! 1460: ! 1461: sw t7,20(a2) // store high middle nibble ! 1462: swl t8,0(a3) // store right nibble ! 1463: bne a1,t4,40b // if ne, more scan lines to process ! 1464: add a0,a0,t3 // compute next draw point address ! 1465: .set at ! 1466: .set reorder ! 1467: ! 1468: j ra // return ! 1469: ! 1470: // ! 1471: // Eight nibbles are required for 25, 26, 27, or 28 pixel wide glyph. The ! 1472: // middle pixels are quadword aligned. ! 1473: // ! 1474: ! 1475: #if defined(R4000) ! 1476: ! 1477: .set noreorder ! 1478: .set noat ! 1479: 50: lw v0,0(a1) // get next set of glyph pixels ! 1480: addu a1,a1,4 // advance to next set of glyph pixels ! 1481: sll v1,v0,24 // shift high pixel bits into position ! 1482: and t5,v0,0xff << 8 // isolate middle high pixels ! 1483: sll t5,t5,8 // shift middle high pixels into place ! 1484: srl t6,v0,8 // shift middle low pixels into place ! 1485: and t6,t6,0xff << 8 // isoalte middle low pixels ! 1486: srl v0,v0,24 // shift low pixel bits into position ! 1487: or v0,v0,v1 // merge swap big endian pixel bytes ! 1488: or t5,t5,t6 // ! 1489: or v0,v0,t5 // ! 1490: srl v1,v0,28 - 2 // shift high nibble into position ! 1491: and v1,v1,0xf << 2 // isolate color table index ! 1492: addu v1,v1,t0 // compute color table address ! 1493: lw t5,0(v1) // get color table entry ! 1494: sll v0,v0,t2 // shift out alignment pixels ! 1495: srl v1,v0,28 - 2 // shift next nibble into position ! 1496: and v1,v1,0xf << 2 // isolate color table index ! 1497: addu v1,v1,t0 // compute color table address ! 1498: lwc1 f0,0(v1) // get color table entry ! 1499: srl v1,v0,24 - 2 // shift next nibble into position ! 1500: and v1,v1,0xf << 2 // isolate color table index ! 1501: addu v1,v1,t0 // compute color table address ! 1502: lwc1 f1,0(v1) // get color table entry ! 1503: srl v1,v0,20 - 2 // shift next nibble into position ! 1504: and v1,v1,0xf << 2 // isolate color table index ! 1505: addu v1,v1,t0 // compute color table address ! 1506: lwc1 f2,0(v1) // get color table entry ! 1507: srl v1,v0,16 - 2 // shift next nibble into position ! 1508: and v1,v1,0xf << 2 // isolate color table index ! 1509: addu v1,v1,t0 // compute color table address ! 1510: lwc1 f3,0(v1) // get color table entry ! 1511: srl v1,v0,12 - 2 // shift next nibble into position ! 1512: and v1,v1,0xf << 2 // isolate color table index ! 1513: addu v1,v1,t0 // compute color table address ! 1514: lwc1 f4,0(v1) // get color table entry ! 1515: srl v1,v0,8 - 2 // shift next nibble into position ! 1516: and v1,v1,0xf << 2 // isolate color table index ! 1517: addu v1,v1,t0 // compute color table address ! 1518: lwc1 f5,0(v1) // get color table entry ! 1519: srl v1,v0,4 - 2 // shift next nibble into position ! 1520: and v1,v1,0xf << 2 // isolate color table index ! 1521: addu v1,v1,t0 // compute color table address ! 1522: lw t6,0(v1) // get color table entry ! 1523: addu a2,a0,t2 // compute aligned draw point address ! 1524: add a3,a3,t3 // compute trailing byte address ! 1525: sll t6,t6,t1 // shift high nibble into place ! 1526: ! 1527: // ! 1528: // swr, sw, sw, sw, sw, sw, sw, swl required. ! 1529: // ! 1530: ! 1531: swr t5,0(a0) // store left nibble ! 1532: sdc1 f0,0(a2) // store low middle nibbles ! 1533: sdc1 f2,8(a2) // store high middle nibbles ! 1534: sdc1 f4,16(a2) // store highest middle nibbles ! 1535: swl t6,0(a3) // store right nibble ! 1536: bne a1,t4,50b // if ne, more scan lines to process ! 1537: add a0,a0,t3 // compute next draw point address ! 1538: .set at ! 1539: .set reorder ! 1540: ! 1541: j ra // return ! 1542: ! 1543: #endif ! 1544: ! 1545: // ! 1546: // Glyph output for 29, 30, 31, and 32 pixel wide glyphs. ! 1547: // ! 1548: ! 1549: ALTERNATE_ENTRY(DrvpOutputOpaque29.30.31.32) ! 1550: ! 1551: la t0,DrvpDrawColorTable // set base address of color table ! 1552: lw t3,DrvpScanLineWidth // get scanline stride in bytes ! 1553: and t1,a0,0x3 // isolate draw point alignment bits ! 1554: li t2,4 // compute number of pixels to alignment ! 1555: subu t2,t2,t1 // ! 1556: sll t4,a3,2 // compute the total size of the glyph ! 1557: addu t4,t4,a1 // compute ending address of glyph bits ! 1558: addu a3,a2,a0 // compute trailing alignment address ! 1559: subu a3,a3,1 // ! 1560: nor t1,a3,zero // compute trailing byte left shift ! 1561: and t1,t1,0x3 // ! 1562: sll t1,t1,3 // ! 1563: ! 1564: .set noreorder ! 1565: .set noat ! 1566: addu t5,t2,28 // compute eight nibble boundary ! 1567: sltu v0,t5,a2 // check if nine nibbles required ! 1568: ! 1569: #if defined(R4000) ! 1570: ! 1571: beq zero,v0,30b // if eq, eight nibbles required ! 1572: ! 1573: #else ! 1574: ! 1575: beq zero,v0,40b // if eq, eight nibbles required ! 1576: ! 1577: #endif ! 1578: ! 1579: sub a3,a3,t3 // offset address by scan line stride ! 1580: .set at ! 1581: .set reorder ! 1582: ! 1583: // ! 1584: // Nine nibbles are required for 29, 30, 31, or 32 pixel wide glyphs. ! 1585: // ! 1586: ! 1587: #if defined(R4000) ! 1588: ! 1589: and t5,a0,1 << 2 // check if middle quadword aligned ! 1590: bne zero,t5,20f // if ne, middle quadword aligned ! 1591: ! 1592: #endif ! 1593: ! 1594: .set noreorder ! 1595: .set noat ! 1596: 10: lw v0,0(a1) // get next set of glyph pixels ! 1597: addu a1,a1,4 // advance to next set of glyph pixels ! 1598: sll v1,v0,24 // shift high pixel bits into position ! 1599: and t5,v0,0xff << 8 // isolate middle high pixels ! 1600: sll t5,t5,8 // shift middle high pixels into place ! 1601: srl t6,v0,8 // shift middle low pixels into place ! 1602: and t6,t6,0xff << 8 // isoalte middle low pixels ! 1603: srl v0,v0,24 // shift low pixel bits into position ! 1604: or v0,v0,v1 // merge swap big endian pixel bytes ! 1605: or t5,t5,t6 // ! 1606: or v0,v0,t5 // ! 1607: srl v1,v0,28 - 2 // shift high nibble into position ! 1608: and v1,v1,0xf << 2 // isolate color table index ! 1609: addu v1,v1,t0 // compute color table address ! 1610: lw t5,0(v1) // get color table entry ! 1611: sll v0,v0,t2 // shift out alignment pixels ! 1612: srl v1,v0,28 - 2 // shift next nibble into position ! 1613: and v1,v1,0xf << 2 // isolate color table index ! 1614: addu v1,v1,t0 // compute color table address ! 1615: lw t6,0(v1) // get color table entry ! 1616: srl v1,v0,24 - 2 // shift next nibble into position ! 1617: and v1,v1,0xf << 2 // isolate color table index ! 1618: addu v1,v1,t0 // compute color table address ! 1619: lwc1 f0,0(v1) // get color table entry ! 1620: srl v1,v0,20 - 2 // shift next nibble into position ! 1621: and v1,v1,0xf << 2 // isolate color table index ! 1622: addu v1,v1,t0 // compute color table address ! 1623: lwc1 f1,0(v1) // get color table entry ! 1624: srl v1,v0,16 - 2 // shift next nibble into position ! 1625: and v1,v1,0xf << 2 // isolate color table index ! 1626: addu v1,v1,t0 // compute color table address ! 1627: lwc1 f2,0(v1) // get color table entry ! 1628: srl v1,v0,12 - 2 // shift next nibble into position ! 1629: and v1,v1,0xf << 2 // isolate color table index ! 1630: addu v1,v1,t0 // compute color table address ! 1631: lwc1 f3,0(v1) // get color table entry ! 1632: srl v1,v0,8 - 2 // shift next nibble into position ! 1633: and v1,v1,0xf << 2 // isolate color table index ! 1634: addu v1,v1,t0 // compute color table address ! 1635: lwc1 f4,0(v1) // get color table entry ! 1636: srl v1,v0,4 - 2 // shift next nibble into position ! 1637: and v1,v1,0xf << 2 // isolate color table index ! 1638: addu v1,v1,t0 // compute color table address ! 1639: lwc1 f5,0(v1) // get color table entry ! 1640: sll v1,v0,2 // shift next nibble into position ! 1641: and v1,v1,0xf << 2 // isolate color table index ! 1642: addu v1,v1,t0 // compute color table address ! 1643: lw t7,0(v1) // get color table entry ! 1644: addu a2,a0,t2 // compute aligned draw point address ! 1645: add a3,a3,t3 // compute trailing byte address ! 1646: sll t7,t7,t1 // shift high nibble into place ! 1647: ! 1648: // ! 1649: // swr, sw, sw, sw, sw, sw, sw, sw, swl required. ! 1650: // ! 1651: ! 1652: swr t5,0(a0) // store left nibble ! 1653: sw t6,0(a2) // store low middle nibble ! 1654: ! 1655: #if defined(R4000) ! 1656: ! 1657: sdc1 f0,4(a2) // store low middle nibbles ! 1658: sdc1 f2,12(a2) // store middle middle nibbles ! 1659: sdc1 f4,20(a2) // store high middle nibbles ! 1660: ! 1661: #else ! 1662: ! 1663: swc1 f0,4(a2) // store low middle nibble ! 1664: swc1 f1,8(a2) // store middle middle nibble ! 1665: swc1 f2,12(a2) // store middle middle nibble ! 1666: swc1 f3,16(a2) // store middle middle nibble ! 1667: swc1 f4,20(a2) // store middle middle nibble ! 1668: swc1 f5,24(a2) // store high middle nibble ! 1669: ! 1670: #endif ! 1671: ! 1672: swl t7,0(a3) // store right nibble ! 1673: bne a1,t4,10b // if ne, more scan lines to process ! 1674: add a0,a0,t3 // compute next draw point address ! 1675: .set at ! 1676: .set reorder ! 1677: ! 1678: j ra // return ! 1679: ! 1680: // ! 1681: // Nine nibbles are required for 29, 30, 31, or 32 pixel wide glyph. The ! 1682: // middle pixels are quadword aligned. ! 1683: // ! 1684: ! 1685: #if defined(R4000) ! 1686: ! 1687: .set noreorder ! 1688: .set noat ! 1689: 20: lw v0,0(a1) // get next set of glyph pixels ! 1690: addu a1,a1,4 // advance to next set of glyph pixels ! 1691: sll v1,v0,24 // shift high pixel bits into position ! 1692: and t5,v0,0xff << 8 // isolate middle high pixels ! 1693: sll t5,t5,8 // shift middle high pixels into place ! 1694: srl t6,v0,8 // shift middle low pixels into place ! 1695: and t6,t6,0xff << 8 // isoalte middle low pixels ! 1696: srl v0,v0,24 // shift low pixel bits into position ! 1697: or v0,v0,v1 // merge swap big endian pixel bytes ! 1698: or t5,t5,t6 // ! 1699: or v0,v0,t5 // ! 1700: srl v1,v0,28 - 2 // shift high nibble into position ! 1701: and v1,v1,0xf << 2 // isolate color table index ! 1702: addu v1,v1,t0 // compute color table address ! 1703: lw t5,0(v1) // get color table entry ! 1704: sll v0,v0,t2 // shift out alignment pixels ! 1705: srl v1,v0,28 - 2 // shift next nibble into position ! 1706: and v1,v1,0xf << 2 // isolate color table index ! 1707: addu v1,v1,t0 // compute color table address ! 1708: lwc1 f0,0(v1) // get color table entry ! 1709: srl v1,v0,24 - 2 // shift next nibble into position ! 1710: and v1,v1,0xf << 2 // isolate color table index ! 1711: addu v1,v1,t0 // compute color table address ! 1712: lwc1 f1,0(v1) // get color table entry ! 1713: srl v1,v0,20 - 2 // shift next nibble into position ! 1714: and v1,v1,0xf << 2 // isolate color table index ! 1715: addu v1,v1,t0 // compute color table address ! 1716: lwc1 f2,0(v1) // get color table entry ! 1717: srl v1,v0,16 - 2 // shift next nibble into position ! 1718: and v1,v1,0xf << 2 // isolate color table index ! 1719: addu v1,v1,t0 // compute color table address ! 1720: lwc1 f3,0(v1) // get color table entry ! 1721: srl v1,v0,12 - 2 // shift next nibble into position ! 1722: and v1,v1,0xf << 2 // isolate color table index ! 1723: addu v1,v1,t0 // compute color table address ! 1724: lwc1 f4,0(v1) // get color table entry ! 1725: srl v1,v0,8 - 2 // shift next nibble into position ! 1726: and v1,v1,0xf << 2 // isolate color table index ! 1727: addu v1,v1,t0 // compute color table address ! 1728: lwc1 f5,0(v1) // get color table entry ! 1729: srl v1,v0,4 - 2 // shift next nibble into position ! 1730: and v1,v1,0xf << 2 // isolate color table index ! 1731: addu v1,v1,t0 // compute color table address ! 1732: lw t6,0(v1) // get color table entry ! 1733: srl v1,v0,2 // shift next nibble into position ! 1734: and v1,v1,0xf << 2 // isolate color table index ! 1735: addu v1,v1,t0 // compute color table address ! 1736: lw t7,0(v1) // get color table entry ! 1737: addu a2,a0,t2 // compute aligned draw point address ! 1738: add a3,a3,t3 // compute trailing byte address ! 1739: sll t7,t7,t1 // shift high nibble into place ! 1740: ! 1741: // ! 1742: // swr, sw, sw, sw, sw. sw, sw, sw, swl required. ! 1743: // ! 1744: ! 1745: swr t5,0(a0) // store left nibble ! 1746: sdc1 f0,0(a2) // store low middle nibbles ! 1747: sdc1 f2,8(a2) // store middle middle nibbles ! 1748: sdc1 f4,16(a2) // store high middle nibbles ! 1749: sw t6,24(a2) // store highest middle nibble ! 1750: swl t7,0(a3) // store right nibble ! 1751: bne a1,t4,20b // if ne, more scan lines to process ! 1752: add a0,a0,t3 // compute next draw point address ! 1753: .set at ! 1754: .set reorder ! 1755: ! 1756: j ra // return ! 1757: ! 1758: #endif ! 1759: ! 1760: .end DrvpOutputGlyphOpaque ! 1761: ! 1762: SBTTL("Output Glyph Transparent") ! 1763: //++ ! 1764: // ! 1765: // VOID ! 1766: // DrvpOutputGlyphTransparent ( ! 1767: // IN PUCHAR DrawPoint, ! 1768: // IN PULONG GlyphBitmap, ! 1769: // IN ULONG GlyphWidth, ! 1770: // IN ULONG GlyphHeight ! 1771: // ) ! 1772: // ! 1773: // Routine Description: ! 1774: // ! 1775: // This routine is called to display a complete glyph. It is assumed ! 1776: // that the glyph occupies an integral multiple of longwords and that ! 1777: // the last longword is zero filled. Zeros are treated as transparent ! 1778: // pixels and ones cause the specified color to be displayed. This ! 1779: // routine draws only the foreground pixels. ! 1780: // ! 1781: // Arguments: ! 1782: // ! 1783: // DrawPoint (a0) - Supplies a pointer to the starting pixel of the ! 1784: // glyph scanline. ! 1785: // ! 1786: // GlyphBitmap (a1) - Supplies a pointer to the glyph scanline bitmap. ! 1787: // ! 1788: // GlyphWidth (a2) - Supplies the glyph width in pixels. ! 1789: // ! 1790: // GlyphHeigth (a3) - Supplies the glyph height in pixels. ! 1791: // ! 1792: // Return Value: ! 1793: // ! 1794: // None. ! 1795: // ! 1796: //-- ! 1797: ! 1798: LEAF_ENTRY(DrvpOutputGlyphTransparent) ! 1799: ! 1800: lw t0,DrvpForeGroundColor // get drawing pixels ! 1801: lw t3,DrvpScanLineWidth // get the scan line stride in bytes ! 1802: la t1,60f // get base high dispatch address ! 1803: and t2,a0,0x3 // isolate low order draw point bits ! 1804: sll t2,t2,5 // shift bits into position ! 1805: addu t1,t1,t2 // compute partial dispatch address ! 1806: la t5,70f // get base low dispatch address ! 1807: addu t5,t5,t2 // compute partial dispatch address ! 1808: addu t2,a2,7 // round the bitmap span in bytes ! 1809: mult a3,t3 // compute offset to end of drawing ! 1810: srl t2,t2,3 // compute bitmap span in bytes ! 1811: sll t4,t2,3 // compute draw span in bytes ! 1812: sub t3,t3,t4 // compute draw stride in bytes ! 1813: mflo a3 // get offset to end of drawing ! 1814: addu a3,a3,a0 // compute ending address of drawing ! 1815: ! 1816: // ! 1817: // Set the current draw and bitmap base addresses, and begin drawing the ! 1818: // next scan line. ! 1819: // ! 1820: ! 1821: .set noreorder ! 1822: .set noat ! 1823: 10: addu t4,t2,a1 // compute ending bitmap address ! 1824: ! 1825: // ! 1826: // A glyph scan line is processed four bits at a time and combined with the ! 1827: // low order two bits of the current draw point. A dispatch is executed into ! 1828: // an array of code fragments that actually draw the pixels on the display. ! 1829: // ! 1830: ! 1831: 20: lbu v0,0(a1) // get next byte of glyph ! 1832: addu a1,a1,1 // advance to next glyph byte ! 1833: beq zero,v0,30f // if eq, no glyph bits to draw ! 1834: sll v1,v0,7 - 4 // shift high nibble into position ! 1835: and v1,v1,0xf << 7 // isolate low order nibble ! 1836: addu v1,v1,t1 // compute dispatch address ! 1837: j v1 // dispatch to pixel store routine ! 1838: sll v0,v0,7 // shift next nibble into position ! 1839: ! 1840: 30: bne a1,t4,20b // if ne, not end of glyph ! 1841: addu a0,a0,8 // advance to next draw point ! 1842: add a0,a0,t3 // compute next scanline address ! 1843: 40: beq a0,a3,50f // if eq, no more pixels to draw ! 1844: addu t4,t2,a1 // compute ending bitmap address ! 1845: lbu v0,0(a1) // get next byte of glyph ! 1846: addu a1,a1,1 // advance to next glyph byte ! 1847: beq zero,v0,30b // if eq, no glyph bits to draw ! 1848: sll v1,v0,7 - 4 // shift high nibble into position ! 1849: and v1,v1,0xf << 7 // isolate low order nibble ! 1850: addu v1,v1,t1 // compute dispatch address ! 1851: j v1 // dispatch to pixel store routine ! 1852: sll v0,v0,7 // shift next nibble into position ! 1853: .set reorder ! 1854: .set at ! 1855: ! 1856: ! 1857: 50: j ra // return ! 1858: ! 1859: // ! 1860: // The following code is arranged as 64, four instruction blocks. The block ! 1861: // of code that is chosen for execution is determined from the high order ! 1862: // glyph nibble and the two low its of the draw address. ! 1863: // ! 1864: // The glyph nibbles are encoded in big endian order and therefore the pixels ! 1865: // that are stored are the reverse of the big endian bits within the nibble. ! 1866: // ! 1867: ! 1868: .align 4 ! 1869: .set noreorder ! 1870: .set noat ! 1871: ! 1872: 60: // reference label ! 1873: // ! 1874: // Pattern 0000-00 ! 1875: // ! 1876: ! 1877: and v1,v0,0xf << 7 // isolate low order nibble ! 1878: addu v1,v1,t5 // compute dispatch address ! 1879: j v1 // dispatch to pixel store routine ! 1880: addu a0,a0,4 // advance to next draw point ! 1881: nop // fill ! 1882: nop // ! 1883: nop // ! 1884: nop // ! 1885: ! 1886: // ! 1887: // Pattern 0000-01 ! 1888: // ! 1889: ! 1890: and v1,v0,0xf << 7 // isolate low order nibble ! 1891: addu v1,v1,t5 // compute dispatch address ! 1892: j v1 // dispatch to pixel store routine ! 1893: addu a0,a0,4 // advance to next draw point ! 1894: nop // fill ! 1895: nop // ! 1896: nop // ! 1897: nop // ! 1898: ! 1899: // ! 1900: // Pattern 0000-10 ! 1901: // ! 1902: ! 1903: and v1,v0,0xf << 7 // isolate low order nibble ! 1904: addu v1,v1,t5 // compute dispatch address ! 1905: j v1 // dispatch to pixel store routine ! 1906: addu a0,a0,4 // advance to next draw point ! 1907: nop // fill ! 1908: nop // ! 1909: nop // ! 1910: nop // ! 1911: ! 1912: // ! 1913: // Pattern 0000-11 ! 1914: // ! 1915: ! 1916: and v1,v0,0xf << 7 // isolate low order nibble ! 1917: addu v1,v1,t5 // compute dispatch address ! 1918: j v1 // dispatch to pixel store routine ! 1919: addu a0,a0,4 // advance to next draw point ! 1920: nop // fill ! 1921: nop // ! 1922: nop // ! 1923: nop // ! 1924: ! 1925: // ! 1926: // Pattern 0001-00 -> 1000 ! 1927: // ! 1928: ! 1929: sb t0,3(a0) // store pixel ! 1930: and v1,v0,0xf << 7 // isolate low order nibble ! 1931: addu v1,v1,t5 // compute dispatch address ! 1932: j v1 // dispatch to pixel store routine ! 1933: addu a0,a0,4 // advance to next draw point ! 1934: nop // fill ! 1935: nop // ! 1936: nop // ! 1937: ! 1938: // ! 1939: // Pattern 0001-01 -> 1000 ! 1940: // ! 1941: ! 1942: sb t0,3(a0) // store pixel ! 1943: and v1,v0,0xf << 7 // isolate low order nibble ! 1944: addu v1,v1,t5 // compute dispatch address ! 1945: j v1 // dispatch to pixel store routine ! 1946: addu a0,a0,4 // advance to next draw point ! 1947: nop // fill ! 1948: nop // ! 1949: nop // ! 1950: ! 1951: // ! 1952: // Pattern 0001-10 -> 1000 ! 1953: // ! 1954: ! 1955: sb t0,3(a0) // store pixel ! 1956: and v1,v0,0xf << 7 // isolate low order nibble ! 1957: addu v1,v1,t5 // compute dispatch address ! 1958: j v1 // dispatch to pixel store routine ! 1959: addu a0,a0,4 // advance to next draw point ! 1960: nop // fill ! 1961: nop // ! 1962: nop // ! 1963: ! 1964: // ! 1965: // Pattern 0001-11 -> 1000 ! 1966: // ! 1967: ! 1968: sb t0,3(a0) // store pixel ! 1969: and v1,v0,0xf << 7 // isolate low order nibble ! 1970: addu v1,v1,t5 // compute dispatch address ! 1971: j v1 // dispatch to pixel store routine ! 1972: addu a0,a0,4 // advance to next draw point ! 1973: nop // fill ! 1974: nop // ! 1975: nop // ! 1976: ! 1977: // ! 1978: // Pattern 0010-00 -> 0100 ! 1979: // ! 1980: ! 1981: sb t0,2(a0) // store pixel ! 1982: and v1,v0,0xf << 7 // isolate low order nibble ! 1983: addu v1,v1,t5 // compute dispatch address ! 1984: j v1 // dispatch to pixel store routine ! 1985: addu a0,a0,4 // advance to next draw point ! 1986: nop // fill ! 1987: nop // ! 1988: nop // ! 1989: ! 1990: // ! 1991: // Pattern 0010-01 -> 0100 ! 1992: // ! 1993: ! 1994: sb t0,2(a0) // store pixel ! 1995: and v1,v0,0xf << 7 // isolate low order nibble ! 1996: addu v1,v1,t5 // compute dispatch address ! 1997: j v1 // dispatch to pixel store routine ! 1998: addu a0,a0,4 // advance to next draw point ! 1999: nop // fill ! 2000: nop // ! 2001: nop // ! 2002: ! 2003: // ! 2004: // Pattern 0010-10 -> 0100 ! 2005: // ! 2006: ! 2007: sb t0,2(a0) // store pixel ! 2008: and v1,v0,0xf << 7 // isolate low order nibble ! 2009: addu v1,v1,t5 // compute dispatch address ! 2010: j v1 // dispatch to pixel store routine ! 2011: addu a0,a0,4 // advance to next draw point ! 2012: nop // fill ! 2013: nop // ! 2014: nop // ! 2015: ! 2016: // ! 2017: // Pattern 0010-11 -> 0100 ! 2018: // ! 2019: ! 2020: sb t0,2(a0) // store pixel ! 2021: and v1,v0,0xf << 7 // isolate low order nibble ! 2022: addu v1,v1,t5 // compute dispatch address ! 2023: j v1 // dispatch to pixel store routine ! 2024: addu a0,a0,4 // advance to next draw point ! 2025: nop // fill ! 2026: nop // ! 2027: nop // ! 2028: ! 2029: // ! 2030: // Pattern 0011-00 -> 1100 ! 2031: // ! 2032: ! 2033: sh t0,2(a0) // store pixels ! 2034: and v1,v0,0xf << 7 // isolate low order nibble ! 2035: addu v1,v1,t5 // compute dispatch address ! 2036: j v1 // dispatch to pixel store routine ! 2037: addu a0,a0,4 // advance to next draw point ! 2038: nop // fill ! 2039: nop // ! 2040: nop // ! 2041: ! 2042: // ! 2043: // Pattern 0011-01 -> 1100 ! 2044: // ! 2045: ! 2046: sb t0,2(a0) // store pixel ! 2047: sb t0,3(a0) // store pixel ! 2048: and v1,v0,0xf << 7 // isolate low order nibble ! 2049: addu v1,v1,t5 // compute dispatch address ! 2050: j v1 // dispatch to pixel store routine ! 2051: addu a0,a0,4 // advance to next draw point ! 2052: nop // fill ! 2053: nop // ! 2054: ! 2055: // ! 2056: // Pattern 0011-10 -> 1100 ! 2057: // ! 2058: ! 2059: sh t0,2(a0) // store pixels ! 2060: and v1,v0,0xf << 7 // isolate low order nibble ! 2061: addu v1,v1,t5 // compute dispatch address ! 2062: j v1 // dispatch to pixel store routine ! 2063: addu a0,a0,4 // advance to next draw point ! 2064: nop // fill ! 2065: nop // ! 2066: nop // ! 2067: ! 2068: // ! 2069: // Pattern 0011-11 -> 1100 ! 2070: // ! 2071: ! 2072: sb t0,2(a0) // store pixel ! 2073: sb t0,3(a0) // store pixel ! 2074: and v1,v0,0xf << 7 // isolate low order nibble ! 2075: addu v1,v1,t5 // compute dispatch address ! 2076: j v1 // dispatch to pixel store routine ! 2077: addu a0,a0,4 // advance to next draw point ! 2078: nop // fill ! 2079: nop // ! 2080: ! 2081: // ! 2082: // Pattern 0100-00 -> 0010 ! 2083: // ! 2084: ! 2085: sb t0,1(a0) // store pixel ! 2086: and v1,v0,0xf << 7 // isolate low order nibble ! 2087: addu v1,v1,t5 // compute dispatch address ! 2088: j v1 // dispatch to pixel store routine ! 2089: addu a0,a0,4 // advance to next draw point ! 2090: nop // fill ! 2091: nop // ! 2092: nop // ! 2093: ! 2094: // ! 2095: // Pattern 0100-01 -> 0010 ! 2096: // ! 2097: ! 2098: sb t0,1(a0) // store pixel ! 2099: and v1,v0,0xf << 7 // isolate low order nibble ! 2100: addu v1,v1,t5 // compute dispatch address ! 2101: j v1 // dispatch to pixel store routine ! 2102: addu a0,a0,4 // advance to next draw point ! 2103: nop // fill ! 2104: nop // ! 2105: nop // ! 2106: ! 2107: // ! 2108: // Pattern 0100-10 -> 0010 ! 2109: // ! 2110: ! 2111: sb t0,1(a0) // store pixel ! 2112: and v1,v0,0xf << 7 // isolate low order nibble ! 2113: addu v1,v1,t5 // compute dispatch address ! 2114: j v1 // dispatch to pixel store routine ! 2115: addu a0,a0,4 // advance to next draw point ! 2116: nop // fill ! 2117: nop // ! 2118: nop // ! 2119: ! 2120: // ! 2121: // Pattern 0100-11 -> 0010 ! 2122: // ! 2123: ! 2124: sb t0,1(a0) // store pixel ! 2125: and v1,v0,0xf << 7 // isolate low order nibble ! 2126: addu v1,v1,t5 // compute dispatch address ! 2127: j v1 // dispatch to pixel store routine ! 2128: addu a0,a0,4 // advance to next draw point ! 2129: nop // fill ! 2130: nop // ! 2131: nop // ! 2132: ! 2133: // ! 2134: // Pattern 0101-00 -> 1010 ! 2135: // ! 2136: ! 2137: sb t0,1(a0) // store pixel ! 2138: sb t0,3(a0) // store pixel ! 2139: and v1,v0,0xf << 7 // isolate low order nibble ! 2140: addu v1,v1,t5 // compute dispatch address ! 2141: j v1 // dispatch to pixel store routine ! 2142: addu a0,a0,4 // advance to next draw point ! 2143: nop // fill ! 2144: nop // ! 2145: ! 2146: // ! 2147: // Pattern 0101-01 -> 1010 ! 2148: // ! 2149: ! 2150: sb t0,1(a0) // store pixel ! 2151: sb t0,3(a0) // store pixel ! 2152: and v1,v0,0xf << 7 // isolate low order nibble ! 2153: addu v1,v1,t5 // compute dispatch address ! 2154: j v1 // dispatch to pixel store routine ! 2155: addu a0,a0,4 // advance to next draw point ! 2156: nop // fill ! 2157: nop // ! 2158: ! 2159: // ! 2160: // Pattern 0101-10 -> 1010 ! 2161: // ! 2162: ! 2163: sb t0,1(a0) // store pixel ! 2164: sb t0,3(a0) // store pixel ! 2165: and v1,v0,0xf << 7 // isolate low order nibble ! 2166: addu v1,v1,t5 // compute dispatch address ! 2167: j v1 // dispatch to pixel store routine ! 2168: addu a0,a0,4 // advance to next draw point ! 2169: nop // fill ! 2170: nop // ! 2171: ! 2172: // ! 2173: // Pattern 0101-11 -> 1010 ! 2174: // ! 2175: ! 2176: sb t0,1(a0) // store pixel ! 2177: sb t0,3(a0) // store pixel ! 2178: and v1,v0,0xf << 7 // isolate low order nibble ! 2179: addu v1,v1,t5 // compute dispatch address ! 2180: j v1 // dispatch to pixel store routine ! 2181: addu a0,a0,4 // advance to next draw point ! 2182: nop // fill ! 2183: nop // ! 2184: ! 2185: // ! 2186: // Pattern 0110-00 -> 0110 ! 2187: // ! 2188: ! 2189: sb t0,1(a0) // store pixel ! 2190: sb t0,2(a0) // store pixel ! 2191: and v1,v0,0xf << 7 // isolate low order nibble ! 2192: addu v1,v1,t5 // compute dispatch address ! 2193: j v1 // dispatch to pixel store routine ! 2194: addu a0,a0,4 // advance to next draw point ! 2195: nop // fill ! 2196: nop // ! 2197: ! 2198: // ! 2199: // Pattern 0110-01 -> 0110 ! 2200: // ! 2201: ! 2202: sh t0,1(a0) // store pixels ! 2203: and v1,v0,0xf << 7 // isolate low order nibble ! 2204: addu v1,v1,t5 // compute dispatch address ! 2205: j v1 // dispatch to pixel store routine ! 2206: addu a0,a0,4 // advance to next draw point ! 2207: nop // fill ! 2208: nop // ! 2209: nop // ! 2210: ! 2211: // ! 2212: // Pattern 0110-10 -> 0110 ! 2213: // ! 2214: ! 2215: sb t0,1(a0) // store pixel ! 2216: sb t0,2(a0) // store pixel ! 2217: and v1,v0,0xf << 7 // isolate low order nibble ! 2218: addu v1,v1,t5 // compute dispatch address ! 2219: j v1 // dispatch to pixel store routine ! 2220: addu a0,a0,4 // advance to next draw point ! 2221: nop // fill ! 2222: nop // ! 2223: ! 2224: // ! 2225: // Pattern 0110-11 -> 0110 ! 2226: // ! 2227: ! 2228: sh t0,1(a0) // store pixels ! 2229: and v1,v0,0xf << 7 // isolate low order nibble ! 2230: addu v1,v1,t5 // compute dispatch address ! 2231: j v1 // dispatch to pixel store routine ! 2232: addu a0,a0,4 // advance to next draw point ! 2233: nop // fill ! 2234: nop // ! 2235: nop // ! 2236: ! 2237: // ! 2238: // Pattern 0111-00 -> 1110 ! 2239: // ! 2240: ! 2241: swr t0,1(a0) // store pixels ! 2242: and v1,v0,0xf << 7 // isolate low order nibble ! 2243: addu v1,v1,t5 // compute dispatch address ! 2244: j v1 // dispatch to pixel store routine ! 2245: addu a0,a0,4 // advance to next draw point ! 2246: nop // fill ! 2247: nop // ! 2248: nop // ! 2249: ! 2250: // ! 2251: // Pattern 0111-01 -> 1110 ! 2252: // ! 2253: ! 2254: sh t0,1(a0) // store pixels ! 2255: sb t0,3(a0) // store pixel ! 2256: and v1,v0,0xf << 7 // isolate low order nibble ! 2257: addu v1,v1,t5 // compute dispatch address ! 2258: j v1 // dispatch to pixel store routine ! 2259: addu a0,a0,4 // advance to next draw point ! 2260: nop // fill ! 2261: nop // ! 2262: ! 2263: // ! 2264: // Pattern 0111-10 -> 1110 ! 2265: // ! 2266: ! 2267: sb t0,1(a0) // store pixel ! 2268: sh t0,2(a0) // store pixels ! 2269: and v1,v0,0xf << 7 // isolate low order nibble ! 2270: addu v1,v1,t5 // compute dispatch address ! 2271: j v1 // dispatch to pixel store routine ! 2272: addu a0,a0,4 // advance to next draw point ! 2273: nop // fill ! 2274: nop // ! 2275: ! 2276: // ! 2277: // Pattern 0111-11 -> 1110 ! 2278: // ! 2279: ! 2280: swl t0,3(a0) // store pixels ! 2281: and v1,v0,0xf << 7 // isolate low order nibble ! 2282: addu v1,v1,t5 // compute dispatch address ! 2283: j v1 // dispatch to pixel store routine ! 2284: addu a0,a0,4 // advance to next draw point ! 2285: nop // fill ! 2286: nop // ! 2287: nop // ! 2288: ! 2289: // ! 2290: // Pattern 1000-00 -> 0001 ! 2291: // ! 2292: ! 2293: sb t0,0(a0) // store pixel ! 2294: and v1,v0,0xf << 7 // isolate low order nibble ! 2295: addu v1,v1,t5 // compute dispatch address ! 2296: j v1 // dispatch to pixel store routine ! 2297: addu a0,a0,4 // advance to next draw point ! 2298: nop // fill ! 2299: nop // ! 2300: nop // ! 2301: ! 2302: // ! 2303: // Pattern 1000-01 -> 0001 ! 2304: // ! 2305: ! 2306: sb t0,0(a0) // store pixel ! 2307: and v1,v0,0xf << 7 // isolate low order nibble ! 2308: addu v1,v1,t5 // compute dispatch address ! 2309: j v1 // dispatch to pixel store routine ! 2310: addu a0,a0,4 // advance to next draw point ! 2311: nop // fill ! 2312: nop // ! 2313: nop // ! 2314: ! 2315: // ! 2316: // Pattern 1000-10 -> 0001 ! 2317: // ! 2318: ! 2319: sb t0,0(a0) // store pixel ! 2320: and v1,v0,0xf << 7 // isolate low order nibble ! 2321: addu v1,v1,t5 // compute dispatch address ! 2322: j v1 // dispatch to pixel store routine ! 2323: addu a0,a0,4 // advance to next draw point ! 2324: nop // fill ! 2325: nop // ! 2326: nop // ! 2327: ! 2328: // ! 2329: // Pattern 1000-11 -> 0001 ! 2330: // ! 2331: ! 2332: sb t0,0(a0) // store pixel ! 2333: and v1,v0,0xf << 7 // isolate low order nibble ! 2334: addu v1,v1,t5 // compute dispatch address ! 2335: j v1 // dispatch to pixel store routine ! 2336: addu a0,a0,4 // advance to next draw point ! 2337: nop // fill ! 2338: nop // ! 2339: nop // ! 2340: ! 2341: // ! 2342: // Pattern 1001-00 -> 1001 ! 2343: // ! 2344: ! 2345: sb t0,0(a0) // store pixel ! 2346: sb t0,3(a0) // store pixel ! 2347: and v1,v0,0xf << 7 // isolate low order nibble ! 2348: addu v1,v1,t5 // compute dispatch address ! 2349: j v1 // dispatch to pixel store routine ! 2350: addu a0,a0,4 // advance to next draw point ! 2351: nop // fill ! 2352: nop // ! 2353: ! 2354: // ! 2355: // Pattern 1001-01 -> 1001 ! 2356: // ! 2357: ! 2358: sb t0,0(a0) // store pixel ! 2359: sb t0,3(a0) // store pixel ! 2360: and v1,v0,0xf << 7 // isolate low order nibble ! 2361: addu v1,v1,t5 // compute dispatch address ! 2362: j v1 // dispatch to pixel store routine ! 2363: addu a0,a0,4 // advance to next draw point ! 2364: nop // fill ! 2365: nop // ! 2366: ! 2367: // ! 2368: // Pattern 1001-10 -> 1001 ! 2369: // ! 2370: ! 2371: sb t0,0(a0) // store pixel ! 2372: sb t0,3(a0) // store pixel ! 2373: and v1,v0,0xf << 7 // isolate low order nibble ! 2374: addu v1,v1,t5 // compute dispatch address ! 2375: j v1 // dispatch to pixel store routine ! 2376: addu a0,a0,4 // advance to next draw point ! 2377: nop // fill ! 2378: nop // ! 2379: ! 2380: // ! 2381: // Pattern 1001-11 -> 1001 ! 2382: // ! 2383: ! 2384: sb t0,0(a0) // store pixel ! 2385: sb t0,3(a0) // store pixel ! 2386: and v1,v0,0xf << 7 // isolate low order nibble ! 2387: addu v1,v1,t5 // compute dispatch address ! 2388: j v1 // dispatch to pixel store routine ! 2389: addu a0,a0,4 // advance to next draw point ! 2390: nop // fill ! 2391: nop // ! 2392: ! 2393: // ! 2394: // Pattern 1010-00 -> 0101 ! 2395: // ! 2396: ! 2397: sb t0,0(a0) // store pixel ! 2398: sb t0,2(a0) // store pixel ! 2399: and v1,v0,0xf << 7 // isolate low order nibble ! 2400: addu v1,v1,t5 // compute dispatch address ! 2401: j v1 // dispatch to pixel store routine ! 2402: addu a0,a0,4 // advance to next draw point ! 2403: nop // fill ! 2404: nop // ! 2405: ! 2406: // ! 2407: // Pattern 1010-01 -> 0101 ! 2408: // ! 2409: ! 2410: sb t0,0(a0) // store pixel ! 2411: sb t0,2(a0) // store pixel ! 2412: and v1,v0,0xf << 7 // isolate low order nibble ! 2413: addu v1,v1,t5 // compute dispatch address ! 2414: j v1 // dispatch to pixel store routine ! 2415: addu a0,a0,4 // advance to next draw point ! 2416: nop // fill ! 2417: nop // ! 2418: ! 2419: // ! 2420: // Pattern 1010-10 -> 0101 ! 2421: // ! 2422: ! 2423: sb t0,0(a0) // store pixel ! 2424: sb t0,2(a0) // store pixel ! 2425: and v1,v0,0xf << 7 // isolate low order nibble ! 2426: addu v1,v1,t5 // compute dispatch address ! 2427: j v1 // dispatch to pixel store routine ! 2428: addu a0,a0,4 // advance to next draw point ! 2429: nop // fill ! 2430: nop // ! 2431: ! 2432: // ! 2433: // Pattern 1010-11 -> 0101 ! 2434: // ! 2435: ! 2436: sb t0,0(a0) // store pixel ! 2437: sb t0,2(a0) // store pixel ! 2438: and v1,v0,0xf << 7 // isolate low order nibble ! 2439: addu v1,v1,t5 // compute dispatch address ! 2440: j v1 // dispatch to pixel store routine ! 2441: addu a0,a0,4 // advance to next draw point ! 2442: nop // fill ! 2443: nop // ! 2444: ! 2445: // ! 2446: // Pattern 1011-00 -> 1101 ! 2447: // ! 2448: ! 2449: sb t0,0(a0) // store pixel ! 2450: sh t0,2(a0) // store pixels ! 2451: and v1,v0,0xf << 7 // isolate low order nibble ! 2452: addu v1,v1,t5 // compute dispatch address ! 2453: j v1 // dispatch to pixel store routine ! 2454: addu a0,a0,4 // advance to next draw point ! 2455: nop // fill ! 2456: nop // ! 2457: ! 2458: // ! 2459: // Pattern 1011-01 -> 1101 ! 2460: // ! 2461: ! 2462: sb t0,0(a0) // store pixel ! 2463: sb t0,2(a0) // store pixel ! 2464: sb t0,3(a0) // store pixel ! 2465: and v1,v0,0xf << 7 // isolate low order nibble ! 2466: addu v1,v1,t5 // compute dispatch address ! 2467: j v1 // dispatch to pixel store routine ! 2468: addu a0,a0,4 // advance to next draw point ! 2469: nop // fill ! 2470: ! 2471: // ! 2472: // Pattern 1011-10 -> 1101 ! 2473: // ! 2474: ! 2475: sb t0,0(a0) // store pixel ! 2476: sh t0,2(a0) // store pixels ! 2477: and v1,v0,0xf << 7 // isolate low order nibble ! 2478: addu v1,v1,t5 // compute dispatch address ! 2479: j v1 // dispatch to pixel store routine ! 2480: addu a0,a0,4 // advance to next draw point ! 2481: nop // fill ! 2482: nop // ! 2483: ! 2484: // ! 2485: // Pattern 1011-11 -> 1101 ! 2486: // ! 2487: ! 2488: sb t0,0(a0) // store pixel ! 2489: sb t0,2(a0) // store pixel ! 2490: sb t0,3(a0) // store pixel ! 2491: and v1,v0,0xf << 7 // isolate low order nibble ! 2492: addu v1,v1,t5 // compute dispatch address ! 2493: j v1 // dispatch to pixel store routine ! 2494: addu a0,a0,4 // advance to next draw point ! 2495: nop // fill ! 2496: ! 2497: // ! 2498: // Pattern 1100-00 -> 0011 ! 2499: // ! 2500: ! 2501: sh t0,0(a0) // store pixels ! 2502: and v1,v0,0xf << 7 // isolate low order nibble ! 2503: addu v1,v1,t5 // compute dispatch address ! 2504: j v1 // dispatch to pixel store routine ! 2505: addu a0,a0,4 // advance to next draw point ! 2506: nop // fill ! 2507: nop // ! 2508: nop // ! 2509: ! 2510: // ! 2511: // Pattern 1100-01 -> 0011 ! 2512: // ! 2513: ! 2514: sb t0,0(a0) // store pixel ! 2515: sb t0,1(a0) // store pixel ! 2516: and v1,v0,0xf << 7 // isolate low order nibble ! 2517: addu v1,v1,t5 // compute dispatch address ! 2518: j v1 // dispatch to pixel store routine ! 2519: addu a0,a0,4 // advance to next draw point ! 2520: nop // fill ! 2521: nop // ! 2522: ! 2523: // ! 2524: // Pattern 1100-10 -> 0011 ! 2525: // ! 2526: ! 2527: sh t0,0(a0) // store pixels ! 2528: and v1,v0,0xf << 7 // isolate low order nibble ! 2529: addu v1,v1,t5 // compute dispatch address ! 2530: j v1 // dispatch to pixel store routine ! 2531: addu a0,a0,4 // advance to next draw point ! 2532: nop // fill ! 2533: nop // ! 2534: nop // ! 2535: ! 2536: // ! 2537: // Pattern 1100-11 -> 0011 ! 2538: // ! 2539: ! 2540: sb t0,0(a0) // store pixel ! 2541: sb t0,1(a0) // store pixel ! 2542: and v1,v0,0xf << 7 // isolate low order nibble ! 2543: addu v1,v1,t5 // compute dispatch address ! 2544: j v1 // dispatch to pixel store routine ! 2545: addu a0,a0,4 // advance to next draw point ! 2546: nop // fill ! 2547: nop // ! 2548: ! 2549: // ! 2550: // Pattern 1101-00 -> 1011 ! 2551: // ! 2552: ! 2553: sh t0,0(a0) // store pixels ! 2554: sb t0,3(a0) // store pixel ! 2555: and v1,v0,0xf << 7 // isolate low order nibble ! 2556: addu v1,v1,t5 // compute dispatch address ! 2557: j v1 // dispatch to pixel store routine ! 2558: addu a0,a0,4 // advance to next draw point ! 2559: nop // fill ! 2560: nop // ! 2561: ! 2562: // ! 2563: // Pattern 1101-01 -> 1011 ! 2564: // ! 2565: ! 2566: sb t0,0(a0) // store pixel ! 2567: sb t0,1(a0) // store pixel ! 2568: sb t0,3(a0) // store pixel ! 2569: and v1,v0,0xf << 7 // isolate low order nibble ! 2570: addu v1,v1,t5 // compute dispatch address ! 2571: j v1 // dispatch to pixel store routine ! 2572: addu a0,a0,4 // advance to next draw point ! 2573: nop // fill ! 2574: ! 2575: // ! 2576: // Pattern 1101-10 -> 1011 ! 2577: // ! 2578: ! 2579: sh t0,0(a0) // store pixels ! 2580: sb t0,3(a0) // store pixel ! 2581: and v1,v0,0xf << 7 // isolate low order nibble ! 2582: addu v1,v1,t5 // compute dispatch address ! 2583: j v1 // dispatch to pixel store routine ! 2584: addu a0,a0,4 // advance to next draw point ! 2585: nop // fill ! 2586: nop // ! 2587: ! 2588: // ! 2589: // Pattern 1101-11 -> 1011 ! 2590: // ! 2591: ! 2592: sb t0,0(a0) // store pixel ! 2593: sb t0,1(a0) // store pixel ! 2594: sb t0,3(a0) // store pixel ! 2595: and v1,v0,0xf << 7 // isolate low order nibble ! 2596: addu v1,v1,t5 // compute dispatch address ! 2597: j v1 // dispatch to pixel store routine ! 2598: addu a0,a0,4 // advance to next draw point ! 2599: nop // fill ! 2600: ! 2601: // ! 2602: // Pattern 1110-00 -> 0111 ! 2603: // ! 2604: ! 2605: swl t0,2(a0) // store pixels ! 2606: and v1,v0,0xf << 7 // isolate low order nibble ! 2607: addu v1,v1,t5 // compute dispatch address ! 2608: j v1 // dispatch to pixel store routine ! 2609: addu a0,a0,4 // advance to next draw point ! 2610: nop // fill ! 2611: nop // ! 2612: nop // ! 2613: ! 2614: // ! 2615: // Pattern 1110-01 -> 0111 ! 2616: // ! 2617: ! 2618: sb t0,0(a0) // store pixel ! 2619: sh t0,1(a0) // store pixels ! 2620: and v1,v0,0xf << 7 // isolate low order nibble ! 2621: addu v1,v1,t5 // compute dispatch address ! 2622: j v1 // dispatch to pixel store routine ! 2623: addu a0,a0,4 // advance to next draw point ! 2624: nop // fill ! 2625: nop // ! 2626: ! 2627: // ! 2628: // Pattern 1110-10 -> 0111 ! 2629: // ! 2630: ! 2631: sh t0,0(a0) // store pixels ! 2632: sb t0,2(a0) // store pixel ! 2633: and v1,v0,0xf << 7 // isolate low order nibble ! 2634: addu v1,v1,t5 // compute dispatch address ! 2635: j v1 // dispatch to pixel store routine ! 2636: addu a0,a0,4 // advance to next draw point ! 2637: nop // fill ! 2638: nop // ! 2639: ! 2640: // ! 2641: // Pattern 1110-11 -> 0111 ! 2642: // ! 2643: ! 2644: sb t0,0(a0) // store pixel ! 2645: sh t0,1(a0) // store pixels ! 2646: and v1,v0,0xf << 7 // isolate low order nibble ! 2647: addu v1,v1,t5 // compute dispatch address ! 2648: j v1 // dispatch to pixel store routine ! 2649: addu a0,a0,4 // advance to next draw point ! 2650: nop // fill ! 2651: nop // ! 2652: ! 2653: // ! 2654: // Pattern 1111-00 -> 1111 ! 2655: // ! 2656: ! 2657: sw t0,0(a0) // store pixels ! 2658: and v1,v0,0xf << 7 // isolate low order nibble ! 2659: addu v1,v1,t5 // compute dispatch address ! 2660: j v1 // dispatch to pixel store routine ! 2661: addu a0,a0,4 // advance to next draw point ! 2662: nop // fill ! 2663: nop // ! 2664: nop // ! 2665: ! 2666: // ! 2667: // Pattern 1111-01 -> 1111 ! 2668: // ! 2669: ! 2670: swr t0,0(a0) // store pixels ! 2671: sb t0,3(a0) // store pixel ! 2672: and v1,v0,0xf << 7 // isolate low order nibble ! 2673: addu v1,v1,t5 // compute dispatch address ! 2674: j v1 // dispatch to pixel store routine ! 2675: addu a0,a0,4 // advance to next draw point ! 2676: nop // fill ! 2677: nop // ! 2678: ! 2679: // ! 2680: // Pattern 1111-10 -> 1111 ! 2681: // ! 2682: ! 2683: sh t0,0(a0) // store pixels ! 2684: sh t0,2(a0) // store pixels ! 2685: and v1,v0,0xf << 7 // isolate low order nibble ! 2686: addu v1,v1,t5 // compute dispatch address ! 2687: j v1 // dispatch to pixel store routine ! 2688: addu a0,a0,4 // advance to next draw point ! 2689: nop // fill ! 2690: nop // ! 2691: ! 2692: // ! 2693: // Pattern 1111-11 -> 1111 ! 2694: // ! 2695: ! 2696: sb t0,0(a0) // store pixel ! 2697: swl t0,3(a0) // store pixels ! 2698: and v1,v0,0xf << 7 // isolate low order nibble ! 2699: addu v1,v1,t5 // compute dispatch address ! 2700: j v1 // dispatch to pixel store routine ! 2701: addu a0,a0,4 // advance to next draw point ! 2702: nop // fill ! 2703: nop // ! 2704: .set at ! 2705: .set reorder ! 2706: ! 2707: // ! 2708: // The following code is arranged as 64, four instruction blocks. The block ! 2709: // of code that is chosen for execution is determined from the low order ! 2710: // glyph nibble and the two low its of the draw address. ! 2711: // ! 2712: // The glyph nibbles are encoded in big endian order and therefore the pixels ! 2713: // that are stored are the reverse of the big endian bits within the nibble. ! 2714: // ! 2715: ! 2716: .set noreorder ! 2717: .set noat ! 2718: ! 2719: 70: // reference label ! 2720: // ! 2721: // Pattern 0000-00 ! 2722: // ! 2723: ! 2724: bne a1,t4,20b // if ne, more bytes in glyph ! 2725: addu a0,a0,4 // advance to next draw point ! 2726: b 40b // join common code ! 2727: add a0,a0,t3 // compute next scanline address ! 2728: nop // fill ! 2729: nop // ! 2730: nop // ! 2731: nop // ! 2732: ! 2733: // ! 2734: // Pattern 0000-01 ! 2735: // ! 2736: ! 2737: bne a1,t4,20b // if ne, more bytes in glyph ! 2738: addu a0,a0,4 // advance to next draw point ! 2739: b 40b // join common code ! 2740: add a0,a0,t3 // compute next scanline address ! 2741: nop // fill ! 2742: nop // ! 2743: nop // ! 2744: nop // ! 2745: ! 2746: // ! 2747: // Pattern 0000-10 ! 2748: // ! 2749: ! 2750: bne a1,t4,20b // if ne, more bytes in glyph ! 2751: addu a0,a0,4 // advance to next draw point ! 2752: b 40b // join common code ! 2753: add a0,a0,t3 // compute next scanline address ! 2754: nop // fill ! 2755: nop // ! 2756: nop // ! 2757: nop // ! 2758: ! 2759: // ! 2760: // Pattern 0000-11 ! 2761: // ! 2762: ! 2763: bne a1,t4,20b // if ne, more bytes in glyph ! 2764: addu a0,a0,4 // advance to next draw point ! 2765: b 40b // join common code ! 2766: add a0,a0,t3 // compute next scanline address ! 2767: nop // fill ! 2768: nop // ! 2769: nop // ! 2770: nop // ! 2771: ! 2772: // ! 2773: // Pattern 0001-00 -> 1000 ! 2774: // ! 2775: ! 2776: sb t0,3(a0) // store pixel ! 2777: bne a1,t4,20b // if ne, more bytes in glyph ! 2778: addu a0,a0,4 // advance to next draw point ! 2779: b 40b // join common code ! 2780: add a0,a0,t3 // compute next scanline address ! 2781: nop // fill ! 2782: nop // ! 2783: nop // ! 2784: ! 2785: // ! 2786: // Pattern 0001-01 -> 1000 ! 2787: // ! 2788: ! 2789: sb t0,3(a0) // store pixel ! 2790: bne a1,t4,20b // if ne, more bytes in glyph ! 2791: addu a0,a0,4 // advance to next draw point ! 2792: b 40b // join common code ! 2793: add a0,a0,t3 // compute next scanline address ! 2794: nop // fill ! 2795: nop // ! 2796: nop // ! 2797: ! 2798: // ! 2799: // Pattern 0001-10 -> 1000 ! 2800: // ! 2801: ! 2802: sb t0,3(a0) // store pixel ! 2803: bne a1,t4,20b // if ne, more bytes in glyph ! 2804: addu a0,a0,4 // advance to next draw point ! 2805: b 40b // join common code ! 2806: add a0,a0,t3 // compute next scanline address ! 2807: nop // fill ! 2808: nop // ! 2809: nop // ! 2810: ! 2811: // ! 2812: // Pattern 0001-11 -> 1000 ! 2813: // ! 2814: ! 2815: sb t0,3(a0) // store pixel ! 2816: bne a1,t4,20b // if ne, more bytes in glyph ! 2817: addu a0,a0,4 // advance to next draw point ! 2818: b 40b // join common code ! 2819: add a0,a0,t3 // compute next scanline address ! 2820: nop // fill ! 2821: nop // ! 2822: nop // ! 2823: ! 2824: // ! 2825: // Pattern 0010-00 -> 0100 ! 2826: // ! 2827: ! 2828: sb t0,2(a0) // store pixel ! 2829: bne a1,t4,20b // if ne, more bytes in glyph ! 2830: addu a0,a0,4 // advance to next draw point ! 2831: b 40b // join common code ! 2832: add a0,a0,t3 // compute next scanline address ! 2833: nop // fill ! 2834: nop // ! 2835: nop // ! 2836: ! 2837: // ! 2838: // Pattern 0010-01 -> 0100 ! 2839: // ! 2840: ! 2841: sb t0,2(a0) // store pixel ! 2842: bne a1,t4,20b // if ne, more bytes in glyph ! 2843: addu a0,a0,4 // advance to next draw point ! 2844: b 40b // join common code ! 2845: add a0,a0,t3 // compute next scanline address ! 2846: nop // fill ! 2847: nop // ! 2848: nop // ! 2849: ! 2850: // ! 2851: // Pattern 0010-10 -> 0100 ! 2852: // ! 2853: ! 2854: sb t0,2(a0) // store pixel ! 2855: bne a1,t4,20b // if ne, more bytes in glyph ! 2856: addu a0,a0,4 // advance to next draw point ! 2857: b 40b // join common code ! 2858: add a0,a0,t3 // compute next scanline address ! 2859: nop // fill ! 2860: nop // ! 2861: nop // ! 2862: ! 2863: // ! 2864: // Pattern 0010-11 -> 0100 ! 2865: // ! 2866: ! 2867: sb t0,2(a0) // store pixel ! 2868: bne a1,t4,20b // if ne, more bytes in glyph ! 2869: addu a0,a0,4 // advance to next draw point ! 2870: b 40b // join common code ! 2871: add a0,a0,t3 // compute next scanline address ! 2872: nop // fill ! 2873: nop // ! 2874: nop // ! 2875: ! 2876: // ! 2877: // Pattern 0011-00 -> 1100 ! 2878: // ! 2879: ! 2880: sh t0,2(a0) // store pixels ! 2881: bne a1,t4,20b // if ne, more bytes in glyph ! 2882: addu a0,a0,4 // advance to next draw point ! 2883: b 40b // join common code ! 2884: add a0,a0,t3 // compute next scanline address ! 2885: nop // fill ! 2886: nop // ! 2887: nop // ! 2888: ! 2889: // ! 2890: // Pattern 0011-01 -> 1100 ! 2891: // ! 2892: ! 2893: sb t0,2(a0) // store pixel ! 2894: sb t0,3(a0) // store pixel ! 2895: bne a1,t4,20b // if ne, more bytes in glyph ! 2896: addu a0,a0,4 // advance to next draw point ! 2897: b 40b // join common code ! 2898: add a0,a0,t3 // compute next scanline address ! 2899: nop // fill ! 2900: nop // ! 2901: ! 2902: // ! 2903: // Pattern 0011-10 -> 1100 ! 2904: // ! 2905: ! 2906: sh t0,2(a0) // store pixels ! 2907: bne a1,t4,20b // if ne, more bytes in glyph ! 2908: addu a0,a0,4 // advance to next draw point ! 2909: b 40b // join common code ! 2910: add a0,a0,t3 // compute next scanline address ! 2911: nop // fill ! 2912: nop // ! 2913: nop // ! 2914: ! 2915: // ! 2916: // Pattern 0011-11 -> 1100 ! 2917: // ! 2918: ! 2919: sb t0,2(a0) // store pixel ! 2920: sb t0,3(a0) // store pixel ! 2921: bne a1,t4,20b // if ne, more bytes in glyph ! 2922: addu a0,a0,4 // advance to next draw point ! 2923: b 40b // join common code ! 2924: add a0,a0,t3 // compute next scanline address ! 2925: nop // fill ! 2926: nop // ! 2927: ! 2928: // ! 2929: // Pattern 0100-00 -> 0010 ! 2930: // ! 2931: ! 2932: sb t0,1(a0) // store pixel ! 2933: bne a1,t4,20b // if ne, more bytes in glyph ! 2934: addu a0,a0,4 // advance to next draw point ! 2935: b 40b // join common code ! 2936: add a0,a0,t3 // compute next scanline address ! 2937: nop // fill ! 2938: nop // ! 2939: nop // ! 2940: ! 2941: // ! 2942: // Pattern 0100-01 -> 0010 ! 2943: // ! 2944: ! 2945: sb t0,1(a0) // store pixel ! 2946: bne a1,t4,20b // if ne, more bytes in glyph ! 2947: addu a0,a0,4 // advance to next draw point ! 2948: b 40b // join common code ! 2949: add a0,a0,t3 // compute next scanline address ! 2950: nop // fill ! 2951: nop // ! 2952: nop // ! 2953: ! 2954: // ! 2955: // Pattern 0100-10 -> 0010 ! 2956: // ! 2957: ! 2958: sb t0,1(a0) // store pixel ! 2959: bne a1,t4,20b // if ne, more bytes in glyph ! 2960: addu a0,a0,4 // advance to next draw point ! 2961: b 40b // join common code ! 2962: add a0,a0,t3 // compute next scanline address ! 2963: nop // fill ! 2964: nop // ! 2965: nop // ! 2966: ! 2967: // ! 2968: // Pattern 0100-11 -> 0010 ! 2969: // ! 2970: ! 2971: sb t0,1(a0) // store pixel ! 2972: bne a1,t4,20b // if ne, more bytes in glyph ! 2973: addu a0,a0,4 // advance to next draw point ! 2974: b 40b // join common code ! 2975: add a0,a0,t3 // compute next scanline address ! 2976: nop // fill ! 2977: nop // ! 2978: nop // ! 2979: ! 2980: // ! 2981: // Pattern 0101-00 -> 1010 ! 2982: // ! 2983: ! 2984: sb t0,1(a0) // store pixel ! 2985: sb t0,3(a0) // store pixel ! 2986: bne a1,t4,20b // if ne, more bytes in glyph ! 2987: addu a0,a0,4 // advance to next draw point ! 2988: b 40b // join common code ! 2989: add a0,a0,t3 // compute next scanline address ! 2990: nop // fill ! 2991: nop // ! 2992: ! 2993: // ! 2994: // Pattern 0101-01 -> 1010 ! 2995: // ! 2996: ! 2997: sb t0,1(a0) // store pixel ! 2998: sb t0,3(a0) // store pixel ! 2999: bne a1,t4,20b // if ne, more bytes in glyph ! 3000: addu a0,a0,4 // advance to next draw point ! 3001: b 40b // join common code ! 3002: add a0,a0,t3 // compute next scanline address ! 3003: nop // fill ! 3004: nop // ! 3005: ! 3006: // ! 3007: // Pattern 0101-10 -> 1010 ! 3008: // ! 3009: ! 3010: sb t0,1(a0) // store pixel ! 3011: sb t0,3(a0) // store pixel ! 3012: bne a1,t4,20b // if ne, more bytes in glyph ! 3013: addu a0,a0,4 // advance to next draw point ! 3014: b 40b // join common code ! 3015: add a0,a0,t3 // compute next scanline address ! 3016: nop // fill ! 3017: nop // ! 3018: ! 3019: // ! 3020: // Pattern 0101-11 -> 1010 ! 3021: // ! 3022: ! 3023: sb t0,1(a0) // store pixel ! 3024: sb t0,3(a0) // store pixel ! 3025: bne a1,t4,20b // if ne, more bytes in glyph ! 3026: addu a0,a0,4 // advance to next draw point ! 3027: b 40b // join common code ! 3028: add a0,a0,t3 // compute next scanline address ! 3029: nop // fill ! 3030: nop // ! 3031: ! 3032: // ! 3033: // Pattern 0110-00 -> 0110 ! 3034: // ! 3035: ! 3036: sb t0,1(a0) // store pixel ! 3037: sb t0,2(a0) // store pixel ! 3038: bne a1,t4,20b // if ne, more bytes in glyph ! 3039: addu a0,a0,4 // advance to next draw point ! 3040: b 40b // join common code ! 3041: add a0,a0,t3 // compute next scanline address ! 3042: nop // fill ! 3043: nop // ! 3044: ! 3045: // ! 3046: // Pattern 0110-01 -> 0110 ! 3047: // ! 3048: ! 3049: sh t0,1(a0) // store pixels ! 3050: bne a1,t4,20b // if ne, more bytes in glyph ! 3051: addu a0,a0,4 // advance to next draw point ! 3052: b 40b // join common code ! 3053: add a0,a0,t3 // compute next scanline address ! 3054: nop // fill ! 3055: nop // ! 3056: nop // ! 3057: ! 3058: // ! 3059: // Pattern 0110-10 -> 0110 ! 3060: // ! 3061: ! 3062: sb t0,1(a0) // store pixel ! 3063: sb t0,2(a0) // store pixel ! 3064: bne a1,t4,20b // if ne, more bytes in glyph ! 3065: addu a0,a0,4 // advance to next draw point ! 3066: b 40b // join common code ! 3067: add a0,a0,t3 // compute next scanline address ! 3068: nop // fill ! 3069: nop // ! 3070: ! 3071: // ! 3072: // Pattern 0110-11 -> 0110 ! 3073: // ! 3074: ! 3075: sh t0,1(a0) // store pixels ! 3076: bne a1,t4,20b // if ne, more bytes in glyph ! 3077: addu a0,a0,4 // advance to next draw point ! 3078: b 40b // join common code ! 3079: add a0,a0,t3 // compute next scanline address ! 3080: nop // fill ! 3081: nop // ! 3082: nop // ! 3083: ! 3084: // ! 3085: // Pattern 0111-00 -> 1110 ! 3086: // ! 3087: ! 3088: swr t0,1(a0) // store pixels ! 3089: bne a1,t4,20b // if ne, more bytes in glyph ! 3090: addu a0,a0,4 // advance to next draw point ! 3091: b 40b // join common code ! 3092: add a0,a0,t3 // compute next scanline address ! 3093: nop // fill ! 3094: nop // ! 3095: nop // ! 3096: ! 3097: // ! 3098: // Pattern 0111-01 -> 1110 ! 3099: // ! 3100: ! 3101: sh t0,1(a0) // store pixels ! 3102: sb t0,3(a0) // store pixel ! 3103: bne a1,t4,20b // if ne, more bytes in glyph ! 3104: addu a0,a0,4 // advance to next draw point ! 3105: b 40b // join common code ! 3106: add a0,a0,t3 // compute next scanline address ! 3107: nop // fill ! 3108: nop // ! 3109: ! 3110: // ! 3111: // Pattern 0111-10 -> 1110 ! 3112: // ! 3113: ! 3114: sb t0,1(a0) // store pixel ! 3115: sh t0,2(a0) // store pixels ! 3116: bne a1,t4,20b // if ne, more bytes in glyph ! 3117: addu a0,a0,4 // advance to next draw point ! 3118: b 40b // join common code ! 3119: add a0,a0,t3 // compute next scanline address ! 3120: nop // fill ! 3121: nop // ! 3122: ! 3123: // ! 3124: // Pattern 0111-11 -> 1110 ! 3125: // ! 3126: ! 3127: swl t0,3(a0) // store pixels ! 3128: bne a1,t4,20b // if ne, more bytes in glyph ! 3129: addu a0,a0,4 // advance to next draw point ! 3130: b 40b // join common code ! 3131: add a0,a0,t3 // compute next scanline address ! 3132: nop // fill ! 3133: nop // ! 3134: nop // ! 3135: ! 3136: // ! 3137: // Pattern 1000-00 -> 0001 ! 3138: // ! 3139: ! 3140: sb t0,0(a0) // store pixel ! 3141: bne a1,t4,20b // if ne, more bytes in glyph ! 3142: addu a0,a0,4 // advance to next draw point ! 3143: b 40b // join common code ! 3144: add a0,a0,t3 // compute next scanline address ! 3145: nop // fill ! 3146: nop // ! 3147: nop // ! 3148: ! 3149: // ! 3150: // Pattern 1000-01 -> 0001 ! 3151: // ! 3152: ! 3153: sb t0,0(a0) // store pixel ! 3154: bne a1,t4,20b // if ne, more bytes in glyph ! 3155: addu a0,a0,4 // advance to next draw point ! 3156: b 40b // join common code ! 3157: add a0,a0,t3 // compute next scanline address ! 3158: nop // fill ! 3159: nop // ! 3160: nop // ! 3161: ! 3162: // ! 3163: // Pattern 1000-10 -> 0001 ! 3164: // ! 3165: ! 3166: sb t0,0(a0) // store pixel ! 3167: bne a1,t4,20b // if ne, more bytes in glyph ! 3168: addu a0,a0,4 // advance to next draw point ! 3169: b 40b // join common code ! 3170: add a0,a0,t3 // compute next scanline address ! 3171: nop // fill ! 3172: nop // ! 3173: nop // ! 3174: ! 3175: // ! 3176: // Pattern 1000-11 -> 0001 ! 3177: // ! 3178: ! 3179: sb t0,0(a0) // store pixel ! 3180: bne a1,t4,20b // if ne, more bytes in glyph ! 3181: addu a0,a0,4 // advance to next draw point ! 3182: b 40b // join common code ! 3183: add a0,a0,t3 // compute next scanline address ! 3184: nop // fill ! 3185: nop // ! 3186: nop // ! 3187: ! 3188: // ! 3189: // Pattern 1001-00 -> 1001 ! 3190: // ! 3191: ! 3192: sb t0,0(a0) // store pixel ! 3193: sb t0,3(a0) // store pixel ! 3194: bne a1,t4,20b // if ne, more bytes in glyph ! 3195: addu a0,a0,4 // advance to next draw point ! 3196: b 40b // join common code ! 3197: add a0,a0,t3 // compute next scanline address ! 3198: nop // fill ! 3199: nop // ! 3200: ! 3201: // ! 3202: // Pattern 1001-01 -> 1001 ! 3203: // ! 3204: ! 3205: sb t0,0(a0) // store pixel ! 3206: sb t0,3(a0) // store pixel ! 3207: bne a1,t4,20b // if ne, more bytes in glyph ! 3208: addu a0,a0,4 // advance to next draw point ! 3209: b 40b // join common code ! 3210: add a0,a0,t3 // compute next scanline address ! 3211: nop // fill ! 3212: nop // ! 3213: ! 3214: // ! 3215: // Pattern 1001-10 -> 1001 ! 3216: // ! 3217: ! 3218: sb t0,0(a0) // store pixel ! 3219: sb t0,3(a0) // store pixel ! 3220: bne a1,t4,20b // if ne, more bytes in glyph ! 3221: addu a0,a0,4 // advance to next draw point ! 3222: b 40b // join common code ! 3223: add a0,a0,t3 // compute next scanline address ! 3224: nop // fill ! 3225: nop // ! 3226: ! 3227: // ! 3228: // Pattern 1001-11 -> 1001 ! 3229: // ! 3230: ! 3231: sb t0,0(a0) // store pixel ! 3232: sb t0,3(a0) // store pixel ! 3233: bne a1,t4,20b // if ne, more bytes in glyph ! 3234: addu a0,a0,4 // advance to next draw point ! 3235: b 40b // join common code ! 3236: add a0,a0,t3 // compute next scanline address ! 3237: nop // fill ! 3238: nop // ! 3239: ! 3240: // ! 3241: // Pattern 1010-00 -> 0101 ! 3242: // ! 3243: ! 3244: sb t0,0(a0) // store pixel ! 3245: sb t0,2(a0) // store pixel ! 3246: bne a1,t4,20b // if ne, more bytes in glyph ! 3247: addu a0,a0,4 // advance to next draw point ! 3248: b 40b // join common code ! 3249: add a0,a0,t3 // compute next scanline address ! 3250: nop // fill ! 3251: nop // ! 3252: ! 3253: // ! 3254: // Pattern 1010-01 -> 0101 ! 3255: // ! 3256: ! 3257: sb t0,0(a0) // store pixel ! 3258: sb t0,2(a0) // store pixel ! 3259: bne a1,t4,20b // if ne, more bytes in glyph ! 3260: addu a0,a0,4 // advance to next draw point ! 3261: b 40b // join common code ! 3262: add a0,a0,t3 // compute next scanline address ! 3263: nop // fill ! 3264: nop // ! 3265: ! 3266: // ! 3267: // Pattern 1010-10 -> 0101 ! 3268: // ! 3269: ! 3270: sb t0,0(a0) // store pixel ! 3271: sb t0,2(a0) // store pixel ! 3272: bne a1,t4,20b // if ne, more bytes in glyph ! 3273: addu a0,a0,4 // advance to next draw point ! 3274: b 40b // join common code ! 3275: add a0,a0,t3 // compute next scanline address ! 3276: nop // fill ! 3277: nop // ! 3278: ! 3279: // ! 3280: // Pattern 1010-11 -> 0101 ! 3281: // ! 3282: ! 3283: sb t0,0(a0) // store pixel ! 3284: sb t0,2(a0) // store pixel ! 3285: bne a1,t4,20b // if ne, more bytes in glyph ! 3286: addu a0,a0,4 // advance to next draw point ! 3287: b 40b // join common code ! 3288: add a0,a0,t3 // compute next scanline address ! 3289: nop // fill ! 3290: nop // ! 3291: ! 3292: // ! 3293: // Pattern 1011-00 -> 1101 ! 3294: // ! 3295: ! 3296: sb t0,0(a0) // store pixel ! 3297: sh t0,2(a0) // store pixels ! 3298: bne a1,t4,20b // if ne, more bytes in glyph ! 3299: addu a0,a0,4 // advance to next draw point ! 3300: b 40b // join common code ! 3301: add a0,a0,t3 // compute next scanline address ! 3302: nop // fill ! 3303: nop // ! 3304: ! 3305: // ! 3306: // Pattern 1011-01 -> 1101 ! 3307: // ! 3308: ! 3309: sb t0,0(a0) // store pixel ! 3310: sb t0,2(a0) // store pixel ! 3311: sb t0,3(a0) // store pixel ! 3312: bne a1,t4,20b // if ne, more bytes in glyph ! 3313: addu a0,a0,4 // advance to next draw point ! 3314: b 40b // join common code ! 3315: add a0,a0,t3 // compute next scanline address ! 3316: nop // fill ! 3317: ! 3318: // ! 3319: // Pattern 1011-10 -> 1101 ! 3320: // ! 3321: ! 3322: sb t0,0(a0) // store pixel ! 3323: sh t0,2(a0) // store pixels ! 3324: bne a1,t4,20b // if ne, more bytes in glyph ! 3325: addu a0,a0,4 // advance to next draw point ! 3326: b 40b // join common code ! 3327: add a0,a0,t3 // compute next scanline address ! 3328: nop // fill ! 3329: nop // ! 3330: ! 3331: // ! 3332: // Pattern 1011-11 -> 1101 ! 3333: // ! 3334: ! 3335: sb t0,0(a0) // store pixel ! 3336: sb t0,2(a0) // store pixel ! 3337: sb t0,3(a0) // store pixel ! 3338: bne a1,t4,20b // if ne, more bytes in glyph ! 3339: addu a0,a0,4 // advance to next draw point ! 3340: b 40b // join common code ! 3341: add a0,a0,t3 // compute next scanline address ! 3342: nop // fill ! 3343: ! 3344: // ! 3345: // Pattern 1100-00 -> 0011 ! 3346: // ! 3347: ! 3348: sh t0,0(a0) // store pixels ! 3349: bne a1,t4,20b // if ne, more bytes in glyph ! 3350: addu a0,a0,4 // advance to next draw point ! 3351: b 40b // join common code ! 3352: add a0,a0,t3 // compute next scanline address ! 3353: nop // fill ! 3354: nop // ! 3355: nop // ! 3356: ! 3357: // ! 3358: // Pattern 1100-01 -> 0011 ! 3359: // ! 3360: ! 3361: sb t0,0(a0) // store pixel ! 3362: sb t0,1(a0) // store pixel ! 3363: bne a1,t4,20b // if ne, more bytes in glyph ! 3364: addu a0,a0,4 // advance to next draw point ! 3365: b 40b // join common code ! 3366: add a0,a0,t3 // compute next scanline address ! 3367: nop // fill ! 3368: nop // ! 3369: ! 3370: // ! 3371: // Pattern 1100-10 -> 0011 ! 3372: // ! 3373: ! 3374: sh t0,0(a0) // store pixels ! 3375: bne a1,t4,20b // if ne, more bytes in glyph ! 3376: addu a0,a0,4 // advance to next draw point ! 3377: b 40b // join common code ! 3378: add a0,a0,t3 // compute next scanline address ! 3379: nop // fill ! 3380: nop // ! 3381: nop // ! 3382: ! 3383: // ! 3384: // Pattern 1100-11 -> 0011 ! 3385: // ! 3386: ! 3387: sb t0,0(a0) // store pixel ! 3388: sb t0,1(a0) // store pixel ! 3389: bne a1,t4,20b // if ne, more bytes in glyph ! 3390: addu a0,a0,4 // advance to next draw point ! 3391: b 40b // join common code ! 3392: add a0,a0,t3 // compute next scanline address ! 3393: nop // fill ! 3394: nop // ! 3395: ! 3396: // ! 3397: // Pattern 1101-00 -> 1011 ! 3398: // ! 3399: ! 3400: sh t0,0(a0) // store pixels ! 3401: sb t0,3(a0) // store pixel ! 3402: bne a1,t4,20b // if ne, more bytes in glyph ! 3403: addu a0,a0,4 // advance to next draw point ! 3404: b 40b // join common code ! 3405: add a0,a0,t3 // compute next scanline address ! 3406: nop // fill ! 3407: nop // ! 3408: ! 3409: // ! 3410: // Pattern 1101-01 -> 1011 ! 3411: // ! 3412: ! 3413: sb t0,0(a0) // store pixel ! 3414: sb t0,1(a0) // store pixel ! 3415: sb t0,3(a0) // store pixel ! 3416: bne a1,t4,20b // if ne, more bytes in glyph ! 3417: addu a0,a0,4 // advance to next draw point ! 3418: b 40b // join common code ! 3419: add a0,a0,t3 // compute next scanline address ! 3420: nop // fill ! 3421: ! 3422: // ! 3423: // Pattern 1101-10 -> 1011 ! 3424: // ! 3425: ! 3426: sh t0,0(a0) // store pixels ! 3427: sb t0,3(a0) // store pixel ! 3428: bne a1,t4,20b // if ne, more bytes in glyph ! 3429: addu a0,a0,4 // advance to next draw point ! 3430: b 40b // join common code ! 3431: add a0,a0,t3 // compute next scanline address ! 3432: nop // fill ! 3433: nop // ! 3434: ! 3435: // ! 3436: // Pattern 1101-11 -> 1011 ! 3437: // ! 3438: ! 3439: sb t0,0(a0) // store pixel ! 3440: sb t0,1(a0) // store pixel ! 3441: sb t0,3(a0) // store pixel ! 3442: bne a1,t4,20b // if ne, more bytes in glyph ! 3443: addu a0,a0,4 // advance to next draw point ! 3444: b 40b // join common code ! 3445: add a0,a0,t3 // compute next scanline address ! 3446: nop // fill ! 3447: ! 3448: // ! 3449: // Pattern 1110-00 -> 0111 ! 3450: // ! 3451: ! 3452: swl t0,2(a0) // store pixels ! 3453: bne a1,t4,20b // if ne, more bytes in glyph ! 3454: addu a0,a0,4 // advance to next draw point ! 3455: b 40b // join common code ! 3456: add a0,a0,t3 // compute next scanline address ! 3457: nop // fill ! 3458: nop // ! 3459: nop // ! 3460: ! 3461: // ! 3462: // Pattern 1110-01 -> 0111 ! 3463: // ! 3464: ! 3465: sb t0,0(a0) // store pixel ! 3466: sh t0,1(a0) // store pixels ! 3467: bne a1,t4,20b // if ne, more bytes in glyph ! 3468: addu a0,a0,4 // advance to next draw point ! 3469: b 40b // join common code ! 3470: add a0,a0,t3 // compute next scanline address ! 3471: nop // fill ! 3472: nop // ! 3473: ! 3474: // ! 3475: // Pattern 1110-10 -> 0111 ! 3476: // ! 3477: ! 3478: sh t0,0(a0) // store pixels ! 3479: sb t0,2(a0) // store pixel ! 3480: bne a1,t4,20b // if ne, more bytes in glyph ! 3481: addu a0,a0,4 // advance to next draw point ! 3482: b 40b // join common code ! 3483: add a0,a0,t3 // compute next scanline address ! 3484: nop // fill ! 3485: nop // ! 3486: ! 3487: // ! 3488: // Pattern 1110-11 -> 0111 ! 3489: // ! 3490: ! 3491: sb t0,0(a0) // store pixel ! 3492: sh t0,1(a0) // store pixels ! 3493: bne a1,t4,20b // if ne, more bytes in glyph ! 3494: addu a0,a0,4 // advance to next draw point ! 3495: b 40b // join common code ! 3496: add a0,a0,t3 // compute next scanline address ! 3497: nop // fill ! 3498: nop // ! 3499: ! 3500: // ! 3501: // Pattern 1111-00 -> 1111 ! 3502: // ! 3503: ! 3504: sw t0,0(a0) // store pixels ! 3505: bne a1,t4,20b // if ne, more bytes in glyph ! 3506: addu a0,a0,4 // advance to next draw point ! 3507: b 40b // join common code ! 3508: add a0,a0,t3 // compute next scanline address ! 3509: nop // fill ! 3510: nop // ! 3511: nop // ! 3512: ! 3513: // ! 3514: // Pattern 1111-01 -> 1111 ! 3515: // ! 3516: ! 3517: swr t0,0(a0) // store pixels ! 3518: sb t0,3(a0) // store pixel ! 3519: bne a1,t4,20b // if ne, more bytes in glyph ! 3520: addu a0,a0,4 // advance to next draw point ! 3521: b 40b // join common code ! 3522: add a0,a0,t3 // compute next scanline address ! 3523: nop // fill ! 3524: nop // ! 3525: ! 3526: // ! 3527: // Pattern 1111-10 -> 1111 ! 3528: // ! 3529: ! 3530: sh t0,0(a0) // store pixels ! 3531: sh t0,2(a0) // store pixels ! 3532: bne a1,t4,20b // if ne, more bytes in glyph ! 3533: addu a0,a0,4 // advance to next draw point ! 3534: b 40b // join common code ! 3535: add a0,a0,t3 // compute next scanline address ! 3536: nop // fill ! 3537: nop // ! 3538: ! 3539: // ! 3540: // Pattern 1111-11 -> 1111 ! 3541: // ! 3542: ! 3543: sb t0,0(a0) // store pixel ! 3544: swl t0,3(a0) // store pixels ! 3545: bne a1,t4,20b // if ne, more bytes in glyph ! 3546: addu a0,a0,4 // advance to next draw point ! 3547: b 40b // join common code ! 3548: add a0,a0,t3 // compute next scanline address ! 3549: nop // fill ! 3550: nop // ! 3551: .set at ! 3552: .set reorder ! 3553: ! 3554: .end DrvpOutputGlyphTransparent
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.