]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/SELECT/ASM2C.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / SELECT / ASM2C.ASM
1 page 60,132 ;AN000;
2 name asm2c ;AN000;
3 title Limited assembler to C interface;AN000;
4 ;-------------------------------------------------------------------
5 ;
6 ; MODULE: asm2c
7 ;
8 ; PURPOSE:
9 ; This routine is used as to map the assembly language
10 ; call made by xxx to a C language call.
11 ;
12 ; INPUT:
13 ;
14 ; ES:DI points to the buffer area where the table data
15 ; will be copied
16 ;
17 ; CALLING FORMAT:
18 ;
19 ; DATE: 7-16-87
20 ;
21 ;-------------------------------------------------------------------
22
23
24 public gget_status ;AN000;
25 public asm2cInRegs ;AN000;
26 public asm2coutregs ;AN000;
27 public asm2csegregs ;AN000;
28
29 _TEXT segment byte public 'CODE' ;AN000;
30 _TEXT ends ;AN000;
31 _DATA segment word public 'DATA' ;AN000;
32 _DATA ends ;AN000;
33 CONST segment word public 'CONST' ;AN000;
34 CONST ends ;AN000;
35 _BSS segment word public 'BSS' ;AN000;
36 _BSS ends ;AN000;
37 DGROUP GROUP CONST, _BSS, _DATA ;AN000;
38
39 _DATA segment word public 'DATA' ;AN000;
40
41 ;-------------------------------------------------------------------
42 ; define an assembly language version of the C regs structure
43 ;-------------------------------------------------------------------
44
45 asm2cInRegs equ $ ;AN000;
46
47 i_ax dw 0 ;AN000;
48 i_bx dw 0 ;AN000;
49 i_cx dw 0 ;AN000;
50 i_dx dw 0 ;AN000;
51 i_si dw 0 ;AN000;
52 i_di dw 0 ;AN000;
53 i_cflag dw 0 ;AN000;
54
55 Asm2cOutRegs equ $ ;AN000;
56
57 o_ax dw 0 ;AN000;
58 o_bx dw 0 ;AN000;
59 o_cx dw 0 ;AN000;
60 o_dx dw 0 ;AN000;
61 o_si dw 0 ;AN000;
62 o_di dw 0 ;AN000;
63 o_cflag dw 0 ;AN000;
64
65
66 Asm2cSegRegs equ $ ;AN000;
67 s_es dw 0 ;AN000;
68 s_cs dw 0 ;AN000;
69 s_ss dw 0 ;AN000;
70 s_ds dw 0 ;AN000;
71
72 extrn _end:far ;AN000;
73
74 _DATA ends ;AN000;
75
76 _TEXT segment byte public 'CODE' ;AN000;
77
78 extrn _get_status:near ;AN000;
79
80 ASSUME CS: _TEXT ;AN000;
81 assume ds: nothing ;AN000;
82 assume es: nothing ;AN000;
83 ;-------------------------------------------------------------------
84 ;-------------------------------------------------------------------
85 page ;AN000;
86 ;-------------------------------------------------------------------
87 ; ggetstatus
88 ;
89 ; This routine will reside in the C code segment
90 ;
91 ;-------------------------------------------------------------------
92
93 segment_of_dgroup dw seg dgroup;AN000;
94
95 SAVE_STACK LABEL DWORD ;AN000;
96 SAVE_SP DW 0 ;AN000;
97 SAVE_SS DW 0 ;AN000;
98
99 SAVE_DS DW 0 ;AN000;
100 SAVE_ES DW 0 ;AN000;
101
102 gget_status proc far ;AN000;
103
104 MOV SAVE_DS,DS ;AN000;
105 MOV SAVE_ES,ES ;AN000;
106
107 MOV SAVE_SS,SS ;AN000;
108 MOV SAVE_SP,SP ;AN000;
109
110 mov ss,segment_of_dgroup ;AN000;
111 add sp,offset DGROUP:_end ;AN000;
112 ASSUME SS: DGROUP ;AN000;
113
114 MOV DS,segment_of_dgroup ;AN000;
115 ASSUME DS: DGROUP ;AN000;
116
117 ;-------------------------------------------------------------------
118 ; set up InRegs
119 ;-------------------------------------------------------------------
120
121 mov i_ax,ax ;AN000; make InRegs look like real registers
122 mov i_bx,bx ;AN000;
123 mov i_cx,cx ;AN000;
124 mov i_dx,dx ;AN000;
125 mov i_si,si ;AN000;
126 mov i_di,di ;AN000;
127
128 ;-------------------------------------------------------------------
129 ; set up SegRegs
130 ;-------------------------------------------------------------------
131
132 IRP XX,<ES,SS,DS> ;AN000;
133 MOV AX,SAVE_&XX ;AN000;
134 MOV S_&XX,AX ;AN000;
135 ENDM ;AN000;
136
137 mov s_cs,cs ;AN000;
138
139 ;-------------------------------------------------------------------
140 ; put far pointers on stack
141 ;-------------------------------------------------------------------
142
143 ; push ds ; push far pointer to SegRegs
144 lea ax,DGROUP:Asm2cSegRegs;AN000;
145 push ax ;AN000;
146
147 ; push ds ; push far pointer to OutRegs
148 lea ax,DGROUP:Asm2cOutRegs;AN000;
149 push ax ;AN000;
150
151 ; push ds ; push far pointer to InRegs
152 lea ax,DGROUP:Asm2cInRegs;AN000;
153 push ax ;AN000;
154
155 ;-------------------------------------------------------------------
156 call _get_status ;AN000;
157 ;-------------------------------------------------------------------
158 add sp,6 ;AN000;
159 ;-------------------------------------------------------------------
160 ; set up real registers
161 ;-------------------------------------------------------------------
162
163 mov ax,o_ax ;AN000; make real registers look like OutRegs
164 mov bx,o_bx ;AN000;
165 mov cx,o_cx ;AN000;
166 mov dx,o_dx ;AN000;
167 mov si,o_si ;AN000;
168 mov di,o_di ;AN000;
169
170 ;-------------------------------------------------------------------
171 ; must remove the things we put on the stack
172 ;-------------------------------------------------------------------
173
174 MOV DS,SAVE_DS ;AN000;
175 MOV ES,SAVE_ES ;AN000;
176 MOV SS,SAVE_SS ;AN000;
177 MOV SP,SAVE_SP ;AN000;
178
179 ret ;AN000;
180
181
182 gget_status endp ;AN000;
183
184 _TEXT ends ;AN000; end code segment
185
186 ;-------------------------------------------------------------------
187 ;-------------------------------------------------------------------
188
189
190 end ;AN000;
191