Subversion Repositories Kolibri OS

Rev

Rev 5008 | Rev 5010 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4994 IgorA 1
format MS COFF
2
public EXPORTS
3
section '.flat' code readable align 16
4
 
5
include '../../../../macros.inc'
6
include '../../../../proc32.inc'
7
 
8
 
9
 
10
;---------
5008 IgorA 11
offs_m_or_i    equ  8 ;смещение параметра 'MM' или 'II' (Motorola, Intel)
12
offs_id_gr     equ 10 ;смещение id group
13
offs_tag_0     equ  2 ;смещение 0-го тега
4994 IgorA 14
tag_size       equ 12 ;размер структуры тега
15
;форматы данных
16
tag_format_ui1b  equ  1 ;unsigned integer 1 byte
17
tag_format_text  equ  2 ;ascii string
18
tag_format_ui2b  equ  3 ;unsigned integer 2 byte
19
tag_format_ui4b  equ  4 ;unsigned integer 4 byte
4995 IgorA 20
tag_format_urb   equ  5 ;unsigned integer 4/4 byte
4994 IgorA 21
tag_format_si1b  equ  6 ;signed integer 1 byte
22
tag_format_undef equ  7 ;undefined
23
tag_format_si2b  equ  8 ;signed integer 2 byte
24
tag_format_si4b  equ  9 ;signed integer 4 byte
4995 IgorA 25
tag_format_srb   equ 10 ;signed integer 4/4 byte
4994 IgorA 26
tag_format_f4b	 equ 11 ;float 4 byte
27
tag_format_f8b	 equ 12 ;float 8 byte
28
 
29
align 4
30
txt_dp db ': ',0
5009 IgorA 31
txt_zap db ', ',0
4995 IgorA 32
txt_div db '/',0
4994 IgorA 33
 
34
;
35
align 4
36
exif_tag_numbers:
5008 IgorA 37
dd 0,      gr_0
38
dd 0x8769, gr_8769 ;Exif offset
39
dd 0xa005, gr_a005 ;Interop offset
40
dd 0x8825, gr_8825 ;GPS info
41
.end:
4994 IgorA 42
 
