-
Notifications
You must be signed in to change notification settings - Fork 0
/
alpha_selector.asm
128 lines (83 loc) · 5.16 KB
/
alpha_selector.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// Draw Hook //
//alpha_selector.asm - Отлов полупрозрачной картинки
//(c)Dimadze
#include "drawhook.h"
EXTERN FuncDistributor_0x05
EXTERN FuncDistributor_0x17
#ifdef X75
EXTERN isCSMException
#endif
CODE16 // Врубаем режим THUMB
// Отлов всех изображений IMGHDR
RSEG PATCH_DRAWOBJECT_OBJ05:CODE
PUSH {R4-R7,LR} // Восстанавливаем затёртую команду
BL img_05_check
// Отлов всех изображений EIMGHDR
RSEG PATCH_DRAWOBJECT_OBJ17:CODE
PUSH {R4-R7,LR} // Восстанавливаем затёртую команду
BL img_17_check
// Ну, а это у нас процессор проверки
// Здесь происходит сортировка изображений на полупрозрачные и обычные
// Вычисление аргументов для нашей ф-ии отрисовки
RSEG PATCH_BODY:CODE
img_05_check: // Проверка на присутствии полупрозрачого IMGHDR
MOV R5, R0 // Востановление комманды
MOV R4, R1 // Востановление комманды
// R0 = SCREEN_STRUCT
// R1 = DRAWOBJ_05
PUSH {R0-R2,LR} // Теперь надо сохраниться, мало ли что ...
#ifdef X75
BLX isCSMException // Посмотрим, а CSM которая "на верху" не исключение?
CMP R0, #0x01
MOV R0, R5
BEQ is_csm_exc_05 // Исключение, тогда сваливаем ...
#endif
LDR R2, [R1, #0x14] // R2 = IMGHDR *img
LDRB R2, [R2, #0x02] // R2 = img->bpnum
MOV R1, #0xF0 // Подготовка к очистке бит
BIC R2, R1 // Очищаем 4-8 биты, т.е. любое число 0xXA будет как 0x0A
CMP R2, #0x0A // Проверяем, нет ли альфа-канала?
BNE not_alpha_05 // В зависимости от проверки уходим
// Ага, альфа-канал есть! Рисуем через спец-функцию ...
MOV R1, R0 // Возьмём адрес структуры SCREEN_STRUCT
MOV R0, R4 // Возьмём адрес структуры DRWOBJ_05
LDR R2, =FuncDistributor_0x05
BLX R2 // Пойдём на распределитель
#ifdef X75
MOV R2, #0x00 // Картинку уже нарисовали, теперь ломаем её структуру,
STR R2, [R4, #0x14] // чтобы сам телефон её снова не нарисовал
#endif
not_alpha_05:
is_csm_exc_05:
POP {R0-R2,PC} // Вот теперь грузим сохранение
img_17_check: // Проверка на присутствии полупрозрачого EIMGHDR
SUB SP, #0x14 // Востановление комманды
MOV R6, R0 // Востановление комманды
// R0 = SCREEN_STRUCT
// R1 = DRAWOBJ_17
PUSH {R0-R2,LR} // Теперь надо сохраниться, мало ли что ...
#ifdef X75
BLX isCSMException
CMP R0, #0x01
MOV R0, R6
BEQ is_csm_exc_17
#endif
LDR R2, [R1, #0x14] // R2 = EIMGHDR *eimg
LDR R2, [R2, #0x00] // R2 = eimg->bpnum
MOV R1, #0xF0 // Подготовка к очистке бит
BIC R2, R1 // Очищаем 4-8 биты, т.е. любое число 0xXA будет как 0x0A
CMP R2, #0x0A // Проверяем, нет ли альфа-канала?
BNE not_alpha_17 // В зависимости от проверки уходим
// Ага, альфа-канал есть! Рисуем через спец-функцию ...
MOV R1, R0 // Возьмём адрес структуры SCREEN_STRUCT
MOV R0, R4 // Возьмём адрес структуры DRWOBJ_17
LDR R5, =FuncDistributor_0x17
BLX R5 // Пойдём на распределитель
#ifdef X75
MOV R2, #0x00 // Картинку уже нарисовали, теперь ломаем её структуру,
STR R2, [R4, #0x14] // чтобы сам телефон её снова не нарисовал
#endif
not_alpha_17:
is_csm_exc_17:
POP {R0-R2,PC} // Вот теперь грузим сохранение
END