Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
31 halyavin 1
;
2
;   BMP VIEWER
3
;   modified by Ivan Poddubny
4
;
5
;   Compile with FASM for Menuet
6
;
7
 
8
  use32
9
  org    0x0
10
  db     'MENUET01'              ; 8 byte id
11
  dd     0x01                    ; header version
12
  dd     START                   ; start of code
13
  dd     I_END                   ; size of image
14
  dd     0x300000                ; memory for app
15
  dd     0xfff0                  ; esp
16
  dd     I_Param , 0x0           ; I_Param , I_Icon
17
 
18
include 'lang.inc'
19
include 'macros.inc'
20
 
21
 
22
START:                          ; start of execution
23
 
24
    cmp  dword [I_Param],0
25
    je   noparam
26
 
27
    cmp  dword [I_Param],'BOOT'
28
    jne  noboot
29
    call load_image
30
    call set_as_background
31
    mov  eax,15
32
    mov  ebx,4
33
    mov  ecx,2
34
    int  0x40
35
    mov  eax,15
36
    mov  ebx,3
37
    int  0x40
38
 
39
    or   eax,-1
40
    int  0x40
41
  noboot:
42
 
43
    mov edi,name_string
44
    mov al,0
45
    mov ecx,70
46
    rep stosb
47
 
48
    mov ecx,50
49
    mov edi,I_Param
50
    repne scasb
51
    sub edi,I_Param
52
    mov ecx,edi
53
 
54
    mov esi,I_Param
55
    mov edi,name_string
56
    cld
57
    rep movsb
58
    call load_image
59
 
60
  noparam:
61
 
62
    call draw_window            ; at first, draw the window
63
 
64
still:
65
 
66
    mov  eax,10                 ; wait here for event
67
    int  0x40
68
 
69
    cmp  eax,1                  ; redraw request ?
70
    je   red
71
    cmp  eax,2                  ; key in buffer ?
72
    je   key
73
    cmp  eax,3                  ; button in buffer ?
74
    je   button
75
 
76
    jmp  still
77
 
78
  red:                          ; redraw
79
    call draw_window
80
    jmp  still
81
 
82
  key:                          ; key
83
    mov  eax,2                  ; just read it and ignore
84
    int  0x40
85
    jmp  still
86
 
87
  button:                       ; button
88
    mov  eax,17                 ; get id
89
    int  0x40
90
 
91
    cmp  ah,1                   ; button id=1 ?
92
    jne  noclose
93
    mov  eax,-1                 ; close this program
94
    int  0x40
95
  noclose:
96
 
97
    cmp  ah,2
98
    jne  no_file_name
99
    call read_string
100
    jmp  still
101
  no_file_name:
102
 
103
    cmp  ah,3
104
    jne  no_load_image
105
    call load_image
106
    call draw_window
107
    jmp  still
108
  no_load_image:
109
 
110
    cmp  ah,4
111
    jne  no_setasbackground
112
    call set_as_background
113
    jmp  still
114
  no_setasbackground:
115
 
116
    cmp  ah,5
117
    jne  no_tiled
118
    mov  eax,15
119
    mov  ebx,4
120
    mov  ecx,1
121
    int  0x40
122
    mov  eax,15
123
    mov  ebx,3
124
    int  0x40
125
    jmp  still
126
  no_tiled:
127
 
128
    cmp  ah,6
129
    jne  no_stretch
130
    mov  eax,15
131
    mov  ebx,4
132
    mov  ecx,2
133
    int  0x40
134
    mov  eax,15
135
    mov  ebx,3
136
    int  0x40
137
    jmp  still
138
  no_stretch:
139
 
140
 
141
    jmp  still
142
 
143
type        dd 0x0
144
i_pos       dd 0x0
145
x_size      dd 0x1
146
y_size      dd 0x1
147
bpp         dd 0x24
148
 
149
temp dd 999
150
 
151
fileinfoblock:
152
 
153
    dd  0                       ; 0 = read
154
    dd  0                       ; first 512 block
155
    dd  1                       ; number of blocks to read
156
    dd  0x10000+1024            ; read to
157
    dd  35                 ; 17000 byte work area
158
name_string:
159
    db  '/HARDDISK/FIRST/MENUET/PICS/NEW.BMP',0
160
    times 100 db 0
161
 
162
 
163
read_header:
164
 
165
    pusha
166
 
167
    mov  edi,0x10000
168
    mov  ecx,100
169
    mov  eax,0
170
    cld
