Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1159 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
17
 
1206 hidnplayr 18
$Revision: 1206 $
1159 hidnplayr 19
 
20
 
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
 
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
 
58
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
59
; set_bank for Trident videocards, work on Trident 9440
60
; modified by Mario79
61
 
62
if TRIDENT
63
set_bank:
64
           pushfd
65
           cli
66
           cmp al,[BANK_RW]
67
           je .retsb
68
 
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
 
79
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
80
; set_bank for S3 videocards, work on S3 ViRGE PCI (325)
81
; modified by kmeaw
82
 
83
if S3_VIDEO
84
set_bank:
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
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
 
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
163
 
164
;Set bank function for Intel 810/815 chipsets
165
; *****Modified by Protopopius, Russia.*****
166
; ********* http://menuetos.hut.ru **************
167
; ************************************************
168
 
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
 
201
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}
202
 
203
if (TRIDENT or S3_VIDEO or INTEL_VIDEO)
204
else
205
set_bank:
206
           pushfd
207
           cli
208
 
209
           cmp al,[BANK_RW]
210
           je .retsb
211
 
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
 
243
vesa12_drawbackground:
244
 
245
        call  [disable_mouse]
246
 
247
        push  eax
248
        push  ebx
249
        push  ecx
250
        push  edx
251
 
252
        xor   edx,edx
253
        mov   eax,dword[BgrDataWidth]
254
        mov   ebx,dword[BgrDataHeight]
255
        mul   ebx
256
        mov   ebx,3
257
        mul   ebx
258
        mov   [imax],eax
259
        mov   eax,[draw_data+32+RECT.left]
260
        mov   ebx,[draw_data+32+RECT.top]
261
        mov   edi,0 ;no force
262
 
263
      v12dp3:
264
 
265
        push  eax
266
        push  ebx
267
 
268
        cmp   [BgrDrawMode],dword 1     ; tiled background
269
        jne   no_vesa12_tiled_bgr
270
 
271
        push  edx
272
 
273
        xor   edx,edx
274
        div   dword [BgrDataWidth]
275
 
276
        push  edx
277
        mov   eax,ebx
278
        xor   edx,edx
279
        div   dword [BgrDataHeight]
280
        mov   ebx,edx
281
        pop   eax
282
 
283
        pop   edx
284
 
285
      no_vesa12_tiled_bgr:
286
 
287
        cmp   [BgrDrawMode],dword 2     ; stretched background
288
        jne   no_vesa12_stretched_bgr
289
 
290
        push  edx
291
 
292
        mul   dword [BgrDataWidth]
293
        mov   ecx,[Screen_Max_X]
294
        inc   ecx
295
        div   ecx
296
 
297
        push  eax
298
        mov   eax,ebx
299
        mul   dword [BgrDataHeight]
300
        mov   ecx,[Screen_Max_Y]
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
 
311
        mov   esi,ebx
312
        imul  esi, dword [BgrDataWidth]
313
        add   esi,eax
314
        lea   esi,[esi*3]
315
        add   esi,[img_background]   ;IMG_BACKGROUND
316
        pop   ebx
317
        pop   eax
318
 
319
      v12di4:
320
 
321
        mov   cl,[esi+2]
322
        shl   ecx,16
323
        mov   cx,[esi]
324
        pusha
325
        mov   esi,eax
326
        mov   edi,ebx
327
        mov   eax,[Screen_Max_X]
328
        add   eax,1
329
        mul   ebx
330
        cmp   [eax+esi+WinMapAddress],byte 1
331
        jnz   v12nbgp
332
        mov   eax,[BytesPerScanLine]
333
        mov   ebx,edi
334
        mul   ebx
335
        add   eax, esi
336
        lea   eax, [VGABasePtr+eax+esi*2]
337
        cmp   [ScreenBPP],byte 24
338
        jz    v12bgl3
339
        add   eax,esi
340
 
341
      v12bgl3:
342
 
343
        push ebx
344
        push eax
345
 
346
        sub  eax,VGABasePtr
347
 
348
        shr  eax,16
349
        call set_bank
350
        pop  eax
351
        and  eax,65535
352
        add  eax,VGABasePtr
353
        pop  ebx
354
 
355
        mov   [eax],cx
356
        add   eax,2
357
        shr   ecx,16
358
        mov   [eax],cl
359
        sti
360
 
361
      v12nbgp:
362
 
363
        popa
364
        add   esi,3
365
        inc   eax
366
        cmp   eax,[draw_data+32+RECT.right]
367
        jg    v12nodp31
368
        jmp   v12dp3
