Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
431 serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
983 diamond 3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
431 serge 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;  VESA12.INC                                                  ;;
7
;;                                                              ;;
8
;;  Vesa 1.2 functions for MenuetOS                             ;;
9
;;                                                              ;;
10
;;  Copyright 2002 Ville Turjanmaa                              ;;
11
;;                                                              ;;
12
;;  quickcode@mail.ru - bankswitch for S3 cards                 ;;
13
;;                                                              ;;
14
;;  See file COPYING for details                                ;;
15
;;                                                              ;;
16
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1 ha 17
 
593 mikedld 18
$Revision: 1376 $
1 ha 19
 
593 mikedld 20
 
673 serge 21
TRIDENT       equ 0
22
S3_VIDEO      equ 0
23
INTEL_VIDEO   equ 0
24
 
25
if TRIDENT
26
  if S3_VIDEO or INTEL_VIDEO
27
    stop
28
  end if
29
end if
30
 
31
if S3_VIDEO
32
  if TRIDENT or INTEL_VIDEO
33
    stop
34
  end if
35
end if
36
 
37
if INTEL_VIDEO
38
  if S3_VIDEO or TRIDENT
39
    stop
40
  end if
41
end if
42
 
43
 
1 ha 44
; A complete video driver should include the following types of function
45
;
46
; Putpixel
47
; Getpixel
48
;
49
; Drawimage
50
; Drawbar
51
;
52
; Drawbackground
53
;
54
;
55
; Modifying the set_bank -function is mostly enough
56
; for different Vesa 1.2 setups.
57
 
5 halyavin 58
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
59
; set_bank for Trident videocards, work on Trident 9440
60
; modified by Mario79
1 ha 61
 
673 serge 62
if TRIDENT
63
set_bank:
64
           pushfd
65
           cli
66
           cmp al,[BANK_RW]
67
           je .retsb
5 halyavin 68
 
673 serge 69
           mov [BANK_RW],al
70
           push dx
71
           mov dx,3D8h
72
           out  dx,al
73
           pop dx
74
.retsb:
75
           popfd
76
           ret
77
end if
78
 
5 halyavin 79
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
80
; set_bank for S3 videocards, work on S3 ViRGE PCI (325)
379 serge 81
; modified by kmeaw
673 serge 82
 
83
if S3_VIDEO
379 serge 84
set_bank:
673 serge 85
           pushfd
86
           cli
87
           cmp al,[BANK_RW]
88
           je .retsb
89
 
90
           mov [BANK_RW],al
91
           push ax
92
           push dx
93
           push cx
94
           mov cl, al
95
           mov dx, 0x3D4
96
           mov al, 0x38
97
           out dx, al     ;CR38 Register Lock 1 ;Note: Traditionally 48h is used to
98
                          ;unlock and 00h to lock
99
           inc dx
100
           mov al, 0x48
101
           out dx, al     ;3d5 -?
102
           dec dx
103
           mov al, 0x31
104
           out dx, al     ;CR31 Memory Configuration Register
1 ha 105
;0  Enable Base Address Offset (CPUA BASE). Enables bank operation if set, ;disables if clear.
106
;4-5  Bit 16-17 of the Display Start Address. For the 801/5,928 see index 51h,
107
;for the 864/964 see index 69h.
108
 
673 serge 109
           inc dx
110
           in al, dx
111
           dec dx
112
           mov ah, al
113
           mov al, 0x31
114
           out dx, ax
115
           mov al, ah
116
           or al, 9
117
           inc dx
118
           out dx, al
119
           dec dx
120
           mov al, 0x35
121
           out dx, al   ;CR35 CRT Register Lock
122
           inc dx
123
           in al, dx
124
           dec dx
125
           and al, 0xF0
126
           mov ch, cl
127
           and ch, 0x0F
128
           or ch, al
129
           mov al, 0x35
130
           out dx, al
131
           inc dx
132
           mov al, ch
133
           out dx, ax
134
           dec dx
