Rev 2322 | Rev 2470 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2322 | Rev 2461 | ||
---|---|---|---|
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
7 | 7 | ||
8 | $Revision: 2322 $ |
8 | $Revision: 2461 $ |
9 | 9 | ||
10 | ; // Alver 22.06.2008 // { |
10 | ; // Alver 22.06.2008 // { |
11 | align 4 |
11 | align 4 |
12 | dtext_asciiz_esi: ; for skins title out |
12 | dtext_asciiz_esi: ; for skins title out |
13 | push eax |
13 | push eax |
14 | xor eax, eax |
14 | xor eax, eax |
15 | inc eax |
15 | inc eax |
16 | jmp dtext.1 |
16 | jmp dtext.1 |
17 | ; } \\ Alver \\ |
17 | ; } \\ Alver \\ |
18 | 18 | ||
19 | align 4 |
19 | align 4 |
20 | dtext: ; Text String Output (rw by Johnny_B[john@kolibrios.org]) |
20 | dtext: ; Text String Output (rw by Johnny_B[john@kolibrios.org]) |
21 | ; ebx x & y |
21 | ; ebx x & y |
22 | ; ecx style ( 0xX0000000 ) & color ( 0x00RRGGBB ) |
22 | ; ecx style ( 0xX0000000 ) & color ( 0x00RRGGBB ) |
23 | ; X = ABnnb: |
23 | ; X = ABnnb: |
24 | ; nn = font |
24 | ; nn = font |
25 | ; A = 0 <=> output esi characters; otherwise output ASCIIZ string |
25 | ; A = 0 <=> output esi characters; otherwise output ASCIIZ string |
26 | ; B = 1 <=> fill background with color eax |
26 | ; B = 1 <=> fill background with color eax |
27 | ; edx start of text |
27 | ; edx start of text |
28 | ; edi 1 force |
28 | ; edi 1 force |
29 | 29 | ||
30 | ; // Alver 22.06.2008 // { |
30 | ; // Alver 22.06.2008 // { |
31 | push eax |
31 | push eax |
32 | xor eax, eax |
32 | xor eax, eax |
33 | .1: |
33 | .1: |
34 | ; } \\ Alver \\ |
34 | ; } \\ Alver \\ |
35 | pushad |
35 | pushad |
36 | call [_display.disable_mouse] |
36 | call [_display.disable_mouse] |
37 | 37 | ||
38 | movsx eax, bx ; eax=y |
38 | movsx eax, bx ; eax=y |
39 | sar ebx, 16 ; ebx=x |
39 | sar ebx, 16 ; ebx=x |
40 | xchg eax, ebx ; eax=x, ebx=y |
40 | xchg eax, ebx ; eax=x, ebx=y |
41 | cmp esi, 255 |
41 | cmp esi, 255 |
42 | jb .loop |
42 | jb .loop |
43 | mov esi, 255 |
43 | mov esi, 255 |
44 | .loop: |
44 | .loop: |
45 | test ecx, ecx |
45 | test ecx, ecx |
46 | js .test_asciiz |
46 | js .test_asciiz |
47 | dec esi |
47 | dec esi |
48 | js .end |
48 | js .end |
49 | jmp @f |
49 | jmp @f |
50 | .test_asciiz: |
50 | .test_asciiz: |
51 | cmp byte [edx], 0 |
51 | cmp byte [edx], 0 |
52 | jz .end |
52 | jz .end |
53 | ; // Alver 22.06.2008 // { |
53 | ; // Alver 22.06.2008 // { |
54 | cmp byte [esp+28], 1 ; was the entry point = dtext.1 ? |
54 | cmp byte [esp+28], 1 ; was the entry point = dtext.1 ? |
55 | jne @f |
55 | jne @f |
56 | dec esi |
56 | dec esi |
57 | js .end |
57 | js .end |
58 | ; } \\ Alver \\ |
58 | ; } \\ Alver \\ |
59 | @@: |
59 | @@: |
60 | inc edx |
60 | inc edx |
61 | pushad ; esp -= 64 ! |
61 | pushad ; esp -= 64 ! |
62 | movzx edx, byte [edx-1] |
62 | movzx edx, byte [edx-1] |
63 | test ecx, 0x10000000 |
63 | test ecx, 0x10000000 |
64 | jnz .font2 |
64 | jnz .font2 |
65 | mov esi, 9 |
65 | mov esi, 9 |
66 | lea ebp, [FONT_I+8*edx+edx] |
66 | lea ebp, [FONT_I+8*edx+edx] |
67 | .symloop1: |
67 | .symloop1: |
68 | mov dl, byte [ebp] |
68 | mov dl, byte [ebp] |
69 | or dl, 1 shl 6 |
69 | or dl, 1 shl 6 |
70 | .pixloop1: |
70 | .pixloop1: |
71 | shr dl, 1 |
71 | shr dl, 1 |
72 | jz .pixloop1end |
72 | jz .pixloop1end |
73 | jnc .nopix |
73 | jnc .nopix |
74 | call [putpixel] |
74 | call [putpixel] |
75 | jmp .pixloop1cont |
75 | jmp .pixloop1cont |
76 | .nopix: |
76 | .nopix: |
77 | test ecx, 0x40000000 |
77 | test ecx, 0x40000000 |
78 | jz .pixloop1cont |
78 | jz .pixloop1cont |
79 | push ecx |
79 | push ecx |
80 | mov ecx, [esp+4+20h+20h] ; original eax? |
80 | mov ecx, [esp+4+20h+20h] ; original eax? |
81 | call [putpixel] |
81 | call [putpixel] |
82 | pop ecx |
82 | pop ecx |
83 | .pixloop1cont: |
83 | .pixloop1cont: |
84 | inc eax |
84 | inc eax |
85 | jmp .pixloop1 |
85 | jmp .pixloop1 |
86 | .pixloop1end: |
86 | .pixloop1end: |
87 | sub eax, 6 |
87 | sub eax, 6 |
88 | inc ebx |
88 | inc ebx |
89 | inc ebp |
89 | inc ebp |
90 | dec esi |
90 | dec esi |
91 | jnz .symloop1 |
91 | jnz .symloop1 |
92 | popad |
92 | popad |
93 | add eax, 6 |
93 | add eax, 6 |
94 | jmp .loop |
94 | jmp .loop |
95 | .font2: |
95 | .font2: |
96 | add edx, edx |
96 | add edx, edx |
97 | lea ebp, [FONT_II+4*edx+edx+1] |
97 | lea ebp, [FONT_II+4*edx+edx+1] |
98 | push 9 |
98 | push 9 |
99 | movzx esi, byte [ebp-1] |
99 | movzx esi, byte [ebp-1] |
100 | .symloop2: |
100 | .symloop2: |
101 | mov dl, byte [ebp] |
101 | mov dl, byte [ebp] |
102 | push esi |
102 | push esi |
103 | .pixloop2: |
103 | .pixloop2: |
104 | shr dl, 1 |
104 | shr dl, 1 |
105 | jnc .nopix2 |
105 | jnc .nopix2 |
106 | call [putpixel] |
106 | call [putpixel] |
107 | jmp .pixloop2cont |
107 | jmp .pixloop2cont |
108 | .nopix2: |
108 | .nopix2: |
109 | test ecx, 0x40000000 |
109 | test ecx, 0x40000000 |
110 | jz .pixloop2cont |
110 | jz .pixloop2cont |
111 | push ecx |
111 | push ecx |
112 | mov ecx, [esp+12+20h+20h] |
112 | mov ecx, [esp+12+20h+20h] |
113 | call [putpixel] |
113 | call [putpixel] |
114 | pop ecx |
114 | pop ecx |
115 | .pixloop2cont: |
115 | .pixloop2cont: |
116 | inc eax |
116 | inc eax |
117 | dec esi |
117 | dec esi |
118 | jnz .pixloop2 |
118 | jnz .pixloop2 |
119 | pop esi |
119 | pop esi |
120 | sub eax, esi |
120 | sub eax, esi |
121 | inc ebx |
121 | inc ebx |
122 | inc ebp |
122 | inc ebp |
123 | dec dword [esp] |
123 | dec dword [esp] |
124 | jnz .symloop2 |
124 | jnz .symloop2 |
125 | pop eax |
125 | pop eax |
126 | add dword [esp+28], esi |
126 | add dword [esp+28], esi |
127 | popad |
127 | popad |
128 | jmp .loop |
128 | jmp .loop |
129 | .end: |
129 | .end: |
130 | popad |
130 | popad |
131 | pop eax ; << // Alver 22.06.2008 // << |
131 | pop eax ; << // Alver 22.06.2008 // << |
132 | ret |
132 | ret |
133 | 133 | ||
134 | diff10 "old font code size",dtext,$ |
134 | diff10 "old font code size",dtext,$ |
135 | 135 | ||
136 | ;===================================================== |
136 | ;===================================================== |
137 | ; NEW FONTS |
137 | ; NEW FONTS |
138 | ;_____________________________________________________ |
138 | ;_____________________________________________________ |
139 | ; |
139 | ; |
140 | 140 | ||
141 | align 8 |
141 | align 8 |
142 | sdsh_data: |
142 | sdsh_data: |
- | 143 | ||
- | 144 | diff16 "sdsh_data : ",0,$ |
|
143 | 145 | ||
144 | include 'fonts/sd_data.asm' |
146 | include 'fonts/sd_data.asm' |
145 | 147 | ||
146 | sdsh_code: |
148 | sdsh_code: |
147 | 149 | ||
148 | ; eax = if (bit[31]) |
150 | ; eax = if (bit[31]) |
149 | ; then lower 31 bits points to the user-selected font |
151 | ; then lower 31 bits points to the user-selected font |
150 | ; else ax = number of preloaded system font |
152 | ; else ax = number of preloaded system font |
151 | ; ebx = x<<16 + y |
153 | ; ebx = x<<16 + y |
152 | ; ecx = 0x00RRGGBB |
154 | ; ecx = 0x00RRGGBB |
153 | ; edx = if (bits[31:8] == 0) |
155 | ; edx = if (bits[31:8] == 0) |
154 | ; then dl = single char to write |
156 | ; then dl = single char to write |
- | 157 | ; else edx= pointer to asciiz-string |
|
- | 158 | ||
155 | ; else edx= pointer to asciiz-string |
159 | diff16 "draw_char : ",0,$ |
156 | 160 | ||
157 | draw_char: |
161 | draw_char: |
158 | ; font test |
162 | ; font test |
159 | ; bl=y; bh=x |
163 | ; bl=y; bh=x |
160 | ; dl=ascii |
164 | ; dl=ascii |
161 | movzx eax, bh |
165 | movzx eax, bh |
162 | movzx ebx, bl |
166 | movzx ebx, bl |
163 | movzx ecx, dl |
167 | movzx ecx, dl |
164 | xor edi, edi |
168 | xor edi, edi |
165 | mov ebp, edi |
169 | mov ebp, edi |
- | 170 | ||
166 | 171 | ||
167 | sdsh_draw_char: |
172 | sdsh_draw_char: |
168 | ; eax = left side X |
173 | ; eax = left side X |
169 | ; ebx = bottom Y |
174 | ; ebx = bottom Y |
170 | ; edi = color 0x0RRGGBB |
175 | ; edi = color 0x0RRGGBB |
171 | ; ebp = font@ |
176 | ; ebp = font@ |
172 | ; ecx = ascii, zero-extended to 32bits |
177 | ; ecx = ascii, zero-extended to 32bits |
173 | push ecx |
178 | push ecx |
174 | push edx |
179 | push edx |
175 | push ebp |
180 | push ebp |
176 | shl ebp, 4 |
181 | shl ebp, 4 |
177 | add ebp, sdsh_data.info |
182 | add ebp, sdsh_data.info |
178 | call ch_checkscreen |
183 | ; call ch_checkscreen |
179 | jb .exit |
184 | ; jb .exit |
180 | call ch_checkwin |
185 | ; call ch_checkwin |
181 | jc .exit |
186 | ; jc .exit |
182 | xor ch, ch |
- | |
183 | mov edx, [ebp + 4] ; chartable addr |
187 | mov edx, [ebp + 4] ; chartable addr |
184 | mov cx, word[edx + ecx*2] ; tick info |
188 | mov cx, word[edx + ecx*2] ; tick info |
185 | mov edx, ecx |
189 | mov edx, ecx |
186 | and ecx, 7 ; cl = number of ticks |
190 | and ecx, 7 ; cl = number of ticks |
187 | jz .blank |
191 | jz .blank |
188 | shr edx, 4 ; offset in the chartable |
192 | shr edx, 4 ; offset in the chartable |
189 | add edx, [sdsh_data.chars] ; edx -> the char's ticklist |
193 | add edx, sdsh_data.chars ; edx -> the char's ticklist |
190 | .next_tick: |
194 | .next_tick: |
191 | call parse_tick |
195 | call parse_tick |
192 | add edx, 4 |
196 | add edx, 2 |
193 | dec cl |
197 | dec cl |
194 | jnz .next_tick |
198 | jnz .next_tick |
195 | .blank: |
199 | .blank: |
196 | .exit: |
200 | .exit: |
197 | pop ebp |
201 | pop ebp |
198 | pop edx |
202 | pop edx |
199 | pop ecx |
203 | pop ecx |
200 | ret |
204 | ret |
201 | 205 | ||
202 | 206 | ||
203 | parse_tick: |
207 | parse_tick: |
- | 208 | diff16 "parse_tick : ",0,$ |
|
204 | ; eax = left side X |
209 | ; eax = left side X |
205 | ; ebx = bottom Y |
210 | ; ebx = bottom Y |
206 | ; edx ->tickinfo |
211 | ; edx ->tickinfo |
207 | ; edi = color 0x0RRGGBB |
212 | ; edi = color 0x0RRGGBB |
208 | ; ebp = font's header |
213 | ; ebp = font's header |
209 | pushad |
214 | pushad |
210 | xor ecx, ecx |
215 | xor ecx, ecx |
211 | mov dx, word[edx] |
216 | mov dx, word[edx] |
212 | mov cl, dl |
217 | mov cl, dl |
213 | test dl, 0xE0 ; ticks #32..255 |
218 | test dl, 0xE0 ; ticks #32..255 |
214 | jz .lntick.short |
219 | jz .lntick.short |
215 | cmp dl, 0xE0 |
220 | cmp dl, 0xE0 |
216 | jae .lntick.long |
221 | jae .lntick.long |
217 | cmp dl, 0xC0 |
222 | cmp dl, 0xC0 |
218 | jae .cstick |
223 | jae .cstick |
219 | .gptick: |
224 | .gptick: |
220 | push edx |
225 | push edx |
221 | mov cl, dh |
226 | mov cl, dh |
222 | shr cl, 3 ; orig.# |
227 | shr cl, 3 ; orig.# |
223 | mov edx, [ebp+8] ; orig. table |
228 | mov edx, [ebp+8] ; orig. table |
224 | mov ch, byte[edx+ecx] ; orig. coords |
229 | mov ch, byte[edx+ecx] ; orig. coords |
225 | pop edx |
230 | pop edx |
226 | mov cl, dh |
231 | mov cl, dh |
227 | and cl, 7 ; three rotation bits |
232 | and cl, 7 ; three rotation bits |
228 | and edx, 0xFF ; dl = gptick# |
233 | and edx, 0xFF ; dl = gptick# |
229 | sub dl, 32 |
234 | sub dl, 32 |
230 | cmp dl, (sdsh_data.v5-sdsh_data.v1) |
235 | cmp dl, (sdsh_data.v5-sdsh_data.v1) |
231 | jae .gptick.2 |
236 | jae .gptick.2 |
232 | .gptick.1: |
237 | .gptick.1: |
233 | mov esi, sdsh_data.tick_table |
238 | mov esi, sdsh_data.tick_table |
234 | add esi, edx ; 1-byte tickgroups .v1-v4: |
239 | add esi, edx ; 1-byte tickgroups .v1-v4: |
235 | inc dh |
240 | inc dh |
236 | sub dl, 2 ; .v1 : 2 ticks only (#32, 33) |
241 | sub dl, 2 ; .v1 : 2 ticks only (#32, 33) |
237 | jae @f |
242 | jae @f |
238 | mov dl, dh |
243 | mov dl, dh |
239 | jmp .gptick.done |
244 | jmp .gptick.done |
240 | @@: inc dh |
245 | @@: inc dh |
241 | shr dl, 3 ; tickgroups .v2-v4 : 8 ticks each |
246 | shr dl, 3 ; tickgroups .v2-v4 : 8 ticks each |
242 | add dl, dh |
247 | add dl, dh |
243 | jmp .gptick.done |
248 | jmp .gptick.done |
244 | .gptick.2: |
249 | .gptick.2: |
245 | sub dl, (sdsh_data.v5-sdsh_data.v1) |
250 | sub dl, (sdsh_data.v5-sdsh_data.v1) |
246 | cmp dl, (sdsh_data.v9-sdsh_data.v5) |
251 | cmp dl, (sdsh_data.v9-sdsh_data.v5) |
247 | jae .gptick.3 |
252 | jae .gptick.3 |
248 | mov esi, sdsh_data.v5 |
253 | mov esi, sdsh_data.v5 |
249 | lea esi, [esi+edx*2] ; 2-byte tickgroups .v5-v8: 8 ticks each |
254 | lea esi, [esi+edx*2] ; 2-byte tickgroups .v5-v8: 8 ticks each |
250 | mov dh, 5 |
255 | mov dh, 5 |
251 | shr dl, 3 |
256 | shr dl, 3 |
252 | add dl, dh |
257 | add dl, dh |
253 | jmp .gptick.done |
258 | jmp .gptick.done |
254 | .gptick.3: |
259 | .gptick.3: |
255 | sub dl, (sdsh_data.v9-sdsh_data.v5) |
260 | sub dl, (sdsh_data.v9-sdsh_data.v5) |
256 | cmp dl, (sdsh_data.v13-sdsh_data.v9) |
261 | cmp dl, (sdsh_data.v13-sdsh_data.v9) |
257 | jae .gptick.4 |
262 | jae .gptick.4 |
258 | mov esi, sdsh_data.v9 |
263 | mov esi, sdsh_data.v9 |
259 | lea esi,[esi+edx*2] |
264 | lea esi,[esi+edx*2] |
260 | add esi, edx ; 3-byte tickgroups .v9-12: 4 ticks each |
265 | add esi, edx ; 3-byte tickgroups .v9-12: 4 ticks each |
261 | mov dh, 9 |
266 | mov dh, 9 |
262 | shr dl, 2 |
267 | shr dl, 2 |
263 | add dl, dh |
268 | add dl, dh |
264 | jmp .gptick.done |
269 | jmp .gptick.done |
265 | .gptick.4: |
270 | .gptick.4: |
266 | sub dl, (sdsh_data.v13-sdsh_data.v9) |
271 | sub dl, (sdsh_data.v13-sdsh_data.v9) |
267 | cmp dl, 16 |
272 | cmp dl, 16 |
268 | jae .exit |
273 | jae .exit |
269 | mov esi, sdsh_data.v13 |
274 | mov esi, sdsh_data.v13 |
270 | lea esi,[esi+edx*4] ; 4-byte tickgroups .v13-16: 4 ticks each |
275 | lea esi,[esi+edx*4] ; 4-byte tickgroups .v13-16: 4 ticks each |
271 | mov dh, 13 |
276 | mov dh, 13 |
272 | shr dl, 2 |
277 | shr dl, 2 |
273 | add dl, dh |
278 | add dl, dh |
274 | .gptick.done: |
279 | .gptick.done: |
275 | mov dh, ch ; dh = orig.XY; dl = numvert |
280 | mov dh, ch ; dh = orig.XY; dl = numvert |
276 | jmp .draw ; cl = rotation |
281 | jmp .draw ; cl = rotation |
277 | 282 | ||
278 | .cstick: |
283 | .cstick: |
279 | and cl, 4 |
284 | and cl, 4 |
280 | shr cl, 2 ; only one rotational bit |
285 | shr cl, 2 ; only one rotational bit |
281 | and dl, 3 |
286 | and dl, 3 |
282 | inc dl |
287 | inc dl |
283 | dec dl |
288 | dec dl |
284 | jz .cstick.0 |
289 | jz .cstick.0 |
285 | dec dl |
290 | dec dl |
286 | jnz @f |
291 | jnz @f |
287 | mov dl, 6 |
292 | mov dl, 6 |
288 | jz .cstick.1 |
293 | jz .cstick.1 |
289 | @@: dec dl |
294 | @@: dec dl |
290 | jz .cstick.2 |
295 | jz .cstick.2 |
291 | .cstick.3: |
296 | .cstick.3: |
292 | mov esi, sdsh_data.cs3 ; 12pix-ring |
297 | mov esi, sdsh_data.cs3 ; 12pix-ring |
293 | mov dl, 10 |
298 | mov dl, 10 |
294 | jmp .draw |
299 | jmp .draw |
295 | .cstick.2: |
300 | .cstick.2: |
296 | mov dl, 7 |
301 | mov dl, 7 |
297 | .cstick.1: |
302 | .cstick.1: |
298 | mov esi, sdsh_data.cs2 ; the square |
303 | mov esi, sdsh_data.cs2 ; the square |
299 | jmp .draw |
304 | jmp .draw |
300 | .cstick.0: |
305 | .cstick.0: |
301 | mov esi, sdsh_data.cs0 ; 4pix-square |
306 | mov esi, sdsh_data.cs0 ; 4pix-square |
302 | mov dl, 3 |
307 | mov dl, 3 |
303 | jmp .draw |
308 | jmp .draw |
304 | 309 | ||
305 | .ritick: |
310 | .ritick: |
306 | test dl, 1 |
311 | test dl, 1 |
307 | jnz .ritick.1 |
312 | jnz .ritick.1 |
308 | .ritick.0: |
313 | .ritick.0: |
309 | mov cl, dh ; y |
314 | mov cl, dh ; y |
310 | and cl, 0x0F |
315 | and cl, 0x0F |
311 | sub ebx, ecx |
316 | sub ebx, ecx |
312 | mov cl, dh |
317 | mov cl, dh |
313 | shr cl, 4 ; x |
318 | shr cl, 4 ; x |
314 | add eax, ecx |
319 | add eax, ecx |
315 | call ch_putpixel |
320 | call ch_putpixel |
316 | jmp .exit |
321 | jmp .exit |
317 | .ritick.1: |
322 | .ritick.1: |
318 | mov esi, sdsh_data.ri1 ; 8pix-ring |
323 | mov esi, sdsh_data.ri1 ; 8pix-ring |
319 | mov dl, 4 |
324 | mov dl, 4 |
320 | xor cl, cl |
325 | xor cl, cl |
321 | jmp .draw |
326 | jmp .draw |
322 | 327 | ||
323 | .lntick.short: |
328 | .lntick.short: |
324 | test dl, 0x06 ; ticks #0, 1 are reserved for |
329 | test dl, 0x06 ; ticks #0, 1 are reserved for |
325 | jz .ritick ; rotational invariants |
330 | jz .ritick ; rotational invariants |
326 | and dl, 0x07 ; dl = line length |
331 | and dl, 0x07 ; dl = line length |
327 | jmp .lntick.both |
332 | jmp .lntick.both |
328 | .lntick.long: |
333 | .lntick.long: |
329 | and dl, 0x07 |
334 | and dl, 0x07 |
330 | add dl, 8 |
335 | add dl, 8 |
331 | .lntick.both: |
336 | .lntick.both: |
332 | sub dl, 2 ; num_vertice = num_points - 2 |
337 | sub dl, 2 ; num_vertice = num_points - 2 |
333 | and cl, 0x18 ; two rotation bits |
338 | and cl, 0x18 ; two (lower) rotation bits |
334 | shr cl, 3 |
339 | shr cl, 3 |
335 | mov esi, sdsh_data.blank |
340 | mov esi, sdsh_data.blank |
336 | .draw: |
341 | .draw: |
337 | ; cl = rot; dl = numvert; dh = orig.xy |
342 | ; cl = rot; dl = numvert; dh = orig.xy |
338 | push ecx |
343 | push ecx |
339 | mov cl, dh ; y |
344 | mov cl, dh ; y |
340 | and cl, 0x0F |
345 | and cl, 0x0F |
341 | sub ebx, ecx |
346 | sub ebx, ecx |
342 | mov cl, dh |
347 | mov cl, dh |
343 | shr cl, 4 ; x |
348 | shr cl, 4 ; x |
344 | add eax, ecx |
349 | add eax, ecx |
345 | pop ecx |
350 | pop ecx |
346 | call draw_tick |
351 | call draw_tick |
347 | .gptick.5: |
352 | .gptick.5: |
348 | .exit: |
353 | .exit: |
349 | popad |
354 | popad |
- | 355 | ret |
|
- | 356 | ||
- | 357 | ||
350 | ret |
- | |
351 | - | ||
352 | 358 | diff16 "draw_tick : ",0,$ |
|
353 | 359 | ||
354 | draw_tick: |
360 | draw_tick: |
355 | ; eax = x-origin |
361 | ; eax = x-origin |
356 | ; ebx = y-origin |
362 | ; ebx = y-origin |
357 | ; edi = 0x0RRGGBB |
363 | ; edi = 0x0RRGGBB |
358 | ; cl = direction (0..7) |
364 | ; cl = direction (0..7) |
359 | ; dl = number of vertices (dl) |
365 | ; dl = number of vertice (dl) |
360 | ; esi -> tick bitfield |
366 | ; esi -> tick bitfield |
361 | 367 | ||
362 | pushad |
- | |
363 | inc dl ; -- that's to count down to 0 |
368 | pushad |
364 | call ch_putpixel ; the point of origin |
369 | call ch_putpixel ; the point of origin |
- | 370 | and ecx, 7 |
|
365 | and ecx, 7 |
371 | lea ebp, [.move000+ ecx*4] |
366 | call [.moves + ecx*4] ; basic vector |
372 | call ebp ; basic vector |
367 | call ch_putpixel |
373 | call ch_putpixel |
368 | dec dl |
374 | and edx, 15 |
369 | jz .done ; 2pix lines only |
375 | jz .done ; no vertex (2pix line) |
370 | mov esi, dword [esi] ; max 16 vertice bitfield limit |
376 | mov esi, dword [esi] ; 15 vertice will easily fit to 1dw |
371 | xchg esi, edx |
377 | xchg esi, edx |
372 | .move_and_draw: |
378 | .move_and_draw: |
373 | mov ch, dl |
379 | mov ch, dl |
374 | and ch, 3 |
380 | and ch, 3 |
- | 381 | jz .moved |
|
- | 382 | dec ch |
|
375 | jz .moved |
383 | jz .1 |
376 | btc ecx, 8 |
384 | dec ch |
- | 385 | jz .2 |
|
- | 386 | .3: |
|
377 | jz .2 |
387 | dec cl |
378 | .1: |
- | |
379 | dec cl ; right turns (1 and 3) |
- | |
380 | and cl, 7 |
- | |
381 | @@: btc ecx, 9 ; straight angle (3) ? |
388 | .1: |
382 | jc .1 |
389 | dec cl |
383 | jmp .moved |
390 | jmp .wipe_it |
384 | .2: |
391 | .2: |
- | 392 | inc cl |
|
385 | inc cl ; left turn (2) |
393 | .wipe_it: |
386 | and cl, 7 |
- | |
387 | btc ecx, 9 ; just to zero ah |
394 | and ecx, 7 |
- | 395 | .moved: |
|
- | 396 | diff16 "moved : ",0,$ |
|
388 | .moved: |
397 | lea ebp, [.move000+ ecx*4] |
389 | call [.moves + ecx*4] ; go new way |
398 | call ebp ; go new way |
390 | call ch_putpixel |
399 | call ch_putpixel |
391 | shr edx, 2 |
400 | shr edx, 2 |
392 | dec esi |
401 | dec esi |
- | 402 | jnz .move_and_draw |
|
393 | jnz .move_and_draw |
403 | diff16 "done : ",0,$ |
394 | .done: |
404 | .done: |
395 | popad |
405 | popad |
396 | ret |
406 | ret |
- | 407 | ||
- | 408 | ; WARNING! The order matters! ------ |
|
- | 409 | align 4 |
|
397 | 410 | diff16 "move000 : ",0,$ |
|
398 | .move000: |
411 | .move000: |
399 | inc eax |
412 | inc eax |
400 | ret |
413 | ret |
- | 414 | align 4 |
|
401 | .move001: |
415 | .move001: |
402 | inc eax |
416 | inc eax |
403 | dec ebx |
417 | dec ebx |
404 | ret |
418 | ret |
- | 419 | align 4 |
|
405 | .move010: |
420 | .move010: |
406 | dec ebx |
421 | dec ebx |
407 | ret |
422 | ret |
- | 423 | align 4 |
|
408 | .move011: |
424 | .move011: |
409 | dec eax |
425 | dec eax |
410 | dec ebx |
426 | dec ebx |
411 | ret |
427 | ret |
- | 428 | align 4 |
|
412 | .move100: |
429 | .move100: |
413 | dec eax |
430 | dec eax |
414 | ret |
431 | ret |
- | 432 | align 4 |
|
415 | .move101: |
433 | .move101: |
416 | dec eax |
434 | dec eax |
417 | inc ebx |
435 | inc ebx |
418 | ret |
436 | ret |
- | 437 | align 4 |
|
419 | .move110: |
438 | .move110: |
420 | inc ebx |
439 | inc ebx |
421 | ret |
440 | ret |
- | 441 | ||
- | 442 | align 4 |
|
- | 443 | diff10 "move111-move000 (must be 28!) : ",.move000,$ |
|
422 | .move111: |
444 | .move111: |
423 | inc eax |
445 | inc eax |
424 | inc ebx |
446 | inc ebx |
425 | ret |
447 | ret |
426 | 448 | ||
427 | align 4 |
- | |
428 | .moves dd .move000, .move001, .move010, .move011, .move100, .move101, .move110, .move111 |
- | |
429 | - | ||
430 | ;) |
449 | ;) --------------- |
- | 450 | ||
431 | 451 | align 4 |
|
432 | align 4 |
452 | diff16 "checkscreen : ",0,$ |
433 | ch_checkscreen: |
453 | ch_checkscreen: |
434 | cmp [Screen_Max_X], eax |
454 | cmp [Screen_Max_X], eax |
435 | jb .getout |
455 | jb .getout |
436 | cmp [Screen_Max_Y], ebx |
456 | cmp [Screen_Max_Y], ebx |
437 | .getout: |
457 | .getout: |
438 | ret |
458 | ret |
439 | 459 | ||
440 | align 4 |
460 | align 4 |
- | 461 | diff16 "checkwin : ",0,$ |
|
441 | ch_checkwin: |
462 | ch_checkwin: |
442 | ; eax = x coordinate |
463 | ; eax = x coordinate |
443 | ; ebx = y coordinate |
464 | ; ebx = y coordinate |
444 | ; ebp -> font info |
465 | ; ebp -> font info |
445 | ;!destroys ch, edx! |
466 | ;!destroys ch, edx! |
446 | push eax |
467 | push eax |
447 | push ebx |
468 | push ebx |
448 | mov ch, byte[CURRENT_TASK] |
469 | mov ch, byte[CURRENT_TASK] |
449 | mov al, byte [ebp] ; char X-width |
470 | mov al, byte [ebp] ; char X-width |
450 | mov edx, [_display.width] ; screen X-size |
471 | mov edx, [_display.width] ; screen X-size |
451 | imul edx, ebx |
472 | imul edx, ebx |
452 | add edx, [_WinMapAddress] |
473 | add edx, [_WinMapAddress] |
453 | add edx, eax |
474 | add edx, eax |
454 | cmp ch, byte [edx] |
475 | cmp ch, byte [edx] |
455 | jne .fail |
476 | jne .fail |
456 | movzx eax, byte [ebp] |
477 | movzx eax, byte [ebp] |
457 | cmp ch, byte [edx+eax] |
478 | cmp ch, byte [edx+eax] |
458 | jne .fail |
479 | jne .fail |
459 | movzx ebx, byte [ebp+1] |
480 | movzx ebx, byte [ebp+1] |
460 | imul ebx, [_display.width] |
481 | imul ebx, [_display.width] |
461 | cmp ch, byte [edx+ebx] |
482 | cmp ch, byte [edx+ebx] |
462 | jne .fail |
483 | jne .fail |
463 | add edx, eax |
484 | add edx, eax |
464 | cmp ch, byte [edx+ebx] |
485 | cmp ch, byte [edx+ebx] |
465 | clc |
486 | clc |
466 | je .done |
487 | je .done |
467 | .fail: |
488 | .fail: |
468 | stc ; CF means the charbox is invisible |
489 | stc ; CF means the charbox is invisible |
469 | .done: |
490 | .done: |
470 | pop ebx |
491 | pop ebx |
471 | pop eax |
492 | pop eax |
472 | ret |
493 | ret |
473 | 494 | ||
- | 495 | align 4 |
|
474 | align 4 |
496 | diff16 "ch_putpix : ",0,$ |
475 | ch_putpixel: |
497 | ch_putpixel: |
476 | ; eax = x coordinate |
498 | ; eax = x coordinate |
477 | ; ebx = y coordinate |
499 | ; ebx = y coordinate |
478 | ; edi = 0x0RRGGBB |
500 | ; edi = 0x0RRGGBB |
479 | push edx |
501 | push edx |
480 | mov edx, ebx |
502 | mov edx, ebx |
481 | imul edx, [BytesPerScanLine] |
503 | imul edx, [BytesPerScanLine] |
482 | lea edx, [edx+eax*4] |
504 | lea edx, [edx+eax*4] |
483 | mov [LFB_BASE+edx], edi |
505 | mov [LFB_BASE+edx], edi |
484 | pop edx |
506 | pop edx |
485 | ret |
507 | ret |
486 | ;) |
508 | ;) |
487 | 509 | ||
488 | 510 | ||
489 | diff10 "new font code size",sdsh_code,$16><16> |
511 | diff10 "new font code size",sdsh_code,$16><16> |
490 | >< |
512 | >< |
491 | >><>=>=> |
513 | >><>=>=> |