Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 16 additions & 6 deletions src/cp1610.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@
#define regSP 6 // Stack Pointer (R6)
#define regPC 7 // Program Counter (R7)

static int (*OpCodes[0x400])(int);
static int Interuptable[0x400];
static const char *Nmemonic[0x400];

CP1610_Context gCP1610_Context = {
.Version = CP1610_SERIALIZE_VERSION,

Expand All @@ -39,7 +43,13 @@ CP1610_Context gCP1610_Context = {
.Flag_Carry = 0,
.Flag_Sign = 0,
.Flag_Zero = 0,
.Flag_Overflow = 0
.Flag_Overflow = 0,

// Stic
.delayH = 0,
.delayV = 0,
.extendTop = 0,
.extendLeft = 0
};

void CP1610Reset()
Expand Down Expand Up @@ -170,14 +180,14 @@ int CP1610Tick(int debug)

CTX(R)[regPC]++; // point regPC/R7 at operand/next address

ticks = CTX(OpCodes)[instruction](instruction); // execute instruction
ticks = OpCodes[instruction](instruction); // execute instruction

if(sdbd==1) { CTX(Flag_DoubleByteData) = 0; } // reset SDBD

// check interupt request
if(CTX(Flag_InteruptEnable) == 1 && SR1>0)
{
if(CTX(Interuptable)[instruction])
if(Interuptable[instruction])
{
// Take VBlank Interupt //
SR1 = 0;
Expand Down Expand Up @@ -680,9 +690,9 @@ void addInstruction(int start, int end, int caninterupt, const char *name, int (
int i;
for(i=start; i<=end; i++)
{
CTX(Interuptable)[i] = caninterupt;
CTX(Nmemonic)[i] = name;
CTX(OpCodes)[i] = callback;
Interuptable[i] = caninterupt;
Nmemonic[i] = name;
OpCodes[i] = callback;
}
}

Expand Down
30 changes: 27 additions & 3 deletions src/cp1610.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,6 @@
typedef struct CP1610_Context_t
{
uint32_t Version;
int (*OpCodes[0x400])(int);
int Interuptable[0x400];
const char *Nmemonic[0x400];

unsigned int R[8]; // Registers R0-R7

Expand All @@ -37,6 +34,33 @@ typedef struct CP1610_Context_t
int Flag_Overflow;

unsigned int Memory[0x10000];

// Stick
unsigned int STICMode;

int stic_phase;
int stic_vid_enable;
int stic_reg;
int stic_gram;
int phase_len;

int DisplayEnabled;

unsigned int frame[352*224];

unsigned int scanBuffer[768]; // buffer for current scanline (352+32)*2
unsigned int collBuffer[768]; // buffer for collision -- made larger than needed to save checks

int delayH; // Horizontal Delay
int delayV; // Vertical Delay

int extendTop;
int extendLeft;

unsigned int CSP; // Color Stack Pointer
unsigned int cscolors[4]; // color squares colors
unsigned int fgcard[20]; // cached colors for cards on current row
unsigned int bgcard[20]; // (used for normal color stack mode)
} CP1610_Context, *PCP1610_Context;

extern CP1610_Context gCP1610_Context;
Expand Down
66 changes: 33 additions & 33 deletions src/intv.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,57 +149,57 @@ int exec(void) // Run one instruction
if(SR1<0) { SR1 = 0; }
}

phase_len -= ticks;
if (phase_len < 0) {
stic_phase = (stic_phase + 1) & 15;
switch (stic_phase) {
CTX(phase_len) -= ticks;
if (CTX(phase_len) < 0) {
CTX(stic_phase) = (CTX(stic_phase) + 1) & 15;
switch (CTX(stic_phase)) {
case 0: // Start of VBLANK
stic_reg = 1; // STIC registers accessible
stic_gram = 1; // GRAM accessible
phase_len += 2900;
SR1 = phase_len;
CTX(stic_reg) = 1; // STIC registers accessible
CTX(stic_gram) = 1; // GRAM accessible
CTX(phase_len) += 2900;
SR1 = CTX(phase_len);
// Render Frame //
STICDrawFrame(stic_vid_enable);
STICDrawFrame(CTX(stic_vid_enable));
return 0;
case 1:
phase_len += 3796 - 2900;
stic_vid_enable = DisplayEnabled;
DisplayEnabled = 0;
if (stic_vid_enable)
stic_reg = 0; // STIC registers now inaccessible
stic_gram = 1; // GRAM accessible
CTX(phase_len) += 3796 - 2900;
CTX(stic_vid_enable) = CTX(DisplayEnabled);
CTX(DisplayEnabled) = 0;
if (CTX(stic_vid_enable))
CTX(stic_reg) = 0; // STIC registers now inaccessible
CTX(stic_gram) = 1; // GRAM accessible
break;
case 2:
delayV = ((CTX(Memory)[0x31])&0x7);
delayH = ((CTX(Memory)[0x30])&0x7);
phase_len += 120 + 114 * delayV + delayH;
if (stic_vid_enable) {
stic_gram = 0; // GRAM now inaccessible
phase_len -= 68; // BUSRQ period (STIC reads RAM)
CTX(delayV) = ((CTX(Memory)[0x31])&0x7);
CTX(delayH) = ((CTX(Memory)[0x30])&0x7);
CTX(phase_len) += 120 + 114 * CTX(delayV) + CTX(delayH);
if (CTX(stic_vid_enable)) {
CTX(stic_gram) = 0; // GRAM now inaccessible
CTX(phase_len) -= 68; // BUSRQ period (STIC reads RAM)
PSGTick(68);
}
break;
default:
phase_len += 912;
if (stic_vid_enable) {
phase_len -= 108; // BUSRQ period (STIC reads RAM)
CTX(phase_len) += 912;
if (CTX(stic_vid_enable)) {
CTX(phase_len) -= 108; // BUSRQ period (STIC reads RAM)
PSGTick(108);
}
break;
case 14:
delayV = ((CTX(Memory)[0x31])&0x7);
delayH = ((CTX(Memory)[0x30])&0x7);
phase_len += 912 - 114 * delayV - delayH;
if (stic_vid_enable) {
phase_len -= 108; // BUSRQ period (STIC reads RAM)
CTX(delayV) = ((CTX(Memory)[0x31])&0x7);
CTX(delayH) = ((CTX(Memory)[0x30])&0x7);
CTX(phase_len) += 912 - 114 * CTX(delayV) - CTX(delayH);
if (CTX(stic_vid_enable)) {
CTX(phase_len) -= 108; // BUSRQ period (STIC reads RAM)
PSGTick(108);
}
break;
case 15:
delayV = ((CTX(Memory)[0x31])&0x7);
phase_len += 57 + 17;
if (stic_vid_enable && delayV == 0) {
phase_len -= 38; // BUSRQ period (STIC reads RAM)
CTX(delayV) = ((CTX(Memory)[0x31])&0x7);
CTX(phase_len) += 57 + 17;
if (CTX(stic_vid_enable) && CTX(delayV) == 0) {
CTX(phase_len) -= 38; // BUSRQ period (STIC reads RAM)
PSGTick(38);
}
break;
Expand Down
10 changes: 5 additions & 5 deletions src/libretro.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,8 @@ void retro_init(void)
struct retro_keyboard_callback kb = { Keyboard };

// init buffers, structs
memset(frame, 0, frameSize);
OSD_setDisplay(frame, MaxWidth, MaxHeight);
memset(CTX(frame), 0, frameSize);
OSD_setDisplay(CTX(frame), MaxWidth, MaxHeight);

// setup controller swap
controllerInit();
Expand Down Expand Up @@ -281,8 +281,8 @@ void retro_run(void)
Run();

// draw overlays
if(showKeypad0) { drawMiniKeypad(0, frame); }
if(showKeypad1) { drawMiniKeypad(1, frame); }
if(showKeypad0) { drawMiniKeypad(0, CTX(frame)); }
if(showKeypad1) { drawMiniKeypad(1, CTX(frame)); }

// sample audio from buffer
audioInc = 3733.5 / audioSamples;
Expand Down Expand Up @@ -319,7 +319,7 @@ void retro_run(void)
if (intv_halt)
OSD_drawTextBG(3, 5, "INTELLIVISION HALTED");
// send frame to libretro
Video(frame, frameWidth, frameHeight, sizeof(unsigned int) * frameWidth);
Video(CTX(frame), frameWidth, frameHeight, sizeof(unsigned int) * frameWidth);

}

Expand Down
16 changes: 8 additions & 8 deletions src/memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ void writeMem(int adr, int val) // Write (should handle hooks/alias)
case 0x0f:
case 0x17:
case 0x1f:
if (stic_gram != 0)
if (CTX(stic_gram) != 0)
CTX(Memory)[adr & 0x39FF] = val;
return;
}
Expand All @@ -83,19 +83,19 @@ void writeMem(int adr, int val) // Write (should handle hooks/alias)
// STIC Display Enable
if(adr==0x20 || adr==0x4020 || adr==0x8020 || adr==0xC020)
{
if (stic_reg != 0)
DisplayEnabled = 1;
if (CTX(stic_reg) != 0)
CTX(DisplayEnabled) = 1;
}
// STIC Mode Select
if(adr==0x21 || adr==0x4021 || adr==0x8021 || adr==0xC021)
{
if (stic_reg != 0)
STICMode = 0;
if (CTX(stic_reg) != 0)
CTX(STICMode) = 0;
}
//STIC Alias
if((adr>=0x0000 && adr<=0x003F) || (adr>=0x4000 && adr<=0x403F) || (adr>=0x8000 && adr<=0x803F) || (adr>=0xC000 && adr<=0xC03F))
{
if (stic_reg != 0)
if (CTX(stic_reg) != 0)
CTX(Memory)[adr & 0x3F] = (val & stic_and[adr & 0x3f]) | stic_or[adr & 0x3f];;
return;
}
Expand All @@ -118,7 +118,7 @@ int readMem(int adr) // Read (should handle hooks/alias)
val = val & 0xFF;
}

if(stic_reg != 0)
if(CTX(stic_reg) != 0)
{
if(adr<=0x3F)
{
Expand All @@ -128,7 +128,7 @@ int readMem(int adr) // Read (should handle hooks/alias)
// read sensitive addresses
if(adr==0x21 || adr==0x4021 || adr==0x8021 || adr==0xC021)
{
STICMode = 1;
CTX(STICMode) = 1;
}
}
return val;
Expand Down
Loading