summaryrefslogtreecommitdiff
path: root/v4.0/src/SELECT/ASM2C.ASM
blob: f74da98858fc19cfe75ea15e2408303e7234246c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
page	60,132				;AN000;
name	asm2c				;AN000;
title	Limited assembler to C interface;AN000;
;-------------------------------------------------------------------
;
;	MODULE: 	asm2c
;
;	PURPOSE:
;		This routine is used as to map the assembly language
;		call made by xxx to a C language call.
;
;	INPUT:
;
;		ES:DI points to the buffer area where the table data
;		will be copied
;
;	CALLING FORMAT:
;
;	DATE:		7-16-87
;
;-------------------------------------------------------------------


	public	gget_status		;AN000;
	public	asm2cInRegs		;AN000;
	public	asm2coutregs		;AN000;
	public	asm2csegregs		;AN000;

_TEXT	segment byte public 'CODE'      ;AN000;
_TEXT	ends				;AN000;
_DATA	segment word public 'DATA'      ;AN000;
_DATA	ends				;AN000;
CONST	segment word public 'CONST'     ;AN000;
CONST	ends				;AN000;
_BSS	segment word public 'BSS'       ;AN000;
_BSS	ends				;AN000;
DGROUP	GROUP	CONST, _BSS, _DATA	;AN000;

_DATA	segment word public 'DATA'      ;AN000;

;-------------------------------------------------------------------
;	define an assembly language version of the C regs structure
;-------------------------------------------------------------------

asm2cInRegs	equ	$		;AN000;

i_ax		dw	0		;AN000;
i_bx		dw	0		;AN000;
i_cx		dw	0		;AN000;
i_dx		dw	0		;AN000;
i_si		dw	0		;AN000;
i_di		dw	0		;AN000;
i_cflag 	dw	0		;AN000;

Asm2cOutRegs	equ	$		;AN000;

o_ax		dw	0		;AN000;
o_bx		dw	0		;AN000;
o_cx		dw	0		;AN000;
o_dx		dw	0		;AN000;
o_si		dw	0		;AN000;
o_di		dw	0		;AN000;
o_cflag 	dw	0		;AN000;


Asm2cSegRegs	equ	$		;AN000;
s_es		dw	0		;AN000;
s_cs		dw	0		;AN000;
s_ss		dw	0		;AN000;
s_ds		dw	0		;AN000;

	extrn	_end:far		;AN000;

_DATA	ends				;AN000;

_TEXT	segment byte public 'CODE'      ;AN000;

	extrn	_get_status:near	;AN000;

	ASSUME	CS: _TEXT		;AN000;
	assume	ds: nothing		;AN000;
	assume	es: nothing		;AN000;
;-------------------------------------------------------------------
;-------------------------------------------------------------------
page					;AN000;
;-------------------------------------------------------------------
;	ggetstatus
;
;		This routine will reside in the C code segment
;
;-------------------------------------------------------------------

segment_of_dgroup	dw	seg dgroup;AN000;

SAVE_STACK	LABEL  DWORD		;AN000;
SAVE_SP 	DW	0		;AN000;
SAVE_SS 	DW	0		;AN000;

SAVE_DS 	DW	0		;AN000;
SAVE_ES 	DW	0		;AN000;

gget_status	 proc	 far		;AN000;

	MOV	SAVE_DS,DS		;AN000;
	MOV	SAVE_ES,ES		;AN000;

	MOV	SAVE_SS,SS		;AN000;
	MOV	SAVE_SP,SP		;AN000;

	mov	ss,segment_of_dgroup	;AN000;
	add	sp,offset DGROUP:_end	;AN000;
	ASSUME	SS: DGROUP		;AN000;

	MOV	DS,segment_of_dgroup	;AN000;
	ASSUME	DS: DGROUP		;AN000;

;-------------------------------------------------------------------
;	set up InRegs
;-------------------------------------------------------------------

	mov	i_ax,ax 	;AN000; make InRegs look like real registers
	mov	i_bx,bx 	;AN000;
	mov	i_cx,cx 	;AN000;
	mov	i_dx,dx 	;AN000;
	mov	i_si,si 	;AN000;
	mov	i_di,di 	;AN000;

;-------------------------------------------------------------------
;	set up SegRegs
;-------------------------------------------------------------------

	IRP	XX,<ES,SS,DS>	;AN000;
	MOV	AX,SAVE_&XX	;AN000;
	MOV	S_&XX,AX	;AN000;
	ENDM			;AN000;

	mov	s_cs,cs 	;AN000;

;-------------------------------------------------------------------
;	put far pointers on stack
;-------------------------------------------------------------------

;	push	ds		; push far pointer to SegRegs
	lea	ax,DGROUP:Asm2cSegRegs;AN000;
	push	ax		;AN000;

;	push	ds		; push far pointer to OutRegs
	lea	ax,DGROUP:Asm2cOutRegs;AN000;
	push	ax		;AN000;

;	push	ds		; push far pointer to InRegs
	lea	ax,DGROUP:Asm2cInRegs;AN000;
	push	ax		;AN000;

;-------------------------------------------------------------------
	call	_get_status	;AN000;
;-------------------------------------------------------------------
	add	sp,6		;AN000;
;-------------------------------------------------------------------
;	set up real registers
;-------------------------------------------------------------------

	mov	ax,o_ax 	;AN000; make real registers look like OutRegs
	mov	bx,o_bx 	;AN000;
	mov	cx,o_cx 	;AN000;
	mov	dx,o_dx 	;AN000;
	mov	si,o_si 	;AN000;
	mov	di,o_di 	;AN000;

;-------------------------------------------------------------------
;	must remove the things we put on the stack
;-------------------------------------------------------------------

	MOV	DS,SAVE_DS	;AN000;
	MOV	ES,SAVE_ES	;AN000;
	MOV	SS,SAVE_SS	;AN000;
	MOV	SP,SAVE_SP	;AN000;

	ret			;AN000;


gget_status	 endp		;AN000;

_TEXT	ends			;AN000; end code segment

;-------------------------------------------------------------------
;-------------------------------------------------------------------


	end			;AN000;