|
|
1.1 ! root 1: # cursblt draws the cursor. It is assumed that ! 2: # the cursor is 16x16 in a texture16 ! 3: # the move is in XOR mode ! 4: # the destination is on the screen ! 5: # arguments are &display, &texture, destination point ! 6: ! 7: .globl cursblt ! 8: .align 8 ! 9: cursblt: ! 10: SAVE %r6 ! 11: MOVW &16,%r7 # scan count and source position value ! 12: MOVW 0(%ap),%r2 # get screen bitmap pointer ! 13: ARSH3 &4,8(%ap),%r0 # p.x >> 4 -> r0 (half word address) ! 14: MOVH 10(%ap),%r1 # p.y -> r1 ! 15: MULW2 &50,%r1 # p.y * 50 = # of words from base of display ! 16: # to start of scan line ! 17: ADDW2 %r1,%r0 # x + y ! 18: ADDW2 %r0,%r0 # convert words to bytes ! 19: ADDW2 0(%r2),%r0 # add in the base of display for address of dest ! 20: MOVW 4(%ap),%r1 # start of cursor to move ! 21: ANDH3 &31,8(%ap),%r2 # need the shift distance ! 22: SUBW2 %r7,%r2 # r2 - 16 ! 23: BEB CB_ALIGNED # No shift at all, will we be quick ! 24: MOVW &0xFFFF0000,%r6 # load a mask needed in loop ! 25: BITB &2,%r0 # if set, we are dest straddling ! 26: BNEB CB_DEST_ST ! 27: .align 4 ! 28: CB_NO_STRADDLE: # just rotate the 16 bits, other bits are 0's ! 29: ROTW %r2,{uhalf}0(%r1),%r8 ! 30: XORW2 %r8,0(%r0) # and store ! 31: ADDW2 &100,%r0 # next scanline 100bytes=display width=800 bits ! 32: ADDW2 &2,%r1 ! 33: DECW %r7 # for count of 16 ! 34: BNEB CB_NO_STRADDLE ! 35: RESTORE %r6 ! 36: RET ! 37: .align 4 ! 38: CB_ALIGNED: # no shift, so just xor mem to mem.. ! 39: XORH2 0(%r1),0(%r0) # and store ! 40: ADDW2 &100,%r0 # next scanline 100bytes=display width=800 bits ! 41: ADDW2 &2,%r1 ! 42: DECW %r7 # for count of 16 ! 43: BNEB CB_ALIGNED ! 44: RESTORE %r6 ! 45: RET ! 46: .align 4 ! 47: CB_DEST_ST: # we straddle, so rotw the halfword... ! 48: ROTW %r2,{uhalf}0(%r1),%r8 ! 49: XORH2 %r8,0(%r0) # xor the left half of the straddling dest ! 50: ANDW2 %r6,%r8 # now mask out what you just wrote & ! 51: XORW2 %r8,2(%r0) # xor the right half as a full word (faster) ! 52: ADDW2 &2,%r1 ! 53: ADDW2 &100,%r0 # next scanline 100bytes=display width=800 bits ! 54: DECW %r7 ! 55: BNEB CB_DEST_ST ! 56: RESTORE %r6 ! 57: RET
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.