369
 
370
      v12nodp31:
371
 
372
        mov   eax,[draw_data+32+RECT.left]
373
        inc   ebx
374
        cmp   ebx,[draw_data+32+RECT.bottom]
375
        jg    v12dp4
376
        jmp   v12dp3
377
 
378
      v12dp4:
379
 
380
        pop   edx
381
        pop   ecx
382
        pop   ebx
383
        pop   eax
384
        ret
385
 
386
 
387
vesa12_drawbar:
388
 
389
    call  [disable_mouse]
390
 
391
;;    mov  [novesachecksum],dword 0
392
    sub  edx,ebx
393
    sub  ecx,eax
394
    push esi
395
    push edi
396
    push eax
397
    push ebx
398
    push ecx
399
    push edx
400
    mov  ecx,[TASK_BASE]
401
    add  eax,[ecx-twdw+WDATA.box.left]
402
    add  ebx,[ecx-twdw+WDATA.box.top]
403
    push eax
404
    mov  eax,ebx         ; y
405
    mov  ebx,[BytesPerScanLine]
406
    mul  ebx
407
    pop  ecx
408
    add  eax,ecx         ; x
409
    add  eax,ecx
410
    add  eax,ecx
411
    cmp  [ScreenBPP],byte 24     ; 24 or 32 bpp ? - x start
412
    jz   dbpi2412
413
    add  eax,ecx
414
 
415
  dbpi2412:
416
 
417
    add  eax,VGABasePtr
418
    mov  edi,eax
419
 
420
    ; x size
421
 
422
    mov  eax,[esp+4] ; [esp+6]
423
    mov  ecx,eax
424
    add  ecx,eax
425
    add  ecx,eax
426
    cmp  [ScreenBPP],byte 24     ; 24 or 32 bpp ? - x size
427
    jz   dbpi24312
428
    add  ecx,eax
429
 
430
  dbpi24312:
431
 
432
    mov  ebx,[esp+0]
433
 
434
    ; check limits ?
435
 
436
    push eax
437
    push ecx
438
    mov  eax,[TASK_BASE]
439
    mov  ecx,[eax+draw_data-CURRENT_TASK+RECT.left]
440
    cmp  ecx,0
441
    jnz  dbcblimitlset12
442
    mov  ecx,[eax+draw_data-CURRENT_TASK+RECT.top]
443
    cmp  ecx,0
444
    jnz  dbcblimitlset12
445
    mov  ecx,[eax+draw_data-CURRENT_TASK+RECT.right]
446
    cmp  ecx,[Screen_Max_X]
447
    jnz  dbcblimitlset12
448
    mov  ecx,[eax+draw_data-CURRENT_TASK+RECT.bottom]
449
    cmp  ecx,[Screen_Max_Y]
450
    jnz  dbcblimitlset12
451
    pop  ecx
452
    pop  eax
453
    push dword 0
454
    jmp  dbcblimitlno12
455
 
456
  dbcblimitlset12:
457
 
458
    pop  ecx
459
    pop  eax
460
    push dword 1
461
 
462
  dbcblimitlno12:
463
 
464
    cmp  [ScreenBPP],byte 24     ; 24 or 32 bpp ?
465
    jz   dbpi24bit12
466
    jmp  dbpi32bit12
467
 
468
 
469
; DRAWBAR 24 BBP
470
 
471
 
472
dbpi24bit12:
473
 
474
    push eax
475
    push ebx
476
    push edx
477
    mov  eax,ecx
478
    mov  ebx,3
479
    div  ebx
480
    mov  ecx,eax
481
    pop  edx
482
    pop  ebx
483
    pop  eax
484
    cld
485
 
486
  dbnewpi12:
487
 
488
    push ebx
489
    push edi
490
    push ecx
491
 
492
      xor  edx,edx
493
      mov  eax,edi
494
      sub  eax,VGABasePtr
495
      mov  ebx,3
496
      div  ebx
497
      add  eax,WinMapAddress
498
      mov   ebx,[CURRENT_TASK]
499
      cld
500
 
501
      dbnp2412:
502
 
503
        mov  dl,[eax]
504
        push eax
505
        push ecx
506
        cmp  dl,bl
507
        jnz  dbimp24no12
508
        cmp  [esp+5*4],dword 0
509
        jz   dbimp24yes12
510
;        call dbcplimit
511
;        jnz  dbimp24no12
512
 
513
     dbimp24yes12:
514
 
515
        push edi
516
        mov  eax,edi
517
        sub  eax,VGABasePtr
518
        shr  eax,16
519
        call set_bank
