Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2288 clevermous 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2455 mario79 3
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
2288 clevermous 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;  VESA20.INC                                                  ;;
7
;;                                                              ;;
8
;;  Vesa 2.0 functions for MenuetOS                             ;;
9
;;                                                              ;;
10
;;  Copyright 2002 Ville Turjanmaa                              ;;
11
;;  Alexey, kgaz@crosswindws.net                                ;;
12
;;  - Voodoo compatible graphics                                ;;
13
;;  Juan M. Caravaca                                            ;;
14
;;  - Graphics optimimizations eg. drawline                     ;;
15
;;                                                              ;;
16
;;  See file COPYING for details                                ;;
17
;;                                                              ;;
18
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
19
 
20
$Revision: 2480 $
21
 
22
 
23
; If you're planning to write your own video driver I suggest
24
; you replace the VESA12.INC file and see those instructions.
25
 
26
;Screen_Max_X             equ     0xfe00
27
;Screen_Max_Y            equ     0xfe04
28
;BytesPerScanLine        equ     0xfe08
29
;LFBAddress              equ     0xfe80
30
;ScreenBPP               equ     0xfbf1
31
 
32
 
33
 
2430 mario79 34
;-----------------------------------------------------------------------------
2288 clevermous 35
; getpixel
36
;
37
; in:
38
; eax = x coordinate
39
; ebx = y coordinate
40
;
41
; ret:
42
; ecx = 00 RR GG BB
2430 mario79 43
;-----------------------------------------------------------------------------
44
align 4
2288 clevermous 45
getpixel:
46
        push    eax ebx edx edi
47
        call    dword [GETPIXEL]
48
        pop     edi edx ebx eax
49
        ret
2430 mario79 50
;-----------------------------------------------------------------------------
51
align 4
2288 clevermous 52
Vesa20_getpixel24:
53
; eax = x
54
; ebx = y
2430 mario79 55
;--------------------------------------
2448 mario79 56
; check for hardware cursor
2451 mario79 57
        cmp     [_display.select_cursor], select_cursor
58
        je      @f
2448 mario79 59
        cmp     [_display.select_cursor], 0
60
        jne     .no_mouseunder
61
;--------------------------------------
62
align 4
63
@@:
2430 mario79 64
; check mouse area for putpixel
65
        test    ecx, 0x04000000  ; don't load to mouseunder area
66
        jnz     .no_mouseunder
67
        call    [_display.check_m_pixel]
68
        test    ecx, ecx        ;0xff000000
69
        jnz     @f
2448 mario79 70
;--------------------------------------
71
align 4
2430 mario79 72
.no_mouseunder:
73
;--------------------------------------
2446 mario79 74
;        imul    ebx, [BytesPerScanLine] ; ebx = y * y multiplier
2480 mario79 75
        mov     ebx, [BPSLine_calc_area+ebx*4]
2288 clevermous 76
        lea     edi, [eax+eax*2]; edi = x*3
77
        add     edi, ebx      ; edi = x*3+(y*y multiplier)
78
        mov     ecx, [LFB_BASE+edi]
2430 mario79 79
;--------------------------------------
80
align 4
81
@@:
2288 clevermous 82
        and     ecx, 0xffffff
83
        ret
2430 mario79 84
;-----------------------------------------------------------------------------
85
align 4
2288 clevermous 86
Vesa20_getpixel32:
2430 mario79 87
;--------------------------------------
2448 mario79 88
; check for hardware cursor
2451 mario79 89
        cmp     [_display.select_cursor], select_cursor
90
        je      @f
2448 mario79 91
        cmp     [_display.select_cursor], 0
92
        jne     .no_mouseunder
93
;--------------------------------------
94
align 4
95
@@:
2430 mario79 96
; check mouse area for putpixel
97
        test    ecx, 0x04000000  ; don't load to mouseunder area
98
        jnz     .no_mouseunder
99
        call    [_display.check_m_pixel]
100
        test    ecx, ecx        ;0xff000000
101
        jnz     @f
2448 mario79 102
;--------------------------------------
103
align 4
2430 mario79 104
.no_mouseunder:
105
;--------------------------------------
2446 mario79 106
;        imul    ebx, [BytesPerScanLine] ; ebx = y * y multiplier
2480 mario79 107
        mov     ebx, [BPSLine_calc_area+ebx*4]
2288 clevermous 108
        lea     edi, [ebx+eax*4]; edi = x*4+(y*y multiplier)
109
        mov     ecx, [LFB_BASE+edi]
2430 mario79 110
;--------------------------------------
111
align 4
112
@@:
2288 clevermous 113
        and     ecx, 0xffffff
114
        ret
2430 mario79 115
;-----------------------------------------------------------------------------
2288 clevermous 116
virtual at esp
117
 putimg:
118
   .real_sx        dd ?
119
   .real_sy        dd ?
120
   .image_sx       dd ?
121
   .image_sy       dd ?
122
   .image_cx       dd ?
123
   .image_cy       dd ?
124
   .pti            dd ?
125
   .abs_cx         dd ?
126
   .abs_cy         dd ?
127
   .line_increment dd ?
128
   .winmap_newline dd ?
129
   .screen_newline dd ?
2430 mario79 130
   .real_sx_and_abs_cx dd ?
131
   .real_sy_and_abs_cy dd ?
132
   .stack_data = 4*14
2288 clevermous 133
   .edi         dd      ?
134
   .esi         dd      ?
135
   .ebp         dd      ?
136
   .esp         dd      ?
137
   .ebx         dd      ?
138
   .edx         dd      ?
139
   .ecx         dd      ?
140
   .eax         dd      ?
141
   .ret_addr    dd      ?
142
   .arg_0       dd      ?
143
end virtual
2430 mario79 144
;-----------------------------------------------------------------------------
2288 clevermous 145
align 16
146
; ebx = pointer
147
; ecx = size [x|y]
148
; edx = coordinates [x|y]
149
; ebp = pointer to 'get' function
150
; esi = pointer to 'init' function
151
; edi = parameter for 'get' function
152
vesa20_putimage:
153
        pushad
154
        sub     esp, putimg.stack_data
155
; save pointer to image
156
        mov     [putimg.pti], ebx
157
; unpack the size
158
        mov     eax, ecx
159
        and     ecx, 0xFFFF
160
        shr     eax, 16
161
        mov     [putimg.image_sx], eax
162
        mov     [putimg.image_sy], ecx
163
; unpack the coordinates
164
        mov     eax, edx
165
        and     edx, 0xFFFF
166
        shr     eax, 16
167
        mov     [putimg.image_cx], eax
168
        mov     [putimg.image_cy], edx
169
; calculate absolute (i.e. screen) coordinates
170
        mov     eax, [TASK_BASE]
171
        mov     ebx, [eax-twdw + WDATA.box.left]
172
        add     ebx, [putimg.image_cx]
173
        mov     [putimg.abs_cx], ebx
174
        mov     ebx, [eax-twdw + WDATA.box.top]
175
        add     ebx, [putimg.image_cy]
176
        mov     [putimg.abs_cy], ebx
177
; real_sx = MIN(wnd_sx-image_cx, image_sx);
178
        mov     ebx, [eax-twdw + WDATA.box.width]; ebx = wnd_sx
179
; \begin{diamond}[20.08.2006]
180
; note that WDATA.box.width is one pixel less than real window x-size
181
        inc     ebx
182
; \end{diamond}[20.08.2006]
183
        sub     ebx, [putimg.image_cx]
184
        ja      @f
185
        add     esp, putimg.stack_data
186
        popad
187
        ret
2430 mario79 188
;--------------------------------------
189
align 4
2288 clevermous 190
@@:
191
        cmp     ebx, [putimg.image_sx]
192
        jbe     .end_x
193
        mov     ebx, [putimg.image_sx]
2430 mario79 194
;--------------------------------------
195
align 4
2288 clevermous 196
.end_x:
197
        mov     [putimg.real_sx], ebx
198
; init real_sy
199
        mov     ebx, [eax-twdw + WDATA.box.height]; ebx = wnd_sy
200
; \begin{diamond}[20.08.2006]
201
        inc     ebx
202
; \end{diamond}[20.08.2006]
203
        sub     ebx, [putimg.image_cy]
204
        ja      @f
205
        add     esp, putimg.stack_data
206
        popad
207
        ret
2430 mario79 208
;--------------------------------------
209
align 4
2288 clevermous 210
@@:
211
        cmp     ebx, [putimg.image_sy]
212
        jbe     .end_y
213
        mov     ebx, [putimg.image_sy]
2430 mario79 214
;--------------------------------------
215
align 4
2288 clevermous 216
.end_y:
217
        mov     [putimg.real_sy], ebx
218
; line increment
219
        mov     eax, [putimg.image_sx]
220
        mov     ecx, [putimg.real_sx]
221
        sub     eax, ecx
222
;;     imul    eax, [putimg.source_bpp]
223
;     lea     eax, [eax + eax * 2]
224
        call    esi
225
        add     eax, [putimg.arg_0]
226
        mov     [putimg.line_increment], eax
227
; winmap new line increment
228
        mov     eax, [Screen_Max_X]
229
        inc     eax
230
        sub     eax, [putimg.real_sx]
231
        mov     [putimg.winmap_newline], eax
232
; screen new line increment
233
        mov     eax, [BytesPerScanLine]
234
        movzx   ebx, byte [ScreenBPP]
235
        shr     ebx, 3
236
        imul    ecx, ebx
237
        sub     eax, ecx
238
        mov     [putimg.screen_newline], eax
239
; pointer to image
240
        mov     esi, [putimg.pti]
241
; pointer to screen
242
        mov     edx, [putimg.abs_cy]
2446 mario79 243
;        imul    edx, [BytesPerScanLine]
2480 mario79 244
        mov     edx, [BPSLine_calc_area+edx*4]
2288 clevermous 245
        mov     eax, [putimg.abs_cx]
2446 mario79 246
;        movzx   ebx, byte [ScreenBPP]
247
;        shr     ebx, 3
2288 clevermous 248
        imul    eax, ebx
249
        add     edx, eax
250
; pointer to pixel map
251
        mov     eax, [putimg.abs_cy]
2446 mario79 252
;        imul    eax, [Screen_Max_X]
253
;        add     eax, [putimg.abs_cy]
254
        mov     eax, [d_width_calc_area + eax*4]
255
 
2288 clevermous 256
        add     eax, [putimg.abs_cx]
