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
17 _DATA SEGMENT BYTE PUBLIC USE32 'DATA'
\r
30 ; Information from VESA return SuperVGA Information
\r
44 VESA_Signature = 041534556h
\r
73 extern _gr_var_color:dword, _gr_var_bwidth:dword
\r
81 _TEXT SEGMENT BYTE PUBLIC USE32 'CODE'
\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
103 Aligned: mov ecx, Width
\r
126 ; YOU TRASHED EDX !!!!!!!
\r
132 ; YOU TRASHED ECX !!!!!!!
\r
138 ; YOU TRASHED EBX !!!!!!!
\r
144 ; YOU TRASHED EAX !!!!!!!
\r
150 ; YOU TRASHED EBP !!!!!!!
\r
156 ; YOU TRASHED EDI !!!!!!!
\r
162 ; YOU TRASHED ESI !!!!!!!
\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
188 Aligned: mov ecx, Width
\r
200 and ecx, 0FFFF0000h
\r
207 PUBLIC gr_init_A0000_
\r
224 PUBLIC gr_vesa_checkmode_
\r
226 gr_vesa_checkmode_:
\r
233 ; Allocate a 256 byte block of DOS memory using DPMI
\r
239 ; AX = real mode segment of allocated block
\r
242 shl eax, 4 ; EAX = 32-bit pointer to DOS memory
\r
247 ; Get SuperVGA information
\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
270 mov edi, offset regs
\r
274 mov eax, regs.RealEAX
\r
278 ; Make sure there is a VESA signature
\r
280 cmp dword ptr[eax+0], VESA_Signature
\r
283 ; We now have a valid VESA driver loaded
\r
285 mov bx, word ptr [eax+4]
\r
286 mov VESAVersion, bx
\r
288 mov ebx, dword ptr [eax+6]
\r
290 mov OEMStringPtr, ebx
\r
292 mov ebx, dword ptr [eax+10]
\r
293 mov Capabilities, ebx
\r
295 mov bx, word ptr [eax+18]
\r
296 mov TotalMemory, bx
\r
298 mov ebx, dword ptr [eax+14]
\r
300 mov VideoModePtr, ebx
\r
303 mov ax, word ptr [ebx]
\r
308 je ModeNotSupported
\r
313 ; Get SuperVGA information
\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
337 mov edi, offset regs
\r
341 mov eax, regs.RealEAX
\r
345 ; Check if this mode supported by hardware.
\r
349 jnc HardwareNotSupported
\r
355 mov PageSizeShift, 0
\r
359 mov PageSizeShift, 1
\r
363 mov PageSizeShift, 2
\r
367 mov PageSizeShift, 3
\r
371 mov PageSizeShift, 4
\r
375 mov PageSizeShift, 5
\r
378 jne WrongGranularity
\r
379 mov PageSizeShift, 6
\r
383 mov WinGranularity, bx
\r
390 mov WinFuncPtr, ebx
\r
392 mov bl, byte ptr [eax+2]
\r
393 mov bh, byte ptr [eax+3]
\r
394 mov word ptr WinAttributes, bx
\r
396 movzx ebx, word ptr [eax+16]
\r
406 HardwareNotSupported:
\r
430 mov eax, vesa_error
\r
434 PUBLIC gr_get_dos_mem_
\r
438 ; eax = how many bytes
\r
459 PUBLIC gr_vesa_setmodea_
\r
465 mov LastPage,0ffh ;force page reset
\r
473 PUBLIC gr_vesa_setpage_
\r
477 ; EAX = 64K Page number
\r
482 @@: mov LastPage, al
\r
487 mov cl, PageSizeShift
\r
488 shl edx, cl ; Convert from 64K pages to GranUnit pages.
\r
490 xor ebx, ebx ; BH=Select window, BL=Window A
\r
491 mov eax, 04f05h ; AX=Super VGA video memory window control
\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
499 jne WinACantReadAndWrite
\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
516 PUBLIC gr_vesa_incpage_
\r
523 call gr_vesa_setpage_
\r
527 PUBLIC gr_vesa_setstart_
\r
531 ; EAX = First column
\r
544 PUBLIC gr_vesa_setlogical_
\r
546 gr_vesa_setlogical_:
\r
567 PUBLIC gr_vesa_scanline_
\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
591 call gr_vesa_setpage_
\r
596 ;mov eax, _Table8to32[ecx*4]
\r
602 ; edx = width in bytes
\r
620 call gr_vesa_incpage_
\r
637 PUBLIC gr_vesa_set_logical_
\r
639 gr_vesa_set_logical_:
\r
641 ; EAX = logical width in pixels
\r
660 PUBLIC gr_vesa_pixel_
\r
663 ; EAX = color (in AL)
\r
664 ; EDX = offset from 0A0000
\r
672 call gr_vesa_setpage_
\r
673 mov [edx+0A0000h], bl
\r
677 PUBLIC gr_vesa_bitblt_
\r
682 ; EDX = vesa_address
\r
689 mov esi, eax ; Point ESI to source bitmap
\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
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
701 mov edx, _gr_var_bwidth
\r
702 sub edx, ecx ; EDX = amount to step each row
\r
718 ; Need to increment page!
\r
719 call gr_vesa_incpage_
\r
727 PUBLIC gr_vesa_bitmap_
\r
731 ; EAX = Source bitmap (LINEAR)
\r
732 ; EDX = Destination bitmap (SVGA)
\r
742 mov eax, [edx].bm_data
\r
743 imul ecx, _gr_var_bwidth
\r
746 mov edi, eax ; EDI = offset into SVGA
\r
748 call gr_vesa_setpage_
\r
754 mov esi, [eax].bm_data
\r
757 movzx ecx, [eax].bm_h
\r
761 movzx ecx, [eax].bm_w
\r
769 and edi, 00ffffh ; IN CASE IT WENT OVER 64K
\r
771 call gr_vesa_incpage_
\r
776 and edi, 00ffffh ; IN CASE IT WENT OVER 64K
\r
778 DoneWithLine: mov bx, [eax].bm_rowsize
\r
782 mov bx, [edx].bm_rowsize
\r
786 call gr_vesa_incpage_
\r
803 PUBLIC gr_vesa_update_
\r
807 ; EAX = Source bitmap (LINEAR)
\r
808 ; EDX = Destination bitmap (SVGA)
\r
809 ; EBX = Old source bitmap (LINEAR)
\r
818 mov eax, [edx].bm_data
\r
819 mov ebp, eax ; EDI = offset into SVGA
\r
821 call gr_vesa_setpage_
\r
827 mov esi, [eax].bm_data
\r
830 movzx ecx, [eax].bm_h
\r
832 mov edi, [ebx].bm_data
\r
834 movzx ebx, [eax].bm_rowsize
\r
838 movzx ebx, [edx].bm_rowsize
\r
842 movzx ebx, [eax].bm_w
\r
855 InnerLoop3: repe cmpsb
\r
858 mov fs:[ebp+esi-1], al ; EDX = dest + size - bytes to end
\r
866 and ebp, 00ffffh ; IN CASE IT WENT OVER 64K
\r
869 call gr_vesa_incpage_
\r
877 InnerLoop4: repe cmpsd
\r
880 mov fs:[ebp+esi-4], eax ; EDX = dest + size - bytes to end
\r
887 InnerLoop5: repe cmpsb
\r
890 mov fs:[ebp+esi-1], al ; EDX = dest + size - bytes to end
\r
895 EvenWidth: sub esi, ebx
\r
898 and ebp, 00ffffh ; IN CASE IT WENT OVER 64K
\r
905 call gr_vesa_incpage_
\r
906 NoPageInc3: pop ecx
\r