135
           mov al, 0x51  ;Extended System Control 2 Register
136
           out dx, al
137
           inc dx
138
           in al, dx
139
           dec dx
140
           and al, 0xF3
141
           shr cl, 2
142
           and cl, 0x0C
143
           or cl, al
144
           mov al, 0x51
145
           out dx, al
146
           inc dx
147
           mov al, cl
148
           out dx, al
149
           dec dx
150
           mov al, 0x38
151
           out dx, al
152
           inc dx
153
           xor al, al
154
           out dx, al
155
           dec dx
156
           pop cx
157
           pop dx
158
           pop ax
159
.retsb:
160
           popfd
161
           ret
162
end if
1 ha 163
 
164
;Set bank function for Intel 810/815 chipsets
165
; *****Modified by Protopopius, Russia.*****
166
; ********* http://menuetos.hut.ru **************
167
; ************************************************
168
 
673 serge 169
if INTEL_VIDEO
170
 
171
set_bank:
172
           pushfd
173
           cli
174
 
175
           cmp al,[BANK_RW]
176
           je .retsb
177
 
178
           mov [BANK_RW],al
179
           push ax
180
           push dx
181
           mov dx,3CEh
182
           mov ah,al            ; Save value for later use
183
           mov al,10h           ; Index GR10 (Address Mapping)
184
           out dx,al            ; Select GR10
185
           inc dl
186
           mov al,3             ; Set bits 0 and 1 (Enable linear page mapping)
187
           out dx,al            ; Write value
188
           dec dl
189
           mov al,11h           ; Index GR11 (Page Selector)
190
           out dx,al            ; Select GR11
191
           inc dl
192
           mov al,ah            ; Write address
193
           out dx,al            ; Write the value
194
           pop dx
195
           pop ax
196
.retsb:
197
           popfd
198
           ret
199
end if
200
 
1 ha 201
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}
202
 
673 serge 203
if (TRIDENT or S3_VIDEO or INTEL_VIDEO)
204
else
205
set_bank:
206
           pushfd
207
           cli
1 ha 208
 
673 serge 209
           cmp al,[BANK_RW]
210
           je .retsb
1 ha 211
 
673 serge 212
           mov [BANK_RW],al
213
           push ax
214
           push dx
215
           mov ah,al
216
           mov dx,0x03D4
217
           mov al,0x39
218
           out dx,al
219
           inc dl
220
           mov al,0xA5
221
           out dx,al
222
           dec dl
223
           mov al,6Ah
224
           out dx,al
225
           inc dl
226
           mov al,ah
227
           out dx,al
228
           dec dl
229
           mov al,0x39
230
           out dx,al
231
           inc dl
232
           mov al,0x5A
233
           out dx,al
234
           dec dl
235
           pop dx
236
           pop ax
237
 
238
.retsb:
239
           popfd
240
           ret
241
end if
242
 
1 ha 243
vesa12_drawbackground:
244
 
1300 serge 245
        call  [_display.disable_mouse]
1 ha 246
 
247
        push  eax
248
        push  ebx
249
        push  ecx
250
        push  edx
251
 
252
        xor   edx,edx
527 diamond 253
        mov   eax,dword[BgrDataWidth]
254
        mov   ebx,dword[BgrDataHeight]
1 ha 255
        mul   ebx
256
        mov   ebx,3
257
        mul   ebx
258
        mov   [imax],eax
115 poddubny 259
        mov   eax,[draw_data+32+RECT.left]
260
        mov   ebx,[draw_data+32+RECT.top]
1322 Lrz 261
        xor   edi,edi ;no force
1 ha 262
 
263
      v12dp3:
264
 
265
        push  eax
266
        push  ebx
267
 
527 diamond 268
        cmp   [BgrDrawMode],dword 1     ; tiled background
1 ha 269
        jne   no_vesa12_tiled_bgr
270
 
271
        push  edx
272
 
273
        xor   edx,edx
527 diamond 274
        div   dword [BgrDataWidth]