257
        add     eax, [_WinMapAddress]
258
        xchg    eax, ebp
2430 mario79 259
;--------------------------------------
260
        mov     ecx, [putimg.real_sx]
261
        add     ecx, [putimg.abs_cx]
262
        mov     [putimg.real_sx_and_abs_cx], ecx
263
        mov     ecx, [putimg.real_sy]
264
        add     ecx, [putimg.abs_cy]
265
        mov     [putimg.real_sy_and_abs_cy], ecx
266
;--------------------------------------
2288 clevermous 267
; get process number
268
        mov     ebx, [CURRENT_TASK]
269
        cmp     byte [ScreenBPP], 32
270
        je      put_image_end_32
2435 mario79 271
;--------------------------------------
272
put_image_end_24:
2288 clevermous 273
        mov     edi, [putimg.real_sy]
2453 mario79 274
;--------------------------------------
275
; check for hardware cursor
2455 mario79 276
        mov     ecx, [_display.select_cursor]
277
        cmp     ecx, select_cursor
278
        je      put_image_end_24_new
279
        cmp     ecx, 0
2453 mario79 280
        je      put_image_end_24_old
2430 mario79 281
;--------------------------------------
282
align 4
2288 clevermous 283
.new_line:
284
        mov     ecx, [putimg.real_sx]
2430 mario79 285
;--------------------------------------
286
align 4
2288 clevermous 287
.new_x:
288
        push    [putimg.edi]
289
        mov     eax, [putimg.ebp+4]
290
        call    eax
291
        cmp     [ebp], bl
292
        jne     .skip
2430 mario79 293
;--------------------------------------
2453 mario79 294
; store to real LFB
295
        mov     [LFB_BASE+edx], ax
296
        shr     eax, 16
297
        mov     [LFB_BASE+edx+2], al
298
;--------------------------------------
299
align 4
300
.skip:
301
        add     edx, 3
302
        inc     ebp
303
        dec     ecx
304
        jnz     .new_x
305
 
306
        add     esi, [putimg.line_increment]
307
        add     edx, [putimg.screen_newline];[BytesPerScanLine]
308
        add     ebp, [putimg.winmap_newline];[Screen_Max_X]
309
 
310
        cmp     [putimg.ebp], putimage_get1bpp
311
        jz      .correct
312
        cmp     [putimg.ebp], putimage_get2bpp
313
        jz      .correct
314
        cmp     [putimg.ebp], putimage_get4bpp
315
        jnz     @f
316
;--------------------------------------
317
align 4
318
.correct:
319
        mov     eax, [putimg.edi]
320
        mov     byte [eax], 80h
321
;--------------------------------------
322
align 4
323
@@:
324
        dec     edi
325
        jnz     .new_line
326
;--------------------------------------
327
align 4
328
.finish:
329
        add     esp, putimg.stack_data
330
        popad
331
        ret
332
;------------------------------------------------------------------------------
333
align 4
334
put_image_end_24_old:
335
;--------------------------------------
336
align 4
337
.new_line:
338
        mov     ecx, [putimg.real_sx]
339
;--------------------------------------
340
align 4
341
.new_x:
342
        push    [putimg.edi]
343
        mov     eax, [putimg.ebp+4]
344
        call    eax
345
        cmp     [ebp], bl
346
        jne     .skip
347
;--------------------------------------
2430 mario79 348
        push    ecx
349
 
350
        neg     ecx
351
        add     ecx, [putimg.real_sx_and_abs_cx + 4]
352
        shl     ecx, 16
353
        add     ecx, [putimg.real_sy_and_abs_cy + 4]
354
        sub     ecx, edi
355
 
356
; check mouse area for putpixel
2435 mario79 357
        call    check_mouse_area_for_putpixel
2430 mario79 358
        pop     ecx
359
; store to real LFB
2288 clevermous 360
        mov     [LFB_BASE+edx], ax
361
        shr     eax, 16
362
        mov     [LFB_BASE+edx+2], al
2430 mario79 363
;--------------------------------------
364
align 4
2288 clevermous 365
.skip:
366
        add     edx, 3
367
        inc     ebp
368
        dec     ecx
369
        jnz     .new_x
2435 mario79 370
 
2288 clevermous 371
        add     esi, [putimg.line_increment]
372
        add     edx, [putimg.screen_newline];[BytesPerScanLine]
373
        add     ebp, [putimg.winmap_newline];[Screen_Max_X]
2435 mario79 374
 
2288 clevermous 375
        cmp     [putimg.ebp], putimage_get1bpp
376
        jz      .correct
377
        cmp     [putimg.ebp], putimage_get2bpp
378
        jz      .correct
379
        cmp     [putimg.ebp], putimage_get4bpp
380
        jnz     @f
2430 mario79 381
;--------------------------------------
382
align 4
2288 clevermous 383
.correct:
384
        mov     eax, [putimg.edi]
385
        mov     byte [eax], 80h
2430 mario79 386
;--------------------------------------
387
align 4
2288 clevermous 388
@@:
389
        dec     edi
390
        jnz     .new_line
2453 mario79 391
        jmp     put_image_end_24.finish
392
;------------------------------------------------------------------------------
2430 mario79 393
align 4
2435 mario79 394
put_image_end_24_new:
395
;--------------------------------------
396
align 4
397
.new_line:
398
        mov     ecx, [putimg.real_sx]
399
;--------------------------------------
400
align 4
401
.new_x:
402
        push    [putimg.edi]
403
        mov     eax, [putimg.ebp+4]
404
        call    eax
405
        cmp     [ebp], bl
406
        jne     .skip
407
;--------------------------------------
408
        push    ecx
409
        mov     ecx, [putimg.real_sy_and_abs_cy + 4]
410
        sub     ecx, edi
411
;--------------------------------------
412
; check for Y
413
        cmp     cx, [Y_UNDER_subtraction_CUR_hot_y]
414
        jb      .no_mouse_area
415
 
416
        cmp     cx, [Y_UNDER_sub_CUR_hot_y_add_curh]
417
        jae     .no_mouse_area
418
 
419
        rol     ecx, 16
420
        add     ecx, [putimg.real_sx_and_abs_cx + 4]
421
        sub     ecx, [esp]
422
;--------------------------------------
423
; check for X
424
        cmp     cx, [X_UNDER_subtraction_CUR_hot_x]
425
        jb      .no_mouse_area
426
 
427
        cmp     cx, [X_UNDER_sub_CUR_hot_x_add_curh]
428
        jae     .no_mouse_area
429
;--------------------------------------
430
; check mouse area for putpixel
431
        call    check_mouse_area_for_putpixel_new.1
432
;--------------------------------------
433
align 4
434
.no_mouse_area:
435
        pop     ecx
436
; store to real LFB
437
        mov     [LFB_BASE+edx], ax
438
        shr     eax, 16
439
        mov     [LFB_BASE+edx+2], al
440
;--------------------------------------
441
align 4
442
.skip:
443
        add     edx, 3
444
        inc     ebp
445
        dec     ecx
446
        jnz     .new_x
447
 
448
        add     esi, [putimg.line_increment]
449
        add     edx, [putimg.screen_newline];[BytesPerScanLine]
450
        add     ebp, [putimg.winmap_newline];[Screen_Max_X]
451
 
452
        cmp     [putimg.ebp], putimage_get1bpp
453
        jz      .correct
454
        cmp     [putimg.ebp], putimage_get2bpp
455
        jz      .correct
456
        cmp     [putimg.ebp], putimage_get4bpp
457
        jnz     @f
458
;--------------------------------------
459
align 4
460
.correct:
461
        mov     eax, [putimg.edi]
462
        mov     byte [eax], 80h
463
;--------------------------------------
464
align 4
465
@@:
466
        dec     edi
467
        jnz     .new_line
468
        jmp     put_image_end_24.finish
2430 mario79 469
;------------------------------------------------------------------------------
470
align 4
2288 clevermous 471
put_image_end_32:
472
        mov     edi, [putimg.real_sy]
2453 mario79 473
;--------------------------------------
474
; check for hardware cursor
2455 mario79 475
        mov     ecx, [_display.select_cursor]
476
        cmp     ecx, select_cursor
477
        je      put_image_end_32_new
478
        cmp     ecx, 0
2453 mario79 479
        je      put_image_end_32_old
2430 mario79 480
;--------------------------------------
481
align 4
2288 clevermous 482
.new_line:
483
        mov     ecx, [putimg.real_sx]
2430 mario79 484
;--------------------------------------
485
align 4
2288 clevermous 486
.new_x:
487
        push    [putimg.edi]
488
        mov     eax, [putimg.ebp+4]
489
        call    eax
490
        cmp     [ebp], bl
491
        jne     .skip
2430 mario79 492
;--------------------------------------
493
; store to real LFB
2288 clevermous 494
        mov     [LFB_BASE+edx], eax
2430 mario79 495
;--------------------------------------
496
align 4
2288 clevermous 497
.skip:
498
        add     edx, 4
499
        inc     ebp
500
        dec     ecx
501
        jnz     .new_x
2435 mario79 502
 
2288 clevermous 503
        add     esi, [putimg.line_increment]
504
        add     edx, [putimg.screen_newline];[BytesPerScanLine]
505
        add     ebp, [putimg.winmap_newline];[Screen_Max_X]
2435 mario79 506
 
2288 clevermous 507
        cmp     [putimg.ebp], putimage_get1bpp
508
        jz      .correct
509
        cmp     [putimg.ebp], putimage_get2bpp
510
        jz      .correct
511
        cmp     [putimg.ebp], putimage_get4bpp
512
        jnz     @f
2430 mario79 513
;--------------------------------------
514
align 4
2288 clevermous 515
.correct:
516
        mov     eax, [putimg.edi]
517
        mov     byte [eax], 80h
2430 mario79 518
;--------------------------------------
519
align 4
2288 clevermous 520
@@:
521
        dec     edi
522
        jnz     .new_line
2430 mario79 523
;--------------------------------------
524
align 4
2288 clevermous 525
.finish:
526
        add     esp, putimg.stack_data
527
        popad
2436 mario79 528
        cmp     [SCR_MODE], dword 0x12
529
        jne     @f
2288 clevermous 530
        call    VGA__putimage
2436 mario79 531
;--------------------------------------
532
align 4
533
@@:
2288 clevermous 534
        mov     [EGA_counter], 1
535
        ret
