Вкратце опишу работу Kofee (текущей версии).
Сейчас плеер состоит из 6 модулей:
1. Kofee.asm - Основной модуль плеера.
2. DisplayList.inc - Модуль отвечающий за работу со словарем (
Dictionary) и Списком Отображения (
DisplayList). Пока не доработан.
3. tags.inc - Содержит таблицу тегов (массив указателей на функции) и функции-обработчики тегов.
4. bitStream.inc - Предназначен для работы с битовыми полями. Пока содержит одну функцию
Read_Bitfield для чтения битового поля заданной длины с указанной позиции (адрес первого байта битового поля в памяти и номер первого бита битового поля в указанном байте).
5. dataTypes.inc - Типы данных
SWF.
6. aspAPI.inc - Функции
API KolibriOS.
Алгоритм работы программы.
Code: Select all
ProcessFile: ; Общая процедура обработки файла.
call ReadHeader ; Считываем заголовок SWF файла.
jc .out ; если файл не SWF то выход.
call Memory_Init ; На основе информации полученной из заголовка инициализируем память.
jc .out ; если ошибка то выход
call ReadFile2Memory ; Считываем весь файл в память
jc .out ; если ошибка ФС то выход
; call ResizeWindowToFrame ;Если раскомментировать эту строку, то окно будет
; автоматически изменено до размеров фрейма.
call ParseSWFFile ; Процедура общего парсинга SWF файла.
jc .out
call Memory_Done ; Освобождение памяти.
.out: ; Выход.
ret
proc ParseSWFFile stdcall
locals
lTag dw ?
endl
mov esi, dword [Buffer]
add esi, dword [file_header_size]
xor ecx, ecx
.next_tag:
; Read tag (Читаем тег)
lodsw
mov word [lTag], ax
mov ebx, eax
and ebx, 0xFFC0
shr ebx, 6 ; ebx = tag type
and eax, 0x3F ; eax = tag length
cmp eax, 0x3F ; is long tag ? (длинный тег?)
jne @f
lodsd
@@:
if DEBUG
pusha
stdcall bar, 90, 150, 50, 50, 0;x3377
; TagType
stdcall prints, 10, 150, dbgTagType, TEXTCOLOR
stdcall print_num, 90, 150, ebx, 0, NUMCOLOR
; TagLen
stdcall prints, 10, 160, dbgTagLen, TEXTCOLOR
stdcall print_num, 90, 160, eax, 0, NUMCOLOR
; TagEnd
stdcall prints, 10, 170, dbgTagEnd, TEXTCOLOR
add eax, esi
sub eax, dword [Buffer]
stdcall print_num, 90, 170, eax, 0, NUMCOLOR
; TagIndex
stdcall prints, 10, 190, dbgTagIndex, TEXTCOLOR
stdcall print_num, 90, 190, ecx, 0, NUMCOLOR
popa
end if
cmp ebx, TAGS_NUM ; Skip tags with TagType field greater then the TagsTable
jg @f ; Пропускаем тег, если значение поля TagType больше размера таблицы тегов
mov edi, TagsTable
shl ebx, 2 ; ebx*=4
add edi, ebx
shr ebx, 2
cmp dword [edi], 0
je @f
call dword [edi] ; Call the tag service routine (Вызов функции-обработчика тега)
jc .err_out
@@:
add esi, eax
mov dword [filepos], esi
inc ecx
mov eax, 11 ; Test if there is an event in the queue. (Не забываем реагировать на события KolibriOS).
int 0x40
call ProcessEvent
; cmp ebx, 2 ; DEBUG: Terminate on the tag type = ebx ; А это для отладки
; je .out
;cmp ecx, 2 ; DEBUG: Terminate on the tag number = ecx ; И это для отладки тоже
;je .out
; Test that the filepointer esi not greater than start of the Buffer + FileLength
; Проверка на то, чтобы указатель текущего смещения, содержащийся в esi не больше
; чем начало буфера данных (SWF файл в памяти) Buffer + длина файла FileLength
mov eax, esi
sub eax, dword [Buffer]
cmp eax, dword [FileHeader.FileLength]
jg .err_out
test ebx, ebx ; tag type = 0 <- 'End' tag
jnz .next_tag
; cmp eax, dword [FileHeader.FileLength] ; Does 'End' tag for a sprite ?
; jl .next_tag ; if yes - continue loop
.out:
clc
ret
.err_out:
stc
ret
endp
В настоящее время реализована, только функция-обработчик тега №
9 (установка фонового цвета).