|
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