|
|
page ,132 .listall
;Thunk Compiler Version 1.8 Dec 14 1994 14:53:05 ;File Compiled Fri Jun 20 10:27:33 1997
;Command Line: thunk -P2 -NC ddraw -t thk1632 ..\16to32.thk -o 16to32.asm
TITLE $16to32.asm
.386 OPTION READONLY
IFNDEF IS_16 IFNDEF IS_32 %out command line error: specify one of -DIS_16 -DIS_32
.err ENDIF ENDIF IFDEF IS_16 IFDEF IS_32 %out command line error: you can't specify both -DIS_16 and -DIS_32
.err ENDIF
OPTION SEGMENT:USE16 .model LARGE,PASCAL
f32ptr typedef ptr far32
externDef DDHAL32_VidMemFree:far16 externDef DDHAL32_VidMemAlloc:far16
externDef C16ThkSL01:far16 externDef __FLATCS:ABS externDef __FLATDS:ABS
.data
public thk1632_ThunkData16 ;This symbol must be exported. thk1632_ThunkData16 dd 31304c53h ;Protocol 'SL01' dd 0fa1h ;Checksum dd 0 ;Flags. dd 0 ;RESERVED. MUST BE ZERO. dd 0 ;RESERVED. MUST BE ZERO. dd 0 ;RESERVED. MUST BE ZERO. dd 0 ;RESERVED. MUST BE ZERO. dd 3130424ch ;Late-binding signature 'LB01' dd 080000000h ;More flags. dd 0 ;RESERVED. MUST BE ZERO. dw offset thk1632_ThunkData16ApiDatabase dw seg thk1632_ThunkData16ApiDatabase
;; Api database. Each entry == 8 bytes: ;; byte 0: # of argument bytes. ;; byte 1,2,3: Reserved: Must initialize to 0. ;; dword 4: error return value. public thk1632_ThunkData16ApiDatabase thk1632_ThunkData16ApiDatabase label dword db 10 db 0,0,0 dd -1 db 14 db 0,0,0 dd 0
.code ddraw
externDef ThunkConnect16:far16
public thk1632_ThunkConnect16 thk1632_ThunkConnect16: pop ax pop dx push seg thk1632_ThunkData16 push offset thk1632_ThunkData16 push seg thk1632_TD32Label push offset thk1632_TD32Label push cs push dx push ax jmp ThunkConnect16 thk1632_TD32Label label byte db "thk1632_ThunkData32",0
DDHAL32_VidMemFree label far16 mov cx,0 ; offset in jump table jmp thk1632EntryCommon
DDHAL32_VidMemAlloc label far16 mov cx,4 ; offset in jump table jmp thk1632EntryCommon
;=========================================================================== ; This is the common setup code for 16=>32 thunks. ; ; Entry: cx = offset in flat jump table ; ; Don't optimize this code: C16ThkSL01 overwrites it ; after each discard.
align thk1632EntryCommon: db 0ebh, 030 ;Jump short forward 30 bytes. ;;; Leave at least 30 bytes for C16ThkSL01's code patching. db 30 dup(0cch) ;Patch space. push seg thk1632_ThunkData16 push offset thk1632_ThunkData16 pop edx push cs push offset thk1632EntryCommon pop eax jmp C16ThkSL01
ELSE ; IS_32 .model FLAT,STDCALL
include thk.inc include 16to32.inc
externDef STDCALL DDHAL32_VidMemFree@12:near32 externDef STDCALL DDHAL32_VidMemAlloc@16:near32
externDef C DebugPrintf:near32
MapSLFix proto STDCALL :DWORD MapSL proto STDCALL :DWORD UnMapSLFixArray proto STDCALL :DWORD, :DWORD LocalAlloc proto STDCALL :DWORD, :DWORD LocalFree proto STDCALL :DWORD
externDef MapHInstSL:near32 externDef MapHInstSL_PN:near32 externDef MapHInstLS:near32 externDef MapHInstLS_PN:near32 externDef T_DDHAL32_VIDMEMFREE:near32 externDef T_DDHAL32_VIDMEMALLOC:near32
;=========================================================================== .code
; This is a jump table to API-specific flat thunk code.
align thk1632_JumpTable label dword dd offset FLAT:T_DDHAL32_VIDMEMFREE dd offset FLAT:T_DDHAL32_VIDMEMALLOC
thk1632_ThunkDataName label byte db "thk1632_ThunkData16",0
.data
public thk1632_ThunkData32 ;This symbol must be exported. thk1632_ThunkData32 dd 31304c53h ;Protocol 'SL01' dd 0fa1h ;Checksum dd 0 ;Reserved (MUST BE 0) dd 0 ;Flat address of ThunkData16 dd 3130424ch ;'LB01' dd 0 ;Flags dd 0 ;Reserved (MUST BE 0) dd 0 ;Reserved (MUST BE 0) dd offset thk1632_JumpTable - offset thk1632_ThunkDataName
.code
externDef ThunkConnect32@24:near32
public thk1632_ThunkConnect32@16 thk1632_ThunkConnect32@16: pop edx push offset thk1632_ThunkDataName push offset thk1632_ThunkData32 push edx jmp ThunkConnect32@24
;=========================================================================== ; Common routines to restore the stack and registers ; and return to 16-bit code. There is one for each ; size of 16-bit parameter list in this script.
align ExitFlat_10: mov cl,10 ; parameter byte count mov esp,ebp ; point to return address retn ; return to dispatcher
align ExitFlat_14: mov cl,14 ; parameter byte count mov esp,ebp ; point to return address retn ; return to dispatcher
;=========================================================================== T_DDHAL32_VIDMEMFREE label near32
; ebx+28 this ; ebx+26 heap ; ebx+22 ptr APILOGSL DDHAL32_VidMemFree
;------------------------------------- ; create new call frame and make the call
; ptr from: unsigned long push dword ptr [ebx+22] ; to unsigned long
; heap from: short movsx eax,word ptr [ebx+26] push eax ; to: long
; this from: unsigned long push dword ptr [ebx+28] ; to unsigned long
call DDHAL32_VidMemFree@12 ; call 32-bit version ; return code unsigned long --> unsigned long mov edx,eax rol edx,16
;------------------------------------- jmp ExitFlat_10
;=========================================================================== T_DDHAL32_VIDMEMALLOC label near32
; ebx+32 this ; ebx+30 heap ; ebx+26 width ; ebx+22 height APILOGSL DDHAL32_VidMemAlloc
;------------------------------------- ; create new call frame and make the call
; height from: unsigned long push dword ptr [ebx+22] ; to unsigned long
; width from: unsigned long push dword ptr [ebx+26] ; to unsigned long
; heap from: short movsx eax,word ptr [ebx+30] push eax ; to: long
; this from: unsigned long push dword ptr [ebx+32] ; to unsigned long
call DDHAL32_VidMemAlloc@16 ; call 32-bit version ; return code unsigned long --> unsigned long mov edx,eax rol edx,16
;------------------------------------- jmp ExitFlat_14
ENDIF END
|