520
        and  edi,0xffff
521
        add  edi,VGABasePtr
522
        mov  eax,[esp+8+3*4+16+4+4]
523
        stosw
524
        shr  eax,16
525
        stosb
526
        sti
527
        pop  edi
528
        add  edi,3
529
        pop  ecx
530
        pop  eax
531
        inc  eax
532
        loop dbnp2412
533
        jmp  dbnp24d12
534
 
535
      dbimp24no12:
536
 
537
        pop  ecx
538
        pop  eax
539
        cld
540
        add  edi,3
541
        inc  eax
542
        loop dbnp2412
543
 
544
      dbnp24d12:
545
 
546
        mov  eax,[esp+3*4+16+4]
547
        test eax,0x80000000
548
        jz   nodbgl2412
549
        cmp  al,0
550
        jz   nodbgl2412
551
        dec  eax
552
        mov  [esp+3*4+16+4],eax
553
 
554
      nodbgl2412:
555
 
556
    pop  ecx
557
    pop  edi
558
    pop  ebx
559
    add  edi,[BytesPerScanLine]
560
    dec  ebx
561
    jz   dbnonewpi12
562
    jmp  dbnewpi12
563
 
564
  dbnonewpi12:
565
 
566
    add  esp,7*4
567
 
568
    ret
569
 
570
 
571
; DRAWBAR 32 BBP
572
 
573
 
574
  dbpi32bit12:
575
 
576
    cld
577
    shr  ecx,2
578
 
579
   dbnewpi3212:
580
 
581
    push ebx
582
    push edi
583
    push ecx
584
 
585
      mov  eax,edi
586
      sub  eax,VGABasePtr
587
      shr  eax,2
588
      add  eax,WinMapAddress
589
      mov   ebx,[CURRENT_TASK]
590
      cld
591
 
592
      dbnp3212:
593
 
594
        mov  dl,[eax]
595
        push eax
596
        push ecx
597
        cmp  dl,bl
598
        jnz  dbimp32no12
599
        cmp  [esp+5*4],dword 0
600
        jz   dbimp32yes12
601
;        call dbcplimit
602
;        jnz  dbimp32no12
603
 
604
      dbimp32yes12:
605
 
606
        push edi
607
        mov  eax,edi
608
        sub  eax,VGABasePtr
609
        shr  eax,16
610
        call set_bank
611
        and  edi,0xffff
612
        add  edi,VGABasePtr
613
        mov  eax,[esp+8+3*4+16+4+4]
614
        stosw
615
        shr  eax,16
616
        stosb
617
        sti
618
        pop  edi
619
        add  edi,4
620
        inc  ebp
621
        pop  ecx
622
        pop  eax
623
        inc  eax
624
        loop dbnp3212
625
        jmp  dbnp32d12
626
 
627
      dbimp32no12:
628
 
629
        pop  ecx
630
        pop  eax
631
        inc  eax
632
        add  edi,4
633
        inc  ebp
634
        loop dbnp3212
635
 
636
      dbnp32d12:
637
 
638
        mov  eax,[esp+12+16+4]
639
        test eax,0x80000000
640
        jz   nodbgl3212
641
        cmp  al,0
642
        jz   nodbgl3212
643
        dec  eax
644
        mov  [esp+12+16+4],eax
645
 
646
      nodbgl3212:
647
 
648
    pop  ecx
649
    pop  edi
650
    pop  ebx
651
    add  edi,[BytesPerScanLine]
652
    dec  ebx
653
    jz   nodbnewpi3212
654
    jmp  dbnewpi3212
655
 
656
  nodbnewpi3212:
657
 
658
    add  esp,7*4
659
    ret
660
 
661
 
662
Vesa12_putpixel24:
663
 
664
        mov  edi,eax ; x
665
        mov  eax,ebx ; y
666
        lea  edi,[edi+edi*2]
667
        mov  ebx,[BytesPerScanLine]
668
        mul  ebx
669
        add  edi,eax
670
        mov  eax,edi
671
        shr  eax,16
672
        call set_bank
673
        and  edi,65535
674
        add  edi,VGABasePtr
675
        mov  eax,[esp+28]
676
        stosw
677
        shr  eax,16
678
        mov  [edi],al
679
        sti
680
        ret
681
 
682
 
683
 
684
Vesa12_putpixel32:
685
 
686
        mov  edi,eax ; x
687
        mov  eax,ebx ; y
688
        shl  edi,2
689
        mov  ebx,[BytesPerScanLine]
690
        mul  ebx
691
        add  edi,eax
692
        mov  eax,edi
