diff --git a/Intel-Systems/common/i8259.c b/Intel-Systems/common/i8259.c index 94bd01ca..721dc771 100644 --- a/Intel-Systems/common/i8259.c +++ b/Intel-Systems/common/i8259.c @@ -2,29 +2,35 @@ Copyright (c) 2010, William A. Beech - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - WILLIAM A. BEECH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + WILLIAM A. BEECH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - Except as contained in this notice, the name of William A. Beech shall not be - used in advertising or otherwise to promote the sale, use or other dealings - in this Software without prior written authorization from William A. Beech. + Except as contained in this notice, the name of William A. Beech shall not be + used in advertising or otherwise to promote the sale, use or other dealings + in this Software without prior written authorization from William A. Beech. - These functions support a simulated i8259 interface device on an iSBC. - 24 Jan 13 - Original file. + NOTES: + + This software was written by Bill Beech, 24 Jan 13, to allow emulation of + more complex Multibus Computer Systems. + + This program simulates up to 2 i8259 devices. It handles 1 i8259 + device on the iSBC 80/20 and iSBC 80/30 SBCs. Other devices could be on + other multibus boards in the simulated system. */ #include "system_defs.h" /* system header in system dir */ @@ -59,8 +65,8 @@ int32 icw_num0 = 1, icw_num1 = 1; /* i8255 Standard I/O Data Structures */ UNIT i8259_unit[] = { - { UDATA (0, 0, 0) }, - { UDATA (0, 0, 0) } + { UDATA (0, 0, 0) }, /* i8259 0 */ + { UDATA (0, 0, 0) } /* i8259 1 */ }; DEBTAB i8259_debug[] = { @@ -75,10 +81,10 @@ DEBTAB i8259_debug[] = { }; REG i8259_reg[] = { - { HRDATA (IRR0, i8259_unit[0].u3, 8) }, + { HRDATA (IRR0, i8259_unit[0].u3, 8) }, /* i8259 0 */ { HRDATA (ISR0, i8259_unit[0].u4, 8) }, { HRDATA (IMR0, i8259_unit[0].u5, 8) }, - { HRDATA (IRR1, i8259_unit[1].u3, 8) }, + { HRDATA (IRR1, i8259_unit[1].u3, 8) }, /* i8259 0 */ { HRDATA (ISR1, i8259_unit[1].u4, 8) }, { HRDATA (IMR1, i8259_unit[1].u5, 8) }, { NULL } @@ -114,6 +120,8 @@ DEVICE i8259_dev = { IN or OUT instruction is issued. */ +/* i8259 0 functions */ + int32 i8259a0(int32 io, int32 data) { int32 bit; @@ -151,38 +159,6 @@ int32 i8259a0(int32 io, int32 data) return 0; } -int32 i8259b0(int32 io, int32 data) -{ - if (io == 0) { /* read data port */ - return (i8259_unit[0].u5); /* IMR */ - } else { /* write data port */ - if (icw_num0 >= 2 && icw_num0 < 5) { /* ICW mode */ - switch (icw_num0) { - case 2: /* ICW2 */ - i8259_icw2[0] = data; - break; - case 3: /* ICW3 */ - i8259_icw3[0] = data; - break; - case 4: /* ICW4 */ - if (i8259_icw1[0] & 0x01) - i8259_icw4[0] = data; - else - sim_printf("8259b-0: ICW4 not enabled - data=%02X\n", data); - break; - default: - sim_printf("8259b-0: ICW Error %02X\n", data); - break; - } - icw_num0++; - } else { - i8259_ocw1[0] = data; /* OCW0 */ - } - } - i8259_dump(0); - return 0; -} - int32 i8259a1(int32 io, int32 data) { int32 bit; @@ -220,6 +196,40 @@ int32 i8259a1(int32 io, int32 data) return 0; } +/* i8259 1 functions */ + +int32 i8259b0(int32 io, int32 data) +{ + if (io == 0) { /* read data port */ + return (i8259_unit[0].u5); /* IMR */ + } else { /* write data port */ + if (icw_num0 >= 2 && icw_num0 < 5) { /* ICW mode */ + switch (icw_num0) { + case 2: /* ICW2 */ + i8259_icw2[0] = data; + break; + case 3: /* ICW3 */ + i8259_icw3[0] = data; + break; + case 4: /* ICW4 */ + if (i8259_icw1[0] & 0x01) + i8259_icw4[0] = data; + else + sim_printf("8259b-0: ICW4 not enabled - data=%02X\n", data); + break; + default: + sim_printf("8259b-0: ICW Error %02X\n", data); + break; + } + icw_num0++; + } else { + i8259_ocw1[0] = data; /* OCW0 */ + } + } + i8259_dump(0); + return 0; +} + int32 i8259b1(int32 io, int32 data) { if (io == 0) { /* read data port */