Rev 205 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
31 | halyavin | 1 | ; BGI Font Test |
2 | ; |
||
3 | ; Written in pure assembler by Ivushkin Andrey aka Willow |
||
4 | ; |
||
5 | ; Created: December 20, 2004 |
||
6 | ; |
||
7 | ; Last changed: February 2, 2005 |
||
8 | ; |
||
9 | |||
205 | heavyiron | 10 | BGIFONT_PATH equ '/RD/1/FONTS/' |
31 | halyavin | 11 | _X equ 340 |
12 | _Y equ 240 |
||
13 | |||
14 | BGI_WINDOW_CLIP equ 1 |
||
15 | BGI_PRC_INFO equ pinfo |
||
16 | |||
17 | macro ListFonts |
||
18 | { |
||
19 | mov eax,lf_head |
||
20 | call PixelPrint |
||
21 | mov ebx,20 shl 16+60 |
||
22 | mov ecx,(BGIfont_names_end-BGIfont_names)/4 |
||
23 | mov esi,BGIfont_names |
||
24 | .l1: |
||
25 | pusha |
||
26 | pusha |
||
27 | mcall 4,,0x10777fac,esi,4 |
||
28 | popa |
||
29 | mov edx,[esi] |
||
30 | BGIfont_GetID |
||
31 | mov dword[_BGIfont_Prepare.font],edx |
||
32 | mov ecx,eax |
||
33 | add ebx,140 shl 16 |
||
34 | mov edx,ebx |
||
35 | mcall 47,0x80100,,,0x10ffffff |
||
36 | jecxz .nofont |
||
37 | lea ebx,[edx+80 shl 16+12] |
||
205 | heavyiron | 38 | mov edx,_BGIfont_Prepare.fontfullname |
39 | mov esi,_BGIfont_Prepare.fontattr-1 |
||
31 | halyavin | 40 | sub esi,edx |
41 | add ecx,0x3b800b8 |
||
42 | BGIfont_Outtext |
||
43 | sub ebx,155 shl 16+12 |
||
44 | mcall 4,,0x1000f000,load_ok,load_fail-load_ok |
||
45 | jmp .pop |
||
46 | .nofont: |
||
47 | lea ebx,[edx-80 shl 16] |
||
48 | mcall 4,,0x10f00010,load_fail,font_msg-load_fail |
||
49 | .pop: |
||
50 | popa |
||
51 | add esi,4 |
||
52 | add ebx,39 |
||
53 | loop .l2 |
||
54 | jmp .ex |
||
55 | .l2: |
||
56 | jmp .l1 |
||
57 | .ex: |
||
58 | } |
||
59 | use32 |
||
60 | org 0x0 |
||
61 | |||
62 | db 'MENUET01' |
||
63 | dd 0x01 |
||
64 | dd START |
||
65 | dd I_END |
||
66 | dd 0x100000 |
||
316 | heavyiron | 67 | dd 0x100000 |
31 | halyavin | 68 | dd 0x0 |
69 | not1strun dd 0x0 |
||
70 | |||
131 | diamond | 71 | include 'lang.inc' |
31 | halyavin | 72 | include 'macros.inc' |
73 | ;include 'debug.inc' |
||
74 | include 'bgifont.inc' |
||
75 | |||
76 | START: |
||
77 | mov [help],0 |
||
78 | mov ecx,(BGIfont_names_end-BGIfont_names)/4 |
||
79 | mov esi,BGIfont_names |
||
80 | mov edi,I_END |
||
81 | BGIfont_Init |
||
82 | reset: |
||
83 | mov esi,[BGIfont_Ptr] |
||
84 | inc esi |
||
85 | mov edi,freeconst |
||
86 | movsd |
||
87 | mov esi,freeconst |
||
88 | mov edi,freetest |
||
89 | mov ecx,36 |
||
90 | rep movsb |
||
91 | red: |
||
92 | mov eax,[freetest] |
||
93 | mov dword[title+19],eax |
||
94 | call draw_window |
||
95 | cmp [not1strun],0 |
||
96 | jnz still |
||
97 | mcall 5,300 |
||
98 | not [not1strun] |
||
99 | inc [help] |
||
100 | jmp red |
||
101 | still: |
||
102 | |||
103 | mov eax,10 |
||
104 | int 0x40 |
||
105 | |||
106 | cmp eax,1 |
||
107 | je red |
||
108 | cmp eax,2 |
||
109 | je key |
||
110 | cmp eax,3 |
||
111 | je button |
||
112 | |||
113 | jmp still |
||
114 | |||
115 | button: |
||
116 | mov eax,17 |
||
117 | int 0x40 |
||
118 | cmp ah,1 |
||
119 | jnz noclose |
||
120 | close: |
||
121 | xor eax,eax |
||
122 | dec eax |
||
123 | int 0x40 |
||
124 | noclose: |
||
125 | jmp still |
||
126 | |||
127 | key: |
||
128 | mov eax,2 |
||
129 | int 0x40 |
||
130 | shr eax,8 |
||
131 | cmp al,27 ; esc - close |
||
132 | je close |
||
133 | cmp al,32 ; Space - help |
||
134 | jne .noh |
||
135 | inc [help] |
||
136 | cmp [help],3 |
||
137 | jne red |
||
138 | and [help],0 |
||
139 | jmp red |
||
140 | .noh: |
||
141 | cmp [help],2 |
||
142 | jne still |
||
143 | cmp al,50 |
||
144 | jb .noff |
||
145 | cmp al,57 |
||
146 | ja .noff |
||
147 | sub al,46 |
||
148 | .gn: |
||
149 | movzx ecx,al |
||
150 | shl ecx,28 |
||
151 | call BGIfont_GetName |
||
152 | mov [freetest],edx |
||
153 | jmp red |
||
154 | .noff: |
||
155 | mov ecx,4 |
||
156 | mov edi,Fkeys |
||
157 | .fkey: |
||
158 | cmp al,[edi] |
||
159 | je .fndkey |
||
160 | inc edi |
||
161 | loop .fkey |
||
162 | jmp .notfnd |
||
163 | .fndkey: |
||
164 | lea eax,[edi-Fkeys+0xc] |
||
165 | jmp .gn |
||
166 | .notfnd: |
||
167 | cmp al,114 ; r - reset |
||
168 | je reset |
||
169 | cmp al,176 |
||
170 | jne .nol ; left |
||
171 | sub dword[freetest+8],5 |
||
172 | jmp red |
||
173 | .nol: |
||
174 | cmp al,179 |
||
175 | jne .nor ; right |
||
176 | add dword[freetest+8],5 |
||
177 | jmp red |
||
178 | .nor: |
||
179 | cmp al,105 ; i -italic |
||
180 | jne .noi |
||
181 | xor dword[freetest+32],BGI_ITALIC |
||
182 | jmp red |
||
183 | .noi: |
||
184 | cmp al,98 ; b -bold |
||
185 | jne .nob |
||
186 | xor dword[freetest+32],BGI_BOLD |
||
187 | jmp red |
||
188 | .nob: |
||
189 | mov ecx,2 |
||
190 | mov esi,ali |
||
191 | .ol2: |
||
192 | cmp al,[esi] |
||
193 | jne .othl2 |
||
194 | mov ax,[freetest+32] |
||
195 | add ax,[esi+3] |
||
196 | mov bx,ax |
||
197 | mov dx,[esi+1] |
||
198 | and bx,dx |
||
199 | cmp bx,dx |
||
200 | jne .ok |
||
201 | not dx |
||
202 | and ax,dx |
||
203 | .ok: |
||
204 | mov [freetest+32],ax |
||
205 | jmp red |
||
206 | .othl2: |
||
207 | add esi,5 |
||
208 | loop .ol2 |
||
209 | .other: |
||
210 | mov esi,delt |
||
211 | mov ecx,4 |
||
212 | .ol: |
||
213 | cmp al,[esi] |
||
214 | jne .othl |
||
215 | fld dword[esi+1] |
||
216 | movzx eax,byte[esi+5] |
||
217 | fadd dword[freetest+eax] |
||
218 | fstp dword[freetest+eax] |
||
219 | jmp red |
||
220 | .othl: |
||
221 | add esi,6 |
||
222 | loop .ol |
||
223 | jmp still |
||
224 | |||
225 | draw_window: |
||
316 | heavyiron | 226 | |
227 | mov eax,48 |
||
228 | mov ebx,3 |
||
229 | mov ecx,sc |
||
230 | mov edx,sizeof.system_colors |
||
231 | int 0x40 |
||
232 | |||
31 | halyavin | 233 | mov eax,12 |
234 | mov ebx,1 |
||
235 | int 0x40 |
||
236 | |||
237 | xor eax,eax |
||
316 | heavyiron | 238 | mov ebx,10*65536+_X*2+30 |
31 | halyavin | 239 | mov ecx,100*65536+_Y*2 |
240 | mov edx,0x03261212 |
||
241 | mov esi,0x805080d0 |
||
242 | mov edi,0x005080d0 |
||
243 | int 0x40 |
||
244 | |||
245 | mov eax,4 |
||
246 | mov ebx,8*65536+8 |
||
316 | heavyiron | 247 | mov ecx,[sc.grab_text] |
248 | or ecx,0x10000000 |
||
31 | halyavin | 249 | mov edx,title |
250 | mov esi,title_end-title |
||
251 | cmp [help],2 |
||
252 | je .int |
||
253 | sub esi,12 |
||
254 | .int: |
||
255 | int 0x40 |
||
256 | |||
257 | cmp [help],0 |
||
258 | jnz .help |
||
259 | cmp byte[I_END],0 |
||
260 | jnz .fontsok |
||
261 | mov eax,font_msg |
||
262 | call PixelPrint |
||
263 | .fontsok: |
||
264 | ListFonts |
||
265 | jmp .eod |
||
266 | .help: |
||
267 | cmp [help],1 |
||
268 | jne .nohelp |
||
269 | mov eax,helptxt |
||
270 | cmp byte[I_END],0 |
||
271 | jnz .fontsok2 |
||
272 | mov word[eax+2],_X-80 |
||
273 | call PixelPrint |
||
274 | jmp .eod |
||
275 | .fontsok2: |
||
276 | mov word[eax+2],_X |
||
277 | call Print |
||
278 | jmp .eod |
||
279 | .nohelp: |
||
280 | mov edi,cross |
||
281 | mov eax,38 |
||
282 | mov edx,0x4b331a |
||
283 | mov ebx,[edi] |
||
284 | mov ecx,[edi+4] |
||
285 | int 0x40 |
||
286 | mov ebx,[edi+8] |
||
287 | mov ecx,[edi+12] |
||
288 | int 0x40 |
||
289 | mov ebx,freetest |
||
290 | BGIfont_Freetext |
||
291 | .eod: |
||
292 | mov eax,12 |
||
293 | mov ebx,2 |
||
294 | int 0x40 |
||
295 | ret |
||
296 | |||
297 | Print: ; eax-pointer to _txt struc |
||
298 | pusha |
||
299 | mov ebx,[eax] |
||
300 | movzx ecx,byte[eax+12] |
||
301 | lea edx,[eax+13] |
||
302 | mov edi,eax |
||
303 | .nextstr: |
||
304 | mov esi,[edx] |
||
305 | add edx,4 |
||
306 | push ecx |
||
307 | mov ecx,[edi+8] |
||
308 | BGIfont_Outtext |
||
309 | add ebx,[edi+4] |
||
310 | pop ecx |
||
311 | and esi,0xfff |
||
312 | add edx,esi |
||
313 | loop .nextstr |
||
314 | popa |
||
315 | ret |
||
316 | |||
317 | PixelPrint: ; eax-pointer to _txt struc, but used differently |
||
318 | pusha |
||
319 | mov ebp,eax |
||
320 | mov ebx,[ebp] |
||
321 | movzx ecx,byte[ebp+12] |
||
322 | mov eax,4 |
||
323 | lea edx,[ebp+17] |
||
324 | .l: |
||
325 | mov esi,[edx-4] |
||
326 | and esi,0xfff |
||
327 | push ecx |
||
328 | mov ecx,[ebp+8] |
||
329 | int 0x40 |
||
330 | pop ecx |
||
331 | lea edx,[esi+edx+4] |
||
332 | add ebx,[ebp+4] |
||
333 | loop .l |
||
334 | popa |
||
335 | ret |
||
336 | |||
337 | macro _txt _xy,_vert,_color,_opt,[_str] |
||
338 | { |
||
339 | common |
||
340 | _counter=0 |
||
341 | forward |
||
342 | _counter=_counter+1 |
||
343 | common |
||
344 | dd _xy ; 0 |
||
345 | dd _vert ; 4 |
||
346 | dd _color ; 8 |
||
347 | db _counter ;_str_count ; 12 |
||
348 | forward |
||
349 | local .str_beg,.str_end |
||
350 | dd (.str_end-.str_beg) or _opt ; 13 |
||
351 | .str_beg: |
||
352 | db _str ;17 |
||
353 | .str_end: |
||
354 | } |
||
355 | |||
356 | title db 'BGIFONT.INC demo - FONT font' |
||
357 | title_end: |
||
358 | _M equ 30 |
||
359 | cross dd _M shl 16+_X*2-_M,_Y shl 16+_Y,_X shl 16+_X,_M shl 16+_Y*2-_M |
||
360 | helptxt: |
||
361 | if lang eq ru |
||
362 | _txt _X shl 16+60,40,0x434ba010,BGI_HACENTER,\ |
||
363 | "ГОРЯЧИЕ КЛАВИШИ:",\ |
||
364 | "Пробел - шрифты/этот текст/демка;",\ |
||
365 | "<-> стрелки - вращение строки;",\ |
||
366 | "V - выравнивание по вертикали;",\ |
||
367 | "H - выравнивание по горизонтали;",\ |
||
368 | "[,] - масштаб по оси X;",\ |
||
369 | "A,Z - масштаб по оси Y;",\ |
||
370 | "B,I - полужирный шрифт и курсив;",\ |
||
371 | "R - сброс параметров шрифта;",\ |
||
372 | "F1..F12 - выбор шрифта;",\ |
||
373 | "Esc - закрыть прогу :-(" |
||
374 | alpha: |
||
375 | db "Вот пример текста!" |
||
376 | lf_head: |
||
377 | _txt 10 shl 16+30,85 shl 16,0x6e00f7,0,"Имя шрифта","Статус","ID",\ |
||
378 | "Путь к файлу" |
||
379 | load_ok: |
||
380 | db "загружен" |
||
381 | load_fail: |
||
382 | db "не найден" |
||
383 | font_msg: |
||
384 | _txt (_X+20) shl 16+180,25,0x10ff0000,0,\ |
||
385 | "К сожалению, не найдено ни одного",\ |
||
386 | "векторного шрифта *.CHR. Возможно,",\ |
||
387 | "вам следует исправить константу",\ |
||
388 | "BGIFONT_PATH в начале файла BGITEST.ASM",\ |
||
389 | "и перекомпилировать его :-(" |
||
390 | else |
||
391 | _txt _X shl 16+60,40,0x434ba010, BGI_HACENTER,\ |
||
392 | "HOT KEYS:",\ |
||
393 | "Space - font list/this message/demo;",\ |
||
394 | "<-> arrows - rotate text string;",\ |
||
395 | "V - toggle vertical alignment;",\ |
||
396 | "H - toggle horizontal alignment;",\ |
||
397 | "[,] - scale on X axis;",\ |
||
398 | "A,Z - scale on Y axis;",\ |
||
399 | "B,I - toggle bold & italic mode;",\ |
||
400 | "R - reset font options;",\ |
||
401 | "F1..F12 - select font;",\ |
||
402 | "Esc - close demo :-(" |
||
403 | alpha: |
||
404 | db 'This is a Sample text!' |
||
405 | ; db 'ABCDEFGHIGKLMNOPQRSTUVWXWZ' |
||
406 | lf_head: |
||
407 | _txt 10 shl 16+30,85 shl 16,0x6e00f7,0,"Font name","Status","ID",\ |
||
408 | "Filename" |
||
409 | load_ok: |
||
410 | db "loaded" |
||
411 | load_fail: |
||
412 | db "not found" |
||
413 | font_msg: |
||
414 | _txt (_X+20) shl 16+180,25,0x10ff0000,0,\ |
||
415 | "Sorry, no vector font *.CHR found.",\ |
||
416 | "Maybe you should correct BGIFONT_PATH",\ |
||
417 | "constant at the beginning of file",\ |
||
418 | "BGITEST.ASM and recompile it :-(" |
||
419 | end if |
||
420 | |||
421 | macro Deltas _key,_scale,_ofs |
||
422 | { |
||
423 | db _key |
||
424 | dd _scale |
||
425 | db _ofs |
||
426 | } |
||
427 | |||
428 | delt: |
||
429 | Deltas 91, -0.15,12 |
||
430 | Deltas 93, 0.15,12 |
||
431 | Deltas 97, 0.15,16 |
||
432 | Deltas 122,-0.15,16 |
||
433 | Fkeys db 48,49,68,255 |
||
434 | |||
435 | macro Aligns _key,_mask,_add |
||
436 | { |
||
437 | db _key |
||
438 | dw _mask,_add |
||
439 | } |
||
440 | ali: |
||
441 | Aligns 118,BGI_VAMASK,BGI_VATOP |
||
442 | Aligns 104,BGI_HAMASK,BGI_HARIGHT |
||
443 | freeconst BGIfree 'FONT',_X shl 16+_Y,0, 1.0, 1.0, alpha,\ |
||
444 | lf_head-alpha,0xb800e7,\ |
||
445 | BGI_VACENTER or BGI_HACENTER |
||
446 | freetest BGIfree ?,?,?,?,?,?,?,?,? |
||
447 | help db ? |
||
448 | pinfo: |
||
449 | times 1024 db ? |
||
316 | heavyiron | 450 | sc system_colors |
31 | halyavin | 451 | I_END:->-> |