1 ha 275
 
527 diamond 276
        push  edx
1 ha 277
        mov   eax,ebx
278
        xor   edx,edx
527 diamond 279
        div   dword [BgrDataHeight]
1 ha 280
        mov   ebx,edx
281
        pop   eax
282
 
283
        pop   edx
284
 
285
      no_vesa12_tiled_bgr:
286
 
527 diamond 287
        cmp   [BgrDrawMode],dword 2     ; stretched background
1 ha 288
        jne   no_vesa12_stretched_bgr
289
 
290
        push  edx
291
 
527 diamond 292
        mul   dword [BgrDataWidth]
753 serge 293
        mov   ecx,[Screen_Max_X]
1 ha 294
        inc   ecx
295
        div   ecx
296
 
297
        push  eax
298
        mov   eax,ebx
527 diamond 299
        mul   dword [BgrDataHeight]
753 serge 300
        mov   ecx,[Screen_Max_Y]
1 ha 301
        inc   ecx
302
        div   ecx
303
        mov   ebx,eax
304
        pop   eax
305
 
306
        pop   edx
307
 
308
      no_vesa12_stretched_bgr:
309
 
310
 
527 diamond 311
        mov   esi,ebx
312
        imul  esi, dword [BgrDataWidth]
1 ha 313
        add   esi,eax
527 diamond 314
        lea   esi,[esi*3]
469 serge 315
        add   esi,[img_background]   ;IMG_BACKGROUND
1 ha 316
        pop   ebx
317
        pop   eax
318
 
319
      v12di4:
320
 
527 diamond 321
        mov   cl,[esi+2]
322
        shl   ecx,16
323
        mov   cx,[esi]
1 ha 324
        pusha
325
        mov   esi,eax
326
        mov   edi,ebx
753 serge 327
        mov   eax,[Screen_Max_X]
1 ha 328
        add   eax,1
329
        mul   ebx
1300 serge 330
        add eax, [_WinMapAddress]
331
        cmp   [eax+esi],byte 1
1 ha 332
        jnz   v12nbgp
381 serge 333
        mov   eax,[BytesPerScanLine]
1 ha 334
        mov   ebx,edi
335
        mul   ebx
673 serge 336
        add   eax, esi
337
        lea   eax, [VGABasePtr+eax+esi*2]
381 serge 338
        cmp   [ScreenBPP],byte 24
1 ha 339
        jz    v12bgl3
340
        add   eax,esi
341
 
342
      v12bgl3:
343
 
344
        push ebx
345
        push eax
346
 
673 serge 347
        sub  eax,VGABasePtr
1 ha 348
 
349
        shr  eax,16
350
        call set_bank
351
        pop  eax
352
        and  eax,65535
381 serge 353
        add  eax,VGABasePtr
1 ha 354
        pop  ebx
355
 
356
        mov   [eax],cx
357
        add   eax,2
358
        shr   ecx,16
359
        mov   [eax],cl
360
        sti
361
 
362
      v12nbgp:
363
 
364
        popa
365
        add   esi,3
366
        inc   eax
115 poddubny 367
        cmp   eax,[draw_data+32+RECT.right]
1 ha 368
        jg    v12nodp31
369
        jmp   v12dp3
370
 
371
      v12nodp31:
372
 
115 poddubny 373
        mov   eax,[draw_data+32+RECT.left]
1 ha 374
        inc   ebx
115 poddubny 375
        cmp   ebx,[draw_data+32+RECT.bottom]
1 ha 376
        jg    v12dp4
377
        jmp   v12dp3
378
 
379
      v12dp4:
380
 
381
        pop   edx
382
        pop   ecx
383
        pop   ebx
384
        pop   eax
385
        ret
386
 
387
 
388
vesa12_drawbar:
389
 
1300 serge 390
    call  [_display.disable_mouse]
1 ha 391
 
392
;;    mov  [novesachecksum],dword 0
393
    sub  edx,ebx
394
    sub  ecx,eax
