#endif
#include "inttypes.h"
+#include "util.h"
+#pragma pack (push, 1)
struct dpmi_regs {
uint32_t edi, esi, ebp;
uint32_t reserved;
uint16_t flags;
uint16_t es, ds, fs, gs;
uint16_t ip, cs, sp, ss;
-};
+} PACKED;
+#pragma pack (pop)
uint16_t dpmi_alloc(unsigned int par, uint16_t *sel);
void dpmi_free(uint16_t sel);
"mov ax, 0x100" \
"int 0x31" \
"mov [edi], dx" \
+ "jnc alloc_skip_err" \
+ "xor ax, ax" \
+ "alloc_skip_err:" \
value[ax] \
parm[ebx][edi];
--- /dev/null
+#include "vbe.h"
+#include "cdpmi.h"
+
+int vbe_getinfo(struct vbe_info *info)
+{
+ void *lowbuf;
+ uint16_t seg, sel;
+ struct dpmi_regs regs = {0};
+
+ if(!(seg = dpmi_alloc(512 / 16, &sel))) {
+ return -1;
+ }
+
+ regs.eax = 0x4f00;
+ regs.es = seg;
+ regs.edi = 0;
+ dpmi_int(0x10, ®s);
+
+ if(regs.eax & 0xff00) {
+ dpmi_free(sel);
+ return -1;
+ }
+
+ lowbuf = (void*)((uint32_t)seg << 4);
+ memcpy(info, lowbuf, sizeof info);
+ dpmi_free(sel);
+ return 0;
+}
--- /dev/null
+#ifndef VBE_H_
+#define VBE_H_
+
+#include "inttypes.h"
+#include "util.h"
+
+#pragma pack (push, 1)
+struct vbe_info {
+ char sig[4];
+ uint16_t ver;
+ char *oem_name;
+ uint32_t caps;
+ uint16_t *modes;
+ uint16_t oem_ver;
+ char *vendor;
+ char *product;
+ char *revstr;
+ uint16_t accel_ver;
+ uint16_t accel_modes;
+} PACKED;
+#pragma pack (pop)
+
+enum {
+ VBE_8BIT_DAC = 0x01,
+ VBE_NON_VGA = 0x02,
+ VBE_DAC_BLANK = 0x04,
+ VBE_STEREO = 0x08, /* ? */
+ VBE_ACCEL = 0x08,
+ VBE_STEREO_VESA = 0x10, /* ? */
+ VBE_MUSTLOCK = 0x10,
+ VBE_HWCURSOR = 0x20,
+ VBE_HWCLIP = 0x40,
+ VBE_TRANSP_BLT = 0x80
+};
+
+int vbe_getinfo(struct vbe_info *info);
+
+#endif /* VBE_H_ */
#ifdef __GNUC__
#define INLINE __inline
+#define PACKED __attribute__((packed))
#elif defined(__WATCOMC__)
#define INLINE __inline
+#define PACKED
#else
#define INLINE
+#define PACKED
#endif
/* fast conversion of double -> 32bit int