From: John Tsiombikas Date: Tue, 12 Nov 2019 11:09:31 +0000 (+0200) Subject: start writing new VBE routines X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=dosdemo;a=commitdiff_plain;h=2c4602e53eaab44272ea5cd62667c939e6d2f61b start writing new VBE routines --- diff --git a/src/dos/cdpmi.h b/src/dos/cdpmi.h index cdfd2f7..4fc2c30 100644 --- a/src/dos/cdpmi.h +++ b/src/dos/cdpmi.h @@ -6,7 +6,9 @@ #endif #include "inttypes.h" +#include "util.h" +#pragma pack (push, 1) struct dpmi_regs { uint32_t edi, esi, ebp; uint32_t reserved; @@ -14,7 +16,8 @@ struct dpmi_regs { 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); @@ -27,6 +30,9 @@ void dpmi_munmap(void *addr); "mov ax, 0x100" \ "int 0x31" \ "mov [edi], dx" \ + "jnc alloc_skip_err" \ + "xor ax, ax" \ + "alloc_skip_err:" \ value[ax] \ parm[ebx][edi]; diff --git a/src/dos/vbe.c b/src/dos/vbe.c new file mode 100644 index 0000000..d5d75df --- /dev/null +++ b/src/dos/vbe.c @@ -0,0 +1,28 @@ +#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; +} diff --git a/src/dos/vbe.h b/src/dos/vbe.h new file mode 100644 index 0000000..73df02f --- /dev/null +++ b/src/dos/vbe.h @@ -0,0 +1,38 @@ +#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_ */ diff --git a/src/util.h b/src/util.h index 76dd044..6d869eb 100644 --- a/src/util.h +++ b/src/util.h @@ -5,12 +5,15 @@ #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