|
11 | 11 | /* freemem, keep */
|
12 | 12 | #include <string.h> /* strchr, strlen, memset */
|
13 | 13 |
|
14 |
| -#ifdef __TURBOC__ |
| 14 | +#if defined(__TURBOC__) || (__WATCOMC__) |
15 | 15 | #include <io.h> /* write (what else?) */
|
16 | 16 | #include <stdlib.h> /* _psp, NULL, malloc, free, atol */
|
17 | 17 | #define NON_RES_TEXT
|
|
21 | 21 | typedef unsigned char uint8_t;
|
22 | 22 | typedef unsigned short uint16_t;
|
23 | 23 |
|
| 24 | +#if (__WATCOMC__) |
| 25 | +//void far * getvect(unsigned char intno); |
| 26 | +//void setvect(unsigned char intno, void far * vector); |
| 27 | +#define getvect(x) _dos_getvect(x) |
| 28 | +#define setvect(x, y) _dos_setvect(x, y) |
| 29 | +#define freemem(x) _dos_freemem(x) |
| 30 | +#define keep(x, y) _dos_keep(x, y) |
| 31 | +#define __attribute__(x) |
| 32 | +#endif |
| 33 | + |
24 | 34 | #elif defined(__GNUC__)
|
25 | 35 | #include <libi86/stdlib.h>
|
26 | 36 | #include <unistd.h>
|
@@ -156,7 +166,31 @@ typedef struct {
|
156 | 166 |
|
157 | 167 | /* ------------- GLOBALS ------------- */
|
158 | 168 | static char progname[9] NON_RES_BSS;
|
159 |
| -#if defined(__GNUC__) |
| 169 | +#if defined (__WATCOMC__) |
| 170 | +#pragma aux file_table_size "*" |
| 171 | +#pragma aux file_table_size_bytes "*" |
| 172 | +#pragma aux file_table_free "*" |
| 173 | +#pragma aux file_table_offset "*" |
| 174 | +#pragma aux lock_table_size "*" |
| 175 | +#pragma aux lock_table_size_bytes "*" |
| 176 | +#pragma aux lock_table_free "*" |
| 177 | +#pragma aux lock_table_offset "*" |
| 178 | +#pragma aux iregs "*" |
| 179 | + |
| 180 | +#pragma aux need_to_chain "*" |
| 181 | + |
| 182 | +#pragma aux old_handler2f "*" |
| 183 | +#pragma aux handler2f "*" |
| 184 | + |
| 185 | +/* same as __cdecl except don't preceed with _ underscore */ |
| 186 | +#pragma aux __gcc16 "*" \ |
| 187 | +__parm __caller [] \ |
| 188 | +__value __struct __float __struct __routine [__ax] \ |
| 189 | +__modify [__ax __bx __cx __dx __es] |
| 190 | +#pragma aux (__gcc16) inner_handler |
| 191 | + |
| 192 | +#endif |
| 193 | +#if defined(__GNUC__) || defined(__WATCOMC__) |
160 | 194 | extern uint16_t file_table_size; /* # of file_t we can have */
|
161 | 195 | extern uint16_t file_table_size_bytes; /* amount bytes */
|
162 | 196 | extern uint16_t file_table_free;
|
@@ -259,7 +293,7 @@ static void interrupt far handler2f(intregs_t iregs) {
|
259 | 293 | /* would have been better to link a NASM handler core: */
|
260 | 294 | /* nasm -fobj -o foo.obj foo.asm ... */
|
261 | 295 |
|
262 |
| -#elif defined(__GNUC__) |
| 296 | +#elif defined(__GNUC__) || defined(__WATCOMC__) |
263 | 297 | /* Within IBM Interrupt Sharing Protocol header */
|
264 | 298 | extern void __far __interrupt (*i2D_next)(void);
|
265 | 299 | /* Prototype for NASM interrupt handler function */
|
@@ -356,7 +390,7 @@ void inner_handler(void) {
|
356 | 390 | /* Chain to the next handler. */
|
357 | 391 | #if defined(__TURBOC__)
|
358 | 392 | chain_old_handler2f;
|
359 |
| -#elif defined(__GNUC__) |
| 393 | +#elif defined(__GNUC__) || defined(__WATCOMC__) |
360 | 394 | need_to_chain = 1;
|
361 | 395 | #endif
|
362 | 396 | }
|
@@ -1169,7 +1203,9 @@ int main(int argc, char **argv) {
|
1169 | 1203 | void (near *isr)() = FP_OFF(handler2f);
|
1170 | 1204 | setvect(MUX_INT_NO,(void (interrupt far *)())MK_FP(_DS,isr));
|
1171 | 1205 | }
|
1172 |
| -#else /* causes relocations when built with Turbo C/C++ 3 */ |
| 1206 | +#elif defined(__WATCOMC__) |
| 1207 | + setvect(MUX_INT_NO,handler2f); // TODO get handler2f without relocation |
| 1208 | +#else /* causes relocations when built with Turbo C/C++ 3 and OW */ |
1173 | 1209 | setvect(MUX_INT_NO,handler2f);
|
1174 | 1210 | #endif
|
1175 | 1211 | /* enable(); */
|
|
0 commit comments