395
    push esi
396
    push edi
397
    push eax
398
    push ebx
399
    push ecx
400
    push edx
379 serge 401
    mov  ecx,[TASK_BASE]
115 poddubny 402
    add  eax,[ecx-twdw+WDATA.box.left]
403
    add  ebx,[ecx-twdw+WDATA.box.top]
1 ha 404
    push eax
405
    mov  eax,ebx         ; y
381 serge 406
    mov  ebx,[BytesPerScanLine]
1 ha 407
    mul  ebx
408
    pop  ecx
409
    add  eax,ecx         ; x
410
    add  eax,ecx
411
    add  eax,ecx
381 serge 412
    cmp  [ScreenBPP],byte 24     ; 24 or 32 bpp ? - x start
1 ha 413
    jz   dbpi2412
414
    add  eax,ecx
415
 
416
  dbpi2412:
417
 
673 serge 418
    add  eax,VGABasePtr
1 ha 419
    mov  edi,eax
420
 
421
    ; x size
422
 
423
    mov  eax,[esp+4] ; [esp+6]
424
    mov  ecx,eax
425
    add  ecx,eax
426
    add  ecx,eax
381 serge 427
    cmp  [ScreenBPP],byte 24     ; 24 or 32 bpp ? - x size
1 ha 428
    jz   dbpi24312
429
    add  ecx,eax
430
 
431
  dbpi24312:
432
 
433
    mov  ebx,[esp+0]
434
 
435
    ; check limits ?
436
 
437
    push eax
438
    push ecx
379 serge 439
    mov  eax,[TASK_BASE]
440
    mov  ecx,[eax+draw_data-CURRENT_TASK+RECT.left]
1 ha 441
    cmp  ecx,0
442
    jnz  dbcblimitlset12
379 serge 443
    mov  ecx,[eax+draw_data-CURRENT_TASK+RECT.top]
1 ha 444
    cmp  ecx,0
445
    jnz  dbcblimitlset12
379 serge 446
    mov  ecx,[eax+draw_data-CURRENT_TASK+RECT.right]
753 serge 447
    cmp  ecx,[Screen_Max_X]
1 ha 448
    jnz  dbcblimitlset12
379 serge 449
    mov  ecx,[eax+draw_data-CURRENT_TASK+RECT.bottom]
753 serge 450
    cmp  ecx,[Screen_Max_Y]
1 ha 451
    jnz  dbcblimitlset12
452
    pop  ecx
453
    pop  eax
454
    push dword 0
455
    jmp  dbcblimitlno12
456
 
457
  dbcblimitlset12:
458
 
459
    pop  ecx
460
    pop  eax
461
    push dword 1
462
 
463
  dbcblimitlno12:
464
 
381 serge 465
    cmp  [ScreenBPP],byte 24     ; 24 or 32 bpp ?
1 ha 466
    jz   dbpi24bit12
467
    jmp  dbpi32bit12
468
 
469
 
470
; DRAWBAR 24 BBP
471
 
472
 
473
dbpi24bit12:
474
 
475
    push eax
476
    push ebx
477
    push edx
478
    mov  eax,ecx
479
    mov  ebx,3
480
    div  ebx
481
    mov  ecx,eax
482
    pop  edx
483
    pop  ebx
484
    pop  eax
485
    cld
486
 
487
  dbnewpi12:
488
 
489
    push ebx
490
    push edi
491
    push ecx
492
 
493
      xor  edx,edx
494
      mov  eax,edi
673 serge 495
      sub  eax,VGABasePtr
1 ha 496
      mov  ebx,3
497
      div  ebx
1300 serge 498
      add  eax, [_WinMapAddress]
379 serge 499
      mov   ebx,[CURRENT_TASK]
1 ha 500
      cld
501
 
502
      dbnp2412:
503
 
504
        mov  dl,[eax]
505
        push eax
506
        push ecx
507
        cmp  dl,bl
508
        jnz  dbimp24no12
