forked from volkertb/boxv9x
-
Notifications
You must be signed in to change notification settings - Fork 0
/
dibthunk.asm
112 lines (98 loc) · 3.48 KB
/
dibthunk.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Copyright (c) 2022 Michal Necasek
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in
; all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
; THE SOFTWARE.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Define a macro which produces a DIB engine thunk, taking care of all
; externs and publics.
; The DIB_xxxExt functions take one additional parameter. To minimize
; stack space copying and usage, the thunk pops off the return address,
; pushes the additional parameter (always the last parameter of
; DIB_xxxExt), pushes the return address back, and jumps to DIB_xxxExt.
; The AX, ECX, and ES registers are modified with no ill effect since
; they aren't used by the Pascal calling convention to pass arguments.
;; Thunk macro with additional parameters.
DIBTHK macro name, param
extrn DIB_&name&Ext : far
public name
name:
mov ax, DGROUP ; Load ES with our data segment.
mov es, ax
assume es:DGROUP
pop ecx ; Save the 16:16 return address in ECX.
push param ; Push the additional parameter.
push ecx ; Put the return address back.
jmp DIB_&name&Ext ; Off to the DIB Engine we go.
endm
;; Simple forwarder macro.
DIBFWD macro name
extrn DIB_&name : far
public name
name:
jmp DIB_&name ; Just jump to the DIB Engine.
endm
;; Additional variables that need to be pushed are in the data segment.
_DATA segment public 'DATA'
extrn _lpDriverPDevice : dword
extrn _wPalettized : word
_DATA ends
DGROUP group _DATA
_TEXT segment public 'CODE'
.386
assume ds:nothing, es:nothing
;; Thunks that push an additional parameter.
;; Sorted by ordinal number.
DIBTHK EnumObj, _lpDriverPDevice
DIBTHK RealizeObject, _lpDriverPDevice
DIBTHK DibBlt, _wPalettized
DIBTHK GetPalette, _lpDriverPDevice
DIBTHK SetPaletteTranslate, _lpDriverPDevice
DIBTHK GetPaletteTranslate, _lpDriverPDevice
DIBTHK UpdateColors, _lpDriverPDevice
DIBTHK SetCursor, _lpDriverPDevice
DIBTHK MoveCursor, _lpDriverPDevice
;; Forwarders that simply jump to the DIB Engine.
;; Sorted by ordinal number.
ifndef HWBLT
DIBFWD BitBlt
endif
DIBFWD ColorInfo
DIBFWD Control
DIBFWD EnumDFonts
DIBFWD Output
DIBFWD Pixel
DIBFWD Strblt
DIBFWD ScanLR
DIBFWD DeviceMode
DIBFWD ExtTextOut
DIBFWD GetCharWidth
DIBFWD DeviceBitmap
DIBFWD FastBorder
DIBFWD SetAttribute
DIBFWD CreateDIBitmap
DIBFWD DibToDevice
DIBFWD StretchBlt
DIBFWD StretchDIBits
DIBFWD SelectBitmap
DIBFWD BitmapBits
DIBFWD Inquire
_TEXT ends
end