mirror of
https://github.com/electronicarts/CnC_Red_Alert.git
synced 2025-12-16 07:31:39 -05:00
Initial commit of Command & Conquer Red Alert source code.
This commit is contained in:
207
WIN32LIB/SRCDEBUG/VESAHOOK.ASM
Normal file
207
WIN32LIB/SRCDEBUG/VESAHOOK.ASM
Normal file
@@ -0,0 +1,207 @@
|
||||
;
|
||||
; Command & Conquer Red Alert(tm)
|
||||
; Copyright 2025 Electronic Arts Inc.
|
||||
;
|
||||
; This program is free software: you can redistribute it and/or modify
|
||||
; it under the terms of the GNU General Public License as published by
|
||||
; the Free Software Foundation, either version 3 of the License, or
|
||||
; (at your option) any later version.
|
||||
;
|
||||
; This program is distributed in the hope that it will be useful,
|
||||
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
; GNU General Public License for more details.
|
||||
;
|
||||
; You should have received a copy of the GNU General Public License
|
||||
; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
;
|
||||
|
||||
;***************************************************************************
|
||||
;** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S **
|
||||
;***************************************************************************
|
||||
;* *
|
||||
;* Project Name : Vesa Hookup *
|
||||
;* *
|
||||
;* *
|
||||
;* Programmer : Julio R. Jerez *
|
||||
;* *
|
||||
;* Start Date : Jan 31, 1995 *
|
||||
;* *
|
||||
;* *
|
||||
;*-------------------------------------------------------------------------*
|
||||
|
||||
|
||||
|
||||
IDEAL
|
||||
P386
|
||||
MODEL USE32 FLAT
|
||||
|
||||
INCLUDE "svgaprim.inc"
|
||||
|
||||
|
||||
DPMI_INTR equ 031h
|
||||
|
||||
|
||||
LOCALS ??
|
||||
|
||||
;//////////////////////////////////////////////////////////////////////////////////////
|
||||
;/////////////////////////////////// Prototypes //////////////////////////////////////
|
||||
|
||||
GLOBAL RMVesaVector : DWORD
|
||||
GLOBAL RMVesaRegs : DWORD
|
||||
GLOBAL RMVesaVectorSel : DWORD
|
||||
GLOBAL Vesa_Hook : NEAR
|
||||
GLOBAL Remove_Vesa : NEAR
|
||||
GLOBAL VesaFunc : dword
|
||||
|
||||
;//////////////////////////////////////////////////////////////////////////////////////
|
||||
;//////////////////////////////////////// Data ////////////////////////////////////////
|
||||
DATASEG
|
||||
|
||||
; The current time we will just include the real mode stuff
|
||||
; into the protected mode code and then copy it down. The C side of
|
||||
; this will handle this method or reading it off of disk in the real
|
||||
; method.
|
||||
|
||||
LABEL RealDataStart BYTE
|
||||
include "VesaReal.ibn"
|
||||
LABEL RealDataEnd BYTE
|
||||
|
||||
RMVesaVectorSel DD 0
|
||||
|
||||
;//////////////////////////////////////////////////////////////////////////////////////
|
||||
;//////////////////////////////////////// Code ////////////////////////////////////////
|
||||
|
||||
CODESEG
|
||||
|
||||
PROC Vesa_Hook C Near
|
||||
USES ebx,ecx,edx,ecx,edi,esi
|
||||
ARG vesa_ptr:DWORD
|
||||
|
||||
; Are they attempting to set timer again?
|
||||
cmp [RMVesaVectorSel],0
|
||||
jnz ??exit
|
||||
|
||||
; now allocate real mode memory and copy the rm binary down to it.
|
||||
mov eax,0100h ; set function number
|
||||
lea ebx , [RealDataEnd]
|
||||
sub ebx , offset RealDataStart
|
||||
push ebx
|
||||
|
||||
add ebx , 15 + 040h
|
||||
shr ebx,4 ; convert to pages.
|
||||
int DPMI_INTR ; do call.
|
||||
pop ecx
|
||||
jc ??error ; check for error.
|
||||
|
||||
; set up source and destination pointers for the copy.
|
||||
shl edx , 16
|
||||
mov [ RMVesaVectorSel ] , edx
|
||||
shl eax,4 ; convert segment to offset.
|
||||
|
||||
mov edi , ecx
|
||||
xor esi , esi
|
||||
|
||||
; push ecx
|
||||
; push eax
|
||||
; mov ecx , eax
|
||||
; shld ebx,ecx,16
|
||||
; mov eax,0600h ; function number.
|
||||
; int DPMI_INTR ; do call.
|
||||
; pop eax
|
||||
; pop ecx
|
||||
; jc ??error ; eax = 8 if mem err, eax = 9 if invalid mem region.
|
||||
|
||||
lea esi , [ RealDataStart]
|
||||
lea edi , [ eax + 040h ] ; put it into esi for copy.
|
||||
rep movsb ; write RM bin to RM memory.
|
||||
|
||||
mov edx,[vesa_ptr] ; Setup vesa funtion
|
||||
mov [ eax + 40h - 4 ] , edx
|
||||
|
||||
|
||||
; Chain the Real Vesa funcion interrupt to any avilable
|
||||
; Interrupt vector so We make sure that the Real Mode
|
||||
; Keyboard Interrupt service get called at debuging time
|
||||
; of the library.
|
||||
|
||||
mov [ RMVesaRegs ] , eax
|
||||
shl eax , 12
|
||||
lea edi , [ eax + 040h ] ; ofsset of VesaFunc
|
||||
mov bl , 060h
|
||||
mov bh , 6
|
||||
mov eax , 200h
|
||||
??find:
|
||||
int DPMI_INTR
|
||||
jc ??error
|
||||
or cx,dx
|
||||
jz ??found
|
||||
inc bl
|
||||
dec bh
|
||||
jnz ??find
|
||||
jmp ??error
|
||||
??found:
|
||||
mov eax , 0201h
|
||||
mov edx , edi
|
||||
shld ecx , edx , 16
|
||||
and ebx , 0ffh
|
||||
mov [ RMVesaVector ] , ebx
|
||||
int DPMI_INTR
|
||||
jc ??error
|
||||
|
||||
??exit:
|
||||
xor eax,eax ; signal an error.
|
||||
ret
|
||||
??error:
|
||||
mov eax , -1
|
||||
ret
|
||||
ENDP
|
||||
|
||||
|
||||
|
||||
PROC Remove_Vesa C Near
|
||||
USES ebx,ecx,edx,ecx,edi,esi
|
||||
ARG vesa_ptr:DWORD
|
||||
|
||||
|
||||
; Are they attempting to set timer again?
|
||||
mov [VesaFunc],0
|
||||
cmp [RMVesaVectorSel],0
|
||||
jz ??exit
|
||||
|
||||
mov ebx , [ RMVesaVector ]
|
||||
test ebx , ebx
|
||||
jz ??exit
|
||||
mov eax , 0201h
|
||||
xor edx , edx
|
||||
xor ecx , ecx
|
||||
int DPMI_INTR
|
||||
mov [ RMVesaVector ] , 0
|
||||
jc ??exit
|
||||
|
||||
; mov eax , 0601h
|
||||
; mov ecx , [ RMVesaRegs ]
|
||||
; shld ebx , ecx , 16
|
||||
; lea edi , [RealDataEnd]
|
||||
; sub edi , offset RealDataStart
|
||||
; add edi , 15 + 040h
|
||||
; xor esi , esi
|
||||
; int DPMI_INTR
|
||||
; jc ??exit
|
||||
|
||||
mov eax,0101h ; set function number
|
||||
mov edx ,[RMVesaVectorSel]
|
||||
test edx , edx
|
||||
jz ??exit
|
||||
shr edx , 16
|
||||
int DPMI_INTR ; do call.
|
||||
mov [RMVesaVectorSel],0
|
||||
??exit:
|
||||
ret
|
||||
ENDP
|
||||
|
||||
|
||||
END
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user