2453 mario79 536
;------------------------------------------------------------------------------
537
align 4
538
put_image_end_32_old:
2435 mario79 539
;--------------------------------------
540
align 4
2453 mario79 541
.new_line:
542
        mov     ecx, [putimg.real_sx]
543
;--------------------------------------
544
align 4
545
.new_x:
546
        push    [putimg.edi]
547
        mov     eax, [putimg.ebp+4]
548
        call    eax
549
        cmp     [ebp], bl
550
        jne     .skip
551
;--------------------------------------
552
        push    ecx
553
 
554
        neg     ecx
555
        add     ecx, [putimg.real_sx_and_abs_cx + 4]
556
        shl     ecx, 16
557
        add     ecx, [putimg.real_sy_and_abs_cy + 4]
558
        sub     ecx, edi
559
 
560
; check mouse area for putpixel
561
        call    check_mouse_area_for_putpixel
562
        pop     ecx
563
; store to real LFB
564
        mov     [LFB_BASE+edx], eax
565
;--------------------------------------
566
align 4
567
.skip:
568
        add     edx, 4
569
        inc     ebp
570
        dec     ecx
571
        jnz     .new_x
572
 
573
        add     esi, [putimg.line_increment]
574
        add     edx, [putimg.screen_newline];[BytesPerScanLine]
575
        add     ebp, [putimg.winmap_newline];[Screen_Max_X]
576
 
577
        cmp     [putimg.ebp], putimage_get1bpp
578
        jz      .correct
579
        cmp     [putimg.ebp], putimage_get2bpp
580
        jz      .correct
581
        cmp     [putimg.ebp], putimage_get4bpp
582
        jnz     @f
583
;--------------------------------------
584
align 4
585
.correct:
586
        mov     eax, [putimg.edi]
587
        mov     byte [eax], 80h
588
;--------------------------------------
589
align 4
590
@@:
591
        dec     edi
592
        jnz     .new_line
593
        jmp     put_image_end_32.finish
594
;------------------------------------------------------------------------------
595
align 4
2435 mario79 596
put_image_end_32_new:
597
;--------------------------------------
598
align 4
599
.new_line:
600
        mov     ecx, [putimg.real_sx]
601
;--------------------------------------
602
align 4
603
.new_x:
604
        push    [putimg.edi]
605
        mov     eax, [putimg.ebp+4]
606
        call    eax
607
        cmp     [ebp], bl
608
        jne     .skip
609
;--------------------------------------
610
        push    ecx
611
        mov     ecx, [putimg.real_sy_and_abs_cy + 4]
612
        sub     ecx, edi
613
;--------------------------------------
614
; check for Y
615
        cmp     cx, [Y_UNDER_subtraction_CUR_hot_y]
616
        jb      .no_mouse_area
617
 
618
        cmp     cx, [Y_UNDER_sub_CUR_hot_y_add_curh]
619
        jae     .no_mouse_area
620
 
621
        rol     ecx, 16
622
        add     ecx, [putimg.real_sx_and_abs_cx + 4]
623
        sub     ecx, [esp]
624
;--------------------------------------
625
; check for X
626
        cmp     cx, [X_UNDER_subtraction_CUR_hot_x]
627
        jb      .no_mouse_area
628
 
629
        cmp     cx, [X_UNDER_sub_CUR_hot_x_add_curh]
630
        jae     .no_mouse_area
631
;--------------------------------------
632
; check mouse area for putpixel
633
        call    check_mouse_area_for_putpixel_new.1
634
;--------------------------------------
635
align 4
636
.no_mouse_area:
637
        pop     ecx
638
; store to real LFB
639
        mov     [LFB_BASE+edx], eax
640
;--------------------------------------
641
align 4
642
.skip:
643
        add     edx, 4
644
        inc     ebp
645
        dec     ecx
646
        jnz     .new_x
647
 
648
        add     esi, [putimg.line_increment]
649
        add     edx, [putimg.screen_newline];[BytesPerScanLine]
650
        add     ebp, [putimg.winmap_newline];[Screen_Max_X]
651
 
652
        cmp     [putimg.ebp], putimage_get1bpp
653
        jz      .correct
654
        cmp     [putimg.ebp], putimage_get2bpp
655
        jz      .correct
656
        cmp     [putimg.ebp], putimage_get4bpp
657
        jnz     @f
658
;--------------------------------------
659
align 4
660
.correct:
661
        mov     eax, [putimg.edi]
662
        mov     byte [eax], 80h
663
;--------------------------------------
664
align 4
665
@@:
666
        dec     edi
667
        jnz     .new_line
668
        jmp     put_image_end_32.finish
2430 mario79 669
;------------------------------------------------------------------------------
2288 clevermous 670
align 4
671
__sys_putpixel:
672
 
673
; eax = x coordinate
674
; ebx = y coordinate
675
; ecx = ?? RR GG BB    ; 0x01000000 negation
2423 mario79 676
                       ; 0x02000000 used for draw_rectangle without top line
677
                       ;            for example drawwindow_III and drawwindow_IV
2288 clevermous 678
; edi = 0x00000001 force
679
 
680
;;;        mov  [novesachecksum], dword 0
681
        pushad
682
        cmp     [Screen_Max_X], eax
683
        jb      .exit
684
        cmp     [Screen_Max_Y], ebx
685
        jb      .exit
686
        test    edi, 1           ; force ?
687
        jnz     .forced
688
 
689
; not forced:
2438 mario79 690
        mov     edx, [d_width_calc_area + ebx*4]
691
        add     edx, [_WinMapAddress]
2288 clevermous 692
        movzx   edx, byte [eax+edx]
693
        cmp     edx, [CURRENT_TASK]
694
        jne     .exit
2430 mario79 695
;--------------------------------------
696
align 4
2288 clevermous 697
.forced:
698
; check if negation
699
        test    ecx, 0x01000000
700
        jz      .noneg
2430 mario79 701
 
2288 clevermous 702
        call    getpixel
703
        not     ecx
2430 mario79 704
 
705
        rol     ecx, 8
706
        mov     cl, [esp+32-8+3]
707
        ror     ecx, 8
2288 clevermous 708
        mov     [esp+32-8], ecx
2430 mario79 709
;--------------------------------------
710
align 4
2288 clevermous 711
.noneg:
712
; OK to set pixel
713
        call    dword [PUTPIXEL]; call the real put_pixel function
2430 mario79 714
;--------------------------------------
715
align 4
2288 clevermous 716
.exit:
717
        popad
718
        ret
2430 mario79 719
;-----------------------------------------------------------------------------
2288 clevermous 720
align 4
721
Vesa20_putpixel24:
722
; eax = x
723
; ebx = y
2430 mario79 724
        mov     ecx, eax
725
        shl     ecx, 16
726
        mov     cx, bx
727
 
2446 mario79 728
;        imul    ebx, [BytesPerScanLine]  ; ebx = y * y multiplier
2480 mario79 729
        mov     ebx, [BPSLine_calc_area+ebx*4]
2288 clevermous 730
        lea     edi, [eax+eax*2]; edi = x*3
731
        mov     eax, [esp+32-8+4]
2430 mario79 732
;--------------------------------------
2448 mario79 733
; check for hardware cursor
734
        cmp     [_display.select_cursor], 0
735
        jne     @f
2430 mario79 736
; check mouse area for putpixel
737
        test    eax, 0x04000000
738
        jnz     @f
2436 mario79 739
        call    check_mouse_area_for_putpixel
2430 mario79 740
;--------------------------------------
741
align 4
742
@@:
743
; store to real LFB
2288 clevermous 744
        mov     [LFB_BASE+ebx+edi], ax
745
        shr     eax, 16
746
        mov     [LFB_BASE+ebx+edi+2], al
2436 mario79 747
        ret
748
;-----------------------------------------------------------------------------
749
align 4
750
Vesa20_putpixel24_new:
751
; eax = x
752
; ebx = y
753
        mov     ecx, eax
754
        shl     ecx, 16
755
        mov     cx, bx
756
 
2446 mario79 757
;        imul    ebx, [BytesPerScanLine]  ; ebx = y * y multiplier
2480 mario79 758
        mov     ebx, [BPSLine_calc_area+ebx*4]
2436 mario79 759
        lea     edi, [eax+eax*2]; edi = x*3
760
        mov     eax, [esp+32-8+4]
2430 mario79 761
;--------------------------------------
2448 mario79 762
; check for hardware cursor
763
        cmp     [_display.select_cursor], select_cursor
764
        jne     @f
2436 mario79 765
; check mouse area for putpixel
766
        test    eax, 0x04000000
767
        jnz     @f
768
;--------------------------------------
769
; check for Y
770
        cmp     cx, [Y_UNDER_subtraction_CUR_hot_y]
771
        jb      @f
772
 
773
        cmp     cx, [Y_UNDER_sub_CUR_hot_y_add_curh]
774
        jae     @f
775
 
776
        rol     ecx, 16
777
;--------------------------------------
778
; check for X
779
        cmp     cx, [X_UNDER_subtraction_CUR_hot_x]
780
        jb      @f
781
 
782
        cmp     cx, [X_UNDER_sub_CUR_hot_x_add_curh]
783
        jae     @f
784
 
785
        call    check_mouse_area_for_putpixel_new.1
786
;--------------------------------------
787
align 4
788
@@:
789
; store to real LFB
790
        mov     [LFB_BASE+ebx+edi], ax
791
        shr     eax, 16
792
        mov     [LFB_BASE+ebx+edi+2], al
2288 clevermous 793
        ret
2430 mario79 794
;-----------------------------------------------------------------------------
2288 clevermous 795
align 4
796
Vesa20_putpixel32:
797
; eax = x
798
; ebx = y
2430 mario79 799
        mov     ecx, eax
800
        shl     ecx, 16
801
        mov     cx, bx
802
 
2446 mario79 803
;        imul    ebx, [BytesPerScanLine]  ; ebx = y * y multiplier
2480 mario79 804
        mov     ebx, [BPSLine_calc_area+ebx*4]
2288 clevermous 805
        lea     edi, [ebx+eax*4]; edi = x*4+(y*y multiplier)
806
        mov     eax, [esp+32-8+4]; eax = color
2430 mario79 807
;--------------------------------------
2448 mario79 808
; check for hardware cursor
809
        cmp     [_display.select_cursor], 0
810
        jne     @f
2430 mario79 811
; check mouse area for putpixel
812
        test    eax, 0x04000000
813
        jnz     @f
2436 mario79 814
        call    check_mouse_area_for_putpixel
