Skip to content

Commit

Permalink
VRAM in standalone module
Browse files Browse the repository at this point in the history
  • Loading branch information
ogamespec committed May 24, 2023
1 parent 8310b86 commit 966e1cc
Show file tree
Hide file tree
Showing 6 changed files with 143 additions and 120 deletions.
3 changes: 2 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ add_executable(Nuked-MD
md.c
tmss.c
vdp.c
z80.c)
z80.c
vram.c)

if(TARGET SDL2::SDL2main)
target_link_libraries(Nuked-MD PRIVATE SDL2::SDL2main)
Expand Down
5 changes: 5 additions & 0 deletions Scripts/NukedMD.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
<ClCompile Include="..\md.c" />
<ClCompile Include="..\tmss.c" />
<ClCompile Include="..\vdp.c" />
<ClCompile Include="..\vram.c" />
<ClCompile Include="..\z80.c" />
</ItemGroup>
<ItemGroup>
Expand All @@ -39,13 +40,17 @@
<ClInclude Include="..\iochip.h" />
<ClInclude Include="..\tmss.h" />
<ClInclude Include="..\vdp.h" />
<ClInclude Include="..\vram.h" />
<ClInclude Include="..\z80.h" />
</ItemGroup>
<ItemGroup>
<None Include="..\Progress.md" />
<None Include="..\README.md" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<Text Include="..\CMakeLists.txt" />
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
Expand Down
9 changes: 9 additions & 0 deletions Scripts/NukedMD.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@
<ClCompile Include="..\z80.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\vram.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\68k.h">
Expand Down Expand Up @@ -74,10 +77,16 @@
<ClInclude Include="..\z80.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\vram.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\Progress.md" />
<None Include="..\README.md" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<Text Include="..\CMakeLists.txt" />
</ItemGroup>
</Project>
121 changes: 2 additions & 119 deletions md.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "68k.h"
#include "z80.h"
#include "fc1004.h"
#include "vram.h"

#define VERSION "1.0"

Expand Down Expand Up @@ -165,124 +166,6 @@ void init_chips(void)

uint64_t mcycles;

static int vram[64 * 1024];
static int vram_flat[64 * 1024];
static int vram_page[256];
static int vram_addr;
static int vram_dt;
static int vram_addr_ser;
static int vram_ser;
static int vram_addr_o;

typedef struct {
int ras;
int cas;
int we0;
int oe1;
int sc;
int se0;
int ad;
} vram_input_t;


vram_input_t vram_input, vram_input_o;

void update_vram(void)
{
int cas, wr, rd, owr, ord;
int odata;
int ocas;
// o_vram_ras
// o_vram_cas
// o_vram_we0
// o_vram_oe1
// o_vram_sc
// o_vram_se0
vram_input.ras = ym.vdp.o_vram_ras;
vram_input.cas = ym.vdp.o_vram_cas;
vram_input.we0 = ym.vdp.o_vram_we0;
vram_input.oe1 = ym.vdp.o_vram_oe1;
vram_input.sc = ym.vdp.o_vram_sc;
vram_input.se0 = ym.vdp.o_vram_se0;
vram_input.ad = ym.vdp.o_vram_ad;
if (!memcmp(&vram_input, &vram_input_o, sizeof(vram_input)))
return;
cas = !vram_input.ras && !vram_input.cas;
wr = !vram_input.ras && !vram_input.cas && !vram_input.we0;
rd = !vram_input.ras && !vram_input.cas && !vram_input.oe1 && !vram_dt;

odata = vram_input.ad;
if (vram_dt)
{
if (!vram_input_o.oe1 && vram_input.oe1)
{
int unscramble = 0;
vram_addr_ser = vram_addr;
unscramble |= vram_addr & 3;
unscramble |= (vram_addr >> 6) & 0x3fc;
unscramble |= (vram_addr & 0xfc) << 8;
memcpy(vram_page, &vram[vram_addr & 0xff00], sizeof(vram_page));
//vram_ser = vram_page[vram_addr_ser & 0xff];
//if (ym.vdp.l106[1] > 320)
// printf("dt %x\n", unscramble);
}
}

if (vram_input_o.ras && !vram_input.ras)
{
vram_dt = !vram_input.oe1;
vram_addr &= ~0xff00;
vram_addr |= (odata & 255) << 8;
}
ocas = !vram_input_o.ras && !vram_input_o.cas;
if (!ocas && cas)
{
vram_addr &= ~0xff;
vram_addr |= odata & 255;
}
owr = !vram_input_o.ras && !vram_input_o.cas && !vram_input_o.we0;
if (!owr && wr)
{
int unscramble = 0;
vram[vram_addr] = odata;
unscramble |= vram_addr & 3;
unscramble |= (vram_addr >> 6) & 0x3fc;
unscramble |= (vram_addr & 0xfc) << 8;
vram_flat[unscramble] = odata;
if (unscramble == 0xc20 && odata != 0)
unscramble += 0;
}
ord = !vram_input_o.ras && !vram_input_o.cas && !vram_input_o.oe1 && !vram_dt;
if (!ord && rd)
{
ym.vdp.input.i_vram_ad = vram[vram_addr & 0xffff];
}
if (!vram_input_o.sc && vram_input.sc && !vram_input.se0)
{
int low, high;
int unscramble = 0;
unscramble |= vram_addr_ser & 3;
unscramble |= (vram_addr_ser >> 6) & 0x3fc;
unscramble |= (vram_addr_ser & 0xfc) << 8;
vram_ser = vram_page[vram_addr_ser & 0xff];
if (unscramble >= 0x3800 && (unscramble & 3) == 1)
{
vram_ser ^= 0;
}
low = vram_addr_ser & 255;
high = vram_addr_ser & 0xff00;
low++;
low &= 255;
vram_addr_ser = high | low;
}
if (!vram_input.se0)
{
ym.vdp.input.i_vram_sd = vram_ser;
}

vram_input_o = vram_input;
}

