mirror of
https://github.com/holub/mame
synced 2025-07-05 01:48:29 +03:00
mcs51: clean up source code spacing
This commit is contained in:
parent
252941fe51
commit
d74df7ffaa
@ -52,6 +52,7 @@
|
||||
*****************************************************************************/
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* Notes:
|
||||
*
|
||||
* The term cycles is used here to really refer to clock oscilations, because 1 machine cycle
|
||||
@ -252,7 +253,7 @@ mcs51_cpu_device::mcs51_cpu_device(const machine_config &mconfig, device_type ty
|
||||
, m_features(features)
|
||||
, m_inst_cycles(0)
|
||||
, m_rom_size(program_width > 0 ? 1 << program_width : 0)
|
||||
, m_ram_mask( (data_width == 8) ? 0xff : 0x7f )
|
||||
, m_ram_mask((data_width == 8) ? 0xff : 0x7f)
|
||||
, m_num_interrupts(5)
|
||||
, m_sfr_ram(*this, "sfr_ram")
|
||||
, m_scratchpad(*this, "scratchpad")
|
||||
@ -588,15 +589,15 @@ void mcs51_cpu_device::iram_iwrite(offs_t a, uint8_t d) { if (a <= m_ram_mask) m
|
||||
/* Macros for Setting Flags */
|
||||
#define SET_X(R, v) do { R = (v);} while (0)
|
||||
|
||||
#define SET_CY(n) SET_PSW((PSW & 0x7f) | (n<<7)) //Carry Flag
|
||||
#define SET_AC(n) SET_PSW((PSW & 0xbf) | (n<<6)) //Aux.Carry Flag
|
||||
#define SET_FO(n) SET_PSW((PSW & 0xdf) | (n<<5)) //User Flag
|
||||
#define SET_RS(n) SET_PSW((PSW & 0xe7) | (n<<3)) //R Bank Select
|
||||
#define SET_OV(n) SET_PSW((PSW & 0xfb) | (n<<2)) //Overflow Flag
|
||||
#define SET_P(n) SET_PSW((PSW & 0xfe) | (n<<0)) //Parity Flag
|
||||
#define SET_CY(n) SET_PSW((PSW & 0x7f) | ((n) << 7)) //Carry Flag
|
||||
#define SET_AC(n) SET_PSW((PSW & 0xbf) | ((n) << 6)) //Aux.Carry Flag
|
||||
#define SET_FO(n) SET_PSW((PSW & 0xdf) | ((n) << 5)) //User Flag
|
||||
#define SET_RS(n) SET_PSW((PSW & 0xe7) | ((n) << 3)) //R Bank Select
|
||||
#define SET_OV(n) SET_PSW((PSW & 0xfb) | ((n) << 2)) //Overflow Flag
|
||||
#define SET_P(n) SET_PSW((PSW & 0xfe) | ((n) << 0)) //Parity Flag
|
||||
|
||||
#define SET_BIT(R, n, v) do { R = (R & ~(1<<(n))) | ((v) << (n));} while (0)
|
||||
#define GET_BIT(R, n) (((R)>>(n)) & 0x01)
|
||||
#define SET_BIT(R, n, v) do { R = (R & ~(1 << (n))) | ((v) << (n)); } while (0)
|
||||
#define GET_BIT(R, n) (((R) >> (n)) & 0x01)
|
||||
|
||||
#define SET_EA(n) SET_BIT(IE, 7, n) //Global Interrupt Enable/Disable
|
||||
#define SET_ES(n) SET_BIT(IE, 4, v) //Serial Interrupt Enable/Disable
|
||||
@ -608,7 +609,7 @@ void mcs51_cpu_device::iram_iwrite(offs_t a, uint8_t d) { if (a <= m_ram_mask) m
|
||||
#define SET_ET2(n) SET_BIT(IE, 5, n) //Timer 2 Interrupt Enable/Disable
|
||||
|
||||
/* 8052 Only flags */
|
||||
#define SET_PT2(n) SET_BIT(IP, 5, n); //Set Timer 2 Priority Level
|
||||
#define SET_PT2(n) SET_BIT(IP, 5, n) //Set Timer 2 Priority Level
|
||||
|
||||
#define SET_PS0(n) SET_BIT(IP, 4, n) //Set Serial Priority Level
|
||||
#define SET_PT1(n) SET_BIT(IP, 3, n) //Set Timer 1 Priority Level
|
||||
@ -720,7 +721,7 @@ void mcs51_cpu_device::iram_iwrite(offs_t a, uint8_t d) { if (a <= m_ram_mask) m
|
||||
#define GET_GF1 GET_BIT(PCON, 3)
|
||||
#define GET_GF0 GET_BIT(PCON, 2)
|
||||
#define GET_PD GET_BIT(PCON, 1)
|
||||
#define GET_IDL (GET_BIT(PCON, 0) & ~(GET_PD)) /* PD takes precedence! */
|
||||
#define GET_IDL (GET_BIT(PCON, 0) & ~(GET_PD)) // PD takes precedence!
|
||||
|
||||
/* 8052 Only flags */
|
||||
#define GET_TF2 GET_BIT(T2CON, 7)
|
||||
@ -753,7 +754,7 @@ void mcs51_cpu_device::iram_iwrite(offs_t a, uint8_t d) { if (a <= m_ram_mask) m
|
||||
#define GET_SL GET_BIT(MCON, 0)
|
||||
|
||||
/* RPCTL Flags - DS5002FP */
|
||||
#define GET_RNR GET_BIT(RPCTL, 7) /* Bit 6 ?? */
|
||||
#define GET_RNR GET_BIT(RPCTL, 7) // Bit 6 ??
|
||||
#define GET_EXBS GET_BIT(RPCTL, 5)
|
||||
#define GET_AE GET_BIT(RPCTL, 4)
|
||||
#define GET_IBI GET_BIT(RPCTL, 3)
|
||||
@ -766,7 +767,7 @@ void mcs51_cpu_device::iram_iwrite(offs_t a, uint8_t d) { if (a <= m_ram_mask) m
|
||||
#define DO_ADD_FLAGS(a,d,c) do_add_flags(a, d, c)
|
||||
#define DO_SUB_FLAGS(a,d,c) do_sub_flags(a, d, c)
|
||||
|
||||
#define SET_PARITY() do {m_recalc_parity |= 1;} while (0)
|
||||
#define SET_PARITY() do { m_recalc_parity |= 1; } while (0)
|
||||
#define PUSH_PC() push_pc()
|
||||
#define POP_PC() pop_pc()
|
||||
|
||||
@ -842,9 +843,11 @@ offs_t mcs51_cpu_device::external_ram_iaddr(offs_t offset, offs_t mem_mask)
|
||||
/* Memory Range (RG1 and RG0 @ MCON and RPCTL registers) */
|
||||
static const uint16_t ds5002fp_ranges[4] = { 0x1fff, 0x3fff, 0x7fff, 0xffff };
|
||||
/* Memory Partition Table (RG1 & RG0 @ MCON & RPCTL registers) */
|
||||
static const uint32_t ds5002fp_partitions[16] = {
|
||||
static const uint32_t ds5002fp_partitions[16] =
|
||||
{
|
||||
0x0000, 0x1000, 0x2000, 0x3000, 0x4000, 0x5000, 0x6000, 0x7000,
|
||||
0x8000, 0x9000, 0xa000, 0xb000, 0xc000, 0xd000, 0xe000, 0x10000 };
|
||||
0x8000, 0x9000, 0xa000, 0xb000, 0xc000, 0xd000, 0xe000, 0x10000
|
||||
};
|
||||
|
||||
/* if partition mode is set, adjust offset based on the bus */
|
||||
if (m_features & FEATURE_DS5002FP)
|
||||
@ -872,12 +875,12 @@ offs_t mcs51_cpu_device::external_ram_iaddr(offs_t offset, offs_t mem_mask)
|
||||
|
||||
uint8_t mcs51_cpu_device::iram_read(size_t offset)
|
||||
{
|
||||
return (((offset) < 0x80) ? m_data.read_byte(offset) : sfr_read(offset));
|
||||
return ((offset < 0x80) ? m_data.read_byte(offset) : sfr_read(offset));
|
||||
}
|
||||
|
||||
void mcs51_cpu_device::iram_write(size_t offset, uint8_t data)
|
||||
{
|
||||
if ((offset) < 0x80)
|
||||
if (offset < 0x80)
|
||||
m_data.write_byte(offset, data);
|
||||
else
|
||||
sfr_write(offset, data);
|
||||
@ -886,11 +889,11 @@ void mcs51_cpu_device::iram_write(size_t offset, uint8_t data)
|
||||
/*Push the current PC to the stack*/
|
||||
void mcs51_cpu_device::push_pc()
|
||||
{
|
||||
uint8_t tmpSP = SP+1; //Grab and Increment Stack Pointer
|
||||
uint8_t tmpSP = SP + 1; //Grab and Increment Stack Pointer
|
||||
IRAM_IW(tmpSP, (PC & 0xff)); //Store low byte of PC to Internal Ram (Use IRAM_IW to store stack above 128 bytes)
|
||||
tmpSP++; // ""
|
||||
SP = tmpSP; // ""
|
||||
IRAM_IW(tmpSP, ( (PC & 0xff00) >> 8)); //Store hi byte of PC to next address in Internal Ram (Use IRAM_IW to store stack above 128 bytes)
|
||||
IRAM_IW(tmpSP, ((PC & 0xff00) >> 8)); //Store hi byte of PC to next address in Internal Ram (Use IRAM_IW to store stack above 128 bytes)
|
||||
}
|
||||
|
||||
/*Pop the current PC off the stack and into the pc*/
|
||||
@ -907,10 +910,9 @@ void mcs51_cpu_device::set_parity()
|
||||
{
|
||||
//This flag will be set when the accumulator contains an odd # of bits set..
|
||||
uint8_t p = 0;
|
||||
int i;
|
||||
uint8_t a = ACC;
|
||||
|
||||
for (i=0; i<8; i++) //Test for each of the 8 bits in the ACC!
|
||||
for (int i = 0; i < 8; i++) //Test for each of the 8 bits in the ACC!
|
||||
{
|
||||
p ^= (a & 1);
|
||||
a = (a >> 1);
|
||||
@ -933,7 +935,7 @@ uint8_t mcs51_cpu_device::bit_address_r(uint8_t offset)
|
||||
if (offset < 0x80)
|
||||
{
|
||||
distance = 1;
|
||||
word = ( (offset & 0x78) >> 3) * distance + 0x20;
|
||||
word = ((offset & 0x78) >> 3) * distance + 0x20;
|
||||
bit_pos = offset & 0x7;
|
||||
mask = (0x1 << bit_pos);
|
||||
return((IRAM_R(word) & mask) >> bit_pos);
|
||||
@ -942,7 +944,7 @@ uint8_t mcs51_cpu_device::bit_address_r(uint8_t offset)
|
||||
else
|
||||
{
|
||||
distance = 8;
|
||||
word = ( (offset & 0x78) >> 3) * distance + 0x80;
|
||||
word = ((offset & 0x78) >> 3) * distance + 0x80;
|
||||
bit_pos = offset & 0x7;
|
||||
mask = (0x1 << bit_pos);
|
||||
return ((IRAM_R(word) & mask) >> bit_pos);
|
||||
@ -986,22 +988,22 @@ void mcs51_cpu_device::bit_address_w(uint8_t offset, uint8_t bit)
|
||||
|
||||
void mcs51_cpu_device::do_add_flags(uint8_t a, uint8_t data, uint8_t c)
|
||||
{
|
||||
uint16_t result = a+data+c;
|
||||
int16_t result1 = (int8_t)a+(int8_t)data+c;
|
||||
uint16_t result = a + data + c;
|
||||
int16_t result1 = (int8_t)a + (int8_t)data + c;
|
||||
|
||||
SET_CY((result & 0x100) >> 8);
|
||||
result = (a&0x0f)+(data&0x0f)+c;
|
||||
result = (a & 0x0f) + (data & 0x0f) + c;
|
||||
SET_AC((result & 0x10) >> 4);
|
||||
SET_OV(result1 < -128 || result1 > 127);
|
||||
}
|
||||
|
||||
void mcs51_cpu_device::do_sub_flags(uint8_t a, uint8_t data, uint8_t c)
|
||||
{
|
||||
uint16_t result = a-(data+c);
|
||||
int16_t result1 = (int8_t)a-(int8_t)(data+c);
|
||||
uint16_t result = a - (data + c);
|
||||
int16_t result1 = (int8_t)a - (int8_t)(data + c);
|
||||
|
||||
SET_CY((result & 0x100) >> 8);
|
||||
result = (a&0x0f)-((data&0x0f)+c);
|
||||
result = (a & 0x0f) - ((data & 0x0f) + c);
|
||||
SET_AC((result & 0x10) >> 4);
|
||||
SET_OV((result1 < -128 || result1 > 127));
|
||||
}
|
||||
@ -1025,12 +1027,12 @@ void mcs51_cpu_device::transmit(int state)
|
||||
|
||||
void mcs51_cpu_device::transmit_receive(int source)
|
||||
{
|
||||
int mode = (GET_SM0<<1) | GET_SM1;
|
||||
int mode = (GET_SM0 << 1) | GET_SM1;
|
||||
|
||||
if (source == 1) /* timer1 */
|
||||
m_uart.smod_div = (m_uart.smod_div + 1) & (1-GET_SMOD);
|
||||
|
||||
switch(mode)
|
||||
switch (mode)
|
||||
{
|
||||
// 8 bit shifter - rate set by clock freq / 12
|
||||
case 0:
|
||||
@ -1231,7 +1233,7 @@ void mcs51_cpu_device::transmit_receive(int source)
|
||||
|
||||
void mcs51_cpu_device::update_timer_t0(int cycles)
|
||||
{
|
||||
int mode = (GET_M0_1<<1) | GET_M0_0;
|
||||
int mode = (GET_M0_1 << 1) | GET_M0_0;
|
||||
uint32_t count;
|
||||
|
||||
if (GET_TR0)
|
||||
@ -1248,27 +1250,27 @@ void mcs51_cpu_device::update_timer_t0(int cycles)
|
||||
if (GET_GATE0 && !GET_IE0)
|
||||
delta = 0;
|
||||
|
||||
switch(mode)
|
||||
switch (mode)
|
||||
{
|
||||
case 0: /* 13 Bit Timer Mode */
|
||||
count = ((TH0<<5) | ( TL0 & 0x1f ) );
|
||||
count = ((TH0 << 5) | (TL0 & 0x1f));
|
||||
count += delta;
|
||||
if ( count & 0xffffe000 ) /* Check for overflow */
|
||||
if (count & 0xffffe000) /* Check for overflow */
|
||||
SET_TF0(1);
|
||||
TH0 = (count>>5) & 0xff;
|
||||
TH0 = (count >> 5) & 0xff;
|
||||
TL0 = count & 0x1f;
|
||||
break;
|
||||
case 1: /* 16 Bit Timer Mode */
|
||||
count = ((TH0<<8) | TL0);
|
||||
count = ((TH0 << 8) | TL0);
|
||||
count += delta;
|
||||
if ( count & 0xffff0000 ) /* Check for overflow */
|
||||
if (count & 0xffff0000) /* Check for overflow */
|
||||
SET_TF0(1);
|
||||
TH0 = (count>>8) & 0xff;
|
||||
TH0 = (count >> 8) & 0xff;
|
||||
TL0 = count & 0xff;
|
||||
break;
|
||||
case 2: /* 8 Bit Autoreload */
|
||||
count = ((uint32_t) TL0) + delta;
|
||||
if ( count & 0xffffff00 ) /* Check for overflow */
|
||||
count = ((uint32_t)TL0) + delta;
|
||||
if (count & 0xffffff00) /* Check for overflow */
|
||||
{
|
||||
SET_TF0(1);
|
||||
count += TH0; /* Reload timer */
|
||||
@ -1278,8 +1280,8 @@ void mcs51_cpu_device::update_timer_t0(int cycles)
|
||||
break;
|
||||
case 3:
|
||||
/* Split Timer 1 */
|
||||
count = ((uint32_t) TL0) + delta;
|
||||
if ( count & 0xffffff00 ) /* Check for overflow */
|
||||
count = ((uint32_t)TL0) + delta;
|
||||
if (count & 0xffffff00) /* Check for overflow */
|
||||
SET_TF0(1);
|
||||
TL0 = count & 0xff; /* Update new values of the counter */
|
||||
break;
|
||||
@ -1287,12 +1289,12 @@ void mcs51_cpu_device::update_timer_t0(int cycles)
|
||||
}
|
||||
if (GET_TR1)
|
||||
{
|
||||
switch(mode)
|
||||
switch (mode)
|
||||
{
|
||||
case 3:
|
||||
/* Split Timer 2 */
|
||||
count = ((uint32_t) TH0) + cycles; /* No gate control or counting !*/
|
||||
if ( count & 0xffffff00 ) /* Check for overflow */
|
||||
count = ((uint32_t)TH0) + cycles; /* No gate control or counting !*/
|
||||
if (count & 0xffffff00) /* Check for overflow */
|
||||
SET_TF1(1);
|
||||
TH0 = count & 0xff; /* Update new values of the counter */
|
||||
break;
|
||||
@ -1318,8 +1320,8 @@ switching it into or out of Mode 3 or it can be assigned as a baud rate generato
|
||||
|
||||
void mcs51_cpu_device::update_timer_t1(int cycles)
|
||||
{
|
||||
uint8_t mode = (GET_M1_1<<1) | GET_M1_0;
|
||||
uint8_t mode_0 = (GET_M0_1<<1) | GET_M0_0;
|
||||
uint8_t mode = (GET_M1_1 << 1) | GET_M1_0;
|
||||
uint8_t mode_0 = (GET_M0_1 << 1) | GET_M0_0;
|
||||
uint32_t count;
|
||||
|
||||
if (mode_0 != 3)
|
||||
@ -1339,29 +1341,27 @@ void mcs51_cpu_device::update_timer_t1(int cycles)
|
||||
if (GET_GATE1 && !GET_IE1)
|
||||
delta = 0;
|
||||
|
||||
switch(mode)
|
||||
switch (mode)
|
||||
{
|
||||
case 0: /* 13 Bit Timer Mode */
|
||||
count = ((TH1<<5) | ( TL1 & 0x1f ) );
|
||||
count = ((TH1 << 5) | (TL1 & 0x1f));
|
||||
count += delta;
|
||||
overflow = count & 0xffffe000; /* Check for overflow */
|
||||
TH1 = (count>>5) & 0xff;
|
||||
TH1 = (count >> 5) & 0xff;
|
||||
TL1 = count & 0x1f;
|
||||
break;
|
||||
case 1: /* 16 Bit Timer Mode */
|
||||
count = ((TH1<<8) | TL1);
|
||||
count = ((TH1 << 8) | TL1);
|
||||
count += delta;
|
||||
overflow = count & 0xffff0000; /* Check for overflow */
|
||||
TH1 = (count>>8) & 0xff;
|
||||
TH1 = (count >> 8) & 0xff;
|
||||
TL1 = count & 0xff;
|
||||
break;
|
||||
case 2: /* 8 Bit Autoreload */
|
||||
count = ((uint32_t) TL1) + delta;
|
||||
count = ((uint32_t)TL1) + delta;
|
||||
overflow = count & 0xffffff00; /* Check for overflow */
|
||||
if ( overflow )
|
||||
{
|
||||
if (overflow)
|
||||
count += TH1; /* Reload timer */
|
||||
}
|
||||
/* Update new values of the counter */
|
||||
TL1 = count & 0xff;
|
||||
break;
|
||||
@ -1384,29 +1384,27 @@ void mcs51_cpu_device::update_timer_t1(int cycles)
|
||||
delta = cycles;
|
||||
/* taken, reset */
|
||||
m_t1_cnt = 0;
|
||||
switch(mode)
|
||||
switch (mode)
|
||||
{
|
||||
case 0: /* 13 Bit Timer Mode */
|
||||
count = ((TH1<<5) | ( TL1 & 0x1f ) );
|
||||
count = ((TH1 << 5) | (TL1 & 0x1f));
|
||||
count += delta;
|
||||
overflow = count & 0xffffe000; /* Check for overflow */
|
||||
TH1 = (count>>5) & 0xff;
|
||||
TH1 = (count >> 5) & 0xff;
|
||||
TL1 = count & 0x1f;
|
||||
break;
|
||||
case 1: /* 16 Bit Timer Mode */
|
||||
count = ((TH1<<8) | TL1);
|
||||
count = ((TH1 << 8) | TL1);
|
||||
count += delta;
|
||||
overflow = count & 0xffff0000; /* Check for overflow */
|
||||
TH1 = (count>>8) & 0xff;
|
||||
TH1 = (count >> 8) & 0xff;
|
||||
TL1 = count & 0xff;
|
||||
break;
|
||||
case 2: /* 8 Bit Autoreload */
|
||||
count = ((uint32_t) TL1) + delta;
|
||||
count = ((uint32_t)TL1) + delta;
|
||||
overflow = count & 0xffffff00; /* Check for overflow */
|
||||
if ( overflow )
|
||||
{
|
||||
if (overflow)
|
||||
count += TH1; /* Reload timer */
|
||||
}
|
||||
/* Update new values of the counter */
|
||||
TL1 = count & 0xff;
|
||||
break;
|
||||
@ -1424,37 +1422,37 @@ void mcs51_cpu_device::update_timer_t1(int cycles)
|
||||
void mcs51_cpu_device::update_timer_t2(int cycles)
|
||||
{
|
||||
/* Update Timer 2 */
|
||||
if(GET_TR2)
|
||||
if (GET_TR2)
|
||||
{
|
||||
int mode = ((GET_TCLK | GET_RCLK) << 1) | GET_CP;
|
||||
int delta = GET_CT2 ? m_t2_cnt : (mode & 2) ? cycles * (12/2) : cycles;
|
||||
|
||||
uint32_t count = ((TH2<<8) | TL2) + delta;
|
||||
uint32_t count = ((TH2 << 8) | TL2) + delta;
|
||||
m_t2_cnt = 0;
|
||||
|
||||
switch (mode)
|
||||
{
|
||||
case 0: /* 16 Bit Auto Reload */
|
||||
if ( count & 0xffff0000 )
|
||||
if (count & 0xffff0000)
|
||||
{
|
||||
SET_TF2(1);
|
||||
count += ((RCAP2H<<8) | RCAP2L);
|
||||
count += ((RCAP2H << 8) | RCAP2L);
|
||||
}
|
||||
else if (GET_EXEN2 && m_t2ex_cnt>0)
|
||||
else if (GET_EXEN2 && m_t2ex_cnt > 0)
|
||||
{
|
||||
count += ((RCAP2H<<8) | RCAP2L);
|
||||
count += ((RCAP2H << 8) | RCAP2L);
|
||||
m_t2ex_cnt = 0;
|
||||
}
|
||||
TH2 = (count>>8) & 0xff;
|
||||
TH2 = (count >> 8) & 0xff;
|
||||
TL2 = count & 0xff;
|
||||
break;
|
||||
case 1: /* 16 Bit Capture */
|
||||
if ( count & 0xffff0000 )
|
||||
if (count & 0xffff0000)
|
||||
SET_TF2(1);
|
||||
TH2 = (count>>8) & 0xff;
|
||||
TH2 = (count >> 8) & 0xff;
|
||||
TL2 = count & 0xff;
|
||||
|
||||
if (GET_EXEN2 && m_t2ex_cnt>0)
|
||||
if (GET_EXEN2 && m_t2ex_cnt > 0)
|
||||
{
|
||||
RCAP2H = TH2;
|
||||
RCAP2L = TL2;
|
||||
@ -1463,12 +1461,12 @@ void mcs51_cpu_device::update_timer_t2(int cycles)
|
||||
break;
|
||||
case 2:
|
||||
case 3: /* Baud rate */
|
||||
if ( count & 0xffff0000 )
|
||||
if (count & 0xffff0000)
|
||||
{
|
||||
count += ((RCAP2H<<8) | RCAP2L);
|
||||
count += ((RCAP2H << 8) | RCAP2L);
|
||||
transmit_receive(2);
|
||||
}
|
||||
TH2 = (count>>8) & 0xff;
|
||||
TH2 = (count >> 8) & 0xff;
|
||||
TL2 = count & 0xff;
|
||||
break;
|
||||
}
|
||||
@ -1478,8 +1476,8 @@ void mcs51_cpu_device::update_timer_t2(int cycles)
|
||||
/* Check and update status of serial port */
|
||||
void mcs51_cpu_device::update_irq_prio(uint8_t ipl, uint8_t iph)
|
||||
{
|
||||
for (int i=0; i<8; i++)
|
||||
m_irq_prio[i] = ((ipl >> i) & 1) | (((iph >>i ) & 1) << 1);
|
||||
for (int i = 0; i < 8; i++)
|
||||
m_irq_prio[i] = ((ipl >> i) & 1) | (((iph >> i) & 1) << 1);
|
||||
}
|
||||
|
||||
|
||||
@ -1502,17 +1500,17 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
|
||||
m_last_op = op;
|
||||
|
||||
switch( op )
|
||||
switch (op)
|
||||
{
|
||||
case 0x00: nop(op); break; //NOP
|
||||
case 0x01: ajmp(op); break; //AJMP code addr
|
||||
case 0x02: ljmp(op); break; //LJMP code addr
|
||||
case 0x03: rr_a(op); break; //RR A
|
||||
case 0x04: inc_a(op); break; //INC A
|
||||
case 0x05: RWM=1; inc_mem(op); RWM=0; break; //INC data addr
|
||||
case 0x05: RWM = 1; inc_mem(op); RWM = 0; break; //INC data addr
|
||||
|
||||
case 0x06:
|
||||
case 0x07: inc_ir(op&1); break; //INC @R0/@R1
|
||||
case 0x07: inc_ir(op & 1); break; //INC @R0/@R1
|
||||
|
||||
case 0x08:
|
||||
case 0x09:
|
||||
@ -1521,17 +1519,17 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0x0c:
|
||||
case 0x0d:
|
||||
case 0x0e:
|
||||
case 0x0f: inc_r(op&7); break; //INC R0 to R7
|
||||
case 0x0f: inc_r(op & 7); break; //INC R0 to R7
|
||||
|
||||
case 0x10: RWM=1; jbc(op); RWM=0; break; //JBC bit addr, code addr
|
||||
case 0x10: RWM = 1; jbc(op); RWM = 0; break; //JBC bit addr, code addr
|
||||
case 0x11: acall(op); break; //ACALL code addr
|
||||
case 0x12: lcall(op); break; //LCALL code addr
|
||||
case 0x13: rrc_a(op); break; //RRC A
|
||||
case 0x14: dec_a(op); break; //DEC A
|
||||
case 0x15: RWM=1; dec_mem(op); RWM=0; break; //DEC data addr
|
||||
case 0x15: RWM = 1; dec_mem(op); RWM = 0; break; //DEC data addr
|
||||
|
||||
case 0x16:
|
||||
case 0x17: dec_ir(op&1); break; //DEC @R0/@R1
|
||||
case 0x17: dec_ir(op & 1); break; //DEC @R0/@R1
|
||||
|
||||
case 0x18:
|
||||
case 0x19:
|
||||
@ -1540,7 +1538,7 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0x1c:
|
||||
case 0x1d:
|
||||
case 0x1e:
|
||||
case 0x1f: dec_r(op&7); break; //DEC R0 to R7
|
||||
case 0x1f: dec_r(op & 7); break; //DEC R0 to R7
|
||||
|
||||
case 0x20: jb(op); break; //JB bit addr, code addr
|
||||
case 0x21: ajmp(op); break; //AJMP code addr
|
||||
@ -1550,7 +1548,7 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0x25: add_a_mem(op); break; //ADD A, data addr
|
||||
|
||||
case 0x26:
|
||||
case 0x27: add_a_ir(op&1); break; //ADD A, @R0/@R1
|
||||
case 0x27: add_a_ir(op & 1); break; //ADD A, @R0/@R1
|
||||
|
||||
case 0x28:
|
||||
case 0x29:
|
||||
@ -1559,7 +1557,7 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0x2c:
|
||||
case 0x2d:
|
||||
case 0x2e:
|
||||
case 0x2f: add_a_r(op&7); break; //ADD A, R0 to R7
|
||||
case 0x2f: add_a_r(op & 7); break; //ADD A, R0 to R7
|
||||
|
||||
case 0x30: jnb(op); break; //JNB bit addr, code addr
|
||||
case 0x31: acall(op); break; //ACALL code addr
|
||||
@ -1569,7 +1567,7 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0x35: addc_a_mem(op); break; //ADDC A, data addr
|
||||
|
||||
case 0x36:
|
||||
case 0x37: addc_a_ir(op&1); break; //ADDC A, @R0/@R1
|
||||
case 0x37: addc_a_ir(op & 1); break; //ADDC A, @R0/@R1
|
||||
|
||||
case 0x38:
|
||||
case 0x39:
|
||||
@ -1578,17 +1576,17 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0x3c:
|
||||
case 0x3d:
|
||||
case 0x3e:
|
||||
case 0x3f: addc_a_r(op&7); break; //ADDC A, R0 to R7
|
||||
case 0x3f: addc_a_r(op & 7); break; //ADDC A, R0 to R7
|
||||
|
||||
case 0x40: jc(op); break; //JC code addr
|
||||
case 0x41: ajmp(op); break; //AJMP code addr
|
||||
case 0x42: RWM=1; orl_mem_a(op); RWM=0; break; //ORL data addr, A
|
||||
case 0x43: RWM=1; orl_mem_byte(op); RWM=0; break; //ORL data addr, #data
|
||||
case 0x42: RWM = 1; orl_mem_a(op); RWM = 0; break; //ORL data addr, A
|
||||
case 0x43: RWM = 1; orl_mem_byte(op); RWM = 0; break; //ORL data addr, #data
|
||||
case 0x44: orl_a_byte(op); break;
|
||||
case 0x45: orl_a_mem(op); break; //ORL A, data addr
|
||||
|
||||
case 0x46:
|
||||
case 0x47: orl_a_ir(op&1); break; //ORL A, @RO/@R1
|
||||
case 0x47: orl_a_ir(op & 1); break; //ORL A, @RO/@R1
|
||||
|
||||
case 0x48:
|
||||
case 0x49:
|
||||
@ -1597,17 +1595,17 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0x4c:
|
||||
case 0x4d:
|
||||
case 0x4e:
|
||||
case 0x4f: orl_a_r(op&7); break; //ORL A, RO to R7
|
||||
case 0x4f: orl_a_r(op & 7); break; //ORL A, RO to R7
|
||||
|
||||
case 0x50: jnc(op); break; //JNC code addr
|
||||
case 0x51: acall(op); break; //ACALL code addr
|
||||
case 0x52: RWM=1; anl_mem_a(op); RWM=0; break; //ANL data addr, A
|
||||
case 0x53: RWM=1; anl_mem_byte(op); RWM=0; break; //ANL data addr, #data
|
||||
case 0x52: RWM = 1; anl_mem_a(op); RWM = 0; break; //ANL data addr, A
|
||||
case 0x53: RWM = 1; anl_mem_byte(op); RWM = 0; break; //ANL data addr, #data
|
||||
case 0x54: anl_a_byte(op); break; //ANL A, #data
|
||||
case 0x55: anl_a_mem(op); break; //ANL A, data addr
|
||||
|
||||
case 0x56:
|
||||
case 0x57: anl_a_ir(op&1); break; //ANL A, @RO/@R1
|
||||
case 0x57: anl_a_ir(op & 1); break; //ANL A, @RO/@R1
|
||||
|
||||
case 0x58:
|
||||
case 0x59:
|
||||
@ -1616,17 +1614,17 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0x5c:
|
||||
case 0x5d:
|
||||
case 0x5e:
|
||||
case 0x5f: anl_a_r(op&7); break; //ANL A, RO to R7
|
||||
case 0x5f: anl_a_r(op & 7); break; //ANL A, RO to R7
|
||||
|
||||
case 0x60: jz(op); break; //JZ code addr
|
||||
case 0x61: ajmp(op); break; //AJMP code addr
|
||||
case 0x62: RWM=1; xrl_mem_a(op); RWM=0; break; //XRL data addr, A
|
||||
case 0x63: RWM=1; xrl_mem_byte(op); RWM=0; break; //XRL data addr, #data
|
||||
case 0x62: RWM = 1; xrl_mem_a(op); RWM = 0; break; //XRL data addr, A
|
||||
case 0x63: RWM = 1; xrl_mem_byte(op); RWM = 0; break; //XRL data addr, #data
|
||||
case 0x64: xrl_a_byte(op); break; //XRL A, #data
|
||||
case 0x65: xrl_a_mem(op); break; //XRL A, data addr
|
||||
|
||||
case 0x66:
|
||||
case 0x67: xrl_a_ir(op&1); break; //XRL A, @R0/@R1
|
||||
case 0x67: xrl_a_ir(op & 1); break; //XRL A, @R0/@R1
|
||||
|
||||
case 0x68:
|
||||
case 0x69:
|
||||
@ -1635,7 +1633,7 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0x6c:
|
||||
case 0x6d:
|
||||
case 0x6e:
|
||||
case 0x6f: xrl_a_r(op&7); break; //XRL A, R0 to R7
|
||||
case 0x6f: xrl_a_r(op & 7); break; //XRL A, R0 to R7
|
||||
|
||||
case 0x70: jnz(op); break; //JNZ code addr
|
||||
case 0x71: acall(op); break; //ACALL code addr
|
||||
@ -1645,7 +1643,7 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0x75: mov_mem_byte(op); break; //MOV data addr, #data
|
||||
|
||||
case 0x76:
|
||||
case 0x77: mov_ir_byte(op&1); break; //MOV @R0/@R1, #data
|
||||
case 0x77: mov_ir_byte(op & 1); break; //MOV @R0/@R1, #data
|
||||
|
||||
case 0x78:
|
||||
case 0x79:
|
||||
@ -1654,7 +1652,7 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0x7c:
|
||||
case 0x7d:
|
||||
case 0x7e:
|
||||
case 0x7f: mov_r_byte(op&7); break; //MOV R0 to R7, #data
|
||||
case 0x7f: mov_r_byte(op & 7); break; //MOV R0 to R7, #data
|
||||
|
||||
case 0x80: sjmp(op); break; //SJMP code addr
|
||||
case 0x81: ajmp(op); break; //AJMP code addr
|
||||
@ -1664,7 +1662,7 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0x85: mov_mem_mem(op); break; //MOV data addr, data addr
|
||||
|
||||
case 0x86:
|
||||
case 0x87: mov_mem_ir(op&1); break; //MOV data addr, @R0/@R1
|
||||
case 0x87: mov_mem_ir(op & 1); break; //MOV data addr, @R0/@R1
|
||||
|
||||
case 0x88:
|
||||
case 0x89:
|
||||
@ -1673,7 +1671,7 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0x8c:
|
||||
case 0x8d:
|
||||
case 0x8e:
|
||||
case 0x8f: mov_mem_r(op&7); break; //MOV data addr,R0 to R7
|
||||
case 0x8f: mov_mem_r(op & 7); break; //MOV data addr,R0 to R7
|
||||
|
||||
case 0x90: mov_dptr_byte(op); break; //MOV DPTR, #data
|
||||
case 0x91: acall(op); break; //ACALL code addr
|
||||
@ -1683,7 +1681,7 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0x95: subb_a_mem(op); break; //SUBB A, data addr
|
||||
|
||||
case 0x96:
|
||||
case 0x97: subb_a_ir(op&1); break; //SUBB A, @R0/@R1
|
||||
case 0x97: subb_a_ir(op & 1); break; //SUBB A, @R0/@R1
|
||||
|
||||
case 0x98:
|
||||
case 0x99:
|
||||
@ -1692,7 +1690,7 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0x9c:
|
||||
case 0x9d:
|
||||
case 0x9e:
|
||||
case 0x9f: subb_a_r(op&7); break; //SUBB A, R0 to R7
|
||||
case 0x9f: subb_a_r(op & 7); break; //SUBB A, R0 to R7
|
||||
|
||||
case 0xa0: orl_c_nbitaddr(op); break; //ORL C, /bit addr
|
||||
case 0xa1: ajmp(op); break; //AJMP code addr
|
||||
@ -1702,7 +1700,7 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0xa5: illegal(op); break; //reserved
|
||||
|
||||
case 0xa6:
|
||||
case 0xa7: mov_ir_mem(op&1); break; //MOV @R0/@R1, data addr
|
||||
case 0xa7: mov_ir_mem(op & 1); break; //MOV @R0/@R1, data addr
|
||||
|
||||
case 0xa8:
|
||||
case 0xa9:
|
||||
@ -1711,17 +1709,17 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0xac:
|
||||
case 0xad:
|
||||
case 0xae:
|
||||
case 0xaf: mov_r_mem(op&7); break; //MOV R0 to R7, data addr
|
||||
case 0xaf: mov_r_mem(op & 7); break; //MOV R0 to R7, data addr
|
||||
|
||||
case 0xb0: anl_c_nbitaddr(op); break; //ANL C,/bit addr
|
||||
case 0xb1: acall(op); break; //ACALL code addr
|
||||
case 0xb2: RWM=1; cpl_bitaddr(op); RWM=0; break; //CPL bit addr
|
||||
case 0xb2: RWM = 1; cpl_bitaddr(op); RWM = 0; break; //CPL bit addr
|
||||
case 0xb3: cpl_c(op); break; //CPL C
|
||||
case 0xb4: cjne_a_byte(op); break; //CJNE A, #data, code addr
|
||||
case 0xb5: cjne_a_mem(op); break; //CJNE A, data addr, code addr
|
||||
|
||||
case 0xb6:
|
||||
case 0xb7: cjne_ir_byte(op&1); break; //CJNE @R0/@R1, #data, code addr
|
||||
case 0xb7: cjne_ir_byte(op & 1); break; //CJNE @R0/@R1, #data, code addr
|
||||
|
||||
case 0xb8:
|
||||
case 0xb9:
|
||||
@ -1730,17 +1728,17 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0xbc:
|
||||
case 0xbd:
|
||||
case 0xbe:
|
||||
case 0xbf: cjne_r_byte(op&7); break; //CJNE R0 to R7, #data, code addr
|
||||
case 0xbf: cjne_r_byte(op & 7); break; //CJNE R0 to R7, #data, code addr
|
||||
|
||||
case 0xc0: push(op); break; //PUSH data addr
|
||||
case 0xc1: ajmp(op); break; //AJMP code addr
|
||||
case 0xc2: RWM=1; clr_bitaddr(op); RWM=0; break; //CLR bit addr
|
||||
case 0xc2: RWM = 1; clr_bitaddr(op); RWM = 0; break; //CLR bit addr
|
||||
case 0xc3: clr_c(op); break; //CLR C
|
||||
case 0xc4: swap_a(op); break; //SWAP A
|
||||
case 0xc5: xch_a_mem(op); break; //XCH A, data addr
|
||||
|
||||
case 0xc6:
|
||||
case 0xc7: xch_a_ir(op&1); break; //XCH A, @RO/@R1
|
||||
case 0xc7: xch_a_ir(op & 1); break; //XCH A, @RO/@R1
|
||||
|
||||
case 0xc8:
|
||||
case 0xc9:
|
||||
@ -1749,17 +1747,17 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0xcc:
|
||||
case 0xcd:
|
||||
case 0xce:
|
||||
case 0xcf: xch_a_r(op&7); break; //XCH A, RO to R7
|
||||
case 0xcf: xch_a_r(op & 7); break; //XCH A, RO to R7
|
||||
|
||||
case 0xd0: pop(op); break; //POP data addr
|
||||
case 0xd1: acall(op); break; //ACALL code addr
|
||||
case 0xd2: RWM=1; setb_bitaddr(op); RWM=0; break; //SETB bit addr
|
||||
case 0xd2: RWM = 1; setb_bitaddr(op); RWM = 0; break; //SETB bit addr
|
||||
case 0xd3: setb_c(op); break; //SETB C
|
||||
case 0xd4: da_a(op); break; //DA A
|
||||
case 0xd5: RWM=1; djnz_mem(op); RWM=0; break; //DJNZ data addr, code addr
|
||||
case 0xd5: RWM = 1; djnz_mem(op); RWM = 0; break; //DJNZ data addr, code addr
|
||||
|
||||
case 0xd6:
|
||||
case 0xd7: xchd_a_ir(op&1); break; //XCHD A, @R0/@R1
|
||||
case 0xd7: xchd_a_ir(op & 1); break; //XCHD A, @R0/@R1
|
||||
|
||||
case 0xd8:
|
||||
case 0xd9:
|
||||
@ -1768,18 +1766,18 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0xdc:
|
||||
case 0xdd:
|
||||
case 0xde:
|
||||
case 0xdf: djnz_r(op&7); break; //DJNZ R0 to R7,code addr
|
||||
case 0xdf: djnz_r(op & 7); break; //DJNZ R0 to R7,code addr
|
||||
|
||||
case 0xe0: movx_a_idptr(op); break; //MOVX A,@DPTR
|
||||
case 0xe1: ajmp(op); break; //AJMP code addr
|
||||
|
||||
case 0xe2:
|
||||
case 0xe3: movx_a_ir(op&1); break; //MOVX A, @R0/@R1
|
||||
case 0xe3: movx_a_ir(op & 1); break; //MOVX A, @R0/@R1
|
||||
|
||||
case 0xe4: clr_a(op); break; //CLR A
|
||||
case 0xe5: mov_a_mem(op); break; //MOV A, data addr
|
||||
case 0xe6:
|
||||
case 0xe7: mov_a_ir(op&1); break; //MOV A,@RO/@R1
|
||||
case 0xe7: mov_a_ir(op & 1); break; //MOV A,@RO/@R1
|
||||
|
||||
case 0xe8:
|
||||
case 0xe9:
|
||||
@ -1788,19 +1786,19 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0xec:
|
||||
case 0xed:
|
||||
case 0xee:
|
||||
case 0xef: mov_a_r(op&7); break; //MOV A,R0 to R7
|
||||
case 0xef: mov_a_r(op & 7); break; //MOV A,R0 to R7
|
||||
|
||||
case 0xf0: movx_idptr_a(op); break; //MOVX @DPTR,A
|
||||
case 0xf1: acall(op); break; //ACALL code addr
|
||||
|
||||
case 0xf2:
|
||||
case 0xf3: movx_ir_a(op&1); break; //MOVX @R0/@R1,A
|
||||
case 0xf3: movx_ir_a(op & 1); break; //MOVX @R0/@R1,A
|
||||
|
||||
case 0xf4: cpl_a(op); break; //CPL A
|
||||
case 0xf5: mov_mem_a(op); break; //MOV data addr, A
|
||||
|
||||
case 0xf6:
|
||||
case 0xf7: mov_ir_a(op&1); break; //MOV @R0/@R1, A
|
||||
case 0xf7: mov_ir_a(op & 1); break; //MOV @R0/@R1, A
|
||||
|
||||
case 0xf8:
|
||||
case 0xf9:
|
||||
@ -1809,7 +1807,7 @@ void mcs51_cpu_device::execute_op(uint8_t op)
|
||||
case 0xfc:
|
||||
case 0xfd:
|
||||
case 0xfe:
|
||||
case 0xff: mov_r_a(op&7); break; //MOV R0 to R7, A
|
||||
case 0xff: mov_r_a(op & 7); break; //MOV R0 to R7, A
|
||||
default:
|
||||
illegal(op);
|
||||
}
|
||||
@ -1859,8 +1857,7 @@ const uint8_t mcs51_cpu_device::mcs51_cycles[256] =
|
||||
**********************************************************************************/
|
||||
void mcs51_cpu_device::check_irqs()
|
||||
{
|
||||
uint8_t ints = (GET_IE0 | (GET_TF0<<1) | (GET_IE1<<2) | (GET_TF1<<3)
|
||||
| ((GET_RI|GET_TI)<<4));
|
||||
uint8_t ints = (GET_IE0 | (GET_TF0 << 1) | (GET_IE1 << 2) | (GET_TF1 << 3) | ((GET_RI | GET_TI) << 4));
|
||||
uint8_t int_vec = 0;
|
||||
uint8_t int_mask;
|
||||
int priority_request = -1;
|
||||
@ -1869,14 +1866,14 @@ void mcs51_cpu_device::check_irqs()
|
||||
int_mask = (GET_EA ? IE : 0x00);
|
||||
|
||||
if (m_features & FEATURE_I8052)
|
||||
ints |= ((GET_TF2|GET_EXF2)<<5);
|
||||
ints |= ((GET_TF2 | GET_EXF2) << 5);
|
||||
|
||||
if (m_features & FEATURE_DS5002FP)
|
||||
{
|
||||
ints |= ((GET_PFW)<<5);
|
||||
ints |= ((GET_PFW) << 5);
|
||||
m_irq_prio[6] = 3; /* force highest priority */
|
||||
/* mask out interrupts not enabled */
|
||||
ints &= ((int_mask & 0x1f) | ((GET_EPFW)<<5));
|
||||
ints &= ((int_mask & 0x1f) | ((GET_EPFW) << 5));
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1904,14 +1901,14 @@ void mcs51_cpu_device::check_irqs()
|
||||
if ((m_features & FEATURE_CMOS) && GET_PD)
|
||||
return;
|
||||
|
||||
for (int i=0; i<m_num_interrupts; i++)
|
||||
for (int i = 0; i < m_num_interrupts; i++)
|
||||
{
|
||||
if (ints & (1<<i))
|
||||
if (ints & (1 << i))
|
||||
{
|
||||
if (m_irq_prio[i] > priority_request)
|
||||
{
|
||||
priority_request = m_irq_prio[i];
|
||||
int_vec = (i<<3) | 3;
|
||||
int_vec = (i << 3) | 3;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1956,11 +1953,11 @@ void mcs51_cpu_device::check_irqs()
|
||||
LOG("Take: %d %02x\n", m_cur_irq_prio, m_irq_active);
|
||||
|
||||
//Clear any interrupt flags that should be cleared since we're servicing the irq!
|
||||
switch(int_vec)
|
||||
switch (int_vec)
|
||||
{
|
||||
case V_IE0:
|
||||
//External Int Flag only cleared when configured as Edge Triggered..
|
||||
if(GET_IT0) /* for some reason having this, breaks alving dmd games */
|
||||
if (GET_IT0) /* for some reason having this, breaks alving dmd games */
|
||||
SET_IE0(0);
|
||||
break;
|
||||
case V_TF0:
|
||||
@ -1969,7 +1966,7 @@ void mcs51_cpu_device::check_irqs()
|
||||
break;
|
||||
case V_IE1:
|
||||
//External Int Flag only cleared when configured as Edge Triggered..
|
||||
if(GET_IT1) /* for some reason having this, breaks alving dmd games */
|
||||
if (GET_IT1) /* for some reason having this, breaks alving dmd games */
|
||||
SET_IE1(0);
|
||||
break;
|
||||
case V_TF1:
|
||||
@ -2025,7 +2022,7 @@ void mcs51_cpu_device::execute_set_input(int irqline, int state)
|
||||
/* detect 0->1 transitions */
|
||||
uint32_t tr_state = (~m_last_line_state) & new_state;
|
||||
|
||||
switch( irqline )
|
||||
switch (irqline)
|
||||
{
|
||||
//External Interrupt 0
|
||||
case MCS51_INT0_LINE:
|
||||
@ -2057,7 +2054,7 @@ void mcs51_cpu_device::execute_set_input(int irqline, int state)
|
||||
if (state != CLEAR_LINE)
|
||||
{
|
||||
//Need cleared->active line transition? (Logical 1-0 Pulse on the line) - CLEAR->ASSERT Transition since INT1 active lo!
|
||||
if(GET_IT1)
|
||||
if (GET_IT1)
|
||||
{
|
||||
if (GET_BIT(tr_state, MCS51_INT1_LINE))
|
||||
SET_IE1(1);
|
||||
@ -2428,11 +2425,11 @@ void mcs51_cpu_device::device_reset()
|
||||
{
|
||||
// set initial values (some of them are set using the bootstrap loader)
|
||||
PCON = 0;
|
||||
MCON = m_sfr_ram[ADDR_MCON-0x80];
|
||||
RPCTL = m_sfr_ram[ADDR_RPCTL-0x80];
|
||||
MCON = m_sfr_ram[ADDR_MCON - 0x80];
|
||||
RPCTL = m_sfr_ram[ADDR_RPCTL - 0x80];
|
||||
RPS = 0;
|
||||
RNR = 0;
|
||||
CRCR = m_sfr_ram[ADDR_CRCR-0x80];
|
||||
CRCR = m_sfr_ram[ADDR_CRCR - 0x80];
|
||||
CRCL = 0;
|
||||
CRCH = 0;
|
||||
TA = 0;
|
||||
@ -2637,25 +2634,25 @@ Documentation states that having the battery connected "maintains the internal s
|
||||
|
||||
void ds5002fp_device::nvram_default()
|
||||
{
|
||||
memset( m_scratchpad, 0, 0x80 );
|
||||
memset( m_sfr_ram, 0, 0x80 );
|
||||
memset(m_scratchpad, 0, 0x80);
|
||||
memset(m_sfr_ram, 0, 0x80);
|
||||
|
||||
int expected_bytes = 0x80 + 0x80;
|
||||
|
||||
if (!m_region.found())
|
||||
{
|
||||
logerror( "ds5002fp_device region not found\n" );
|
||||
logerror("ds5002fp_device region not found\n");
|
||||
}
|
||||
else if( m_region->bytes() != expected_bytes )
|
||||
else if (m_region->bytes() != expected_bytes)
|
||||
{
|
||||
logerror( "ds5002fp_device region length 0x%x expected 0x%x\n", m_region->bytes(), expected_bytes );
|
||||
logerror("ds5002fp_device region length 0x%x expected 0x%x\n", m_region->bytes(), expected_bytes);
|
||||
}
|
||||
else
|
||||
{
|
||||
uint8_t *region = m_region->base();
|
||||
|
||||
memcpy( m_scratchpad, region, 0x80 ); region += 0x80;
|
||||
memcpy( m_sfr_ram, region, 0x80 ); region += 0x80;
|
||||
memcpy(m_scratchpad, region, 0x80); region += 0x80;
|
||||
memcpy(m_sfr_ram, region, 0x80); region += 0x80;
|
||||
/* does anything else need storing? any registers that aren't in sfr ram?
|
||||
It isn't clear if the various initial MCON registers etc. are just stored in sfr ram
|
||||
or if the DS5002FP stores them elsewhere and the bootstrap copies them */
|
||||
|
@ -20,7 +20,7 @@ OPHANDLER( add_a_byte )
|
||||
{
|
||||
uint8_t data = ROP_ARG(PC++); //Grab data
|
||||
uint8_t result = ACC + data; //Add data to accumulator
|
||||
DO_ADD_FLAGS(ACC,data,0); //Set Flags
|
||||
DO_ADD_FLAGS(ACC, data, 0); //Set Flags
|
||||
SET_ACC(result); //Store 8 bit result of addtion in ACC
|
||||
}
|
||||
|
||||
@ -30,7 +30,7 @@ OPHANDLER( add_a_mem )
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab data address
|
||||
uint8_t data = IRAM_R(addr); //Grab data from data address
|
||||
uint8_t result = ACC + data; //Add data to accumulator
|
||||
DO_ADD_FLAGS(ACC,data,0); //Set Flags
|
||||
DO_ADD_FLAGS(ACC, data, 0); //Set Flags
|
||||
SET_ACC(result); //Store 8 bit result of addtion in ACC
|
||||
}
|
||||
|
||||
@ -39,7 +39,7 @@ OPHANDLER( add_a_ir )
|
||||
{
|
||||
uint8_t data = IRAM_IR(R_REG(r)); //Grab data from memory pointed to by R0 or R1
|
||||
uint8_t result = ACC + data; //Add data to accumulator
|
||||
DO_ADD_FLAGS(ACC,data,0); //Set Flags
|
||||
DO_ADD_FLAGS(ACC, data, 0); //Set Flags
|
||||
SET_ACC(result); //Store 8 bit result of addtion in ACC
|
||||
}
|
||||
|
||||
@ -48,7 +48,7 @@ OPHANDLER( add_a_r )
|
||||
{
|
||||
uint8_t data = R_REG(r); //Grab data from R0 - R7
|
||||
uint8_t result = ACC + data; //Add data to accumulator
|
||||
DO_ADD_FLAGS(ACC,data,0); //Set Flags
|
||||
DO_ADD_FLAGS(ACC, data, 0); //Set Flags
|
||||
SET_ACC(result); //Store 8 bit result of addtion in ACC
|
||||
}
|
||||
|
||||
@ -57,7 +57,7 @@ OPHANDLER( addc_a_byte )
|
||||
{
|
||||
uint8_t data = ROP_ARG(PC++); //Grab data
|
||||
uint8_t result = ACC + data + GET_CY; //Add data + carry flag to accumulator
|
||||
DO_ADD_FLAGS(ACC,data,GET_CY); //Set Flags
|
||||
DO_ADD_FLAGS(ACC, data, GET_CY); //Set Flags
|
||||
SET_ACC(result); //Store 8 bit result of addtion in ACC
|
||||
}
|
||||
|
||||
@ -67,7 +67,7 @@ OPHANDLER( addc_a_mem )
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab data address
|
||||
uint8_t data = IRAM_R(addr); //Grab data from data address
|
||||
uint8_t result = ACC + data + GET_CY; //Add data + carry flag to accumulator
|
||||
DO_ADD_FLAGS(ACC,data,GET_CY); //Set Flags
|
||||
DO_ADD_FLAGS(ACC, data, GET_CY); //Set Flags
|
||||
SET_ACC(result); //Store 8 bit result of addtion in ACC
|
||||
}
|
||||
|
||||
@ -76,7 +76,7 @@ OPHANDLER( addc_a_ir )
|
||||
{
|
||||
uint8_t data = IRAM_IR(R_REG(r)); //Grab data from memory pointed to by R0 or R1
|
||||
uint8_t result = ACC + data + GET_CY; //Add data + carry flag to accumulator
|
||||
DO_ADD_FLAGS(ACC,data,GET_CY); //Set Flags
|
||||
DO_ADD_FLAGS(ACC, data, GET_CY); //Set Flags
|
||||
SET_ACC(result); //Store 8 bit result of addtion in ACC
|
||||
}
|
||||
|
||||
@ -85,7 +85,7 @@ OPHANDLER( addc_a_r )
|
||||
{
|
||||
uint8_t data = R_REG(r); //Grab data from R0 - R7
|
||||
uint8_t result = ACC + data + GET_CY; //Add data + carry flag to accumulator
|
||||
DO_ADD_FLAGS(ACC,data,GET_CY); //Set Flags
|
||||
DO_ADD_FLAGS(ACC, data, GET_CY); //Set Flags
|
||||
SET_ACC(result); //Store 8 bit result of addtion in ACC
|
||||
}
|
||||
|
||||
@ -102,7 +102,7 @@ OPHANDLER( anl_mem_a )
|
||||
{
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab data address
|
||||
uint8_t data = IRAM_R(addr); //Grab data from data address
|
||||
IRAM_W(addr,data & ACC); //Set data address value to it's value Logical AND with ACC
|
||||
IRAM_W(addr, data & ACC); //Set data address value to it's value Logical AND with ACC
|
||||
}
|
||||
|
||||
//ANL data addr, #data /* 1: 0101 0011 */
|
||||
@ -111,7 +111,7 @@ OPHANDLER( anl_mem_byte )
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab data address
|
||||
uint8_t data = ROP_ARG(PC++); //Grab data
|
||||
uint8_t srcdata = IRAM_R(addr); //Grab data from data address
|
||||
IRAM_W(addr,srcdata & data); //Set data address value to it's value Logical AND with Data
|
||||
IRAM_W(addr, srcdata & data); //Set data address value to it's value Logical AND with Data
|
||||
}
|
||||
|
||||
//ANL A, #data /* 1: 0101 0100 */
|
||||
@ -149,7 +149,7 @@ OPHANDLER( anl_c_bitaddr )
|
||||
int cy = GET_CY;
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab bit address
|
||||
uint8_t bit = BIT_R(addr); //Grab bit data from bit address
|
||||
SET_CY( (cy & bit) ); //Set Carry flag to Carry Flag Value Logical AND with Bit
|
||||
SET_CY(cy & bit); //Set Carry flag to Carry Flag Value Logical AND with Bit
|
||||
}
|
||||
|
||||
//ANL C,/bit addr /* 1: 1011 0000 */
|
||||
@ -158,8 +158,8 @@ OPHANDLER( anl_c_nbitaddr )
|
||||
int cy = GET_CY;
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab bit address
|
||||
uint8_t bit = BIT_R(addr); //Grab bit data from bit address
|
||||
bit = ((~bit)&1); //Complement bit
|
||||
SET_CY( (cy & bit) ); //Set Carry flag to Carry Flag Value Logical AND with Complemented Bit
|
||||
bit = (~bit & 1); //Complement bit
|
||||
SET_CY(cy & bit); //Set Carry flag to Carry Flag Value Logical AND with Complemented Bit
|
||||
}
|
||||
|
||||
//CJNE A, #data, code addr /* 1: 1011 0100 */
|
||||
@ -168,13 +168,13 @@ OPHANDLER( cjne_a_byte )
|
||||
uint8_t data = ROP_ARG(PC++); //Grab data
|
||||
int8_t rel_addr = ROP_ARG(PC++); //Grab relative code address
|
||||
|
||||
if(ACC != data) //Jump if values are not equal
|
||||
if (ACC != data) //Jump if values are not equal
|
||||
{
|
||||
PC = PC + rel_addr;
|
||||
}
|
||||
|
||||
//Set carry flag to 1 if 1st compare value is < 2nd compare value
|
||||
SET_CY( (ACC < data) );
|
||||
SET_CY(ACC < data);
|
||||
}
|
||||
|
||||
//CJNE A, data addr, code addr /* 1: 1011 0101 */
|
||||
@ -184,13 +184,13 @@ OPHANDLER( cjne_a_mem )
|
||||
int8_t rel_addr = ROP_ARG(PC++); //Grab relative code address
|
||||
uint8_t data = IRAM_R(addr); //Pull value from data address
|
||||
|
||||
if(ACC != data) //Jump if values are not equal
|
||||
if (ACC != data) //Jump if values are not equal
|
||||
{
|
||||
PC = PC + rel_addr;
|
||||
}
|
||||
|
||||
//Set carry flag to 1 if 1st compare value is < 2nd compare value
|
||||
SET_CY( (ACC < data) );
|
||||
SET_CY(ACC < data);
|
||||
}
|
||||
|
||||
//CJNE @R0/@R1, #data, code addr /* 1: 1011 011i */
|
||||
@ -200,13 +200,13 @@ OPHANDLER( cjne_ir_byte )
|
||||
int8_t rel_addr = ROP_ARG(PC++); //Grab relative code address
|
||||
uint8_t srcdata = IRAM_IR(R_REG(r)); //Grab value pointed to by R0 or R1
|
||||
|
||||
if(srcdata != data) //Jump if values are not equal
|
||||
if (srcdata != data) //Jump if values are not equal
|
||||
{
|
||||
PC = PC + rel_addr;
|
||||
}
|
||||
|
||||
//Set carry flag to 1 if 1st compare value is < 2nd compare value
|
||||
SET_CY( (srcdata < data) );
|
||||
SET_CY(srcdata < data);
|
||||
}
|
||||
|
||||
//CJNE R0 to R7, #data, code addr /* 1: 1011 1rrr */
|
||||
@ -216,20 +216,20 @@ OPHANDLER( cjne_r_byte )
|
||||
int8_t rel_addr = ROP_ARG(PC++); //Grab relative code address
|
||||
uint8_t srcdata = R_REG(r); //Grab value of R0 - R7
|
||||
|
||||
if(srcdata != data) //Jump if values are not equal
|
||||
if (srcdata != data) //Jump if values are not equal
|
||||
{
|
||||
PC = PC + rel_addr;
|
||||
}
|
||||
|
||||
//Set carry flag to 1 if 1st compare value is < 2nd compare value
|
||||
SET_CY( (srcdata < data) );
|
||||
SET_CY(srcdata < data);
|
||||
}
|
||||
|
||||
//CLR bit addr /* 1: 1100 0010 */
|
||||
OPHANDLER( clr_bitaddr )
|
||||
{
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab bit address
|
||||
BIT_W(addr,0); //Clear bit at specified bit address
|
||||
BIT_W(addr, 0); //Clear bit at specified bit address
|
||||
}
|
||||
|
||||
//CLR C /* 1: 1100 0011 */
|
||||
@ -248,21 +248,21 @@ OPHANDLER( clr_a )
|
||||
OPHANDLER( cpl_bitaddr )
|
||||
{
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab bit address
|
||||
uint8_t data = (~BIT_R(addr))&1;
|
||||
BIT_W(addr,data); //Complement bit at specified bit address
|
||||
uint8_t data = (~BIT_R(addr)) & 1;
|
||||
BIT_W(addr, data); //Complement bit at specified bit address
|
||||
}
|
||||
|
||||
//CPL C /* 1: 1011 0011 */
|
||||
OPHANDLER( cpl_c )
|
||||
{
|
||||
uint8_t bit = (~GET_CY)&1; //Complement Carry Flag
|
||||
uint8_t bit = (~GET_CY) & 1; //Complement Carry Flag
|
||||
SET_CY(bit);
|
||||
}
|
||||
|
||||
//CPL A /* 1: 1111 0100 */
|
||||
OPHANDLER( cpl_a )
|
||||
{
|
||||
uint8_t data = ((~ACC)&0xff);
|
||||
uint8_t data = ((~ACC) & 0xff);
|
||||
SET_ACC(data); //Complement Accumulator
|
||||
}
|
||||
|
||||
@ -278,19 +278,19 @@ OPHANDLER( da_a )
|
||||
The carry flag will be set if the result is > 0x99, but not cleared otherwise */
|
||||
|
||||
uint16_t new_acc = ACC & 0xff;
|
||||
if(GET_AC || (new_acc & 0x0f) > 0x09)
|
||||
if (GET_AC || (new_acc & 0x0f) > 0x09)
|
||||
new_acc += 0x06;
|
||||
if(GET_CY || ((new_acc & 0xf0) > 0x90) || (new_acc & ~0xff))
|
||||
if (GET_CY || ((new_acc & 0xf0) > 0x90) || (new_acc & ~0xff))
|
||||
new_acc += 0x60;
|
||||
SET_ACC(new_acc&0xff);
|
||||
if(new_acc & ~0xff)
|
||||
SET_ACC(new_acc & 0xff);
|
||||
if (new_acc & ~0xff)
|
||||
SET_CY(1);
|
||||
}
|
||||
|
||||
//DEC A /* 1: 0001 0100 */
|
||||
OPHANDLER( dec_a )
|
||||
{
|
||||
SET_ACC(ACC-1);
|
||||
SET_ACC(ACC - 1);
|
||||
}
|
||||
|
||||
//DEC data addr /* 1: 0001 0101 */
|
||||
@ -298,14 +298,14 @@ OPHANDLER( dec_mem )
|
||||
{
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab data address
|
||||
uint8_t data = IRAM_R(addr);
|
||||
IRAM_W(addr,data-1);
|
||||
IRAM_W(addr, data - 1);
|
||||
}
|
||||
|
||||
//DEC @R0/@R1 /* 1: 0001 011i */
|
||||
OPHANDLER( dec_ir )
|
||||
{
|
||||
uint8_t data = IRAM_IR(R_REG(r));
|
||||
IRAM_IW(R_REG(r),data-1);
|
||||
IRAM_IW(R_REG(r), data - 1);
|
||||
}
|
||||
|
||||
//DEC R0 to R7 /* 1: 0001 1rrr */
|
||||
@ -317,14 +317,16 @@ OPHANDLER( dec_r )
|
||||
//DIV AB /* 1: 1000 0100 */
|
||||
OPHANDLER( div_ab )
|
||||
{
|
||||
if( B == 0 ) {
|
||||
if (B == 0)
|
||||
{
|
||||
//Overflow flag is set!
|
||||
SET_OV(1);
|
||||
//Really the values are undefined according to the manual, but we'll just leave them as is..
|
||||
//SET_ACC(0xff);
|
||||
//SFR_W(B,0xff);
|
||||
//SFR_W(B, 0xff);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
int a = (int)ACC / B;
|
||||
int b = (int)ACC % B;
|
||||
//A gets quotient byte, B gets remainder byte
|
||||
@ -342,8 +344,8 @@ OPHANDLER( djnz_mem )
|
||||
{
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab data address
|
||||
int8_t rel_addr = ROP_ARG(PC++); //Grab relative code address
|
||||
IRAM_W(addr,IRAM_R(addr) - 1); //Decrement value contained at data address
|
||||
if(IRAM_R(addr) != 0) //Branch if contents of data address is not 0
|
||||
IRAM_W(addr, IRAM_R(addr) - 1); //Decrement value contained at data address
|
||||
if (IRAM_R(addr) != 0) //Branch if contents of data address is not 0
|
||||
{
|
||||
PC = PC + rel_addr;
|
||||
}
|
||||
@ -353,8 +355,8 @@ OPHANDLER( djnz_mem )
|
||||
OPHANDLER( djnz_r )
|
||||
{
|
||||
int8_t rel_addr = ROP_ARG(PC++); //Grab relative code address
|
||||
SET_REG(r ,R_REG(r) - 1); //Decrement value
|
||||
if(R_REG(r) != 0) //Branch if contents of R0 - R7 is not 0
|
||||
SET_REG(r, R_REG(r) - 1); //Decrement value
|
||||
if (R_REG(r) != 0) //Branch if contents of R0 - R7 is not 0
|
||||
{
|
||||
PC = PC + rel_addr;
|
||||
}
|
||||
@ -363,7 +365,7 @@ OPHANDLER( djnz_r )
|
||||
//INC A /* 1: 0000 0100 */
|
||||
OPHANDLER( inc_a )
|
||||
{
|
||||
SET_ACC(ACC+1);
|
||||
SET_ACC(ACC + 1);
|
||||
}
|
||||
|
||||
//INC data addr /* 1: 0000 0101 */
|
||||
@ -371,14 +373,14 @@ OPHANDLER( inc_mem )
|
||||
{
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab data address
|
||||
uint8_t data = IRAM_R(addr);
|
||||
IRAM_W(addr,data+1);
|
||||
IRAM_W(addr, data + 1);
|
||||
}
|
||||
|
||||
//INC @R0/@R1 /* 1: 0000 011i */
|
||||
OPHANDLER( inc_ir )
|
||||
{
|
||||
uint8_t data = IRAM_IR(R_REG(r));
|
||||
IRAM_IW(R_REG(r),data+1);
|
||||
IRAM_IW(R_REG(r), data + 1);
|
||||
}
|
||||
|
||||
//INC R0 to R7 /* 1: 0000 1rrr */
|
||||
@ -391,7 +393,7 @@ OPHANDLER( inc_r )
|
||||
//INC DPTR /* 1: 1010 0011 */
|
||||
OPHANDLER( inc_dptr )
|
||||
{
|
||||
uint16_t dptr = (DPTR)+1;
|
||||
uint16_t dptr = (DPTR) + 1;
|
||||
SET_DPTR(dptr);
|
||||
}
|
||||
|
||||
@ -400,7 +402,7 @@ OPHANDLER( jb )
|
||||
{
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab bit address
|
||||
int8_t rel_addr = ROP_ARG(PC++); //Grab relative code address
|
||||
if(BIT_R(addr)) //If bit set at specified bit address, jump
|
||||
if (BIT_R(addr)) //If bit set at specified bit address, jump
|
||||
{
|
||||
PC = PC + rel_addr;
|
||||
}
|
||||
@ -411,9 +413,10 @@ OPHANDLER( jbc )
|
||||
{
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab bit address
|
||||
int8_t rel_addr = ROP_ARG(PC++); //Grab relative code address
|
||||
if(BIT_R(addr)) { //If bit set at specified bit address, jump
|
||||
if (BIT_R(addr)) //If bit set at specified bit address, jump
|
||||
{
|
||||
PC = PC + rel_addr;
|
||||
BIT_W(addr,0); //Clear Bit also
|
||||
BIT_W(addr, 0); //Clear Bit also
|
||||
}
|
||||
}
|
||||
|
||||
@ -421,7 +424,7 @@ OPHANDLER( jbc )
|
||||
OPHANDLER( jc )
|
||||
{
|
||||
int8_t rel_addr = ROP_ARG(PC++); //Grab relative code address
|
||||
if(GET_CY) //Jump if Carry Flag Set
|
||||
if (GET_CY) //Jump if Carry Flag Set
|
||||
{
|
||||
PC = PC + rel_addr;
|
||||
}
|
||||
@ -438,7 +441,7 @@ OPHANDLER( jnb )
|
||||
{
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab bit address
|
||||
int8_t rel_addr = ROP_ARG(PC++); //Grab relative code address
|
||||
if(!BIT_R(addr)) //If bit NOT set at specified bit address, jump
|
||||
if (!BIT_R(addr)) //If bit NOT set at specified bit address, jump
|
||||
{
|
||||
PC = PC + rel_addr;
|
||||
}
|
||||
@ -448,7 +451,7 @@ OPHANDLER( jnb )
|
||||
OPHANDLER( jnc )
|
||||
{
|
||||
int8_t rel_addr = ROP_ARG(PC++); //Grab relative code address
|
||||
if(!GET_CY) //Jump if Carry Flag not set
|
||||
if (!GET_CY) //Jump if Carry Flag not set
|
||||
{
|
||||
PC = PC + rel_addr;
|
||||
}
|
||||
@ -458,9 +461,9 @@ OPHANDLER( jnc )
|
||||
OPHANDLER( jnz )
|
||||
{
|
||||
int8_t rel_addr = ROP_ARG(PC++); //Grab relative code address
|
||||
if(ACC != 0) //Branch if ACC is not 0
|
||||
if (ACC != 0) //Branch if ACC is not 0
|
||||
{
|
||||
PC = PC+rel_addr;
|
||||
PC = PC + rel_addr;
|
||||
}
|
||||
}
|
||||
|
||||
@ -468,9 +471,9 @@ OPHANDLER( jnz )
|
||||
OPHANDLER( jz )
|
||||
{
|
||||
int8_t rel_addr = ROP_ARG(PC++); //Grab relative code address
|
||||
if(ACC == 0) //Branch if ACC is 0
|
||||
if (ACC == 0) //Branch if ACC is 0
|
||||
{
|
||||
PC = PC+rel_addr;
|
||||
PC = PC + rel_addr;
|
||||
}
|
||||
}
|
||||
|
||||
@ -481,7 +484,7 @@ OPHANDLER( lcall )
|
||||
addr_hi = ROP_ARG(PC++);
|
||||
addr_lo = ROP_ARG(PC++);
|
||||
PUSH_PC();
|
||||
PC = (uint16_t)((addr_hi<<8) | addr_lo);
|
||||
PC = (uint16_t)((addr_hi << 8) | addr_lo);
|
||||
}
|
||||
|
||||
//LJMP code addr /* 1: 0000 0010 */
|
||||
@ -490,7 +493,7 @@ OPHANDLER( ljmp )
|
||||
uint8_t addr_hi, addr_lo;
|
||||
addr_hi = ROP_ARG(PC++);
|
||||
addr_lo = ROP_ARG(PC++);
|
||||
PC = (uint16_t)((addr_hi<<8) | addr_lo);
|
||||
PC = (uint16_t)((addr_hi << 8) | addr_lo);
|
||||
}
|
||||
|
||||
//MOV A, #data /* 1: 0111 0100 */
|
||||
@ -524,7 +527,7 @@ OPHANDLER( mov_mem_byte )
|
||||
{
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab data address
|
||||
uint8_t data = ROP_ARG(PC++); //Grab data
|
||||
IRAM_W(addr,data); //Store data to data address location
|
||||
IRAM_W(addr, data); //Store data to data address location
|
||||
}
|
||||
|
||||
//MOV data addr, data addr /* 1: 1000 0101 */
|
||||
@ -534,14 +537,14 @@ OPHANDLER( mov_mem_mem )
|
||||
uint8_t src,dst;
|
||||
src = ROP_ARG(PC++); //Grab source data address
|
||||
dst = ROP_ARG(PC++); //Grab destination data address
|
||||
IRAM_W(dst,IRAM_R(src)); //Read source address contents and store to destination address
|
||||
IRAM_W(dst, IRAM_R(src)); //Read source address contents and store to destination address
|
||||
}
|
||||
|
||||
//MOV @R0/@R1, #data /* 1: 0111 011i */
|
||||
OPHANDLER( mov_ir_byte )
|
||||
{
|
||||
uint8_t data = ROP_ARG(PC++); //Grab data
|
||||
IRAM_IW(R_REG(r),data); //Store data to address pointed by R0 or R1
|
||||
IRAM_IW(R_REG(r), data); //Store data to address pointed by R0 or R1
|
||||
}
|
||||
|
||||
//MOV R0 to R7, #data /* 1: 0111 1rrr */
|
||||
@ -555,14 +558,14 @@ OPHANDLER( mov_r_byte )
|
||||
OPHANDLER( mov_mem_ir )
|
||||
{
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab data address
|
||||
IRAM_W(addr,IRAM_IR(R_REG(r))); //Store contents pointed to by R0 or R1 to data address
|
||||
IRAM_W(addr, IRAM_IR(R_REG(r))); //Store contents pointed to by R0 or R1 to data address
|
||||
}
|
||||
|
||||
//MOV data addr,R0 to R7 /* 1: 1000 1rrr */
|
||||
OPHANDLER( mov_mem_r )
|
||||
{
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab data address
|
||||
IRAM_W(addr,R_REG(r)); //Store contents of R0 - R7 to data address
|
||||
IRAM_W(addr, R_REG(r)); //Store contents of R0 - R7 to data address
|
||||
}
|
||||
|
||||
//MOV DPTR, #data16 /* 1: 1001 0000 */
|
||||
@ -571,21 +574,21 @@ OPHANDLER( mov_dptr_byte )
|
||||
uint8_t data_hi, data_lo;
|
||||
data_hi = ROP_ARG(PC++); //Grab hi byte
|
||||
data_lo = ROP_ARG(PC++); //Grab lo byte
|
||||
SET_DPTR((uint16_t)((data_hi<<8)|data_lo)); //Store to DPTR
|
||||
SET_DPTR((uint16_t)((data_hi << 8) | data_lo)); //Store to DPTR
|
||||
}
|
||||
|
||||
//MOV bit addr, C /* 1: 1001 0010 */
|
||||
OPHANDLER( mov_bitaddr_c )
|
||||
{
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab bit address
|
||||
BIT_W(addr,GET_CY); //Store Carry Flag to Bit Address
|
||||
BIT_W(addr, GET_CY); //Store Carry Flag to Bit Address
|
||||
}
|
||||
|
||||
//MOV @R0/@R1, data addr /* 1: 1010 011i */
|
||||
OPHANDLER( mov_ir_mem )
|
||||
{
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab data address
|
||||
IRAM_IW(R_REG(r),IRAM_R(addr)); //Store data from data address to address pointed to by R0 or R1
|
||||
IRAM_IW(R_REG(r), IRAM_R(addr)); //Store data from data address to address pointed to by R0 or R1
|
||||
}
|
||||
|
||||
//MOV R0 to R7, data addr /* 1: 1010 1rrr */
|
||||
@ -599,13 +602,13 @@ OPHANDLER( mov_r_mem )
|
||||
OPHANDLER( mov_mem_a )
|
||||
{
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab data address
|
||||
IRAM_W(addr,ACC); //Store A to data address
|
||||
IRAM_W(addr, ACC); //Store A to data address
|
||||
}
|
||||
|
||||
//MOV @R0/@R1, A /* 1: 1111 011i */
|
||||
OPHANDLER( mov_ir_a )
|
||||
{
|
||||
IRAM_IW(R_REG(r),ACC); //Store A to location pointed to by R0 or R1
|
||||
IRAM_IW(R_REG(r), ACC); //Store A to location pointed to by R0 or R1
|
||||
}
|
||||
|
||||
//MOV R0 to R7, A /* 1: 1111 1rrr */
|
||||
@ -618,7 +621,7 @@ OPHANDLER( mov_r_a )
|
||||
OPHANDLER( movc_a_iapc )
|
||||
{
|
||||
uint8_t data;
|
||||
data = CODEMEM_R(ACC+PC); //Move a byte from CODE(Program) Memory and store to ACC
|
||||
data = CODEMEM_R(ACC + PC); //Move a byte from CODE(Program) Memory and store to ACC
|
||||
SET_ACC(data);
|
||||
}
|
||||
|
||||
@ -626,7 +629,7 @@ OPHANDLER( movc_a_iapc )
|
||||
OPHANDLER( mov_c_bitaddr )
|
||||
{
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab bit address
|
||||
SET_CY( (BIT_R(addr)) ); //Store Bit from Bit Address to Carry Flag
|
||||
SET_CY(BIT_R(addr)); //Store Bit from Bit Address to Carry Flag
|
||||
}
|
||||
|
||||
//MOVC A, @A + DPTR /* 1: 1001 0011 */
|
||||
@ -642,7 +645,7 @@ OPHANDLER( movc_a_iadptr )
|
||||
OPHANDLER( movx_a_idptr )
|
||||
{
|
||||
// uint8_t byte = DATAMEM_R(R_DPTR); //Grab 1 byte from External DATA memory pointed to by dptr
|
||||
uint32_t addr = ERAM_ADDR(DPTR, 0xFFFF);
|
||||
uint32_t addr = ERAM_ADDR(DPTR, 0xffff);
|
||||
uint8_t byte = DATAMEM_R(addr); //Grab 1 byte from External DATA memory pointed to by dptr
|
||||
SET_ACC(byte); //Store to ACC
|
||||
}
|
||||
@ -651,7 +654,7 @@ OPHANDLER( movx_a_idptr )
|
||||
//(Move External Ram 8 bit address to A)
|
||||
OPHANDLER( movx_a_ir )
|
||||
{
|
||||
uint32_t addr = ERAM_ADDR(R_REG(r),0xFF); //Grab address by reading location pointed to by R0 or R1
|
||||
uint32_t addr = ERAM_ADDR(R_REG(r), 0xff); //Grab address by reading location pointed to by R0 or R1
|
||||
uint8_t byte = DATAMEM_R(addr); //Grab 1 byte from External DATA memory pointed to by address
|
||||
SET_ACC(byte); //Store to ACC
|
||||
}
|
||||
@ -661,7 +664,7 @@ OPHANDLER( movx_a_ir )
|
||||
OPHANDLER( movx_idptr_a )
|
||||
{
|
||||
// DATAMEM_W(R_DPTR, ACC); //Store ACC to External DATA memory address pointed to by DPTR
|
||||
uint32_t addr = ERAM_ADDR(DPTR, 0xFFFF);
|
||||
uint32_t addr = ERAM_ADDR(DPTR, 0xffff);
|
||||
DATAMEM_W(addr, ACC); //Store ACC to External DATA memory address pointed to by DPTR
|
||||
}
|
||||
|
||||
@ -669,7 +672,7 @@ OPHANDLER( movx_idptr_a )
|
||||
//(Move A to External Ram 8 bit address)
|
||||
OPHANDLER( movx_ir_a )
|
||||
{
|
||||
uint32_t addr = ERAM_ADDR(R_REG(r),0xFF); //Grab address by reading location pointed to by R0 or R1
|
||||
uint32_t addr = ERAM_ADDR(R_REG(r), 0xff); //Grab address by reading location pointed to by R0 or R1
|
||||
DATAMEM_W(addr, ACC); //Store ACC to External DATA memory address
|
||||
}
|
||||
|
||||
@ -678,10 +681,10 @@ OPHANDLER( mul_ab )
|
||||
{
|
||||
uint16_t result = ACC * B;
|
||||
//A gets lo bits, B gets hi bits of result
|
||||
B = (uint8_t) ((result & 0xFF00) >> 8);
|
||||
SET_ACC((uint8_t)(result & 0x00FF));
|
||||
B = (uint8_t)((result & 0xff00) >> 8);
|
||||
SET_ACC((uint8_t)(result & 0x00ff));
|
||||
//Set flags
|
||||
SET_OV( ((result & 0x100) >> 8) ); //Set/Clear Overflow Flag if result > 255
|
||||
SET_OV((result & 0x100) >> 8); //Set/Clear Overflow Flag if result > 255
|
||||
SET_CY(0); //Carry Flag always cleared
|
||||
}
|
||||
|
||||
@ -695,7 +698,7 @@ OPHANDLER( orl_mem_a )
|
||||
{
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab data address
|
||||
uint8_t data = IRAM_R(addr); //Grab data from data address
|
||||
IRAM_W(addr,data | ACC); //Set data address value to it's value Logical OR with ACC
|
||||
IRAM_W(addr, data | ACC); //Set data address value to it's value Logical OR with ACC
|
||||
}
|
||||
|
||||
//ORL data addr, #data /* 1: 0100 0011 */
|
||||
@ -704,7 +707,7 @@ OPHANDLER( orl_mem_byte )
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab data address
|
||||
uint8_t data = ROP_ARG(PC++); //Grab data
|
||||
uint8_t srcdata = IRAM_R(addr); //Grab data from data address
|
||||
IRAM_W(addr,srcdata | data); //Set data address value to it's value Logical OR with Data
|
||||
IRAM_W(addr, srcdata | data); //Set data address value to it's value Logical OR with Data
|
||||
}
|
||||
|
||||
//ORL A, #data /* 1: 0100 0100 */
|
||||
@ -742,7 +745,7 @@ OPHANDLER( orl_c_bitaddr )
|
||||
int cy = GET_CY;
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab bit address
|
||||
uint8_t bit = BIT_R(addr); //Grab bit data from bit address
|
||||
SET_CY( (cy | bit) ); //Set Carry flag to Carry Flag Value Logical OR with Bit
|
||||
SET_CY(cy | bit); //Set Carry flag to Carry Flag Value Logical OR with Bit
|
||||
}
|
||||
|
||||
//ORL C, /bit addr /* 1: 1010 0000 */
|
||||
@ -751,8 +754,8 @@ OPHANDLER( orl_c_nbitaddr )
|
||||
int cy = GET_CY;
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab bit address
|
||||
uint8_t bit = BIT_R(addr); //Grab bit data from bit address
|
||||
bit = ((~bit)&1); //Complement bit
|
||||
SET_CY( (cy | bit) ); //Set Carry flag to Carry Flag Value Logical OR with Complemented Bit
|
||||
bit = (~bit & 1); //Complement bit
|
||||
SET_CY(cy | bit); //Set Carry flag to Carry Flag Value Logical OR with Complemented Bit
|
||||
}
|
||||
|
||||
//POP data addr /* 1: 1101 0000 */
|
||||
@ -761,14 +764,14 @@ OPHANDLER( pop )
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab data address
|
||||
IRAM_W(addr, IRAM_IR(SP)); //Store to contents of data addr, data pointed to by Stack - IRAM_IR needed to access upper 128 bytes of stack
|
||||
//IRAM_IW(addr, IRAM_IR(R_SP)); //Store to contents of data addr, data pointed to by Stack - doesn't work, sfr's are not restored this way and it's not an indirect access anyway
|
||||
SP = SP-1; //Decrement SP
|
||||
SP = SP - 1; //Decrement SP
|
||||
}
|
||||
|
||||
//PUSH data addr /* 1: 1100 0000 */
|
||||
OPHANDLER( push )
|
||||
{
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab data address
|
||||
uint8_t tmpSP = SP+1; //Grab and Increment Stack Pointer
|
||||
uint8_t tmpSP = SP + 1; //Grab and Increment Stack Pointer
|
||||
SP = tmpSP; // ""
|
||||
IRAM_IW(tmpSP, IRAM_R(addr)); //Store to stack contents of data address - IRAM_IW needed to store to upper 128 bytes of stack, however, can't use IRAM_IR because that won't store the sfrs and it's not an indirect access anyway
|
||||
}
|
||||
@ -791,8 +794,8 @@ OPHANDLER( rl_a )
|
||||
{
|
||||
//Left Shift A, Bit 7 carries to Bit 0
|
||||
int carry = ((ACC & 0x80) >> 7);
|
||||
int data = (ACC<<1) & 0xfe;
|
||||
SET_ACC( data | carry);
|
||||
int data = (ACC << 1) & 0xfe;
|
||||
SET_ACC(data | carry);
|
||||
}
|
||||
|
||||
//RLC A /* 1: 0011 0011 */
|
||||
@ -800,8 +803,8 @@ OPHANDLER( rlc_a )
|
||||
{
|
||||
//Left Shift A, Bit 7 goes to Carry Flag, Original Carry Flag goes to Bit 0 of ACC
|
||||
int carry = ((ACC & 0x80) >> 7);
|
||||
int data = ((ACC<<1) & 0xfe) | GET_CY;
|
||||
SET_ACC( data);
|
||||
int data = ((ACC << 1) & 0xfe) | GET_CY;
|
||||
SET_ACC(data);
|
||||
SET_CY(carry);
|
||||
}
|
||||
|
||||
@ -810,8 +813,8 @@ OPHANDLER( rr_a )
|
||||
{
|
||||
//Right Shift A, Bit 0 carries to Bit 7
|
||||
int carry = ((ACC & 1) << 7);
|
||||
int data = (ACC>>1) & 0x7f;
|
||||
SET_ACC( data | carry);
|
||||
int data = (ACC >> 1) & 0x7f;
|
||||
SET_ACC(data | carry);
|
||||
}
|
||||
|
||||
//RRC A /* 1: 0001 0011 */
|
||||
@ -819,22 +822,23 @@ OPHANDLER( rrc_a )
|
||||
{
|
||||
//Right Shift A, Bit 0 goes to Carry Flag, Bit 7 of ACC gets set to original Carry Flag
|
||||
int carry = (ACC & 1);
|
||||
int data = ((ACC>>1) & 0x7f) | (GET_CY<<7);
|
||||
SET_ACC( data);
|
||||
int data = ((ACC >> 1) & 0x7f) | (GET_CY << 7);
|
||||
SET_ACC(data);
|
||||
SET_CY(carry);
|
||||
}
|
||||
|
||||
//SETB C /* 1: 1101 0011 */
|
||||
OPHANDLER( setb_c )
|
||||
{
|
||||
SET_CY(1); //Set Carry Flag
|
||||
//Set Carry Flag
|
||||
SET_CY(1);
|
||||
}
|
||||
|
||||
//SETB bit addr /* 1: 1101 0010 */
|
||||
OPHANDLER( setb_bitaddr )
|
||||
{
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab bit address
|
||||
BIT_W(addr,1); //Set Bit at Bit Address
|
||||
BIT_W(addr, 1); //Set Bit at Bit Address
|
||||
}
|
||||
|
||||
//SJMP code addr /* 1: 1000 0000 */
|
||||
@ -849,7 +853,7 @@ OPHANDLER( subb_a_byte )
|
||||
{
|
||||
uint8_t data = ROP_ARG(PC++); //Grab data
|
||||
uint8_t result = ACC - data - GET_CY; //Subtract data & carry flag from accumulator
|
||||
DO_SUB_FLAGS(ACC,data,GET_CY); //Set Flags
|
||||
DO_SUB_FLAGS(ACC, data, GET_CY); //Set Flags
|
||||
SET_ACC(result); //Store 8 bit result of addtion in ACC
|
||||
|
||||
}
|
||||
@ -860,7 +864,7 @@ OPHANDLER( subb_a_mem )
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab data address
|
||||
uint8_t data = IRAM_R(addr); //Grab data from data address
|
||||
uint8_t result = ACC - data - GET_CY; //Subtract data & carry flag from accumulator
|
||||
DO_SUB_FLAGS(ACC,data,GET_CY); //Set Flags
|
||||
DO_SUB_FLAGS(ACC, data, GET_CY); //Set Flags
|
||||
SET_ACC(result); //Store 8 bit result of addtion in ACC
|
||||
}
|
||||
|
||||
@ -869,7 +873,7 @@ OPHANDLER( subb_a_ir )
|
||||
{
|
||||
uint8_t data = IRAM_IR(R_REG(r)); //Grab data from memory pointed to by R0 or R1
|
||||
uint8_t result = ACC - data - GET_CY; //Subtract data & carry flag from accumulator
|
||||
DO_SUB_FLAGS(ACC,data,GET_CY); //Set Flags
|
||||
DO_SUB_FLAGS(ACC, data, GET_CY); //Set Flags
|
||||
SET_ACC(result); //Store 8 bit result of addtion in ACC
|
||||
}
|
||||
|
||||
@ -878,7 +882,7 @@ OPHANDLER( subb_a_r )
|
||||
{
|
||||
uint8_t data = R_REG(r); //Grab data from R0 - R7
|
||||
uint8_t result = ACC - data - GET_CY; //Subtract data & carry flag from accumulator
|
||||
DO_SUB_FLAGS(ACC,data,GET_CY); //Set Flags
|
||||
DO_SUB_FLAGS(ACC, data, GET_CY); //Set Flags
|
||||
SET_ACC(result); //Store 8 bit result of addtion in ACC
|
||||
}
|
||||
|
||||
@ -888,7 +892,7 @@ OPHANDLER( swap_a )
|
||||
uint8_t a_nib_lo, a_nib_hi;
|
||||
a_nib_hi = (ACC & 0x0f) << 4; //Grab lo byte of ACC and move to hi
|
||||
a_nib_lo = (ACC & 0xf0) >> 4; //Grab hi byte of ACC and move to lo
|
||||
SET_ACC( a_nib_hi | a_nib_lo);
|
||||
SET_ACC(a_nib_hi | a_nib_lo);
|
||||
}
|
||||
|
||||
//XCH A, data addr /* 1: 1100 0101 */
|
||||
@ -898,7 +902,7 @@ OPHANDLER( xch_a_mem )
|
||||
uint8_t data = IRAM_R(addr); //Grab data
|
||||
uint8_t oldACC = ACC; //Hold value of ACC
|
||||
SET_ACC(data); //Sets ACC to data
|
||||
IRAM_W(addr,oldACC); //Sets data address to old value of ACC
|
||||
IRAM_W(addr, oldACC); //Sets data address to old value of ACC
|
||||
}
|
||||
|
||||
//XCH A, @RO/@R1 /* 1: 1100 011i */
|
||||
@ -907,7 +911,7 @@ OPHANDLER( xch_a_ir )
|
||||
uint8_t data = IRAM_IR(R_REG(r)); //Grab data pointed to by R0 or R1
|
||||
uint8_t oldACC = ACC; //Hold value of ACC
|
||||
SET_ACC(data); //Sets ACC to data
|
||||
IRAM_IW(R_REG(r),oldACC); //Sets data address to old value of ACC
|
||||
IRAM_IW(R_REG(r), oldACC); //Sets data address to old value of ACC
|
||||
}
|
||||
|
||||
//XCH A, RO to R7 /* 1: 1100 1rrr */
|
||||
@ -925,8 +929,8 @@ OPHANDLER( xchd_a_ir )
|
||||
uint8_t acc, ir_data;
|
||||
ir_data = IRAM_IR(R_REG(r)); //Grab data pointed to by R0 or R1
|
||||
acc = ACC; //Grab ACC value
|
||||
SET_ACC( (acc & 0xf0) | (ir_data & 0x0f) ); //Set ACC to lower nibble of data pointed to by R0 or R1
|
||||
IRAM_W(R_REG(r), (ir_data & 0xf0) | (acc & 0x0f) ); //Set data pointed to by R0 or R1 to lower nibble of ACC
|
||||
SET_ACC((acc & 0xf0) | (ir_data & 0x0f)); //Set ACC to lower nibble of data pointed to by R0 or R1
|
||||
IRAM_W(R_REG(r), (ir_data & 0xf0) | (acc & 0x0f)); //Set data pointed to by R0 or R1 to lower nibble of ACC
|
||||
}
|
||||
|
||||
//XRL data addr, A /* 1: 0110 0010 */
|
||||
@ -934,7 +938,7 @@ OPHANDLER( xrl_mem_a )
|
||||
{
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab data address
|
||||
uint8_t data = IRAM_R(addr); //Grab data from data address
|
||||
IRAM_W(addr,data ^ ACC); //Set data address value to it's value Logical XOR with ACC
|
||||
IRAM_W(addr, data ^ ACC); //Set data address value to it's value Logical XOR with ACC
|
||||
}
|
||||
|
||||
//XRL data addr, #data /* 1: 0110 0011 */
|
||||
@ -943,7 +947,7 @@ OPHANDLER( xrl_mem_byte )
|
||||
uint8_t addr = ROP_ARG(PC++); //Grab data address
|
||||
uint8_t data = ROP_ARG(PC++); //Grab data
|
||||
uint8_t srcdata = IRAM_R(addr); //Grab data from data address
|
||||
IRAM_W(addr,srcdata ^ data); //Set data address value to it's value Logical XOR with Data
|
||||
IRAM_W(addr, srcdata ^ data); //Set data address value to it's value Logical XOR with Data
|
||||
}
|
||||
|
||||
//XRL A, #data /* 1: 0110 0100 */
|
||||
|
Loading…
Reference in New Issue
Block a user