Annotation of ntddk/src/video/displays/framebuf/mips/glyphout.s, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.