3 title Limited assembler to C interface
;AN000;
4 ;-------------------------------------------------------------------
9 ; This routine is used as to map the assembly language
10 ; call made by xxx to a C language call.
14 ; ES:DI points to the buffer area where the table data
21 ;-------------------------------------------------------------------
24 public gget_status
;AN000;
25 public asm2cInRegs
;AN000;
26 public asm2coutregs
;AN000;
27 public asm2csegregs
;AN000;
29 _TEXT
segment byte public 'CODE' ;AN000;
31 _DATA
segment word public 'DATA' ;AN000;
33 CONST
segment word public 'CONST' ;AN000;
35 _BSS
segment word public 'BSS' ;AN000;
37 DGROUP GROUP CONST
, _BSS
, _DATA
;AN000;
39 _DATA
segment word public 'DATA' ;AN000;
41 ;-------------------------------------------------------------------
42 ; define an assembly language version of the C regs structure
43 ;-------------------------------------------------------------------
45 asm2cInRegs equ
$ ;AN000;
55 Asm2cOutRegs equ
$ ;AN000;
66 Asm2cSegRegs equ
$ ;AN000;
72 extrn _end
:far ;AN000;
76 _TEXT
segment byte public 'CODE' ;AN000;
78 extrn _get_status
:near ;AN000;
80 ASSUME
CS: _TEXT
;AN000;
81 assume
ds: nothing
;AN000;
82 assume
es: nothing
;AN000;
83 ;-------------------------------------------------------------------
84 ;-------------------------------------------------------------------
86 ;-------------------------------------------------------------------
89 ; This routine will reside in the C code segment
91 ;-------------------------------------------------------------------
93 segment_of_dgroup dw seg dgroup
;AN000;
95 SAVE_STACK
LABEL DWORD ;AN000;
102 gget_status proc
far ;AN000;
104 MOV SAVE_DS
,DS ;AN000;
105 MOV SAVE_ES
,ES ;AN000;
107 MOV SAVE_SS
,SS ;AN000;
108 MOV SAVE_SP
,SP ;AN000;
110 mov ss,segment_of_dgroup
;AN000;
111 add sp,offset DGROUP
:_end
;AN000;
112 ASSUME
SS: DGROUP
;AN000;
114 MOV DS,segment_of_dgroup
;AN000;
115 ASSUME
DS: DGROUP
;AN000;
117 ;-------------------------------------------------------------------
119 ;-------------------------------------------------------------------
121 mov i_ax
,ax ;AN000; make InRegs look like real registers
128 ;-------------------------------------------------------------------
130 ;-------------------------------------------------------------------
132 IRP XX
,<ES,SS,DS> ;AN000;
133 MOV AX,SAVE_
&XX
;AN000;
139 ;-------------------------------------------------------------------
140 ; put far pointers on stack
141 ;-------------------------------------------------------------------
143 ; push ds ; push far pointer to SegRegs
144 lea ax,DGROUP
:Asm2cSegRegs
;AN000;
147 ; push ds ; push far pointer to OutRegs
148 lea ax,DGROUP
:Asm2cOutRegs
;AN000;
151 ; push ds ; push far pointer to InRegs
152 lea ax,DGROUP
:Asm2cInRegs
;AN000;
155 ;-------------------------------------------------------------------
156 call _get_status
;AN000;
157 ;-------------------------------------------------------------------
159 ;-------------------------------------------------------------------
160 ; set up real registers
161 ;-------------------------------------------------------------------
163 mov ax,o_ax
;AN000; make real registers look like OutRegs
170 ;-------------------------------------------------------------------
171 ; must remove the things we put on the stack
172 ;-------------------------------------------------------------------
174 MOV DS,SAVE_DS
;AN000;
175 MOV ES,SAVE_ES
;AN000;
176 MOV SS,SAVE_SS
;AN000;
177 MOV SP,SAVE_SP
;AN000;
182 gget_status endp
;AN000;
184 _TEXT ends
;AN000; end code segment
186 ;-------------------------------------------------------------------
187 ;-------------------------------------------------------------------