509
        cmp  [esp+5*4],dword 0
510
        jz   dbimp24yes12
511
;        call dbcplimit
512
;        jnz  dbimp24no12
513
 
514
     dbimp24yes12:
515
 
516
        push edi
517
        mov  eax,edi
673 serge 518
        sub  eax,VGABasePtr
1 ha 519
        shr  eax,16
520
        call set_bank
521
        and  edi,0xffff
381 serge 522
        add  edi,VGABasePtr
1 ha 523
        mov  eax,[esp+8+3*4+16+4+4]
524
        stosw
525
        shr  eax,16
526
        stosb
527
        sti
528
        pop  edi
529
        add  edi,3
530
        pop  ecx
531
        pop  eax
532
        inc  eax
533
        loop dbnp2412
534
        jmp  dbnp24d12
535
 
536
      dbimp24no12:
537
 
538
        pop  ecx
539
        pop  eax
540
        cld
541
        add  edi,3
542
        inc  eax
543
        loop dbnp2412
544
 
545
      dbnp24d12:
546
 
547
        mov  eax,[esp+3*4+16+4]
548
        test eax,0x80000000
549
        jz   nodbgl2412
550
        cmp  al,0
551
        jz   nodbgl2412
552
        dec  eax
553
        mov  [esp+3*4+16+4],eax
554
 
555
      nodbgl2412:
556
 
557
    pop  ecx
558
    pop  edi
559
    pop  ebx
381 serge 560
    add  edi,[BytesPerScanLine]
1 ha 561
    dec  ebx
562
    jz   dbnonewpi12
563
    jmp  dbnewpi12
564
 
565
  dbnonewpi12:
566
 
567
    add  esp,7*4
568
 
569
    ret
570
 
571
 
572
; DRAWBAR 32 BBP
573
 
574
 
575
  dbpi32bit12:
576
 
577
    cld
578
    shr  ecx,2
579
 
580
   dbnewpi3212:
581
 
582
    push ebx
583
    push edi
584
    push ecx
585
 
586
      mov  eax,edi
673 serge 587
      sub  eax,VGABasePtr
1 ha 588
      shr  eax,2
1300 serge 589
      add  eax, [_WinMapAddress]
379 serge 590
      mov   ebx,[CURRENT_TASK]
1 ha 591
      cld
592
 
593
      dbnp3212:
594
 
595
        mov  dl,[eax]
596
        push eax
597
        push ecx
598
        cmp  dl,bl
599
        jnz  dbimp32no12
600
        cmp  [esp+5*4],dword 0
601
        jz   dbimp32yes12
602
;        call dbcplimit
603
;        jnz  dbimp32no12
604
 
605
      dbimp32yes12:
606
 
607
        push edi
608
        mov  eax,edi
673 serge 609
        sub  eax,VGABasePtr
1 ha 610
        shr  eax,16
611
        call set_bank
612
        and  edi,0xffff
381 serge 613
        add  edi,VGABasePtr
1 ha 614
        mov  eax,[esp+8+3*4+16+4+4]
615
        stosw
616
        shr  eax,16
617
        stosb
618
        sti
619
        pop  edi
620
        add  edi,4
621
        inc  ebp
622
        pop  ecx
623
        pop  eax
624
        inc  eax
625
        loop dbnp3212
626
        jmp  dbnp32d12
627
 
628
      dbimp32no12:
629
 
630
        pop  ecx
631
        pop  eax
632
        inc  eax
633
        add  edi,4
634
        inc  ebp
635
        loop dbnp3212
636
 
637
      dbnp32d12:
638
 
639
        mov  eax,[esp+12+16+4]
640
        test eax,0x80000000
641
        jz   nodbgl3212
642
        cmp  al,0
643
        jz   nodbgl3212
644
        dec  eax
645
        mov  [esp+12+16+4],eax
646
 
647
      nodbgl3212:
648
 
649
    pop  ecx
650
    pop  edi
651
    pop  ebx
381 serge 652
    add  edi,[BytesPerScanLine]
