Subversion Repositories Kolibri OS

Rev

Rev 1167 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1158 Lrz 1
; Copyright (c) 2009, 
2
; All rights reserved.
3
;
4
; Redistribution and use in source and binary forms, with or without
5
; modification, are permitted provided that the following conditions are met:
6
;       * Redistributions of source code must retain the above copyright
7
;       notice, this list of conditions and the following disclaimer.
8
;       * Redistributions in binary form must reproduce the above copyright
9
;       notice, this list of conditions and the following disclaimer in the
10
;       documentation and/or other materials provided with the distribution.
11
;       * Neither the name of the  nor the
12
;       names of its contributors may be used to endorse or promote products
13
;       derived from this software without specific prior written permission.
14
;
15
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname  ''AS IS'' AND ANY
16
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
; DISCLAIMED. IN NO EVENT SHALL  BE LIABLE FOR ANY
19
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
;*****************************************************************************
26
 
27
;;;;;;;;;;;;;;;;;;
28
 
29
format MS COFF
30
 
31
public EXPORTS
32
 
33
section '.flat' code readable align 16
34
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
35
;Get info about
36
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
37
include '../../../../macros.inc'
38
align 4
39
initialization_font:
40
; esp+0 = dd back
41
; заполняем массив - структу для получения кол-ва файлов
42
 
43
pushad
44
        xor     eax,eax
45
        inc     eax
46
        mov     [number_function],eax
47
;structure is completed
48
        mov     eax,70
49
        mov     ebx,dword struct_f_info
50
        mcall
51
;IF ERROR FT then exit
52
        test    eax,eax
53
        jnz     .exit
54
;IF ERROR folder is not found then exit
55
        test    ebx,ebx
56
        mov     eax,ebx
57
        jnz     .exit
58
 
59
;Get quantity files
60
        mov     eax,[buffer_32.quantity_files]
61
        imul    eax,304
62
        add     eax,32          ; ??
63
        push    eax         ;save eax в eax размер нужной нам памяти в байтах
64
;init memory
65
        mov     eax,68
66
        mov     ebx,11
67
        mcall
68
        test    eax,eax
69
        jz     .exit
70
        inc     ebx     ;выделить блок в ecx байт
71
 
72
        pop     ecx
73
        mov     eax,68
74
        mcall
75
        mov     dword [fulder_array_point],eax  ;save point for memory's fulder
76
;в eax указатель на блок
77
        mov     [buffer_read_d],eax             ;point to new array
78
        mov     eax,[buffer_32.quantity_files]
79
        mov     [read_block],eax
80
;get in buffer info of files and sub dir current dir
81
        mov     eax,70
82
        mov     ebx,dword struct_f_info
83
        mcall
84
;получили информацию о файлах.
85
        mov     ebp, dword [buffer_read_d] ;point to structure
86
        mov     ecx, dword [ebp+4]         ;кол-во блоков БДВК
87
        mov     dword [save_ecx],ecx
88
        add     ebp, 32 ;смещаемся до БДВК
89
        mov     dword [save_ebp],ebp
90
        cld     ;установка флага направления
91
align 4
92
.start_loop:
93
        push    ecx
94
        lea     edi,[ebp+0x28] ;в edi указатель на начало имени.
95
        xor     eax,eax
96
        mov     ecx,263
1167 Lrz 97
        repne    scasb   ;найдем конец строки
1158 Lrz 98
;;;;;;;;;;;;;;;;;;;;;;;
1167 Lrz 99
        sub     edi,5   ;.ksf,0
1169 Lrz 100
        lea     esi,[name_font]
101
        mov     eax,dword[edi]
102
        or      eax,0x20202000  ; сделаем расширение строчными буквами.
103
        cmp     eax,dword[esi]
1158 Lrz 104
        jnz     @f
1169 Lrz 105
 
1158 Lrz 106
;;;;;;;; ура это наш файл т.е. наш шрифт мы нашли нужный файлик ))
107
;теперь нужно точно убедиться что это наш и только наш файлик
108
;загрузим заголовок файла и узнаем его размер глифа.
1169 Lrz 109
 
1158 Lrz 110
        call    alloc_mem       ; выделим озу своих переменных
