summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/pps41/mm78op.cpp
blob: 6b5ef774481a2a6dad07ad96f750975386ad422a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
// license:BSD-3-Clause
// copyright-holders:hap

// MM77/MM78 opcode handlers

#include "emu.h"
#include "mm78.h"


// opcodes

// changed opcodes

void mm78_device::op_lba()
{
	// LBA: no RAM delay
	mm76_device::op_lba();
	m_ram_delay = false;
}

void mm78_device::op_acsk()
{
	// ACSK: skip logic is inverted
	mm76_device::op_acsk();
	m_skip = !m_skip;
}

void mm78_device::op_aisk()
{
	// AISK x: don't skip if x=6 (aka DC opcode)
	mm76_device::op_aisk();
	if ((m_op & 0xf) == 6)
		m_skip = false;
}

void mm78_device::op_sb()
{
	// SB x: SB/SOS opcodes are separated
	ram_w(ram_r() | (1 << (m_op & 3)));
}

void mm78_device::op_rb()
{
	// RB x: RB/ROS opcodes are separated
	ram_w(ram_r() & ~(1 << (m_op & 3)));
}

void mm78_device::op_skbf()
{
	// SKBF x: SKBF/SKISL opcodes are separated
	m_skip = !BIT(ram_r(), m_op & 3);
}

void mm78_device::op_sos()
{
	// SOS: SB/SOS opcodes are separated
	op_todo();
}

void mm78_device::op_ros()
{
	// ROS: RB/ROS opcodes are separated
	op_todo();
}

void mm78_device::op_skisl()
{
	// SKISL: SKBF/SKISL opcodes are separated
	op_todo();
}


// new opcodes

void mm78_device::op_sag()
{
	// SAG: set Bu to 3 for the next cycle
	m_sag = true;
}

void mm78_device::op_lxa()
{
	// LXA: load X from A
	m_x = m_a;
}

void mm78_device::op_xax()
{
	// XAX: exchange A with X
	u8 a = m_a;
	m_a = m_x;
	m_x = a;
}

void mm78_device::op_tlb()
{
	// TLB x: transfer long banked
	op_tl();
	m_pc |= 0x400;
}

void mm78_device::op_tmlb()
{
	// TMLB x: transfer and mark long banked
	op_tml();
	m_pc |= 0x400;
}

void mm78_device::op_tab()
{
	// TAB: table look up transfer
	m_skip_count = m_a + 1;
	m_a = 0xf;
}

void mm78_device::op_ix()
{
	// IX: input to X from channel X(aka B)
	op_todo();
}

void mm78_device::op_ox()
{
	// OX: output from X to channel X(aka B)
	op_todo();
}

void mm78_device::op_ioa()
{
	// IOA: exchange A with channel A
	op_todo();
}

void mm78_device::op_i1sk()
{
	// I1SK: add channel 1 to A, skip on no overflow
	m_a += m_read_p() & 0xf;
	m_skip = !(m_a & 0x10);
	m_a &= 0xf;
}

void mm78_device::op_int0h()
{
	// INT0H: skip on INT0 high
	m_skip = bool(m_int_line[0]);
}

void mm78_device::op_int1l()
{
	// INT1L: skip on INT1 low
	m_skip = !m_int_line[1];
}