1 ha 653
    dec  ebx
654
    jz   nodbnewpi3212
655
    jmp  dbnewpi3212
656
 
657
  nodbnewpi3212:
658
 
659
    add  esp,7*4
660
    ret
661
 
662
 
663
Vesa12_putpixel24:
664
 
665
        mov  edi,eax ; x
666
        mov  eax,ebx ; y
667
        lea  edi,[edi+edi*2]
381 serge 668
        mov  ebx,[BytesPerScanLine]
1 ha 669
        mul  ebx
670
        add  edi,eax
671
        mov  eax,edi
672
        shr  eax,16
673
        call set_bank
674
        and  edi,65535
381 serge 675
        add  edi,VGABasePtr
1 ha 676
        mov  eax,[esp+28]
677
        stosw
678
        shr  eax,16
679
        mov  [edi],al
680
        sti
681
        ret
682
 
683
 
684
 
685
Vesa12_putpixel32:
686
 
687
        mov  edi,eax ; x
688
        mov  eax,ebx ; y
689
        shl  edi,2
381 serge 690
        mov  ebx,[BytesPerScanLine]
1 ha 691
        mul  ebx
692
        add  edi,eax
693
        mov  eax,edi
694
        shr  eax,16
695
        call set_bank
696
        and  edi,65535
381 serge 697
        add  edi,VGABasePtr
1 ha 698
        mov  ecx,[esp+28]
699
        mov  [edi],ecx
700
        sti
701
        ret
702
 
703
 
704
Vesa12_getpixel24:
705
 
706
        mov  edi,eax ; x
707
        mov  eax,ebx ; y
708
        lea  edi,[edi+edi*2]
381 serge 709
        mov  ebx,[BytesPerScanLine]
1 ha 710
        mul  ebx
711
        add  edi,eax
712
        mov  eax,edi
713
        shr  eax,16
714
        call set_bank
715
        and  edi,65535
381 serge 716
        add  edi,VGABasePtr
1 ha 717
        mov  ecx,[edi]
718
        and  ecx,255*256*256+255*256+255
719
        sti
720
        ret
721
 
722
 
723
Vesa12_getpixel32:
724
 
725
        mov  edi,eax ; x
726
        mov  eax,ebx ; y
727
        shl  edi,2
381 serge 728
        mov  ebx,[BytesPerScanLine]
1 ha 729
        xor  edx,edx
730
        mul  ebx
731
        add  edi,eax
732
        mov  eax,edi
733
        shr  eax,16
734
        call set_bank
735
        and  edi,65535
381 serge 736
        add  edi,VGABasePtr
1 ha 737
        mov  ecx,[edi]
738
        and  ecx,255*256*256+255*256+255
739
        sti
740
 
741
        ret
742
 
743
 
744
 
745
vesa12_putimage:
283 diamond 746
; ebx = pointer to image
747
; ecx = size [x|y]
748
; edx = coordinates [x|y]
749
; ebp = pointer to 'get' function
750
; esi = pointer to 'init' function
751
; edi = parameter for 'get' function
1 ha 752
 
753
;    mov  ebx,image
754
;    mov  ecx,320*65536+240
755
;    mov  edx,20*65536+20
756
 
1300 serge 757
    call  [_display.disable_mouse]
1 ha 758
 
759
    mov   [novesachecksum],dword 0
760
    push  esi
761
    push  edi
762
    push  eax
763
    push  ebx
764
    push  ecx
765
    push  edx
766
    movzx eax,word [esp+2]
767
    movzx ebx,word [esp+0]
379 serge 768
    mov   ecx,[TASK_BASE]
115 poddubny 769
    add   eax,[ecx-twdw+WDATA.box.left]
770
    add   ebx,[ecx-twdw+WDATA.box.top]
1 ha 771
    push  eax
772
    mov   eax,ebx         ; y
381 serge 773
    mul   dword [BytesPerScanLine]
1 ha 774
    pop   ecx
