Cleanup to PR#60 (Cirrus Logic GD-5422)

Cleanup of SVGA rendering code.
This commit is contained in:
waltje
2018-10-22 18:31:03 -04:00
parent a67a499519
commit 133f121e2c
5 changed files with 1176 additions and 1187 deletions

View File

@@ -9,7 +9,7 @@
* Emulation of select Cirrus Logic cards (CL-GD 5428, * Emulation of select Cirrus Logic cards (CL-GD 5428,
* CL-GD 5429, 5430, 5434 and 5436 are supported). * CL-GD 5429, 5430, 5434 and 5436 are supported).
* *
* Version: @(#)vid_cl54xx.c 1.0.22 2018/10/21 * Version: @(#)vid_cl54xx.c 1.0.23 2018/10/22
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -58,7 +58,7 @@
#include "vid_svga_render.h" #include "vid_svga_render.h"
#define BIOS_GD5422_PATH L"video/cirruslogic/1-cl5422.bin" #define BIOS_GD5422_PATH L"video/cirruslogic/cl5422.bin"
#define BIOS_GD5426_PATH L"video/cirruslogic/diamond speedstar pro vlb v3.04.bin" #define BIOS_GD5426_PATH L"video/cirruslogic/diamond speedstar pro vlb v3.04.bin"
#define BIOS_GD5428_ISA_PATH L"video/cirruslogic/gd5428.bin" #define BIOS_GD5428_ISA_PATH L"video/cirruslogic/gd5428.bin"
#define BIOS_GD5428_VLB_PATH L"video/cirruslogic/vlbusjapan.bin" #define BIOS_GD5428_VLB_PATH L"video/cirruslogic/vlbusjapan.bin"
@@ -196,9 +196,11 @@ typedef struct gd54xx_t
uint8_t pci_regs[256]; uint8_t pci_regs[256];
uint8_t int_line; uint8_t int_line;
uint8_t fc; /*Feature Connector */ uint8_t fc; /* Feature Connector */
//FIXME: move to SVGA? --FvK
uint8_t clgd_latch[8]; uint8_t clgd_latch[8];
int card; int card;
uint32_t lfb_base; uint32_t lfb_base;
@@ -216,12 +218,10 @@ static void gd543x_mmio_writel(uint32_t addr, uint32_t val, void *p);
static uint8_t gd543x_mmio_read(uint32_t addr, void *p); static uint8_t gd543x_mmio_read(uint32_t addr, void *p);
static uint16_t gd543x_mmio_readw(uint32_t addr, void *p); static uint16_t gd543x_mmio_readw(uint32_t addr, void *p);
static uint32_t gd543x_mmio_readl(uint32_t addr, void *p); static uint32_t gd543x_mmio_readl(uint32_t addr, void *p);
static void gd54xx_recalc_banking(gd54xx_t *gd54xx); static void gd54xx_recalc_banking(gd54xx_t *gd54xx);
static void gd543x_recalc_mapping(gd54xx_t *gd54xx); static void gd543x_recalc_mapping(gd54xx_t *gd54xx);
static void gd54xx_start_blit(uint32_t cpu_dat, int count,
static void gd54xx_start_blit(uint32_t cpu_dat, int count, gd54xx_t *gd54xx, svga_t *svga); gd54xx_t *gd54xx, svga_t *svga);
/* Returns 1 if the card is a 5434, 5436/46, or 5480. */ /* Returns 1 if the card is a 5434, 5436/46, or 5480. */
@@ -245,10 +245,14 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p)
uint8_t o, indx; uint8_t o, indx;
uint32_t o32; uint32_t o32;
if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1)) if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) &&
addr ^= 0x60; !(svga->miscout & 1)) addr ^= 0x60;
switch (addr) { switch (addr) {
case 0x3ba:
case 0x3da:
gd54xx->fc = val; //FIXME: move to SVGA? --FvK
break;
case 0x3c0: case 0x3c0:
case 0x3c1: case 0x3c1:
if (!svga->attrff) { if (!svga->attrff) {
@@ -313,8 +317,7 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p)
} }
else { /* Hack to force memory size on some GD-542x BIOSes*/ else { /* Hack to force memory size on some GD-542x BIOSes*/
val &= 0xe7; val &= 0xe7;
switch (gd54xx->vram_size) switch (gd54xx->vram_size) {
{
case 0x80000: case 0x80000:
svga->seqregs[0x0a] = val | 0x08; svga->seqregs[0x0a] = val | 0x08;
break; break;
@@ -365,12 +368,10 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p)
svga->hwcursor.addr = (((svga->vram_display_mask + 1)-0x4000) + ((val & 0x3f) * 256)); svga->hwcursor.addr = (((svga->vram_display_mask + 1)-0x4000) + ((val & 0x3f) * 256));
break; break;
case 0x15: case 0x15:
if (gd54xx_is_5434(svga)) if (gd54xx_is_5434(svga)) {
{
/* Hack to force memory size on some GD-543x BIOSes*/ /* Hack to force memory size on some GD-543x BIOSes*/
val &= 0xf8; val &= 0xf8;
switch (gd54xx->vram_size) switch (gd54xx->vram_size) {
{
case 0x100000: case 0x100000:
svga->seqregs[0x15] = val | 0x2; svga->seqregs[0x15] = val | 0x2;
break; break;
@@ -383,8 +384,7 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p)
svga->seqregs[0x15] = val | 0x4; svga->seqregs[0x15] = val | 0x4;
break; break;
} }
} } else
else
return; return;
break; break;
case 0x07: case 0x07:
@@ -442,9 +442,6 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p)
break; break;
} }
return; return;
case 0x3ba: case 0x3da:
gd54xx->fc = val ;
break;
case 0x3cf: case 0x3cf:
if (svga->gdcaddr == 0) if (svga->gdcaddr == 0)
gd543x_mmio_write(0xb8000, val, gd54xx); gd543x_mmio_write(0xb8000, val, gd54xx);
@@ -580,7 +577,6 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p)
case 0x39: case 0x39:
gd543x_mmio_write(0xb8021, val, gd54xx); gd543x_mmio_write(0xb8021, val, gd54xx);
break; break;
} }
return; return;
} }
@@ -617,16 +613,14 @@ gd54xx_in(uint16_t addr, void *p)
svga_t *svga = &gd54xx->svga; svga_t *svga = &gd54xx->svga;
uint8_t indx, temp; uint8_t indx, temp;
if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3d0) && !(svga->miscout & 1)) if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3d0) &&
addr ^= 0x60; !(svga->miscout & 1)) addr ^= 0x60;
switch (addr) { switch (addr) {
case 0x3c4: case 0x3c4:
if ((svga->seqregs[6] & 0x17) == 0x12) if ((svga->seqregs[6] & 0x17) == 0x12) {
{
temp = svga->seqaddr; temp = svga->seqaddr;
if ((temp & 0x1e) == 0x10) if ((temp & 0x1e) == 0x10) {
{
if (temp & 1) if (temp & 1)
temp = ((svga->hwcursor.y & 7) << 5) | 0x11; temp = ((svga->hwcursor.y & 7) << 5) | 0x11;
else else
@@ -665,6 +659,18 @@ gd54xx_in(uint16_t addr, void *p)
return svga->seqregs[svga->seqaddr & 0x3f]; return svga->seqregs[svga->seqaddr & 0x3f];
} }
break; break;
case 0x3c6:
if (gd54xx->ramdac.state == 4) {
gd54xx->ramdac.state = 0;
return gd54xx->ramdac.ctrl;
}
gd54xx->ramdac.state++;
break;
case 0x3ca:
return gd54xx->fc; //FIXME: move to SVGA? --FvK
case 0x3c9: case 0x3c9:
svga->dac_status = 3; svga->dac_status = 3;
indx = (svga->dac_addr - 1) & 0xff; indx = (svga->dac_addr - 1) & 0xff;
@@ -692,25 +698,17 @@ gd54xx_in(uint16_t addr, void *p)
return svga->vgapal[indx].b & 0x3f; return svga->vgapal[indx].b & 0x3f;
} }
return 0xFF; return 0xFF;
case 0x3C6:
if (gd54xx->ramdac.state == 4) {
gd54xx->ramdac.state = 0;
return gd54xx->ramdac.ctrl;
}
gd54xx->ramdac.state++;
break;
case 0x3ca:
return gd54xx->fc;
case 0x3cf: case 0x3cf:
if (svga->gdcaddr > 8) { if (svga->gdcaddr > 8) {
return svga->gdcreg[svga->gdcaddr & 0x3f]; return svga->gdcreg[svga->gdcaddr & 0x3f];
} }
break; break;
case 0x3D4:
case 0x3d4:
return svga->crtcreg; return svga->crtcreg;
case 0x3D5:
case 0x3d5:
switch (svga->crtcreg) { switch (svga->crtcreg) {
case 0x24: /*Attribute controller toggle readback (R)*/ case 0x24: /*Attribute controller toggle readback (R)*/
return svga->attrff << 7; return svga->attrff << 7;
@@ -856,9 +854,7 @@ gd54xx_recalctimings(svga_t *svga)
case 0: case 0:
if (gd54xx->ramdac.ctrl & 0x10) { /* Mixed Mode */ if (gd54xx->ramdac.ctrl & 0x10) { /* Mixed Mode */
svga->render = svga_render_mixed_highres; svga->render = svga_render_mixed_highres;
} } else {
else
{
svga->bpp = 15; svga->bpp = 15;
svga->render = svga_render_15bpp_highres; svga->render = svga_render_15bpp_highres;
} }
@@ -881,11 +877,14 @@ gd54xx_recalctimings(svga_t *svga)
} }
break; break;
//case 8: Todo : Grayscale VGA rendering*/ #if 0
//break; case 8: /* Todo : Grayscale VGA rendering*/
break;
case 9: /* Todo : 3-3-2 8bit RGB*/
break;
#endif
//case 9: Todo : 3-3-2 8bit RGB*/
//break;
case 0xf: case 0xf:
switch (svga->seqregs[7] & CIRRUS_SR7_BPP_MASK) { switch (svga->seqregs[7] & CIRRUS_SR7_BPP_MASK) {
case CIRRUS_SR7_BPP_32: case CIRRUS_SR7_BPP_32:
@@ -1106,7 +1105,7 @@ gd54xx_write(uint32_t addr, uint8_t val, void *p)
gd54xx->blt.sys_buf &= ~(0xff << (gd54xx->blt.sys_cnt * 8)); gd54xx->blt.sys_buf &= ~(0xff << (gd54xx->blt.sys_cnt * 8));
gd54xx->blt.sys_buf |= (val << (gd54xx->blt.sys_cnt * 8)); gd54xx->blt.sys_buf |= (val << (gd54xx->blt.sys_cnt * 8));
gd54xx->blt.sys_cnt++; gd54xx->blt.sys_cnt++;
if(gd54xx->blt.sys_cnt >= 4) { if (gd54xx->blt.sys_cnt >= 4) {
gd54xx_blit_dword(gd54xx, svga); gd54xx_blit_dword(gd54xx, svga);
gd54xx->blt.sys_cnt = 0; gd54xx->blt.sys_cnt = 0;
} }
@@ -1115,7 +1114,7 @@ gd54xx_write(uint32_t addr, uint8_t val, void *p)
} }
addr &= svga->banked_mask; addr &= svga->banked_mask;
if (svga->banked_mask != 0x1ffff) if (svga->banked_mask != 0x1ffff)
addr = (addr & 0x7fff) + gd54xx->bank[(addr >> 15) & 1]; addr = (addr & 0x7fff) + gd54xx->bank[(addr >> 15) & 1];
svga_write_linear(addr, val, svga); svga_write_linear(addr, val, svga);
@@ -1134,13 +1133,13 @@ gd54xx_writew(uint32_t addr, uint16_t val, void *p)
} }
if (gd54xx->blt.sys_tx) { if (gd54xx->blt.sys_tx) {
gd54xx_write(addr, val, gd54xx); gd54xx_write(addr, val & 0xff, gd54xx);
gd54xx_write(addr+1, val >> 8, gd54xx); gd54xx_write(addr+1, val >> 8, gd54xx);
return; return;
} }
addr &= svga->banked_mask; addr &= svga->banked_mask;
if (svga->banked_mask != 0x1ffff) if (svga->banked_mask != 0x1ffff)
addr = (addr & 0x7fff) + gd54xx->bank[(addr >> 15) & 1]; addr = (addr & 0x7fff) + gd54xx->bank[(addr >> 15) & 1];
if (svga->writemode < 4) if (svga->writemode < 4)
@@ -1172,7 +1171,7 @@ gd54xx_writel(uint32_t addr, uint32_t val, void *p)
} }
addr &= svga->banked_mask; addr &= svga->banked_mask;
if (svga->banked_mask != 0x1ffff) if (svga->banked_mask != 0x1ffff)
addr = (addr & 0x7fff) + gd54xx->bank[(addr >> 15) & 1]; addr = (addr & 0x7fff) + gd54xx->bank[(addr >> 15) & 1];
if (svga->writemode < 4) if (svga->writemode < 4)
@@ -1442,7 +1441,7 @@ gd54xx_writeb_linear(uint32_t addr, uint8_t val, void *p)
gd54xx->blt.sys_buf &= ~(0xff << (gd54xx->blt.sys_cnt * 8)); gd54xx->blt.sys_buf &= ~(0xff << (gd54xx->blt.sys_cnt * 8));
gd54xx->blt.sys_buf |= (val << (gd54xx->blt.sys_cnt * 8)); gd54xx->blt.sys_buf |= (val << (gd54xx->blt.sys_cnt * 8));
gd54xx->blt.sys_cnt++; gd54xx->blt.sys_cnt++;
if(gd54xx->blt.sys_cnt >= 4) { if (gd54xx->blt.sys_cnt >= 4) {
gd54xx_blit_dword(gd54xx, svga); gd54xx_blit_dword(gd54xx, svga);
gd54xx->blt.sys_cnt = 0; gd54xx->blt.sys_cnt = 0;
} }
@@ -1635,6 +1634,7 @@ gd54xx_read(uint32_t addr, void *p)
addr = (addr & 0x7fff) + gd54xx->bank[(addr >> 15) & 1]; addr = (addr & 0x7fff) + gd54xx->bank[(addr >> 15) & 1];
addr &= svga->vram_mask; addr &= svga->vram_mask;
return svga_read_linear(addr, svga); return svga_read_linear(addr, svga);
} }
@@ -1649,7 +1649,7 @@ gd54xx_readw(uint32_t addr, void *p)
return svga_readw(addr, svga); return svga_readw(addr, svga);
addr &= svga->banked_mask; addr &= svga->banked_mask;
if (svga->banked_mask != 0x1ffff) if (svga->banked_mask != 0x1ffff)
addr = (addr & 0x7fff) + gd54xx->bank[(addr >> 15) & 1]; addr = (addr & 0x7fff) + gd54xx->bank[(addr >> 15) & 1];
return svga_readw_linear(addr, svga); return svga_readw_linear(addr, svga);
@@ -2327,6 +2327,7 @@ gd54xx_init(const device_t *info)
case CIRRUS_ID_CLGD5424: case CIRRUS_ID_CLGD5424:
romfn = BIOS_GD5422_PATH; romfn = BIOS_GD5422_PATH;
break; break;
case CIRRUS_ID_CLGD5426: case CIRRUS_ID_CLGD5426:
romfn = BIOS_GD5426_PATH; romfn = BIOS_GD5426_PATH;
break; break;
@@ -2385,8 +2386,8 @@ gd54xx_init(const device_t *info)
gd54xx->vram_size = vram << 20; gd54xx->vram_size = vram << 20;
else else
gd54xx->vram_size = 512 << 10; gd54xx->vram_size = 512 << 10;
gd54xx->vram_mask = gd54xx->vram_size - 1; gd54xx->vram_mask = gd54xx->vram_size - 1;
if (romfn) if (romfn)
rom_init(&gd54xx->bios_rom, romfn, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); rom_init(&gd54xx->bios_rom, romfn, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
@@ -2430,6 +2431,36 @@ gd54xx_init(const device_t *info)
return gd54xx; return gd54xx;
} }
static void
gd54xx_close(void *p)
{
gd54xx_t *gd54xx = (gd54xx_t *)p;
svga_close(&gd54xx->svga);
free(gd54xx);
}
static void
gd54xx_speed_changed(void *p)
{
gd54xx_t *gd54xx = (gd54xx_t *)p;
svga_recalctimings(&gd54xx->svga);
}
static void
gd54xx_force_redraw(void *p)
{
gd54xx_t *gd54xx = (gd54xx_t *)p;
gd54xx->svga.fullchange = changeframecount;
}
static int static int
gd5422_available(void) gd5422_available(void)
{ {
@@ -2508,33 +2539,6 @@ gd5480_available(void)
return rom_present(BIOS_GD5480_PATH); return rom_present(BIOS_GD5480_PATH);
} }
void
gd54xx_close(void *p)
{
gd54xx_t *gd54xx = (gd54xx_t *)p;
svga_close(&gd54xx->svga);
free(gd54xx);
}
void
gd54xx_speed_changed(void *p)
{
gd54xx_t *gd54xx = (gd54xx_t *)p;
svga_recalctimings(&gd54xx->svga);
}
void
gd54xx_force_redraw(void *p)
{
gd54xx_t *gd54xx = (gd54xx_t *)p;
gd54xx->svga.fullchange = changeframecount;
}
static const device_config_t gd5422_config[] = static const device_config_t gd5422_config[] =
{ {
@@ -2624,28 +2628,23 @@ static const video_timings_t cl_gd_isa_timing = {VID_ISA,3,3,6,8,8,12};
static const video_timings_t cl_gd_vlb_timing = {VID_BUS,4,4,8,10,10,20}; static const video_timings_t cl_gd_vlb_timing = {VID_BUS,4,4,8,10,10,20};
static const video_timings_t cl_gd_pci_timing = {VID_BUS,4,4,8,10,10,20}; static const video_timings_t cl_gd_pci_timing = {VID_BUS,4,4,8,10,10,20};
const device_t gd5422_isa_device = const device_t gd5422_isa_device = {
{
"Cirrus Logic GD-5422", "Cirrus Logic GD-5422",
DEVICE_AT | DEVICE_ISA, DEVICE_AT | DEVICE_ISA,
CIRRUS_ID_CLGD5422, CIRRUS_ID_CLGD5422,
gd54xx_init, gd54xx_init, gd54xx_close, NULL,
gd54xx_close,
NULL,
gd5422_available, gd5422_available,
gd54xx_speed_changed, gd54xx_speed_changed,
gd54xx_force_redraw, gd54xx_force_redraw,
&cl_gd_isa_timing, &cl_gd_isa_timing,
gd5422_config, gd5422_config,
}; };
const device_t gd5424_vlb_device =
{ const device_t gd5424_vlb_device = {
"Cirrus Logic GD-5424", "Cirrus Logic GD-5424",
DEVICE_VLB, DEVICE_VLB,
CIRRUS_ID_CLGD5424, CIRRUS_ID_CLGD5424,
gd54xx_init, gd54xx_init, gd54xx_close, NULL,
gd54xx_close,
NULL,
gd5422_available, gd5422_available,
gd54xx_speed_changed, gd54xx_speed_changed,
gd54xx_force_redraw, gd54xx_force_redraw,

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@
* *
* Definitions for the SVGA renderers. * Definitions for the SVGA renderers.
* *
* Version: @(#)vid_svga_render.h 1.0.2 2018/03/12 * Version: @(#)vid_svga_render.h 1.0.3 2018/10/22
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -43,38 +43,36 @@
extern int firstline_draw, lastline_draw; extern int firstline_draw, lastline_draw;
extern int displine; extern int displine;
extern int sc; extern int sc;
extern uint32_t ma, ca; extern uint32_t ma, ca;
extern int con, cursoron, cgablink; extern int con, cursoron, cgablink;
extern int scrollcache; extern int scrollcache;
extern uint8_t edatlookup[4][4]; extern uint8_t edatlookup[4][4];
void svga_render_blank(svga_t *svga);
void svga_render_text_40(svga_t *svga);
void svga_render_text_80(svga_t *svga);
void svga_render_text_80_ksc5601(svga_t *svga);
void svga_render_2bpp_lowres(svga_t *svga); extern void svga_render_blank(svga_t *svga);
void svga_render_2bpp_highres(svga_t *svga); extern void svga_render_text_40(svga_t *svga);
void svga_render_4bpp_lowres(svga_t *svga); extern void svga_render_text_80(svga_t *svga);
void svga_render_4bpp_highres(svga_t *svga); extern void svga_render_text_80_ksc5601(svga_t *svga);
void svga_render_8bpp_lowres(svga_t *svga);
void svga_render_8bpp_highres(svga_t *svga); extern void svga_render_2bpp_lowres(svga_t *svga);
void svga_render_15bpp_lowres(svga_t *svga); extern void svga_render_2bpp_highres(svga_t *svga);
void svga_render_15bpp_highres(svga_t *svga); extern void svga_render_4bpp_lowres(svga_t *svga);
void svga_render_mixed_highres(svga_t *svga); extern void svga_render_4bpp_highres(svga_t *svga);
void svga_render_16bpp_lowres(svga_t *svga); extern void svga_render_8bpp_lowres(svga_t *svga);
void svga_render_16bpp_highres(svga_t *svga); extern void svga_render_8bpp_highres(svga_t *svga);
void svga_render_24bpp_lowres(svga_t *svga); extern void svga_render_15bpp_lowres(svga_t *svga);
void svga_render_24bpp_highres(svga_t *svga); extern void svga_render_15bpp_highres(svga_t *svga);
void svga_render_32bpp_lowres(svga_t *svga); extern void svga_render_16bpp_lowres(svga_t *svga);
void svga_render_32bpp_highres(svga_t *svga); extern void svga_render_16bpp_highres(svga_t *svga);
void svga_render_ABGR8888_lowres(svga_t *svga); extern void svga_render_24bpp_lowres(svga_t *svga);
void svga_render_ABGR8888_highres(svga_t *svga); extern void svga_render_24bpp_highres(svga_t *svga);
void svga_render_RGBA8888_lowres(svga_t *svga); extern void svga_render_32bpp_lowres(svga_t *svga);
void svga_render_RGBA8888_highres(svga_t *svga); extern void svga_render_32bpp_highres(svga_t *svga);
extern void svga_render_ABGR8888_lowres(svga_t *svga);
extern void svga_render_ABGR8888_highres(svga_t *svga);
extern void svga_render_RGBA8888_lowres(svga_t *svga);
extern void svga_render_RGBA8888_highres(svga_t *svga);
extern void svga_render_mixed_highres(svga_t *svga);
extern void (*svga_render)(svga_t *svga); extern void (*svga_render)(svga_t *svga);

View File

@@ -8,7 +8,7 @@
* *
* Definitions for the video controller module. * Definitions for the video controller module.
* *
* Version: @(#)video.h 1.0.19 2018/10/16 * Version: @(#)video.h 1.0.20 2018/10/22
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>

View File

@@ -12,7 +12,7 @@
* "extern" reference to its device into the video.h file, * "extern" reference to its device into the video.h file,
* and add an entry for it into the table here. * and add an entry for it into the table here.
* *
* Version: @(#)video_dev.c 1.0.25 2018/10/20 * Version: @(#)video_dev.c 1.0.26 2018/10/22
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>