Subversion Repositories Kolibri OS

Rev

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

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