Mercurial > public > ostc4
annotate FontPack/base_upperRegion.c @ 713:1fbcca5bdf5d
Increased version number and set beta label
author | Ideenmodellierer |
---|---|
date | Sun, 20 Nov 2022 20:37:44 +0100 |
parents | 01f40cb1057e |
children |
rev | line source |
---|---|
30 | 1 /////////////////////////////////////////////////////////////////////////////// |
2 /// -*- coding: UTF-8 -*- | |
3 /// | |
4 /// \file FontPack/./base_upperRegion.c | |
5 /// \brief The beginning of it all. main() is part of this. | |
36 | 6 /// \author heinrichs weikamp gmbh |
30 | 7 /// \date 31-August-2015 |
8 /// | |
9 /// $Id$ | |
10 /////////////////////////////////////////////////////////////////////////////// | |
11 /// \par Copyright (c) 2014-2018 Heinrichs Weikamp gmbh | |
12 /// | |
13 /// This program is free software: you can redistribute it and/or modify | |
14 /// it under the terms of the GNU General Public License as published by | |
15 /// the Free Software Foundation, either version 3 of the License, or | |
16 /// (at your option) any later version. | |
17 /// | |
18 /// This program is distributed in the hope that it will be useful, | |
19 /// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
20 /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
21 /// GNU General Public License for more details. | |
22 /// | |
23 /// You should have received a copy of the GNU General Public License | |
24 /// along with this program. If not, see <http://www.gnu.org/licenses/>. | |
25 ////////////////////////////////////////////////////////////////////////////// | |
26 /** | |
27 @verbatim | |
28 ============================================================================== | |
29 ##### New characters in fonts ##### | |
30 ============================================================================== | |
31 [..] Use font_tmore.c and add line to corresponding font like font_t54c | |
32 Don't forget to adjust the length of the font in the last line starting | |
33 const tFont ..... | |
34 | |
591 | 35 [..] last char before the big gap, as of 160217 |
30 | 36 image_data_FontT24_0x002b[364] |
37 __attribute__((at( START_T24_FONT + (1647 * 28) ))), START_T24_FONT (0x08142F00 - MINUS_BANK) | |
38 | |
591 | 39 -> free from 0x0814E490 |
40 then the logo image_data_ostc_fuer_Tauchcomputer_240px | |
41 approx 120 kBytes free space available! | |
30 | 42 |
43 @endverbatim | |
44 ****************************************************************************** | |
45 */ | |
46 | |
47 /* Includes ------------------------------------------------------------------*/ | |
48 | |
49 // From Common/Inc: | |
50 #include "FirmwareData.h" | |
51 | |
52 | |
123
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
53 #ifdef DEBUG |
30 | 54 // From AC6 support: |
55 #include <stdio.h> | |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
56 #include <stdint.h> |
123
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
57 #endif |
30 | 58 |
59 ////////////////////////////////////////////////////////////////////////////// | |
60 | |
61 const SFirmwareData font_FirmwareData __attribute__(( section(".font_firmware_data") )) = | |
62 { | |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
63 .versionFirst = 1, |
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
64 .versionSecond = 0, |
30 | 65 .versionThird = 0, |
66 .versionBeta = 0, | |
67 | |
68 /* 4 bytes, including trailing 0 */ | |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
69 .signature = "im", |
30 | 70 |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
71 .release_year = 18, |
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
72 .release_month = 10, |
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
73 .release_day = 04, |
30 | 74 .release_sub = 0, |
75 | |
76 /* max 48, including trailing 0 */ | |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
77 .release_info ="FontPack extension", |
30 | 78 |
79 /* for safety reasons and coming functions */ | |
80 .magic[0] = FIRMWARE_MAGIC_FIRST, | |
81 .magic[1] = FIRMWARE_MAGIC_SECOND, | |
82 .magic[2] = FIRMWARE_MAGIC_FONT, /* the magic byte for fonts*/ | |
83 .magic[3] = FIRMWARE_MAGIC_END | |
84 }; | |
85 | |
86 ////////////////////////////////////////////////////////////////////////////// | |
87 | |
123
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
88 #ifdef BUILD_LIBRARY |
30 | 89 /* Fonts fixed in upper region */ |
90 #include "Fonts/font_awe48.h" | |
91 #include "Fonts/font_T24.h" | |
92 #include "Fonts/font_T42.h" | |
93 #include "Fonts/font_T48_plus.h" | |
94 #include "Fonts/font_T54.h" | |
95 #include "Fonts/font_T84.h" | |
96 #include "Fonts/font_T105.h" | |
97 #include "Fonts/font_T144_plus.h" | |
98 | |
123
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
99 #include "Fonts/image_ostc.h" |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
100 #else |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
101 #include "gfx_fonts.h" |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
102 #endif |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
103 |
30 | 104 /* Images fixed in upper region */ |
105 #include "Fonts/image_battery.h" | |
106 #include "Fonts/image_heinrichs_weikamp.h" | |
123
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
107 |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
108 ///////////////////////////////////////////////////////////////////////////// |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
109 |
30 | 110 |
123
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
111 #ifdef DEBUG |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
112 |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
113 #define ASSERT(e) \ |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
114 do { if( ! (e) ) { ++errors; printf("FAIL at %3d: %s \n", __LINE__, #e); errorflag = 1;} } while(0) |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
115 |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
116 #define ASSERT_RANGE(e, min, max) ASSERT(min <= e); ASSERT( e <= max) |
30 | 117 |
699 | 118 #if DEBUG_STLINK_V2 |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
119 extern void initialise_monitor_handles(void); |
699 | 120 #endif |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
121 |
30 | 122 static int errors = 0; |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
123 static uint8_t errorflag = 0; |
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
124 |
30 | 125 int main(void) |
126 { | |
123
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
127 #if DEBUG_STLINK_V2 |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
128 initialise_monitor_handles(); |
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
129 #endif |
30 | 130 //---- Check the linker puts the directory at the requested address ------ |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
131 ASSERT( & Awe48 == (tFont*)0x81DFE00 ); |
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
132 ASSERT( & FontT24 == (tFont*)0x81DFE0c ); |
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
133 ASSERT( & FontT42 == (tFont*)0x81DFE18 ); |
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
134 ASSERT( & FontT48 == (tFont*)0x81DFE24 ); |
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
135 ASSERT( & FontT54 == (tFont*)0x81DFE30 ); |
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
136 ASSERT( & FontT84 == (tFont*)0x81DFE3c ); |
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
137 ASSERT( & FontT105 == (tFont*)0x81DFE48 ); |
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
138 ASSERT( & FontT144 == (tFont*)0x81DFE54 ); |
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
139 |
30 | 140 //---- Check the linker puts the font data in the requested section ------ |
141 extern tChar __upper_font_data; | |
142 extern tChar __upper_font_data_end; | |
143 ASSERT( &__upper_font_data == (tChar*)0x08132040 ); | |
144 ASSERT_RANGE( (int)&__upper_font_data_end, 0x08132040, 0x081E0000); | |
145 | |
146 //---- Walk through the directory data ----------------------------------- | |
147 extern const tFont __font_directory; | |
148 extern const tFont __font_directory_end; | |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
149 |
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
150 ASSERT_RANGE(&ImgOSTC, (tImage*)&__upper_font_data, (tImage*)&__upper_font_data_end); |
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
151 |
30 | 152 for(const tFont* font = & __font_directory; font < &__font_directory_end; ++font) |
153 { | |
699 | 154 printf("Font: %x\n",(unsigned int)font); |
30 | 155 // Check END-OF-DIRECTORY magic marker |
156 if( font->length == (uint32_t)-1 ) | |
157 { | |
158 ASSERT( font == &FontT144 + 1 ); | |
159 break; | |
160 } | |
161 | |
162 // Check font descriptors are inside a safe range. | |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
163 ASSERT_RANGE( font->length, 10, 150 ); /* old 103: some fonts meanwhile contain more charactes */ |
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
164 ASSERT_RANGE( font->spacesize, 0, 28 ); /* old 18 : Awe40 has some size 28 characters */ |
30 | 165 ASSERT_RANGE( font->spacesize2Monospaced, 13, 72 ); |
166 ASSERT_RANGE( font->height, 28, 108 ); | |
167 | |
168 //---- Walk through each char ---------------------------------------- | |
169 for(int i = 0; i < font->length; ++i) | |
170 { | |
171 const tChar* c = &font->chars[i]; | |
172 | |
173 // Check char data is indeed stored in the actual data section | |
174 ASSERT_RANGE( c, &__upper_font_data, &__upper_font_data_end); | |
175 | |
176 // Check char data sanity | |
177 ASSERT_RANGE( c->code, 0x0000, 0xF143); | |
178 | |
179 // Check image sanity | |
180 const tImage* image = c->image; | |
181 ASSERT_RANGE(image, (tImage*)&__upper_font_data, (tImage*)&__upper_font_data_end); | |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
182 #if 0 /* common failure: root cause not clear */ |
30 | 183 ASSERT_RANGE(image->width, font->spacesize, font->spacesize2Monospaced); |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
184 #endif |
30 | 185 ASSERT(image->height == font->height); |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
186 if(errorflag) |
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
187 { |
699 | 188 printf("image %x: h=%d fonth=%d\n",(unsigned int)image,image->height,font->height); |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
189 errorflag = 0; |
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
190 } |
30 | 191 // Uncompress image bytes |
192 const uint8_t* byte = image->data; | |
193 ASSERT_RANGE(byte, (uint8_t*)&__upper_font_data, (uint8_t*)&__upper_font_data_end); | |
194 | |
195 for(int w=0; w <image->width; ++w) | |
196 { | |
197 // Compression: special 0x01 byte at start of column means just skip it. | |
198 if( *byte++ == 0x01 ) | |
199 continue; | |
200 | |
201 int zeros = (byte[-1] == 0x00) ? 1 : 0; | |
202 for(int h = 1; h < image->height; ++h) | |
203 { | |
204 if( *byte == 0x00 ) | |
205 ++zeros; | |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
206 #if 0 /* this rule is violated very often but does not seems to have an impact */ |
30 | 207 // Other bytes cannot have the 0x01 value... |
208 ASSERT( *byte++ != 0x01 ); | |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
209 #endif |
30 | 210 } |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
211 #if 0 /* just an information, not an error => activate if interested */ |
30 | 212 if( zeros == image->height ) |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
213 printf("Font[%d] char[%d]: could skip column %d \n", |
30 | 214 &__font_directory - font, i, w); |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
215 #endif |
30 | 216 } |
217 | |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
218 #if 0 /* byte usually pints to the next char ==> not sure what the check is about */ |
30 | 219 // Check the byte stream do not collide with the next char, |
220 // or with the first tImage struct of the font. | |
221 if( (i+1) < font->length ) | |
222 ASSERT( byte < font->chars[i+1].image->data ); | |
223 else | |
224 ASSERT( byte < (uint8_t*)font->chars[0].image ); | |
225 | |
226 // TODO: check image bytes are contiguous between chars. | |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
227 #endif |
30 | 228 } |
229 } | |
230 | |
231 if( errors ) | |
232 { | |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
233 printf("Font Check: %d errors.\n", errors); |
30 | 234 return -1; |
235 } | |
236 | |
76
51e2734895a3
Update Fontpack code to support font moved to upper memory
Ideenmodellierer
parents:
36
diff
changeset
|
237 printf("Font Check: no errors.\n"); |
30 | 238 return 0; |
239 } | |
123
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
240 /*#endif*/ |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
241 #else |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
242 #define ASSERT(e) \ |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
243 do { if( ! (e) ) { ++errors; errorflag = 1;} } while(0) |
30 | 244 |
123
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
245 #define ASSERT_RANGE(e, min, max) ASSERT(min <= e); ASSERT( e <= max) |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
246 |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
247 uint16_t errors = 1; |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
248 static uint8_t errorflag = 0; |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
249 uint16_t CheckFontPosition() |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
250 { |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
251 uint16_t retvalue; |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
252 ASSERT( & Awe48 == (tFont*)0x81DFE00 ); |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
253 ASSERT( & FontT24 == (tFont*)0x81DFE0c ); |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
254 ASSERT( & FontT42 == (tFont*)0x81DFE18 ); |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
255 ASSERT( & FontT48 == (tFont*)0x81DFE24 ); |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
256 ASSERT( & FontT54 == (tFont*)0x81DFE30 ); |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
257 ASSERT( & FontT84 == (tFont*)0x81DFE3c ); |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
258 ASSERT( & FontT105 == (tFont*)0x81DFE48 ); |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
259 ASSERT( & FontT144 == (tFont*)0x81DFE54 ); |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
260 retvalue = errors; |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
261 return retvalue; |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
262 } |
a984d87a1ec0
Added option to build FontPack as static libary which is linked to the Firmware project (to allow separate build settings)
Ideenmodellierer
parents:
76
diff
changeset
|
263 #endif |
30 | 264 /************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/ |