2430 mario79 815
;--------------------------------------
816
align 4
817
@@:
818
        and     eax, 0xffffff
819
; store to real LFB
2288 clevermous 820
        mov     [LFB_BASE+edi], eax
2436 mario79 821
        ret
822
;-----------------------------------------------------------------------------
823
align 4
824
Vesa20_putpixel32_new:
825
; eax = x
826
; ebx = y
827
        mov     ecx, eax
828
        shl     ecx, 16
829
        mov     cx, bx
830
 
2446 mario79 831
;        imul    ebx, [BytesPerScanLine]  ; ebx = y * y multiplier
2480 mario79 832
        mov     ebx, [BPSLine_calc_area+ebx*4]
2436 mario79 833
        lea     edi, [ebx+eax*4]; edi = x*4+(y*y multiplier)
834
        mov     eax, [esp+32-8+4]; eax = color
2430 mario79 835
;--------------------------------------
2448 mario79 836
; check for hardware cursor
837
        cmp     [_display.select_cursor], select_cursor
838
        jne     @f
2436 mario79 839
; check mouse area for putpixel
840
        test    eax, 0x04000000
841
        jnz     @f
842
;--------------------------------------
843
; check for Y
844
        cmp     cx, [Y_UNDER_subtraction_CUR_hot_y]
845
        jb      @f
846
 
847
        cmp     cx, [Y_UNDER_sub_CUR_hot_y_add_curh]
848
        jae     @f
849
 
850
        rol     ecx, 16
851
;--------------------------------------
852
; check for X
853
        cmp     cx, [X_UNDER_subtraction_CUR_hot_x]
854
        jb      @f
855
 
856
        cmp     cx, [X_UNDER_sub_CUR_hot_x_add_curh]
857
        jae     @f
858
 
859
        call    check_mouse_area_for_putpixel_new.1
860
;--------------------------------------
861
align 4
862
@@:
863
        and     eax, 0xffffff
864
; store to real LFB
865
        mov     [LFB_BASE+edi], eax
2288 clevermous 866
        ret
2430 mario79 867
;-----------------------------------------------------------------------------
868
align 4
2288 clevermous 869
calculate_edi:
2446 mario79 870
;        mov     edi, ebx
871
;        imul    edi, [Screen_Max_X]
872
;        add     edi, ebx
873
        mov     edi, [d_width_calc_area + ebx*4]
2288 clevermous 874
        add     edi, eax
875
        ret
2430 mario79 876
;-----------------------------------------------------------------------------
2288 clevermous 877
; DRAWLINE
2430 mario79 878
;-----------------------------------------------------------------------------
2288 clevermous 879
align 4
880
__sys_draw_line:
881
; draw a line
882
; eax = HIWORD = x1
883
;       LOWORD = x2
884
; ebx = HIWORD = y1
885
;       LOWORD = y2
886
; ecx = color
887
; edi = force ?
888
        pusha
889
 
890
dl_x1 equ esp+20
891
dl_y1 equ esp+16
892
dl_x2 equ esp+12
893
dl_y2 equ esp+8
894
dl_dx equ esp+4
895
dl_dy equ esp+0
896
 
897
        xor     edx, edx   ; clear edx
898
        xor     esi, esi   ; unpack arguments
899
        xor     ebp, ebp
900
        mov     si, ax     ; esi = x2
901
        mov     bp, bx     ; ebp = y2
902
        shr     eax, 16    ; eax = x1
903
        shr     ebx, 16    ; ebx = y1
904
        push    eax        ; save x1
905
        push    ebx        ; save y1
906
        push    esi        ; save x2
907
        push    ebp        ; save y2
908
; checking x-axis...
909
        sub     esi, eax   ; esi = x2-x1
910
        push    esi        ; save y2-y1
911
        jl      .x2lx1     ; is x2 less than x1 ?
912
        jg      .no_vline  ; x1 > x2 ?
913
        mov     edx, ebp   ; else (if x1=x2)
914
        call    vline
915
        push    edx ; necessary to rightly restore stack frame at .exit
916
        jmp     .exit
2430 mario79 917
;--------------------------------------
918
align 4
2288 clevermous 919
.x2lx1:
920
        neg     esi         ; get esi absolute value
2430 mario79 921
;--------------------------------------
922
align 4
2288 clevermous 923
.no_vline:
924
; checking y-axis...
925
        sub     ebp, ebx    ; ebp = y2-y1
926
        push    ebp         ; save y2-y1
927
        jl      .y2ly1      ; is y2 less than y1 ?
928
        jg      .no_hline   ; y1 > y2 ?
929
        mov     edx, [dl_x2]; else (if y1=y2)
930
        call    hline
931
        jmp     .exit
2430 mario79 932
;--------------------------------------
933
align 4
2288 clevermous 934
.y2ly1:
935
        neg     ebp         ; get ebp absolute value
2430 mario79 936
;--------------------------------------
937
align 4
2288 clevermous 938
.no_hline:
939
        cmp     ebp, esi
940
        jle     .x_rules    ; |y2-y1| < |x2-x1|  ?
941
        cmp     [dl_y2], ebx; make sure y1 is at the begining
942
        jge     .no_reverse1
943
        neg     dword [dl_dx]
944
        mov     edx, [dl_x2]
945
        mov     [dl_x2], eax
946
        mov     [dl_x1], edx
947
        mov     edx, [dl_y2]
948
        mov     [dl_y2], ebx
949
        mov     [dl_y1], edx
2430 mario79 950
;--------------------------------------
951
align 4
2288 clevermous 952
.no_reverse1:
953
        mov     eax, [dl_dx]
954
        cdq                 ; extend eax sing to edx
955
        shl     eax, 16     ; using 16bit fix-point maths
956
        idiv    ebp         ; eax = ((x2-x1)*65536)/(y2-y1)
2353 mario79 957
;--------------------------------------
958
; correction for the remainder of the division
959
        shl     edx, 1
960
        cmp     ebp, edx
961
        jb      @f
962
        inc     eax
2430 mario79 963
;--------------------------------------
964
align 4
2353 mario79 965
@@:
966
;--------------------------------------
2288 clevermous 967
        mov     edx, ebp    ; edx = counter (number of pixels to draw)
968
        mov     ebp, 1 *65536; <<16   ; ebp = dy = 1.0
969
        mov     esi, eax    ; esi = dx
970
        jmp     .y_rules
2430 mario79 971
;--------------------------------------
972
align 4
2288 clevermous 973
.x_rules:
974
        cmp     [dl_x2], eax ; make sure x1 is at the begining
975
        jge     .no_reverse2
976
        neg     dword [dl_dy]
977
        mov     edx, [dl_x2]
978
        mov     [dl_x2], eax
979
        mov     [dl_x1], edx
980
        mov     edx, [dl_y2]
981
        mov     [dl_y2], ebx
982
        mov     [dl_y1], edx
2430 mario79 983
;--------------------------------------
984
align 4
2288 clevermous 985
.no_reverse2:
986
        xor     edx, edx
987
        mov     eax, [dl_dy]
988
        cdq                 ; extend eax sing to edx
989
        shl     eax, 16     ; using 16bit fix-point maths
990
        idiv    esi         ; eax = ((y2-y1)*65536)/(x2-x1)
2353 mario79 991
;--------------------------------------
992
; correction for the remainder of the division
993
        shl     edx, 1
994
        cmp     esi, edx
995
        jb      @f
996
        inc     eax
2430 mario79 997
;--------------------------------------
998
align 4
2353 mario79 999
@@:
1000
;--------------------------------------
2288 clevermous 1001
        mov     edx, esi    ; edx = counter (number of pixels to draw)
1002
        mov     esi, 1 *65536;<< 16   ; esi = dx = 1.0
1003
        mov     ebp, eax    ; ebp = dy
2430 mario79 1004
;--------------------------------------
1005
align 4
2288 clevermous 1006
.y_rules:
1007
        mov     eax, [dl_x1]
1008
        mov     ebx, [dl_y1]
1009
        shl     eax, 16
1010
        shl     ebx, 16
2455 mario79 1011
 
1012
        and     ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area
2353 mario79 1013
;-----------------------------------------------------------------------------
2288 clevermous 1014
align 4
1015
.draw:
1016
        push    eax ebx
2353 mario79 1017
;--------------------------------------
1018
; correction for the remainder of the division
1019
        test    ah, 0x80
1020
        jz      @f
1021
        add     eax, 1 shl 16
2430 mario79 1022
;--------------------------------------
1023
align 4
2353 mario79 1024
@@:
1025
;--------------------------------------
2288 clevermous 1026
        shr     eax, 16
2353 mario79 1027
;--------------------------------------
1028
; correction for the remainder of the division
1029
        test    bh, 0x80
1030
        jz      @f
1031
        add     ebx, 1 shl 16
2430 mario79 1032
;--------------------------------------
1033
align 4
2353 mario79 1034
@@:
1035
;--------------------------------------
2288 clevermous 1036
        shr     ebx, 16
2455 mario79 1037
;        and     ecx, 0xFBFFFFFF  ;negate 0x04000000 save to mouseunder area
2453 mario79 1038
;        call    [putpixel]
1039
        call    __sys_putpixel
2288 clevermous 1040
        pop     ebx eax
1041
        add     ebx, ebp     ; y = y+dy
1042
        add     eax, esi     ; x = x+dx
1043
        dec     edx
1044
        jnz     .draw
1045
; force last drawn pixel to be at (x2,y2)
1046
        mov     eax, [dl_x2]
1047
        mov     ebx, [dl_y2]
2455 mario79 1048
;        and     ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area
2453 mario79 1049
;        call    [putpixel]
1050
        call    __sys_putpixel
2430 mario79 1051
;--------------------------------------
1052
align 4
2288 clevermous 1053
.exit:
1054
        add     esp, 6*4
1055
        popa
2430 mario79 1056
;        call    [draw_pointer]
2288 clevermous 1057
        ret
2430 mario79 1058
;------------------------------------------------------------------------------
1059
align 4
2288 clevermous 1060
hline:
1061
; draw an horizontal line
1062
; eax = x1
1063
; edx = x2
1064
; ebx = y
1065
; ecx = color
1066
; edi = force ?
1067
        push    eax edx
1068
        cmp     edx, eax   ; make sure x2 is above x1
1069
        jge     @f
1070
        xchg    eax, edx
2430 mario79 1071
;--------------------------------------
1072
align 4
2288 clevermous 1073
@@:
2430 mario79 1074
        and     ecx, 0xFBFFFFFF  ;negate 0x04000000 save to mouseunder area
2455 mario79 1075
;--------------------------------------
1076
align 4
1077
@@:
2453 mario79 1078
;        call    [putpixel]
1079
        call    __sys_putpixel
2288 clevermous 1080
        inc     eax
1081
        cmp     eax, edx
1082
        jle     @b
1083
        pop     edx eax
1084
        ret
2430 mario79 1085
;------------------------------------------------------------------------------
1086
align 4
2288 clevermous 1087
vline:
1088
; draw a vertical line
1089
; eax = x
1090
; ebx = y1
1091
; edx = y2
1092
; ecx = color
1093
; edi = force ?
1094
        push    ebx edx
1095
        cmp     edx, ebx   ; make sure y2 is above y1
1096
        jge     @f
1097
        xchg    ebx, edx
2430 mario79 1098
;--------------------------------------
1099
align 4
2288 clevermous 1100
@@:
2430 mario79 1101
        and     ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area
2455 mario79 1102
;--------------------------------------
1103
align 4
1104
@@:
2453 mario79 1105
;        call    [putpixel]
1106
        call    __sys_putpixel
2288 clevermous 1107
        inc     ebx
1108
        cmp     ebx, edx
1109
        jle     @b
1110
        pop     edx ebx
1111
        ret
2430 mario79 1112
;------------------------------------------------------------------------------
1113
align 4
2288 clevermous 1114
virtual at esp
1115
drbar:
1116
     .bar_sx       dd ?
1117
     .bar_sy       dd ?
1118
     .bar_cx       dd ?
1119
     .bar_cy       dd ?
1120
     .abs_cx       dd ?
1121
     .abs_cy       dd ?
1122
     .real_sx      dd ?
1123
     .real_sy      dd ?
1124
     .color        dd ?
1125
     .line_inc_scr dd ?
1126
     .line_inc_map dd ?
2430 mario79 1127
     .real_sx_and_abs_cx dd ?
1128
     .real_sy_and_abs_cy dd ?
1129
     .stack_data = 4*13
2288 clevermous 1130
end virtual
2430 mario79 1131
;--------------------------------------
2288 clevermous 1132
align 4
1133
; eax   cx
1134
; ebx   cy
1135
; ecx   xe
1136
; edx   ye
1137
; edi   color
1138
vesa20_drawbar:
1139
        pushad
1140
        sub     esp, drbar.stack_data
1141
        mov     [drbar.color], edi
1142
        sub     edx, ebx
1143
        jle     .exit       ;// mike.dld, 2005-01-29
1144
        sub     ecx, eax
1145
        jle     .exit       ;// mike.dld, 2005-01-29
1146
        mov     [drbar.bar_sy], edx
1147
        mov     [drbar.bar_sx], ecx
1148
        mov     [drbar.bar_cx], eax
1149
        mov     [drbar.bar_cy], ebx
1150
        mov     edi, [TASK_BASE]
1151
        add     eax, [edi-twdw + WDATA.box.left]; win_cx
1152
        add     ebx, [edi-twdw + WDATA.box.top]; win_cy
1153
        mov     [drbar.abs_cx], eax
1154
        mov     [drbar.abs_cy], ebx
1155
; real_sx = MIN(wnd_sx-bar_cx, bar_sx);
1156
        mov     ebx, [edi-twdw + WDATA.box.width]; ebx = wnd_sx
1157
; \begin{diamond}[20.08.2006]
1158
; note that WDATA.box.width is one pixel less than real window x-size
1159
        inc     ebx
1160
; \end{diamond}[20.08.2006]
1161
        sub     ebx, [drbar.bar_cx]
1162
        ja      @f
2430 mario79 1163
;--------------------------------------
1164
align 4
2288 clevermous 1165
.exit:                       ;// mike.dld, 2005-01-29
1166
        add     esp, drbar.stack_data
1167
        popad
1168
        xor     eax, eax
1169
        inc     eax
1170
        ret
2430 mario79 1171
;--------------------------------------
1172
align 4
2288 clevermous 1173
@@:
1174
        cmp     ebx, [drbar.bar_sx]
1175
        jbe     .end_x
1176
        mov     ebx, [drbar.bar_sx]
2430 mario79 1177
;--------------------------------------
1178
align 4
2288 clevermous 1179
.end_x:
1180
        mov     [drbar.real_sx], ebx
1181
; real_sy = MIN(wnd_sy-bar_cy, bar_sy);
1182
        mov     ebx, [edi-twdw + WDATA.box.height]; ebx = wnd_sy
1183
; \begin{diamond}[20.08.2006]
1184
        inc     ebx
1185
; \end{diamond}
1186
        sub     ebx, [drbar.bar_cy]
1187
        ja      @f
1188
        add     esp, drbar.stack_data
1189
        popad
1190
        xor     eax, eax
1191
        inc     eax
1192
        ret
2430 mario79 1193
;--------------------------------------
1194
align 4
2288 clevermous 1195
@@:
1196
        cmp     ebx, [drbar.bar_sy]
1197
        jbe     .end_y
1198
        mov     ebx, [drbar.bar_sy]
2430 mario79 1199
;--------------------------------------
1200
align 4
2288 clevermous 1201
.end_y:
1202
        mov     [drbar.real_sy], ebx
1203
; line_inc_map
1204
        mov     eax, [Screen_Max_X]
1205
        sub     eax, [drbar.real_sx]
1206
        inc     eax
1207
        mov     [drbar.line_inc_map], eax
1208
; line_inc_scr
1209
        mov     eax, [drbar.real_sx]
1210
        movzx   ebx, byte [ScreenBPP]
1211
        shr     ebx, 3
1212
        imul    eax, ebx
1213
        neg     eax
1214
        add     eax, [BytesPerScanLine]
1215
        mov     [drbar.line_inc_scr], eax
1216
; pointer to screen
1217
        mov     edx, [drbar.abs_cy]
2446 mario79 1218
;        imul    edx, [BytesPerScanLine]
2480 mario79 1219
        mov     edx, [BPSLine_calc_area+edx*4]
2288 clevermous 1220
        mov     eax, [drbar.abs_cx]
1221
        imul    eax, ebx
1222
        add     edx, eax
1223
; pointer to pixel map
1224
        mov     eax, [drbar.abs_cy]
2446 mario79 1225
;        imul    eax, [Screen_Max_X]
1226
;        add     eax, [drbar.abs_cy]
1227
        mov     eax, [d_width_calc_area + eax*4]
1228
 
2288 clevermous 1229
        add     eax, [drbar.abs_cx]
1230
        add     eax, [_WinMapAddress]
1231
        xchg    eax, ebp
2430 mario79 1232
;--------------------------------------
1233
        mov     ebx, [drbar.real_sx]
1234
        add     ebx, [drbar.abs_cx]
1235
        mov     [drbar.real_sx_and_abs_cx], ebx
1236
        mov     ebx, [drbar.real_sy]
1237
        add     ebx, [drbar.abs_cy]
1238
        mov     [drbar.real_sy_and_abs_cy], ebx
1239
 
1240
        add     edx, LFB_BASE
1241
;--------------------------------------
2288 clevermous 1242
; get process number
2446 mario79 1243
        mov     ebx, [CURRENT_TASK]  ; bl - process num
1244
        mov     esi, [drbar.real_sy]
1245
        mov     eax, [drbar.color] ; BBGGRR00
1246
        rol     eax, 8
1247
        mov     bh, al  ; 0x80 drawing gradient bars
1248
        ror     eax, 8
2288 clevermous 1249
        cmp     byte [ScreenBPP], 24
1250
        jne     draw_bar_end_32
2430 mario79 1251
;--------------------------------------
1252
align 4
2288 clevermous 1253
draw_bar_end_24:
2446 mario79 1254
; eax - color high   RRGGBB
2288 clevermous 1255
; bl - process num
1256
; ecx - temp
1257
; edx - pointer to screen
1258
; esi - counter
1259
; edi - counter
2453 mario79 1260
;--------------------------------------
1261
; check for hardware cursor
2455 mario79 1262
        mov     ecx, [_display.select_cursor]
1263
        cmp     ecx, select_cursor
1264
        je      draw_bar_end_24_new
1265
        cmp     ecx, 0
2453 mario79 1266
        je      draw_bar_end_24_old
2430 mario79 1267
;--------------------------------------
1268
align 4
2288 clevermous 1269
.new_y:
1270
        mov     edi, [drbar.real_sx]
2430 mario79 1271
;--------------------------------------
1272
align 4
2288 clevermous 1273
.new_x:
1274
        cmp     byte [ebp], bl
1275
        jne     .skip
2430 mario79 1276
;--------------------------------------
2453 mario79 1277
; store to real LFB
1278
        mov     [edx], ax
1279
        shr     eax, 16
1280
        mov     [edx + 2], al
1281
;--------------------------------------
1282
align 4
1283
.skip:
1284
; add pixel
1285
        add     edx, 3
1286
        inc     ebp
1287
        dec     edi
1288
        jnz     .new_x
1289
; add line
1290
        add     edx, [drbar.line_inc_scr]
1291
        add     ebp, [drbar.line_inc_map]
1292
; drawing gradient bars
1293
        test    bh, 0x80
1294
        jz      @f
1295
        test    al, al
1296
        jz      @f
1297
        dec     al
1298
;--------------------------------------
1299
align 4
1300
@@:
1301
        dec     esi
1302
        jnz     .new_y
1303
;--------------------------------------
1304
align 4
1305
.end:
1306
        add     esp, drbar.stack_data
1307
        popad
1308
        xor     eax, eax
1309
        ret
1310
;------------------------------------------------------------------------------
1311
align 4
1312
draw_bar_end_24_old:
1313
;--------------------------------------
1314
align 4
1315
.new_y:
1316
        mov     edi, [drbar.real_sx]
1317
;--------------------------------------
1318
align 4
1319
.new_x:
1320
        cmp     byte [ebp], bl
1321
        jne     .skip
1322
;--------------------------------------
2446 mario79 1323
        mov     ecx, [drbar.real_sx_and_abs_cx]
2430 mario79 1324
        sub     ecx, edi
1325
        shl     ecx, 16
2446 mario79 1326
        add     ecx, [drbar.real_sy_and_abs_cy]
2430 mario79 1327
        sub     ecx, esi