111
; сейчас нам нужно сформировать имя файла с полным путем
112
        mov     eax,dword [alloc_memory_point]
113
        lea     edi,dword [eax+4]
114
        lea     esi,[name_fulder]
115
        mov     ecx,name_fuld_end
116
        rep     movsb   ;переносим путь
117
        mov     al,'/'
118
        stosb
119
        lea     esi,[ebp+0x28] ;в esi указатель на начало имени.
120
align 4
121
.loop_b:
122
        lodsb
123
        stosb
124
        test    al,al
125
        jnz     .loop_b
126
 
127
;        mov     edi,name_of_file ; [ebp+0x28] ;в edi указатель на начало имени.
128
;get in buffer info above own file
129
        xor     eax,eax
130
        mov     dword [number_function],eax
131
        mov     dword [index_start_block],eax   ;позиция в файле для чтения данных
132
        mov     dword [flags_],eax              ;старшая позиция для чтения данных
133
        mov     dword [read_block],8            ;сколько байт читать нам нужно 8 байт
134
        mov     dword [buffer_read_d],file_buffer ; указатель на буфер куда будут записаны данные
135
 
136
        mov     eax,dword [alloc_memory_point]
137
        lea     edi,dword [eax+4]
138
        mov     dword [offset_to_string],edi
139
 
140
        mov     eax,70
141
        mov     ebx,dword struct_f_info
142
        mcall
143
;;;;;;;;;;;;;;;; проверим формат заголовка
144
        mov     eax,ebx
145
        mov     eax,dword [file_buffer]
146
        mov     ebx,dword [type_fnt]
147
        cmp     eax,ebx
148
        jnz     @f
149
 
150
;;;;;;; отлично сейчас проверили что заголовок именно тот который нам нужен
151
; сейчас нужно перераспределить блоки т.е. по мере нахождения будем переносить блоки
152
; в начало буфера
153
 
154
        mov     dword [save_point_nt],ebp
155
        pop     ecx
1169 Lrz 156
        xor     eax,eax
157
        jmp     .exit
1158 Lrz 158
 
159
align 4
160
@@:     pop     ecx
161
        add     ebp,304
162
        dec     ecx
163
        jnz     .start_loop
164
;        loop    .start_loop
1169 Lrz 165
        or     eax,-1
1158 Lrz 166
;;;;;;;; прошлись - все интересущющие шрифты переместили в начало блока.
167
 
168
align 4
169
.exit:  mov     dword [esp+28],eax
170
popad
171
ret
172
 
173
 
174
align 4
175
get_font:
176
; поиск в массиве шрифта при совпадении уcловий загрузка шрифта
177
; esp+4 = dd width font shl 16 +hight font
178
; esp+0 = dd back
1167 Lrz 179
;pop     eax
180
;        pop     dword [font_x_y]
181
;push    eax
1158 Lrz 182
pushad
1167 Lrz 183
        mov     eax,dword [esp+32+4]
184
        mov     dword [font_x_y],eax
1158 Lrz 185
        xor     eax,eax
186
        mov     dword [number_function],eax
187
        mov     dword [index_start_block],eax   ;позиция в файле для чтения данных
188
        mov     dword [flags_],eax              ;старшая позиция для чтения данных
189
        mov     dword [read_block],8            ;сколько байт читать нам нужно 8 байт
190
        mov     dword [buffer_read_d],file_buffer ; указатель на буфер куда будут записаны данные
191
 
192
        mov     eax,dword [alloc_memory_point]
193
        lea     edi,dword [eax+4]
194
        mov     dword [offset_to_string],edi
195
 
196
 
197
        mov     eax,70
198
        mov     ebx,dword struct_f_info
199
        mcall
200
;;;;;;;;;;;;;;;; проверим формат заголовка
201
        mov     eax,ebx
202
        mov     eax,dword [file_buffer]
203
        mov     ebx,dword [type_fnt]
204
        cmp     eax,ebx
205
 
206
        mov     ecx,dword [file_buffer.font_size]
207
        mov     edx,dword [font_x_y]
208
        cmp     ecx,edx
209
 
210
        mov     ecx, 4096;dword [ebp+32]     ;размер файла до 4294967296 байт т.е. 4 Гб
211
 
212
        mov     dword [read_block],ecx
