290 lines
5.6 KiB
NASM
290 lines
5.6 KiB
NASM
;
|
||
; 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/>.
|
||
;
|
||
|
||
|
||
IDEAL
|
||
P386
|
||
MODEL USE32 FLAT
|
||
|
||
LOCALS ??
|
||
|
||
|
||
DPMI_INTR equ 031h
|
||
|
||
GLOBAL DPMI_real_alloc : near
|
||
GLOBAL DPMI_real_free : near
|
||
GLOBAL DPMI_real_intr : near
|
||
GLOBAL DPMI_real_call : near
|
||
|
||
|
||
STRUC SEGSEL
|
||
segmen dw ?
|
||
select dw ?
|
||
ENDS
|
||
|
||
STRUC REGS
|
||
_eax dd ?
|
||
_ebx dd ?
|
||
_ecx dd ?
|
||
_edx dd ?
|
||
_esi dd ?
|
||
_edi dd ?
|
||
_cflag dd ?
|
||
ENDS
|
||
|
||
STRUC SREGS
|
||
_es dw ?
|
||
_cs dw ?
|
||
_ss dw ?
|
||
_ds dw ?
|
||
_fs dw ?
|
||
_gs dw ?
|
||
ENDS
|
||
|
||
STRUC DPMI_REGS
|
||
_edi dd ?
|
||
_esi dd ?
|
||
_ebp dd ?
|
||
dd ?
|
||
_ebx dd ?
|
||
_edx dd ?
|
||
_ecx dd ?
|
||
_eax dd ?
|
||
Flags dw ?
|
||
_es dw ?
|
||
_ds dw ?
|
||
_fs dw ?
|
||
_gs dw ?
|
||
_ip dw ?
|
||
_cs dw ?
|
||
_sp dw ?
|
||
_ss dw ?
|
||
dd ?
|
||
dd ?
|
||
size_ref db ?
|
||
ENDS
|
||
|
||
|
||
CODESEG
|
||
|
||
; int DPMI_real_alloc ( UINT , SEGREG * , USHORT * ) ;
|
||
|
||
PROC DPMI_real_alloc C near
|
||
USES ebx , edx
|
||
ARG paragra : DWORD
|
||
ARG blk_segptr : DWORD
|
||
ARG largest_blkptr : DWORD
|
||
|
||
mov eax, 0100h
|
||
mov ebx, [paragra]
|
||
int DPMI_INTR
|
||
|
||
jnc ??dpmi_succed
|
||
mov ebx, [largest_blkptr]
|
||
mov [ word ptr ebx ] , bx
|
||
movzx eax , al
|
||
ret
|
||
|
||
??dpmi_succed:
|
||
mov ebx, [blk_segptr]
|
||
mov [(type SEGSEL ptr ebx). segmen ] , ax
|
||
mov [(type SEGSEL ptr ebx). select ] , dx
|
||
xor eax , eax
|
||
ret
|
||
|
||
ENDP DPMI_real_alloc
|
||
|
||
|
||
;**************************************************************************
|
||
; int DPMI_real_free ( UINT ) ;
|
||
|
||
PROC DPMI_real_free C near
|
||
USES eax , edx
|
||
ARG blk_selec : DWORD
|
||
|
||
mov eax, 0101h
|
||
mov edx, [blk_selec]
|
||
shr edx , 16
|
||
int DPMI_INTR
|
||
ret
|
||
ENDP DPMI_real_free
|
||
|
||
|
||
PROC DPMI_real_intr C near
|
||
USES eax , ebx , ecx , edx , edi , esi
|
||
ARG vector : dword
|
||
ARG regs_ptr: dword
|
||
ARG sreg_ptr: dword
|
||
|
||
LOCAL regblk : DPMI_REGS
|
||
|
||
lea edi , [ regblk ]
|
||
xor eax , eax
|
||
lea ecx , [ regblk . size_ref ]
|
||
sub ecx , edi
|
||
shr ecx , 2
|
||
rep stosd
|
||
|
||
mov ebx , [ regs_ptr ]
|
||
mov eax , [ (type REGS ptr ebx) . _eax ]
|
||
mov [ regblk . _eax ] , eax
|
||
|
||
mov eax , [ (type REGS ptr ebx) . _ebx ]
|
||
mov [ regblk . _ebx ] , eax
|
||
|
||
mov eax , [ (type REGS ptr ebx) . _ecx ]
|
||
mov [ regblk . _ecx ] , eax
|
||
|
||
mov eax , [ (type REGS ptr ebx) . _edx ]
|
||
mov [ regblk . _edx ] , eax
|
||
|
||
mov eax , [ (type REGS ptr ebx) . _esi ]
|
||
mov [ regblk . _esi ] , eax
|
||
|
||
mov eax , [ (type REGS ptr ebx) . _edi ]
|
||
mov [ regblk . _edi ] , eax
|
||
|
||
|
||
mov ebx , [ sreg_ptr ]
|
||
mov ax , [ (type SREGS ptr ebx) . _es ]
|
||
mov [ regblk . _es ] , ax
|
||
|
||
mov ax , [ (type SREGS ptr ebx) . _ds ]
|
||
mov [ regblk . _ds ] , ax
|
||
|
||
mov eax , 0300h
|
||
mov ebx , [ vector ]
|
||
xor bh , bh
|
||
xor ecx , ecx
|
||
lea edi , [ regblk ]
|
||
|
||
int DPMI_INTR
|
||
|
||
mov ebx , [ regs_ptr ]
|
||
mov eax , [ regblk . _eax ]
|
||
mov [ (type REGS ptr ebx) . _eax ] , eax
|
||
|
||
mov eax , [ regblk . _ebx ]
|
||
mov [ (type REGS ptr ebx) . _ebx ] , eax
|
||
|
||
mov eax , [ regblk . _ecx ]
|
||
mov [ (type REGS ptr ebx) . _ecx ] , eax
|
||
|
||
mov eax , [ regblk . _edx ]
|
||
mov [ (type REGS ptr ebx) . _edx ] , eax
|
||
|
||
mov eax , [ regblk . _esi ]
|
||
mov [ (type REGS ptr ebx) . _esi ] , eax
|
||
|
||
mov eax , [ regblk . _edi ]
|
||
mov [ (type REGS ptr ebx) . _edi ] , eax
|
||
|
||
|
||
mov ebx , [ sreg_ptr ]
|
||
mov ax , [ regblk . _es ]
|
||
mov [ (type SREGS ptr ebx) . _es ] , ax
|
||
|
||
mov ax , [ regblk . _ds ]
|
||
mov [ (type SREGS ptr ebx) . _ds ] , ax
|
||
|
||
ret
|
||
ENDP DPMI_real_intr
|
||
|
||
|
||
PROC DPMI_real_call C near
|
||
USES eax , ebx , ecx , edx , edi , esi
|
||
ARG vector : dword
|
||
ARG regs_ptr: dword
|
||
ARG sreg_ptr: dword
|
||
|
||
LOCAL regblk : DPMI_REGS
|
||
|
||
|
||
lea edi , [ regblk ]
|
||
xor al , al
|
||
lea ecx , [ regblk . size_ref ]
|
||
sub ecx , edi
|
||
rep movsb
|
||
|
||
|
||
mov ebx , [ regs_ptr ]
|
||
mov eax , [ (type REGS ptr ebx) . _eax ]
|
||
mov [ regblk . _eax ] , eax
|
||
|
||
mov eax , [ (type REGS ptr ebx) . _ebx ]
|
||
mov [ regblk . _ebx ] , eax
|
||
|
||
mov eax , [ (type REGS ptr ebx) . _ecx ]
|
||
mov [ regblk . _ecx ] , eax
|
||
|
||
mov eax , [ (type REGS ptr ebx) . _edx ]
|
||
mov [ regblk . _edx ] , eax
|
||
|
||
mov eax , [ (type REGS ptr ebx) . _esi ]
|
||
mov [ regblk . _esi ] , eax
|
||
|
||
mov eax , [ (type REGS ptr ebx) . _edi ]
|
||
mov [ regblk . _edi ] , eax
|
||
|
||
|
||
mov ebx , [ sreg_ptr ]
|
||
mov ax , [ (type SREGS ptr ebx) . _es ]
|
||
mov [ regblk . _es ] , ax
|
||
|
||
mov ax , [ (type SREGS ptr ebx) . _ds ]
|
||
mov [ regblk . _ds ] , ax
|
||
|
||
; mov eax , 0300h
|
||
; mov ebx , [ vector ]
|
||
; xor bh , bh
|
||
; xor ecx , ecx
|
||
; lea edi , [ regblk ]
|
||
|
||
; int DPMI_INTR
|
||
|
||
mov ebx , [ regs_ptr ]
|
||
mov eax , [ regblk . _eax ]
|
||
mov [ (type REGS ptr ebx) . _eax ] , eax
|
||
mov eax , [ regblk . _ebx ]
|
||
mov [ (type REGS ptr ebx) . _ebx ] , eax
|
||
mov eax , [ regblk . _ecx ]
|
||
mov [ (type REGS ptr ebx) . _ecx ] , eax
|
||
mov eax , [ regblk . _edx ]
|
||
mov [ (type REGS ptr ebx) . _edx ] , eax
|
||
|
||
mov eax , [ regblk . _esi ]
|
||
mov [ (type REGS ptr ebx) . _esi ] , eax
|
||
mov eax , [ regblk . _edi ]
|
||
mov [ (type REGS ptr ebx) . _edi ] , eax
|
||
|
||
|
||
mov ebx , [ sreg_ptr ]
|
||
mov ax , [ regblk . _es ]
|
||
mov [ (type SREGS ptr ebx) . _es ] , ax
|
||
|
||
mov ax , [ regblk . _ds ]
|
||
mov [ (type SREGS ptr ebx) . _ds ] , ax
|
||
|
||
ret
|
||
ENDP DPMI_real_call
|
||
|
||
END
|
||
|
||
|
||
|