1328
; check mouse area for putpixel
1329
        call    check_mouse_area_for_putpixel
1330
; store to real LFB
1331
        mov     [edx], ax
1332
        shr     eax, 16
1333
        mov     [edx + 2], al
2446 mario79 1334
        mov     eax, [drbar.color]
2430 mario79 1335
;--------------------------------------
1336
align 4
2288 clevermous 1337
.skip:
1338
; add pixel
1339
        add     edx, 3
1340
        inc     ebp
1341
        dec     edi
1342
        jnz     .new_x
1343
; add line
1344
        add     edx, [drbar.line_inc_scr]
1345
        add     ebp, [drbar.line_inc_map]
2446 mario79 1346
; drawing gradient bars
1347
        test    bh, 0x80
2288 clevermous 1348
        jz      @f
2446 mario79 1349
        test    al, al
2288 clevermous 1350
        jz      @f
2446 mario79 1351
        dec     al
2430 mario79 1352
;--------------------------------------
1353
align 4
2288 clevermous 1354
@@:
1355
        dec     esi
1356
        jnz     .new_y
2453 mario79 1357
        jmp     draw_bar_end_24.end
1358
;------------------------------------------------------------------------------
2430 mario79 1359
align 4
1360
draw_bar_end_24_new:
1361
;--------------------------------------
1362
align 4
1363
.new_y:
1364
        mov     edi, [drbar.real_sx]
1365
;--------------------------------------
1366
align 4
1367
.new_x:
1368
        cmp     byte [ebp], bl
1369
        jne     .skip
1370
;--------------------------------------
1371
        mov     ecx, [drbar.real_sy_and_abs_cy]
1372
        sub     ecx, esi
1373
;--------------------------------------
1374
; check for Y
1375
        cmp     cx, [Y_UNDER_subtraction_CUR_hot_y]
1376
        jb      .no_mouse_area
2288 clevermous 1377
 
2430 mario79 1378
        cmp     cx, [Y_UNDER_sub_CUR_hot_y_add_curh]
1379
        jae     .no_mouse_area
1380
 
1381
        rol     ecx, 16
1382
        add     ecx, [drbar.real_sx_and_abs_cx]
1383
        sub     ecx, edi
1384
;--------------------------------------
1385
; check for X
1386
        cmp     cx, [X_UNDER_subtraction_CUR_hot_x]
1387
        jb      .no_mouse_area
1388
 
1389
        cmp     cx, [X_UNDER_sub_CUR_hot_x_add_curh]
1390
        jae     .no_mouse_area
1391
;--------------------------------------
1392
; check mouse area for putpixel
2477 mario79 1393
        push    eax
2430 mario79 1394
        call    check_mouse_area_for_putpixel_new.1
1395
        mov     [edx], ax
1396
        shr     eax, 16
1397
        mov     [edx + 2], al
2477 mario79 1398
        pop     eax
2430 mario79 1399
        jmp     .skip
1400
; store to real LFB
1401
;--------------------------------------
1402
align 4
1403
.no_mouse_area:
2446 mario79 1404
        mov     [edx], ax
1405
        ror     eax, 16
1406
        mov     [edx + 2], al
1407
        rol     eax, 16
2430 mario79 1408
;--------------------------------------
1409
align 4
1410
.skip:
1411
; add pixel
1412
        add     edx, 3
1413
        inc     ebp
1414
        dec     edi
1415
        jnz     .new_x
1416
; add line
1417
        add     edx, [drbar.line_inc_scr]
1418
        add     ebp, [drbar.line_inc_map]
2446 mario79 1419
; drawing gradient bars
1420
        test    bh, 0x80
2430 mario79 1421
        jz      @f
2446 mario79 1422
        test    al, al
2430 mario79 1423
        jz      @f
2446 mario79 1424
        dec     al
2430 mario79 1425
;--------------------------------------
1426
align 4
1427
@@:
1428
        dec     esi
1429
        jnz     .new_y
1430
        jmp     draw_bar_end_24.end
2453 mario79 1431
;------------------------------------------------------------------------------
2430 mario79 1432
align 4
2288 clevermous 1433
draw_bar_end_32:
2446 mario79 1434
; eax - color high   RRGGBB
1435
; bl - process num
1436
; ecx - temp
1437
; edx - pointer to screen
1438
; esi - counter
1439
; edi - counter
2453 mario79 1440
;--------------------------------------
1441
; check for hardware cursor
2455 mario79 1442
        mov     ecx, [_display.select_cursor]
1443
        cmp     ecx, select_cursor
1444
        je      draw_bar_end_32_new
1445
        cmp     ecx, 0
2453 mario79 1446
        je      draw_bar_end_32_old
2430 mario79 1447
;--------------------------------------
1448
align 4
2288 clevermous 1449
.new_y:
1450
        mov     edi, [drbar.real_sx]
2430 mario79 1451
;--------------------------------------
1452
align 4
2288 clevermous 1453
.new_x:
1454
        cmp     byte [ebp], bl
1455
        jne     .skip
2430 mario79 1456
;--------------------------------------
1457
; store to real LFB
1458
        mov     [edx], eax
2446 mario79 1459
        mov     eax, [drbar.color]
2430 mario79 1460
;--------------------------------------
1461
align 4
2288 clevermous 1462
.skip:
1463
; add pixel
1464
        add     edx, 4
1465
        inc     ebp
1466
        dec     edi
1467
        jnz     .new_x
1468
; add line
1469
        add     edx, [drbar.line_inc_scr]
1470
        add     ebp, [drbar.line_inc_map]
2446 mario79 1471
; drawing gradient bars
1472
        test    bh, 0x80
2288 clevermous 1473
        jz      @f
1474
        test    al, al
1475
        jz      @f
1476
        dec     al
2430 mario79 1477
;--------------------------------------
1478
align 4
2288 clevermous 1479
@@:
1480
        dec     esi
1481
        jnz     .new_y
2430 mario79 1482
;--------------------------------------
1483
align 4
1484
.end:
2288 clevermous 1485
        add     esp, drbar.stack_data
1486
        popad
2436 mario79 1487
        cmp     [SCR_MODE], dword 0x12
1488
        jne     @f
2288 clevermous 1489
        call    VGA_draw_bar
2436 mario79 1490
;--------------------------------------
1491
align 4
1492
@@:
2288 clevermous 1493
        xor     eax, eax
1494
        mov     [EGA_counter], 1
1495
        ret
2453 mario79 1496
;------------------------------------------------------------------------------
1497
align 4
1498
draw_bar_end_32_old:
2430 mario79 1499
;--------------------------------------
1500
align 4
2453 mario79 1501
.new_y:
1502
        mov     edi, [drbar.real_sx]
1503
;--------------------------------------
1504
align 4
1505
.new_x:
1506
        cmp     byte [ebp], bl
1507
        jne     .skip
1508
;--------------------------------------
1509
        mov     ecx, [drbar.real_sx_and_abs_cx]
1510
        sub     ecx, edi
1511
        shl     ecx, 16
1512
        add     ecx, [drbar.real_sy_and_abs_cy]
1513
        sub     ecx, esi
1514
 
1515
; check mouse area for putpixel
1516
        call    check_mouse_area_for_putpixel
1517
; store to real LFB
1518
        mov     [edx], eax
1519
        mov     eax, [drbar.color]
1520
;--------------------------------------
1521
align 4
1522
.skip:
1523
; add pixel
1524
        add     edx, 4
1525
        inc     ebp
1526
        dec     edi
1527
        jnz     .new_x
1528
; add line
1529
        add     edx, [drbar.line_inc_scr]
1530
        add     ebp, [drbar.line_inc_map]
1531
; drawing gradient bars
1532
        test    bh, 0x80
1533
        jz      @f
1534
        test    al, al
1535
        jz      @f
1536
        dec     al
1537
;--------------------------------------
1538
align 4
1539
@@:
1540
        dec     esi
1541
        jnz     .new_y
1542
        jmp     draw_bar_end_32.end
1543
;------------------------------------------------------------------------------
1544
align 4
2430 mario79 1545
draw_bar_end_32_new:
1546
;--------------------------------------
1547
align 4
1548
.new_y:
1549
        mov     edi, [drbar.real_sx]
1550
;--------------------------------------
1551
align 4
1552
.new_x:
1553
        cmp     byte [ebp], bl
1554
        jne     .skip
1555
;--------------------------------------
1556
        mov     ecx, [drbar.real_sy_and_abs_cy]
1557
        sub     ecx, esi
1558
;--------------------------------------
1559
; check for Y
1560
        cmp     cx, [Y_UNDER_subtraction_CUR_hot_y]
1561
        jb      .no_mouse_area
2288 clevermous 1562
 
2430 mario79 1563
        cmp     cx, [Y_UNDER_sub_CUR_hot_y_add_curh]
1564
        jae     .no_mouse_area
1565
 
1566
        rol     ecx, 16
1567
        add     ecx, [drbar.real_sx_and_abs_cx]
1568
        sub     ecx, edi
1569
;--------------------------------------
1570
; check for X
1571
        cmp     cx, [X_UNDER_subtraction_CUR_hot_x]
1572
        jb      .no_mouse_area
1573
 
1574
        cmp     cx, [X_UNDER_sub_CUR_hot_x_add_curh]
1575
        jae     .no_mouse_area
1576
;--------------------------------------
1577
; check mouse area for putpixel
2477 mario79 1578
        push    eax
2430 mario79 1579
        call    check_mouse_area_for_putpixel_new.1
1580
        mov     [edx], eax
2477 mario79 1581
        pop     eax
2430 mario79 1582
        jmp     .skip
1583
; store to real LFB
1584
;--------------------------------------
2288 clevermous 1585
align 4
2430 mario79 1586
.no_mouse_area:
1587
        mov     [edx], eax
1588
;--------------------------------------
1589
align 4
1590
.skip:
1591
; add pixel
1592
        add     edx, 4
1593
        inc     ebp
1594
        dec     edi
1595
        jnz     .new_x
1596
; add line
1597
        add     edx, [drbar.line_inc_scr]
1598
        add     ebp, [drbar.line_inc_map]
2446 mario79 1599
; drawing gradient bars
1600
        test    bh, 0x80
2430 mario79 1601
        jz      @f
1602
        test    al, al
1603
        jz      @f
1604
        dec     al
1605
;--------------------------------------
1606
align 4
1607
@@:
1608
        dec     esi
1609
        jnz     .new_y
1610
        jmp     draw_bar_end_32.end