171
    rep  stosb
172
 
173
    mov  [fileinfoblock+ 8],dword 1
174
    mov  [fileinfoblock+12],dword 0x10000
175
 
176
push dword [name_string-4]
177
mov [name_string-4],dword 0x20000
178
    mov  eax,58
179
    mov  ebx,fileinfoblock
180
    int  0x40
181
pop dword [name_string-4]
182
 
183
    movzx eax,word [0x10000+0]
184
    mov   [type],eax
185
    mov   eax,[0x10000+10]
186
    mov   [i_pos],eax
187
    mov   eax,[0x10000+18]
188
    mov   [x_size],eax
189
    mov   eax,[0x10000+22]
190
    mov   [y_size],eax
191
    movzx eax,word [0x10000+28]
192
    mov   [bpp],eax
193
 
194
    popa
195
    ret
196
 
197
 
198
draw_picture_info:
199
 
200
    pusha
201
 
202
    mov  eax,13
203
    mov  ebx,380*65536+6*5
204
    mov  ecx,65*65536+40
205
    mov  edx,0xffffff
206
    int  0x40
207
 
208
    mov  eax,47
209
    mov  ebx,5*65536
210
    mov  ecx,[x_size]
211
    mov  edx,380*65536+65
212
    mov  esi,0x224466
213
    int  0x40
214
 
215
    mov  ecx,[y_size]
216
    add  edx,10
217
    int  0x40
218
 
219
    mov  ecx,[bpp]
220
    add  edx,20
221
    int  0x40
222
 
223
    popa
224
    ret
225
 
226
 
227
 
228
load_image:
229
 
230
    pusha
231
 
232
    call read_header
233
 
234
    cmp  word [type],'BM'
235
    je   ok_image
236
 
237
    cmp  [bpp],24
238
    je   ok_image
239
 
240
    mov  eax,13                  ; not found !
241
    mov  ebx,150*65536+50
242
    mov  ecx,100*65536+50
243
    mov  edx,0xff0000
244
    int  0x40
245
 
246
    mov  eax,5
247
    mov  ebx,100
248
    int  0x40
249
 
250
    jmp  retimage
251
 
252
  ok_image:
253
 
254
    call draw_picture_info
255
 
256
    mov  [fileinfoblock+8],dword 0x100000/512
257
    mov  eax,0x80000
258
    sub  eax,[i_pos]
259
    mov  [fileinfoblock+12],eax
260
push dword [name_string-4]
261
mov [name_string-4],dword 0x20000
262
    mov  eax,58
263
    mov  ebx,fileinfoblock
264
    int  0x40
265
pop dword [name_string-4]
266
 
267
    mov  eax,[x_size]
268
    imul eax,3
269
 
270
    mov  [x_delta],eax
271
 
272
    mov  ebx,[y_size]
273
    dec  ebx
274
    imul eax,ebx
275
    add  eax,0x80000
276
 
277
    mov  esi,eax
278
    mov  edi,0x180000
279
  newln:
280
    push esi
281
    push edi
282
    mov  ecx,[x_delta]
283
    cld
284
    rep  movsb
285
    pop  edi
286
    pop  esi
287
 
288
    sub  esi,[x_delta];640*3
289
    add  edi,[x_delta];640*3
290
    cmp  esi,0x80000
291
    jge  newln
292
 
293
  retimage:
294
 
295
    popa
296
 
297
    ret
298
 
299
x_delta dd 0x1
300
 
301
 
302
draw_image:
303
 
304
    pusha
305
 
306
;    mov  eax,7                     ; draw with putimage
307
;    mov  ebx,0x180000
308
;    mov  ecx,200*65536+160
309
;    mov  edx,14*65536+28
310
;    int  0x40
311
;    mov  eax,5
312
;    mov  ebx,200
313
;    int  0x40
314
 
315
    mov  ebx,0   ; show the image as 320x240 picture
316
    mov  ecx,0
317
 
318
times 6 db 0x90
319
 
320
  newpix:
321
 
322
    push ebx
323
    push ecx
324
 
325
    mov  eax,[esp]
326
    imul eax,[y_size]
327
 
328
    mov  ebx,240
329
    xor  edx,edx
330
    div  ebx
331
 
332
    imul eax,3
333
    imul eax,[x_size]
334
 
335
    mov  esi,eax
336
 
337
    mov  eax,[esp+4]
338
    imul eax,[x_size]
339
 
340
    mov  ebx,320
341
    xor  edx,edx
342
    div  ebx
