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