213
        mov     eax,68
214
        mov     ebx,12
215
        mcall
216
 
217
        mov     dword [font_array_point],eax    ;save point to array
218
        mov     dword [buffer_read_d],eax
219
 
220
;load font
221
        mov     ebx,dword struct_f_info
222
        mov     eax,70
223
        mcall
224
        test    eax,eax
1169 Lrz 225
        jnz     .exit
1158 Lrz 226
 
227
        lea     eax,[buffer_read_d]
228
        mov     eax,dword [eax]
229
        mov     ebx,dword [eax+8]
230
        add     eax,ebx
231
;        add     eax,dword [eax+8]
232
;        add     eax,dword [buffer_read_d]
233
        mov     dword [font_array_data],eax
1169 Lrz 234
        xor     eax,eax
235
        jmp     .ok
1158 Lrz 236
 
237
;here error file system
238
align 4
1169 Lrz 239
.exit:
240
        or      eax,-1
241
align 4
242
.ok:    mov     dword [esp+28],eax       ;вернем ошибку
1158 Lrz 243
        popad
1167 Lrz 244
        ret 4
1158 Lrz 245
 
246
 
247
; поиск вывод сторочки по символьно сфорированного шрифтом текста
248
; esp+12= dd x shl 16 + y x- координата по Х, y - координата по Y
249
; esp+8 = dd point to color of background and font
250
; esp+4 = dd point to ASCIIZ
251
; esp+0 = dd back
252
align 4
253
font_draw_on_string:
254
pushad
255
 
256
        mov     esi,dword [esp+4+32] ;ASCIIZ
257
        mov     edx,dword [esp+12+32]  ; x shl 16 +y
258
        mov     ecx,dword [font_x_y]  ;размер глифа x shl 16 +y
259
        mov     edi,dword [esp+8+32]     ;указатель на палитру из цвета и фона
260
        xor     ebp,ebp         ;см 65 функцию ))
261
        cld
262
align 4
263
@@:     ;pushad
264
        xor     eax,eax
265
        lodsb
266
        test    al,al
1167 Lrz 267
        jz      .return
1158 Lrz 268
        shl     eax,4         ;умножаем на 16 т.к. это высота глифа
269
 
270
        mov     ebx,dword [font_array_data]    ; тут распологаются глифы символов
271
        add     ebx,eax
272
        push    esi
273
        mov     esi,1
274
        mov     eax,65
275
        mcall
276
        pop     esi
277
        add     edx,8 shl 16    ;следующий символ ширина символа = 8 точкам
278
        jmp     @b
279
 
280
align 4
281
.return:
282
popad
283
ret 12
284
 
285
 
286
align 4
287
; esp+4 = dd point to color of background and font
288
show_all_glif:
289
pushad
290
 
291
        mov     edx,10 shl 16+20 ;dword [esp+12+32]  ; x shl 16 +y
292
        mov     ecx,128 shl 16 +256;dword [font_x_y]  ;размер глифа x shl 16 +y
293
        mov     edi,dword [esp+4+32]     ;указатель на палитру из цвета и фона
294
        xor     ebp,ebp         ;см 65 функцию ))
295
 
296
align 4
297
@@:
298
        mov     ebx,dword [font_array_data]    ; тут распологаются глифы символов
299
        mov     esi,1
300
        mov     eax,65
301
        mcall
302
popad
303
ret 4
304
 
305
 
306
 
307
 
308
 
309
 
310
align 4
311
free_fulder_info:
312
;освободить память выделеную для получения блоков БДВК
313
pushad
314
        mov     ecx, dword [fulder_array_point]
315
        mov     eax,68
316
        mov     ebx,13
317
        mcall
318
        test    eax,eax
1169 Lrz 319
;        jnz     @f
320
        mov      dword [esp+28],eax       ;вернем ошибку
321
;align 4
322
;@@:
1158 Lrz 323
popad
324
        ret
325
align 4
326
free_font:
327
;освободить память выделеную для получения блоков БДВК
328
pushad
329
        mov     ecx, dword [font_array_point]
330
        mov     eax,68
331
        mov     ebx,13
332
        mcall
333
        test    eax,eax
