3 title C to Message Retriever
4 ;-------------------------------------------------------------------
8 ; PURPOSE: Supplies an interface between C programs and
9 ; the DOS 3.3 message retriever
12 ; msgret(&inregs,&outregs);
16 ;-------------------------------------------------------------------
18 INCLUDE SYSMSG
.INC ;PERMIT SYSTEM MESSAGE HANDLER DEFINITION ;AN000;
20 MSG_UTILNAME
<MEM
> ;IDENTIFY THE COMPONENT ;AN000;
22 ;-------------------------------------------------------------------
23 ;-------------------------------------------------------------------
26 _TEXT
SEGMENT BYTE PUBLIC 'CODE'
28 _DATA
SEGMENT WORD PUBLIC 'DATA'
30 CONST
SEGMENT WORD PUBLIC 'CONST'
32 _BSS
SEGMENT WORD PUBLIC 'BSS'
35 DGROUP GROUP CONST
, _BSS
, _DATA
36 ASSUME
CS: DGROUP
, DS: DGROUP
, SS: DGROUP
, ES: NOTHING
38 public data_sysloadmsg
39 public data_sysdispmsg
44 MSG_SERVICES
<MSGDATA
>
45 MSG_SERVICES
<LOADmsg
,FARmsg
>
46 MSG_SERVICES
<DISPLAYmsg
,GETmsg
,CHARmsg
,NUMmsg
>
47 MSG_SERVICES
<MEM
.CLA
,MEM
.CLB
,MEM
.CL1
,MEM
.CL2
,MEM
.CTL
> ;AN000;
50 data_sysloadmsg proc
far
52 push bp ; save user's base pointer
53 mov bp,sp ; set bp to current sp
54 push di ; save some registers
57 ; copy C inregs into proper registers
59 mov di,[bp+4+4] ; fix di (arg 0)
61 ;-------------------------------------------------------------------
63 mov ax,[di+0ah] ; load di
64 push ax ; the di value from inregs is now on stack
66 mov ax,[di+00] ; get inregs.x.ax
67 mov bx,[di+02] ; get inregs.x.bx
68 mov cx,[di+04] ; get inregs.x.cx
69 mov dx,[di+06] ; get inregs.x.dx
70 mov si,[di+08] ; get inregs.x.si
71 pop di ; get inregs.x.di from stack
73 push bp ; save base pointer
75 ;-------------------------------------------------------------------
77 call sysloadmsg
; call the message retriever
79 ;-------------------------------------------------------------------
81 pop bp ; restore base pointer
82 push di ; the di value from call is now on stack
83 mov di,[bp+6+4] ; fix di (arg 1)
85 mov [di+00],ax ; load outregs.x.ax
86 mov [di+02],bx ; load outregs.x.bx
87 mov [di+04],cx ; load outregs.x.cx
88 mov [di+06],dx ; load outregs.x.dx
89 mov [di+08],si ; load outregs.x.si
91 lahf ; get flags into ax
92 mov al,ah ; move into low byte
93 mov [di+0ch],ax ; load outregs.x.cflag
95 pop ax ; get di from stack
96 mov [di+0ah],ax ; load outregs.x.di
98 ;-------------------------------------------------------------------
100 pop si ; restore registers
102 mov sp,bp ; restore sp
103 pop bp ; restore user's bp
109 data_sysdispmsg proc
far
111 push bp ; save user's base pointer
112 mov bp,sp ; set bp to current sp
113 push di ; save some registers
116 ; copy C inregs into proper registers
118 mov di,[bp+4+4] ; fix di (arg 0)
120 ;-------------------------------------------------------------------
122 mov ax,[di+0ah] ; load di
123 push ax ; the di value from inregs is now on stack
125 mov ax,[di+00] ; get inregs.x.ax
126 mov bx,[di+02] ; get inregs.x.bx
127 mov cx,[di+04] ; get inregs.x.cx
128 mov dx,[di+06] ; get inregs.x.dx
129 mov si,[di+08] ; get inregs.x.si
130 pop di ; get inregs.x.di from stack
132 push bp ; save base pointer
134 ;-------------------------------------------------------------------
138 ;-------------------------------------------------------------------
140 pop bp ; restore base pointer
141 push di ; the di value from call is now on stack
142 mov di,[bp+6+4] ; fix di (arg 1)
144 mov [di+00],ax ; load outregs.x.ax
145 mov [di+02],bx ; load outregs.x.bx
146 mov [di+04],cx ; load outregs.x.cx
147 mov [di+06],dx ; load outregs.x.dx
148 mov [di+08],si ; load outregs.x.si
150 lahf ; get flags into ax
151 mov al,ah ; move into low byte
152 mov [di+0ch],ax ; load outregs.x.cflag
154 pop ax ; get di from stack
155 mov [di+0ah],ax ; load outregs.x.di
157 ;-------------------------------------------------------------------
159 pop si ; restore registers
161 mov sp,bp ; restore sp
162 pop bp ; restore user's bp
168 data_sysgetmsg proc
far
170 push bp ; save user's base pointer
171 mov bp,sp ; set bp to current sp
172 push di ; save some registers
175 ; copy C inregs into proper registers
177 mov di,[bp+4+4] ; fix di (arg 0)
179 ;-------------------------------------------------------------------
181 mov ax,[di+0ah] ; load di
182 push ax ; the di value from inregs is now on stack
184 mov ax,[di+00] ; get inregs.x.ax
185 mov bx,[di+02] ; get inregs.x.bx
186 mov cx,[di+04] ; get inregs.x.cx
187 mov dx,[di+06] ; get inregs.x.dx
188 mov si,[di+08] ; get inregs.x.si
189 pop di ; get inregs.x.di from stack
191 push bp ; save base pointer
193 ;-------------------------------------------------------------------
195 call sysgetmsg
; call the message retriever
197 ;-------------------------------------------------------------------
199 pop bp ; restore base pointer
200 push di ; the di value from call is now on stack
201 mov di,[bp+6+4] ; fix di (arg 1)
204 mov [di+00],es ; load segregs.es
205 mov [di+06],ds ; load outregs.ds
210 mov di,[bp+8+4] ; fix di (arg 2)
211 mov [di+00],ax ; load outregs.x.ax
212 mov [di+02],bx ; load outregs.x.bx
213 mov [di+04],cx ; load outregs.x.cx
214 mov [di+06],dx ; load outregs.x.dx
215 mov [di+08],si ; load outregs.x.si
217 lahf ; get flags into ax
218 mov al,ah ; move into low byte
219 mov [di+0ch],ax ; load outregs.x.cflag
221 pop ax ; get di from stack
222 mov [di+0ah],ax ; load outregs.x.di
224 ;-------------------------------------------------------------------
226 pop si ; restore registers
228 mov sp,bp ; restore sp
229 pop bp ; restore user's bp
236 _DATA ends
; end code segment
246 _sysdispmsg proc
near
251 _sysloadmsg proc
near