5008 IgorA 43
align 4
44
gr_0:
5002 IgorA 45
db 0x00,0x0b,'Processing software',0
46
db 0x00,0xfe,'Subfile type',0
47
db 0x00,0xff,'OldSubfile type',0
48
db 0x01,0x00,'Image width',0
49
db 0x01,0x01,'Image height',0
50
db 0x01,0x02,'Bits per sample',0
51
db 0x01,0x03,'Compression',0
52
db 0x01,0x06,'Photometric interpretation',0
53
db 0x01,0x07,'Thresholding',0
54
db 0x01,0x08,'Cell width',0
55
db 0x01,0x09,'Cell length',0
56
db 0x01,0x0a,'Fill order',0
57
db 0x01,0x0d,'Document name',0
4994 IgorA 58
db 0x01,0x0e,'Image description',0
59
db 0x01,0x0f,'Manufacturer of digicam',0
60
db 0x01,0x10,'Model',0
5002 IgorA 61
db 0x01,0x11,'Strip offsets',0
4994 IgorA 62
db 0x01,0x12,'Orientation',0
5002 IgorA 63
db 0x01,0x15,'Samples per pixel',0
64
db 0x01,0x16,'Rows per strip',0
65
db 0x01,0x17,'Strip byte counts',0
66
db 0x01,0x18,'Min sample value',0
67
db 0x01,0x19,'Max sample value',0
4994 IgorA 68
db 0x01,0x1a,'X resolution',0
69
db 0x01,0x1b,'Y resolution',0
5002 IgorA 70
db 0x01,0x1c,'Planar configuration',0
71
db 0x01,0x1d,'Page name',0
72
db 0x01,0x1e,'X position',0
73
db 0x01,0x1f,'Y position',0
74
db 0x01,0x20,'Free offsets',0
75
db 0x01,0x21,'Free byte counts',0
76
db 0x01,0x22,'Gray response unit',0
77
db 0x01,0x23,'Gray response curve',0
78
db 0x01,0x24,'T4 options',0
79
db 0x01,0x25,'T6 options',0
4994 IgorA 80
db 0x01,0x28,'Resolution unit',0
5002 IgorA 81
db 0x01,0x29,'Page number',0
82
db 0x01,0x2c,'Color response unit',0
83
db 0x01,0x2d,'Transfer function',0
4994 IgorA 84
db 0x01,0x31,'Software',0
5002 IgorA 85
db 0x01,0x32,'Modify date',0
86
db 0x01,0x3b,'Artist',0
87
db 0x01,0x3c,'Host computer',0
88
db 0x01,0x3d,'Predictor',0
4994 IgorA 89
db 0x01,0x3e,'White point',0
90
db 0x01,0x3f,'Primary chromaticities',0
5002 IgorA 91
db 0x01,0x40,'Color map',0
92
db 0x01,0x41,'Halftone hints',0
93
db 0x01,0x42,'Tile width',0
94
db 0x01,0x43,'Tile length',0
95
db 0x01,0x44,'Tile offsets',0
96
db 0x01,0x45,'Tile byte counts',0
97
db 0x01,0x46,'Bad fax lines',0
98
db 0x01,0x47,'Clean fax data',0
99
db 0x01,0x48,'Consecutive bad fax lines',0
100
db 0x01,0x4a,'Sub IFDs',0
101
db 0x01,0x4c,'Ink set',0
102
db 0x01,0x4d,'Ink names',0
103
db 0x01,0x4e,'Numberof inks',0
104
db 0x01,0x50,'Dot range',0
105
db 0x01,0x51,'Target printer',0
106
db 0x01,0x52,'Extra samples',0
107
db 0x01,0x53,'Sample format',0
108
db 0x01,0x54,'SMin sample value',0
109
db 0x01,0x55,'SMax sample value',0
110
db 0x01,0x56,'Transfer range',0
111
db 0x01,0x57,'Clip path',0
112
db 0x01,0x58,'X clip path units',0
113
db 0x01,0x59,'Y clip path units',0
114
db 0x01,0x5a,'Indexed',0
115
db 0x01,0x5b,'JPEG tables',0
116
db 0x01,0x5f,'OPIProxy',0
117
db 0x01,0x90,'Global parameters IFD',0
118
db 0x01,0x91,'Profile type',0
119
db 0x01,0x92,'Fax profile',0
120
db 0x01,0x93,'Coding methods',0
121
db 0x01,0x94,'Version year',0
122
db 0x01,0x95,'Mode number',0
123
db 0x01,0xb1,'Decode',0
124
db 0x01,0xb2,'Default image color',0
125
db 0x01,0xb3,'T82 options',0
126
db 0x01,0xb5,'JPEG tables',0 ;уже было ?
127
db 0x02,0x00,'JPEG proc',0
128
db 0x02,0x01,'Thumbnail offset',0
129
db 0x02,0x02,'Thumbnail length',0
130
db 0x02,0x03,'JPEG restart interval',0
131
db 0x02,0x05,'JPEG lossless predictors',0
132
db 0x02,0x06,'JPEG point transforms',0
133
db 0x02,0x07,'JPEG QTables',0
134
db 0x02,0x08,'JPEG DCTables',0
135
db 0x02,0x09,'JPEG ACTables',0
4994 IgorA 136
db 0x02,0x11,'YCbCrCoefficients',0
5002 IgorA 137
db 0x02,0x12,'YCbCrSubSampling',0
4994 IgorA 138
db 0x02,0x13,'YCbCrPositioning',0
139
db 0x02,0x14,'Reference black white',0
5002 IgorA 140
db 0x02,0x2f,'Strip row counts',0
141
db 0x03,0xe7,'USPTO Miscellaneous',0
142
db 0x47,0x46,'Rating',0
143
db 0x47,0x47,'XP_DIP_XML',0
144
db 0x47,0x48,'Stitch info',0
145
db 0x47,0x49,'Rating percent',0
146
db 0x80,0x0d,'Image ID',0
147
db 0x80,0xa3,'Wang tag 1',0
148
db 0x80,0xa4,'Wang annotation',0
149
db 0x80,0xa5,'Wang tag 3',0
150
db 0x80,0xa6,'Wang tag 4',0
151
db 0x80,0xe3,'Matteing',0
152
db 0x80,0xe4,'Data type',0
153
db 0x80,0xe5,'Image depth',0
154
db 0x80,0xe6,'Tile depth',0
155
db 0x82,0x7d,'Model 2',0
156
db 0x82,0x8d,'CFA repeat pattern dim',0
157
db 0x82,0x8e,'CFA pattern 2',0
158
db 0x82,0x8f,'Battery level',0
159
db 0x82,0x90,'Kodak IFD',0
4994 IgorA 160
db 0x82,0x98,'Copyright',0
5002 IgorA 161
db 0x82,0xa5,'MD file tag',0
162
db 0x82,0xa6,'MD scale pixel',0
163
db 0x82,0xa7,'MD color table',0
164
db 0x82,0xa8,'MD lab name',0
165
db 0x82,0xa9,'MD sample info',0
166
db 0x82,0xaa,'MD prep date',0
167
db 0x82,0xab,'MD prep time',0
168
db 0x82,0xac,'MD file units',0
169
db 0x83,0x0e,'Pixel scale',0
170
db 0x83,0x35,'Advent scale',0
171
db 0x83,0x36,'Advent revision',0
172
db 0x83,0x5c,'UIC1 tag',0
173
db 0x83,0x5d,'UIC2 tag',0
174
db 0x83,0x5e,'UIC3 tag',0
175
db 0x83,0x5f,'UIC4 tag',0
176
db 0x83,0xbb,'IPTC-NAA',0
177
db 0x84,0x7e,'Intergraph packet data',0
178
db 0x84,0x7f,'Intergraph flag registers',0
179
db 0x84,0x80,'Intergraph matrix',0
180
db 0x84,0x81,'INGR reserved',0
181
db 0x84,0x82,'Model tie point',0
182
db 0x84,0xe0,'Site',0
183
db 0x84,0xe1,'Color sequence',0
184
db 0x84,0xe2,'IT8 header',0
185
db 0x84,0xe3,'Raster padding',0
186
db 0x84,0xe4,'Bits per run length',0
187
db 0x84,0xe5,'Bits per extended run length',0
188
db 0x84,0xe6,'Color table',0
189
db 0x84,0xe7,'Image color indicator',0
190
db 0x84,0xe8,'Background color indicator',0
191
db 0x84,0xe9,'Image color value',0
192
db 0x84,0xea,'Background color value',0
193
db 0x84,0xeb,'Pixel intensity range',0
194
db 0x84,0xec,'Transparency indicator',0
195
db 0x84,0xed,'Color characterization',0
196
db 0x84,0xee,'HCUsage',0
197
db 0x84,0xef,'Trap indicator',0
198
db 0x84,0xf0,'CMYK equivalent',0
199
db 0x85,0x46,'SEM info',0
200
db 0x85,0x68,'AFCP_IPTC',0
201
db 0x85,0xb8,'Pixel magic JBIG options',0
202
db 0x85,0xd8,'Model transform',0
203
db 0x86,0x02,'WB_GRGB levels',0
204
db 0x86,0x06,'Leaf data',0
205
db 0x86,0x49,'Photoshop settings',0
4994 IgorA 206
db 0x87,0x69,'Exif offset',0
5002 IgorA 207
db 0x87,0x73,'ICC_Profile',0
208
db 0x87,0x7f,'TIFF_FX extensions',0
209
db 0x87,0x80,'Multi profiles',0
210
db 0x87,0x81,'Shared data',0
211
db 0x87,0x82,'T88 options',0
212
db 0x87,0xac,'Image layer',0
213
db 0x87,0xaf,'Geo tiff directory',0
214
db 0x87,0xb0,'Geo tiff double params',0
215
db 0x87,0xb1,'Geo tiff ascii params',0
5009 IgorA 216
db 0x88,0x25,'GPS info',0
5002 IgorA 217
db 0x88,0x28,'Opto-Electric conv factor',0
218
db 0x88,0x29,'Interlace',0
219
db 0x88,0x5c,'Fax recv params',0
220
db 0x88,0x5d,'Fax sub address',0
221
db 0x88,0x5e,'Fax recv time',0
222
db 0x88,0x8a,'Leaf sub IFD',0
223
db 0x92,0x0b,'Flash energy',0
224
db 0x92,0x0c,'Spatial frequency response',0
225
db 0x92,0x0d,'Noise',0
226
db 0x92,0x0e,'Focal plane X resolution',0
227
db 0x92,0x0f,'Focal plane Y resolution',0
228
db 0x92,0x10,'Focal plane resolution unit',0
229
db 0x92,0x15,'Exposure index',0
230
db 0x92,0x16,'TIFF-EP standard ID',0
231
db 0x92,0x17,'Sensing method',0
232
db 0x92,0x3a,'CIP3 data file',0
233
db 0x92,0x3b,'CIP3 sheet',0
234
db 0x92,0x3c,'CIP3 side',0
235
db 0x92,0x3f,'Sto nits',0
236
db 0x93,0x2f,'MS document text',0
237
db 0x93,0x30,'MS property set storage',0
238
db 0x93,0x31,'MS document text position',0
239
db 0x93,0x5c,'Image source data',0
240
db 0x9c,0x9b,'XP title',0
241
db 0x9c,0x9c,'XP comment',0
242
db 0x9c,0x9d,'XP author',0
243
db 0x9c,0x9e,'XP keywords',0
244
db 0x9c,0x9f,'XP subject',0
245
db 0xa2,0x0c,'Spatial frequency fesponse',0
246
db 0xa2,0x0d,'Noise',0
247
db 0xa2,0x11,'Image number',0
248
db 0xa2,0x12,'Security classification',0
249
db 0xa2,0x13,'Image history',0
250
db 0xa2,0x16,'TIFF-EP standard ID',0
4995 IgorA 251
db 0xa4,0x80,'GDAL metadata',0
252
db 0xa4,0x81,'GDAL no data',0
253
db 0xaf,0xc0,'Expand software',0
254
db 0xaf,0xc1,'Expand lens',0
255
db 0xaf,0xc2,'Expand film',0
256
db 0xaf,0xc3,'Expand filterLens',0
257
db 0xaf,0xc4,'Expand scanner',0
258
db 0xaf,0xc5,'Expand flash lamp',0
5002 IgorA 259
db 0xbc,0x01,'Pixel format',0
260
db 0xbc,0x02,'Transformation',0
261
db 0xbc,0x03,'Uncompressed',0
262
db 0xbc,0x04,'Image type',0
263
db 0xbc,0x80,'Image width',0
264
db 0xbc,0x81,'Image height',0
265
db 0xbc,0x82,'Width resolution',0
266
db 0xbc,0x83,'Height resolution',0
267
db 0xbc,0xc0,'Image offset',0
268
db 0xbc,0xc1,'Image byte count',0
269
db 0xbc,0xc2,'Alpha offset',0
270
db 0xbc,0xc3,'Alpha byte count',0
271
db 0xbc,0xc4,'Image data discard',0
272
db 0xbc,0xc5,'Alpha data discard',0
273
db 0xc4,0x27,'Oce scanjob desc',0
274
db 0xc4,0x28,'Oce application selector',0
275
db 0xc4,0x29,'Oce ID number',0
276
db 0xc4,0x2a,'Oce image logic',0
277
db 0xc4,0x4f,'Annotations',0
278
db 0xc4,0xa5,'Print IM',0
279
db 0xc5,0x73,'Original file name',0
280
db 0xc5,0x80,'USPTO original content type',0
281
db 0xc6,0x12,'DNG version',0
282
db 0xc6,0x13,'DNG backward version',0
283
db 0xc6,0x14,'Unique camera model',0
284
db 0xc6,0x15,'Localized camera model',0
285
db 0xc6,0x16,'CFA plane color',0
286
db 0xc6,0x17,'CFA layout',0
287
db 0xc6,0x18,'Linearization table',0
288
db 0xc6,0x19,'Black level repeat dim',0
289
db 0xc6,0x1a,'Black level',0
290
db 0xc6,0x1b,'Black level delta H',0
291
db 0xc6,0x1c,'Black level delta V',0
292
db 0xc6,0x1d,'White level',0
293
db 0xc6,0x1e,'Default scale',0
294
db 0xc6,0x1f,'Default crop origin',0
295
db 0xc6,0x20,'Default crop size',0
296
db 0xc6,0x21,'Color matrix 1',0
297
db 0xc6,0x22,'Color matrix 2',0
298
db 0xc6,0x23,'Camera calibration 1',0
299
db 0xc6,0x24,'Camera calibration 2',0
300
db 0xc6,0x25,'Reduction matrix 1',0
301
db 0xc6,0x26,'Reduction matrix 2',0
302
db 0xc6,0x27,'Analog balance',0
303
db 0xc6,0x28,'As shot neutral',0
304
db 0xc6,0x29,'As shot white XY',0
305
db 0xc6,0x2a,'BaselineExposure',0
306
db 0xc6,0x2b,'BaselineNoise',0
307
db 0xc6,0x2c,'BaselineSharpness',0
308
db 0xc6,0x2d,'BayerGreenSplit',0
309
db 0xc6,0x2e,'Linear response limit',0
310
db 0xc6,0x2f,'Camera serial number',0
311
db 0xc6,0x30,'DNG lens info',0
312
db 0xc6,0x31,'Chroma blur radius',0
313
db 0xc6,0x32,'Anti alias strength',0
314
db 0xc6,0x33,'Shadow scale',0
315
db 0xc6,0x34,'SR2 private',0
316
db 0xc6,0x35,'Maker note safety',0
317
db 0xc6,0x40,'Raw image segmentation',0
318
db 0xc6,0x5a,'Calibration illuminant 1',0
319
db 0xc6,0x5b,'Calibration illuminant 2',0
320
db 0xc6,0x5c,'Best quality scale',0
321
db 0xc6,0x5d,'Raw data unique ID',0
322
db 0xc6,0x60,'Alias layer metadata',0
323
db 0xc6,0x8b,'Original raw file name',0
324
db 0xc6,0x8c,'Original raw file data',0
325
db 0xc6,0x8d,'Active area',0
326
db 0xc6,0x8e,'Masked areas',0
327
db 0xc6,0x8f,'AsShot ICC profile',0
328
db 0xc6,0x90,'AsShot pre profile matrix',0
329
db 0xc6,0x91,'Current ICC profile',0
330
db 0xc6,0x92,'Current pre profile matrix',0
331
db 0xc6,0xbf,'Colorimetric reference',0
332
db 0xc6,0xd2,'Panasonic title',0
333
db 0xc6,0xd3,'Panasonic title 2',0
334
db 0xc6,0xf3,'Camera calibration sig',0
335
db 0xc6,0xf4,'Profile calibration sig',0
336
db 0xc6,0xf5,'Profile IFD',0
337
db 0xc6,0xf6,'AsShot profile name',0
338
db 0xc6,0xf7,'Noise reduction applied',0
339
db 0xc6,0xf8,'Profile name',0
340
db 0xc6,0xf9,'Profile hue sat map dims',0
341
db 0xc6,0xfa,'Profile hue sat map data 1',0
342
db 0xc6,0xfb,'Profile hue sat map data 2',0
343
db 0xc6,0xfc,'Profile tone curve',0
344
db 0xc6,0xfd,'Profile embed policy',0
345
db 0xc6,0xfe,'Profile copyright',0
346
db 0xc7,0x14,'Forward matrix 1',0
347
db 0xc7,0x15,'Forward matrix 2',0
348
db 0xc7,0x16,'Preview application name',0
349
db 0xc7,0x17,'Preview application version',0
350
db 0xc7,0x18,'Preview settings name',0
351
db 0xc7,0x19,'Preview settings digest',0
352
db 0xc7,0x1a,'Preview color space',0
353
db 0xc7,0x1b,'Preview date time',0
354
db 0xc7,0x1c,'Raw image digest',0
355
db 0xc7,0x1d,'Original raw file digest',0
356
db 0xc7,0x1e,'Sub tile block size',0
357
db 0xc7,0x1f,'Row interleave factor',0
358
db 0xc7,0x25,'Profile look table dims',0
359
db 0xc7,0x26,'Profile look table data',0
360
db 0xc7,0x40,'Opcode list 1',0
361
db 0xc7,0x41,'Opcode list 2',0
362
db 0xc7,0x4e,'Opcode list 3',0
363
db 0xc7,0x61,'Noise profile',0
364
db 0xc7,0x63,'Time codes',0
365
db 0xc7,0x64,'Frame rate',0
366
db 0xc7,0x72,'TStop',0
367
db 0xc7,0x89,'Reel name',0
368
db 0xc7,0x91,'Original default final size',0
369
db 0xc7,0x92,'Original best quality size',0
370
db 0xc7,0x93,'Original default crop size',0
371
db 0xc7,0xa1,'Camera label',0
372
db 0xc7,0xa3,'Profile hue sat map encoding',0
373
db 0xc7,0xa4,'Profile look table encoding',0
374
db 0xc7,0xa5,'Baseline exposure offset',0
375
db 0xc7,0xa6,'Default black render',0
376
db 0xc7,0xa7,'New raw image digest',0
377
db 0xc7,0xa8,'Raw to preview gain',0
378
db 0xc7,0xb5,'Default user crop',0
5008 IgorA 379
db 0xfe,0x00,'KDC_IFD',0
380
 
