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 ;AC010;
20 MSG_UTILNAME
<FDISK
> ;IDENTIFY THE COMPONENT ;AC010;
22 ;-------------------------------------------------------------------
23 ;-------------------------------------------------------------------
26 _TEXT
SEGMENT BYTE PUBLIC 'CODE' ;AC010;
28 _DATA
SEGMENT WORD PUBLIC 'DATA' ;AC010;
30 CONST
SEGMENT WORD PUBLIC 'CONST' ;AC010;
32 _BSS
SEGMENT WORD PUBLIC 'BSS' ;AC010;
35 DGROUP GROUP CONST
, _BSS
, _DATA
;AC010;
36 ASSUME
CS: DGROUP
, DS: DGROUP
, SS: DGROUP
, ES: NOTHING
;AC010;
38 public data_sysloadmsg
;AC010;
39 public data_sysdispmsg
;AC010;
40 public data_sysgetmsg
;AC010;
44 MSG_SERVICES
<MSGDATA
> ;AC010;
45 MSG_SERVICES
<LOADmsg
,FARmsg
> ;AC010;
46 MSG_SERVICES
<DISPLAYmsg
,GETmsg
,CHARmsg
,NUMmsg
> ;AC010;
47 MSG_SERVICES
<FDISK
.CLA
,FDISK
.CLB
,FDISK
.CL1
,FDISK
.CL2
,FDISK
.CTL
> ;AC010; ;AC010;
50 data_sysloadmsg proc
far
52 push bp ; save user's base pointer ;AC010;
53 mov bp,sp ; set bp to current sp ;AC010;
54 push di ; save some registers ;AC010;
57 ; copy C inregs into proper registers
59 mov di,[bp+4+4] ; fix di (arg 0) ;AC010;
61 ;-------------------------------------------------------------------
63 mov ax,[di+0ah] ; load di ;AC010;
64 push ax ; the di value from inregs is now on stack ;AC010;
66 mov ax,[di+00] ; get inregs.x.ax ;AC010;
67 mov bx,[di+02] ; get inregs.x.bx ;AC010;
68 mov cx,[di+04] ; get inregs.x.cx ;AC010;
69 mov dx,[di+06] ; get inregs.x.dx ;AC010;
70 mov si,[di+08] ; get inregs.x.si ;AC010;
71 pop di ; get inregs.x.di from stack ;AC010;
73 push bp ; save base pointer ;AC010;
75 ;-------------------------------------------------------------------
77 call sysloadmsg
; call the message retriever ;AC010;
79 ;-------------------------------------------------------------------
81 pop bp ; restore base pointer ;AC010;
82 push di ; the di value from call is now on stack ;AC010;
83 mov di,[bp+6+4] ; fix di (arg 1) ;AC010;
85 mov [di+00],ax ; load outregs.x.ax ;AC010;
86 mov [di+02],bx ; load outregs.x.bx ;AC010;
87 mov [di+04],cx ; load outregs.x.cx ;AC010;
88 mov [di+06],dx ; load outregs.x.dx ;AC010;
89 mov [di+08],si ; load outregs.x.si ;AC010;
91 lahf ; get flags into ax ;AC010;
92 mov al,ah ; move into low byte ;AC010;
93 mov [di+0ch],ax ; load outregs.x.cflag ;AC010;
95 pop ax ; get di from stack ;AC010;
96 mov [di+0ah],ax ; load outregs.x.di ;AC010;
98 ;-------------------------------------------------------------------
100 pop si ; restore registers ;AC010;
102 mov sp,bp ; restore sp ;AC010;
103 pop bp ; restore user's bp ;AC010;
106 data_sysloadmsg endp
;AC010;
109 data_sysdispmsg proc
far ;AC010;
111 push bp ; save user's base pointer ;AC010;
112 mov bp,sp ; set bp to current sp ;AC010;
113 push di ; save some registers ;AC010;
116 ; copy C inregs into proper registers
118 mov di,[bp+4+4] ; fix di (arg 0) ;AC010;
120 ;-------------------------------------------------------------------
122 mov ax,[di+0ah] ; load di ;AC010;
123 push ax ; the di value from inregs is now on stack ;AC010;
125 mov ax,[di+00] ; get inregs.x.ax ;AC010;
126 mov bx,[di+02] ; get inregs.x.bx ;AC010;
127 mov cx,[di+04] ; get inregs.x.cx ;AC010;
128 mov dx,[di+06] ; get inregs.x.dx ;AC010;
129 mov si,[di+08] ; get inregs.x.si ;AC010;
130 pop di ; get inregs.x.di from stack ;AC010;
132 push bp ; save base pointer ;AC010;
134 ;-------------------------------------------------------------------
136 call sysdispmsg
;AC010;
138 ;-------------------------------------------------------------------
140 pop bp ; restore base pointer ;AC010;
141 push di ; the di value from call is now on stack ;AC010;
142 mov di,[bp+6+4] ; fix di (arg 1) ;AC010;
144 mov [di+00],ax ; load outregs.x.ax ;AC010;
145 mov [di+02],bx ; load outregs.x.bx ;AC010;
146 mov [di+04],cx ; load outregs.x.cx ;AC010;
147 mov [di+06],dx ; load outregs.x.dx ;AC010;
148 mov [di+08],si ; load outregs.x.si ;AC010;
150 lahf ; get flags into ax ;AC010;
151 mov al,ah ; move into low byte ;AC010;
152 mov [di+0ch],ax ; load outregs.x.cflag ;AC010;
154 pop ax ; get di from stack ;AC010;
155 mov [di+0ah],ax ; load outregs.x.di ;AC010;
157 ;-------------------------------------------------------------------
159 pop si ; restore registers ;AC010;
161 mov sp,bp ; restore sp ;AC010;
162 pop bp ; restore user's bp ;AC010;
165 data_sysdispmsg endp
;AC010;
168 data_sysgetmsg proc
far ;AC010;
170 push bp ; save user's base pointer ;AC010;
171 mov bp,sp ; set bp to current sp ;AC010;
172 push di ; save some registers ;AC010;
175 ; copy C inregs into proper registers
177 mov di,[bp+4+4] ; fix di (arg 0) ;AC010;
179 ;-------------------------------------------------------------------
181 mov ax,[di+0ah] ; load di ;AC010;
182 push ax ; the di value from inregs is now on stack ;AC010;
184 mov ax,[di+00] ; get inregs.x.ax ;AC010;
185 mov bx,[di+02] ; get inregs.x.bx ;AC010;
186 mov cx,[di+04] ; get inregs.x.cx ;AC010;
187 mov dx,[di+06] ; get inregs.x.dx ;AC010;
188 mov si,[di+08] ; get inregs.x.si ;AC010;
189 pop di ; get inregs.x.di from stack ;AC010;
191 push bp ; save base pointer ;AC010;
193 ;-------------------------------------------------------------------
195 call sysgetmsg
; call the message retriever ;AC010;
197 ;-------------------------------------------------------------------
199 pop bp ; restore base pointer ;AC010;
200 push di ; the di value from call is now on stack ;AC010;
201 mov di,[bp+6+4] ; fix di (arg 1) ;AC010;
203 push ax ; save ax ;AC010;
204 mov [di+00],es ; load segregs.es ;AC010;
205 mov [di+06],ds ; load outregs.ds ;AC010;
206 pop ax ; restore ax ;AC010;
208 pop di ; restore di ;AC010;
209 push di ; save it ;AC010;
210 mov di,[bp+8+4] ; fix di (arg 2) ;AC010;
211 mov [di+00],ax ; load outregs.x.ax ;AC010;
212 mov [di+02],bx ; load outregs.x.bx ;AC010;
213 mov [di+04],cx ; load outregs.x.cx ;AC010;
214 mov [di+06],dx ; load outregs.x.dx ;AC010;
215 mov [di+08],si ; load outregs.x.si ;AC010;
217 lahf ; get flags into ax ;AC010;
218 mov al,ah ; move into low byte ;AC010;
219 mov [di+0ch],ax ; load outregs.x.cflag ;AC010;
221 pop ax ; get di from stack ;AC010;
222 mov [di+0ah],ax ; load outregs.x.di ;AC010;
224 ;-------------------------------------------------------------------
226 pop si ; restore registers ;AC010;
228 mov sp,bp ; restore sp ;AC010;
229 pop bp ; restore user's bp ;AC010;
232 data_sysgetmsg endp
;AC010;
235 _DATA ends
; end code segment ;AC010;
237 _TEXT
SEGMENT ;AC010;
239 assume
cs:_TEXT
;AC010;
241 public _sysdispmsg
;AC010;
242 public _sysloadmsg
;AC010;
243 public _sysgetmsg
;AC010;
245 _sysdispmsg proc
near ;AC010;
246 call data_sysdispmsg
;AC010;
248 _sysdispmsg endp
;AC010;
250 _sysloadmsg proc
near ;AC010;
251 call data_sysloadmsg
;AC010;
253 _sysloadmsg endp
;AC010;
255 _sysgetmsg proc
near ;AC010;
256 call data_sysgetmsg
;AC010;
258 _sysgetmsg endp
;AC010;