1 ; THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
2 ; SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
3 ; END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
4 ; ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
5 ; IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
6 ; SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
7 ; FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
8 ; CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
9 ; AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
10 ; COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
17 _DATA SEGMENT BYTE PUBLIC USE32 'DATA'
30 ; Information from VESA return SuperVGA Information
44 VESA_Signature = 041534556h
73 extern _gr_var_color:dword, _gr_var_bwidth:dword
81 _TEXT SEGMENT BYTE PUBLIC USE32 'CODE'
86 MyStosd MACRO Width:REQ
87 ; Assumes: EDI = Dest Address
88 ; Width = a 32-bit value, can't be ECX or EDI
89 ; Trashes: ECX will be zero
90 ; EDI = Dest Address + Width
103 Aligned: mov ecx, Width
126 ; YOU TRASHED EDX !!!!!!!
132 ; YOU TRASHED ECX !!!!!!!
138 ; YOU TRASHED EBX !!!!!!!
144 ; YOU TRASHED EAX !!!!!!!
150 ; YOU TRASHED EBP !!!!!!!
156 ; YOU TRASHED EDI !!!!!!!
162 ; YOU TRASHED ESI !!!!!!!
169 MyMovsd MACRO Width:REQ
170 ; Assumes: EDI = Dest Address
171 ; ESI = Source Address
172 ; Width = a 32-bit value, can't be ECX or EDI or ESI
173 ; Assumes that ESI is already aligned
174 ; Trashes: ECX will be zero
175 ; EDI = Dest Address + Width
176 ; ESI = Source Address + Width
188 Aligned: mov ecx, Width
207 PUBLIC gr_init_A0000_
224 PUBLIC gr_vesa_checkmode_
233 ; Allocate a 256 byte block of DOS memory using DPMI
239 ; AX = real mode segment of allocated block
242 shl eax, 4 ; EAX = 32-bit pointer to DOS memory
247 ; Get SuperVGA information
256 mov regs.RealEAX, 04f00h
257 mov regs.RealFlags, 0
274 mov eax, regs.RealEAX
278 ; Make sure there is a VESA signature
280 cmp dword ptr[eax+0], VESA_Signature
283 ; We now have a valid VESA driver loaded
285 mov bx, word ptr [eax+4]
288 mov ebx, dword ptr [eax+6]
290 mov OEMStringPtr, ebx
292 mov ebx, dword ptr [eax+10]
293 mov Capabilities, ebx
295 mov bx, word ptr [eax+18]
298 mov ebx, dword ptr [eax+14]
300 mov VideoModePtr, ebx
303 mov ax, word ptr [ebx]
313 ; Get SuperVGA information
322 mov regs.RealECX, ecx
323 mov regs.RealEAX, 04f01h
324 mov regs.RealFlags, 0
341 mov eax, regs.RealEAX
345 ; Check if this mode supported by hardware.
349 jnc HardwareNotSupported
383 mov WinGranularity, bx
392 mov bl, byte ptr [eax+2]
393 mov bh, byte ptr [eax+3]
394 mov word ptr WinAttributes, bx
396 movzx ebx, word ptr [eax+16]
406 HardwareNotSupported:
434 PUBLIC gr_get_dos_mem_
438 ; eax = how many bytes
459 PUBLIC gr_vesa_setmodea_
465 mov LastPage,0ffh ;force page reset
473 PUBLIC gr_vesa_setpage_
477 ; EAX = 64K Page number
487 mov cl, PageSizeShift
488 shl edx, cl ; Convert from 64K pages to GranUnit pages.
490 xor ebx, ebx ; BH=Select window, BL=Window A
491 mov eax, 04f05h ; AX=Super VGA video memory window control
494 ; New code to fix those ATI Mach64's with separate
496 mov bx, word ptr WinAttributes
497 and ebx, 0110b ; Set if PageA can read and write
499 jne WinACantReadAndWrite
506 WinACantReadAndWrite: ; Page A can't read and write, so we need to update page B also!
508 mov ebx, 1 ; BH=Select window, BL=Window B
509 mov eax, 04f05h ; AX=Super VGA video memory window control
516 PUBLIC gr_vesa_incpage_
523 call gr_vesa_setpage_
527 PUBLIC gr_vesa_setstart_
544 PUBLIC gr_vesa_setlogical_
567 PUBLIC gr_vesa_scanline_
583 imul edi, _gr_var_bwidth
584 add edi, eax ; EDI = y*bpr+x1
585 sub edx, eax ; ECX = x2-x1
591 call gr_vesa_setpage_
596 ;mov eax, _Table8to32[ecx*4]
602 ; edx = width in bytes
620 call gr_vesa_incpage_
637 PUBLIC gr_vesa_set_logical_
639 gr_vesa_set_logical_:
641 ; EAX = logical width in pixels
660 PUBLIC gr_vesa_pixel_
663 ; EAX = color (in AL)
664 ; EDX = offset from 0A0000
672 call gr_vesa_setpage_
673 mov [edx+0A0000h], bl
677 PUBLIC gr_vesa_bitblt_
689 mov esi, eax ; Point ESI to source bitmap
691 ; Set the initial page
692 mov eax, edx ; Move offset into SVGA into eax
693 shr eax, 16 ; Page = offset / 64K
694 call gr_vesa_setpage_
696 mov edi, edx ; EDI = offset into SVGA
697 and edi, 0FFFFh ; EDI = offset into 64K page
698 add edi, 0A0000h ; EDI = ptr to dest
701 mov edx, _gr_var_bwidth
702 sub edx, ecx ; EDX = amount to step each row
718 ; Need to increment page!
719 call gr_vesa_incpage_
727 PUBLIC gr_vesa_bitmap_
731 ; EAX = Source bitmap (LINEAR)
732 ; EDX = Destination bitmap (SVGA)
742 mov eax, [edx].bm_data
743 imul ecx, _gr_var_bwidth
746 mov edi, eax ; EDI = offset into SVGA
748 call gr_vesa_setpage_
754 mov esi, [eax].bm_data
757 movzx ecx, [eax].bm_h
761 movzx ecx, [eax].bm_w
769 and edi, 00ffffh ; IN CASE IT WENT OVER 64K
771 call gr_vesa_incpage_
776 and edi, 00ffffh ; IN CASE IT WENT OVER 64K
778 DoneWithLine: mov bx, [eax].bm_rowsize
782 mov bx, [edx].bm_rowsize
786 call gr_vesa_incpage_
803 PUBLIC gr_vesa_update_
807 ; EAX = Source bitmap (LINEAR)
808 ; EDX = Destination bitmap (SVGA)
809 ; EBX = Old source bitmap (LINEAR)
818 mov eax, [edx].bm_data
819 mov ebp, eax ; EDI = offset into SVGA
821 call gr_vesa_setpage_
827 mov esi, [eax].bm_data
830 movzx ecx, [eax].bm_h
832 mov edi, [ebx].bm_data
834 movzx ebx, [eax].bm_rowsize
838 movzx ebx, [edx].bm_rowsize
842 movzx ebx, [eax].bm_w
855 InnerLoop3: repe cmpsb
858 mov fs:[ebp+esi-1], al ; EDX = dest + size - bytes to end
866 and ebp, 00ffffh ; IN CASE IT WENT OVER 64K
869 call gr_vesa_incpage_
877 InnerLoop4: repe cmpsd
880 mov fs:[ebp+esi-4], eax ; EDX = dest + size - bytes to end
887 InnerLoop5: repe cmpsb
890 mov fs:[ebp+esi-1], al ; EDX = dest + size - bytes to end
895 EvenWidth: sub esi, ebx
898 and ebp, 00ffffh ; IN CASE IT WENT OVER 64K
905 call gr_vesa_incpage_