]> icculus.org git repositories - btb/d2x.git/blob - unused/vga/vesa.asm
This commit was generated by cvs2svn to compensate for changes in r2,
[btb/d2x.git] / unused / vga / vesa.asm
1 ; THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX\r
2 ; SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO\r
3 ; END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A\r
4 ; ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS\r
5 ; IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS\r
6 ; SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE\r
7 ; FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE\r
8 ; CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS\r
9 ; AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  \r
10 ; COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.\r
11 .386\r
12 \r
13 OPTION OLDSTRUCTS\r
14 INCLUDE VGAREGS.INC\r
15 INCLUDE GR.INC\r
16 \r
17 _DATA   SEGMENT BYTE PUBLIC USE32 'DATA'\r
18 \r
19                 PUBLIC      __A0000\r
20                 __A0000      dw  ?\r
21 \r
22                 BufferPtr   dd  0\r
23                 BufferSeg   dw  0\r
24                 GoalMode    dw  ?\r
25                 LastPage    db  0FFh\r
26 \r
27                 BPR         dw  ?\r
28                 TempReg     dd  ?\r
29 \r
30                 ; Information from VESA return SuperVGA Information\r
31 \r
32                 VESAVersion         dw  ?\r
33                 OEMStringPtr        dd  ?\r
34                 Capabilities        dd  ?\r
35                 VideoModePtr        dd  ?\r
36                 TotalMemory         dw  ?\r
37                 WinGranularity      dw  ?\r
38                 WinSize             dw  ?\r
39                 WinFuncPtr          dd  ?\r
40                 PageSizeShift       db  ?\r
41                 WinAttributes       dw  ?\r
42                 \r
43 \r
44                 VESA_Signature      = 041534556h\r
45 \r
46 REALREGS    STRUCT\r
47                 RealEDI     dd      ?\r
48                 RealESI     dd      ?\r
49                 RealEBP     dd      ?\r
50                 Reserved    dd      ?\r
51                 RealEBX     dd      ?\r
52                 RealEDX     dd      ?\r
53                 RealECX     dd      ?\r
54                 RealEAX     dd      ?\r
55                 RealFlags   dw      ?\r
56                 RealES      dw      ?\r
57                 RealDS      dw      ?\r
58                 RealFS      dw      ?\r
59                 RealGS      dw      ?\r
60                 RealIP      dw      ?\r
61                 RealCS      dw      ?\r
62                 RealSP      dw      ?\r
63                 RealSS      dw      ?\r
64 REALREGS    ENDS\r
65 \r
66                 regs    REALREGS    < >\r
67 \r
68                 vesa_error      dd      ?\r
69                 SourceInc   dd  ?\r
70                 DestInc     dw  ?\r
71                 RowWidth    dd  ?\r
72 \r
73                 extern _gr_var_color:dword, _gr_var_bwidth:dword\r
74 \r
75 \r
76 _DATA   ENDS\r
77 \r
78 DGROUP  GROUP _DATA\r
79 \r
80 \r
81 _TEXT   SEGMENT BYTE PUBLIC USE32 'CODE'\r
82 \r
83                 ASSUME  DS:_DATA\r
84                 ASSUME  CS:_TEXT\r
85 \r
86 MyStosd MACRO Width:REQ\r
87 ; Assumes:   EDI = Dest Address\r
88 ;            Width = a 32-bit value, can't be ECX or EDI\r
89 ; Trashes:   ECX will be zero\r
90 ;            EDI = Dest Address + Width\r
91 ;            EDX = ????\r
92 ;            Width\r
93 LOCAL Aligned\r
94                         cmp     Width, 16\r
95                         jbe     Aligned\r
96                         mov     ecx, edi\r
97                         and     ecx, 3\r
98                         jcxz    Aligned\r
99                         neg     ecx\r
100                         add     ecx, 4\r
101                         sub     Width, ecx\r
102                         rep     stosb\r
103 Aligned:                mov     ecx, Width\r
104                         shr     ecx, 2\r
105                         rep     stosd\r
106                         mov     ecx, Width\r
107                         and     ecx, 3\r
108                         rep     stosb\r
109 ENDM\r
110 \r
111 \r
112 ENTER_PROC  MACRO\r
113                         push    esi\r
114                         push    edi\r
115                         push    ebp\r
116                         push    eax\r
117                         push    ebx\r
118                         push    ecx\r
119                         push    edx\r
120 ENDM\r
121 \r
122 EXIT_PROC   MACRO\r
123 \r
124                         cmp     [esp-4], edx\r
125                         je      @f\r
126                         ; YOU TRASHED EDX !!!!!!!\r
127                         int     3\r
128 @@:         pop     edx\r
129 \r
130                         cmp     [esp-4], ecx\r
131                         je      @f\r
132                         ; YOU TRASHED ECX !!!!!!!\r
133                         int     3\r
134 @@:         pop     ecx\r
135 \r
136                         cmp     [esp-4], ebx\r
137                         je      @f\r
138                         ; YOU TRASHED EBX !!!!!!!\r
139                         int     3\r
140 @@:         pop     ebx\r
141 \r
142                         cmp     [esp-4], eax\r
143                         je      @f\r
144                         ; YOU TRASHED EAX !!!!!!!\r
145                         int     3\r
146 @@:         pop     eax\r
147 \r
148                         cmp     [esp-4], ebp\r
149                         je      @f\r
150                         ; YOU TRASHED EBP !!!!!!!\r
151                         int     3\r
152 @@:         pop     ebp\r
153 \r
154                         cmp     [esp-4], edi\r
155                         je      @f\r
156                         ; YOU TRASHED EDI !!!!!!!\r
157                         int     3\r
158 @@:         pop     edi\r
159 \r
160                         cmp     [esp-4], esi\r
161                         je      @f\r
162                         ; YOU TRASHED ESI !!!!!!!\r
163                         int     3\r
164 @@:         pop     esi\r
165 \r
166 ENDM\r
167 \r
168 \r
169 MyMovsd MACRO Width:REQ\r
170 ; Assumes:   EDI = Dest Address\r
171 ;            ESI = Source Address\r
172 ;            Width = a 32-bit value, can't be ECX or EDI or ESI\r
173 ;            Assumes that ESI is already aligned\r
174 ; Trashes:   ECX will be zero\r
175 ;            EDI = Dest Address + Width\r
176 ;            ESI = Source Address + Width\r
177 ;            EDX = ????\r
178 LOCAL Aligned\r
179                         cmp     Width, 16\r
180                         jbe     Aligned\r
181                         mov     ecx, edi\r
182                         and     ecx, 3\r
183                         jcxz    Aligned\r
184                         neg     ecx\r
185                         add     ecx, 4\r
186                         sub     Width, ecx\r
187                         rep     movsb\r
188 Aligned:    mov     ecx, Width\r
189                         shr     ecx, 2\r
190                         rep     movsd\r
191                         mov     ecx, Width\r
192                         and     ecx, 3\r
193                         rep     movsb\r
194 ENDM\r
195 \r
196 \r
197 EBXFarTo32:\r
198                         push    ecx\r
199                         mov     ecx, ebx\r
200                         and     ecx, 0FFFF0000h\r
201                         shr     ecx, 12\r
202                         and     ebx, 0FFFFh\r
203                         add     ebx, ecx\r
204                         pop     ecx\r
205                         ret\r
206 \r
207 PUBLIC  gr_init_A0000_\r
208 \r
209 gr_init_A0000_:\r
210 \r
211                         push    ebx\r
212                         mov     ax, 0002h\r
213                         mov     bx, 0a000h\r
214                         int     31h\r
215                         jc      NoGo\r
216                         mov     __A0000, ax\r
217                         pop     ebx\r
218                         xor     eax, eax\r
219                         ret\r
220 NoGo:       pop     ebx\r
221                         mov     eax, 1\r
222                         ret\r
223 \r
224 PUBLIC  gr_vesa_checkmode_\r
225 \r
226 gr_vesa_checkmode_:\r
227                         pushad\r
228 \r
229                         mov     GoalMode, ax\r
230                         cmp     BufferSeg, 0\r
231                         jne     GotDosMemory\r
232 \r
233                         ; Allocate a 256 byte block of DOS memory using DPMI\r
234                         mov     ax, 0100h\r
235                         mov     bx, 16\r
236                         int     31h\r
237                         jc      NoMemory\r
238 \r
239                         ; AX = real mode segment of allocated block\r
240                         and     eax, 0FFFFh\r
241                         mov     BufferSeg, ax\r
242                         shl     eax, 4      ; EAX = 32-bit pointer to DOS memory\r
243                         mov     BufferPtr, eax\r
244 GotDosMemory:\r
245 \r
246 \r
247                         ; Get SuperVGA information\r
248                         mov     ax, BufferSeg\r
249                         mov     regs.RealEDI, 0\r
250                         mov     regs.RealESI, 0\r
251                         mov     regs.RealEBP, 0\r
252                         mov     regs.Reserved, 0\r
253                         mov     regs.RealEBX, 0\r
254                         mov     regs.RealEDX, 0\r
255                         mov     regs.RealECX, 0\r
256                         mov     regs.RealEAX, 04f00h\r
257                         mov     regs.RealFlags, 0\r
258                         mov     regs.RealES, ax\r
259                         mov     regs.RealDS, 0\r
260                         mov     regs.RealFS, 0\r
261                         mov     regs.RealGS, 0\r
262                         mov     regs.RealIP, 0\r
263                         mov     regs.RealCS, 0\r
264                         mov     regs.RealSP, 0\r
265                         mov     regs.RealSS, 0\r
266 \r
267                         mov     bl, 10h\r
268                         xor     bh, bh\r
269                         xor     ecx, ecx\r
270                         mov     edi, offset regs\r
271                         mov     ax, 0300h\r
272                         int     31h\r
273 \r
274                         mov     eax, regs.RealEAX\r
275                         cmp     ax, 04fh\r
276                         jne     NoVESADriver\r
277 \r
278                         ; Make sure there is a VESA signature\r
279                         mov     eax, BufferPtr\r
280                         cmp     dword ptr[eax+0], VESA_Signature\r
281                         jne     NoVESADriver\r
282 \r
283                         ; We now have a valid VESA driver loaded\r
284 \r
285                         mov     bx, word ptr [eax+4]\r
286                         mov     VESAVersion, bx\r
287 \r
288                         mov     ebx, dword ptr [eax+6]\r
289                         call    EBXFarTo32\r
290                         mov     OEMStringPtr, ebx\r
291 \r
292                         mov     ebx, dword ptr [eax+10]\r
293                         mov     Capabilities, ebx\r
294 \r
295                         mov     bx, word ptr [eax+18]\r
296                         mov     TotalMemory, bx\r
297 \r
298                         mov     ebx, dword ptr [eax+14]\r
299                         call    EBXFarTo32\r
300                         mov     VideoModePtr, ebx\r
301 \r
302 TryAnotherMode:\r
303                         mov     ax, word ptr [ebx]\r
304                         add     ebx, 2\r
305                         cmp     ax, GoalMode\r
306                         je      ModeSupported\r
307                         cmp     ax, -1\r
308                         je      ModeNotSupported\r
309                         jmp     TryAnotherMode\r
310 \r
311 ModeSupported:\r
312 \r
313                         ; Get SuperVGA information\r
314                         mov     ax, BufferSeg\r
315                         movzx   ecx, GoalMode\r
316                         mov     regs.RealEDI, 0\r
317                         mov     regs.RealESI, 0\r
318                         mov     regs.RealEBP, 0\r
319                         mov     regs.Reserved, 0\r
320                         mov     regs.RealEBX, 0\r
321                         mov     regs.RealEDX, 0\r
322                         mov     regs.RealECX, ecx\r
323                         mov     regs.RealEAX, 04f01h\r
324                         mov     regs.RealFlags, 0\r
325                         mov     regs.RealES, ax\r
326                         mov     regs.RealDS, 0\r
327                         mov     regs.RealFS, 0\r
328                         mov     regs.RealGS, 0\r
329                         mov     regs.RealIP, 0\r
330                         mov     regs.RealCS, 0\r
331                         mov     regs.RealSP, 0\r
332                         mov     regs.RealSS, 0\r
333 \r
334                         mov     bl, 10h\r
335                         xor     bh, bh\r
336                         xor     cx, cx\r
337                         mov     edi, offset regs\r
338                         mov     ax, 0300h\r
339                         int     31h\r
340 \r
341                         mov     eax, regs.RealEAX\r
342                         cmp     ax, 04fh\r
343                         jne     BadStatus\r
344 \r
345                         ; Check if this mode supported by hardware.\r
346                         mov     eax, BufferPtr\r
347                         mov     bx, [eax]\r
348                         bt      bx, 0\r
349                         jnc     HardwareNotSupported\r
350 \r
351 \r
352                         mov     bx, [eax+4]\r
353                         cmp     bx, 64\r
354                         jne     @f\r
355                         mov     PageSizeShift, 0\r
356                         jmp     GranularityOK\r
357 @@:                     cmp     bx, 32\r
358                         jne     @f\r
359                         mov     PageSizeShift, 1\r
360                         jmp     GranularityOK\r
361 @@:                     cmp     bx, 16\r
362                         jne     @f\r
363                         mov     PageSizeShift, 2\r
364                         jmp     GranularityOK\r
365 @@:                     cmp     bx, 8\r
366                         jne     @f\r
367                         mov     PageSizeShift, 3\r
368                         jmp     GranularityOK\r
369 @@:                     cmp     bx, 4\r
370                         jne     @f\r
371                         mov     PageSizeShift, 4\r
372                         jmp     GranularityOK\r
373 @@:                     cmp     bx, 2\r
374                         jne     @f\r
375                         mov     PageSizeShift, 5\r
376                         jmp     GranularityOK\r
377 @@:                     cmp     bx, 1\r
378                         jne     WrongGranularity\r
379                         mov     PageSizeShift, 6\r
380 \r
381 GranularityOK:\r
382                         shl     bx, 10\r
383                         mov     WinGranularity, bx\r
384 \r
385                         mov     bx, [eax+6]\r
386                         mov     WinSize, bx\r
387 \r
388                         mov     ebx, [eax+12]\r
389                         call    EBXFarTo32\r
390                         mov     WinFuncPtr, ebx\r
391 \r
392                         mov     bl, byte ptr [eax+2]\r
393                         mov     bh, byte ptr [eax+3]\r
394                         mov     word ptr WinAttributes, bx\r
395 \r
396                         movzx   ebx, word ptr [eax+16]\r
397 \r
398 NoError:\r
399                         mov     vesa_error, 0\r
400                         jmp     Done\r
401 \r
402 WrongGranularity:\r
403                         mov     vesa_error, 2\r
404                         jmp     Done\r
405 \r
406 HardwareNotSupported:\r
407                         mov     vesa_error, 3\r
408                         jmp     Done\r
409 \r
410 ModeNotSupported:\r
411                         mov     vesa_error, 4\r
412                         jmp     Done\r
413 \r
414 NoVESADriver:\r
415                         mov     vesa_error, 5\r
416                         jmp     Done\r
417 \r
418 BadStatus:\r
419                         mov     vesa_error, 6\r
420                         jmp     Done\r
421 \r
422 NoMemory:\r
423                         mov     vesa_error, 7\r
424                         jmp     Done\r
425 \r
426 DPMIError:\r
427                         mov     vesa_error, 8\r
428 \r
429 Done:                   popad\r
430                         mov     eax, vesa_error\r
431 \r
432                         ret\r
433 \r
434 PUBLIC  gr_get_dos_mem_\r
435 \r
436 gr_get_dos_mem_:\r
437                         \r
438                 ; eax = how many bytes\r
439 \r
440                 push    ebx\r
441                 \r
442                 mov     ebx, eax\r
443                 shr     ebx, 4\r
444                 mov     eax, 0100h\r
445                 int     31h\r
446                 jc      nomem\r
447                 and     eax, 0ffffh\r
448                 shl     eax, 4\r
449                 pop     ebx\r
450                 ret\r
451 \r
452 nomem:          pop     ebx\r
453                 mov     eax,0\r
454                 ret\r
455                 \r
456 \r
457 \r
458 \r
459 PUBLIC gr_vesa_setmodea_\r
460 \r
461 gr_vesa_setmodea_:\r
462 \r
463                 ; eax = mode\r
464                 pushad\r
465                 mov     LastPage,0ffh   ;force page reset  \r
466                 mov     ebx, eax                                \r
467                 mov     eax, 04f02h\r
468                 int     10h\r
469                 cmp     ax, 04fh\r
470                 jne     BadStatus\r
471                 jmp     NoError\r
472 \r
473 PUBLIC  gr_vesa_setpage_\r
474 \r
475 gr_vesa_setpage_:\r
476 \r
477                         ; EAX = 64K Page number\r
478                         and     eax, 0ffh\r
479                         cmp     al, LastPage\r
480                         jne     @f\r
481                         ret\r
482 @@:                     mov     LastPage, al\r
483                         push    edx\r
484                         push    ebx\r
485                         push    ecx\r
486                         mov     edx, eax\r
487                         mov     cl, PageSizeShift\r
488                         shl     edx, cl         ; Convert from 64K pages to GranUnit pages.\r
489                         push    edx\r
490                         xor     ebx, ebx        ; BH=Select window, BL=Window A\r
491                         mov     eax, 04f05h     ; AX=Super VGA video memory window control\r
492                         int     10h\r
493 \r
494                         ; New code to fix those ATI Mach64's with separate \r
495                         ; read/write pages. \r
496                         mov     bx, word ptr WinAttributes\r
497                         and     ebx, 0110b      ; Set if PageA can read and write\r
498                         cmp     ebx, 0110b      \r
499                         jne     WinACantReadAndWrite\r
500                         pop     edx\r
501                         pop     ecx\r
502                         pop     ebx\r
503                         pop     edx\r
504                         ret\r
505 \r
506 WinACantReadAndWrite:   ; Page A can't read and write, so we need to update page B also!\r
507                         pop     edx             ; DX=Window\r
508                         mov     ebx, 1          ; BH=Select window, BL=Window B\r
509                         mov     eax, 04f05h     ; AX=Super VGA video memory window control\r
510                         int     10h\r
511                         pop     ecx\r
512                         pop     ebx\r
513                         pop     edx\r
514                         ret\r
515       \r
516 PUBLIC  gr_vesa_incpage_\r
517 \r
518 gr_vesa_incpage_:\r
519                         push    eax\r
520                         xor     eax, eax\r
521                         mov     al, LastPage\r
522                         inc     eax\r
523                         call    gr_vesa_setpage_\r
524                         pop     eax\r
525                         ret\r
526 \r
527 PUBLIC  gr_vesa_setstart_\r
528 \r
529 gr_vesa_setstart_:\r
530 \r
531                         ; EAX = First column\r
532                         ; EDX = First row\r
533                         push    ebx\r
534                         push    ecx\r
535                         mov     ecx, eax\r
536                         mov     eax, 4f07h\r
537                         xor     ebx, ebx\r
538                         int     10h\r
539                         pop     ecx\r
540                         pop     ebx\r
541                         ret\r
542 \r
543 \r
544 PUBLIC  gr_vesa_setlogical_\r
545 \r
546 gr_vesa_setlogical_:\r
547 \r
548                         ; EAX = line width\r
549                         push    ebx\r
550                         push    ecx\r
551                         push    edx\r
552 \r
553                         mov     cx, ax\r
554                         mov     ax, 04f06h\r
555                         mov     bl, 0\r
556                         int     10h\r
557                         and     ebx, 0FFFFh\r
558                         mov     ax, cx\r
559 \r
560                         pop     edx\r
561                         pop     ecx\r
562                         pop     ebx\r
563                         ret\r
564 \r
565 \r
566 \r
567 PUBLIC gr_vesa_scanline_\r
568 \r
569 gr_vesa_scanline_:\r
570 \r
571                         ; EAX = x1\r
572                         ; EDX = x2\r
573                         ; EBX = y\r
574                         ; ECX = color\r
575 \r
576                         push    edi\r
577                         cld\r
578                         cmp     edx, eax\r
579                         jge     @f\r
580                         xchg    edx, eax\r
581 \r
582 @@:                     mov     edi, ebx\r
583                         imul    edi, _gr_var_bwidth\r
584                         add     edi, eax        ; EDI = y*bpr+x1\r
585                         sub     edx, eax        ; ECX = x2-x1\r
586                         inc     edx\r
587 \r
588                         mov     eax, edi\r
589                         shr     eax, 16\r
590 \r
591                         call    gr_vesa_setpage_\r
592 \r
593                         and     edi, 00FFFFh\r
594                         or      edi, 0A0000h\r
595 \r
596                         ;mov     eax, _Table8to32[ecx*4]\r
597                         mov     ch, cl\r
598                         mov     ax, cx\r
599                         shl     eax, 16\r
600                         mov     ax, cx\r
601 \r
602                         ; edx = width in bytes\r
603                         ; edi = dest\r
604                         mov     bx, dx\r
605                         add     bx, di\r
606                         jnc     scanonepage\r
607 \r
608                         sub     dx, bx\r
609                         movzx   ecx, dx\r
610                         \r
611                         shr     ecx, 1                  \r
612                         rep     stosw\r
613                         adc     ecx, ecx\r
614                         rep     stosb\r
615 \r
616                         movzx   edx, bx\r
617                         cmp     edx, 0\r
618                         je      scandone\r
619 \r
620                         call    gr_vesa_incpage_\r
621                         mov     edi, 0A0000h\r
622 \r
623 scanonepage:\r
624                         movzx   ecx, dx\r
625 \r
626                         shr     ecx, 1                  \r
627                         rep     stosw\r
628                         adc     ecx, ecx\r
629                         rep     stosb\r
630 \r
631 scandone:\r
632 \r
633                         pop     edi\r
634                         ret\r
635 \r
636 \r
637 PUBLIC gr_vesa_set_logical_\r
638 \r
639 gr_vesa_set_logical_:\r
640 \r
641                         ; EAX = logical width in pixels\r
642 \r
643                         push    ebx\r
644                         push    ecx\r
645 \r
646                         mov     ecx, eax\r
647                         mov     eax, 04f06h\r
648                         mov     bl, 0\r
649                         int     10h\r
650                         and     ebx, 0ffffh\r
651 \r
652                         movzx   eax, cx\r
653 \r
654                         pop     ecx\r
655                         pop     ebx\r
656 \r
657                         ret\r
658 \r
659 \r
660 PUBLIC gr_vesa_pixel_\r
661 \r
662 gr_vesa_pixel_:\r
663                         ; EAX = color (in AL)\r
664                         ; EDX = offset from 0A0000\r
665                         push    ebx\r
666                         mov     bl, al\r
667 \r
668                         mov     eax, edx\r
669                         shr     eax, 16\r
670                         and     edx, 0ffffh\r
671 \r
672                         call    gr_vesa_setpage_\r
673                         mov     [edx+0A0000h], bl\r
674                         pop     ebx\r
675                         ret\r
676 \r
677 PUBLIC gr_vesa_bitblt_\r
678 \r
679 gr_vesa_bitblt_:\r
680 \r
681                         ; EAX = source_ptr\r
682                         ; EDX = vesa_address\r
683                         ; EBX = height\r
684                         ; ECX = width\r
685 \r
686                         push    edi\r
687                         push    esi\r
688 \r
689                         mov     esi, eax        ; Point ESI to source bitmap\r
690 \r
691                         ; Set the initial page\r
692                         mov     eax, edx            ; Move offset into SVGA into eax\r
693                         shr     eax, 16             ; Page = offset / 64K\r
694                         call    gr_vesa_setpage_\r
695 \r
696                         mov     edi, edx            ; EDI = offset into SVGA\r
697                         and     edi,  0FFFFh        ; EDI = offset into 64K page\r
698                         add     edi, 0A0000h        ; EDI = ptr to dest\r
699 \r
700 \r
701                         mov     edx, _gr_var_bwidth\r
702                         sub     edx, ecx            ; EDX = amount to step each row\r
703 \r
704 \r
705                         mov     eax, ecx\r
706 \r
707 NextScanLine:\r
708                         push    eax\r
709                         MyMovsd eax\r
710                         pop     eax\r
711 \r
712                         dec     ebx\r
713                         jz      DoneBlt\r
714 \r
715                         add     di, dx\r
716                         jnc     NextScanLine\r
717 \r
718                         ; Need to increment page!\r
719                         call    gr_vesa_incpage_\r
720                         jmp     NextScanLine\r
721 \r
722 DoneBlt:    pop     esi\r
723                         pop     edi\r
724 \r
725                         ret\r
726 \r
727 PUBLIC gr_vesa_bitmap_\r
728 \r
729 gr_vesa_bitmap_:\r
730 \r
731                         ; EAX = Source bitmap       (LINEAR)\r
732                         ; EDX = Destination bitmap  (SVGA)\r
733                         ; EBX = x\r
734                         ; ECX = y\r
735 \r
736                         push    esi\r
737                         push    edi\r
738                         push    ebp\r
739                         push    es\r
740 \r
741                         push    eax\r
742                         mov     eax, [edx].bm_data\r
743                         imul    ecx, _gr_var_bwidth\r
744                         add     eax, ecx\r
745                         add     eax, ebx\r
746                         mov     edi, eax            ; EDI = offset into SVGA\r
747                         shr     eax, 16\r
748                         call    gr_vesa_setpage_\r
749 \r
750                         mov     ax, __A0000\r
751                         mov     es, ax\r
752                         pop     eax\r
753 \r
754                         mov     esi, [eax].bm_data\r
755                         and     edi, 0ffffh\r
756 \r
757                         movzx   ecx, [eax].bm_h\r
758 \r
759 NextScanLine1:\r
760                                 push    ecx\r
761                                 movzx   ecx, [eax].bm_w\r
762                                 mov     bx, cx\r
763                                 add     bx, di\r
764                                 jnc     OnePage\r
765 \r
766                                 sub     cx,bx\r
767                                 mov     ebp, ecx\r
768                                 MyMovsd ebp\r
769                                 and     edi, 00ffffh        ; IN CASE IT WENT OVER 64K\r
770                                 mov     cx,bx\r
771                                 call    gr_vesa_incpage_\r
772                                 jcxz    DoneWithLine\r
773 OnePage:\r
774                                 mov     ebp, ecx\r
775                                 MyMovsd ebp\r
776                                 and     edi, 00ffffh        ; IN CASE IT WENT OVER 64K\r
777 \r
778 DoneWithLine:   mov     bx, [eax].bm_rowsize\r
779                                 sub     bx, [eax].bm_w\r
780                                 and     ebx, 0ffffh\r
781                                 add     esi, ebx\r
782                                 mov     bx, [edx].bm_rowsize\r
783                                 sub     bx, [eax].bm_w\r
784                                 add     di, bx\r
785                                 jnc     NoPageInc\r
786                                 call    gr_vesa_incpage_\r
787 NoPageInc:  pop     ecx\r
788                         dec     ecx\r
789                         jz      @f\r
790                         jmp     NextScanLine1\r
791 \r
792 @@:\r
793 \r
794                         pop es\r
795                         pop ebp\r
796                         pop edi\r
797                         pop esi\r
798                         ret\r
799 \r
800 \r
801 \r
802 \r
803 PUBLIC gr_vesa_update_\r
804 \r
805 gr_vesa_update_:\r
806 \r
807                         ; EAX = Source bitmap       (LINEAR)\r
808                         ; EDX = Destination bitmap  (SVGA)\r
809                         ; EBX = Old source bitmap   (LINEAR)\r
810 \r
811                         push    ecx\r
812                         push    esi\r
813                         push    edi\r
814                         push    ebp\r
815                         push    fs\r
816 \r
817                         push    eax\r
818                         mov     eax, [edx].bm_data\r
819                         mov     ebp, eax            ; EDI = offset into SVGA\r
820                         shr     eax, 16\r
821                         call    gr_vesa_setpage_\r
822 \r
823                         mov     ax, __A0000\r
824                         mov     fs, ax\r
825                         pop     eax\r
826 \r
827                         mov     esi, [eax].bm_data\r
828                         and     ebp, 0ffffh\r
829 \r
830                         movzx   ecx, [eax].bm_h\r
831 \r
832                         mov     edi, [ebx].bm_data\r
833 \r
834                         movzx   ebx, [eax].bm_rowsize\r
835                         sub     bx, [eax].bm_w\r
836                         mov     SourceInc, ebx\r
837 \r
838                         movzx   ebx, [edx].bm_rowsize\r
839                         sub     bx, [eax].bm_w\r
840                         mov     DestInc, bx\r
841 \r
842                         movzx   ebx, [eax].bm_w\r
843                         mov     RowWidth, ebx\r
844 \r
845 NextScanLine3:\r
846                                 push    ecx\r
847                                 mov     ecx, RowWidth\r
848                                 mov     dx, cx\r
849                                 add     dx, bp\r
850                                 jnc     OnePage3\r
851 \r
852                                 sub     cx,dx\r
853                                 mov     ebx, esi\r
854 \r
855 InnerLoop3:     repe    cmpsb\r
856                                 mov     al, [esi-1]\r
857                                 sub     esi, ebx\r
858                                 mov     fs:[ebp+esi-1], al       ; EDX = dest + size - bytes to end\r
859                                 add     esi, ebx\r
860                                 cmp     ecx, 0\r
861                                 jne     InnerLoop3\r
862 \r
863                                 sub     esi, ebx\r
864                                 add     ebp, esi\r
865                                 add     esi, ebx\r
866                                 and     ebp, 00ffffh        ; IN CASE IT WENT OVER 64K\r
867 \r
868                                 mov     cx,dx\r
869                                 call    gr_vesa_incpage_\r
870                                 jcxz    DoneWithLine3\r
871 OnePage3:\r
872                                 mov     ebx, esi\r
873                                 mov     edx, ecx\r
874                                 and     edx, 11b\r
875                                 shr     ecx, 2\r
876 \r
877 InnerLoop4:     repe    cmpsd\r
878                                 mov     eax, [esi-4]\r
879                                 sub     esi, ebx\r
880                                 mov     fs:[ebp+esi-4], eax       ; EDX = dest + size - bytes to end\r
881                                 add     esi, ebx\r
882                                 cmp     ecx, 0\r
883                                 jne     InnerLoop4\r
884 \r
885                                 mov     ecx, edx\r
886                                 jecxz   EvenWidth\r
887 InnerLoop5:     repe    cmpsb\r
888                                 mov     al, [esi-1]\r
889                                 sub     esi, ebx\r
890                                 mov     fs:[ebp+esi-1], al       ; EDX = dest + size - bytes to end\r
891                                 add     esi, ebx\r
892                                 cmp     ecx, 0\r
893                                 jne     InnerLoop5\r
894 \r
895 EvenWidth:      sub     esi, ebx\r
896                                 add     ebp, esi\r
897                                 add     esi, ebx\r
898                                 and     ebp, 00ffffh        ; IN CASE IT WENT OVER 64K\r
899 \r
900 DoneWithLine3:\r
901                                 add     esi, SourceInc\r
902                                 add     edi, SourceInc\r
903                                 add     bp, DestInc\r
904                                 jnc     NoPageInc3\r
905                                 call    gr_vesa_incpage_\r
906 NoPageInc3: pop     ecx\r
907                         dec     ecx\r
908                         jnz     NextScanLine3\r
909 \r
910                         pop     fs\r
911                         pop     ebp\r
912                         pop     edi\r
913                         pop     esi\r
914                         pop     ecx\r
915                         ret\r
916 \r
917 \r
918 \r
919 \r
920 _TEXT   ENDS\r
921 \r
922 \r
923                 END\r
924 \r
925 \r