381
dd 0
382
 
383
align 4
384
gr_8769:
385
db 0x02,0xbc,'Application notes',0
386
db 0x82,0x9a,'Exposure time',0
387
db 0x82,0x9d,'F number',0
388
db 0x88,0x22,'Exposure program',0
389
db 0x88,0x24,'Spectral sensitivity',0
390
db 0x88,0x27,'ISO',0
391
db 0x88,0x2a,'Time zone offset',0
392
db 0x88,0x2b,'Self timer mode',0
393
db 0x88,0x30,'Sensitivity type',0
394
db 0x88,0x31,'Standard output sensitivity',0
395
db 0x88,0x32,'Recommended exposure index',0
396
db 0x88,0x33,'ISO speed',0
397
db 0x88,0x34,'ISO speed latitude yyy',0
398
db 0x88,0x35,'ISO speed latitude zzz',0
399
db 0x90,0x00,'Exif version',0
400
db 0x90,0x03,'Date time original',0
401
db 0x90,0x04,'Create date',0
402
db 0x91,0x01,'Components configuration',0
403
db 0x91,0x02,'Compressed bits per pixel',0
404
db 0x92,0x01,'Shutter speed value',0
405
db 0x92,0x02,'Aperture value',0
406
db 0x92,0x03,'Brightness value',0
407
db 0x92,0x04,'Exposure compensation',0
408
db 0x92,0x05,'Max aperture value',0
409
db 0x92,0x06,'Subject distance',0
410
db 0x92,0x07,'Metering mode',0
411
db 0x92,0x08,'Light source',0
412
db 0x92,0x09,'Flash',0
413
db 0x92,0x0a,'Focal length',0
414
db 0x92,0x11,'Image number',0
415
db 0x92,0x12,'Security classification',0
416
db 0x92,0x13,'Image history',0
417
db 0x92,0x14,'Subject area',0
418
db 0x92,0x7c,'Maker note',0
419
db 0x92,0x86,'User comment',0
420
db 0x92,0x90,'Sub sec time',0
421
db 0x92,0x91,'Sub sec time original',0
422
db 0x92,0x92,'Sub sec time digitized',0
423
db 0xa0,0x00,'Flashpix version',0
424
db 0xa0,0x01,'Color space',0
425
db 0xa0,0x02,'Exif image width',0
426
db 0xa0,0x03,'Exif image height',0
427
db 0xa0,0x04,'Related sound file',0
428
db 0xa0,0x05,'Interop offset',0
429
db 0xa2,0x0b,'Flash energy',0
430
db 0xa2,0x0e,'Focal plane X resolution',0
431
db 0xa2,0x0f,'Focal plane Y resolution',0
432
db 0xa2,0x10,'Focal plane resolution unit',0
433
db 0xa2,0x14,'Subject location',0
434
db 0xa2,0x15,'Exposure index',0
435
db 0xa2,0x17,'Sensing method',0
436
db 0xa3,0x00,'File source',0
437
db 0xa3,0x01,'Scene type',0
438
db 0xa3,0x02,'CFA pattern',0
439
db 0xa4,0x01,'Custom rendered',0
440
db 0xa4,0x02,'Exposure mode',0
441
db 0xa4,0x03,'White balance',0
442
db 0xa4,0x04,'Digital zoom ratio',0
443
db 0xa4,0x05,'Focal length in 35mm format',0
444
db 0xa4,0x06,'Scene capture type',0
445
db 0xa4,0x07,'Gain control',0
446
db 0xa4,0x08,'Contrast',0
447
db 0xa4,0x09,'Saturation',0
448
db 0xa4,0x0a,'Sharpness',0
449
db 0xa4,0x0b,'Device setting description',0
450
db 0xa4,0x0c,'Subject distance range',0
451
db 0xa4,0x20,'Image unique ID',0
452
db 0xa4,0x30,'Owner name',0
453
db 0xa4,0x31,'Serial number',0
454
db 0xa4,0x32,'Lens info',0
455
db 0xa4,0x33,'Lens make',0
456
db 0xa4,0x34,'Lens model',0
457
db 0xa4,0x35,'Lens serial number',0
458
db 0xa5,0x00,'Gamma',0
5002 IgorA 459
db 0xea,0x1c,'Padding',0
460
db 0xea,0x1d,'Offset schema',0
461
db 0xfd,0xe8,'Owner name',0
462
db 0xfd,0xe9,'Serial number',0
463
db 0xfd,0xea,'Lens',0
464
db 0xfe,0x4c,'Raw file',0
465
db 0xfe,0x4d,'Converter',0
466
db 0xfe,0x4e,'White balance',0
467
db 0xfe,0x51,'Exposure',0
468
db 0xfe,0x52,'Shadows',0
469
db 0xfe,0x53,'Brightness',0
470
db 0xfe,0x54,'Contrast',0
471
db 0xfe,0x55,'Saturation',0
472
db 0xfe,0x56,'Sharpness',0
473
db 0xfe,0x57,'Smoothness',0
474
db 0xfe,0x58,'Moire filter',0
4995 IgorA 475
 