693
        shr  eax,16
694
        call set_bank
695
        and  edi,65535
696
        add  edi,VGABasePtr
697
        mov  ecx,[esp+28]
698
        mov  [edi],ecx
699
        sti
700
        ret
701
 
702
 
703
Vesa12_getpixel24:
704
 
705
        mov  edi,eax ; x
706
        mov  eax,ebx ; y
707
        lea  edi,[edi+edi*2]
708
        mov  ebx,[BytesPerScanLine]
709
        mul  ebx
710
        add  edi,eax
711
        mov  eax,edi
712
        shr  eax,16
713
        call set_bank
714
        and  edi,65535
715
        add  edi,VGABasePtr
716
        mov  ecx,[edi]
717
        and  ecx,255*256*256+255*256+255
718
        sti
719
        ret
720
 
721
 
722
Vesa12_getpixel32:
723
 
724
        mov  edi,eax ; x
725
        mov  eax,ebx ; y
726
        shl  edi,2
727
        mov  ebx,[BytesPerScanLine]
728
        xor  edx,edx
729
        mul  ebx
730
        add  edi,eax
731
        mov  eax,edi
732
        shr  eax,16
733
        call set_bank
734
        and  edi,65535
735
        add  edi,VGABasePtr
736
        mov  ecx,[edi]
737
        and  ecx,255*256*256+255*256+255
738
        sti
739
 
740
        ret
741
 
742
 
743
 
744
vesa12_putimage:
745
; ebx = pointer to image
746
; ecx = size [x|y]
747
; edx = coordinates [x|y]
748
; ebp = pointer to 'get' function
749
; esi = pointer to 'init' function
750
; edi = parameter for 'get' function
751
 
752
;    mov  ebx,image
753
;    mov  ecx,320*65536+240
754
;    mov  edx,20*65536+20
755
 
756
    call  [disable_mouse]
757
 
758
    mov   [novesachecksum],dword 0
759
    push  esi
760
    push  edi
761
    push  eax
762
    push  ebx
763
    push  ecx
764
    push  edx
765
    movzx eax,word [esp+2]
766
    movzx ebx,word [esp+0]
767
    mov   ecx,[TASK_BASE]
768
    add   eax,[ecx-twdw+WDATA.box.left]
769
    add   ebx,[ecx-twdw+WDATA.box.top]
770
    push  eax
771
    mov   eax,ebx         ; y
772
    mul   dword [BytesPerScanLine]
773
    pop   ecx
774
    add   eax,ecx         ; x
775
    add   eax,ecx
776
    add   eax,ecx
777
    cmp  [ScreenBPP],byte 24     ; 24 or 32 bpp ? - x start
778
    jz   pi2412
779
    add  eax,ecx
780
 
781
  pi2412:
782
 
783
    add  eax,VGABasePtr
784
    mov  edi,eax
785
 
786
    ; x size
787
 
788
    movzx ecx,word [esp+6]
789
 
790
    mov   esi,[esp+8]
791
    movzx ebx,word [esp+4]
792
 
793
    ; check limits while draw ?
794
 
795
    push  ecx
796
    mov  eax,[TASK_BASE]
797
    cmp  dword [eax+draw_data-CURRENT_TASK+RECT.left], 0
798
    jnz  dbcblimitlset212
799
    cmp  dword [eax+draw_data-CURRENT_TASK+RECT.top], 0
800
    jnz  dbcblimitlset212
801
    mov  ecx,[eax+draw_data-CURRENT_TASK+RECT.right]
802
    cmp  ecx,[Screen_Max_X]
803
    jnz  dbcblimitlset212
804
    mov  ecx,[eax+draw_data-CURRENT_TASK+RECT.bottom]
805
    cmp  ecx,[Screen_Max_Y]
806
    jnz  dbcblimitlset212
807
    pop  ecx
808
    push 0
809
    jmp  dbcblimitlno212
810
 
811
  dbcblimitlset212:
812
 
813
    pop  ecx
814
    push 1
815
 
816
  dbcblimitlno212:
817
 
818
    cmp  [ScreenBPP],byte 24     ; 24 or 32 bpp ?
819
    jnz  pi32bit12
820
 
821
  pi24bit12:
822
 
823
  newpi12:
824
 
825
    push edi
826
    push ecx
827
    push ebx
828
 
829
      mov  edx,edi
830
      sub  edx,VGABasePtr
831
      mov  ebx,3
832
      div  ebx
833
      add  edx,WinMapAddress
834
      mov  ebx,[CURRENT_TASK]
835
      mov  bh,[esp+4*3]
