summaryrefslogtreecommitdiff
path: root/v4.0/src/SELECT/ASM2C.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/SELECT/ASM2C.ASM')
-rw-r--r--v4.0/src/SELECT/ASM2C.ASM191
1 files changed, 191 insertions, 0 deletions
diff --git a/v4.0/src/SELECT/ASM2C.ASM b/v4.0/src/SELECT/ASM2C.ASM
new file mode 100644
index 0000000..f74da98
--- /dev/null
+++ b/v4.0/src/SELECT/ASM2C.ASM
@@ -0,0 +1,191 @@
1page 60,132 ;AN000;
2name asm2c ;AN000;
3title 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;
33CONST segment word public 'CONST' ;AN000;
34CONST ends ;AN000;
35_BSS segment word public 'BSS' ;AN000;
36_BSS ends ;AN000;
37DGROUP 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
45asm2cInRegs equ $ ;AN000;
46
47i_ax dw 0 ;AN000;
48i_bx dw 0 ;AN000;
49i_cx dw 0 ;AN000;
50i_dx dw 0 ;AN000;
51i_si dw 0 ;AN000;
52i_di dw 0 ;AN000;
53i_cflag dw 0 ;AN000;
54
55Asm2cOutRegs equ $ ;AN000;
56
57o_ax dw 0 ;AN000;
58o_bx dw 0 ;AN000;
59o_cx dw 0 ;AN000;
60o_dx dw 0 ;AN000;
61o_si dw 0 ;AN000;
62o_di dw 0 ;AN000;
63o_cflag dw 0 ;AN000;
64
65
66Asm2cSegRegs equ $ ;AN000;
67s_es dw 0 ;AN000;
68s_cs dw 0 ;AN000;
69s_ss dw 0 ;AN000;
70s_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;-------------------------------------------------------------------
85page ;AN000;
86;-------------------------------------------------------------------
87; ggetstatus
88;
89; This routine will reside in the C code segment
90;
91;-------------------------------------------------------------------
92
93segment_of_dgroup dw seg dgroup;AN000;
94
95SAVE_STACK LABEL DWORD ;AN000;
96SAVE_SP DW 0 ;AN000;
97SAVE_SS DW 0 ;AN000;
98
99SAVE_DS DW 0 ;AN000;
100SAVE_ES DW 0 ;AN000;
101
102gget_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
182gget_status endp ;AN000;
183
184_TEXT ends ;AN000; end code segment
185
186;-------------------------------------------------------------------
187;-------------------------------------------------------------------
188
189
190 end ;AN000;
191