343
 
344
    imul eax,3
345
 
346
    add  esi,eax
347
    mov  edx,[0x180000+esi]
348
 
349
 
350
    and  edx,0xffffff
351
 
352
    pop  ecx
353
    pop  ebx
354
 
355
    add  ebx,20
356
    add  ecx,40
357
    mov  eax,1
358
    int  0x40
359
    add  ebx,-20
360
    add  ecx,-40
361
 
362
    inc  ebx
363
    cmp  ebx,320
364
    jb   newpix
365
 
366
    xor  ebx,ebx
367
 
368
    inc  ecx
369
    cmp  ecx,240
370
    jb   newpix
371
 
372
    popa
373
 
374
    ret
375
 
376
set_as_background:
377
 
378
    pusha
379
 
380
    mov  esi,0x180000
381
  new_smooth:
382
    xor  eax,eax
383
    xor  ebx,ebx
384
    mov  al,[esi]
385
    mov  bl,[esi+3]
386
    add  eax,ebx
387
    mov  bl,[esi+6]
388
    add  eax,ebx
389
    mov  bl,[esi+9]
390
    add  eax,ebx
391
    shr  eax,2
392
    and  eax,0xff
393
    inc  esi
394
    cmp  esi,0x180000+640*480*3
395
    jbe  new_smooth
396
 
397
 
398
    mov  eax,15
399
    mov  ebx,1
400
    mov  ecx,[x_size]
401
    mov  edx,[y_size]
402
    int  0x40
403
 
404
    mov  eax,15
405
    mov  ebx,5
406
    mov  ecx,0x180000
407
    mov  edx,0
408
    mov  esi,640*480*3
409
    int  0x40
410
 
411
    mov  eax,15
412
    mov  ebx,3
413
    int  0x40
414
 
415
 
416
    popa
417
 
418
    ret
419
 
420
ya   dd 300
421
addr dd name_string
422
case_sens db 0
423
 
424
 
425
read_string:
426
pusha
427
 
428
mov edi,[addr]
429
mov eax,[addr]
430
mov eax,[eax-4]
431
mov [temp],eax
432
 
433
add edi,eax
434
 
435
call print_strings
436
 
437
f11:
438
mov eax,10
439
int 0x40
440
cmp eax,2
441
jne read_done
442
int 0x40
443
shr eax,8
444
 
445
cmp eax,13
446
je read_done
447
 
448
cmp eax,192
449
jne noclear
450
 
451
xor eax,eax
452
mov [temp],eax
453
mov edi,[addr]
454
mov [edi-4],eax
455
mov ecx,49
456
cld
457
rep stosb
458
mov edi,[addr]
459
call print_strings
460
jmp f11
461
 
462
noclear:
463
 
464
cmp eax,8
465
jnz nobsl
466
cmp [temp],0
467
jz f11
468
dec [temp]
469
mov edi,[addr]
470
add edi,[temp]
471
mov [edi],byte 0
472
 
473
mov eax,[addr]
474
dec dword [eax-4]
475
 
476
call print_strings
477
jmp f11
478
 
479
nobsl:
480
cmp [temp],50
481
jae read_done
482
 
483
cmp eax,dword 31
484
jbe f11
485
cmp [case_sens],1
486
je keyok
487
cmp eax,dword 95
488
jb keyok
489
add eax,-32
490
keyok:
491
mov edi,[addr]
492
add edi,[temp]
493
mov [edi],al
494
 
495
inc [temp]
496
 
497
mov eax,[addr]
498
inc dword [eax-4]
499
call print_strings
500
cmp [temp],50
501
jbe f11
502
 
503
read_done:
504
mov ecx,50
505
sub ecx,[temp]
506
mov edi,[addr]
507
add edi,[temp]
508
xor eax,eax
509
cld
510
rep stosb
511
 
512
mov [temp],999
513
 
514
call print_strings
515
 
516
popa
517
ret
518
 
519
print_strings:
520
pusha
521
mov eax,13
522
mov ebx,80*65536+6*45
523
mov ecx,[ya]
524
shl ecx,16
525
add ecx,12
526
mov edx,0xffffff
527
int 0x40
528
 
529
mov edx,[addr]
530
mov esi,[edx-4]
531
mov eax,4
532
mov ebx,80*65536+2
533
add ebx,[ya]
534
mov ecx,0
535
int 0x40
536
 
537
cmp [temp],50
538
ja @f
539
 