5008 IgorA 476
dd 0
477
 
478
align 4
479
gr_a005:
480
db 0x00,0x01,'Interop index',0
481
db 0x00,0x02,'Interop version',0
482
db 0x10,0x00,'Related image file format',0
483
db 0x10,0x01,'Related image width',0
484
db 0x10,0x02,'Related image height',0
485
dd 0
486
 
487
align 4
488
gr_8825:
5007 IgorA 489
db 0x00,0x00,'GPS version ID',0
5008 IgorA 490
db 0x00,0x01,'GPS latitude ref',0
491
db 0x00,0x02,'GPS latitude',0
492
db 0x00,0x03,'GPS longitude ref',0
493
db 0x00,0x04,'GPS longitude',0
494
db 0x00,0x05,'GPS altitude ref',0
495
db 0x00,0x06,'GPS altitude',0
496
db 0x00,0x07,'GPS time stamp',0
497
db 0x00,0x08,'GPS satellites',0
498
db 0x00,0x09,'GPS status',0
499
db 0x00,0x0a,'GPS measuremode',0
500
db 0x00,0x0b,'GPS dop',0
501
db 0x00,0x0c,'GPS speed ref',0
502
db 0x00,0x0d,'GPS speed',0
503
db 0x00,0x0e,'GPS track ref',0
504
db 0x00,0x0f,'GPS track',0
505
db 0x00,0x10,'GPS img direction ref',0
506
db 0x00,0x11,'GPS img direction',0
507
db 0x00,0x12,'GPS map datum',0
508
db 0x00,0x13,'GPS dest latitude ref',0
509
db 0x00,0x14,'GPS dest latitude',0
510
db 0x00,0x15,'GPS dest longitude ref',0
511
db 0x00,0x16,'GPS dest longitude',0
512
db 0x00,0x17,'GPS dest bearing ref',0
513
db 0x00,0x18,'GPS dest bearing',0
514
db 0x00,0x19,'GPS dest distance ref',0
515
db 0x00,0x1a,'GPS dest distance',0
516
db 0x00,0x1b,'GPS processing method',0
517
db 0x00,0x1c,'GPS area information',0
518
db 0x00,0x1d,'GPS date stamp',0
519
db 0x00,0x1e,'GPS differential',0
520
db 0x00,0x1f,'GPS h positioning error',0
4994 IgorA 521
 
5007 IgorA 522
dd 0
523
 
4994 IgorA 524
;input:
525
; bof - указатель на начало файла
526
; app1 - указатель для заполнения exif.app1
527
;output:
528
; app1 - указатель на начало exif.app1 (или 0 если не найдено или формат файла не поддерживается)
529
align 4
530
proc exif_get_app1 uses eax ebx edi, bof:dword, app1:dword
531
	mov eax,[bof]
532
	mov edi,[app1]
533
 
534
	;файл в формате jpg?
535
	cmp word[eax],0xd8ff
536
	jne .no_exif
537
	add eax,2
538
 
539
	;файл содержит exif.app0?
540
	cmp word[eax],0xe0ff
541
	jne @f
542
		add eax,2
543
		movzx ebx,word[eax]
544
		ror bx,8 ;всегда ли так надо?
545
		add eax,ebx
546
	@@:
547
 
548
	;файл содержит exif.app1?
549
	cmp word[eax],0xe1ff
550
	jne .no_exif
551
 
5007 IgorA 552
	xor ebx,ebx
553
	cmp word[eax+10],'II'
554
	je @f
555
		inc ebx ;if 'MM' edx=1
556
	@@:
557
	mov [edi+offs_m_or_i],ebx
5008 IgorA 558
	;пишем одной командой в dword[edi+offs_m_or_i]
559
	;в младшие 2 байта способ выравнивания чисел
560
	;в старшие 2 байта id групы, который всегда 0 для app1
5007 IgorA 561
	add eax,18
4994 IgorA 562
	mov [edi],eax
5007 IgorA 563
	sub eax,8
564
	mov [edi+4],eax
4994 IgorA 565
 
566
	jmp @f
567
	.no_exif:
568
		mov dword[edi],0
569
	@@:
570
	ret
571
endp
572
 
573
;input:
574
; app1 - указатель на начало exif.app1
575
; num - порядковый номер тега (начинается с 1)
576
; txt - указатель на текст, куда будет записано значение
577
; t_max - максимальный размер текста
578
align 4
579
proc exif_get_app1_tag, app1:dword, num:dword, txt:dword, t_max:dword
580
pushad
581
	mov eax,[app1]
582
	mov edi,[txt]
583
	mov ecx,[num]
584
 
585
	xor edx,edx
5002 IgorA 586
	mov byte[edi],dl
5007 IgorA 587
	cmp [eax],edx
4994 IgorA 588
	je .end_f ;если не найден указатель на начало exif.app1
589
	cmp ecx,edx
590
	jle .end_f ;если порядковый номер тега <= 0
591
 
5007 IgorA 592
	movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1
4994 IgorA 593
 
594
	;проверяем число тегов
5007 IgorA 595
	mov eax,[eax]
596
	movzx ebx,word[eax]
4994 IgorA 597
	bt edx,0
598
	jnc @f
599
		ror bx,8
600
	@@:
601
	cmp ecx,ebx
602
	jg .end_f ;если номер тега больше чем их есть в файле
603
 
604
	;переходим на заданный тег
605
	dec ecx
606
	imul ecx,tag_size
607
	add eax,offs_tag_0
608
	add eax,ecx
609
 
5002 IgorA 610
	stdcall read_tag_value,[app1],[t_max]
611
 
612
	.end_f:
613
popad
614
	ret
615
endp
616
 
617
;input:
5007 IgorA 618
; app1 - указатель на exif.app1 или на exif.app1.child
5002 IgorA 619
; child - указатель для заполнения начала дочерних тегов exif.app1.child
620
; c_tag - тег для которого делается поиск дочерних
621
;output:
622
; child - указатель на начало дочерних тегов
623
align 4
624
proc exif_get_app1_child, app1:dword, child:dword , c_tag:dword
625
pushad
626
	mov eax,[app1]
627
	mov edi,[child]
628
 
629
	xor edx,edx
5007 IgorA 630
	cmp [eax],edx
631
	je .no_found ;если не найден указатель на начало exif.app1
5002 IgorA 632
 
5007 IgorA 633
	movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1
5002 IgorA 634
 
635
	;начало поиска
636
	mov ebx,[c_tag]
637
	bt edx,0
638
	jnc @f
639
		ror bx,8
640
	@@:
641
 
642
	;проверяем число тегов
5007 IgorA 643
	mov eax,[eax]
644
	movzx ecx,word[eax]
5002 IgorA 645
	bt edx,0
646
	jnc @f
647
		ror cx,8
648
	@@:
649
	cmp ecx,1
5007 IgorA 650
	jl .no_found ;если число тегов <1
5002 IgorA 651
 
652
	;переходим на 1-й тег
653
	add eax,offs_tag_0
654
	@@:
655
		cmp word[eax],bx
656
		je @f
657
		add eax,tag_size
658
		loop @b
5007 IgorA 659
	jmp .no_found ;если не найдено
5002 IgorA 660
	@@: ;если найдено
661
		mov ebx,dword[eax+8]
662
		bt edx,0
663
		jnc @f
664
			ror bx,8
665
			ror ebx,16
666
			ror bx,8
667
		@@:
5007 IgorA 668
		mov eax,[app1]
669
		add ebx,[eax+4]
5002 IgorA 670
		mov dword[edi],ebx
5007 IgorA 671
		m2m dword[edi+4],dword[eax+4]
5008 IgorA 672
		ror edx,16
673
		mov dx,word[c_tag]
674
		ror edx,16
5007 IgorA 675
		mov dword[edi+offs_m_or_i],edx
5002 IgorA 676
 
5007 IgorA 677
	jmp .end_f
678
	.no_found:
679
		mov dword[edi],0
5002 IgorA 680
	.end_f:
681
popad
682
	ret
683
endp
684
 
5009 IgorA 685
;output:
686
; app2 - указатель на начало exif.app2 (или 0 если не найдено или формат файла не поддерживается)
687
align 4
688
proc exif_get_app2, app1:dword, app2:dword
689
pushad
690
	mov eax,[app1]
691
	cmp [eax],edx
692
	je .no_suport ;если не найден указатель на начало exif.app1
693
 
694
	mov edi,[app2]
695
	movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1
696
 
697
	;начало поиска производителя камеры
698
	mov ebx,0x010f
699
	bt edx,0
700
	jnc @f
701
		ror bx,8
702
	@@:
703
 
704
	;проверяем число тегов
705
	mov eax,[eax]
706
	movzx ecx,word[eax]
707
	bt edx,0
708
	jnc @f
709
		ror cx,8
710
	@@:
711
	cmp ecx,1
712
	jl .no_suport ;если число тегов <1
713
 
714
	;переходим на 1-й тег
715
	add eax,offs_tag_0
716
	@@:
717
		cmp word[eax],bx
718
		je @f
719
		add eax,tag_size
720
		loop @b
721
	jmp .no_suport ;если не найдено
722
	@@: ;если найдено
723
		mov ebx,dword[eax+4]
724
		bt edx,0
725
		jnc @f
726
			ror bx,8
727
			ror ebx,16
728
			ror bx,8
729
		@@:
730
		cmp ebx,4
731
		jle .no_suport ;название производителя меньше 4 символов, не поддержиавается
732
 
733
		mov ebx,dword[eax+8]
734
		bt edx,0
735
		jnc @f
736
			ror bx,8
737
			ror ebx,16
738
			ror bx,8
739
		@@:
740
 
741
	;проверка поддерживаемых производителей
742
	mov eax,[app1]
743
	add ebx,[eax+4]
744
	cmp dword[ebx],'Cano'
745
	je .suport
746
	cmp dword[ebx],'NIKO'
747
	je .suport
748
	cmp dword[ebx],'Pana'
749
	je .suport
750
 
751
	;все остальные не поддерживаются
752
	jmp .no_suport
753
 
754
	.suport:
755
	;находим тег 0x8769 (расширенные данные по Exif)
756
	stdcall exif_get_app1_child, eax,edi,0x8769
757
	cmp dword[edi],0
758
	je .no_suport
759
	;находим тег 0xa005 (данные Maker по камере)
760
	stdcall exif_get_app1_child, edi,edi, 0x927c
761
	cmp dword[edi],0
762
	je .no_suport
763
 
764
	cmp dword[ebx],'NIKO'
765
	jne @f
766
		add dword[edi],18 ;for Nikon
767
	@@:
768
	cmp dword[ebx],'Pana'
769
	jne @f
770
		add dword[edi],12 ;for Panasonic
771
	@@:
772
 
773
	jmp @f
774
	.no_suport:
775
		mov dword[edi],0
776
	@@:
777
popad
778
	ret
779
endp
780
 
5002 IgorA 781
;description:
782
; вспомогательная функция для чтения назначений тегов
783
;input:
784
; eax - указатель начала тега
785
; edi - указатель на память для записи текстовой строки
786
align 4
787
proc read_tag_value, app1:dword, t_max:dword
4994 IgorA 788
	push exif_tag_numbers
789
	pop esi
5008 IgorA 790
 
791
	;поиск таблицы для группы тегов
792
	mov ebx,[app1]
793
	mov bx,word[ebx+offs_id_gr] ;берем идентификатор группы тегов
794
	@@:
795
		cmp word[esi],bx
796
		je .set_table
797
		add esi,8
798
		cmp esi,exif_tag_numbers.end
799
		jge .tag_unknown ;тег не опознан (не найдена таблица группы тегов)
800
		jmp @b
801
	.set_table:
802
		mov esi,dword[esi+4] ;установка адреса таблицы в esi
803
 
804
	;поиск названия тега в таблице
4994 IgorA 805
	.next_tag:
806
	mov bx,word[esi]
807
	cmp bx,0
5007 IgorA 808
	jne @f
809
		cmp dword[esi],0
810
		jne @f
5008 IgorA 811
		jmp .tag_unknown ;тег не опознан (в группе не найден тег)
5007 IgorA 812
	@@:
4994 IgorA 813
	bt edx,0
814
	jc @f
815
		ror bx,8
816
	@@:
817
	cmp word[eax],bx
818
	je .found
819
	inc esi
820
	@@:
821
		inc esi
822
		cmp byte[esi],0
823
		jne @b
824
	inc esi
825
	jmp .next_tag
826
	.found:
827
 
5008 IgorA 828
	;копируем строку с названием тега