836
 
837
      np2412:
838
 
839
        cmp  bl,[edx]
840
        jnz  imp24no12
841
;        mov  eax,[esi]
842
        push    dword [esp+4*3+20]
843
        call    ebp
844
;        cmp  bh,0
845
;        jz   imp24yes12
846
;        call dbcplimit
847
;        jnz  imp24no12
848
 
849
     imp24yes12:
850
 
851
        push edi
852
        push eax
853
        mov  eax,edi
854
        sub  eax,VGABasePtr
855
        shr  eax,16
856
        call set_bank
857
        pop  eax
858
        and  edi,0xffff
859
        add  edi,VGABasePtr
860
        mov  [edi],ax
861
        shr  eax,16
862
        mov  [edi+2],al
863
        pop  edi
864
 
865
     imp24no12:
866
 
867
        inc  edx
868
;        add  esi,3
869
        add  edi,3
870
        dec  ecx
871
        jnz  np2412
872
 
873
      np24d12:
874
 
875
     pop  ebx
876
     pop  ecx
877
     pop  edi
878
 
879
    add  edi,[BytesPerScanLine]
880
    add  esi,[esp+32]
881
    cmp  ebp,putimage_get1bpp
882
    jz   .correct
883
    cmp  ebp,putimage_get2bpp
884
    jz   .correct
885
    cmp  ebp,putimage_get4bpp
886
    jnz  @f
887
.correct:
888
    mov  eax,[esp+20]
889
    mov  byte[eax],80h
890
@@:
891
    dec  ebx
892
    jnz  newpi12
893
 
894
  nonewpi12:
895
 
896
        pop     eax edx ecx ebx eax edi esi
897
        xor     eax, eax
898
        ret
899
 
900
 
901
  pi32bit12:
902
 
903
   newpi3212:
904
 
905
    push edi
906
    push ecx
907
    push ebx
908
 
909
      mov  edx,edi
910
      sub  edx,VGABasePtr
911
      shr  edx,2
912
      add  edx,WinMapAddress
913
      mov   ebx,[CURRENT_TASK]
914
      mov   bh,[esp+4*3]
915
 
916
      np3212:
917
 
918
        cmp  bl,[edx]
919
        jnz  imp32no12
920
;        mov  eax,[esi]
921
        push    dword [esp+4*3+20]
922
        call    ebp
923
;        cmp  bh,0
924
;        jz   imp32yes12
925
;        call dbcplimit
926
;        jnz  imp32no12
927
 
928
      imp32yes12:
929
 
930
        push edi
931
        push eax
932
        mov  eax,edi
933
        sub  eax,VGABasePtr
934
        shr  eax,16
935
        call set_bank
936
        pop  eax
937
        and  edi,0xffff
938
        mov  [edi+VGABasePtr],eax
939
        pop  edi
940
 
941
      imp32no12:
942
 
943
        inc  edx
944
;        add  esi,3
945
        add  edi,4
946
        dec  ecx
947
        jnz  np3212
948
 
949
      np32d12:
950
 
951
     pop  ebx
952
     pop  ecx
953
     pop  edi
954
 
955
    add   edi,[BytesPerScanLine]
956
    cmp   ebp,putimage_get1bpp
957
    jz    .correct
958
    cmp   ebp,putimage_get2bpp
959
    jz    .correct
960
    cmp   ebp,putimage_get4bpp
961
    jnz   @f
962
.correct:
963
    mov   eax,[esp+20]
964
    mov   byte[eax],80h
965
@@:
966
    dec   ebx
967
    jnz   newpi3212
968
 
969
  nonewpi3212:
970
 
971
        pop     eax edx ecx ebx eax edi esi
972
        xor     eax, eax
973
        ret
974
 
975
 
976
vesa12_read_screen_pixel:
977
 
978
     and   eax,0x3FFFFF
979
     cmp   [ScreenBPP],byte 24      ; 24 or 32 bpp ?
980
     jz    v12rsp24
981
     mov   edi,eax
982
     shl   edi,2
983
     mov   eax,edi
984
     shr   eax,16
985
     call  set_bank
986
     and   edi,65535
987
     add   edi,VGABasePtr
988
     mov   eax,[edi]
989
     and   eax,0x00ffffff
990
     ret
991
  v12rsp24:
992
 
993
     imul  eax,3
994
     mov   edi,eax
995
     shr   eax,16
996
     call  set_bank
997
     and   edi,65535
998
     add   edi,VGABasePtr
999
     mov   eax,[edi]
1000
     and   eax,0x00ffffff
1001
     ret
1002