SynGame/allegro/include/allegro5/platform/alwatcom.h

183 lines
5.5 KiB
C
Raw Permalink Normal View History

2019-09-10 11:14:36 +03:00
/* ______ ___ ___
* /\ _ \ /\_ \ /\_ \
* \ \ \L\ \\//\ \ \//\ \ __ __ _ __ ___
* \ \ __ \ \ \ \ \ \ \ /'__`\ /'_ `\/\`'__\/ __`\
* \ \ \/\ \ \_\ \_ \_\ \_/\ __//\ \L\ \ \ \//\ \L\ \
* \ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/
* \/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/
* /\____/
* \_/__/
*
* Configuration defines for use with Watcom.
*
* By Shawn Hargreaves.
*
* See readme.txt for copyright information.
*/
#ifndef __SW_3S
#error Allegro only supports stack based calling convention
#endif
#ifndef __SW_S
#error Stack overflow checking must be disabled
#endif
#include <io.h>
#include <i86.h>
#include <conio.h>
#include <fcntl.h>
#include <direct.h>
#include <malloc.h>
#pragma disable_message (120 201 202)
/* these are available in OpenWatcom 1.3 (12.3) */
#if __WATCOMC__ >= 1230
#define ALLEGRO_HAVE_INTTYPES_H 1
#define ALLEGRO_HAVE_STDINT_H 1
#else
#define ALLEGRO_GUESS_INTTYPES_OK
#endif
/* describe this platform */
#define ALLEGRO_PLATFORM_STR "Watcom"
#define ALLEGRO_DOS
#define ALLEGRO_I386
#define ALLEGRO_LITTLE_ENDIAN
#define LONG_LONG long long
#ifdef ALLEGRO_GUESS_INTTYPES_OK
#define int64_t signed long long
#define uint64_t unsigned long long
#endif
/* emulate some important djgpp routines */
#define inportb(port) inp(port)
#define inportw(port) inpw(port)
#define outportb(port, val) outp(port, val)
#define outportw(port, val) outpw(port, val)
#define ffblk find_t
#define ff_name name
#define ff_attrib attrib
#define ff_fsize size
#define ff_ftime wr_time
#define ff_fdate wr_date
#define findfirst(name, dta, attrib) _dos_findfirst(name, attrib, dta)
#define findnext(dta) _dos_findnext(dta)
#define random() rand()
#define srandom(n) srand(n)
#define _dos_ds _default_ds()
#define dosmemget(offset, length, buffer) memcpy(buffer, (void *)(offset), length)
#define dosmemput(buffer, length, offset) memcpy((void *)(offset), buffer, length)
#define __djgpp_nearptr_enable() 1
#define __djgpp_nearptr_disable()
#define __djgpp_base_address 0
#define __djgpp_conventional_base 0
#define _crt0_startup_flags 1
#define _CRT0_FLAG_NEARPTR 1
#ifdef __cplusplus
extern "C" {
#endif
typedef union __dpmi_regs
{
struct {
unsigned long edi, esi, ebp, res, ebx, edx, ecx, eax;
} d;
struct {
unsigned short di, di_hi, si, si_hi, bp, bp_hi, res, res_hi;
unsigned short bx, bx_hi, dx, dx_hi, cx, cx_hi, ax, ax_hi;
unsigned short flags, es, ds, fs, gs, ip, cs, sp, ss;
} x;
struct {
unsigned char edi[4], esi[4], ebp[4], res[4];
unsigned char bl, bh, ebx_b2, ebx_b3, dl, dh, edx_b2, edx_b3;
unsigned char cl, ch, ecx_b2, ecx_b3, al, ah, eax_b2, eax_b3;
} h;
} __dpmi_regs;
typedef struct __dpmi_meminfo
{
unsigned long handle;
unsigned long size;
unsigned long address;
} __dpmi_meminfo;
typedef struct __dpmi_free_mem_info
{
unsigned long largest_available_free_block_in_bytes;
unsigned long maximum_unlocked_page_allocation_in_pages;
unsigned long maximum_locked_page_allocation_in_pages;
unsigned long linear_address_space_size_in_pages;
unsigned long total_number_of_unlocked_pages;
unsigned long total_number_of_free_pages;
unsigned long total_number_of_physical_pages;
unsigned long free_linear_address_space_in_pages;
unsigned long size_of_paging_file_partition_in_pages;
unsigned long reserved[3];
} __dpmi_free_mem_info;
extern unsigned long __tb;
int __dpmi_int(int vector, __dpmi_regs *regs);
int __dpmi_allocate_dos_memory(int paragraphs, int *ret);
int __dpmi_free_dos_memory(int selector);
int __dpmi_physical_address_mapping(__dpmi_meminfo *info);
int __dpmi_free_physical_address_mapping(__dpmi_meminfo *info);
int __dpmi_lock_linear_region(__dpmi_meminfo *info);
int __dpmi_unlock_linear_region(__dpmi_meminfo *info);
int __dpmi_allocate_ldt_descriptors(int count);
int __dpmi_free_ldt_descriptor(int descriptor);
int __dpmi_get_segment_base_address(int selector, unsigned long *addr);
int __dpmi_set_segment_base_address(int selector, unsigned long address);
int __dpmi_set_segment_limit(int selector, unsigned long limit);
int __dpmi_get_free_memory_information(__dpmi_free_mem_info *info);
int __dpmi_simulate_real_mode_interrupt(int vector, __dpmi_regs *regs);
int __dpmi_simulate_real_mode_procedure_retf(__dpmi_regs *regs);
int _go32_dpmi_lock_data(void *lockaddr, unsigned long locksize);
int _go32_dpmi_lock_code(void *lockaddr, unsigned long locksize);
long _allocate_real_mode_callback(void (*handler)(__dpmi_regs *r), __dpmi_regs *regs);
/* memory locking macros */
void _unlock_dpmi_data(void *addr, int size);
#ifdef __cplusplus
}
#endif
#define END_OF_FUNCTION(x) void x##_end(void) { }
#define END_OF_STATIC_FUNCTION(x) static void x##_end(void) { }
#define LOCK_DATA(d, s) _go32_dpmi_lock_data(d, s)
#define LOCK_CODE(c, s) _go32_dpmi_lock_code(c, s)
#define UNLOCK_DATA(d,s) _unlock_dpmi_data(d, s)
#define LOCK_VARIABLE(x) LOCK_DATA((void *)&x, sizeof(x))
#define LOCK_FUNCTION(x) LOCK_CODE((void *)FP_OFF(x), (long)FP_OFF(x##_end) - (long)FP_OFF(x))
/* arrange for other headers to be included later on */
#define ALLEGRO_EXTRA_HEADER "allegro5/platform/aldos.h"
#define ALLEGRO_INTERNAL_HEADER "allegro5/platform/aintdos.h"