1169 Lrz 334
;        jnz     @f
335
        mov      dword [esp+28],eax       ;вернем ошибку
336
;align 4
337
;@@:
1158 Lrz 338
popad
339
        ret
340
 
341
align 4
342
; alloc mem get 4 Kb for own data
343
alloc_mem:
344
        pushad
345
        mov     eax, dword [alloc_memory_point]
346
        test    eax,eax
347
        jnz     .mem_allocating
348
        mov     eax,68
349
        mov     ebx,12
350
        mov     ecx,4096
351
        mcall
352
        mov     dword [alloc_memory_point],eax  ; при первом вхождении выделяем 4 кб ОЗУ и сохраняем указатель
353
        mov     dword [eax],-1
354
        popad
355
        ret
356
align 4
357
.mem_allocating:
358
        mov     ebp, dword [eax]
359
        mov     eax,ebp
360
        cmp     eax, -1
361
        jnz     .mem_allocating
362
 
363
        mov     eax,68
364
        mov     ebx,12
365
        mov     ecx,4096
366
        mcall
367
        mov     dword [ebp],eax ; при первом вхождении выделяем 4 кб ОЗУ и сохраняем указатель
368
        mov     dword [ebp],-1
369
        popad
370
        ret
371
 
372
align 16
373
EXPORTS:
374
 
375
        dd      sz_initialization_font, initialization_font
376
        dd      sz_get_font,            get_font
377
        dd      sz_free_fulder_info,    free_fulder_info
378
        dd      sz_free_font,           free_font
379
        dd      sz_font_draw_on_string, font_draw_on_string
380
        dd      sz_show_all_glif,       show_all_glif
381
;        dd      szVersion_ch,           0x00000001
382
;        dd      sz_option_box_draw,     option_box_draw
383
;        dd      sz_option_box_mouse,    option_box_mouse
384
        dd      szVersion_fn,           0x00000001
385
        dd      0,0
386
 
387
sz_initialization_font db 'initialization_font',0
388
sz_get_font            db 'get_font',0
389
sz_free_fulder_info    db 'free_fulder_info',0
390
sz_free_font           db 'free_font',0
391
sz_font_draw_on_string db 'font_draw_on_string',0
392
sz_show_all_glif       db 'show_all_glif',0
393
;sz_check_box_mouse     db 'check_box_mouse',0
394
;szVersion_ch           db 'version_ch',0
395
;sz_option_box_draw     db 'option_box_draw',0
396
;sz_option_box_mouse    db 'option_box_mouse',0
397
szVersion_fn           db 'version_fn',0
398
 
399
;;;;;;;;;;;
400
;;Data
401
;;;;;;;;;;;
402
align 4
403
;buffer_font file 'font_8x16.fon' ;шрифт которым будем выводить raw формат 1bpp
404
save_ecx        dd      0x0
405
;buffer_font file 'font01.ksf' ;шрифт которым будем выводить raw формат 1bpp
406
alloc_memory_point      dd      0x0     ; point to mem block in RAM 4096-4
407
;структура такая в начале выделеного блока размещается указатель на другой выделлный блок в 4096-4, если это блок последний, то dd -1
408
font_x_y          dd 0x0
409
fulder_array_point dd 0x0
410
font_array_point  dd 0x0
411
font_array_data   dd 0x0        ; реальные данные т.е. матрица шрифта
412
save_ebp          dd 0x0
413
save_point_nt     dd 0x0
414
name_fulder       db '/sys/FONTS',0
415
name_fuld_end=     ($-name_fulder) -1
1169 Lrz 416
name_font         db '.ksf',0
1158 Lrz 417
type_fnt          db 'kf01'
418
 
419
 
420
 
421
align 16
422
struct_f_info:
423
number_function   dd 0x0
424
index_start_block dd 0x0
425
flags_            dd 0x0
426
read_block        dd 0x0
427
buffer_read_d     dd buffer_32
428
free_byte         db 0x0
429
offset_to_string  dd name_fulder
430
 
431
align 16
432
file_buffer:
433
.type_fnt       dd 0x0
434
.font_size      dd 0x0
435
 
436
align 16
437
buffer_32:
438
.head             dd ?
439
.quantity_block   dd ?
440
.quantity_files   dd ?
441
                  rb 20