1
0
mirror of https://github.com/mist64/perfect6502.git synced 2024-12-28 11:31:50 +00:00
This commit is contained in:
Michael Steil 2014-12-01 13:10:28 +01:00
parent 4b70feb863
commit c93f229339

View File

@ -490,26 +490,46 @@ isNodeHigh(state_t *state, nodenum_t nn)
* *
************************************************************/ ************************************************************/
#define read8(state, n0,n1,n2,n3,n4,n5,n6,n7) ((uint8_t)(isNodeHigh(state, n0) << 0) | (isNodeHigh(state, n1) << 1) | (isNodeHigh(state, n2) << 2) | (isNodeHigh(state, n3) << 3) | (isNodeHigh(state, n4) << 4) | (isNodeHigh(state, n5) << 5) | (isNodeHigh(state, n6) << 6) | (isNodeHigh(state, n7) << 7)) static inline unsigned int
readNodes(state_t *state, int count, nodenum_t *nodelist)
{
int result = 0;
for (int i = count - 1; i >= 0; i--) {
result <<= 1;
result |= isNodeHigh(state, nodelist[i]);
}
return result;
}
void
writeNodes(state_t *state, int count, nodenum_t *nodelist, int v)
{
for (int i = 0; i < 8; i++, v >>= 1)
setNode(state, nodelist[i], v & 1);
}
/************************************************************
*
* 6502-specific Interfacing
*
************************************************************/
uint16_t uint16_t
readAddressBus(state_t *state) readAddressBus(state_t *state)
{ {
return read8(state, ab0,ab1,ab2,ab3,ab4,ab5,ab6,ab7) | (read8(state, ab8,ab9,ab10,ab11,ab12,ab13,ab14,ab15) << 8); return readNodes(state, 16, (nodenum_t[]){ ab0, ab1, ab2, ab3, ab4, ab5, ab6, ab7, ab8, ab9, ab10, ab11, ab12, ab13, ab14, ab15 });
} }
uint8_t uint8_t
readDataBus(state_t *state) readDataBus(state_t *state)
{ {
return read8(state, db0,db1,db2,db3,db4,db5,db6,db7); return readNodes(state, 8, (nodenum_t[]){ db0, db1, db2, db3, db4, db5, db6, db7 });
} }
void void
writeDataBus(state_t *state, uint8_t d) writeDataBus(state_t *state, uint8_t d)
{ {
static const nodenum_t dbnodes[8] = { db0, db1, db2, db3, db4, db5, db6, db7 }; writeNodes(state, 8, (nodenum_t[]){ db0, db1, db2, db3, db4, db5, db6, db7 }, d);
for (int i = 0; i < 8; i++, d>>=1)
setNode(state, dbnodes[i], d & 1);
} }
BOOL BOOL
@ -521,49 +541,49 @@ readRW(state_t *state)
uint8_t uint8_t
readA(state_t *state) readA(state_t *state)
{ {
return read8(state, a0,a1,a2,a3,a4,a5,a6,a7); return readNodes(state, 8, (nodenum_t[]){ a0,a1,a2,a3,a4,a5,a6,a7 });
} }
uint8_t uint8_t
readX(state_t *state) readX(state_t *state)
{ {
return read8(state, x0,x1,x2,x3,x4,x5,x6,x7); return readNodes(state, 8, (nodenum_t[]){ x0,x1,x2,x3,x4,x5,x6,x7 });
} }
uint8_t uint8_t
readY(state_t *state) readY(state_t *state)
{ {
return read8(state, y0,y1,y2,y3,y4,y5,y6,y7); return readNodes(state, 8, (nodenum_t[]){ y0,y1,y2,y3,y4,y5,y6,y7 });
} }
uint8_t uint8_t
readP(state_t *state) readP(state_t *state)
{ {
return read8(state, p0,p1,p2,p3,p4,p5,p6,p7); return readNodes(state, 8, (nodenum_t[]){ p0,p1,p2,p3,p4,p5,p6,p7 });
} }
uint8_t uint8_t
readIR(state_t *state) readIR(state_t *state)
{ {
return read8(state, notir0,notir1,notir2,notir3,notir4,notir5,notir6,notir7) ^ 0xFF; return readNodes(state, 8, (nodenum_t[]){ notir0,notir1,notir2,notir3,notir4,notir5,notir6,notir7 }) ^ 0xFF;
} }
uint8_t uint8_t
readSP(state_t *state) readSP(state_t *state)
{ {
return read8(state, s0,s1,s2,s3,s4,s5,s6,s7); return readNodes(state, 8, (nodenum_t[]){ s0,s1,s2,s3,s4,s5,s6,s7 });
} }
uint8_t uint8_t
readPCL(state_t *state) readPCL(state_t *state)
{ {
return read8(state, pcl0,pcl1,pcl2,pcl3,pcl4,pcl5,pcl6,pcl7); return readNodes(state, 8, (nodenum_t[]){ pcl0,pcl1,pcl2,pcl3,pcl4,pcl5,pcl6,pcl7 });
} }
uint8_t uint8_t
readPCH(state_t *state) readPCH(state_t *state)
{ {
return read8(state, pch0,pch1,pch2,pch3,pch4,pch5,pch6,pch7); return readNodes(state, 8, (nodenum_t[]){ pch0,pch1,pch2,pch3,pch4,pch5,pch6,pch7 });
} }
uint16_t uint16_t
@ -619,12 +639,13 @@ chipStatus(state_t *state)
uint8_t memory[65536]; uint8_t memory[65536];
uint8_t mRead(uint16_t a) static uint8_t
mRead(uint16_t a)
{ {
return memory[a]; return memory[a];
} }
void static void
mWrite(uint16_t a, uint8_t d) mWrite(uint16_t a, uint8_t d)
{ {
memory[a] = d; memory[a] = d;
@ -687,7 +708,7 @@ add_nodes_left_dependant(state_t *state, nodenum_t a, nodenum_t b)
state->nodes_left_dependant[a][state->nodes_left_dependants[a]++] = b; state->nodes_left_dependant[a][state->nodes_left_dependants[a]++] = b;
} }
state_t * static state_t *
setupNodesAndTransistors(netlist_transdefs *transdefs, BOOL *node_is_pullup, nodenum_t nodes, nodenum_t transistors) setupNodesAndTransistors(netlist_transdefs *transdefs, BOOL *node_is_pullup, nodenum_t nodes, nodenum_t transistors)
{ {
/* allocate state */ /* allocate state */