# HG changeset patch # User John Tsiombikas # Date 1546855673 -7200 # Node ID 5b0ef094b8fdd9bfc7c05517bb1f143e8ac763ef # Parent 193757920de96fc8eb4fb096932bda8550d45fd9 backported changes from more recent VBE projects diff -r 193757920de9 -r 5b0ef094b8fd Makefile --- a/Makefile Wed Jul 26 21:08:55 2017 +0300 +++ b/Makefile Mon Jan 07 12:07:53 2019 +0200 @@ -4,19 +4,24 @@ #opt = -5 -fp5 -otexan dbg = -d1 +!ifdef __UNIX__ +RM = rm -f +!else +RM = del +!endif + CC = wcc386 -CFLAGS = $(dbg) $(opt) -zq -bt=dos -Isrc\stl +CFLAGS = $(dbg) $(opt) -zq -bt=dos LD = wlink $(bin): $(obj) - %write objects.lnk file { $(obj) } - $(LD) debug all name $@ @objects $(LDFLAGS) + $(LD) debug all name $@ system dos4g file { $(obj) } $(LDFLAGS) .c: src .c.obj: .autodepend - $(CC) $(CFLAGS) $[* + $(CC) -fo=$@ $(CFLAGS) $[* clean: .symbolic - del *.obj - del $(bin) + $(RM) *.obj + $(RM) $(bin) diff -r 193757920de9 -r 5b0ef094b8fd src/dpmi.c --- a/src/dpmi.c Wed Jul 26 21:08:55 2017 +0300 +++ b/src/dpmi.c Mon Jan 07 12:07:53 2019 +0200 @@ -1,3 +1,4 @@ +#ifdef __WATCOMC__ #include "dpmi.h" void dpmi_real_int(int inum, struct dpmi_real_regs *regs) @@ -53,3 +54,6 @@ int 0x31 } } +#else +int stop_gcc_crying_about_empty_translation_units = 0; +#endif /* __WATCOM__ */ diff -r 193757920de9 -r 5b0ef094b8fd src/dpmi.h --- a/src/dpmi.h Wed Jul 26 21:08:55 2017 +0300 +++ b/src/dpmi.h Mon Jan 07 12:07:53 2019 +0200 @@ -1,6 +1,10 @@ #ifndef DPMI_H_ #define DPMI_H_ +#ifdef __DJGPP__ +#include +#endif + #include "inttypes.h" struct dpmi_real_regs { @@ -12,13 +16,27 @@ uint16_t ip, cs, sp, ss; }; -unsigned short dpmi_alloc(unsigned int par); +uint16_t dpmi_alloc(unsigned int par, uint16_t *sel); +void dpmi_free(uint16_t sel); + +#ifdef __WATCOMC__ #pragma aux dpmi_alloc = \ "mov eax, 0x100" \ "int 0x31" \ - value[ax] parm[ebx]; + "mov [edi], dx" \ + value[ax] parm[ebx][edi]; + +#pragma aux dpmi_free = \ + "mov eax, 0x101" \ + "int 0x31" \ + parm[dx]; void dpmi_real_int(int inum, struct dpmi_real_regs *regs); +#endif /* __WATCOMC__ */ + +#ifdef __DJGPP__ +#define dpmi_real_int(inum, regs) __dpmi_int((inum), (__dpmi_regs*)(regs)) +#endif void *dpmi_mmap(uint32_t phys_addr, unsigned int size); void dpmi_munmap(void *addr); diff -r 193757920de9 -r 5b0ef094b8fd src/vbe.c --- a/src/vbe.c Wed Jul 26 21:08:55 2017 +0300 +++ b/src/vbe.c Mon Jan 07 12:07:53 2019 +0200 @@ -1,7 +1,20 @@ #include #include +#include #include "vbe.h" #include "dpmi.h" +#include "inttypes.h" + +#ifdef __DJGPP__ +#include +#include + +#define SEG_ADDR(s) (((uint32_t)(s) << 4) - __djgpp_base_address) + +#define outp(p, v) outportb(p, v) +#else +#define SEG_ADDR(s) ((uint32_t)(s) << 4) +#endif /* VGA DAC registers used for palette setting in 8bpp modes */ #define VGA_DAC_STATE 0x3c7 @@ -14,14 +27,14 @@ struct vbe_info *vbe_get_info(void) { - static unsigned short info_block_seg; + static uint16_t info_block_seg, info_block_selector; static struct vbe_info *info; struct dpmi_real_regs regs; if(!info) { /* allocate 32 paragraphs (512 bytes) */ - info_block_seg = dpmi_alloc(32); - info = (struct vbe_info*)(info_block_seg << 4); + info_block_seg = dpmi_alloc(32, &info_block_selector); + info = (struct vbe_info*)SEG_ADDR(info_block_seg); } memcpy(info->sig, "VBE2", 4); @@ -37,14 +50,14 @@ struct vbe_mode_info *vbe_get_mode_info(int mode) { - static unsigned short mode_info_seg; + static uint16_t mode_info_seg, mode_info_selector; static struct vbe_mode_info *mi; struct dpmi_real_regs regs; if(!mi) { /* allocate 16 paragraphs (256 bytes) */ - mode_info_seg = dpmi_alloc(16); - mi = (struct vbe_mode_info*)(mode_info_seg << 4); + mode_info_seg = dpmi_alloc(16, &mode_info_selector); + mi = (struct vbe_mode_info*)SEG_ADDR(mode_info_seg); } memset(®s, 0, sizeof regs); @@ -85,7 +98,7 @@ regs.ebx = bits << 8; /* bits in bh */ dpmi_real_int(0x10, ®s); - if((regs.eax >> 8) & 0xff == 3) { + if(((regs.eax >> 8) & 0xff) == 3) { return -1; } return regs.ebx >> 8 & 0xff; /* new color bits in bh */ @@ -98,11 +111,7 @@ { int i, shift = 8 - bits; - __asm { - mov dx, VGA_DAC_ADDR_WR - mov eax, idx - out dx, al - } + outp(VGA_DAC_ADDR_WR, idx); for(i=0; i>= shift; } - __asm { - mov dx, VGA_DAC_DATA - mov al, r - out dx, al - mov al, g - out dx, al - mov al, b - out dx, al - } + outp(VGA_DAC_DATA, r); + outp(VGA_DAC_DATA, g); + outp(VGA_DAC_DATA, b); } } +int vbe_set_disp_start(int x, int y, int when) +{ + struct dpmi_real_regs regs; + + memset(®s, 0, sizeof regs); + regs.eax = 0x4f07; + regs.ebx = when & 0xffff; + regs.ecx = x & 0xffff; + regs.edx = y & 0xffff; + dpmi_real_int(0x10, ®s); + + if(regs.eax == 0x100) { + return -1; + } + return 0; +} + +int vbe_set_scanlen(int len, int mode) +{ + struct dpmi_real_regs regs; + + memset(®s, 0, sizeof regs); + regs.eax = 0x4f06; + regs.ebx = mode; + regs.ecx = len & 0xffff; + dpmi_real_int(0x10, ®s); + + if(regs.eax == 0x100) { + return -1; + } + return regs.ecx & 0xffff; +} + +int vbe_get_scanlen(int mode) +{ + int res; + struct dpmi_real_regs regs; + + memset(®s, 0, sizeof regs); + regs.eax = 0x4f06; + regs.ebx = 1; + dpmi_real_int(0x10, ®s); + + if(regs.eax == 0x100) { + return -1; + } + + if(mode == VBE_SCANLEN_PIXELS) { + res = regs.ecx & 0xffff; + } else { + res = regs.ebx & 0xffff; + } + return res; +} + + static unsigned int get_mask(int sz, int pos) { unsigned int i, mask = 0; @@ -149,5 +208,5 @@ fprintf(fp, "red bits: %d (mask: %x)\n", (int)mi->rmask_size, get_mask(mi->rmask_size, mi->rpos)); fprintf(fp, "green bits: %d (mask: %x)\n", (int)mi->gmask_size, get_mask(mi->gmask_size, mi->gpos)); fprintf(fp, "blue bits: %d (mask: %x)\n", (int)mi->bmask_size, get_mask(mi->bmask_size, mi->bpos)); - fprintf(fp, "framebuffer address: %x\n", mi->fb_addr); + fprintf(fp, "framebuffer address: %x\n", (unsigned int)mi->fb_addr); } diff -r 193757920de9 -r 5b0ef094b8fd src/vbe.h --- a/src/vbe.h Wed Jul 26 21:08:55 2017 +0300 +++ b/src/vbe.h Mon Jan 07 12:07:53 2019 +0200 @@ -3,6 +3,12 @@ #include "inttypes.h" +#ifdef __GNUC__ +#define PACKED __attribute__((packed)) +#else +#define PACKED +#endif + #define VBE_ATTR_LFB (1 << 7) #define VBE_MODE_LFB (1 << 14) @@ -20,7 +26,7 @@ uint32_t oem_product_rev_ptr; uint8_t reserved[222]; uint8_t oem_data[256]; -}; +} PACKED; struct vbe_mode_info { uint16_t mode_attr; @@ -54,17 +60,26 @@ uint16_t reserved3; uint8_t reserved4[206]; -}; +} PACKED; #pragma pack (pop) struct vbe_info *vbe_get_info(void); -struct vbe_mode_info *vbe_get_mode_info(unsigned int mode); +struct vbe_mode_info *vbe_get_mode_info(int mode); -int vbe_set_mode(unsigned int mode); +int vbe_set_mode(int mode); int vbe_set_palette_bits(int bits); void vbe_set_palette(int idx, int *col, int count, int bits); +#define VBE_SET_DISP_START_NOW 0 +#define VBE_SET_DISP_START_VBLANK 0x80 +int vbe_set_disp_start(int x, int y, int when); + +#define VBE_SCANLEN_PIXELS 0 +#define VBE_SCANLEN_BYTES 2 +int vbe_set_scanlen(int len, int mode); +int vbe_get_scanlen(int mode); + void print_mode_info(FILE *fp, struct vbe_mode_info *modei); #endif /* VBE_H_ */