4994 IgorA 829
	add esi,2
830
	stdcall str_n_cat,edi,esi,[t_max]
831
 
5009 IgorA 832
	jmp .start_read
4995 IgorA 833
	.tag_unknown:
5008 IgorA 834
		;если тег не найден ставим его код вместо названия
835
		movzx ebx,word[eax]
5009 IgorA 836
		bt edx,0
837
		jnc @f
838
			ror bx,8
839
		@@:
5008 IgorA 840
		stdcall hex_in_str, edi, ebx,4
841
		mov byte[edi+4],0
5009 IgorA 842
	.start_read:
4995 IgorA 843
 
4994 IgorA 844
	;читаем информацию в теге
5008 IgorA 845
	mov bx,tag_format_ui1b
846
	bt edx,0
847
	jnc @f
848
		ror bx,8
849
	@@:
850
	cmp word[eax+2],bx
851
	jne .tag_01
852
		stdcall str_n_cat,edi,txt_dp,[t_max]
853
		call get_tag_data_size
5009 IgorA 854
		cmp ebx,4
855
		jg .over4b_01
5008 IgorA 856
		cmp ebx,1
5009 IgorA 857
		je @f
858
			or edx,2 ;array data
859
			mov ecx,dword[eax+8]
860
			mov dh,bl
861
		@@:
862
			;если 1 одно байтовое число
5008 IgorA 863
			movzx ebx,byte[eax+8]
864
			stdcall str_len,edi
865
			add edi,eax
866
			mov eax,ebx
867
			call convert_int_to_str ;[t_max]
5009 IgorA 868
			bt edx,1
869
			jnc .end_f
870
			@@:
871
				;если от 2 до 4 одно байтовых чисел
872
				dec dh
873
				cmp dh,0
874
				je .end_f
875
				shr ecx,8
876
				stdcall str_n_cat,edi,txt_zap,[t_max]
877
				stdcall str_len,edi
878
				add edi,eax
879
				movzx eax,cl
880
				call convert_int_to_str ;[t_max]
881
				jmp @b
5008 IgorA 882
		.over4b_01:
883
			;...
884
		jmp .end_f
885
	.tag_01:
886
 
4994 IgorA 887
	mov bx,tag_format_text
888
	bt edx,0
889
	jnc @f
890
		ror bx,8
891
	@@:
892
	cmp word[eax+2],bx
893
	jne .tag_02
894
		stdcall str_n_cat,edi,txt_dp,[t_max]
4995 IgorA 895
		call get_tag_data_size ;проверяем длинну строки
4994 IgorA 896
		cmp ebx,4
897
		jg @f
898
			;если строка помещается в 4 символа
899
			mov esi,eax
900
			add esi,8
901
			stdcall str_n_cat,edi,esi,[t_max]
902
			jmp .end_f
903
		;если строка не помещается в 4 символа
904
		@@:
905
		mov esi,dword[eax+8]
906
		bt edx,0
907
		jnc @f
908
			ror si,8
909
			ror esi,16
910
			ror si,8
911
		@@:
5007 IgorA 912
		mov eax,[app1]
913
		mov eax,[eax+4]
914
		add esi,eax
4994 IgorA 915
		stdcall str_n_cat,edi,esi,[t_max]
4995 IgorA 916
		jmp .end_f
4994 IgorA 917
	.tag_02:
918
 
4995 IgorA 919
	mov bx,tag_format_ui2b
920
	bt edx,0
921
	jnc @f
922
		ror bx,8
923
	@@:
924
	cmp word[eax+2],bx
925
	jne .tag_03
926
		stdcall str_n_cat,edi,txt_dp,[t_max]
927
		call get_tag_data_size
5009 IgorA 928
		cmp ebx,2
4995 IgorA 929
		jg .over4b_03
5009 IgorA 930
		jne @f
931
			;если два 2 байтовых числа
932
			or edx,2 ;array data
933
			movzx ecx,word[eax+10]
934
			bt edx,0
935
			jnc @f
936
				ror cx,8
937
			@@:
4995 IgorA 938
			;если одно 2 байтовое число
939
			movzx ebx,word[eax+8]
940
			bt edx,0
941
			jnc @f
942
				ror bx,8
943
			@@:
944
			stdcall str_len,edi
945
			add edi,eax
946
			mov eax,ebx
947
			call convert_int_to_str ;[t_max]
5009 IgorA 948
			bt edx,1 ;array ?
949
			jnc .end_f
950
			;добавляем 2-е число
951
			stdcall str_n_cat,edi,txt_zap,[t_max]
952
			stdcall str_len,edi
953
			add edi,eax
954
			mov eax,ecx
955
			call convert_int_to_str ;[t_max]
4995 IgorA 956
		.over4b_03:
957
			;...
958
		jmp .end_f
959
	.tag_03:
960
 
961
	mov bx,tag_format_ui4b
962
	bt edx,0
963
	jnc @f
964
		ror bx,8
965
	@@:
966
	cmp word[eax+2],bx
967
	jne .tag_04
968
		stdcall str_n_cat,edi,txt_dp,[t_max]
969
		call get_tag_data_size
970
		cmp ebx,1
971
		jg .over4b_04
972
			;если одно 4 байтовое число
973
			mov ebx,dword[eax+8]
974
			bt edx,0
975
			jnc @f
976
				ror bx,8
977
				ror ebx,16
978
				ror bx,8
979
			@@:
980
			stdcall str_len,edi
981
			add edi,eax
982
			mov eax,ebx
983
			call convert_int_to_str ;[t_max]
984
		.over4b_04:
985
			;...
986
		jmp .end_f
987
	.tag_04:
988
 
989
	mov bx,tag_format_urb
990
	bt edx,0
991
	jnc @f
992
		ror bx,8
993
	@@:
994
	cmp word[eax+2],bx
995
	jne .tag_05
996
		stdcall str_n_cat,edi,txt_dp,[t_max]
997
		;call get_tag_data_size
998
		;cmp ebx,1
999
		;jg .over4b_05
1000
			mov ebx,dword[eax+8]
1001
			bt edx,0
1002
			jnc @f
1003
				ror bx,8
1004
				ror ebx,16
1005
				ror bx,8
1006
			@@:
1007
			stdcall str_len,edi
1008
			add edi,eax
5007 IgorA 1009
			mov eax,[app1]
1010
			mov eax,[eax+4]
1011
			add ebx,eax
4995 IgorA 1012
			mov eax,[ebx]
1013
			bt edx,0
1014
			jnc @f
1015
				ror ax,8
1016
				ror eax,16
1017
				ror ax,8