540
mov eax,[ya]
541
mov ebx,eax
542
shl eax,16
543
add eax,ebx
544
add eax,10
545
mov ecx,eax
546
 
547
mov eax,[temp]
548
imul eax,eax,6
549
add eax,80
550
mov ebx,eax
551
shl eax,16
552
add ebx,eax
553
 
554
mov eax,38
555
mov edx,0
556
int 0x40
557
@@:
558
 
559
popa
560
ret
561
 
562
 
563
 
564
 
565
;   *********************************************
566
;   *******  WINDOW DEFINITIONS AND DRAW ********
567
;   *********************************************
568
 
569
 
570
draw_window:
571
 
572
    mov  eax,12                    ; function 12:tell os about windowdraw
573
    mov  ebx,1                     ; 1, start of draw
574
    int  0x40
575
 
576
                                   ; DRAW WINDOW
577
    mov  eax,0                     ; function 0 : define and draw window
578
    mov  ebx,20*65536+444          ; [x start] *65536 + [x size]
579
    mov  ecx,10*65536+333          ; [y start] *65536 + [y size]
580
    mov  edx,0x03ffffff            ; color of work area RRGGBB,8->color gl
581
    mov  esi,0x808899ff            ; color of grab bar  RRGGBB,8->color gl
582
    mov  edi,0x008899ff            ; color of frames    RRGGBB
583
    int  0x40
584
 
585
                                   ; WINDOW LABEL
586
    mov  eax,4                     ; function 4 : write text to window
587
    mov  ebx,8*65536+8             ; [x start] *65536 + [y start]
588
    mov  ecx,0x10ddeeff            ; color of text RRGGBB
589
    mov  edx,labelt                ; pointer to text beginning
590
    mov  esi,labellen-labelt       ; text length
591
    int  0x40
592
 
593
    mov  eax,8
594
    mov  ebx,20*65536+52
595
    mov  ecx,295*65536+16
596
    mov  edx,2
597
    mov  esi,0x306090
598
    int  0x40
599
 
600
    add  ebx,336*65536+20
601
    add  ecx,5*65536
602
    mov  edx,3
603
    int  0x40
604
 
605
    sub  ecx,20*65536
606
    mov  edx,4
607
    int  0x40
608
 
609
    sub  ecx,40*65536
610
    inc  edx
611
    int  0x40
612
 
613
    add  ecx,20*65536
614
    inc  edx
615
    int  0x40
616
 
617
    mov  ebx,346*65536+45
618
    mov  edx,info+1
619
    mov  esi,15
620
  newinfo:
621
    mov  ecx,[tcolor]
622
    cmp  [edx-1],byte 'w'
623
    jne  nowhite
624
    mov  ecx,[btcolor]
625
  nowhite:
626
    mov  eax,4
627
    int  0x40
628
    add  ebx,10
629
    add  edx,16
630
    cmp  [edx-1],byte 'x'
631
    jne  newinfo
632
 
633
    mov  ebx,20*65536+300           ; draw info text with function 4
634
    mov  ecx,[btcolor]
635
    mov  edx,text
636
    mov  esi,70
637
  newline:
638
    mov  eax,4
639
    int  0x40
640
    add  ebx,10
641
    add  edx,esi
642
    cmp  [edx],byte 'x'
643
    jne  newline
644
 
645
    call print_strings
646
 
647
    call draw_image
648
 
649
    call draw_picture_info
650
 
651
    mov  eax,12                    ; function 12:tell os about windowdraw
652
    mov  ebx,2                     ; 2, end of draw
653
    int  0x40
654
 
655
    ret
656
 
657
 
658
; DATA AREA
659
 
660
tcolor   dd  0x000000
661
btcolor  dd  0x224466+0x808080
662
 
663
 
664
text:
665
 db '  FILE:                                                               '
666
 db 'x'
667
 
668
info:
669
 db '  IMAGE INFO    '
670
 db '                '
671
 db '  X:            '
672
 db '  Y:            '
673
 db '                '
674
 db '  BPP:          '
675
 db '                '
676
 db '                '
677
 db '  16M COLOURS   '
678
 db '  640x480 max   '
679
times 10 db '                '
680
 db 'w     TILED     '
681
 db '                '
682
 db 'w    STRETCH    '
683
 db '                '
684
 db 'w   SET AS BGR  '
685
 db '                '
686
 db 'w      LOAD     '
687
 db 'x'
688
 
689
 
690
labelt:    db   'BMP VIEWER'
691
labellen:
692
 
693
I_END:
694
I_Param: