Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [arm] WG320240 (SED1335) на AT91SAM7 
:(
    Опции темы
Ivan.
Дата 18.3.2010, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Здравствуйте уважаемые программисты и разработчики. Я думаю, что не я один сталкивался с графическим индикатором WG320240 и искал для него драйвер.
Эту тему я решил создать не для того, чтобы спросить «есть ли у кого исходники для работы с ним», а наоборот немного рассказать о нем. Несколько лет назад я связался с таким индикатором, и тоже искал всяческую информацию и документацию. Но, как и принято – если хочешь сделать хорошо - делай это сам. Долго писал и не раз все переписывал заново, и в меру своей постоянной неудовлетворенности считаю, что так и не доделал. Однако работа выполнена, библиотека работает и почему бы не поделится этой работай с людьми. Возможно кто-то поможет закончить мою работу, чтобы получился законченный результат.
В общем так, что из себя представляет этот индикатор: это графический индикатор с расширением 320 на 240 точек со встроенным контроллером SED1335 для регенерации изображения. Индикатор может иметь несколько слоев, как графических так и текстовых и может отображать 3 цвета: черный, белый и мерцающий (серый). Различные способы наложения слоев, прокрутки, пользовательские шрифты и так далее.
Кто писал для этого индикатора функции рисования - знает, что рисовать на нем довольно таки сложно, потому что приходится постоянно ждать четко определенного момента времени, когда можно посылать на него информации. Можно конечно и не ждать, но тогда появится рябь на экране в момент записи данных.
В качестве основного контроллера я использовал AT91SAM7S(X). Чтобы небыло задержек в рисовании или ряби на экране, я решил разделить работу на 2 части: рисование в памяти и выгрузка данных на индикатор. Для себя я определил, что мне понадобится 2 графических слоя, один постоянный, а второй мерцающий, чтобы получить трехцветный дисплей. Текстовый слой, прокрутка, мигающие курсоры мне не нужны, ибо чтобы нарисовать красивую информацию на дисплее (окна, кнопки, поля ввода и т.д.) текстовый слой со своей жесткой привязкой к координатам будет только мешаться. Хотя я уже придумал куда можно применить третий текстовый слой – для отображения вспомогательной информации (бегунок уровня яркости, громкости звука и т.д. как меню на телевизорах). Для работы с тремя цветами понадобится 2 бита (4 состояния) из которых одно состояние остается неиспользованное. Чтобы даром не терять недоиспользованную информацию – я решил использовать его как прозрачный цвет. Конечно на экране прозрачного цвета быть не может, но при хранении картинок или определении цвета заливки очень даже полезный. Тем самым, что у меня получилось: 320 * 240 точек на 2 бита цвета получается 19200 байт оперативной памяти. Конечно ~19к оперативки жалко, но при имеющемся объеме 32к или 64к, в зависимости от контроллера, почему бы и нет, учитывая, что в итоге мы получаем полноценный графический трехцветный индикатор, с которым удобно работать во всех отношениях.

Библиотека работы с индикатором, как я уже сказал, разделилась на 2 части: Driver и Canvas. Для ускорения работы драйвера – я посадил его на FIQ прерывание. При появлении сигнала от индикатора о готовности принимать информацию срабатывает прерывание, обработчик прерывания выталкивает часть информации и снова освобождает процессор. Остается только подготовить эту информацию. В итоге у меня получилось воспроизводить около 10 кадров в секунду (анимацию можно воспроизводить). Видал я аналогичные устройства, которые прорисовывали экран по несколько секунд – «небо и земля». Сам драйвер естественно написан на ассемблере под 32 разрядной архитектурой ARM для соответствующего контроллера. В процессе работы я также столкнулся с двумя индикаторами: черно-белый и бело-черный, то есть инверсный. Писать драйвер для каждого, естественно не целесообразно и подстраивать функции рисования изображения тоже. Поэтому я сделал прямо в драйвере возможность переключения инверсии в режиме рантайма, и основной программе даже знать не надо какой там индикатор, за это будет отвечать драйвер. Также, драйвер я написал так, чтобы его можно было применять для любых индикаторов на основе контролера SED1335 с различным разрешением экрана.

Теперь Canvas. Это компонент с соответствующими методами и данными. Пишу я на C++ и компонент, соответственно, создан на классах. Но при желании его можно перевести на структуры и статические функции рисования для C.
Немного опишу типии, применяемые в данном компоненте: 
enum TColor – цвет;
Styles[] – массив заливок;
enum TAngle – угол поворота изображения;
TsRect – класс работы с координатами;
TBitMap – класс, описывающий какую либо картинку;
Font[] – массив данных шрифтов;
TCanvas – непосредственно сам класс рисования изображения.
Что умеет TCanvas. Имея опыт работы с графическими индикаторами, я сразу поставил для себя задачу, что компонент должен уметь ограничивать область рисования. То есть, устанавливаться ограничительное окно, в котором можно рисовать, а за пределами его информация должна быть незатронутой. Это необходимо когда надо восстановить часть изображения не затронув рядом лежащую информацию или просто ограничить, например, текст, чтобы он не вылез за границы поля, в котором он должен быть отображен. Так у канвы появилось ограничивающее окно TsRect Win. Возможности наложения изображения AND, OR, XOR в процессе эволюции отмерла, так как необходимость в них появляется крайне редко, а нагрузку на малый цикл рисования несет большую. А с вводом прозрачного цвета – практически полностью отпала.
Изучив все необходимое для полноценного рисования задачи – написал следующие функции:
Рисование точки заданным цветом;
Заливка прямоугольника с заданным стилем заливки, цветом фона и чернил;
Рисование картинки хранящейся в объекте TBitMap под разным углом поворота (0, 90, 180, 270). А учитывая, что канва также состоит из TBitMap – то можно как рисовать на канве, так и копировать с нее кусок изображения;
Выводить текст заданным шрифтом, цветом фона, чернил и углом поворота. Шрифт имеет плавающую ширину символов. Также при выводе текста сделал ограничение выводимого текста, когда нужно вывести текст с переносам по словам, и автоматическим ограничением вывода при появления в тексте символа переноса строки. Функция возвращает количество выведенных символов. На реализацию возможности выводить жирный, курсивный и подчеркнутый текст у меня просто не хватило сил;
Рисование произвольной линии заданным стилем пунктирности, цвета фона и чернил. Функция принимает стиль линии и возвращает этот же стиль модифицированный после рисования, чтобы можно было продолжить с этой же позиции пунктирности;
Ну и другие вспомогательные функции для рисования.
Все эти функции также ограничиваются областью прорисовки не искажая свою форму, например, при выводе наклонной линии, если бы ее координаты пользователь ограничил сам.
Вся библиотека также написана на ассемблере для ARM архитектуры. Из всего перечисленного я так и не дописал вывод текста под углом 90, 180 и 270 градусов, и рисование картинки сделал только под углом 0 и 90 градусов. Все функции отлажены и вылизаны до последнего байтика, и оптимизированы на максимальную скорость работы.

Если кому-то будет интересно применить у себя эту графическую библиотеку – могу выложить все исходники. Возможно, кто-то закончит мою работу, на которую я потратил почти год. Просто жалко потраченных ночами сил, которые никто не сможет по достоинству оценить.


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
Mazzi
Дата 18.3.2010, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Очень интересно, выкладывай.


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
Ivan.
Дата 22.3.2010, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Я буду постепенно выкладывать и рассказывать как и что работает.
Среда разработки IAR ARM.
Начнем с драйвера.
Драйвер написан на ассемблере и компилируется взависимости от продефайненых констант.
Для работы с индикатором необходимо продефайнить следующие константы:
LCD_PORT=указатель_на_порт (например AT91C_BASE_PIOB);
LCD_IRQ=идентификатор_прерывания (AT91C_ID_FIQ, можно использовать AT91C_ID_PIOA или AT91C_ID_PIOB и ускорить их до FIQ);
LCD_DATA=номер_начального_бита_данных (например 0);
LCD_A0=номер_бита_A0 (например 18);
LCD_WR=номер_бита_WR (например 19);
LCD_RD=номер_бита_RD (например 20);
LCD_CS=номер_бита_CS (например 17);
LCD_RES=номер_бита_RES (например 16).
8 портов данных, обязательно должны быть расположенны по порядку.
Также необходимо продублировать ножку D6 на FIQ прерывание либо ускорить прерывание порта IO до FIQ.
Файл WGdrv.h
Это интерфейс работы с драйвером. В конструкторе указываем размер нашего экрана. Для запуска выгрузки данных на экран достаточно вызвать метод Draw, указав область данных где лежит виртуальный экран. Драйвер построен так, что индикатор становится PlagAndPlay, его можно отключать и подключать в любой момент, или если где то отвалится контакт, а потом появится, в общем при каждом цикле индикатор полностью заново инициализируется и входит в нормальный режим работы.
Код
#ifndef WGdrvH
#define WGdrvH
//---------------------------------------------------------------------------
class TWGdrv { //Класс драйвера графического индикатора
public:
    int Index;    //Счетчик текущего кадра. По нему определяется готовность выдавать следующий кадр
    short Invert;    //Флаг инверсного индикатора. Значимым является нулевой бит
private:    //Служебные переменные драйвера
    unsigned short Scr;    //Указатель банка данных экрана
    unsigned short Size;    //Размер экрана в байтах
    unsigned char Width;    //Ширина экрана в байтах
    unsigned char Height;    //Высота экрана в байтах
    const void* Pos;    //Позиция чтения экрана с оперативки
    const void* End;    //Конечная позиция экрана в оперативке
private:
    static void WGdrvFiq();    //Обработчик прерывания FIQ. В нем происходит выгрузка данных на экран
public:
    TWGdrv(short Width, short Height);    //Конструктор класса. В нем происходит инициализация портов и настройка режима FIQ
    void Draw(const void* Data);    //Функция запуска выгрузки данных. Можно вызывать в любой момент, даже не дожидаясь окончания выгрузки данных на экран
};
//---------------------------------------------------------------------------
#endif

Файл WGdrv_v1.s79
Если здесь будет чтото не понятно (а оно будет непонятно, потому что сейчас и сам не вспомню что я тут написал) и интересно в этом разобраться - пишите, буду расписывать подробнее.
Код
#if defined AT91SAM7S128
#include "..\AT91SAM7S128_inc.h"
#elif defined AT91SAM7X256
#include "..\AT91SAM7X256_inc.h"
#else error "Контроллер не определен"
;//---------------------------------------------------------------------
#define _Index 0
#define _Invert 4
#define _Scr 6
#define _Size 8
#define _Width 10
#define _Height 11
#define _Pos 12
#define _End 16
#define PIO LCD_PORT - AT91C_BASE_AIC
;//---------------------------------------------------------------------------
#define cSystem 0x40
    #define _st1M0_ 0x01
    #define _st1M1_ 0x02
    #define _st1M2_ 0x04
    #define _st1WS_ 0x08
    #define _st1_1_ 0x10
    #define _st1IV_ 0x20
    #define _st1TL_ 0x40
    #define _st1DR_ 0x80
    #define _st2WF_ 0x80
#define cScroll 0x44
#define cOvlay 0x5B
    #define _olMX0_ 0x01
    #define _olMX1_ 0x02
    #define _olDM1_ 0x04
    #define _olDM2_ 0x08
    #define _olOV_  0x10
#define cOff 0x58
#define cRight 0x4C
#define cOn 0x59
    #define _onOf_ 0x00
    #define _onOn_ 0x01
    #define _onF1_ 0x02
    #define _onF2_ 0x03
    #define _onC_ 0
    #define _onP1_ 2
    #define _onP2_ 4
    #define _onP3_ 6
#define cAdrW 0x46
#define cWrite 0x42
;//---------------------------------------------------------------------------
LCDData MACRO rd, Val
    STR    WR,    [AIC,    #PIO + PIO_CODR]
    IF _args >= 2
        MOV    rd,    =Val << LCD_DATA
    ELSE IF LCD_DATA > 0
        MOV    rd,    rd,    LSL #LCD_DATA
    ENDIF
    STR    rd,    [AIC,    #PIO + PIO_SODR]
    STR    WR,    [AIC,    #PIO + PIO_SODR]
    ENDM
LCDCom MACRO rd, Val
    STR    A0,    [AIC,    #PIO + PIO_SODR]
    LCDData    rd,    Val
    STR    A0,    [AIC,    #PIO + PIO_CODR]
    ENDM
LCDPut MACRO
    LDRB    Temp,    [Data],    #2
    STR    WR,    [AIC,    #PIO + PIO_CODR]
    EOR    Temp,    Mask,    Temp,    LSL #LCD_DATA
    STR    Temp,    [AIC,    #PIO + PIO_SODR]
    STR    WR,    [AIC,    #PIO + PIO_SODR]
    ENDM
Wait MACRO rd, Val
    LOCAL loop
    ldr rd, =Val
    loop:
    subs rd, rd, #1
    bne loop
    ENDM
;//---------------------------------------------------------------------------
    PUBLIC _ZN6TWGdrv8WGdrvFiqEv
    PUBLIC _ZN6TWGdrvC1Ess
    PUBLIC _ZN6TWGdrv4DrawEPKv
;//---------------------------------------------------------------------------
    SECTION text:CODE:NOROOT(2)
    ARM
_ZN6TWGdrvC1Ess:
#define This R0
#define Width R1
#define Height R2
#define Temp R12
#define CP R3
    MRS    CP,    cpsr            ; Original PSR value
    BIC    Temp,    CP,    #0x1F        ; Clear the mode bits
    ORR    Temp,    Temp,    #0x11        ; Set FIQ mode bits
    MSR    cpsr_c,    Temp            ; Change the mode
    MOV    SP,    This            ; FIQ_STACK = This
    MSR    cpsr_c,    CP            ; Change the mode
    ADD    Width,    Width,    #7
    MOV    Width,    Width,    LSR #3
    MUL    Temp,    Height,    Width
    STRB    Width,    [This,    #_Width]
    STRB    Height,    [This,    #_Height]
    STRH    Temp,    [This,    #_Size]
    MOV    Temp,    #0
    STR    Temp,    [This,    #_Index]
    STRH    Temp,    [This,    #_Invert]
    STRH    Temp,    [This,    #_Scr]
    STR    Temp,    [This,    #_Pos]
    STR    Temp,    [This,    #_End]
#define AIC Width
    LDR    AIC,    =AT91C_BASE_AIC
    LDR    Temp,    =(1 << LCD_WR) | (1 << LCD_RD) | (1 << LCD_CS)
    STR    Temp,    [AIC,    #PIO + PIO_SODR]
    LDR    Temp,    =(0xFF << LCD_DATA) | (1 << LCD_WR) | (1 << LCD_RD) | (1 << LCD_CS) | (1 << LCD_A0) | (1 << LCD_RES)
    STR    Temp,    [AIC,    #PIO + PIO_PER]
    STR    Temp,    [AIC,    #PIO + PIO_OER]
    STR    Temp,    [AIC,    #PIO + PIO_MDDR]
    Wait    Temp,    0xA600
    MOV    Temp,    #1 << LCD_RES
    STR    Temp,    [AIC,    #PIO + PIO_SODR]
    Wait    Temp,    0xA600
    MOV    Temp,    #1 << LCD_CS
    STR    Temp,    [AIC,    #PIO + PIO_CODR]
    Wait    Temp,    0xCF00
    MOV    Temp,    #1 << LCD_IRQ;AT91C_ID_FIQ
    STR    Temp,    [AIC,    #AIC_IDCR]
    STR    Temp,    [AIC,    #AIC_FFER]
    IF (LCD_IRQ == AT91C_ID_PIOA) || (LCD_IRQ == AT91C_ID_PIOB)
        MOV    Temp, #1 << 6
        STR    Temp,    [AIC,    #PIO + PIO_IER]
    ENDIF
    LDR    This,    =_ZN6TWGdrv8WGdrvFiqEv
    STR    This,    [AIC,    #AIC_SVR + AT91C_ID_FIQ * 4]
    MOV    Temp,    #AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST
    STR    Temp,    [AIC,    #AIC_SMR + AT91C_ID_FIQ * 4]
    BX    LR
#undef This
#undef Width
#undef Height
#undef Temp
#undef AIC
;//---------------------------------------------------------------------------
_ZN6TWGdrv4DrawEPKv:
#define This R0
#define Data R1
#define Temp R2
#define WR R3
#define AIC R12
    LDR    AIC,    =AT91C_BASE_AIC
    MOV    Temp,    #1 << LCD_IRQ;AT91C_ID_FIQ
    STR    Temp,    [AIC,    #AIC_IDCR]
    MOV    Temp,    #1 << LCD_RD
    STR    Temp,    [AIC,    #PIO + PIO_SODR]
    MOV    WR,    #0xFF << LCD_DATA
    STR    WR,    [AIC,    #PIO + PIO_OER]
    STR    Data,    [This,    #_Pos]
    LDRH    Temp,    [This,    #_Size]
    ADD    Data,    Data,    Temp,    LSL #1
    STR    Data,    [This,    #_End]
#define A0 Data
    MOV    A0,    #1 << LCD_A0
    ORR    WR,    WR,    #1 << LCD_WR
    LCDCom    Temp,    cAdrW
    LDRH    Temp,    [This,    #_Scr]
    AND    Data,    Temp,    #0xFF
    LCDData    Data
    MOV    A0,    #1 << LCD_A0
    MOV    Temp,    Temp,    LSR #8
    LCDData    Temp
    LCDCom    Temp,    cSystem
    LCDData    Temp,    _st1_1_|_st1IV_        ;0x30    ;Нет коррекции верхней строки экрана (для текста)
    LCDData    Temp,    _st2WF_|7        ;0x87    ;Период сигнала управления кадром (AC), ширина символа 8 бит
    LCDData    Temp,    7            ;0x07    ;Высота символа 8 бит
    LDRB    Temp,    [This,    #_Width]    ;    ;Количество байт на строку символов
    SUB    Temp,    Temp,    #1
    LCDData    Temp
    ADD    Temp,    Temp,    #6        ;    ;Длинна строки + гашение
    LCDData    Temp
    LDRB    Temp,    [This,    #_Height]    ;    ;Высота экрана
    SUB    Temp,    Temp,    #1
    LCDData    Temp
    LDRB    Temp,    [This,    #_Width]    ;    ;Размер виртуальной строки
    LCDData    Temp
    LCDData    Temp,    0
    LCDCom    Temp,    cOvlay
    LCDData    Temp,    _olMX0_|_olDM1_|_olDM2_    ;0x0D    ;Режим наложения слоев (^), Типы слоев (графические)
    LCDCom    Temp,    cRight
    LCDCom    Temp,    cOn
    LCDData    Temp,    (_onOn_<<_onP1_)|(_onF2_<<_onP2_)    ;0x34;Режим мигания экранов
    LCDCom    Temp,    cWrite
    MOV    WR,    #0xFF << LCD_DATA
    STR    WR,    [AIC,    #PIO + PIO_ODR]
    MOV    Temp,    #1 << LCD_RD
    STR    Temp,    [AIC,    #PIO + PIO_CODR]
    MOV    Temp,    #1 << LCD_IRQ;AT91C_ID_FIQ
    STR    Temp,    [AIC,    #AIC_ICCR]
    STR    Temp,    [AIC,    #AIC_IECR]
    BX    LR
#undef This
#undef Data
#undef A0
#undef Temp
#undef WR
#undef AIC
;//---------------------------------------------------------------------------
_ZN6TWGdrv8WGdrvFiqEv:
#define AIC R8
#define Data R9
#define WR R10
#define Mask R11
#define Temp R12
#define This SP
    MOV    Temp,    #1 << LCD_RD
    STR    Temp,    [AIC,    #PIO + PIO_SODR]
    MOV    WR,    #0xFF << LCD_DATA
    STR    WR,    [AIC,    #PIO + PIO_OER]
    ORR    WR,    WR,    #1 << LCD_WR
    LDR    Data,    [This,    #_Pos]
    TST    Data,    #1
    LDRHEQ    Temp,    [This,    #_Invert]
    TSTEQ    Temp,    #1
    MOVEQ    Mask,    #0xFF << LCD_DATA
    MOVNE    Mask,    #0
    LCDPut
    LCDPut
    LCDPut
    LCDPut
    LCDPut
    LCDPut
    LCDPut
    LCDPut
    LDR    Temp,    [This,    #_End]
    CMP    Data,    Temp
    STRCC    Data,    [This,    #_Pos]
    BCC    _ZN6TWGdrv8WGdrvFiqEv_End
    LDRH    Temp,    [This,    #_Size]
    SUBEQ    Data,    Data,    Temp,    LSL #1
    ADDEQ    Data,    Data,    #1
    STREQ    Data,    [This,    #_Pos]
    LDRNE    Data,    [This,    #_Index]
    ADDNE    Data,    Data,    #1
    STRNE    Data,    [This,    #_Index]
#define A0 Data
    MOV    A0,    #1 << LCD_A0
    LCDCom    Temp,    cScroll
#undef A0
    LDRH    Temp,    [This,    #_Scr]
    ORR    Temp,    Temp,    Temp,    LSL #16
    LDRH    Data,    [This,    #_Size]
    SUBEQ    Temp,    Temp,    Data,    LSL #16
    ADDNE    Temp,    Temp,    Data,    LSL #16
    ADDNE    Data,    Temp,    Data,    LSL #1
    STRHNE    Data,    [This,    #_Scr]
    AND    Data,    Temp,    #0xFF
    LCDData    Data
    MOV    Temp,    Temp,    LSR #8
    AND    Data,    Temp,    #0xFF
    LCDData Data
    LDRB    Data,    [This,    #_Height]
    LCDData Data
    MOV    Temp,    Temp,    LSR #8
    AND    Data,    Temp,    #0xFF
    LCDData Data
    MOV    Temp,    Temp,    LSR #8
    LCDData Temp
    LDRB    Data,    [This,    #_Height]
    LCDData Data
    MOVNE    Temp,    #1 << LCD_IRQ;AT91C_ID_FIQ
    STRNE    Temp,    [AIC,    #AIC_IDCR]
    SUBSNE    PC,    LR,    #4
#define A0 Data
    MOV    A0,    #1 << LCD_A0
    LCDCom    Temp,    cWrite
#undef A0
_ZN6TWGdrv8WGdrvFiqEv_End:
    MOV    WR,    #0xFF << LCD_DATA
    STR    WR,    [AIC,    #PIO + PIO_ODR]
    MOV    Temp,    #1 << LCD_RD
    STR    Temp,    [AIC,    #PIO + PIO_CODR]
    MOV    Temp,    #1 << LCD_IRQ;AT91C_ID_FIQ
    STR    Temp,    [AIC,    #AIC_ICCR]
    SUBS    PC,    LR,    #4
#undef AIC
#undef Data
#undef WR
#undef Mask
#undef Temp
#undef This
;//---------------------------------------------------------------------------
    END


Добавлено @ 09:38
Забыл о главном - инициализация вектора прерывания.
В файле Startup.s в разделе векторов, прописать обработку прерывания FIQ строкой:
__fiq_handler:
        ldr pc, [r8, #AIC_FVR]


Это сообщение отредактировал(а) Ivan. - 23.3.2010, 10:13


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
Ivan.
Дата 1.4.2010, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Рассмотрим класс TCanvas. Чтобы не было дубликатов типов, я заключил эту библиотеку в namespace Graph.
Файл Canvas.h
Код
#ifndef CanvasH
#define CanvasH
//---------------------------------------------------------------------------
#include <stddef.h>
#include "Rect/Rect.h"
#include "BitMap.h"
//---------------------------------------------------------------------------
namespace Graph {
//---------------------------------------------------------------------------
    enum TColor { clBlack, clGray, clWhite, clClear}; //Перечисляемый тип цветов, расположен по порядку от темного к светлому и плюс прозрачный.
    struct TColors {    //Структура цветов чернил и фона, применяемая в классе TCanvas.
        TColor Pen:2;    //Цвет чернил размером 2 бита.
        TColor Brush:6;    //Цвет фона размером 2 бита + 4 свободных бита включил сюда же для ускорения работы с памятью.
    };
    extern const unsigned char Styles[][8];    //Декларация массива стандартных заливок. Каждая заливка состоит из 8 байт, тоесть квадрат 8 на 8 точек. Для ускорения рисования массив должен быть выровнен до 8 байт, чтобы младшие 3 бита адреса начала массива были равны 0. Это не отниет много памяти, но существенно ускорит работу рисования.
    enum EStyle {    //Перечисляемый тип названий стандартных заливок.
        sSolid,  // #####
        sClear,  //
        sFrac,   // / / /
        sSlash,  // \ \ \ 
        sGrid,   // +-+-+
        sCross,  // X X X
        sHor,    // -----
        sVert,   // | | |
        sSFrac,  // /////
        sSSlash, // \\\\\ 
        sSGrid,  // +++++
        sSCross, // XXXXX
        sSHor,   // =====
        sSVert,  // |||||
        sShade,  // xxxxx
        sCage,   // %%%%%
    };
    enum TAngle {angle0, angle90, angle180, angle270};    //Перечисляемый тип угла поворота изображения.
    class TCanvas {
    public:
        TBitMap* BitMap;    //Область памяти виртуального экрана
        TsRect Win;    //Ограничивающее окно
        const unsigned char* Style;    //Указатель но массив заливки
        const void* Font;    //Указатель но шрифт
        unsigned char CharSet;    //Номер применяемого чарсета
        TColors Color;    //Цвета
        TAngle Angle:8;    //Угол поворота
        TCanvas(short Width, short Height)    //Конструктор
            :    BitMap(Graph::BitMap(Width, Height)),
                Win(sRect(0, 0, Width, Height)),
                Style(Styles[sSolid]),
                Font(NULL),
                CharSet(0),
                Angle(angle0)
        {Color.Pen = clBlack; Color.Brush = clWhite;}
        void Pixel(short x, short y, TColor Color);    //Метод рисования точки
        void Fill(short l, short t, short r, short b);    //Метод рисования прямоугольника
        void Draw(short x, short y, const TBitMap* BitMap);    //Метод рисования картинки
        inline void Draw(short x, short y, const void* BitMap){Draw(x, y, (const TBitMap*)BitMap);}    //Перегрузка метода рисования картинки
        int Out(short x, short y, const char* Text, int MaxLen = -1);    //Метод вывода текста
        u32 Line(short x1, short y1, short x2, short y2, u32 Style = 0xFFFFFFFF);    //Метод рисования линии
        inline int FontHeight() const {return Font ?*(u8*)Font :0;}    //Функция возвращающая высоту шрифта
        int TextWidth(const char* Text) const;    //Функция возвращающая ширину текста. Возвращает самую широкую строку в тексте с учетом символа переноса строки. Символ переноса строки принят за \n. Символ \r в шрифте можно нарисовать нулевой ширины, чтобы он не рисовался.
        int TextHeight(const char* Text) const;    //Функция возвращающая высоту текста с учетом символов переноса строк. Строка нулевой длинны - возвращает нулевую высоту.
        int CharWrap(const char* Text, int Width);    //Функция возвращающая количество символов, умещающихся в заданную ширину. символы пробела могут заходить за пределы ширины.
        int WordWrap(const char* Text, int Width);    //Функция возвращающая количество символов, умещающихся в заданную ширину при переносе текста по словам, то есть символа пробела или переноса строки. символы пробела могут заходить за пределы ширины.
        TsRect Size() {return sRect(0, 0, BitMap->Width, BitMap->Height);}    //Функция возвращающая прямоугольник размера экрана.
    };
//---------------------------------------------------------------------------
};
#endif

Дополнительные типы, которые были здесь применены - это TsRect и TBitMap. Рассмотрим их по порядку.
Файл Rect.h
Код
#ifndef RectH
#define RectH
//---------------------------------------------------------------------------
// TTRect - это шаблонный класс, определяющий прямоугольник. Координаты l и t - не строгие, а r и b - строгие, то есть размер задается от l до r-1 и от t до b-1. С такими ограничениями гараздо удобнее работать.
// В данном типе определены всевозможные операторы: сложение, вычитание, отрицание, умножение, деление, объединение и слияние, а также проверка на действительность (operator bool() - возвращает истину, если l<r и t<b) и оператор нормализации прямоугольника (operator !).
template<class T>
class TTRect    // [L, R) & [T, B)
{
public:
    T l, t, r, b;
    inline TTRect<T>  operator -  ()                   const { TTRect<T> Res = {-l, -t, -r, -b}; return Res; }
    template<class Q>
    inline TTRect<T>& operator  = (const TTRect<Q>& R)       { l  = R.l; t  = R.t; r  = R.r; b  = R.b; return *this; }
    inline TTRect<T>& operator += (const TTRect<T>& R)       { l += R.l; t += R.t; r += R.r; b += R.b; return *this; }
    inline TTRect<T>& operator -= (const TTRect<T>& R)       { l -= R.l; t -= R.t; r -= R.r; b -= R.b; return *this; }
    inline TTRect<T>& operator *= (const TTRect<T>& R)       { l *= R.l; t *= R.t; r *= R.r; b *= R.b; return *this; }
    inline TTRect<T>& operator /= (const TTRect<T>& R)       { l /= R.l; t /= R.t; r /= R.r; b /= R.b; return *this; }
    inline TTRect<T>  operator +  (const TTRect<T>& R) const { TTRect<T> Res = {l + R.l, t + R.t, r + R.r, b + R.b}; return Res; }
    inline TTRect<T>  operator -  (const TTRect<T>& R) const { TTRect<T> Res = {l - R.l, t - R.t, r - R.r, b - R.b}; return Res; }
    inline TTRect<T>  operator *  (const TTRect<T>& R) const { TTRect<T> Res = {l * R.l, t * R.t, r * R.r, b * R.b}; return Res; }
    inline TTRect<T>  operator /  (const TTRect<T>& R) const { TTRect<T> Res = {l / R.l, t / R.t, r / R.r, b / R.b}; return Res; }
    inline TTRect<T>& operator !  ()                         { if (l > r) l ^= r, r ^= l, l ^= r; if (t > b) t ^= b, b ^= t, t ^= b; return *this; }
    inline TTRect<T>& operator &= (const TTRect<T>& R)       { l = l >= R.l ?l :R.l; t = t >= R.t ?t :R.t; r = r <= R.r ?r :R.r; b = b <= R.b ?b :R.b; return *this; }
    inline TTRect<T>& operator |= (const TTRect<T>& R)       { l = l <= R.l ?l :R.l; t = t <= R.t ?t :R.t; r = r >= R.r ?r :R.r; b = b >= R.b ?b :R.b; return *this; }
    inline TTRect<T>  operator &  (const TTRect<T>& R) const { TTRect<T> Res = {l >= R.l ?l :R.l, t >= R.t ?t :R.t, r <= R.r ?r :R.r, b <= R.b ?b :R.b}; return Res; }
    inline TTRect<T>  operator |  (const TTRect<T>& R) const { TTRect<T> Res = {l <= R.l ?l :R.l, t <= R.t ?t :R.t, r >= R.r ?r :R.r, b >= R.b ?b :R.b}; return Res; }
    inline            operator bool()                  const { return l < r && t < b; }
    template<class Q>
    inline            operator TTRect<Q>()             const { TTRect<Q> Res = {l, t, r, b}; return Res; }
};
//---------------------------------------------------------------------------
typedef TTRect<signed char> TcRect;
typedef TTRect<short> TsRect;
typedef TTRect<int> TiRect;
inline TsRect sRect() { TsRect Res = {0, 0, 0, 0}; return Res; }
inline TsRect sRect(short l, short t, short r, short b) { TsRect Res = {l, t, r, b}; return Res; }
//---------------------------------------------------------------------------
#endif

Файл BitMap.h
Код
#ifndef BitMapH
#define PitMapH
//---------------------------------------------------------------------------
namespace Graph {
    template <short W, short H>
    struct SBitMap {
        enum {Cols = (W + 7) / 8, Rows = H, Size = Cols * Rows};
        short Width, Height;
        unsigned short Data[Size];
    };
    typedef SBitMap<1, 1> TBitMap;
    inline TBitMap* BitMap(short Width, short Height){
        int Size = ((Width + 7) >> 3) * Height;
        TBitMap* Res = (TBitMap*)new unsigned short[Size + 2];
        if (Res){
            Res->Width = Width;
            Res->Height = Height;
            for (int i = 0; i < Size; i++)
                Res->Data[i] = 0x00FF;
        }
        return Res;
    }
};
//---------------------------------------------------------------------------
#endif



Это сообщение отредактировал(а) Ivan. - 1.4.2010, 08:53


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
Ivan.
Дата 1.4.2010, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Дальше самое сложное - сам код функций. Все функции написаны на ассемблере, но к каждой команде я попытался написать коментарий в виде сишной команды, чтобы было хоть немного понятней.
Файл Canvas.s79 (начало)
Код
;Макрос взятия элемента таблицы.
GetTab MACRO rd, Val, Temp, OffSet
        LOCAL CurPoiter
        CurPoiter:
                add Temp, Val, #(OffSet - CurPoiter - 12) / 4
                ldr rd, [PC, Temp, LSL #2]
        ENDM
;//---------------------------------------------------------------------------
;Константы и Offset полей класса TCanvas. Они должны совпадать с реальным расположением полей в классе.
#define _BitMap 0
#define _Win_l  4
#define _Win_t  6
#define _Win_r  8
#define _Win_b  10
#define _Style  12
#define _Font   16
#define _CSet   20
#define _Color  21
#define _Angle  22
#define _Width  0
#define _Height 2
#define _Data   4
#define _angle0 0
#define _angle90 1
#define _angle180 2
#define _angle270 3
;//---------------------------------------------------------------------------
        RSEG    ICODE:CODE:ROOT(2)
        PUBLIC _ZN5Graph7TCanvas5PixelEssNS_6TColorE
        PUBLIC _ZN5Graph7TCanvas4FillEssss
        PUBLIC _ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE
        PUBLIC _ZN5Graph7TCanvas3OutEssPKci
        PUBLIC _ZN5Graph7TCanvas4LineEssssm
        PUBLIC _ZN5Graph6StylesE
        PUBLIC _ZNK5Graph7TCanvas9TextWidthEPKc
        PUBLIC _ZNK5Graph7TCanvas10TextHeightEPKc
        PUBLIC _ZN5Graph7TCanvas8CharWrapEPKci
        PUBLIC _ZN5Graph7TCanvas8WordWrapEPKci
        ARM
;Массив стандартных заливок
        ALIGNRAM 3
_ZN5Graph6StylesE:
        DC8 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF      ; ##### sSolid
        DC8 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00      ;       sClear
        DC8 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80      ; / / / sFrac
        DC8 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01      ; \ \ \ sSlash
        DC8 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0x10      ; +-+-+ sGrid
        DC8 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81      ; X X X sCross
        DC8 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00      ; ----- sHor
        DC8 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10      ; | | | sVert
        DC8 0x11, 0x22, 0x44, 0x88, 0x11, 0x22, 0x44, 0x88      ; ///// sSFrac
        DC8 0x88, 0x44, 0x22, 0x11, 0x88, 0x44, 0x22, 0x11      ; \\\\\ sSSlash
        DC8 0x11, 0xFF, 0x11, 0xFF, 0x11, 0x11, 0x11, 0x11      ; +++++ sSGrid
        DC8 0x99, 0x66, 0x66, 0x99, 0x99, 0x66, 0x66, 0x99      ; XXXXX sSCross
        DC8 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00      ; ===== sSHor
        DC8 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11      ; ||||| sSVert
        DC8 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA      ; xxxxx sShade
        DC8 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F      ; %%%%% sCage


Самая простая функция рисования точки на экране. Вся работа укладывается в 5 регистрах без использования стека. В данной функции произведена проверка на прозрачный цвет, нулевой указатель канвы и экрана, ограничивающего окна и размера экрана. Если все условия соблюдены, то вичисляется маска пикселя и рисуется в виртуальном экране.
Код
_ZN5Graph7TCanvas5PixelEssNS_6TColorE:
#define This    R0
#define x       R1
#define y       R2
#define Color   R3
#define Temp    R12
        CMP     Color,  #0x3                    ;if (Color >= cClear)
        BXCS    LR                              ;  return;
        CMP     This,   #0                      ;if (This == 0
        BXEQ    LR                              ;  return;
        CMP     x,      #0                      ;if (x < 0
        CMPGE   y,      #0                      ; || y < 0
        LDRSHGE Temp,   [This,  #_Win_l]        ; || x < This->Win.l
        CMPGE   x,      Temp
        LDRSHGE Temp,   [This,  #_Win_t]        ; || y < This->Win.t)
        CMPGE   y,      Temp
        BXLT    LR                              ;  return;
        LDRSH   Temp,   [This,  #_Win_r]        ;if (x >= This->Win.r
        CMP     x,      Temp
        LDRSHLT Temp,   [This,  #_Win_b]        ; || y >= This->Win.b)
        CMPLT   y,      Temp
        BXGE    LR                              ;  return;
#define BM      This
        LDR     BM,     [This,  #_BitMap]       ;BM = This->BitMap;
        CMP     BM,     #0                      ;if (BM == 0)
        BXEQ    LR                              ;  return;
        LDRSH   Temp,   [BM,    #_Height]       ;if (y >= BM->Height
        CMP     y,      Temp
        LDRSHLT Temp,   [BM,    #_Width]        ; || x >= BM->Width
        CMPLT   x,      Temp
        BXGE    LR                              ;  return;
        ADD     Temp,   Temp,   #7              ;Temp += 7;
        MOV     Temp,   Temp,   LSR #3          ;Temp /= 8;
        MUL     Temp,   y,      Temp            ;Temp *= y;
        ADD     Temp,   Temp,   x,      LSR #3  ;Temp += x / 8;
        ADD     BM,     BM,     Temp,   LSL #1  ;BM += Temp * 2;
        AND     x,      x,      #7              ;x &= 7;
#define Mask    y
        MOV     Mask,   #0x80                   ;Mask = 0x80;
        ORR     Mask,   Mask,   #0x8000         ;Mask |= 0x8000;
        MOV     Mask,   Mask,   LSR x           ;Mask >>= x;
        TST     Color,  #1                      ;if (Color & 1)
        ORRNE   Color,  Color,  #0xFF << 8      ;  Color |= 0xFF << 8;
        TST     Color,  #2                      ;if (Color & 2)
        ORRNE   Color,  Color,  #0xFF << 0      ;  Color |= 0xFF << 0;
        BICEQ   Color,  Color,  #0xFF << 0      ;else Color &= ~(0xFF << 0);
        LDRH    Temp,   [BM,    #_Data]         ;Temp = *(BM + Temp);
        BIC     Temp,   Temp,   Mask            ;Temp &= ~Mask;
        AND     Color,  Color,  Mask            ;Color &= Mask;
        ORR     Temp,   Temp,   Color           ;Temp |= Color;
        STRH    Temp,   [BM,    #_Data]         ;*(BM + Temp) = Temp;
        BX      LR                              ;return;
#undef Mask
#undef BM
#undef This
#undef x
#undef y
#undef Color
#undef Temp
;//---------------------------------------------------------------------------



--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
Ivan.
Дата 6.4.2010, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Следующая по сложности функция - это рисование прямоугольника.
Также производится проверка на указатели, граничивающее окно и т.п.
Код
_ZN5Graph7TCanvas4FillEssss:
#define This    R0
#define l       R1
#define t       R2
#define r       R3
#define b       R4
#define BM      R5
#define Mask    R6
#define TMask   R7
#define D       R8
#define Width   R9
#define Next    R10
#define Temp    R12
        CMP     This,   #0                              ;if (This == 0)
        BXEQ    LR                                      ;  return;
        STMDB   SP!,    {R4 - R10}
        LDR     BM,     [This,  #_BitMap]               ;if ((BM = This->BitMap)
        CMP     BM,     #0                              ; == 0
        BEQ     _ZN5Graph7TCanvas4FillEssss_Exit        ;  return;
        LDR     b,      [SP,    #28]
        CMP     l,      #0                              ;if (l < 0)
        MOVLT   l,      #0                              ;  l = 0;
        CMP     t,      #0                              ;if (t < 0)
        MOVLT   t,      #0                              ;  t = 0;
        LDRSH   Temp,   [This,  #_Win_l]                ;if ((Temp = This->Win.l)
        CMP     l,      Temp                            ; > l)
        MOVLT   l,      Temp                            ;  l = Temp;
        LDRSH   Temp,   [This,  #_Win_t]                ;if ((Temp = This->Win.t)
        CMP     t,      Temp                            ; > t)
        MOVLT   t,      Temp                            ;  t = Temp;
        LDRSH   Temp,   [This,  #_Win_r]                ;if ((Temp = This->Win.r)
        CMP     r,      Temp                            ; < r)
        MOVGT   r,      Temp                            ;  r = Temp;
        LDRSH   Temp,   [This,  #_Win_b]                ;if ((Temp = This->Win.b)
        CMP     b,      Temp                            ; < b)
        MOVGT   b,      Temp                            ;  b = Temp;
        LDRSH   Width,  [BM],   #2                      ;if ((Width = *(s16*)BM++)
        CMP     r,      Width                           ; < r)
        MOVGT   r,      Width                           ;  r = Width;
        LDRSH   Temp,   [BM],   #2                      ;if ((Temp = *(s16*)BM++)
        CMP     b,      Temp                            ; < b)
        MOVGT   b,      Temp                            ;  b = Temp;
        CMP     l,      r                               ;if (l >= r
        CMPLT   t,      b                               ; || t >= b)
        BGE     _ZN5Graph7TCanvas4FillEssss_Exit        ;  return;
        AND     Temp,   l,      #7                      ;Temp = l & 7;
        MOV     TMask,  #0xFF                           ;TMask = 0xFF;
        MOV     Mask,   TMask,  LSR Temp                ;Mask = TMask >> Temp;
        SUB     r,      r,      #1                      ;r--;
        AND     Temp,   r,      #7                      ;Temp = r & 7;
        ADD     Temp,   Temp,   #1                      ;Temp++;
        MOV     TMask,  TMask,  ROR Temp                ;TMask >><= Temp;
        ORR     Mask,   Mask,   TMask,  LSR #8          ;Mask |= TMask >> 8;
        ORR     Mask,   Mask,   Mask,   LSL #8          ;Mask |= Mask << 8;
        ADD     Width,  Width,  #7                      ;Width += 7;
        MOV     Width,  Width,  LSR #3                  ;Width /= 8;
        MOV     Width,  Width,  LSL #1                  ;Width *= 2;
        MLA     b,      Width,  b,      BM              ;b = BM + Width * b;
        MLA     BM,     Width,  t,      BM              ;BM += Width * t;
        MOV     r,      r,      LSR #3                  ;r /= 8;
        ADD     r,      BM,     r,      LSL #1          ;r = BM + r * 2;
        MOV     l,      l,      LSR #3                  ;l /= 8;
        ADD     BM,     BM,     l,      LSL #1          ;BM += l * 2;
        ADD     Next,   Width,  BM                      ;Next = Width + BM;
        SUB     Next,   Next,   r                       ;Next -= r;
#define Style   l
        LDR     Style,  [This,  #_Style]                ;Style = This->Style;
        AND     Temp,   t,      #7                      ;Temp = t & 7;
        ADD     Style,  Style,  Temp                    ;Style += Temp;
#define Color   t
        LDRB    Color,  [This,  #_Color]                ;Color = This->Color;
        TST     Color,  #4                              ;if (Color & 4)
        ORRNE   Color,  Color,  #0xFF << 24             ;  Color |= 0xFF << 24;
        TST     Color,  #8                              ;if (Color & 8)
        ORRNE   Color,  Color,  #0xFF << 16             ;  Color |= 0xFF << 16;
        TST     Color,  #1                              ;if (Color & 1)
        ORRNE   Color,  Color,  #0xFF << 8              ;  Color |= 0xFF << 8;
        TST     Color,  #2                              ;if (Color & 2)
        ORRNE   Color,  Color,  #0xFF << 0              ;  Color |= 0xFF << 0;
        BICEQ   Color,  Color,  #0xFF << 0              ;else Color &= ~(0xFF << 0);
_ZN5Graph7TCanvas4FillEssss_Row:                        ;do {
#define S       This
        LDRB    S,      [Style],#1                      ;  S = *Style++;
        TST     Style,  #7                              ;  if (!(Style & 7))
        SUBEQ   Style,  Style,  #8                      ;    Style -= 8;
        ORR     S,      S,      #0xFF0000               ;  S |= 0xFF0000;
        EOR     S,      S,      S,      LSL #16         ;  S ^= S << 16;
        AND     Temp,   Color,  Color,  LSR #8          ;  Temp = Color & Color >> 8;
        BIC     S,      S,      Temp                    ;  S &= ~Temp;
        ORR     S,      S,      S,      LSL #8          ;  S |= S << 8;
        ORR     Temp,   S,      S,      LSR #16         ;  Temp = S | S >> 16;
        AND     S,      S,      Color                   ;  S &= Color;
        ORR     S,      S,      S,      LSR #16         ;  S |= S >> 16;
        AND     TMask,  Mask,   Temp                    ;  TMask = Mask & Temp;
_ZN5Graph7TCanvas4FillEssss_Col:                        ;  do {
        CMP     BM,     r                               ;    if (BM == r)
        ANDEQ   TMask,  TMask,  Mask,   LSR #16         ;      TMask &= Mask >> 16;
        LDRH    D,      [BM]                            ;    D = *BM;
        EOR     D,      D,      S                       ;    D ^= S;
        BIC     D,      D,      TMask                   ;    D &= ~TMask;
        EOR     D,      D,      S                       ;    D ^= S;
        STRHEQ  D,      [BM],   Next                    ;    *BM = D;
        STRHNE  D,      [BM],   #2                      ;    BM += BM == r ?Next :2;
        MOV     TMask,  Temp                            ;    TMask = Temp;
        BNE     _ZN5Graph7TCanvas4FillEssss_Col         ;  } while (BM != r);
        ADD     r,      r,      Width                   ;  r += Width;
        CMP     BM,     b                               ;}
        BCC     _ZN5Graph7TCanvas4FillEssss_Row         ;while (BM < b)
_ZN5Graph7TCanvas4FillEssss_Exit:
        LDMIA   SP!,    {R4 - R10}
        BX      LR
#undef This
#undef l
#undef t
#undef r
#undef b
#undef BM
#undef Mask
#undef TMask
#undef D
#undef Width
#undef Temp
#undef Style
#undef Color
#undef S
#undef Next
;//---------------------------------------------------------------------------



--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
Ivan.
Дата 6.4.2010, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Следующая функция - рисование картинки. В данной функции реализовано рисование под углом 0 градусов и 90 градусов.
Картинка в памяти хранится в виде:
2 байта - ширина;
2 байта - высота;
N байт - массив данных по 2 байта на каждые 8 точек.

Пример картинки:
Код
const unsigned short Pic[] = {
24, 24, //Ширина, Высота
0x00FF, 0x0000, 0x807F,   //                §§§§§§§§§§§§§§§§«»              
0x00FC, 0x7700, 0x201F,   //            §§§§§§«»«»«»§§«»«»«»§§§§«»          
0x01F8, 0x8077, 0x508F,   //          §§§§«»«»      §§        «»§§«»        
0x02F1, 0x00F7, 0x28C7,   //        §§§§«»          §§          «»§§«»      
0x04E3, 0x00FF, 0x14E3,   //      §§§§«»                          «»§§«»    
0x08C7, 0x00F7, 0x0AF1,   //    §§§§«»              §§              «»§§«»  
0x10CF, 0x00F7, 0x04F9,   //    §§«»                §§                «»§§  
0x108F, 0x00F7, 0x01FC,   //  §§§§«»                §§                  §§«»
0x209F, 0x00F7, 0x00FC,   //  §§«»                  §§                  §§§§
0x209F, 0x00F7, 0x02FC,   //  §§«»                  §§                  «»§§
0x209F, 0x00F7, 0x02FC,   //  §§«»                  §§                  «»§§
0x0087, 0x00F1, 0x00E0,   //  §§§§§§§§              §§§§§§        §§§§§§§§§§
0x209F, 0x00FE, 0x027C,   //  §§«»                        §§§§          «»§§
0x209F, 0x00FF, 0x029C,   //  §§«»                            §§§§      «»§§
0x108F, 0x00FF, 0x00EC,   //  §§§§«»                              §§    §§§§
0x508F, 0x00FF, 0x01FC,   //  «»§§«»                                    §§«»
0x18C7, 0x00FF, 0x00F9,   //    §§«»«»                                §§§§  
0x08C7, 0x00FF, 0x0AF1,   //    §§§§«»                              «»§§«»  
0x04E3, 0x00FF, 0x14E3,   //      §§§§«»                          «»§§«»    
0x03F0, 0x00F7, 0x28C7,   //        §§§§«»«»        §§          «»§§«»      
0x01F8, 0x8077, 0x108F,   //          §§§§«»«»      §§        §§§§«»        
0x00FC, 0x1600, 0x201F,   //            §§§§§§§§§§«»§§«»«»§§§§§§«»          
0x00FF, 0x8000, 0x807F,   //                «»§§§§§§§§§§§§§§«»              
0x00FF, 0x00FF, 0x00FF,   //                                                
};


Добавлено через 2 минуты и 9 секунд
Код
_ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE:
#define This    R0
#define x       R1
#define y       R2
#define Pic     R3
#define BM      R4
#define l       R5
#define t       R6
#define r       R7
#define b       R8
#define bw      R9
#define bh      R10
#define pw      R11
#define ph      R12
#define Temp    LR
        CMP     This,   #0                              ;if (This == 0
        CMPNE   Pic,    #0                              ; || Pic == 0)
        BXEQ    LR                                      ;  return;
        STMDB   SP!,    {R4 - R11, LR}
        LDR     BM,     [This,  #_BitMap]               ;if ((BM = This->BitMap)
        CMP     BM,     #0                              ; == 0
        BEQ     _ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_Exit;  return;
        LDRSH   pw,     [Pic],  #2                      ;pw = *(s16*)Pic++;
        LDRSH   ph,     [Pic],  #2                      ;ph = *(s16*)Pic++;
        LDRSH   bw,     [BM],   #2                      ;bw = *(s16*)BM++;
        LDRSH   bh,     [BM],   #2                      ;bh = *(s16*)BM++;
        CMP     pw,     #0                              ;if (pw <= 0
        CMPGT   ph,     #0                              ; || ph <= 0
        CMPGT   bw,     #0                              ; || bw <= 0
        CMPGT   bh,     #0                              ; || bh <= 0)
        BLE     _ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_Exit;  return;
        LDRSH   l,      [This,  #_Win_l]                ;l = This->Win.l;
        LDRSH   t,      [This,  #_Win_t]                ;t = This->Win.t;
        LDRSH   r,      [This,  #_Win_r]                ;r = This->Win.r;
        LDRSH   b,      [This,  #_Win_b]                ;b = This->Win.b;
        CMP     l,      #0                              ;if (l < 0)
        MOVLT   l,      #0                              ;  l = 0;
        CMP     t,      #0                              ;if (t < 0)
        MOVLT   t,      #0                              ;  t = 0;
        CMP     r,      bw                              ;if (r > bw)
        MOVGT   r,      bw                              ;  r = bw;
        CMP     b,      bh                              ;if (b > bh)
        MOVGT   b,      bh                              ;  b = bh;
#define Angle   This
        LDRB    Angle,  [This,  #_Angle]                ;Angle = This->Angle;
        AND     Angle,  Angle,  #3                      ;Angle &= 3;
        LDR     PC,     [PC,    Angle,  LSL #2]
        NOP
        DC32 _ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_Angle0
        DC32 _ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_Angle90
        DC32 _ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_Angle180
        DC32 _ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_Angle270
#define Shift   Angle
_ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_Angle0:
        CMP     x,      l                               ;if (x >= l)
        ANDGE   Temp,   x,      #7                      ;  Temp = x & 7,
        RSBGE   Shift,  Temp,   #0                      ;  Shift = -Temp,
        MOVGT   l,      x                               ;  l = x;
        SUBLT   Shift,  l,      x                       ;else Shift = l - x,
        ANDLT   Temp,   l,      #7                      ;  Temp = l & 7,
        SUBLT   Shift,  Shift,  Temp                    ;  Shift += Temp,
        ADD     Shift,  Shift,  #8                      ;Shift += 8;
        SUB     Pic,    Pic,    #2                      ;(u16*)Pic--;
        MOV     Temp,   Shift,  LSR #3                  ;Temp = Shift / 8;
        AND     Shift,  Shift,  #7                      ;Shift &= 7;
        ORR     Shift,  Shift,  Temp,   LSL #8          ;Shift |= Temp << 8;
        ADD     x,      x,      pw                      ;x += pw;
        CMP     r,      x                               ;if (r > x)
        MOVGT   r,      x                               ;  r = x;
        CMP     l,      r                               ;if (l >= r)
        BGE     _ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_Exit;  return;
#define pb      bh
        ADD     pb,     pw,     #7                      ;pb += 7;
        MOV     pb,     pb,     LSR #3                  ;pb /= 8;
        MOV     pb,     pb,     LSL #1                  ;pb *= 2;
        SUBS    Temp,   t,      y                       ;if (t < y)
        MLAGT   Pic,    pb,     Temp,   Pic             ;  Pic += pb * Top,
        MOVLT   t,      y                               ;else if (y > t) t = y;
        ADD     y,      y,      ph                      ;y += ph;
        CMP     b,      y                               ;if (b > y)
        MOVGT   b,      y                               ;  b = y;
        CMP     t,      b                               ;if (t >= b)
        BGE     _ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_Exit;  return;
#define Mask    x
#define TMask   y
        SUB     r,      r,      #1                      ;r--;
        MOV     TMask,  #0xFF                           ;TMask = 0xFF;
        AND     Temp,   l,      #7                      ;Temp = l & 7;
        MOV     Mask,   TMask,  LSR Temp                ;Mask = TMask >> Temp;
        AND     Temp,   r,      #7                      ;Temp = r & 7;
        ADD     Temp,   Temp,   #1                      ;Temp++;
        MOV     TMask,  TMask,  ROR Temp                ;TMask >><= Temp;
        ORR     Mask,   Mask,   TMask,  LSR #8          ;Mask |= TMask >> 8;
        ADD     bw,     bw,     #7                      ;bw += 7;
        MOV     bw,     bw,     LSR #3                  ;bw /= 8;
        MOV     bw,     bw,     LSL #1                  ;bw *= 2;
        MLA     b,      bw,     b,      BM              ;b = BM + bw * b;
        MLA     BM,     bw,     t,      BM              ;MB += bw * t;
        MOV     l,      l,      LSR #3                  ;l /= 8;
        MOV     r,      r,      LSR #3                  ;r /= 8;
        ADD     r,      BM,     r,      LSL #1          ;r = BM + r * 2;
        ADD     BM,     BM,     l,      LSL #1          ;BM += l * 2;
#define Next    pw
        ADD     Next,   bw,     BM                      ;Next = bw + BM;
        SUB     Next,   Next,   r                       ;Next -= r;
#define TPic    t
        ADD     Pic,    Pic,    Shift,  LSR #7          ;Pic += Shift >> 7;
        MOV     TPic,   Pic                             ;TPic = Pic;
_ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_0_Row:        ;do {
#define Temp2   l
        MOV     TMask,  Mask                            ;  TMask = Mask;
_ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_0_Col:        ;  do {
        CMP     BM,     r                               ;    if (BM == r)
        ANDEQ   TMask,  TMask,  Mask,   LSR #16         ;      TMask &= Mask >> 16;
        LDRH    Temp,   [Pic],  #2                      ;    Temp = *(u16*)Pic++;
        LDRH    Temp2,  [Pic]                           ;    Temp2 = *(u16*)Pic;
        ORR     Temp,   Temp,   Temp2,  LSL #24         ;    Temp |= Temp2 << 24;
        MOV     Temp,   Temp,   ROR #8                  ;    Temp >><= 8;
        MOV     Temp2,  Temp2,  LSR #8                  ;    Temp2 >>= 8;
        ORR     Temp2,  Temp2,  Temp,   LSL #8          ;    Temp2 |= Temp << 8;
        MOV     Temp,   Temp,   LSL Shift               ;    Temp <<= Shift;
        MOV     Temp2,  Temp2,  LSL Shift               ;    Temp2 <<= Shift;
        AND     Temp2,  Temp2,  #0xFF00                 ;    Temp2 &= 0xFF00;
        ORR     Temp,   Temp2,  Temp,   LSR #24         ;    Temp = Temp2 | Temp >> 24;
        AND     Temp2,  Temp,   Temp,   LSR #8          ;    Temp2 = Temp & Temp >> 8;
        BIC     TMask,  TMask,  Temp2                   ;    TMask &= Temp2;
        ORR     TMask,  TMask,  TMask,  LSL #8          ;    TMask |= TMask << 8;
        LDRH    Temp2,  [BM]                            ;    Temp2 = *(u16*)BM;
        EOR     Temp2,  Temp2,  Temp                    ;    Temp2 ^= Temp;
        BIC     Temp2,  Temp2,  TMask                   ;    Temp2 &= ~TMask;
        EOR     Temp2,  Temp2,  Temp                    ;    Temp2 ^= Temp;
        STRHNE  Temp2,  [BM],   #2                      ;    if (BM == r) *(u16*)BM++ = Temp2,
        MOVNE   TMask,  #0xFF                           ;      TMask = 0xFF,
        BNE     _ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_0_Col;  } while (BM != r);
        STRH    Temp2,  [BM],   Next                    ;  *(u16*)BM = Temp2, BM += Next;
        ADD     r,      r,      bw                      ;  r += bw;
        ADD     TPic,   TPic,   pb                      ;  TPic += pb;
        MOV     Pic,    TPic                            ;  Pic = TPic;
        CMP     BM,     b                               ;}
        BCC     _ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_0_Row;while (BM < b)
        B       _ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_Exit
#undef Shift
#undef pb
#undef Mask
#undef TMask
#undef TPic
#undef Temp2
#undef Next



--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
Ivan.
Дата 6.4.2010, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Код
_ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_Angle90:
;x, y, Pic, BM, l, t, r, b, bw, bh, pw, ph, Temp, Angle
#define pb      Angle
#define Temp2   bh
        ADD     pb,     pw,     #7                      ;pb = pw + 7;
        MOV     pb,     pb,     LSR #3                  ;pb /= 8;
        MOV     pb,     pb,     LSL #1                  ;pb *= 2;
        SUBS    Temp,   l,      x                       ;if ((Temp = l - x) < 0)
        SUBLT   l,      l,      Temp                    ;  l -= Temp;
        BIC     Temp,   l,      #7
        SUB     Temp,   Temp,   x
        MLA     Pic,    Temp,   pb,     Pic
        ADD     x,      x,      ph                      ;x += ph;
        SUBS    Temp,   x,      r                       ;if ((Temp = x - r) < 0)
        ADDLT   r,      r,      Temp                    ;  r += Temp;
        CMP     l,      r                               ;if (l >= r)
        BGE     _ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_Exit;  return;
#define L0RS    x       /*LMask,0,RMask,Shift*/
        SUB     b,      b,      #1                      ;b--;
        SUBS    L0RS,   y,      b                       ;if ((L0RS = y - b) > 0)
        ADDGT   Pic,    Pic,    L0RS,   LSR #3          ;  Pic += L0RS / 8,
        ADDGT   Pic,    Pic,    L0RS,   LSR #3          ;  Pic += L0RS / 8,
        ADDLT   b,      b,      L0RS                    ;else b += L0RS;
        MOVLE   L0RS,   #0                              ;  L0RS = 0;
        ADD     L0RS,   L0RS,   #1                      ;L0RS++;
        RSB     L0RS,   L0RS,   #0                      ;L0RS = -L0RS;
        AND     L0RS,   L0RS,   #7                      ;L0RS &= 7;             //00000000 00000000 00000000 00000SSS
        SUB     y,      y,      pw                      ;y -= pw;
        ADD     y,      y,      #1                      ;y++;
        SUBS    Temp,   y,      t                       ;if ((Temp = y - t) > 0)
        ADDGT   t,      t,      Temp                    ;  t += Temp;
        CMP     t,      b                               ;if (t > b)
        BGT     _ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_Exit;  return;
        SUB     r,      r,      #1                      ;r--;
#define TMask   pw
        AND     Temp,   l,      #7                      ;Temp = l & 7;
        MOV     Temp2,  #0xFF                           ;Temp2 = 0xFF;
        MOV     TMask,  Temp2,  LSR Temp                ;TMask = Temp2 >>= Temp;
        ORR     L0RS,   L0RS,   TMask,  LSL #24         ;RLS |= TMask << 24;    //lllLLLLL 00000000 00000000 00000SSS
        AND     Temp,   r,      #7                      ;Temp = r & 7;
        ADD     Temp,   Temp,   #1                      ;Temp++;
        MOV     Temp2,  Temp2,  ROR Temp                ;Temp2 >><= Temp;
        ORR     L0RS,   L0RS,   Temp2,  LSR #16         ;RLS |= Temp2 >> 16;    //lllLLLLL 00000000 RRRRRrrr 00000SSS
        ADD     bw,     bw,     #7                      ;bw += 7;
        MOV     bw,     bw,     LSR #3                  ;bw /= 8;
        MOV     bw,     bw,     LSL #1                  ;bw *= 2;
        MLA     t,      bw,     t,      BM              ;t = BM + bw * t;
        MLA     BM,     bw,     b,      BM              ;MB += bw * b;
        MOV     l,      l,      LSR #3                  ;l /= 8;
        MOV     r,      r,      LSR #3                  ;r /= 8;
        ADD     r,      BM,     r,      LSL #1          ;r = BM + r * 2;
        ADD     BM,     BM,     l,      LSL #1          ;BM += l * 2;
;       SUB     bw,     BM,     bw                      ;bw = BM - bw;
;       SUB     bw,     bw,     r                       ;bw -= r;
#define Loop    y
        LDR     Loop,   =0x80808080                     ;Loop = 0x80808080;
_ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_90_Row:
#define TPic    ph
;BM,r,t,bw,L0RS,TMask,BM,pb,Temp,Temp2,TPic
        STMDB   SP!,    {BM}
        MOV     TMask,  L0RS,   LSR #24                 ;TMask = LORS >> 24;
        MOV     TPic,   Pic                             ;TPic = Pic;
_ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_90_Col:
        MOV     Temp2,  #0                              ;Temp2 = 0;
_ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_90_Loop:
        LDRH    Temp,   [Pic],  pb                      ;Temp = *(u16*)Pic; Pic += pb;
        MOV     Temp,   Temp,   LSR L0RS                ;Temp >>= L0RS;
        BIC     Temp,   Temp,   #0xFE                   ;Temp &= ~0xFE;
        ORR     Temp2,  Temp2,  Temp,   LSL #23         ;Temp2 |= Temp << 23;
        MOV     Temp2,  Temp2,  ROR #31                 ;Temp2 >><= 31;
        MOVS    Loop,   Loop,   ROR #1                  ;Loop >><= 1;
        BCC     _ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_90_Loop
        MOV     Temp2,  Temp2,  ROR #24                 ;Temp2 >><= 24;
        CMP     BM,     r                               ;if (BM == r)
        ANDEQ   TMask,  TMask,  L0RS,   LSR #8          ;  TMask &= L0RS >> 8;
        AND     Temp,   Temp2,  Temp2,  LSR #8          ;Temp = Temp2 & Temp2 >> 8;
        BIC     TMask,  TMask,  Temp                    ;TMask &= ~Temp;
        ORR     TMask,  TMask, TMask,   LSL #8          ;TMask |= TMask << 8;
        LDRH    Temp,   [BM]                            ;Temp = *(u16*)BM;
        EOR     Temp,   Temp,   Temp2                   ;Temp ^= Temp2;
        BIC     Temp,   Temp,   TMask                   ;Temp &= ~TMask;
        EOR     Temp,   Temp,   Temp2                   ;Temp ^= Temp2;
        STRH    Temp,   [BM],   #2                      ;*(u16*)BM++ = Temp,
        MOVNE   TMask,  #0xFF                           ;  TMask = 0xFF;
        BNE     _ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_90_Col;  } while (BM != r);
        MOV     Pic,    TPic                            ;Pic = TPic;
        LDMIA   SP!,    {BM}
        SUB     BM,     BM,     bw                      ;  BM -= bw;
        SUB     r,      r,      bw                      ;  r -= bw;
        SUB     L0RS,   L0RS,   #1                      ;  L0RS--;
        TST     L0RS,   #8
        ADDNE   L0RS,   L0RS,   #8                      ;    L0RS &= ~8,
        ADDNE   Pic,    Pic,    #2                      ;    Pic += 2;
        CMP     BM,     t                               ;}
        BCS     _ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_90_Row;while (BM > t)
        B       _ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_Exit
#undef pb
#undef Temp2
#undef L0RS
#undef TMask
#undef Loop
#undef TPic
_ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_Angle180:
        B       _ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_Exit
_ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_Angle270:
_ZN5Graph7TCanvas4DrawEssPKNS_7SBitMapILs1ELs1EEE_Exit:
        LDMIA   SP!,    {R4 - R11, LR}
        BX      LR
#undef This
#undef x
#undef y
#undef Pic
#undef BM
#undef l
#undef t
#undef r
#undef b
#undef bw
#undef bh
#undef pw
#undef ph
#undef Temp
#undef Angle
;//---------------------------------------------------------------------------

В данной функции для уменьшения занятых регистров я умудрялся хранить по несколько переменных в одном регистре,
например регистр L0RS хранит сражу несколько переменных: левая маска (LMask), 8 бит заполненные нулями (0), правая маска (RMask), значение сдвига (Shift).

Это сообщение отредактировал(а) Ivan. - 6.4.2010, 13:06


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
Ivan.
Дата 6.4.2010, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Следующая функция - рисование произвольной линии заданным стилем. Это улучшеный алгоритм Брезенхема. Функция принимает координаты начальной и конечной точки (включительно), и стиль линии. По результатам рисования функция возвращает модифисированный стиль линии, чтобы можно было продолжить рисования линии с конечной точки не теряя форму пунктирности.
Код
_ZN5Graph7TCanvas4LineEssssm:
#define This    R0
#define x1      R1
#define y1      R2
#define x2      R3
#define y2      R4
#define l       R5
#define t       R6
#define r       R7
#define b       R8
#define BM      R9
#define Style   R10
#define w       R11
#define Temp    R12
#define Val     LR
#define Color   This
#define Mask    x1
#define Mask2   y1
#define ex      x2
#define ey      y2
        STMDB   SP!,    {R4 - R11, LR}
        LDR     Style,  [SP,    #40]
        CMP     This,   #0                              ;if (This == 0
        LDRNE   BM,     [This,  #_BitMap]               ; || (BM = This->BitMap)
        CMPNE   BM,     #0                              ; == 0)
        MOVEQ   R0,     Style                           ;  Res = Style,
        BEQ     _ZN5Graph7TCanvas4LineEssssm_Return     ;  return;
        SUBS    x2,     x2,     x1                      ;if ((x2 -= x1) >= 0)
        MOVGE   Temp,   x2                              ;  Temp = x2;
        RSBLT   Temp,   x2,     #0                      ;else Temp = -x2,
        MOVLT   x2,     x2,     LSL #16                 ;  x2 <<= 16,
        MOVLT   x2,     x2,     LSR #16                 ;  x2 >>= 16;
        LDR     y2,     [SP,    #36]
        SUBS    y2,     y2,     y1                      ;if ((y2 -= y1) >= 0)
        MOVGE   Val,    y2                              ;  Val = y2;
        RSBLT   Val,    y2,     #0                      ;else Val = -y2,
        MOVLT   y2,     y2,     LSL #16                 ;  y2 <<= 16,
        MOVLT   y2,     y2,     LSR #16                 ;  y2 >>= 16;
        CMP     Temp,   Val                             ;if (Temp < Val)
        MOVLT   Temp,   Val                             ;  Temp = Val,
        MOV     Val,    Temp,   LSR #1                  ;Val = Temp >> 1;
        ORRLT   x2,     x2,     Val,    LSL #16         ;  x2 |= Val << 16;
        ORRGE   y2,     y2,     Val,    LSL #16         ;else y2 |= Val << 16;
        LDRSH   w,      [BM],   #2                      ;w = *(s16*)BM++;
        CMP     w,      #0                              ;if (w <= 0
        LDRSHGT Val,    [BM],   #2                      ; || (Val = *(s16*)BM++)
        CMPGT   Val,    #0                              ; <= 0
        BLE     _ZN5Graph7TCanvas4LineEssssm_Exit       ;  return;
        LDRSH   l,      [This,  #_Win_l]                ;l = This->Win.l;
        LDRSH   r,      [This,  #_Win_r]                ;r = This->Win.r;
        CMP     l,      #0                              ;if (l < 0)
        MOVLT   l,      #0                              ;  l = 0;
        CMP     r,      w                               ;if (r > w)
        MOVGT   r,      w                               ;  r = w;
        CMP     l,      r                               ;if (l >= r)
        BGT     _ZN5Graph7TCanvas4LineEssssm_Exit       ;  return;
        LDRSH   t,      [This,  #_Win_t]                ;t = This->Win.t;
        LDRSH   b,      [This,  #_Win_b]                ;b = This->Win.b;
        CMP     t,      #0                              ;if (t < 0)
        MOVLT   t,      #0                              ;  t = 0;
        CMP     b,      Val                             ;if (r > Val)
        MOVGT   b,      Val                             ;  r = Val;
        CMP     t,      b                               ;if (t >= b)
        BGT     _ZN5Graph7TCanvas4LineEssssm_Exit       ;  return;
        LDRB    Color,  [This,  #_Color]                ;Color = This->Color;
        CMP     Color,  #0xF                            ;if (Color >= 0xF)
        BCS     _ZN5Graph7TCanvas4LineEssssm_Exit       ;  return;
        TST     Color,  #4                              ;if (Color & 4)
        ORRNE   Color,  Color,  #0xFF << 24             ;  Color |= 0xFF << 24;
        TST     Color,  #8                              ;if (Color & 8)
        ORRNE   Color,  Color,  #0xFF << 16             ;  Color |= 0xFF << 16;
        TST     Color,  #1                              ;if (Color & 1)
        ORRNE   Color,  Color,  #0xFF << 8              ;  Color |= 0xFF << 8;
        TST     Color,  #2                              ;if (Color & 2)
        ORRNE   Color,  Color,  #0xFF << 0              ;  Color |= 0xFF << 0;
        BICEQ   Color,  Color,  #0xFF << 0              ;  Color &= ~(0xFF << 0);
        ADD     w,      w,      #7                      ;w += 7;
        MOV     w,      w,      LSR #3                  ;w >>= 3;
        MOV     w,      w,      LSL #1                  ;w <= 1;
        MLA     BM,     w,      y1,     BM              ;BM += w * y1;
        ADD     BM,     BM,     x1,     ASR #2          ;BM += x1 >> 2;
        BIC     BM,     BM,     #1                      ;BM &= ~1;
        ORR     w,      Temp,   w,      LSL #16         ;w = Temp | w << 16;
        ORR     l,      l,      Temp,   LSL #16         ;l |= Temp << 16;
        ORR     r,      r,      x1,     LSL #16         ;r |= x1 << 16;
        ORR     b,      b,      y1,     LSL #16         ;b |= y1 << 16;
        MOV     Temp,   #0x80                           ;Temp = 0x80;
        ORR     Temp,   Temp,   Temp,   LSL #8          ;Temp |= Temp << 8;
        ORR     Temp,   Temp,   Temp,   LSL #16         ;Temp |= Temp << 16;
        MOV     Mask,   Temp,   ROR x1                  ;Mask = Temp >>< x1;
        AND     Mask2,  Color,  Color,  LSR #8          ;Mask2 = Color & Color >> 8;
        BIC     Mask2,  Mask2,  0xFF00                  ;Mask2 &= 0xFFFF00FF;
        ORR     Mask2,  Mask2,  Mask2,  LSL #8          ;Mask2 |= Mask2 << 8;
_ZN5Graph7TCanvas4LineEssssm_Loop:                      ;do {
        CMP     r,      l,      LSL #16                 ;  if (x >= l
        CMPGE   b,      t,      LSL #16                 ;   && y >= t
        RSBSGE  Temp,   r,      r,      LSL #16         ;   && r > x
        RSBSGE  Temp,   b,      b,      LSL #16         ;   && b > y)
        MOVLT   Style,  Style,  ROR #1                  ;    Style >><= 1;
        BLT     _ZN5Graph7TCanvas4LineEssssm_N          ;  {
        LDRH    Val,    [BM]                            ;    Val = *(u16*)BM;
        MOVS    Style,  Style,  ROR #1                  ;    Style >><= 1;
        BIC     Temp,   Mask,   Mask2                   ;    Temp = Mask & Mask2;
        BICCS   Val,    Val,    Temp                    ;    if ([C]) Val &= ~Temp;
        BICCC   Val,    Val,    Temp,   LSR #16         ;    else Val &= ~(Temp >> 16);
        AND     Temp,   Temp,   Color                   ;    Temp &= Color;
        ORRCS   Val,    Val,    Temp                    ;    if ([C]) Val |= Temp;
        ORRCC   Val,    Val,    Temp,   LSR #16         ;    else Val |= Temp >> 16;
        STRH    Val,    [BM]                            ;    *(u16*)BM = Val;
_ZN5Graph7TCanvas4LineEssssm_N:                         ;  }
        MOVS    Temp,   ex,     LSL #16                 ;  if (ex << 16 < 0)
        BEQ     _ZN5Graph7TCanvas4LineEssssm_N2
        BGT     _ZN5Graph7TCanvas4LineEssssm_N1         ;  {
        SUB     ex,     ex,     ex,     LSL #16         ;    ex -= ex << 16;
        CMP     ex,     w,      LSL #16                 ;    if (ex > Count)
        SUBCS   ex,     ex,     w,      LSL #16         ;      ex += Count,
        SUBCS   r,      r,      #1 << 16                ;      x--,
        MOVSCS  Mask,   Mask,   LSL #1                  ;      Mask <<= 1;
        SUBCS   BM,     BM,     #2                      ;      if ([C]) BM -= 2,
        ADDCS   Mask,   Mask,   #1                      ;        Mask++;
        B       _ZN5Graph7TCanvas4LineEssssm_N2         ;  }
_ZN5Graph7TCanvas4LineEssssm_N1:                        ;  else {
        ADD     ex,     ex,     ex,     LSL #16         ;    ex += ex << 16;
        CMP     ex,     w,      LSL #16                 ;    if (ex > Count){
        SUBCS   ex,     ex,     w,      LSL #16         ;      ex -= Count;
        ADDCS   r,      r,      #1 << 16                ;      x++;
        MOVSCS  Mask,   Mask,   ROR #1                  ;      Mask >><= 1;
        ADDCS   BM,     BM,     #2                      ;      if ([C]) BM += 2;
_ZN5Graph7TCanvas4LineEssssm_N2:                        ;  } }
        MOVS    Temp,   ey,     LSL #16                 ;  if (ey << 16 < 0)
        BEQ     _ZN5Graph7TCanvas4LineEssssm_N4
        BGT     _ZN5Graph7TCanvas4LineEssssm_N3         ;  {
        SUB     ey,     ey,     ey,     LSL #16         ;    ey -= ey << 16;
        CMP     ey,     w,      LSL #16                 ;    if (ey > Count)
        SUBCS   ey,     ey,     w,      LSL #16         ;      ey += Count,
        SUBCS   BM,     BM,     w,      LSR #16         ;      BM -= w,
        SUBCS   b,      b,      #1 << 16                ;      y--;
        B       _ZN5Graph7TCanvas4LineEssssm_N4         ;  }
_ZN5Graph7TCanvas4LineEssssm_N3:                        ;  else {
        ADD     ey,     ey,     ey,     LSL #16         ;    ey += ey << 16;
        CMP     ey,     w,      LSL #16                 ;    if (ey > Count)
        SUBCS   ey,     ey,     w,      LSL #16         ;      ey += Count,
        ADDCS   BM,     BM,     w,      LSR #16         ;      BM += w,
        ADDCS   b,      b,      #1 << 16                ;      y++;
_ZN5Graph7TCanvas4LineEssssm_N4:                        ;  }
        SUBS    l,      l,      #1 << 16                ;}
        BCS     _ZN5Graph7TCanvas4LineEssssm_Loop       ;while (i--);
        MOV     Temp,   l,      LSR #16                 ;Temp = l >> 16;
_ZN5Graph7TCanvas4LineEssssm_Exit:                      ;
        MOV     R0,     Style,  ROR Temp                ;Style >><= Temp;
_ZN5Graph7TCanvas4LineEssssm_Return:
        LDMIA   SP!,    {R4 - R11, LR}
        BX      LR
#undef This
#undef x1
#undef y1
#undef x2
#undef y2
#undef l
#undef t
#undef r
#undef b
#undef BM
#undef Style
#undef w
#undef Temp
#undef Val
#undef Color
#undef Mask
#undef Mask2
#undef ex
#undef ey
;//---------------------------------------------------------------------------


Это сообщение отредактировал(а) Ivan. - 1.2.2011, 08:53


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
Ivan.
Дата 6.4.2010, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Следующая функция - вывод текста на экран. Вот она, цитадель зла, не дай бог кому нибудь в ней разобраться. Писал наверное месяц, бошка кипела похлеще чем от любой головоломки.
сперва рассмотрим, что из себя представляет шрифт:
Код
0x0A, 0x01, //  Высота символа, количество чарсетов
//Расположение CharSet
0x2, 0x00,  //  0 CharSet
//Расположение символов
//      CharSet 0
0x00, 0x02, //  0x00 ' ', указатель на символ
0x00, 0x02, //  0x01 ' '
.....
0x0B, 0x02, //  0x20 ' '
0x16, 0x02, //  0x21 '!'
0x21, 0x02, //  0x22 '"'
0x2C, 0x02, //  0x23 '#'
.....
0x22, 0x09, //  0xFD 'э'
0x2D, 0x09, //  0xFE 'ю'
0x38, 0x09, //  0xFF 'я'
//Таблицы символов
0x07,   //  0x41, 'A', ширина символа
0x00, //  .......
0x10, //  ...§...
0x10, //  ...§...
0x28, //  ..§.§..
0x28, //  ..§.§..
0x44, //  .§...§.
0x7C, //  .§§§§§.
0x82, //  §.....§
0x82, //  §.....§
0x00, //  .......
0x09,   //  0x57, 'W', ширина символа
0x00, 0x00, //  .........
0x88, 0x80, //  §...§...§
0x88, 0x80, //  §...§...§
0x55, 0x00, //  .§.§.§.§.
0x55, 0x00, //  .§.§.§.§.
0x55, 0x00, //  .§.§.§.§.
0x22, 0x00, //  ..§...§..
0x22, 0x00, //  ..§...§..
0x22, 0x00, //  ..§...§..
0x00, 0x00, //  .........



--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
Ivan.
Дата 19.4.2010, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Код
_ZN5Graph7TCanvas3OutEssPKci:
#define This    R0
#define x       R1
#define y       R2
#define Text    R3
#define Font    R4
#define BM      R5
#define l       R6
#define t       R7
#define r       R8
#define b       R9
#define w       R10
#define h       R11
#define fh      R12
#define Temp    LR
        STMDB   SP!,    {R4 - R11, LR}
        LDR     Temp,   [SP, #36]
;Проверка адресов
        MOV     Temp,   Temp,   LSL #16                 ;if (Temp & 0xFFFF
        MOVS    Temp,   Temp,   LSR #16
        STR     Temp,   [SP,    #36]
        CMPNE   This,   #0                              ; || !This
        CMPNE   Text,   #0                              ; || !Text
        LDRBNE  Temp,   [Text]                          ; || (Temp = *Text)
        CMPNE   Temp,   #0                              ; == 0
        LDRNE   BM,     [This,  #_BitMap]               ; || (BM = This->BitMap)
        CMPNE   BM,     #0                              ; == 0
        LDRNE   Font,   [This,  #_Font]                 ; || (Font = This->Font)
        CMPNE   Font,   #0                              ; == 0)
        BEQ     _ZN5Graph7TCanvas3OutEssPKci_Exit       ;  return;
;Проверка размеров
        LDRSH   w,      [BM],   #2                      ;if ((w = *(s16*)BM++)
        CMP     w,      #0                              ; <= 0
        LDRSHGT h,      [BM],   #2                      ; || (h = *(s16*)BM++)
        CMPGT   h,      #0                              ; <= 0
        LDRBGT  fh,     [Font], #1                      ; || (fh = *(u8*)Font++)
        CMPGT   fh,     #0                              ; <= 0)
        BLE     _ZN5Graph7TCanvas3OutEssPKci_Exit       ;  return;
;Коррекция окна
        LDRSH   l,      [This,  #_Win_l]                ;l = This->Win.l;
        LDRSH   t,      [This,  #_Win_t]                ;t = This->Win.t;
        LDRSH   r,      [This,  #_Win_r]                ;r = This->Win.r;
        LDRSH   b,      [This,  #_Win_b]                ;b = This->Win.b;
        CMP     l,      #0                              ;if (l < 0)
        MOVLT   l,      #0                              ;  l = 0;
        CMP     t,      #0                              ;if (t < 0)
        MOVLT   t,      #0                              ;  t = 0;
        CMP     r,      w                               ;if (r > w)
        MOVGT   r,      w                               ;  r = w;
        CMP     b,      h                               ;if (b > h)
        MOVGT   b,      h                               ;  b = h;
#define Temp2   h
;Выбор чарсета
        LDRB    Temp,   [This,  #_CSet]                 ;Temp = This->CharSet;
        LDRB    h,      [Font], #1                      ;h = *(u8*)Font++;
        CMP     Temp,   h                               ;if (Temp >= h)
        BCS     _ZN5Graph7TCanvas3OutEssPKci_Exit       ;  return;
        MOV     Temp,   Temp,   LSL #1                  ;Temp <<= 1;
        LDRH    Temp,   [Font,  Temp]                   ;Temp = (u16*)Font[Temp];
        ADD     Font,   Font,   Temp                    ;Font += Temp;
;Выбор угла
        LDRB    Temp,   [This,  #_Angle]                ;Temp = This->Angle;
        AND     Temp,   Temp,   #3                      ;Temp &= 3;
#define Color   This
        LDRB    Color,  [This,  #_Color]                ;Color = This->Color;
        TST     Color,  #4                              ;if (Color & 4)
        ORRNE   Color,  Color,  #0xFF << 24             ;  Color |= 0xFF << 24;
        TST     Color,  #8                              ;if (Color & 8)
        ORRNE   Color,  Color,  #0xFF << 16             ;  Color |= 0xFF << 16;
        TST     Color,  #1                              ;if (Color & 1)
        ORRNE   Color,  Color,  #0xFF << 8              ;  Color |= 0xFF << 8;
        TST     Color,  #2                              ;if (Color & 2)
        ORRNE   Color,  Color,  #0xFF << 0              ;  Color |= 0xFF << 0;
        BICEQ   Color,  Color,  #0xFF << 0              ;else Color &= ~(0xFF << 0);
        LDR     PC,     [PC,    Temp,   LSL #2]
        NOP
        DC32 _ZN5Graph7TCanvas3OutEssPKci_0
        DC32 _ZN5Graph7TCanvas3OutEssPKci_90
        DC32 _ZN5Graph7TCanvas3OutEssPKci_180
        DC32 _ZN5Graph7TCanvas3OutEssPKci_270
_ZN5Graph7TCanvas3OutEssPKci_0:
;This, x, y, Text, Font, BM, l, t, r, b, w, fh, Temp
;Подрезаем верх
#define Top h
        SUBS    Temp,   t,      y                       ;if ((Temp = t - y) > 0)
        MOVGT   Top,    Temp                            ;  Top = Temp;
        MOVLE   Top,    #0                              ;else Top = 0,
        SUBLT   t,      t,      Temp                    ;  t -= Temp;
        SUB     Top,    Top,    #1                      ;Top--;
;Подрезаем низ
        ADD     y,      y,      fh                      ;y += fh;
        SUBS    Temp,   b,      y                       ;if ((Temp = b - y) > 0)
        SUBGT   b,      b,      Temp                    ;  b -= Temp;
;Проверяем остаток
        CMP     t,      b                               ;if (t >= b)
        BGE     _ZN5Graph7TCanvas3OutEssPKci_Exit       ;  return;
        CMP     l,      x                               ;if (l < x)
        MOVLT   l,      x                               ;  l = x;
        CMP     l,      r                               ;if (l >= r)
        BGE     _ZN5Graph7TCanvas3OutEssPKci_Exit       ;  return;
;Получаем адреса границ
        ADD     w,      w,      #7                      ;w += 7;
        MOV     w,      w,      LSR #3                  ;w >>= 3;
        MOV     w,      w,      LSL #1                  ;w <<= 1;
        MLA     b,      w,      b,      BM              ;b = w * b + BM;
        MLA     BM,     w,      t,      BM              ;BM += w * t;
#define BLRS    t
        AND     BLRS,   x,      #7                      ;BLRS = x & 7;
        ADD     x,      BM,     x,      ASR #2          ;x = BM + x >> 2;
        BIC     x,      x,      #1                      ;x &= ~1;
;Строим маски
#define TMask   y
        MOV     TMask,  #0xFF                           ;TMask = 0xFF;
        AND     Temp,   l,      #7                      ;Temp = x & 7;
        MOV     Temp,   TMask,  LSR Temp                ;Temp = TMask >> Temp;
        ORR     BLRS,   BLRS,   Temp,   LSL #16         ;BLRS |= Temp << 16;
        ANDS    Temp,   r,      #7                      ;Temp = r & 7;
        MOVNE   TMask,  TMask,  LSR Temp                ;TMask >>= Temp;
        ORRNE   BLRS,   BLRS,   TMask,  LSL #8          ;BLRS |= TMask << 8;
        SUB     r,      r,      #1                      ;r--;
;Получаем адреса границ
        ADD     r,      BM,     r,      LSR #2          ;r = BM + r >> 2;
        BIC     r,      r,      #1                      ;r &= ~1;
        ADD     BM,     BM,     l,      LSR #2          ;BM += l >> 2;
        BIC     BM,     BM,     #1                      ;BM &= ~1;


Это сообщение отредактировал(а) Ivan. - 19.4.2010, 07:37


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
Ivan.
Дата 19.4.2010, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Код
#define Val fh
        STMDB   SP!,    {Font, BM}                      ;TFont = Font; TBM = BM;
        LDR     Temp,   [SP,    #44]                    ;Temp = Max;
        AND     l,      Color,  Color,  LSR #8          ;l = Color & (Color >> 8);
_ZN5Graph7TCanvas3OutEssPKci_0_Loop:                    ;while (1){
        CMP     Temp,   Temp,   LSL #16                 ;  if (Temp < Temp << 16)
        BCS     _ZN5Graph7TCanvas3OutEssPKci_0_End      ;    return;
        LDRB    Temp,   [Text], #1                      ;  Temp = *Text++;
        MOVS    Temp,   Temp,   LSL #1                  ;  if (Temp * 2 == 0)
        BEQ     _ZN5Graph7TCanvas3OutEssPKci_0_End      ;    return;
        LDRH    Temp,   [Font,  Temp]                   ;  Temp = (u16*)Font[Temp];
        ADD     Font,   Font,   Temp                    ;  Font += Temp;
        LDRB    Val,    [Font], #1                      ;  Val = *(u8*)Font++;
        AND     Temp,   BLRS,   #7                      ;  Temp = LRRS & 7;
        ADD     Temp,   Temp,   Val                     ;  Temp += Val;
        MOV     TMask,  Temp,   LSL #24                 ;  TMask = Val << 24;
        CMP     x,      BM                              ;  if (x >= BM)
        BCS     _ZN5Graph7TCanvas3OutEssPKci_0_Ch       ;    break;
        MOV     Temp,   Temp,   LSR #3                  ;  Temp >>= 3;
        SUB     Val,    BM,     x                       ;  Val = BM - x;
        CMP     Val,    Temp,   LSL #1                  ;  if (Val >= Temp << 1)
        BLS     _ZN5Graph7TCanvas3OutEssPKci_0_Next2    ;  {
        ADD     x,      x,      Temp,   LSL #1          ;    x += Temp << 1;
        BIC     BLRS,   BLRS,   #0xFF                   ;    BLRS &= ~0xFF;
        ORR     BLRS,   BLRS,   TMask,  LSR #24         ;    BLRS += TMask >> 24;
        BIC     BLRS,   BLRS,   #0xF8                   ;    BLRS &= ~0xF8;
        LDR     Temp,   [SP,    #44]                    ;    Temp = Max;
        ADD     Temp,   Temp,   #1 << 16                ;    Temp += 1 << 16;
        STR     Temp,   [SP,    #44]                    ;    Max = Temp;
        LDR     Font,   [SP,    #0]                     ;    Font = TFont;
        B       _ZN5Graph7TCanvas3OutEssPKci_0_Loop     ;    Continue;
_ZN5Graph7TCanvas3OutEssPKci_0_Next2:                   ;  }
        SUB     Val,    TMask,  BLRS,   LSL #24         ;  Val = TMask - BLRS << 24;
        MOV     Val,    Val,    LSR #24                 ;  Val >>= 24;
_ZN5Graph7TCanvas3OutEssPKci_0_Loop2:                   ;  do {
        ADD     x,      x,      #2                      ;    (u16*)x++;
        ADD     Font,   Font,   #1                      ;    (u8*)Font++;
        SUB     TMask,  TMask,  #8 << 24                ;    TMask -= 8 << 24;
        CMP     x,      BM                              ;  }
        BCC     _ZN5Graph7TCanvas3OutEssPKci_0_Loop2    ;  while (x < BM);
_ZN5Graph7TCanvas3OutEssPKci_0_Ch:                      ;} do {
        ADD     Val,    Val,    #7                      ;  Val += 7;
        MOV     Val,    Val,    LSR #3                  ;  Val >>= 3;
        BIC     BLRS,   BLRS,   #0xFF << 24             ;  BLRS &= ~(0xFF << 24);
        ORR     TMask,  TMask,  BLRS,   LSR #16         ;  TMask |= BLRS >> 16;
        ORR     TMask,  TMask,  TMask,  LSL #8          ;  TMask |= TMask << 8;
        ORR     BLRS,   BLRS,   Val,    LSL #24         ;  BLRS |= Val << 24;
        MLA     Font,   Top,    Val,    Font            ;  Font += Top * Val;
_ZN5Graph7TCanvas3OutEssPKci_0_Col:                     ;  do {
        SUBS    TMask,  TMask,  #8 << 24                ;    TMask -= 8 << 24;
        BCS     _ZN5Graph7TCanvas3OutEssPKci_0_Next     ;    if ([C]){
        MOV     Temp,   #0xFF                           ;      Temp = 0xFF;
        MOV     Val,    TMask,  LSR #24                 ;      Val = TMask >> 24;
        MOV     Temp,   Temp,   ROR Val                 ;      Temp >><= Val;
        MOV     Temp,   Temp,   LSR #8                  ;      Temp >>= 8;
        AND     Temp,   Temp,   TMask                   ;      Temp &= TMask;
        BIC     BLRS,   BLRS,   #0xFF << 16             ;      BLRS &= ~(0xFF << 16);
        BIC     TMask,  TMask,  Temp                    ;      Task &= ~Temp;
        BIC     TMask,  TMask,  Temp,   LSL #8          ;      Task &= ~(Temp << 8);
        ORR     BLRS,   BLRS,   Temp,   LSL #16         ;      BLRS |= Temp << 16;
_ZN5Graph7TCanvas3OutEssPKci_0_Next:                    ;    }
        CMP     BM,     r                               ;    if (BM == r){
        ANDEQ   Temp,   BLRS,   #0xFF << 8              ;      Temp = BLRS & 0xFF << 8;
        BICEQ   TMask,  TMask,  Temp,   LSR #8          ;      TMask &= ~(Temp >> 8);
        BICEQ   TMask,  TMask,  Temp                    ;      TMask &= ~Temp;
        TSTEQ   TMask,  #0xFF                           ;      if (!(TMask & 0xFF))
        BEQ     _ZN5Graph7TCanvas3OutEssPKci_0_End      ;        break;
        STMDB   SP!,    {Font}                          ;    T2Font = Font;
_ZN5Graph7TCanvas3OutEssPKci_0_Row:                     ;    } do {
        LDRB    Temp,   [Font,  BLRS,   LSR #24]!       ;      Temp = *(u8*)(Font += BLRS >> 24);
        LDRB    Val,    [Font,  #-1]                    ;      Val = (u8*)Font[-1];
        ORR     Val,    Temp,   Val,    LSL #8          ;      Val = Temp | Val << 8;
        MOV     Val,    Val,    LSR BLRS                ;      Val >>= BLRS;
        AND     Val,    Val,    #0xFF                   ;      Val &= 0xFF;
        ORR     Val,    Val,    #0xFF << 16;            ;      Val |= 0xFF << 16;
        EOR     Val,    Val,    Val,    LSL #16         ;      Val ^= Val << 16;
        BIC     Val,    Val,    l                       ;      Val &= ~l;
        ORR     Val,    Val,    Val,    LSL #8          ;      Val |= Val << 8;
        ORR     Temp,   Val,    Val,    LSL #16         ;      Temp = Val | Val << 16;
        AND     Temp,   Temp,   TMask,  LSL #16         ;      Temp &= TMask << 16;
        AND     Val,    Val,    Color                   ;      Val &= Color;
        ORR     Val,    Val,    Val,    LSL #16         ;      Val |= Val << 16;
        ORR     Val,    Temp,   Val,    LSR #16         ;      Val = Temp | Val >> 16;
        LDRH    Temp,   [BM]                            ;      Temp = *(u16*)BM;
        EOR     Temp,   Temp,   Val                     ;      Temp ^= Val;
        BIC     Temp,   Temp,   Val,    LSR #16         ;      Temp &= ~(Val >> 16);
        EOR     Temp,   Temp,   Val                     ;      Temp ^= Val;
        STRH    Temp,   [BM],   w                       ;      *(u16*)BM = Temp; BM += w;
        CMP     BM,     b                               ;    }
        BCC     _ZN5Graph7TCanvas3OutEssPKci_0_Row      ;    while (BM < b);
        LDMIA   SP!,    {Font}                          ;    Font = T2Font;
        ADD     Font,   Font,   #1                      ;    Font++;
        LDR     BM,     [SP,    #4]                     ;    BM = TBM;
        ORR     TMask,  TMask,  #0xFF                   ;    TMask |= 0xFF;
        ORR     TMask,  TMask,  #0xFF << 8              ;    TMask |= 0xFF << 8;
        MOV     Temp,   TMask,  ASR #24                 ;    Temp = TMask >> 24;
        CMP     Temp,   #0                              ;    if (Temp >= 0)
        ADDGE   BM,     BM,     #2                      ;      BM += 2;
        ORREQ   BLRS,   BLRS,   #0xFF << 16             ;    if (Temp == 0) BLRS |= 0xFF << 16;
        BICLE   BLRS,   BLRS,   #0xFF                   ;    if (Temp <= 0) BLRS &= ~0xFF,
        ANDLE   Val,    Temp,   #7                      ;      Val = Temp & 7,
        ORRLE   BLRS,   BLRS,   Val                     ;      BLRS |= Val,
        LDRLE   Font,   [SP,    #0]                     ;      Font = TFont;
        STR     BM,     [SP,    #4]                     ;    TBM = BM;
        CMP     BM,     r                               ;    if (BM > r)
        BHI     _ZN5Graph7TCanvas3OutEssPKci_0_End      ;      return;
        CMP     Temp,   #0                              ;  }
        BGT     _ZN5Graph7TCanvas3OutEssPKci_0_Col      ;  while (Temp > 0);
        LDR     Temp,   [SP,    #44]                    ;  Temp = Max;
        ADD     Temp,   Temp,   #1 << 16                ;  Temp += 1 << 16;
        STR     Temp,   [SP,    #44]                    ;  Max = Temp;
        CMP     Temp,   Temp,   LSL #16                 ;  if (Temp < Temp << 16)
        BCS     _ZN5Graph7TCanvas3OutEssPKci_0_End      ;    return;
        LDRB    Temp,   [Text], #1                      ;  Temp = *Text++;
        MOVS    Temp,   Temp,   LSL #1                  ;  if (Temp * 2 == 0)
        BEQ     _ZN5Graph7TCanvas3OutEssPKci_0_End      ;    return;
        LDRH    Temp,   [Font,  Temp]                   ;  Temp = (u16*)Font[Temp];
        ADD     Font,   Font,   Temp                    ;  Font += Temp;
        LDRB    Val,    [Font], #1                      ;  Val = *(u8*)Font++;
        MOV     TMask,  Val,    LSL #24                 ;  TMask = Val << 24;
        ADD     TMask,  TMask,  BLRS,   LSL #24         ;  TMask += BLRS << 24;
        B       _ZN5Graph7TCanvas3OutEssPKci_0_Ch       ;}
_ZN5Graph7TCanvas3OutEssPKci_0_End:                     ;
        LDMIA   SP!,    {Font, BM}
#undef Top
#undef BLRS
#undef TMask
#undef Val
        B       _ZN5Graph7TCanvas3OutEssPKci_Exit       ;
_ZN5Graph7TCanvas3OutEssPKci_90:
_ZN5Graph7TCanvas3OutEssPKci_180:
_ZN5Graph7TCanvas3OutEssPKci_270:
_ZN5Graph7TCanvas3OutEssPKci_Exit:
        LDMIA   SP!,    {R4 - R11, LR}
        LDRH    R0,     [SP,    #2]                     ;return Max >> 16;
        BX      LR
#undef This
#undef x
#undef y
#undef Text
#undef Font
#undef BM
#undef l
#undef t
#undef r
#undef b
#undef w
#undef h
#undef fh
#undef Temp
#undef Temp2
#undef Color
;//---------------------------------------------------------------------------



--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
mifodiy91
Дата 16.1.2011, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



Здравствуйте  а можно ли эту програмку использовать для WG12864a с контролером KS0108
PM MAIL   Вверх
Ivan.
Дата 1.2.2011, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Даже не знаю, что сказать.
На сколько я знаю - WG12864 - это индикатор состоящий из 2 черно-белых матриц 64х64 точки и имеет 2 CS.
Можно ли использовать данную библиотеку для него?... думаю, что нет. Как я описывал ранее - моя библиотека состоит из 2-х частей - это драйвер переноса данных из оперативки в индикатор и компонент Canvas для рисования в оперативке. Даже если переписать драйвер, что нелогично, так как этот индикатор не нуждается в жестко лимитированном периоде передачи информации, как при контроллере SEDxxxx, индикатор двухцветный, и Canvas будет излишней. Взять логику Canvas за основу - достаточно сложно, так как она написана на асме для конкретной задачи и конкретной архитектуры ARM.


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
Ivan.
Дата 1.2.2011, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



при переписывании данной библиотеки под Keil обнаружил пару ошибочек в функции рисования линий:
строку 72 и 74 следует поменять местами.
68:        TST     Color,  #4                              ;if (Color & 4)
69:        ORRNE   Color,  Color,  #0xFF << 24             ;  Color |= 0xFF << 24;
70:        TST     Color,  #8                              ;if (Color & 8)
71:        ORRNE   Color,  Color,  #0xFF << 16             ;  Color |= 0xFF << 16;
72:        TST     Color,  #1                              ;if (Color & 1)
73:        ORRNE   Color,  Color,  #0xFF << 8              ;  Color |= 0xFF << 8;
74:        TST     Color,  #2                              ;if (Color & 2)
75:        ORRNE   Color,  Color,  #0xFF << 0              ;  Color |= 0xFF << 0;
76:        BICEQ   Color,  Color,  #0xFF << 0              ;  Color &= ~(0xFF << 0);

И вставить строку между 91 и 92 строкой:
91:        AND     Mask2,  Color,  Color,  LSR #8          ;Mask2 = Color & Color >> 8;
        BIC     Mask2,  Mask2,  #0xFF << 8                  ;Mask2 &= 0xFFFF00FF;
92:        ORR     Mask2,  Mask2,  Mask2,  LSL #8          ;Mask2 |= Mask2 << 8;

Все изменения внесены в выше расположенное сообщение

Это сообщение отредактировал(а) Ivan. - 1.2.2011, 09:05


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.1014 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.