📄 6821pia.c
字号:
if (p->out_cb2 ^ temp)
if (p->out_cb2_func) p->out_cb2_func (0, temp);
/* set the new value */
p->out_cb2 = temp;
}
/* update the control register */
p->ctl_b = data;
break;
}
}
/******************* interface setting PIA port A input *******************/
void pia_set_input_a (int which, int data)
{
struct pia6821 *p = pia + which;
/* set the input, what could be easier? */
p->in_a = data;
}
/******************* interface setting PIA port CA1 input *******************/
void pia_set_input_ca1 (int which, int data)
{
struct pia6821 *p = pia + which;
/* limit the data to 0 or 1 */
data = data ? 1 : 0;
/* the new state has caused a transition */
if (p->in_ca1 ^ data)
{
/* handle the active transition */
if ((data && C1_LOW_TO_HIGH (p->ctl_a)) || (!data && C1_HIGH_TO_LOW (p->ctl_a)))
{
/* mark the IRQ */
p->irq_a1 = 1;
/* call the IRQ function if enabled */
if (IRQ1_ENABLED (p->ctl_a))
if (p->irq_a_func) p->irq_a_func ();
/* CA2 is configured as output and in read strobe mode and cleared by a CA1 transition */
if (C2_OUTPUT (p->ctl_a) && C2_STROBE_MODE (p->ctl_a) && STROBE_C1_RESET (p->ctl_a))
{
/* call the CA2 output function */
if (!p->out_ca2)
if (p->out_ca2_func) p->out_ca2_func (0, 1);
/* clear CA2 */
p->out_ca2 = 1;
}
}
}
/* set the new value for CA1 */
p->in_ca1 = data;
}
/******************* interface setting PIA port CA2 input *******************/
void pia_set_input_ca2 (int which, int data)
{
struct pia6821 *p = pia + which;
/* limit the data to 0 or 1 */
data = data ? 1 : 0;
/* CA2 is in input mode */
if (C2_INPUT (p->ctl_a))
{
/* the new state has caused a transition */
if (p->in_ca2 ^ data)
{
/* handle the active transition */
if ((data && C2_LOW_TO_HIGH (p->ctl_a)) || (!data && C2_HIGH_TO_LOW (p->ctl_a)))
{
/* mark the IRQ */
p->irq_a2 = 1;
/* call the IRQ function if enabled */
if (IRQ2_ENABLED (p->ctl_a))
if (p->irq_a_func) p->irq_a_func ();
}
}
}
/* set the new value for CA2 */
p->in_ca2 = data;
}
/******************* interface setting PIA port B input *******************/
void pia_set_input_b (int which, int data)
{
struct pia6821 *p = pia + which;
/* set the input, what could be easier? */
p->in_b = data;
}
/******************* interface setting PIA port CB1 input *******************/
void pia_set_input_cb1 (int which, int data)
{
struct pia6821 *p = pia + which;
/* limit the data to 0 or 1 */
data = data ? 1 : 0;
/* the new state has caused a transition */
if (p->in_cb1 ^ data)
{
/* handle the active transition */
if ((data && C1_LOW_TO_HIGH (p->ctl_b)) || (!data && C1_HIGH_TO_LOW (p->ctl_b)))
{
/* mark the IRQ */
p->irq_b1 = 1;
/* call the IRQ function if enabled */
if (IRQ1_ENABLED (p->ctl_b))
if (p->irq_b_func) p->irq_b_func ();
/* CB2 is configured as output and in write strobe mode and cleared by a CA1 transition */
if (C2_OUTPUT (p->ctl_b) && C2_STROBE_MODE (p->ctl_b) && STROBE_C1_RESET (p->ctl_b))
{
/* the IRQ1 flag must have also been cleared */
if (!p->irq_b1)
{
/* call the CB2 output function */
if (!p->out_cb2)
if (p->out_cb2_func) p->out_cb2_func (0, 1);
/* clear CB2 */
p->out_cb2 = 1;
}
}
}
}
/* set the new value for CB1 */
p->in_cb1 = data;
}
/******************* interface setting PIA port CB2 input *******************/
void pia_set_input_cb2 (int which, int data)
{
struct pia6821 *p = pia + which;
/* limit the data to 0 or 1 */
data = data ? 1 : 0;
/* CB2 is in input mode */
if (C2_INPUT (p->ctl_b))
{
/* the new state has caused a transition */
if (p->in_cb2 ^ data)
{
/* handle the active transition */
if ((data && C2_LOW_TO_HIGH (p->ctl_b)) || (!data && C2_HIGH_TO_LOW (p->ctl_b)))
{
/* mark the IRQ */
p->irq_b2 = 1;
/* call the IRQ function if enabled */
if (IRQ2_ENABLED (p->ctl_b))
if (p->irq_b_func) p->irq_b_func ();
}
}
}
/* set the new value for CA2 */
p->in_cb2 = data;
}
/******************* Standard 8-bit CPU interfaces, D0-D7 *******************/
int pia_1_r (int offset) { return pia_read (0, offset); }
int pia_2_r (int offset) { return pia_read (1, offset); }
int pia_3_r (int offset) { return pia_read (2, offset); }
int pia_4_r (int offset) { return pia_read (3, offset); }
int pia_5_r (int offset) { return pia_read (4, offset); }
int pia_6_r (int offset) { return pia_read (5, offset); }
int pia_7_r (int offset) { return pia_read (6, offset); }
int pia_8_r (int offset) { return pia_read (7, offset); }
void pia_1_w (int offset, int data) { pia_write (0, offset, data); }
void pia_2_w (int offset, int data) { pia_write (1, offset, data); }
void pia_3_w (int offset, int data) { pia_write (2, offset, data); }
void pia_4_w (int offset, int data) { pia_write (3, offset, data); }
void pia_5_w (int offset, int data) { pia_write (4, offset, data); }
void pia_6_w (int offset, int data) { pia_write (5, offset, data); }
void pia_7_w (int offset, int data) { pia_write (6, offset, data); }
void pia_8_w (int offset, int data) { pia_write (7, offset, data); }
/******************* 8-bit A/B port interfaces *******************/
void pia_1_porta_w (int offset, int data) { pia_set_input_a (0, data); }
void pia_2_porta_w (int offset, int data) { pia_set_input_a (1, data); }
void pia_3_porta_w (int offset, int data) { pia_set_input_a (2, data); }
void pia_4_porta_w (int offset, int data) { pia_set_input_a (3, data); }
void pia_5_porta_w (int offset, int data) { pia_set_input_a (4, data); }
void pia_6_porta_w (int offset, int data) { pia_set_input_a (5, data); }
void pia_7_porta_w (int offset, int data) { pia_set_input_a (6, data); }
void pia_8_porta_w (int offset, int data) { pia_set_input_a (7, data); }
void pia_1_portb_w (int offset, int data) { pia_set_input_b (0, data); }
void pia_2_portb_w (int offset, int data) { pia_set_input_b (1, data); }
void pia_3_portb_w (int offset, int data) { pia_set_input_b (2, data); }
void pia_4_portb_w (int offset, int data) { pia_set_input_b (3, data); }
void pia_5_portb_w (int offset, int data) { pia_set_input_b (4, data); }
void pia_6_portb_w (int offset, int data) { pia_set_input_b (5, data); }
void pia_7_portb_w (int offset, int data) { pia_set_input_b (6, data); }
void pia_8_portb_w (int offset, int data) { pia_set_input_b (7, data); }
int pia_1_porta_r (int offset) { return pia[0].in_a; }
int pia_2_porta_r (int offset) { return pia[1].in_a; }
int pia_3_porta_r (int offset) { return pia[2].in_a; }
int pia_4_porta_r (int offset) { return pia[3].in_a; }
int pia_5_porta_r (int offset) { return pia[4].in_a; }
int pia_6_porta_r (int offset) { return pia[5].in_a; }
int pia_7_porta_r (int offset) { return pia[6].in_a; }
int pia_8_porta_r (int offset) { return pia[7].in_a; }
int pia_1_portb_r (int offset) { return pia[0].in_b; }
int pia_2_portb_r (int offset) { return pia[1].in_b; }
int pia_3_portb_r (int offset) { return pia[2].in_b; }
int pia_4_portb_r (int offset) { return pia[3].in_b; }
int pia_5_portb_r (int offset) { return pia[4].in_b; }
int pia_6_portb_r (int offset) { return pia[5].in_b; }
int pia_7_portb_r (int offset) { return pia[6].in_b; }
int pia_8_portb_r (int offset) { return pia[7].in_b; }
/******************* 1-bit CA1/CA2/CB1/CB2 port interfaces *******************/
void pia_1_ca1_w (int offset, int data) { pia_set_input_ca1 (0, data); }
void pia_2_ca1_w (int offset, int data) { pia_set_input_ca1 (1, data); }
void pia_3_ca1_w (int offset, int data) { pia_set_input_ca1 (2, data); }
void pia_4_ca1_w (int offset, int data) { pia_set_input_ca1 (3, data); }
void pia_5_ca1_w (int offset, int data) { pia_set_input_ca1 (4, data); }
void pia_6_ca1_w (int offset, int data) { pia_set_input_ca1 (5, data); }
void pia_7_ca1_w (int offset, int data) { pia_set_input_ca1 (6, data); }
void pia_8_ca1_w (int offset, int data) { pia_set_input_ca1 (7, data); }
void pia_1_ca2_w (int offset, int data) { pia_set_input_ca2 (0, data); }
void pia_2_ca2_w (int offset, int data) { pia_set_input_ca2 (1, data); }
void pia_3_ca2_w (int offset, int data) { pia_set_input_ca2 (2, data); }
void pia_4_ca2_w (int offset, int data) { pia_set_input_ca2 (3, data); }
void pia_5_ca2_w (int offset, int data) { pia_set_input_ca2 (4, data); }
void pia_6_ca2_w (int offset, int data) { pia_set_input_ca2 (5, data); }
void pia_7_ca2_w (int offset, int data) { pia_set_input_ca2 (6, data); }
void pia_8_ca2_w (int offset, int data) { pia_set_input_ca2 (7, data); }
void pia_1_cb1_w (int offset, int data) { pia_set_input_cb1 (0, data); }
void pia_2_cb1_w (int offset, int data) { pia_set_input_cb1 (1, data); }
void pia_3_cb1_w (int offset, int data) { pia_set_input_cb1 (2, data); }
void pia_4_cb1_w (int offset, int data) { pia_set_input_cb1 (3, data); }
void pia_5_cb1_w (int offset, int data) { pia_set_input_cb1 (4, data); }
void pia_6_cb1_w (int offset, int data) { pia_set_input_cb1 (5, data); }
void pia_7_cb1_w (int offset, int data) { pia_set_input_cb1 (6, data); }
void pia_8_cb1_w (int offset, int data) { pia_set_input_cb1 (7, data); }
void pia_1_cb2_w (int offset, int data) { pia_set_input_cb2 (0, data); }
void pia_2_cb2_w (int offset, int data) { pia_set_input_cb2 (1, data); }
void pia_3_cb2_w (int offset, int data) { pia_set_input_cb2 (2, data); }
void pia_4_cb2_w (int offset, int data) { pia_set_input_cb2 (3, data); }
void pia_5_cb2_w (int offset, int data) { pia_set_input_cb2 (4, data); }
void pia_6_cb2_w (int offset, int data) { pia_set_input_cb2 (5, data); }
void pia_7_cb2_w (int offset, int data) { pia_set_input_cb2 (6, data); }
void pia_8_cb2_w (int offset, int data) { pia_set_input_cb2 (7, data); }
int pia_1_ca1_r (int offset) { return pia[0].in_ca1; }
int pia_2_ca1_r (int offset) { return pia[1].in_ca1; }
int pia_3_ca1_r (int offset) { return pia[2].in_ca1; }
int pia_4_ca1_r (int offset) { return pia[3].in_ca1; }
int pia_5_ca1_r (int offset) { return pia[4].in_ca1; }
int pia_6_ca1_r (int offset) { return pia[5].in_ca1; }
int pia_7_ca1_r (int offset) { return pia[6].in_ca1; }
int pia_8_ca1_r (int offset) { return pia[7].in_ca1; }
int pia_1_ca2_r (int offset) { return pia[0].in_ca2; }
int pia_2_ca2_r (int offset) { return pia[1].in_ca2; }
int pia_3_ca2_r (int offset) { return pia[2].in_ca2; }
int pia_4_ca2_r (int offset) { return pia[3].in_ca2; }
int pia_5_ca2_r (int offset) { return pia[4].in_ca2; }
int pia_6_ca2_r (int offset) { return pia[5].in_ca2; }
int pia_7_ca2_r (int offset) { return pia[6].in_ca2; }
int pia_8_ca2_r (int offset) { return pia[7].in_ca2; }
int pia_1_cb1_r (int offset) { return pia[0].in_cb1; }
int pia_2_cb1_r (int offset) { return pia[1].in_cb1; }
int pia_3_cb1_r (int offset) { return pia[2].in_cb1; }
int pia_4_cb1_r (int offset) { return pia[3].in_cb1; }
int pia_5_cb1_r (int offset) { return pia[4].in_cb1; }
int pia_6_cb1_r (int offset) { return pia[5].in_cb1; }
int pia_7_cb1_r (int offset) { return pia[6].in_cb1; }
int pia_8_cb1_r (int offset) { return pia[7].in_cb1; }
int pia_1_cb2_r (int offset) { return pia[0].in_cb2; }
int pia_2_cb2_r (int offset) { return pia[1].in_cb2; }
int pia_3_cb2_r (int offset) { return pia[2].in_cb2; }
int pia_4_cb2_r (int offset) { return pia[3].in_cb2; }
int pia_5_cb2_r (int offset) { return pia[4].in_cb2; }
int pia_6_cb2_r (int offset) { return pia[5].in_cb2; }
int pia_7_cb2_r (int offset) { return pia[6].in_cb2; }
int pia_8_cb2_r (int offset) { return pia[7].in_cb2; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -