start writing new VBE routines
authorJohn Tsiombikas <nuclear@member.fsf.org>
Tue, 12 Nov 2019 11:09:31 +0000 (13:09 +0200)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Tue, 12 Nov 2019 11:09:31 +0000 (13:09 +0200)
src/dos/cdpmi.h
src/dos/vbe.c [new file with mode: 0644]
src/dos/vbe.h [new file with mode: 0644]
src/util.h

index cdfd2f7..4fc2c30 100644 (file)
@@ -6,7 +6,9 @@
 #endif
 
 #include "inttypes.h"
 #endif
 
 #include "inttypes.h"
+#include "util.h"
 
 
+#pragma pack (push, 1)
 struct dpmi_regs {
        uint32_t edi, esi, ebp;
        uint32_t reserved;
 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;
        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);
 
 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" \
                "mov ax, 0x100" \
                "int 0x31" \
                "mov [edi], dx" \
+               "jnc alloc_skip_err" \
+               "xor ax, ax" \
+               "alloc_skip_err:" \
                value[ax] \
                parm[ebx][edi];
 
                value[ax] \
                parm[ebx][edi];
 
diff --git a/src/dos/vbe.c b/src/dos/vbe.c
new file mode 100644 (file)
index 0000000..d5d75df
--- /dev/null
@@ -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, &regs);
+
+       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 (file)
index 0000000..73df02f
--- /dev/null
@@ -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_ */
index 76dd044..6d869eb 100644 (file)
@@ -5,12 +5,15 @@
 
 #ifdef __GNUC__
 #define INLINE __inline
 
 #ifdef __GNUC__
 #define INLINE __inline
+#define PACKED __attribute__((packed))
 
 #elif defined(__WATCOMC__)
 #define INLINE __inline
 
 #elif defined(__WATCOMC__)
 #define INLINE __inline
+#define PACKED
 
 #else
 #define INLINE
 
 #else
 #define INLINE
+#define PACKED
 #endif
 
 /* fast conversion of double -> 32bit int
 #endif
 
 /* fast conversion of double -> 32bit int