Skip to content

Commit 2ee97bf

Browse files
committed
DDC work
1 parent 439c115 commit 2ee97bf

File tree

1 file changed

+39
-5
lines changed

1 file changed

+39
-5
lines changed

src/video/vid_c&t_69000.c

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,9 @@
1010
*
1111
*
1212
*
13-
* Authors: Sarah Walker, <https://pcem-emulator.co.uk/>
14-
* Miran Grca, <mgrca8@gmail.com>
13+
* Authors: Cacodemon345
1514
*
16-
* Copyright 2008-2018 Sarah Walker.
17-
* Copyright 2016-2018 Miran Grca.
15+
* Copyright 2023-2024 Cacodemon345
1816
*/
1917
#include <stdio.h>
2018
#include <stdint.h>
@@ -34,6 +32,8 @@
3432
#include <86box/vid_svga_render.h>
3533
#include <86box/pci.h>
3634
#include <86box/thread.h>
35+
#include <86box/i2c.h>
36+
#include <86box/vid_ddc.h>
3737
#include <assert.h>
3838

3939
typedef struct chips_69000_t {
@@ -81,6 +81,8 @@ typedef struct chips_69000_t {
8181
};
8282

8383
rom_t bios_rom;
84+
85+
void* i2c_ddc, *ddc;
8486
} chips_69000_t;
8587

8688
static video_timings_t timing_sis = { .type = VIDEO_PCI, .write_b = 2, .write_w = 2, .write_l = 4, .read_b = 20, .read_w = 20, .read_l = 35 };
@@ -666,7 +668,16 @@ chips_69000_read_ext_reg(chips_69000_t* chips)
666668
case 0x0A:
667669
return chips->ext_regs[index] & 0x37;
668670
case 0x63:
669-
return 0xFF;
671+
{
672+
uint8_t val = chips->ext_regs[index];
673+
if (!(chips->ext_regs[0x62] & 0x8))
674+
val = (val & ~8) | (i2c_gpio_get_scl(chips->i2c_ddc) << 3);
675+
676+
if (!(chips->ext_regs[0x62] & 0x4))
677+
val = (val & ~4) | (i2c_gpio_get_sda(chips->i2c_ddc) << 2);
678+
679+
return val;
680+
}
670681
case 0x70:
671682
return 0x3;
672683
case 0x71:
@@ -711,6 +722,24 @@ chips_69000_write_ext_reg(chips_69000_t* chips, uint8_t val)
711722
case 0x62:
712723
chips->ext_regs[chips->ext_index] = val & 0x9C;
713724
break;
725+
case 0x63:
726+
{
727+
uint8_t scl = 0, sda = 0;
728+
if (chips->ext_regs[0x62] & 0x8)
729+
scl = !!(val & 8);
730+
else
731+
scl = i2c_gpio_get_scl(chips->i2c_ddc);
732+
733+
if (chips->ext_regs[0x62] & 0x4)
734+
sda = !!(val & 4);
735+
else
736+
scl = i2c_gpio_get_sda(chips->i2c_ddc);
737+
738+
i2c_gpio_set(chips->i2c_ddc, scl, sda);
739+
740+
chips->ext_regs[chips->ext_index] = val & 0x9F;
741+
break;
742+
}
714743
case 0x67:
715744
chips->ext_regs[chips->ext_index] = val & 0x2;
716745
break;
@@ -1285,6 +1314,9 @@ chips_69000_init(const device_t *info)
12851314
timer_add(&chips->decrement_timer, chips_69000_decrement_timer, chips, 0);
12861315
timer_on_auto(&chips->decrement_timer, 1000000. / 2000.);
12871316

1317+
chips->i2c_ddc = i2c_gpio_init("c&t_69000_mga");
1318+
chips->ddc = ddc_init(i2c_gpio_get_bus(chips->i2c_ddc));
1319+
12881320
return chips;
12891321
}
12901322

@@ -1302,6 +1334,8 @@ chips_69000_close(void *p)
13021334
chips->quit = 1;
13031335
// thread_set_event(chips->fifo_event);
13041336
// thread_wait(chips->accel_thread);
1337+
ddc_close(chips->ddc);
1338+
i2c_gpio_close(chips->i2c_ddc);
13051339
svga_close(&chips->svga);
13061340

13071341
free(chips);

0 commit comments

Comments
 (0)