|
|
1.1 ! root 1: .text ! 2: .globl texture32 ! 3: # texture32(bp, r, tp, f) ! 4: # 0(ap) = bp ! 5: # 4(ap) = r.origin, r.origin.x ! 6: # 6(ap) = r.origin.y ! 7: # 8(ap) = r.corner, r.corner.x ! 8: # 10(ap) = r.corner.y ! 9: # 12(ap) = tp ! 10: # 16(ap) = f ! 11: ! 12: .align 8 ! 13: texture32: ! 14: SAVE %r3 # save all registers ! 15: addw2 &8,%sp # local vars ! 16: # rectclip(&r, bp->rect) ! 17: movaw 4(%ap), %r0 # r0 = &r.origin.x ! 18: addw3 &8, 0(%ap), %r1 # r1 = &bp->rect.origin.x ! 19: cmph 0(%r0), 0(%r1) # r.o.x < bp->r.o.x ? ! 20: jge .L1 ! 21: movh 0(%r1), 0(%r0) ! 22: .L1: ! 23: addw2 &2, %r0 ! 24: addw2 &2, %r1 ! 25: cmph 0(%r0), 0(%r1) # r.o.y < bp->r.o.y ? ! 26: jge .L2 ! 27: movh 0(%r1), 0(%r0) ! 28: .L2: ! 29: addw2 &2, %r0 ! 30: addw2 &2, %r1 ! 31: cmph 0(%r0), 0(%r1) # r.c.x > bp->r.c.x ? ! 32: jle .L3 ! 33: movh 0(%r1), 0(%r0) ! 34: .L3: ! 35: addw2 &2, %r0 ! 36: addw2 &2, %r1 ! 37: cmph 0(%r0), 0(%r1) # r.c.y > bp->r.c.y ? ! 38: jle .L4 ! 39: movh 0(%r1), 0(%r0) ! 40: .L4: ! 41: cmph 8(%ap),4(%ap) # width in bits ! 42: jle end # if <=0, forget it ! 43: ! 44: # %r8 = addr(bitmap,rect.origin) ! 45: PUSHW 0(%ap) ! 46: PUSHW 4(%ap) ! 47: call &2,addr ! 48: MOVW %r0,%r8 ! 49: ! 50: movw 0(%ap),%r7 # pointer to bitmap ! 51: llsw3 &2,4(%r7),%r7 # width of bitmap in bytes -> r7 ! 52: ! 53: movw 12(%ap),%r6 # r6 = pointer to texture ! 54: ! 55: subh3 6(%ap),10(%ap),%r4 # dy ! 56: ! 57: andh3 &0x1f,6(%ap),%r0 ! 58: llsw3 &2,%r0,%r3 # bit index into texture = r3 ! 59: ! 60: movh 4(%ap),%r2 # rec.origin.x -> r2 ! 61: lrsw3 %r2,&-1,0(%fp) # generate mask1 -> 0(%fp) ! 62: ! 63: subh3 &1,8(%ap),%r5 ! 64: arsw3 %r5,&0x80000000,4(%fp) # generate mask2 -> 4(%fp) ! 65: ! 66: arsw3 &5,%r5,%r5 # (x + dx -1) >> WORDSHIFT ! 67: arsw3 &5,%r2,%r2 # x >> WORDSHIFT ! 68: subw2 %r2,%r5 ! 69: DECW %r5 # inner word count ii ! 70: BGEB notnarrow # if ii == -1 then narrow ! 71: andw2 4(%fp),0(%fp) # narrow, combine both masks here ! 72: mcomw 0(%fp),4(%fp) # mask2 = ~mask1 ! 73: subw2 &4,%r7 # amount to get to next line ! 74: BRB restcode ! 75: notnarrow: ! 76: addw3 &1,%r5,%r0 # offset in words ! 77: llsw3 &2,%r0,%r0 # offset in bytes ! 78: subw2 %r0,%r7 # amount to get to next line ! 79: restcode: ! 80: ALSW3 &2,16(%ap),%r0 # code * 4 -> r0 ! 81: BLB end # bad if code less than 0 ! 82: cmpw %r0,&12 # see if code greater than 3 ! 83: jle *jmptbl(%r0) # jump to correct routine if ok ! 84: end: subw2 &8,%sp ! 85: RESTORE %r3 ! 86: RET ! 87: ! 88: ! 89: .data ! 90: jmptbl: .word FSTORE ! 91: .word FOR ! 92: .word FCLEAR ! 93: .word FXOR ! 94: .text ! 95: FXOR: DECW %r4 # number of lines ! 96: jl end # if neg. then done ! 97: addw3 %r6,%r3,%r2 ! 98: movw 0(%r2),%r2 # bits = map[bitindex] ! 99: addw2 &4,%r3 #bitindex += 1; ! 100: andw2 &0x7f,%r3 # bitindex = ( bitindex + 1) & WORDMASK ! 101: andw3 0(%fp),%r2,%r0 # ! 102: xorw2 %r0,0(%r8) #screenp ^= bits & mask1 ! 103: addw2 &4,%r8 # screenp++ ! 104: movw %r5,%r1 # i = ii ! 105: BLB restloop # if i = -1 then narrow ! 106: BEB mask2ok # if i = 0 then no inner words ! 107: lrsw3 &2,%r1,%r0 # i/4 ! 108: BLEB less4 # less than 4 inner words ! 109: more4: xorw2 %r2,0(%r8) # screenp ^= bits ! 110: xorw2 %r2,4(%r8) # screenp ^= bits ! 111: xorw2 %r2,8(%r8) # screenp ^= bits ! 112: xorw2 %r2,12(%r8) # screenp ^= bits ! 113: addw2 &16,%r8 # screenp += 4 ! 114: DECW %r0 ! 115: BGB more4 # more inner words ! 116: andw2 &3,%r1 # just how many are left ! 117: BLEB mask2ok # no more to do ! 118: less4: xorw2 %r2,0(%r8) # screenp ^= bits ! 119: addw2 &4,%r8 # screenp++ ! 120: DECW %r1 ! 121: BGB less4 # more inner words ! 122: mask2ok: ! 123: andw3 4(%fp),%r2,%r0 ! 124: xorw2 %r0,0(%r8) # screenp ^= (bits & mask2) ! 125: restloop: ! 126: addw2 %r7,%r8 # screenp += width ! 127: BRB FXOR ! 128: ! 129: FCLEAR: mcomw 0(%fp),0(%fp) ! 130: mcomw 4(%fp),4(%fp) ! 131: FCLR: DECW %r4 # number of lines ! 132: jl end # if neg. then done ! 133: addw3 %r6,%r3,%r2 ! 134: mcomw 0(%r2),%r2 # bits = ~map[bitindex] ! 135: addw2 &4,%r3 #bitindex += 1; ! 136: andw2 &0x7f,%r3 # bitindex = ( bitindex + 1) & WORDMASK ! 137: orw3 0(%fp),%r2,%r0 # ! 138: andw2 %r0,0(%r8) #screenp &= bits & mask1 ! 139: addw2 &4,%r8 # screenp++ ! 140: movw %r5,%r1 # i = ii ! 141: BLB restclr # if i = -1 then narrow ! 142: BEB msk2clr # if i = 0 then no inner words ! 143: lrsw3 &2,%r1,%r0 # i/4 ! 144: BLEB less4clr # less than 4 inner words ! 145: Fclr_4: andw2 %r2,0(%r8) # screenp ^= bits ! 146: andw2 %r2,4(%r8) # screenp ^= bits ! 147: andw2 %r2,8(%r8) # screenp ^= bits ! 148: andw2 %r2,12(%r8) # screenp ^= bits ! 149: addw2 &16,%r8 # screenp += 4 ! 150: DECW %r0 ! 151: BGB Fclr_4 # more inner words ! 152: andw2 &3,%r1 # just how many are left ! 153: BLEB msk2clr # no more to do ! 154: less4clr: ! 155: andw2 %r2,0(%r8) # screenp ^= bits ! 156: addw2 &4,%r8 # screenp++ ! 157: DECW %r1 ! 158: BGB less4clr # more inner words ! 159: msk2clr: ! 160: orw3 4(%fp),%r2,%r0 ! 161: andw2 %r0,0(%r8) # screenp ^= (bits & mask2) ! 162: restclr: ! 163: addw2 %r7,%r8 # screenp += width ! 164: BRB FCLR ! 165: ! 166: FOR: DECW %r4 # number of lines ! 167: jl end # if neg. then done ! 168: addw3 %r6,%r3,%r2 ! 169: movw 0(%r2),%r2 # bits = map[bitindex] ! 170: addw2 &4,%r3 #bitindex += 1; ! 171: andw2 &0x7f,%r3 # bitindex = ( bitindex + 1) & WORDMASK ! 172: andw3 0(%fp),%r2,%r0 # ! 173: orw2 %r0,0(%r8) #screenp ^= bits & mask1 ! 174: addw2 &4,%r8 # screenp++ ! 175: movw %r5,%r1 # i = ii ! 176: BLB rest_or # if i = -1 then narrow ! 177: BEB mask2or # if i = 0 then no inner words ! 178: lrsw3 &2,%r1,%r0 # i/4 ! 179: BLEB less4or # less than 4 inner words ! 180: For_4: orw2 %r2,0(%r8) # screenp ^= bits ! 181: orw2 %r2,4(%r8) # screenp ^= bits ! 182: orw2 %r2,8(%r8) # screenp ^= bits ! 183: orw2 %r2,12(%r8) # screenp ^= bits ! 184: addw2 &16,%r8 # screenp += 4 ! 185: DECW %r0 ! 186: BGB For_4 # more inner words ! 187: andw2 &3,%r1 # just how many are left ! 188: BLEB mask2or # no more to do ! 189: less4or: ! 190: orw2 %r2,0(%r8) # screenp ^= bits ! 191: addw2 &4,%r8 # screenp++ ! 192: DECW %r1 ! 193: BGB less4or # more inner words ! 194: mask2or: ! 195: andw3 4(%fp),%r2,%r0 ! 196: orw2 %r0,0(%r8) # screenp ^= (bits & mask2) ! 197: rest_or: ! 198: addw2 %r7,%r8 # screenp += width ! 199: BRB FOR ! 200: ! 201: FSTORE: DECW %r4 # number of lines ! 202: jl end # if neg. then done ! 203: addw3 %r6,%r3,%r2 ! 204: movw 0(%r2),%r2 # bits = map[bitindex] ! 205: addw2 &4,%r3 #bitindex += 1; ! 206: andw2 &0x7f,%r3 # bitindex = ( bitindex + 1) & WORDMASK ! 207: andw3 0(%fp),%r2,%r0 # ! 208: xorw3 0(%r8),%r2,%r0 #screenp = bits & mask1 ! 209: andw2 0(%fp),%r0 ! 210: xorw2 %r0,0(%r8) # ! 211: addw2 &4,%r8 # screenp++ ! 212: movw %r5,%r1 # i = ii ! 213: BLB stoloop # if i = -1 then narrow ! 214: BEB sto2ok # if i = 0 then no inner words ! 215: lrsw3 &2,%r1,%r0 # i/4 ! 216: BLEB st4less # less than 4 inner words ! 217: store4: movw %r2,0(%r8) # screenp = bits ! 218: movw %r2,4(%r8) # screenp = bits ! 219: movw %r2,8(%r8) # screenp = bits ! 220: movw %r2,12(%r8) # screenp = bits ! 221: addw2 &16,%r8 # screenp += 4 ! 222: DECW %r0 ! 223: BGB store4 # more inner words ! 224: andw2 &3,%r1 # just how many are left ! 225: BLEB sto2ok # no more to do ! 226: st4less: ! 227: movw %r2,0(%r8) # screenp ^= bits ! 228: addw2 &4,%r8 # screenp++ ! 229: DECW %r1 ! 230: BGB st4less # more inner words ! 231: sto2ok: ! 232: xorw3 0(%r8),%r2,%r0 #screenp = bits & mask2 ! 233: andw2 4(%fp),%r0 ! 234: xorw2 %r0,0(%r8) # ! 235: stoloop: ! 236: addw2 %r7,%r8 # screenp += width ! 237: BRB FSTORE
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.