|
|
1.1 root 1: //
2: // d_copy.s
3: // x86 assembly-language screen copying code.
4: //
5:
6: #include "asm_i386.h"
7: #include "quakeasm.h"
8: #include "asm_draw.h"
9:
10: .data
11:
12: LCopyWidth: .long 0
13: LBlockSrcStep: .long 0
14: LBlockDestStep: .long 0
15: LSrcDelta: .long 0
16: LDestDelta: .long 0
17:
18: #define bufptr 4+16
19:
20: // copies 16 rows per plane at a pop; idea is that 16*512 = 8k, and since
21: // no Mode X mode is wider than 360, all the data should fit in the cache for
22: // the passes for the next 3 planes
23:
24: .text
25:
26: .globl C(VGA_UpdatePlanarScreen)
27: C(VGA_UpdatePlanarScreen):
28: pushl %ebp // preserve caller's stack frame
29: pushl %edi
30: pushl %esi // preserve register variables
31: pushl %ebx
32:
33: movl C(VGA_bufferrowbytes),%eax
34: shll $1,%eax
35: movl %eax,LBlockSrcStep
36: movl C(VGA_rowbytes),%eax
37: shll $1,%eax
38: movl %eax,LBlockDestStep
39:
40: movl $0x3C4,%edx
41: movl $2,%al
42: outb %al,%dx // point the SC to the Map Mask
43: incl %edx
44:
45: movl bufptr(%esp),%esi
46: movl C(VGA_pagebase),%edi
47: movl C(VGA_height),%ebp
48: shrl $1,%ebp
49:
50: movl C(VGA_width),%ecx
51: movl C(VGA_bufferrowbytes),%eax
52: subl %ecx,%eax
53: movl %eax,LSrcDelta
54: movl C(VGA_rowbytes),%eax
55: shll $2,%eax
56: subl %ecx,%eax
57: movl %eax,LDestDelta
58: shrl $4,%ecx
59: movl %ecx,LCopyWidth
60:
61: LRowLoop:
62: movb $1,%al
63:
64: LPlaneLoop:
65: outb %al,%dx
66: movb $2,%ah
67:
68: pushl %esi
69: pushl %edi
70: LRowSetLoop:
71: movl LCopyWidth,%ecx
72: LColumnLoop:
73: movb 12(%esi),%bh
74: movb 8(%esi),%bl
75: shll $16,%ebx
76: movb 4(%esi),%bh
77: movb (%esi),%bl
78: movl %ebx,(%edi)
79: addl $16,%esi
80: addl $4,%edi
81: decl %ecx
82: jnz LColumnLoop
83:
84: addl LDestDelta,%edi
85: addl LSrcDelta,%esi
86: decb %ah
87: jnz LRowSetLoop
88:
89: popl %edi
90: popl %esi
91: incl %esi
92:
93: shlb $1,%al
94: cmpb $16,%al
95: jnz LPlaneLoop
96:
97: subl $4,%esi
98: addl LBlockSrcStep,%esi
99: addl LBlockDestStep,%edi
100: decl %ebp
101: jnz LRowLoop
102:
103: popl %ebx // restore register variables
104: popl %esi
105: popl %edi
106: popl %ebp // restore the caller's stack frame
107:
108: ret
109:
110:
111: #define srcptr 4+16
112: #define destptr 8+16
113: #define width 12+16
114: #define height 16+16
115: #define srcrowbytes 20+16
116: #define destrowbytes 24+16
117:
118: .globl C(VGA_UpdateLinearScreen)
119: C(VGA_UpdateLinearScreen):
120: pushl %ebp // preserve caller's stack frame
121: pushl %edi
122: pushl %esi // preserve register variables
123: pushl %ebx
124:
125: cld
126: movl srcptr(%esp),%esi
127: movl destptr(%esp),%edi
128: movl width(%esp),%ebx
129: movl srcrowbytes(%esp),%eax
130: subl %ebx,%eax
131: movl destrowbytes(%esp),%edx
132: subl %ebx,%edx
133: shrl $2,%ebx
134: movl height(%esp),%ebp
135: LLRowLoop:
136: movl %ebx,%ecx
137: rep/movsl (%esi),(%edi)
138: addl %eax,%esi
139: addl %edx,%edi
140: decl %ebp
141: jnz LLRowLoop
142:
143: popl %ebx // restore register variables
144: popl %esi
145: popl %edi
146: popl %ebp // restore the caller's stack frame
147:
148: ret
149:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.