/* sys.c: Intel System Configuration Device Copyright (c) 2020, 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: 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. 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. MODIFICATIONS: 11 Sep 20 - Original file. NOTES: */ #include "system_defs.h" /* system header in system dir */ //option board types #define SBC064 128 #define SBC464 129 #define SBC201 130 #define SBC202 131 #define SBC204 132 #define SBC206 133 #define SBC208 134 #define ZX200A 135 //Single board computer device types #define i3214 1 #define i8080 2 #define i8085 3 #define i8251 4 #define i8253 5 #define i8255 6 #define i8259 7 #define IOC_CONT 8 #define IPC_CONT 9 #define MULTI 64 #define EPROM 65 #define RAM 66 //System types #define MDS_210 0 #define MDS_220 1 #define MDS_225 2 #define MDS_230 3 #define MDS_800 4 #define MDS_810 5 #define SDK_80 6 #define SYS_8010 7 #define SYS_8010A 8 #define SYS_8010B 9 #define SYS_8020 10 #define SYS_80204 11 #define SYS_8024 12 #define SYS_8030 13 #define SYS_8010_0 14 #define SYS_8010_1 15 #define SYS_8010_2 16 #define SYS_8010_3 17 #define sys_name "Intel MDS Configuration Controller" /* external globals */ extern uint16 PCX; /* function prototypes */ t_stat sys_cfg(uint16 base, uint16 devnum, uint8 dummy); t_stat sys_clr(void); t_stat sys_reset(DEVICE *dptr); static const char* sys_desc(DEVICE *dptr); t_stat sys_set_model (UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat sys_show_model (FILE *st, UNIT *uptr, int32 val, CONST void *desc); /* external function prototypes */ extern uint8 reg_dev(uint8 (*routine)(t_bool, uint8, uint8), uint16, uint16, uint8); extern uint8 unreg_dev(uint16); extern t_stat i3214_cfg(uint16 base, uint16 devnum, uint8 dummy); extern t_stat i8251_cfg(uint16 base, uint16 devnum, uint8 dummy); extern t_stat i8253_cfg(uint16 base, uint16 devnum, uint8 dummy); extern t_stat i8255_cfg(uint16 base, uint16 devnum, uint8 dummy); extern t_stat i8259_cfg(uint16 base, uint16 devnum, uint8 dummy); extern t_stat ioc_cont_cfg(uint16 base, uint16 devnum, uint8 dummy); extern t_stat ipc_cont_cfg(uint16 base, uint16 devnum, uint8 dummy); extern t_stat EPROM_cfg(uint16 base, uint16 size, uint8 devnum); extern t_stat RAM_cfg(uint16 base, uint16 size, uint8 dummy); extern t_stat isbc064_cfg(uint16 base, uint16 size, uint8 dummy); extern t_stat isbc464_cfg(uint16 base, uint16 size, uint8 dummy); extern t_stat isbc201_cfg(uint16 base, uint16 size, uint8 dummy); extern t_stat isbc202_cfg(uint16 base, uint16 size, uint8 dummy); extern t_stat isbc208_cfg(uint16 base, uint16 size, uint8 dummy); extern t_stat i3214_clr(void); extern t_stat i8251_clr(void); extern t_stat i8253_clr(void); extern t_stat i8255_clr(void); extern t_stat i8259_clr(void); extern t_stat ioc_cont_clr(void); extern t_stat ipc_cont_clr(void); extern t_stat EPROM_clr(void); extern t_stat RAM_clr(void); extern t_stat isbc064_clr(void); extern t_stat isbc464_clr(void); extern t_stat isbc201_clr(void); extern t_stat isbc202_clr(void); extern t_stat isbc208_clr(void); extern void clr_dev(void); /* globals */ int model = -1; //force no model int mem_map = 0; //memory model typedef struct device { int id; const char *name; int num; int args; t_stat (*cfg_routine)(uint16 val1, uint16 val2, uint8 val3); t_stat (*clr_routine)(void); uint16 val[8]; } SYS_DEV; typedef struct system_model { int id; const char *name; int num; SYS_DEV devices[30]; } SYS_MODEL; #define SYS_NUM 18 SYS_MODEL models[SYS_NUM+1] = { {MDS_210, "MDS-210 ", 9, // id name num arg routine routine1 val1 val2 val3 {{ IOC_CONT, "IOC-CONT", 1, 1, ioc_cont_cfg, ioc_cont_clr, 0xC0 }, { i8255, "I8255", 2, 1, i8255_cfg, i8255_clr, 0xE4, 0xE8 }, { i8253, "I8253", 1, 1, i8253_cfg, i8253_clr, 0xF0 }, { i8251, "I8251", 2, 1, i8251_cfg, i8251_clr, 0xF4, 0xF6 }, { i8259, "I8259", 2, 1, i8259_cfg, i8259_clr, 0xFA, 0xFC }, { IPC_CONT, "IPC-CONT", 1, 1, ipc_cont_cfg, ipc_cont_clr, 0xFF }, { EPROM, "EPROM", 1, 2, EPROM_cfg, EPROM_clr, 0x0000, 0x0FFF }, { RAM, "RAM", 1, 2, RAM_cfg, RAM_clr, 0x0000, 0x7FFF }, { SBC464, "SBC464", 1, 2, isbc464_cfg, isbc464_clr, 0xA800, 0x47FF }}, }, {MDS_220, "MDS-220 ", 8, {{ IOC_CONT, "IOC-CONT", 1, 1, ioc_cont_cfg, ioc_cont_clr, 0xC0 }, { i8255, "I8255", 2, 1, i8255_cfg, i8255_clr, 0xE4, 0xE8 }, { i8253, "I8253", 1, 1, i8253_cfg, i8253_clr, 0xF0 }, { i8251, "I8251", 2, 1, i8251_cfg, i8251_clr, 0xF4, 0xF6 }, { i8259, "I8259", 2, 1, i8259_cfg, i8259_clr, 0xFA, 0xFC }, { IPC_CONT, "IPC-CONT", 1, 1, ipc_cont_cfg, ipc_cont_clr, 0xFF }, { EPROM, "EPROM", 1, 2, EPROM_cfg, EPROM_clr, 0x0000, 0x0FFF }, { RAM, "RAM", 1, 2, RAM_cfg, RAM_clr, 0x0000, 0x7FFF }} }, {MDS_225, "MDS-225 ", 8, {{ IOC_CONT, "IOC-CONT", 1, 1, ioc_cont_cfg, ioc_cont_clr, 0xC0 }, { i8255, "I8255", 2, 1, i8255_cfg, i8255_clr, 0xE4, 0xE8 }, { i8253, "I8253", 1, 1, i8253_cfg, i8253_clr, 0xF0 }, { i8251, "I8251", 2, 1, i8251_cfg, i8251_clr, 0xF4, 0xF6 }, { i8259, "I8259", 2, 1, i8259_cfg, i8259_clr, 0xFA, 0xFC }, { IPC_CONT, "IPC-CONT", 1, 1, ipc_cont_cfg, ipc_cont_clr, 0xFF }, { EPROM, "EPROM", 1, 2, EPROM_cfg, EPROM_clr, 0x0000, 0x0FFF }, { RAM, "RAM", 1, 2, RAM_cfg, RAM_clr, 0x0000, 0xFFFF }}, }, {MDS_230, "MDS-230 ", 9, {{ IOC_CONT, "IOC-CONT", 1, 1, ioc_cont_cfg, ioc_cont_clr, 0xC0 }, { i8255, "I8255", 2, 1, i8255_cfg, i8255_clr, 0xE4, 0xE8 }, { i8253, "I8253", 1, 1, i8253_cfg, i8253_clr, 0xF0 }, { i8251, "I8251", 2, 1, i8251_cfg, i8251_clr, 0xF4, 0xF6 }, { i8259, "I8259", 2, 1, i8259_cfg, i8259_clr, 0xFA, 0xFC }, { IPC_CONT, "IPC-CONT", 1, 1, ipc_cont_cfg, ipc_cont_clr, 0xFF }, { EPROM, "EPROM", 1, 2, EPROM_cfg, EPROM_clr, 0x0000, 0x0FFF }, { RAM, "RAM", 1, 2, RAM_cfg, RAM_clr, 0x0000, 0x7FFF }, { SBC064, "SBC064", 1, 2, isbc064_cfg, isbc064_clr, 0x8000, 0x7FFF }}, }, {MDS_800, "MDS-800 ", 5, {{ i8251, "I8251", 2, 1, i8251_cfg, i8251_clr, 0xF4, 0xF6 }, { i3214, "I3214", 1, 1, i3214_cfg, i3214_clr, 0xFC }, { EPROM, "EPROM", 1, 2, EPROM_cfg, EPROM_clr, 0x0000, 0x00FF }, { EPROM, "EPROM", 1, 2, EPROM_cfg, EPROM_clr, 0xF800, 0x07FF }, { SBC064, "SBC064", 1, 2, isbc064_cfg, isbc064_clr, 0x0000, 0xFFFF }}, }, {MDS_810, "MDS-810 ", 6, {{ i8251, "I8251", 2, 1, i8251_cfg, i8251_clr, 0xF4, 0xF6 }, { i3214, "I3214", 1, 1, i3214_cfg, i3214_clr, 0xFC }, { EPROM, "EPROM", 1, 2, EPROM_cfg, EPROM_clr, 0x0000, 0x00FF }, { EPROM, "EPROM2", 1, 2, EPROM_cfg, EPROM_clr, 0xF800, 0x07FF }, { SBC064, "SBC064", 1, 2, isbc064_cfg, isbc064_clr, 0x0000, 0x7FFF }, { SBC464, "SBC464", 1, 2, isbc464_cfg, isbc464_clr, 0xA800, 0x47FF }}, }, {SDK_80, "SDK-80 ", 4, {{ i8255, "I8255", 2, 1, i8255_cfg, i8255_clr, 0xEC, 0xF4 }, { i8251, "I8251", 1, 1, i8251_cfg, i8251_clr, 0xFA }, { EPROM, "EPROM", 1, 2, EPROM_cfg, EPROM_clr, 0x0000, 0x0FFF }, { RAM, "RAM", 1, 2, RAM_cfg, RAM_clr, 0x1000, 0x03FF }}, }, {SYS_8010, "SYS-80/10 ", 4, {{ i8255, "I8255", 2, 1, i8255_cfg, i8255_clr, 0xE4, 0xE8 }, { i8251, "I8251", 1, 1, i8251_cfg, i8251_clr, 0xEC }, { EPROM, "EPROM", 1, 2, EPROM_cfg, EPROM_clr, 0x0000, 0x0FFF }, { RAM, "RAM", 1, 2, RAM_cfg, RAM_clr, 0x3c00, 0x03FF }}, }, {SYS_8010A, "SYS-80/10A ", 4, {{ i8255, "I8255", 2, 1, i8255_cfg, i8255_clr, 0xE4, 0xE8 }, { i8251, "I8251", 1, 1, i8251_cfg, i8251_clr, 0xEC }, { EPROM, "EPROM", 1, 2, EPROM_cfg, EPROM_clr, 0x0000, 0x1FFF }, { RAM, "RAM", 1, 2, RAM_cfg, RAM_clr, 0x3c00, 0x03FF }}, }, {SYS_8010B, "SYS-80/10B ", 4, {{ i8255, "I8255", 2, 1, i8255_cfg, i8255_clr, 0xE4, 0xE8 }, { i8251, "I8251", 1, 1, i8251_cfg, i8251_clr, 0xEC }, { EPROM, "EPROM", 1, 2, EPROM_cfg, EPROM_clr, 0x0000, 0x1FFF }, { RAM, "RAM", 1, 2, RAM_cfg, RAM_clr, 0x3c00, 0x03FF }}, }, {SYS_8020, "SYS-80/20 ", 6, {{ i8259, "I8259", 1, 1, i8259_cfg, i8259_clr, 0xDA }, { i8253, "I8253", 1, 1, i8253_cfg, i8253_clr, 0xDC }, { i8255, "I8255", 2, 1, i8255_cfg, i8255_clr, 0xE4, 0xE8 }, { i8251, "I8251", 1, 1, i8251_cfg, i8251_clr, 0xEC }, { EPROM, "EPROM", 1, 2, EPROM_cfg, EPROM_clr, 0x0000, 0x1FFF }, { RAM, "RAM", 1, 2, RAM_cfg, RAM_clr, 0x3800, 0x07FF }}, }, {SYS_80204, "SYS-80/20-4 ", 6, {{ i8259, "I8259", 1, 1, i8259_cfg, i8259_clr, 0xDA }, { i8253, "I8253", 1, 1, i8253_cfg, i8253_clr, 0xDC }, { i8255, "I8255", 2, 1, i8255_cfg, i8255_clr, 0xE4, 0xE8 }, { i8251, "I8251", 1, 1, i8251_cfg, i8251_clr, 0xEC }, { EPROM, "EPROM", 1, 2, EPROM_cfg, EPROM_clr, 0x0000, 0x1FFF }, { RAM, "RAM", 1, 2, RAM_cfg, RAM_clr, 0x3000, 0x0FFF }}, }, {SYS_8024, "SYS-80/24 ", 6, {{ i8259, "I8259", 1, 1, i8259_cfg, i8259_clr, 0xDA }, { i8253, "I8253", 1, 1, i8253_cfg, i8253_clr, 0xDC }, { i8255, "I8255", 2, 1, i8255_cfg, i8255_clr, 0xE8 }, { i8251, "I8251", 1, 1, i8251_cfg, i8251_clr, 0xEC }, { EPROM, "EPROM", 1, 2, EPROM_cfg, EPROM_clr, 0x0000, 0x1FFF }, { RAM, "RAM", 1, 2, RAM_cfg, RAM_clr, 0x3c00, 0x03FF }}, }, {SYS_8030, "SYS-80/30 ", 6, {{ i8259, "I8259", 1, 1, i8259_cfg, i8259_clr, 0xDA }, { i8253, "I8253", 1, 1, i8253_cfg, i8253_clr, 0xDC }, { i8255, "I8255", 2, 1, i8255_cfg, i8255_clr, 0xE8 }, { i8251, "I8251", 1, 1, i8251_cfg, i8251_clr, 0xEC }, { EPROM, "EPROM", 1, 2, EPROM_cfg, EPROM_clr, 0x0000, 0x1FFF }, { RAM, "RAM", 1, 2, RAM_cfg, RAM_clr, 0x2000, 0x3FFF }}, }, {SYS_8010_0, "SYS-80/10-0", 5, {{ i8255, "I8255", 2, 1, i8255_cfg, i8255_clr, 0xE4, 0xE8 }, { i8251, "I8251", 1, 1, i8251_cfg, i8251_clr, 0xEC }, { EPROM, "EPROM", 1, 2, EPROM_cfg, EPROM_clr, 0x0000, 0x0FFF }, { RAM, "RAM", 1, 2, RAM_cfg, RAM_clr, 0x3c00, 0x03FF }, { SBC064, "SBC064", 1, 2, isbc064_cfg, isbc064_clr, 0x0000, 0xFFFF }}, }, {SYS_8010_1, "SYS-80/10-1", 6, {{ i8255, "I8255", 2, 1, i8255_cfg, i8255_clr, 0xE4, 0xE8 }, { i8251, "I8251", 1, 1, i8251_cfg, i8251_clr, 0xEC }, { EPROM, "EPROM", 1, 2, EPROM_cfg, EPROM_clr, 0x0000, 0x0FFF }, { RAM, "RAM", 1, 2, RAM_cfg, RAM_clr, 0x3c00, 0x03FF }, { SBC064, "SBC064", 1, 2, isbc064_cfg, isbc064_clr, 0x0000, 0xFFFF }, { SBC201, "SBC201", 1, 1, isbc201_cfg, isbc201_clr, 0x78 }}, }, {SYS_8010_2, "SYS-80/10-2", 6, {{ i8255, "I8255", 2, 1, i8255_cfg, i8255_clr, 0xE4, 0xE8 }, { i8251, "I8251", 1, 1, i8251_cfg, i8251_clr, 0xEC }, { EPROM, "EPROM", 1, 2, EPROM_cfg, EPROM_clr, 0x0000, 0x0FFF }, { RAM, "RAM", 1, 2, RAM_cfg, RAM_clr, 0x3c00, 0x03FF }, { SBC064, "SBC064", 1, 2, isbc064_cfg, isbc064_clr, 0x0000, 0xFFFF }, { SBC202, "SBC202", 1, 1, isbc202_cfg, isbc202_clr, 0x78 }}, }, {SYS_8010_3, "SYS-80/10-3 ", 6, {{ i8255, "I8255", 2, 1, i8255_cfg, i8255_clr, 0xE4, 0xE8 }, { i8251, "I8251", 1, 1, i8251_cfg, i8251_clr, 0xEC }, { EPROM, "EPROM", 1, 2, EPROM_cfg, EPROM_clr, 0x0000, 0x0FFF }, { RAM, "RAM", 1, 2, RAM_cfg, RAM_clr, 0x3c00, 0x03FF }, { SBC064, "SBC064", 1, 2, isbc064_cfg, isbc064_clr, 0x0000, 0xFFFF }, { SBC208, "SBC208", 1, 1, isbc208_cfg, isbc208_clr, 0x40 }}, }, {0} }; UNIT sys_unit = { UDATA (NULL, 0, 0) }; REG sys_reg[] = { { NULL } }; MTAB sys_mod[] = { { MTAB_XTD | MTAB_VDV, 0, NULL, "MODEL", &sys_set_model, NULL, NULL, "Sets the system model" }, { MTAB_XTD | MTAB_VDV, 0, "MODEL", NULL, NULL, &sys_show_model, NULL, "Shows the system devices" }, { 0 } }; DEBTAB sys_debug[] = { { "ALL", DEBUG_all }, { "FLOW", DEBUG_flow }, { "READ", DEBUG_read }, { "WRITE", DEBUG_write }, { "XACK", DEBUG_xack }, { NULL } }; /* address width is set to 16 bits to use devices in 8086/8088 implementations */ DEVICE sys_dev = { "SYS", //name &sys_unit, //units sys_reg, //registers sys_mod, //modifiers 1, //numunits 0, //aradix 0, //awidth 0, //aincr 0, //dradix 0, //dwidth NULL, //examine NULL, //deposit sys_reset, //reset NULL, //boot NULL, //attach NULL, //detach NULL, //ctxt 0, //flags 0, //dctrl sys_debug, //debflags NULL, //msize NULL, //lname NULL, //help routine NULL, //attach help routine NULL, //help context &sys_desc //device description }; static const char* sys_desc(DEVICE *dptr) { return sys_name; } t_stat sys_cfg(uint16 base, uint16 devnum, uint8 dummy) { int i, j; DEVICE *dptr; if (model == (-1)) return SCPE_ARG; //no valid config sim_printf("sys_cfg: Configuring an %s:\n", models[model].name); switch (model) { //set memory map type case 0: //mds-210 mem_map = 0; //ipb break; case 1: //mds-220 mem_map = 0; //ipb break; case 2: //mds-225 mem_map = 1; //ipc break; case 3: //mds-230 mem_map = 0; //ipb break; case 4: //mds-800 mem_map = 2; //800 break; case 5: //mds-810 mem_map = 2; //800 break; case 6: //sdk-80 mem_map = 3; //sdk-80 break; case 7: //sys-8010 mem_map = 4; //sys-8010 break; case 8: //sys-8010A mem_map = 4; //sys-8010A break; case 9: //sys-8010B mem_map = 4; //sys-8010B break; case 10: //sys-8020 mem_map = 4; //sys-8020 break; case 11: //sys-8020-4 mem_map = 4; //sys-8020-4 break; case 12: //sys-8024 mem_map = 4; //sys-8024 break; case 13: //sys-8030 mem_map = 4; //sys-8030 break; case 14: //sys-8010-0 mem_map = 4; //sys-8010-0 break; case 15: //sys-8010-1 mem_map = 4; //sys-8010-1 break; case 16: //sys-8010-2 mem_map = 4; //sys-8010-2 break; case 17: //sys-8010-3 mem_map = 4; //sys-8010-3 break; default: return SCPE_ARG; } for (i=0; iflags & DEV_DIS) != 0)) { // disabled dptr->flags &= ~DEV_DIS; //enable device } for (j=0; jflags & DEV_DIS)) { // enabled dptr->flags |= DEV_DIS; //disable device } for (j=0; jflags & DEV_DIS) != 0)) { // disabled dptr->flags &= ~DEV_DIS; //enable device } for (j=0; j