|
|
1.1 ! root 1: // ! 2: // surf8.s ! 3: // x86 assembly-language 8 bpp surface block drawing code. ! 4: // ! 5: ! 6: #include "asm_i386.h" ! 7: #include "quakeasm.h" ! 8: #include "asm_draw.h" ! 9: ! 10: #if id386 ! 11: ! 12: //---------------------------------------------------------------------- ! 13: // Surface block drawer ! 14: //---------------------------------------------------------------------- ! 15: ! 16: .data ! 17: ! 18: k: .long 0 ! 19: loopentry: .long 0 ! 20: ! 21: .align 4 ! 22: blockjumptable16: ! 23: .long LEnter2_16 ! 24: .long LEnter4_16 ! 25: .long 0, LEnter8_16 ! 26: .long 0, 0, 0, LEnter16_16 ! 27: ! 28: ! 29: .text ! 30: ! 31: .align 4 ! 32: .globl C(R_Surf16Start) ! 33: C(R_Surf16Start): ! 34: ! 35: .align 4 ! 36: .globl C(R_DrawSurfaceBlock16) ! 37: C(R_DrawSurfaceBlock16): ! 38: pushl %ebp // preserve caller's stack frame ! 39: pushl %edi ! 40: pushl %esi // preserve register variables ! 41: pushl %ebx ! 42: ! 43: movl C(blocksize),%eax ! 44: movl C(prowdestbase),%edi ! 45: movl C(pbasesource),%esi ! 46: movl C(sourcesstep),%ebx ! 47: movl blockjumptable16-4(,%eax,2),%ecx ! 48: movl %eax,k ! 49: movl %ecx,loopentry ! 50: movl C(lightleft),%edx ! 51: movl C(lightright),%ebp ! 52: ! 53: Lblockloop16: ! 54: ! 55: subl %edx,%ebp ! 56: movb C(blockdivshift),%cl ! 57: sarl %cl,%ebp ! 58: jns Lp1_16 ! 59: testl C(blockdivmask),%ebp ! 60: jz Lp1_16 ! 61: incl %ebp ! 62: Lp1_16: ! 63: ! 64: subl %eax,%eax ! 65: subl %ecx,%ecx // high words must be 0 in loop for addressing ! 66: ! 67: jmp *loopentry ! 68: ! 69: .align 4 ! 70: ! 71: #include "block16.h" ! 72: ! 73: movl C(pbasesource),%esi ! 74: movl C(lightleft),%edx ! 75: movl C(lightright),%ebp ! 76: movl C(sourcetstep),%eax ! 77: movl C(lightrightstep),%ecx ! 78: movl C(prowdestbase),%edi ! 79: ! 80: addl %eax,%esi ! 81: addl %ecx,%ebp ! 82: ! 83: movl C(lightleftstep),%eax ! 84: movl C(surfrowbytes),%ecx ! 85: ! 86: addl %eax,%edx ! 87: addl %ecx,%edi ! 88: ! 89: movl %esi,C(pbasesource) ! 90: movl %ebp,C(lightright) ! 91: movl k,%eax ! 92: movl %edx,C(lightleft) ! 93: decl %eax ! 94: movl %edi,C(prowdestbase) ! 95: movl %eax,k ! 96: jnz Lblockloop16 ! 97: ! 98: popl %ebx // restore register variables ! 99: popl %esi ! 100: popl %edi ! 101: popl %ebp // restore the caller's stack frame ! 102: ret ! 103: ! 104: .globl C(R_Surf16End) ! 105: C(R_Surf16End): ! 106: ! 107: //---------------------------------------------------------------------- ! 108: // Code patching routines ! 109: //---------------------------------------------------------------------- ! 110: .data ! 111: ! 112: .align 4 ! 113: LPatchTable16: ! 114: .long LBPatch0 - 4 ! 115: .long LBPatch1 - 4 ! 116: .long LBPatch2 - 4 ! 117: .long LBPatch3 - 4 ! 118: .long LBPatch4 - 4 ! 119: .long LBPatch5 - 4 ! 120: .long LBPatch6 - 4 ! 121: .long LBPatch7 - 4 ! 122: .long LBPatch8 - 4 ! 123: .long LBPatch9 - 4 ! 124: .long LBPatch10 - 4 ! 125: .long LBPatch11 - 4 ! 126: .long LBPatch12 - 4 ! 127: .long LBPatch13 - 4 ! 128: .long LBPatch14 - 4 ! 129: .long LBPatch15 - 4 ! 130: ! 131: .align 4 ! 132: .globl C(R_Surf16Patch) ! 133: C(R_Surf16Patch): ! 134: pushl %ebx ! 135: ! 136: movl C(colormap),%eax ! 137: movl $LPatchTable16,%ebx ! 138: movl $16,%ecx ! 139: LPatchLoop16: ! 140: movl (%ebx),%edx ! 141: addl $4,%ebx ! 142: movl %eax,(%edx) ! 143: decl %ecx ! 144: jnz LPatchLoop16 ! 145: ! 146: popl %ebx ! 147: ! 148: ret ! 149: ! 150: ! 151: #endif // id386
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.