54 int new_isa_assert, x;
58 if (d->pic2->irr & ~d->pic2->ier)
61 d->pic1->irr &= ~0x04;
66 new_isa_assert = d->pic1->irr & ~d->pic1->ier;
68 if (old_isa_assert == new_isa_assert)
71 if (!new_isa_assert) {
76 for (x=0; x<16; x++) {
80 if (x < 8 && (d->pic1->irr & ~d->pic1->ier & (1 << x)))
83 if (x >= 8 && (d->pic2->irr & ~d->pic2->ier & (1 << (x&7))))
87 *d->ptr_to_last_int = x;
100 struct bus_isa_data *d = (
struct bus_isa_data *) interrupt->
extra;
101 int old_isa_assert, line = interrupt->
line;
102 int mask = 1 << (line & 7);
104 old_isa_assert = d->pic1->irr & ~d->pic1->ier;
107 d->pic1->irr |= mask;
108 else if (d->pic2 != NULL)
109 d->pic2->irr |= mask;
122 struct bus_isa_data *d = (
struct bus_isa_data *) interrupt->
extra;
123 int line = interrupt->
line, mask = 1 << (line & 7);
124 int old_irr1 = d->pic1->irr, old_isa_assert;
126 old_isa_assert = old_irr1 & ~d->pic1->ier;
129 d->pic1->irr &= ~mask;
130 else if (d->pic2 != NULL)
131 d->pic2->irr &= ~mask;
135 if (old_irr1 & 1 && !(d->pic1->irr & 1) &&
136 d->ptr_to_pending_timer_interrupts != NULL &&
137 (*d->ptr_to_pending_timer_interrupts) > 0)
138 (*d->ptr_to_pending_timer_interrupts) --;
175 char *interrupt_base_path, uint32_t bus_isa_flags,
176 uint64_t isa_portbase, uint64_t isa_membase)
178 struct bus_isa_data *d;
179 char tmpstr[300], tmpstr2[300];
180 int wdc0_irq = 14, wdc1_irq = 15;
181 int i, tmp_handle, kbd_in_use;
184 CHECK_ALLOCATION(d = (
struct bus_isa_data *) malloc(
sizeof(
struct bus_isa_data)));
185 memset(d, 0,
sizeof(
struct bus_isa_data));
187 d->isa_portbase = isa_portbase;
188 d->isa_membase = isa_membase;
196 for (i=0; i<16; i++) {
199 snprintf(name,
sizeof(name),
200 "%s.isa.%i", interrupt_base_path, i);
201 memset(&templ, 0,
sizeof(templ));
216 wdc0_irq = wdc1_irq = 13;
219 if (!(bus_isa_flags & BUS_ISA_EXTERNAL_PIC)) {
220 snprintf(tmpstr,
sizeof(tmpstr),
"8259 irq=%s addr=0x%llx",
221 interrupt_base_path, (
long long)(isa_portbase + 0x20));
224 d->ptr_to_pending_timer_interrupts =
229 bus_isa_flags &= ~BUS_ISA_NO_SECOND_PIC;
231 snprintf(tmpstr,
sizeof(tmpstr),
232 "8259 irq=%s.isa.2 addr=0x%llx",
233 interrupt_base_path,(
long long)(isa_portbase+0xa0));
238 bus_isa_flags &= ~BUS_ISA_EXTERNAL_PIC;
241 snprintf(tmpstr,
sizeof(tmpstr),
"8253 irq=%s.isa.%i addr=0x%llx " 242 "in_use=0", interrupt_base_path, 0,
243 (
long long)(isa_portbase + 0x40));
246 snprintf(tmpstr,
sizeof(tmpstr),
"pccmos irq=%s.isa.%i addr=0x%llx",
247 interrupt_base_path, 8, (
long long)(isa_portbase + 0x70));
250 snprintf(tmpstr,
sizeof(tmpstr),
"ns16550 irq=%s.isa.%i addr=0x%llx " 251 "name2=tty0 in_use=%i", interrupt_base_path, 4,
252 (
long long)(isa_portbase + 0x3f8), 1 - kbd_in_use);
255 snprintf(tmpstr,
sizeof(tmpstr),
"ns16550 irq=%s.isa.%i addr=0x%llx " 256 "name2=tty1 in_use=0", interrupt_base_path, 3,
257 (
long long)(isa_portbase + 0x2f8));
261 bus_isa_flags &= ~BUS_ISA_LPTBASE_3BC;
265 snprintf(tmpstr,
sizeof(tmpstr),
"lpt irq=%s.isa.%i addr=0x%llx " 266 "name2=lpt in_use=0", interrupt_base_path, 7,
267 (
long long)(isa_portbase + lptbase));
271 bus_isa_flags &= ~BUS_ISA_IDE0;
272 snprintf(tmpstr,
sizeof(tmpstr),
"wdc irq=%s.isa.%i " 273 "addr=0x%llx", interrupt_base_path, wdc0_irq,
274 (
long long)(isa_portbase + 0x1f0));
281 bus_isa_flags &= ~BUS_ISA_IDE1;
282 snprintf(tmpstr,
sizeof(tmpstr),
"wdc irq=%s.isa.%i " 283 "addr=0x%llx", interrupt_base_path, wdc1_irq,
284 (
long long)(isa_portbase + 0x170));
291 bus_isa_flags &= ~BUS_ISA_FDC;
292 snprintf(tmpstr,
sizeof(tmpstr),
"fdc irq=%s.isa.%i " 293 "addr=0x%llx", interrupt_base_path, 6,
294 (
long long)(isa_portbase + 0x3f0));
301 isa_membase + 0xa0000, isa_portbase + 0x3c0,
306 snprintf(tmpstr,
sizeof(tmpstr),
"%s.isa.1", interrupt_base_path);
307 snprintf(tmpstr2,
sizeof(tmpstr2),
"%s.isa.12", interrupt_base_path);
309 isa_portbase + 0x60,
PCKBC_8042, tmpstr, tmpstr2,
317 if (bus_isa_flags != 0)
318 fatal(
"WARNING! bus_isa(): unimplemented bus_isa_flags 0x%x\n",
void fatal(const char *fmt,...)
#define BUS_ISA_LPTBASE_3BC
void(* interrupt_assert)(struct interrupt *)
int diskimage_exist(struct machine *machine, int id, int type)
void dev_vga_init(struct machine *machine, struct memory *mem, uint64_t videomem_base, uint64_t control_base, const char *name)
void isa_interrupt_common(struct bus_isa_data *d, int old_isa_assert)
int * pending_timer_interrupts
void interrupt_handler_register(struct interrupt *templ)
void isa_interrupt_deassert(struct interrupt *interrupt)
void(* interrupt_deassert)(struct interrupt *)
void isa_interrupt_assert(struct interrupt *interrupt)
#define BUS_ISA_PCKBC_FORCE_USE
void * device_add(struct machine *machine, const char *name_and_params)
struct isa_pic_data isa_pic_data
#define BUS_ISA_NO_SECOND_PIC
#define CHECK_ALLOCATION(ptr)
#define BUS_ISA_VGA_FORCE
struct pic8259_data * pic1
#define INTERRUPT_ASSERT(istruct)
#define INTERRUPT_CONNECT(name, istruct)
#define BUS_ISA_EXTERNAL_PIC
struct bus_isa_data * bus_isa_init(struct machine *machine, char *interrupt_base_path, uint32_t bus_isa_flags, uint64_t isa_portbase, uint64_t isa_membase)
struct pic8259_data * pic2
int dev_pckbc_init(struct machine *machine, struct memory *mem, uint64_t baseaddr, int type, char *keyboard_irqpath, char *mouse_irqpath, int in_use, int pc_style_flag)
#define BUS_ISA_PCKBC_NONPCSTYLE
const char * machine_name
#define INTERRUPT_DEASSERT(istruct)