775
    add   eax,ecx         ; x
776
    add   eax,ecx
777
    add   eax,ecx
381 serge 778
    cmp  [ScreenBPP],byte 24     ; 24 or 32 bpp ? - x start
1 ha 779
    jz   pi2412
780
    add  eax,ecx
781
 
782
  pi2412:
783
 
673 serge 784
    add  eax,VGABasePtr
1 ha 785
    mov  edi,eax
786
 
787
    ; x size
788
 
283 diamond 789
    movzx ecx,word [esp+6]
1 ha 790
 
791
    mov   esi,[esp+8]
792
    movzx ebx,word [esp+4]
793
 
794
    ; check limits while draw ?
795
 
796
    push  ecx
379 serge 797
    mov  eax,[TASK_BASE]
798
    cmp  dword [eax+draw_data-CURRENT_TASK+RECT.left], 0
1 ha 799
    jnz  dbcblimitlset212
379 serge 800
    cmp  dword [eax+draw_data-CURRENT_TASK+RECT.top], 0
1 ha 801
    jnz  dbcblimitlset212
379 serge 802
    mov  ecx,[eax+draw_data-CURRENT_TASK+RECT.right]
753 serge 803
    cmp  ecx,[Screen_Max_X]
1 ha 804
    jnz  dbcblimitlset212
379 serge 805
    mov  ecx,[eax+draw_data-CURRENT_TASK+RECT.bottom]
753 serge 806
    cmp  ecx,[Screen_Max_Y]
1 ha 807
    jnz  dbcblimitlset212
808
    pop  ecx
283 diamond 809
    push 0
1 ha 810
    jmp  dbcblimitlno212
811
 
812
  dbcblimitlset212:
813
 
814
    pop  ecx
283 diamond 815
    push 1
1 ha 816
 
817
  dbcblimitlno212:
818
 
381 serge 819
    cmp  [ScreenBPP],byte 24     ; 24 or 32 bpp ?
283 diamond 820
    jnz  pi32bit12
1 ha 821
 
822
  pi24bit12:
823
 
824
  newpi12:
825
 
826
    push edi
827
    push ecx
828
    push ebx
829
 
283 diamond 830
      mov  edx,edi
673 serge 831
      sub  edx,VGABasePtr
1 ha 832
      mov  ebx,3
833
      div  ebx
1300 serge 834
      add  edx, [_WinMapAddress]
379 serge 835
      mov  ebx,[CURRENT_TASK]
283 diamond 836
      mov  bh,[esp+4*3]
1 ha 837
 
838
      np2412:
839
 
283 diamond 840
        cmp  bl,[edx]
1 ha 841
        jnz  imp24no12
283 diamond 842
;        mov  eax,[esi]
843
        push    dword [esp+4*3+20]
844
        call    ebp
845
;        cmp  bh,0
846
;        jz   imp24yes12
1 ha 847
;        call dbcplimit
848
;        jnz  imp24no12
849
 
850
     imp24yes12:
851
 
283 diamond 852
        push edi
1 ha 853
        push eax
854
        mov  eax,edi
673 serge 855
        sub  eax,VGABasePtr
1 ha 856
        shr  eax,16
857
        call set_bank
283 diamond 858
        pop  eax
1 ha 859
        and  edi,0xffff
381 serge 860
        add  edi,VGABasePtr
283 diamond 861
        mov  [edi],ax
862
        shr  eax,16
863
        mov  [edi+2],al
1 ha 864
        pop  edi
865
 
866
     imp24no12:
867
 
283 diamond 868
        inc  edx
869
;        add  esi,3
1 ha 870
        add  edi,3
871
        dec  ecx
872
        jnz  np2412
873
 
874
      np24d12:
875
 
876
     pop  ebx
877
     pop  ecx
878
     pop  edi
879
 
381 serge 880
    add  edi,[BytesPerScanLine]
314 diamond 881
    add  esi,[esp+32]
911 diamond 882
    cmp  ebp,putimage_get1bpp