1611
;------------------------------------------------------------------------------
1612
align 4
2288 clevermous 1613
vesa20_drawbackground_tiled:
1614
        pushad
1615
; External loop for all y from start to end
1616
        mov     ebx, [draw_data+32+RECT.top]    ; y start
2430 mario79 1617
;--------------------------------------
1618
align 4
2288 clevermous 1619
dp2:
1620
        mov     ebp, [draw_data+32+RECT.left]   ; x start
1621
; 1) Calculate pointers in WinMapAddress (does pixel belong to OS thread?) [ebp]
1622
;                       and LFB data (output for our function) [edi]
2446 mario79 1623
;        mov     eax, [BytesPerScanLine]
1624
;        mul     ebx
2480 mario79 1625
        mov     eax, [BPSLine_calc_area+ebx*4]
2288 clevermous 1626
        xchg    ebp, eax
1627
        add     ebp, eax
1628
        add     ebp, eax
1629
        add     ebp, eax
1630
        cmp     [ScreenBPP], byte 24    ; 24 or 32 bpp ? - x size
1631
        jz      @f
1632
        add     ebp, eax
2430 mario79 1633
;--------------------------------------
1634
align 4
2288 clevermous 1635
@@:
1636
        add     ebp, LFB_BASE
1637
; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
1638
        call    calculate_edi
1639
        xchg    edi, ebp
1640
        add     ebp, [_WinMapAddress]
1641
; Now eax=x, ebx=y, edi->output, ebp=offset in WinMapAddress
1642
; 2) Calculate offset in background memory block
1643
        push    eax
1644
        xor     edx, edx
1645
        mov     eax, ebx
1646
        div     dword [BgrDataHeight]   ; edx := y mod BgrDataHeight
1647
        pop     eax
1648
        push    eax
1649
        mov     ecx, [BgrDataWidth]
1650
        mov     esi, edx
1651
        imul    esi, ecx                ; esi := (y mod BgrDataHeight) * BgrDataWidth
1652
        xor     edx, edx
1653
        div     ecx             ; edx := x mod BgrDataWidth
1654
        sub     ecx, edx
1655
        add     esi, edx        ; esi := (y mod BgrDataHeight)*BgrDataWidth + (x mod BgrDataWidth)
1656
        pop     eax
1657
        lea     esi, [esi*3]
1658
        add     esi, [img_background]
1659
        xor     edx, edx
1660
        inc     edx
1661
; 3) Loop through redraw rectangle and copy background data
1662
; Registers meaning:
1663
; eax = x, ebx = y (screen coordinates)
1664
; ecx = deltax - number of pixels left in current tile block
1665
; edx = 1
1666
; esi -> bgr memory, edi -> output
1667
; ebp = offset in WinMapAddress
2430 mario79 1668
;--------------------------------------
1669
align 4
2288 clevermous 1670
dp3:
1671
        cmp     [ebp], dl
1672
        jnz     nbgp
2430 mario79 1673
;--------------------------------------
1674
        push    eax ecx
1675
 
1676
        mov     ecx, eax
1677
        shl     ecx, 16
1678
        add     ecx, ebx
1679
 
1680
        mov     eax, [esi]
2448 mario79 1681
 
1682
; check for hardware cursor
2451 mario79 1683
        cmp     [_display.select_cursor], select_cursor
1684
        je      @f
2448 mario79 1685
        cmp     [_display.select_cursor], 0
1686
        jne     .no_mouseunder
1687
;--------------------------------------
1688
align 4
1689
@@:
2430 mario79 1690
        and     eax, 0xffffff
1691
; check mouse area for putpixel
1692
        call    [_display.check_mouse]
2448 mario79 1693
;--------------------------------------
1694
align 4
1695
.no_mouseunder:
2430 mario79 1696
; store to real LFB
1697
        mov     [edi], ax
1698
        shr     eax, 16
1699
        mov     [edi+2], al
1700
 
1701
        pop     ecx eax
1702
;--------------------------------------
1703
align 4
2288 clevermous 1704
nbgp:
1705
        add     esi, 3
1706
        add     edi, 3
2430 mario79 1707
;--------------------------------------
1708
align 4
2288 clevermous 1709
@@:
1710
        cmp     [ScreenBPP], byte 25    ; 24 or 32 bpp?
1711
        sbb     edi, -1         ; +1 for 32 bpp
1712
; I do not use 'inc eax' because this is slightly slower then 'add eax,1'
1713
        add     ebp, edx
1714
        add     eax, edx
1715
        cmp     eax, [draw_data+32+RECT.right]
1716
        ja      dp4
1717
        sub     ecx, edx
1718
        jnz     dp3
1719
; next tile block on x-axis
1720
        mov     ecx, [BgrDataWidth]
1721
        sub     esi, ecx
1722
        sub     esi, ecx
1723
        sub     esi, ecx
1724
        jmp     dp3
2430 mario79 1725
;--------------------------------------
1726
align 4
2288 clevermous 1727
dp4:
1728
; next scan line
1729
        inc     ebx
1730
        cmp     ebx, [draw_data+32+RECT.bottom]
1731
        jbe     dp2
1732
        popad
1733
        mov     [EGA_counter], 1
2436 mario79 1734
        cmp     [SCR_MODE], dword 0x12
1735
        jne     @f
2288 clevermous 1736
        call    VGA_drawbackground
2436 mario79 1737
;--------------------------------------
1738
align 4
1739
@@:
2288 clevermous 1740
        ret
2430 mario79 1741
;------------------------------------------------------------------------------
1742
align 4
2288 clevermous 1743
vesa20_drawbackground_stretch:
1744
        pushad
1745
; Helper variables
1746
; calculate 2^32*(BgrDataWidth-1) mod (ScreenWidth-1)
1747
        mov     eax, [BgrDataWidth]
1748
        dec     eax
1749
        xor     edx, edx
1750
        div     dword [Screen_Max_X]
1751
        push    eax     ; high
1752
        xor     eax, eax
1753
        div     dword [Screen_Max_X]
1754
        push    eax     ; low
1755
; the same for height
1756
        mov     eax, [BgrDataHeight]
1757
        dec     eax
1758
        xor     edx, edx
1759
        div     dword [Screen_Max_Y]
1760
        push    eax     ; high
1761
        xor     eax, eax
1762
        div     dword [Screen_Max_Y]
1763
        push    eax     ; low
1764
; External loop for all y from start to end
1765
        mov     ebx, [draw_data+32+RECT.top]    ; y start
1766
        mov     ebp, [draw_data+32+RECT.left]   ; x start
1767
; 1) Calculate pointers in WinMapAddress (does pixel belong to OS thread?) [ebp]
1768
;                       and LFB data (output for our function) [edi]
2446 mario79 1769
;        mov     eax, [BytesPerScanLine]
1770
;        mul     ebx
2480 mario79 1771
        mov     eax, [BPSLine_calc_area+ebx*4]
2288 clevermous 1772
        xchg    ebp, eax
1773
        add     ebp, eax
1774
        add     ebp, eax
1775
        add     ebp, eax
1776
        cmp     [ScreenBPP], byte 24    ; 24 or 32 bpp ? - x size
1777
        jz      @f
1778
        add     ebp, eax
2430 mario79 1779
;--------------------------------------
1780
align 4
2288 clevermous 1781
@@:
1782
; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
1783
        call    calculate_edi
1784
        xchg    edi, ebp
1785
; Now eax=x, ebx=y, edi->output, ebp=offset in WinMapAddress
1786
        push    ebx
1787
        push    eax
1788
; 2) Calculate offset in background memory block
1789
        mov     eax, ebx
1790
        imul    ebx, dword [esp+12]
1791
        mul     dword [esp+8]
1792
        add     edx, ebx        ; edx:eax = y * 2^32*(BgrDataHeight-1)/(ScreenHeight-1)
1793
        mov     esi, edx
1794
        imul    esi, [BgrDataWidth]
1795
        push    edx
1796
        push    eax
1797
        mov     eax, [esp+8]
1798
        mul     dword [esp+28]
1799
        push    eax
1800
        mov     eax, [esp+12]
1801
        mul     dword [esp+28]
1802
        add     [esp], edx
1803
        pop     edx             ; edx:eax = x * 2^32*(BgrDataWidth-1)/(ScreenWidth-1)
1804
        add     esi, edx
1805
        lea     esi, [esi*3]
1806
        add     esi, [img_background]
1807
        push    eax
1808
        push    edx
1809
        push    esi
1810
; 3) Smooth horizontal
2430 mario79 1811
;--------------------------------------
1812
align 4
2288 clevermous 1813
bgr_resmooth0:
1814
        mov     ecx, [esp+8]
1815
        mov     edx, [esp+4]
1816
        mov     esi, [esp]
1817
        push    edi
1818
        mov     edi, bgr_cur_line
1819
        call    smooth_line
2430 mario79 1820
;--------------------------------------
1821
align 4
2288 clevermous 1822
bgr_resmooth1:
1823
        mov     eax, [esp+16+4]
1824
        inc     eax
1825
        cmp     eax, [BgrDataHeight]
1826
        jae     bgr.no2nd
1827
        mov     ecx, [esp+8+4]
1828
        mov     edx, [esp+4+4]
1829
        mov     esi, [esp+4]
1830
        add     esi, [BgrDataWidth]
1831
        add     esi, [BgrDataWidth]
1832
        add     esi, [BgrDataWidth]
1833
        mov     edi, bgr_next_line
1834
        call    smooth_line
2430 mario79 1835
;--------------------------------------
1836
align 4
2288 clevermous 1837
bgr.no2nd:
1838
        pop     edi
2430 mario79 1839
;--------------------------------------
1840
align 4
2288 clevermous 1841
sdp3:
1842
        xor     esi, esi
1843
        mov     ecx, [esp+12]
1844
; 4) Loop through redraw rectangle and copy background data
1845
; Registers meaning:
1846
; esi = offset in current line, edi -> output
1847
; ebp = offset in WinMapAddress
1848
; dword [esp] = offset in bgr data
1849
; qword [esp+4] = x * 2^32 * (BgrDataWidth-1) / (ScreenWidth-1)
1850
; qword [esp+12] = y * 2^32 * (BgrDataHeight-1) / (ScreenHeight-1)
1851
; dword [esp+20] = x
1852
; dword [esp+24] = y
1853
; precalculated constants:
1854
; qword [esp+28] = 2^32*(BgrDataHeight-1)/(ScreenHeight-1)
1855
; qword [esp+36] = 2^32*(BgrDataWidth-1)/(ScreenWidth-1)
2430 mario79 1856
;--------------------------------------
1857
align 4
2288 clevermous 1858
sdp3a:
1859
        mov     eax, [_WinMapAddress]