SDL_Window* vid_window;
SDL_Renderer *vid_renderer;
SDL_Texture *vid_texture;
Expand Down Expand Up @@ -486,7 +369,7 @@ void Video_UpdateTitle(uint64_t ms)
{
char buffer[100];
int _ms = ms % 1000;
int _s = ms / 1000;
int _s = (int)(ms / 1000);
int mn = _s / 60;
_s %= 60;
SDL_snprintf(buffer, sizeof(buffer), "Nuked MD v" VERSION " [%i:%02i:%03i]", mn, _s, _ms);
Expand Down
111 changes: 111 additions & 0 deletions vram.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
#include "fc1004.h"
#include "vram.h"

extern fc1004_t ym;

vram_input_t vram_input, vram_input_o;

static int vram[64 * 1024];
static int vram_flat[64 * 1024];
static int vram_page[256];
static int vram_addr;
static int vram_dt;
static int vram_addr_ser;
static int vram_ser;
static int vram_addr_o;

void update_vram()
{
int cas, wr, rd, owr, ord;
int odata;
int ocas;
// o_vram_ras
// o_vram_cas
// o_vram_we0
// o_vram_oe1
// o_vram_sc
// o_vram_se0
vram_input.ras = ym.vdp.o_vram_ras;
vram_input.cas = ym.vdp.o_vram_cas;
vram_input.we0 = ym.vdp.o_vram_we0;
vram_input.oe1 = ym.vdp.o_vram_oe1;
vram_input.sc = ym.vdp.o_vram_sc;
vram_input.se0 = ym.vdp.o_vram_se0;
vram_input.ad = ym.vdp.o_vram_ad;
if (!memcmp(&vram_input, &vram_input_o, sizeof(vram_input)))
return;
cas = !vram_input.ras && !vram_input.cas;
wr = !vram_input.ras && !vram_input.cas && !vram_input.we0;
rd = !vram_input.ras && !vram_input.cas && !vram_input.oe1 && !vram_dt;

odata = vram_input.ad;
if (vram_dt)
{
if (!vram_input_o.oe1 && vram_input.oe1)
{
int unscramble = 0;
vram_addr_ser = vram_addr;
unscramble |= vram_addr & 3;
unscramble |= (vram_addr >> 6) & 0x3fc;
unscramble |= (vram_addr & 0xfc) << 8;
memcpy(vram_page, &vram[vram_addr & 0xff00], sizeof(vram_page));
//vram_ser = vram_page[vram_addr_ser & 0xff];
//if (ym.vdp.l106[1] > 320)
// printf("dt %x\n", unscramble);
}
}

if (vram_input_o.ras && !vram_input.ras)
{
vram_dt = !vram_input.oe1;
vram_addr &= ~0xff00;
vram_addr |= (odata & 255) << 8;
}
ocas = !vram_input_o.ras && !vram_input_o.cas;
if (!ocas && cas)
{
vram_addr &= ~0xff;
vram_addr |= odata & 255;
}
owr = !vram_input_o.ras && !vram_input_o.cas && !vram_input_o.we0;
if (!owr && wr)
{
int unscramble = 0;
vram[vram_addr] = odata;
unscramble |= vram_addr & 3;
unscramble |= (vram_addr >> 6) & 0x3fc;
unscramble |= (vram_addr & 0xfc) << 8;
vram_flat[unscramble] = odata;
if (unscramble == 0xc20 && odata != 0)
unscramble += 0;
}
ord = !vram_input_o.ras && !vram_input_o.cas && !vram_input_o.oe1 && !vram_dt;
if (!ord && rd)
{
ym.vdp.input.i_vram_ad = vram[vram_addr & 0xffff];
}
if (!vram_input_o.sc && vram_input.sc && !vram_input.se0)
{
int low, high;
int unscramble = 0;
unscramble |= vram_addr_ser & 3;
unscramble |= (vram_addr_ser >> 6) & 0x3fc;
unscramble |= (vram_addr_ser & 0xfc) << 8;
vram_ser = vram_page[vram_addr_ser & 0xff];
if (unscramble >= 0x3800 && (unscramble & 3) == 1)
{
vram_ser ^= 0;
}
low = vram_addr_ser & 255;
high = vram_addr_ser & 0xff00;
low++;
low &= 255;
vram_addr_ser = high | low;
}
if (!vram_input.se0)
{
ym.vdp.input.i_vram_sd = vram_ser;
}

vram_input_o = vram_input;
}
14 changes: 14 additions & 0 deletions vram.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@

#pragma once

typedef struct {
int ras;
int cas;
int we0;
int oe1;
int sc;
int se0;
int ad;
} vram_input_t;

void update_vram();

0 comments on commit 966e1cc

Please sign in to comment.