1 | #
|
---|
2 | ! This file contains two specialized assembly code routines to update the
|
---|
3 | ! video memory. The routines can copy from user to video memory, or from
|
---|
4 | ! video to video memory.
|
---|
5 |
|
---|
6 | ! sections
|
---|
7 |
|
---|
8 | .sect .text; .sect .rom; .sect .data; .sect .bss
|
---|
9 |
|
---|
10 | ! exported functions
|
---|
11 |
|
---|
12 | .define _mem_vid_copy ! copy data to video ram
|
---|
13 | .define _vid_vid_copy ! move data in video ram
|
---|
14 |
|
---|
15 | ! The routines only guarantee to preserve the registers the C compiler
|
---|
16 | ! expects to be preserved (ebx, esi, edi, ebp, esp, segment registers, and
|
---|
17 | ! direction bit in the flags).
|
---|
18 |
|
---|
19 | .sect .text
|
---|
20 | !*===========================================================================*
|
---|
21 | !* mem_vid_copy *
|
---|
22 | !*===========================================================================*
|
---|
23 | ! PUBLIC void mem_vid_copy(u16 *src, unsigned dst, unsigned count);
|
---|
24 | !
|
---|
25 | ! Copy count characters from kernel memory to video memory. Src is an ordinary
|
---|
26 | ! pointer to a word, but dst and count are character (word) based video offset
|
---|
27 | ! and count. If src is null then screen memory is blanked by filling it with
|
---|
28 | ! blank_color.
|
---|
29 |
|
---|
30 | _mem_vid_copy:
|
---|
31 | push ebp
|
---|
32 | mov ebp, esp
|
---|
33 | push esi
|
---|
34 | push edi
|
---|
35 | push es
|
---|
36 | mov esi, 8(ebp) ! source
|
---|
37 | mov edi, 12(ebp) ! destination
|
---|
38 | mov edx, 16(ebp) ! count
|
---|
39 | mov es, (_vid_seg) ! segment containing video memory
|
---|
40 | cld ! make sure direction is up
|
---|
41 | mvc_loop:
|
---|
42 | and edi, (_vid_mask) ! wrap address
|
---|
43 | mov ecx, edx ! one chunk to copy
|
---|
44 | mov eax, (_vid_size)
|
---|
45 | sub eax, edi
|
---|
46 | cmp ecx, eax
|
---|
47 | jbe 0f
|
---|
48 | mov ecx, eax ! ecx = min(ecx, vid_size - edi)
|
---|
49 | 0: sub edx, ecx ! count -= ecx
|
---|
50 | shl edi, 1 ! byte address
|
---|
51 | add edi, (_vid_off) ! in video memory
|
---|
52 | test esi, esi ! source == 0 means blank the screen
|
---|
53 | jz mvc_blank
|
---|
54 | mvc_copy:
|
---|
55 | rep ! copy words to video memory
|
---|
56 | o16 movs
|
---|
57 | jmp mvc_test
|
---|
58 | mvc_blank:
|
---|
59 | mov eax, (_blank_color) ! ax = blanking character
|
---|
60 | rep
|
---|
61 | o16 stos ! copy blanks to video memory
|
---|
62 | !jmp mvc_test
|
---|
63 | mvc_test:
|
---|
64 | sub edi, (_vid_off)
|
---|
65 | shr edi, 1 ! back to a word address
|
---|
66 | test edx, edx
|
---|
67 | jnz mvc_loop
|
---|
68 | mvc_done:
|
---|
69 | pop es
|
---|
70 | pop edi
|
---|
71 | pop esi
|
---|
72 | pop ebp
|
---|
73 | ret
|
---|
74 |
|
---|
75 |
|
---|
76 | !*===========================================================================*
|
---|
77 | !* vid_vid_copy *
|
---|
78 | !*===========================================================================*
|
---|
79 | ! PUBLIC void vid_vid_copy(unsigned src, unsigned dst, unsigned count);
|
---|
80 | !
|
---|
81 | ! Copy count characters from video memory to video memory. Handle overlap.
|
---|
82 | ! Used for scrolling, line or character insertion and deletion. Src, dst
|
---|
83 | ! and count are character (word) based video offsets and count.
|
---|
84 |
|
---|
85 | _vid_vid_copy:
|
---|
86 | push ebp
|
---|
87 | mov ebp, esp
|
---|
88 | push esi
|
---|
89 | push edi
|
---|
90 | push es
|
---|
91 | mov esi, 8(ebp) ! source
|
---|
92 | mov edi, 12(ebp) ! destination
|
---|
93 | mov edx, 16(ebp) ! count
|
---|
94 | mov es, (_vid_seg) ! segment containing video memory
|
---|
95 | cmp esi, edi ! copy up or down?
|
---|
96 | jb vvc_down
|
---|
97 | vvc_up:
|
---|
98 | cld ! direction is up
|
---|
99 | vvc_uploop:
|
---|
100 | and esi, (_vid_mask) ! wrap addresses
|
---|
101 | and edi, (_vid_mask)
|
---|
102 | mov ecx, edx ! one chunk to copy
|
---|
103 | mov eax, (_vid_size)
|
---|
104 | sub eax, esi
|
---|
105 | cmp ecx, eax
|
---|
106 | jbe 0f
|
---|
107 | mov ecx, eax ! ecx = min(ecx, vid_size - esi)
|
---|
108 | 0: mov eax, (_vid_size)
|
---|
109 | sub eax, edi
|
---|
110 | cmp ecx, eax
|
---|
111 | jbe 0f
|
---|
112 | mov ecx, eax ! ecx = min(ecx, vid_size - edi)
|
---|
113 | 0: sub edx, ecx ! count -= ecx
|
---|
114 | call vvc_copy ! copy video words
|
---|
115 | test edx, edx
|
---|
116 | jnz vvc_uploop ! again?
|
---|
117 | jmp vvc_done
|
---|
118 | vvc_down:
|
---|
119 | std ! direction is down
|
---|
120 | lea esi, -1(esi)(edx*1) ! start copying at the top
|
---|
121 | lea edi, -1(edi)(edx*1)
|
---|
122 | vvc_downloop:
|
---|
123 | and esi, (_vid_mask) ! wrap addresses
|
---|
124 | and edi, (_vid_mask)
|
---|
125 | mov ecx, edx ! one chunk to copy
|
---|
126 | lea eax, 1(esi)
|
---|
127 | cmp ecx, eax
|
---|
128 | jbe 0f
|
---|
129 | mov ecx, eax ! ecx = min(ecx, esi + 1)
|
---|
130 | 0: lea eax, 1(edi)
|
---|
131 | cmp ecx, eax
|
---|
132 | jbe 0f
|
---|
133 | mov ecx, eax ! ecx = min(ecx, edi + 1)
|
---|
134 | 0: sub edx, ecx ! count -= ecx
|
---|
135 | call vvc_copy
|
---|
136 | test edx, edx
|
---|
137 | jnz vvc_downloop ! again?
|
---|
138 | cld ! C compiler expects up
|
---|
139 | !jmp vvc_done
|
---|
140 | vvc_done:
|
---|
141 | pop es
|
---|
142 | pop edi
|
---|
143 | pop esi
|
---|
144 | pop ebp
|
---|
145 | ret
|
---|
146 |
|
---|
147 | ! Copy video words. (Inner code of both the up and downcopying loop.)
|
---|
148 | vvc_copy:
|
---|
149 | shl esi, 1
|
---|
150 | shl edi, 1 ! byte addresses
|
---|
151 | add esi, (_vid_off)
|
---|
152 | add edi, (_vid_off) ! in video memory
|
---|
153 | rep
|
---|
154 | eseg o16 movs ! copy video words
|
---|
155 | sub esi, (_vid_off)
|
---|
156 | sub edi, (_vid_off)
|
---|
157 | shr esi, 1
|
---|
158 | shr edi, 1 ! back to word addresses
|
---|
159 | ret
|
---|
160 |
|
---|