1018
			@@:
1019
			call convert_int_to_str ;ставим 1-е число
1020
			stdcall str_n_cat,edi,txt_div,[t_max] ;ставим знак деления
1021
			stdcall str_len,edi
1022
			add edi,eax
1023
			mov eax,[ebx+4]
1024
			bt edx,0
1025
			jnc @f
1026
				ror ax,8
1027
				ror eax,16
1028
				ror ax,8
1029
			@@:
1030
			call convert_int_to_str ;ставим 2-е число
1031
		;.over4b_05:
1032
			;...
5007 IgorA 1033
		jmp .end_f
4995 IgorA 1034
	.tag_05:
1035
 
5007 IgorA 1036
	mov bx,tag_format_si2b
1037
	bt edx,0
1038
	jnc @f
1039
		ror bx,8
1040
	@@:
1041
	cmp word[eax+2],bx
1042
	jne .tag_08
1043
		stdcall str_n_cat,edi,txt_dp,[t_max]
1044
		call get_tag_data_size
1045
		cmp ebx,1
1046
		jg .over4b_08
1047
			;если одно 2 байтовое число
1048
			movzx ebx,word[eax+8]
1049
			bt edx,0
1050
			jnc @f
1051
				ror bx,8
1052
			@@:
1053
			stdcall str_len,edi
1054
			add edi,eax
1055
			bt bx,15
1056
			jnc @f
1057
				mov byte[edi],'-'
1058
				inc edi
1059
				neg bx
1060
				inc bx
1061
			@@:
1062
			mov eax,ebx
1063
			call convert_int_to_str ;[t_max]
1064
		.over4b_08:
1065
			;...
1066
		jmp .end_f
1067
	.tag_08:
1068
 
1069
	mov bx,tag_format_si4b
1070
	bt edx,0
1071
	jnc @f
1072
		ror bx,8
1073
	@@:
1074
	cmp word[eax+2],bx
1075
	jne .tag_09
1076
		stdcall str_n_cat,edi,txt_dp,[t_max]
1077
		call get_tag_data_size
1078
		cmp ebx,1
1079
		jg .over4b_09
1080
			;если одно 4 байтовое число
1081
			mov ebx,dword[eax+8]
1082
			bt edx,0
1083
			jnc @f
1084
				ror bx,8
1085
				ror ebx,16
1086
				ror bx,8
1087
			@@:
1088
			stdcall str_len,edi
1089
			add edi,eax
1090
			bt ebx,31
1091
			jnc @f
1092
				mov byte[edi],'-'
1093
				inc edi
1094
				neg ebx
1095
				inc ebx
1096
			@@:
1097
			mov eax,ebx
1098
			call convert_int_to_str ;[t_max]
1099
		.over4b_09:
1100
			;...
1101
		jmp .end_f
1102
	.tag_09:
1103
 
4994 IgorA 1104
	.end_f:
1105
	ret
1106
endp
1107
 
4995 IgorA 1108
;input:
1109
; eax - tag pointer
1110
; edx - 1 if 'MM', 0 if 'II'
1111
;output:
1112
; ebx - data size
4994 IgorA 1113
align 4
4995 IgorA 1114
get_tag_data_size:
1115
	mov ebx,dword[eax+4]
1116
	bt edx,0
1117
	jnc @f
1118
		ror bx,8
1119
		ror ebx,16
1120
		ror bx,8
1121
	@@:
4994 IgorA 1122
	ret
1123
 
1124
align 4
1125
proc str_n_cat uses eax ecx edi esi, str1:dword, str2:dword, n:dword
1126
	mov esi,dword[str2]
1127
	mov ecx,dword[n]
1128
	mov edi,dword[str1]
1129
	stdcall str_len,edi
1130
	add edi,eax
1131
	cld
1132
	repne movsb
1133
	mov byte[edi],0
1134
	ret
1135
endp
1136
 
1137
;output:
1138
; eax = strlen
1139
align 4
1140
proc str_len, str1:dword
1141
	mov eax,[str1]
1142
	@@:
1143
		cmp byte[eax],0
1144
		je @f
1145
		inc eax
1146
		jmp @b
1147
	@@:
1148
	sub eax,[str1]
1149
	ret
1150
endp
1151
 
5008 IgorA 1152
align 4
1153
proc hex_in_str, buf:dword,val:dword,zif:dword
1154
	pushad
1155
		mov edi,dword[buf]
1156
		mov ecx,dword[zif]
1157
		add edi,ecx
1158
		dec edi
1159
		mov ebx,dword[val]
1160
 
1161
		.cycle:
1162
			mov al,bl
1163
			and al,0xf
1164
			cmp al,10
1165
			jl @f
1166
				add al,'a'-'0'-10
1167
			@@:
1168
			add al,'0'
1169
			mov byte[edi],al
1170
			dec edi
1171
			shr ebx,4
1172
		loop .cycle
1173
 
1174
	popad
1175
	ret
1176
endp
1177
 
4995 IgorA 1178
;input:
1179
; eax = value
1180
; edi = string buffer
1181
;output:
1182
align 4
1183
convert_int_to_str:
1184
	pushad
1185
		mov dword[edi+1],0
1186
		mov dword[edi+5],0
1187
		call .str
1188
	popad
1189
	ret
1190
 
1191
align 4
1192
.str:
1193
	mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
1194
    ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
1195
	cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
1196
	jb @f
1197
		xor edx,edx  ;очистить edx
1198
		div ecx      ;разделить - остаток в edx
1199
		push edx     ;положить в стек
1200
		;dec edi             ;смещение необходимое для записи с конца строки
1201
		call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
1202
		pop eax
1203
	@@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
1204
	or al,0x30  ;данная команда короче  чем две выше
1205
	stosb	    ;записать элемент из регистра al в ячеку памяти es:edi
1206
	ret	      ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
1207
 
1208
 
1209
 
4994 IgorA 1210
align 16
1211
EXPORTS:
1212
	dd sz_exif_get_app1, exif_get_app1
1213
	dd sz_exif_get_app1_tag, exif_get_app1_tag
5002 IgorA 1214
	dd sz_exif_get_app1_child, exif_get_app1_child
5009 IgorA 1215
	dd sz_exif_get_app2, exif_get_app2
4994 IgorA 1216
	dd 0,0
1217
	sz_exif_get_app1 db 'exif_get_app1',0
1218
	sz_exif_get_app1_tag db 'exif_get_app1_tag',0
5002 IgorA 1219
	sz_exif_get_app1_child db 'exif_get_app1_child',0
5009 IgorA 1220
	sz_exif_get_app2 db 'exif_get_app2',0