883
    jz   .correct
918 diamond 884
    cmp  ebp,putimage_get2bpp
885
    jz   .correct
911 diamond 886
    cmp  ebp,putimage_get4bpp
887
    jnz  @f
888
.correct:
889
    mov  eax,[esp+20]
890
    mov  byte[eax],80h
891
@@:
1 ha 892
    dec  ebx
283 diamond 893
    jnz  newpi12
1 ha 894
 
895
  nonewpi12:
896
 
283 diamond 897
        pop     eax edx ecx ebx eax edi esi
898
        xor     eax, eax
899
        ret
1 ha 900
 
901
 
902
  pi32bit12:
903
 
904
   newpi3212:
905
 
906
    push edi
907
    push ecx
908
    push ebx
909
 
283 diamond 910
      mov  edx,edi
673 serge 911
      sub  edx,VGABasePtr
283 diamond 912
      shr  edx,2
1300 serge 913
      add  edx, [_WinMapAddress]
379 serge 914
      mov   ebx,[CURRENT_TASK]
283 diamond 915
      mov   bh,[esp+4*3]
1 ha 916
 
917
      np3212:
918
 
283 diamond 919
        cmp  bl,[edx]
1 ha 920
        jnz  imp32no12
283 diamond 921
;        mov  eax,[esi]
922
        push    dword [esp+4*3+20]
923
        call    ebp
924
;        cmp  bh,0
925
;        jz   imp32yes12
1 ha 926
;        call dbcplimit
927
;        jnz  imp32no12
928
 
929
      imp32yes12:
930
 
283 diamond 931
        push edi
1 ha 932
        push eax
933
        mov  eax,edi
673 serge 934
        sub  eax,VGABasePtr
1 ha 935
        shr  eax,16
936
        call set_bank
283 diamond 937
        pop  eax
1 ha 938
        and  edi,0xffff
381 serge 939
        mov  [edi+VGABasePtr],eax
1 ha 940
        pop  edi
941
 
942
      imp32no12:
943
 
283 diamond 944
        inc  edx
945
;        add  esi,3
1 ha 946
        add  edi,4
947
        dec  ecx
948
        jnz  np3212
949
 
950
      np32d12:
951
 
952
     pop  ebx
953
     pop  ecx
954
     pop  edi
955
 
381 serge 956
    add   edi,[BytesPerScanLine]
911 diamond 957
    cmp   ebp,putimage_get1bpp
958
    jz    .correct
918 diamond 959
    cmp   ebp,putimage_get2bpp
960
    jz    .correct
911 diamond 961
    cmp   ebp,putimage_get4bpp
962
    jnz   @f
963
.correct:
964
    mov   eax,[esp+20]
965
    mov   byte[eax],80h
966
@@:
1 ha 967
    dec   ebx
283 diamond 968
    jnz   newpi3212
1 ha 969
 
970
  nonewpi3212:
971
 
283 diamond 972
        pop     eax edx ecx ebx eax edi esi
973
        xor     eax, eax
974
        ret
1 ha 975
 
976
 
977
vesa12_read_screen_pixel:
978
 
979
     and   eax,0x3FFFFF
381 serge 980
     cmp   [ScreenBPP],byte 24      ; 24 or 32 bpp ?
1 ha 981
     jz    v12rsp24
982
     mov   edi,eax
983
     shl   edi,2
984
     mov   eax,edi
985
     shr   eax,16
986
     call  set_bank
987
     and   edi,65535
381 serge 988
     add   edi,VGABasePtr
1 ha 989
     mov   eax,[edi]
990
     and   eax,0x00ffffff
991
     ret
992
  v12rsp24:
993
 
994
     imul  eax,3
995
     mov   edi,eax
996
     shr   eax,16
997
     call  set_bank
998
     and   edi,65535
381 serge 999
     add   edi,VGABasePtr
1 ha 1000
     mov   eax,[edi]
1001
     and   eax,0x00ffffff
1002
     ret
1003