1860
        cmp     [ebp+eax], byte 1
1861
        jnz     snbgp
1862
        mov     eax, [bgr_cur_line+esi]
1863
        test    ecx, ecx
1864
        jz      .novert
1865
        mov     ebx, [bgr_next_line+esi]
1866
        call    [overlapping_of_points_ptr]
2430 mario79 1867
;--------------------------------------
1868
align 4
2288 clevermous 1869
.novert:
2430 mario79 1870
        push    ecx
2448 mario79 1871
; check for hardware cursor
2451 mario79 1872
        cmp     [_display.select_cursor], select_cursor
2459 mario79 1873
        je      @f
2448 mario79 1874
        cmp     [_display.select_cursor], 0
1875
        jne     .no_mouseunder
1876
;--------------------------------------
1877
align 4
1878
@@:
2430 mario79 1879
        mov     ecx, [esp+20+4]        ;x
1880
        shl     ecx, 16
1881
        add     ecx, [esp+24+4]        ;y
1882
; check mouse area for putpixel
1883
        call    [_display.check_mouse]
2448 mario79 1884
;--------------------------------------
1885
align 4
1886
.no_mouseunder:
2430 mario79 1887
; store to real LFB
2288 clevermous 1888
        mov     [LFB_BASE+edi], ax
1889
        shr     eax, 16
1890
        mov     [LFB_BASE+edi+2], al
2430 mario79 1891
        pop     ecx
1892
;--------------------------------------
1893
align 4
2288 clevermous 1894
snbgp:
1895
        cmp     [ScreenBPP], byte 25
1896
        sbb     edi, -4
1897
        add     ebp, 1
1898
        mov     eax, [esp+20]
1899
        add     eax, 1
1900
        mov     [esp+20], eax
1901
        add     esi, 4
1902
        cmp     eax, [draw_data+32+RECT.right]
1903
        jbe     sdp3a
2430 mario79 1904
;--------------------------------------
1905
align 4
2288 clevermous 1906
sdp4:
1907
; next y
1908
        mov     ebx, [esp+24]
1909
        add     ebx, 1
1910
        mov     [esp+24], ebx
1911
        cmp     ebx, [draw_data+32+RECT.bottom]
1912
        ja      sdpdone
1913
; advance edi, ebp to next scan line
1914
        sub     eax, [draw_data+32+RECT.left]
1915
        sub     ebp, eax
1916
        add     ebp, [Screen_Max_X]
1917
        add     ebp, 1
1918
        sub     edi, eax
1919
        sub     edi, eax
1920
        sub     edi, eax
1921
        cmp     [ScreenBPP], byte 24
1922
        jz      @f
1923
        sub     edi, eax
2430 mario79 1924
;--------------------------------------
1925
align 4
2288 clevermous 1926
@@:
1927
        add     edi, [BytesPerScanLine]
1928
; restore ecx,edx; advance esi to next background line
1929
        mov     eax, [esp+28]
1930
        mov     ebx, [esp+32]
1931
        add     [esp+12], eax
1932
        mov     eax, [esp+16]
1933
        adc     [esp+16], ebx
1934
        sub     eax, [esp+16]
1935
        mov     ebx, eax
1936
        lea     eax, [eax*3]
1937
        imul    eax, [BgrDataWidth]
1938
        sub     [esp], eax
1939
        mov     eax, [draw_data+32+RECT.left]
1940
        mov     [esp+20], eax
1941
        test    ebx, ebx
1942
        jz      sdp3
1943
        cmp     ebx, -1
1944
        jnz     bgr_resmooth0
1945
        push    edi
1946
        mov     esi, bgr_next_line
1947
        mov     edi, bgr_cur_line
1948
        mov     ecx, [Screen_Max_X]
1949
        inc     ecx
1950
        rep movsd
1951
        jmp     bgr_resmooth1
2430 mario79 1952
;--------------------------------------
1953
align 4
2288 clevermous 1954
sdpdone:
1955
        add     esp, 44
1956
        popad
1957
        mov     [EGA_counter], 1
2436 mario79 1958
        cmp     [SCR_MODE], dword 0x12
1959
        jne     @f
2288 clevermous 1960
        call    VGA_drawbackground
2436 mario79 1961
;--------------------------------------
1962
align 4
1963
@@:
2288 clevermous 1964
        ret
1965
 
1966
uglobal
2430 mario79 1967
;--------------------------------------
2288 clevermous 1968
align 4
1969
bgr_cur_line    rd      1920    ; maximum width of screen
1970
bgr_next_line   rd      1920
2430 mario79 1971
;--------------------------------------
2288 clevermous 1972
endg
2430 mario79 1973
;--------------------------------------
1974
align 4
2288 clevermous 1975
smooth_line:
1976
        mov     al, [esi+2]
1977
        shl     eax, 16
1978
        mov     ax, [esi]
1979
        test    ecx, ecx
1980
        jz      @f
1981
        mov     ebx, [esi+2]
1982
        shr     ebx, 8
1983
        call    [overlapping_of_points_ptr]
2430 mario79 1984
;--------------------------------------
1985
align 4
2288 clevermous 1986
@@:
1987
        stosd
1988
        mov     eax, [esp+20+8]
1989
        add     eax, 1
1990
        mov     [esp+20+8], eax
1991
        cmp     eax, [draw_data+32+RECT.right]
1992
        ja      @f
1993
        add     ecx, [esp+36+8]
1994
        mov     eax, edx
1995
        adc     edx, [esp+40+8]
1996
        sub     eax, edx
1997
        lea     eax, [eax*3]
1998
        sub     esi, eax
1999
        jmp     smooth_line
2430 mario79 2000
;--------------------------------------
2001
align 4
2288 clevermous 2002
@@:
2003
        mov     eax, [draw_data+32+RECT.left]
2004
        mov     [esp+20+8], eax
2005
        ret
2430 mario79 2006
;------------------------------------------------------------------------------
2288 clevermous 2007
align 16
2008
overlapping_of_points:
2009
if 0
2010
; this version of procedure works, but is slower than next version
2011
        push    ecx edx
2012
        mov     edx, eax
2013
        push    esi
2014
        shr     ecx, 24
2015
        mov     esi, ecx
2016
        mov     ecx, ebx
2017
        movzx   ebx, dl
2018
        movzx   eax, cl
2019
        sub     eax, ebx
2020
        movzx   ebx, dh
2021
        imul    eax, esi
2022
        add     dl, ah
2023
        movzx   eax, ch
2024
        sub     eax, ebx
2025
        imul    eax, esi
2026
        add     dh, ah
2027
        ror     ecx, 16
2028
        ror     edx, 16
2029
        movzx   eax, cl
2030
        movzx   ebx, dl
2031
        sub     eax, ebx
2032
        imul    eax, esi
2033
        pop     esi
2034
        add     dl, ah
2035
        mov     eax, edx
2036
        pop     edx
2037
        ror     eax, 16
2038
        pop     ecx
2039
        ret
2040
else
2041
        push    ecx edx
2042
        mov     edx, eax
2043
        push    esi
2044
        shr     ecx, 26
2045
        mov     esi, ecx
2046
        mov     ecx, ebx
2047
        shl     esi, 9
2048
        movzx   ebx, dl
2049
        movzx   eax, cl
2050
        sub     eax, ebx
2051
        movzx   ebx, dh
2052
        add     dl, [BgrAuxTable+(eax+0x100)+esi]
2053
        movzx   eax, ch
2054
        sub     eax, ebx
2055
        add     dh, [BgrAuxTable+(eax+0x100)+esi]
2056
        ror     ecx, 16
2057
        ror     edx, 16
2058
        movzx   eax, cl
2059
        movzx   ebx, dl
2060
        sub     eax, ebx
2061
        add     dl, [BgrAuxTable+(eax+0x100)+esi]
2062
        pop     esi
2063
        mov     eax, edx
2064
        pop     edx
2065
        ror     eax, 16
2066
        pop     ecx
2067
        ret
2068
end if
2069
 
2070
iglobal
2430 mario79 2071
;--------------------------------------
2288 clevermous 2072
align 4
2073
overlapping_of_points_ptr       dd      overlapping_of_points
2430 mario79 2074
;--------------------------------------
2288 clevermous 2075
endg
2430 mario79 2076
;------------------------------------------------------------------------------
2077
align 4
2288 clevermous 2078
init_background:
2079
        mov     edi, BgrAuxTable
2080
        xor     edx, edx
2430 mario79 2081
;--------------------------------------
2082
align 4
2288 clevermous 2083
.loop2:
2084
        mov     eax, edx
2085
        shl     eax, 8
2086
        neg     eax
2087
        mov     ecx, 0x200
2430 mario79 2088
;--------------------------------------
2089
align 4
2288 clevermous 2090
.loop1:
2091
        mov     byte [edi], ah
2092
        inc     edi
2093
        add     eax, edx
2094
        loop    .loop1
2095
        add     dl, 4
2096
        jnz     .loop2
2097
        test    byte [cpu_caps+(CAPS_MMX/8)], 1 shl (CAPS_MMX mod 8)
2098
        jz      @f
2099
        mov     [overlapping_of_points_ptr], overlapping_of_points_mmx
2430 mario79 2100
;--------------------------------------
2101
align 4
2288 clevermous 2102
@@:
2103
        ret
2430 mario79 2104
;------------------------------------------------------------------------------
2288 clevermous 2105
align 16
2106
overlapping_of_points_mmx:
2107
        movd    mm0, eax
2108
        movd    mm4, eax
2109
        movd    mm1, ebx
2110
        pxor    mm2, mm2
2111
        punpcklbw mm0, mm2
2112
        punpcklbw mm1, mm2
2113
        psubw   mm1, mm0
2114
        movd    mm3, ecx
2115
        psrld   mm3, 24
2116
        packuswb mm3, mm3
2117
        packuswb mm3, mm3
2118
        pmullw  mm1, mm3
2119
        psrlw   mm1, 8
2120
        packuswb mm1, mm2
2121
        paddb   mm4, mm1
2122
        movd    eax, mm4
2123
        ret
2430 mario79 2124
;------------------------------------------------------------------------------