From 454bc6feb336c68af2c2c31881101512088b47f9 Mon Sep 17 00:00:00 2001 From: AZBevier Date: Sat, 29 Feb 2020 15:47:40 -0700 Subject: [PATCH] SEL32: Change DPII disk initialization for UTX umap data. SEL32: Adjust console timing. SEL32: Revise HIO support code. --- SEL32/sel32_chan.c | 29 +++++--- SEL32/sel32_clk.c | 3 +- SEL32/sel32_con.c | 141 ++++++++++++++++++++++++++++++------- SEL32/sel32_cpu.c | 9 +++ SEL32/sel32_disk.c | 91 +++++++++++++++--------- SEL32/sel32_hsdp.c | 70 +++++++++++------- SEL32/taptools/tape2disk.c | 2 +- SEL32/tests/diag.ini | 2 + SEL32/tests/sel32_test.ini | 3 +- doc/sel32_doc.doc | Bin 73728 -> 77824 bytes 10 files changed, 252 insertions(+), 98 deletions(-) diff --git a/SEL32/sel32_chan.c b/SEL32/sel32_chan.c index f4e0627..39ac3d8 100644 --- a/SEL32/sel32_chan.c +++ b/SEL32/sel32_chan.c @@ -1426,6 +1426,7 @@ t_stat haltxio(uint16 lchsa, uint32 *status) { /* halt XIO */ } chp->chan_byte = BUFF_CHNEND; /* thats all the data we want */ +#ifndef TRY_THIS_02282020 /* see if we have a haltio device entry */ if (dibp->halt_io != NULL) { /* NULL if no haltio function */ /* call the device controller to get halt_io status */ @@ -1453,7 +1454,9 @@ t_stat haltxio(uint16 lchsa, uint32 *status) { /* halt XIO */ chp->ccw_count = 0; /* force zero count */ dev_status[chsa] = 0; /* no device status */ - if (CPU_MODEL >= MODEL_V6) { +#ifndef TRY_02282020 +//WAS0229 if (CPU_MODEL >= MODEL_V6) { + if (CPU_MODEL >= MODEL_27) { /* UTX wants the status posted now, MPX wants interrupt */ /* the channel is not busy, see if any status to post */ @@ -1474,25 +1477,29 @@ t_stat haltxio(uint16 lchsa, uint32 *status) { /* halt XIO */ "haltxio 1 FIFO status stored OK, sw1 %08x sw2 %08x\n", sw1, sw2); irq_pend = 1; /* still pending int */ // UTX likes this return and does not panic */ - // The diag's want an interrupt generated, so want - *status = CC2BIT; /* status stored from SIO, so CC2 */ + // The diag's want an interrupt generated, so wait + *status = CC2BIT; /* status stored from HIO, so CC2 */ + /* if 0 returned, UTX hans on input */ goto hioret; /* CC2 and OK */ } /* nothing going on, so say all OK */ *status = CC1BIT; /* request accepted, no status, so CC1 */ +//TRYIED *status = 0; /* CCs = 0, accepted */ goto hioret; /* CC2 and OK */ - } else { + } else +#endif + { sim_debug(DEBUG_IRQ, &cpu_dev, "haltxio FIFO 2 status stored OK, sw1 %08x sw2 %08x\n", sw1, sw2); irq_pend = 1; /* still pending int */ -//TUE *status = 0; /* request accepted, no status, so CC1 */ -/*TUE*/ *status = CC1BIT; /* request accepted, no status, so CC1 */ +/*LAST*/ *status = CC1BIT; /* request accepted, no status, so CC1 */ +//TRIED *status = CC2BIT; /* sub channel status posted, CC2BIT */ goto hioret; /* CC2 and OK */ } } else { /* we have completed the I/O without error */ /* the channel is not busy, so return OK */ - *status = 0; /* CCs = 0, accepted */ +//WAS *status = 0; /* CCs = 0, accepted */ sim_debug(DEBUG_CMD, &cpu_dev, "$$$ HALTIO good return chsa %04x chan %04x cmd %02x flags %04x status %04x\n", chsa, chan, chp->ccw_cmd, chp->ccw_flags, *status); @@ -1500,24 +1507,28 @@ t_stat haltxio(uint16 lchsa, uint32 *status) { /* halt XIO */ goto hioret; /* just return */ } } +#endif /*TRY_THIS_02282020*/ /* device does not have a HIO entry, so terminate the I/O */ /* check for a Command or data chain operation in progresss */ if (chp->ccw_cmd != 0 || (chp->ccw_flags & (FLAG_DC|FLAG_CC)) != 0) { sim_debug(DEBUG_XIO, &cpu_dev, "haltxio busy return CC4 chsa %04x chan %04x\n", chsa, chan); /* reset the DC or CC bits to force completion after current IOCD */ chp->ccw_flags &= ~(FLAG_DC|FLAG_CC); /* reset chaining bits */ - dev_status[chsa] |= STATUS_ECHO; /* show we stopped the cmd */ +//CHG dev_status[chsa] |= STATUS_ECHO; /* show we stopped the cmd */ +/*ADD*/ chp->ccw_count = 0; /* clear remaining count */ chan_end(chsa, SNS_CHNEND|SNS_DEVEND); /* show I/O complete */ +/*ADD*/ chp->chan_status &= ~STATUS_LENGTH; /* remove SLI status bit */ store_csw(chp); /* store the status in the inch status dw */ chp->chan_status &= ~STATUS_PCI; /* remove PCI status bit */ dev_status[chsa] = 0; /* no device status */ irq_pend = 1; /* still pending int */ *status = CC2BIT; /* sub channel status posted, CC2BIT */ +//TRY *status = CC1BIT; /* request accepted, no status, so CC1 */ goto hioret; /* just return */ } /* the channel is not busy, so return OK */ *status = CC1BIT; /* request accepted, no status, so CC1 */ - goto hioret; /* just busy CC4 */ + goto hioret; /* just return */ hioret: sim_debug(DEBUG_CMD, &cpu_dev, "$$$ HIO END chsa %04x chan %04x cmd %02x flags %04x status %04x\n", diff --git a/SEL32/sel32_clk.c b/SEL32/sel32_clk.c index 91c0f12..1e22460 100644 --- a/SEL32/sel32_clk.c +++ b/SEL32/sel32_clk.c @@ -160,7 +160,8 @@ void rtc_setup(uint32 ss, uint32 level) t_stat rtc_reset(DEVICE *dptr) { rtc_pie = 0; /* disable pulse */ - rtc_unit.wait = sim_rtcn_init_unit(&rtc_unit, rtc_unit.wait, TMR_RTC); /* initialize clock calibration */ + /* initialize clock calibration */ + rtc_unit.wait = sim_rtcn_init_unit(&rtc_unit, rtc_unit.wait, TMR_RTC); sim_activate (&rtc_unit, rtc_unit.wait); /* activate unit */ return SCPE_OK; } diff --git a/SEL32/sel32_con.c b/SEL32/sel32_con.c index 14be731..967f61a 100644 --- a/SEL32/sel32_con.c +++ b/SEL32/sel32_con.c @@ -48,6 +48,7 @@ extern void set_devattn(uint16 addr, uint8 flags); extern void post_extirq(void); extern uint32 attention_trap; /* set when trap is requested */ extern void set_devwake(uint16 addr, uint8 flags); +extern int test_write_byte_end(uint16 chsa); extern DEVICE *get_dev(UNIT *uptr); extern t_stat set_inch(UNIT *uptr, uint32 inch_addr); /* set channel inch address */ extern CHANP *find_chanp_ptr(uint16 chsa); /* find chanp pointer */ @@ -190,8 +191,12 @@ uint8 con_startcmd(UNIT *uptr, uint16 chan, uint8 cmd) { int unit = (uptr - con_unit); /* unit 0,1 */ uint8 ch; - if ((uptr->CMD & CON_MSK) != 0) /* is unit busy */ + if ((uptr->CMD & CON_MSK) != 0) { /* is unit busy */ + sim_debug(DEBUG_CMD, &con_dev, + "con_startcmd unit %01x chan %02x cmd %02x BUSY cmd %02x\n", + unit, chan, cmd, uptr->CMD); return SNS_BSY; /* yes, return busy */ + } sim_debug(DEBUG_CMD, &con_dev, "con_startcmd unit %01x chan %02x cmd %02x enter\n", unit, chan, cmd); @@ -202,7 +207,8 @@ uint8 con_startcmd(UNIT *uptr, uint16 chan, uint8 cmd) { uptr->CMD &= LMASK; /* leave only chsa */ uptr->CMD |= CON_INCH2; /* save INCH command as 0xf0 */ uptr->SNS = SNS_RDY|SNS_ONLN; /* status is online & ready */ - sim_activate(uptr, 10); /* start us off */ + sim_activate(uptr, 20); /* start us off */ +//WAS sim_activate(uptr, 10); /* start us off */ return 0; /* no status change */ break; @@ -309,10 +315,10 @@ t_stat con_srvo(UNIT *uptr) { if (unit == 1) { uptr->SNS |= SNS_CMDREJ; /* command rejected */ uptr->CMD &= LMASK; /* nothing left, command complete */ -//DIAG_TUE chan_end(chsa, SNS_CHNEND|SNS_DEVEND|SNS_UNITCHK); /* unit check */ - chan_end(chsa, SNS_CHNEND|SNS_UNITCHK); /* unit check */ sim_debug(DEBUG_CMD, &con_dev, "con_srvo Read to output device chsa %04x cmd = %02x\n", chsa, cmd); +//DIAG_TUE chan_end(chsa, SNS_CHNEND|SNS_DEVEND|SNS_UNITCHK); /* unit check */ + chan_end(chsa, SNS_CHNEND|SNS_UNITCHK); /* unit check */ return SCPE_OK; } } @@ -343,10 +349,10 @@ t_stat con_srvo(UNIT *uptr) { /* Write to device */ if (chan_read_byte(chsa, &ch)) { /* get byte from memory */ uptr->CMD &= LMASK; /* nothing left, command complete */ - chan_end(chsa, SNS_CHNEND|SNS_DEVEND); /* done */ sim_debug(DEBUG_CMD, &con_dev, "con_srvo write %02x chsa %04x cmd %02x complete\n", ch, chsa, cmd); + chan_end(chsa, SNS_CHNEND|SNS_DEVEND); /* done */ } else { /* HACK HACK HACK */ ch &= 0x7f; /* make 7 bit w/o parity */ @@ -354,14 +360,19 @@ t_stat con_srvo(UNIT *uptr) { if (ch == 0) /* do not pass a null char */ //WAS ch = '@'; /* stop simh abort .... */ ch = ' '; /* stop simh abort .... */ +#ifndef ALLOW_ESC if (((ch >= 0x20) && (ch <= 0x7e)) || (ch == '\r') || (ch == '\n')) cp = ch; else cp = '^'; sim_debug(DEBUG_CMD, &con_dev, "con_srvo write %01x: putch 0x%02x %c\n", unit, ch, cp); -//WAS sim_putchar(ch); /* output next char to device */ - sim_putchar(cp); /* output next char to device */ + sim_putchar(ch); /* output next char to device */ +//OLD sim_putchar(cp); /* output next char to device */ +#else + sim_putchar(ch); /* output next char to device */ +//WAS sim_putchar(cp); /* output next char to device */ +#endif sim_activate(uptr, 20); /* keep going */ } } @@ -377,7 +388,8 @@ t_stat con_srvi(UNIT *uptr) { uint8 ch; t_stat r; - sim_debug(DEBUG_DETAIL, &con_dev, "con_srvi enter chsa %04x cmd = %02x\n", chsa, cmd); + sim_debug(DEBUG_DETAIL, &con_dev, + "con_srvi enter chsa %04x cmd %02x ccw_count %02x\n", chsa, cmd, chp->ccw_count); /* if output tried to input device, error */ if ((cmd == CON_RWD) || (cmd == CON_WR) || (cmd == 0x0C)) { /* check for output */ @@ -387,16 +399,17 @@ t_stat con_srvi(UNIT *uptr) { if (unit == 0) { uptr->SNS |= SNS_CMDREJ; /* command rejected */ uptr->CMD &= LMASK; /* nothing left, command complete */ -//DIAGTUE chan_end(chsa, SNS_CHNEND|SNS_DEVEND|SNS_UNITCHK); /* unit check */ - chan_end(chsa, SNS_CHNEND|SNS_UNITCHK); /* unit check */ sim_debug(DEBUG_CMD, &con_dev, "con_srvi Write to input device chsa %04x cmd = %02x\n", chsa, cmd); +//DIAGTUE chan_end(chsa, SNS_CHNEND|SNS_DEVEND|SNS_UNITCHK); /* unit check */ + chan_end(chsa, SNS_CHNEND|SNS_UNITCHK); /* unit check */ //fall thru return SCPE_OK; } } #ifdef JUNK if (cmd == 0x0C) { /* unknown has to do nothing */ sim_debug(DEBUG_CMD, &con_dev, "con_srvi Unknown (0x0C) chsa %04x cmd = %02x\n", chsa, cmd); + uptr->CMD &= LMASK; /* command complete */ chan_end(chsa, SNS_CHNEND|SNS_DEVEND); /* done */ return SCPE_OK; } @@ -415,8 +428,8 @@ t_stat con_srvi(UNIT *uptr) { sim_debug(DEBUG_CMD, &con_dev, "con_srvi INCH chsa %04x len %02x inch %06x\n", chsa, len, mema); - chan_end(chsa, SNS_CHNEND); /* INCH done */ -// chan_end(chsa, SNS_CHNEND|SNS_DEVEND); /* done */ +//TRY228 chan_end(chsa, SNS_CHNEND); /* INCH done */ + chan_end(chsa, SNS_CHNEND|SNS_DEVEND); /* done */ } else { sim_debug(DEBUG_CMD, &con_dev, "con_srvi NOP chsa %04x cmd = %02x\n", chsa, cmd); @@ -425,6 +438,8 @@ t_stat con_srvi(UNIT *uptr) { /* drop through to poll input */ } +#define MOVE_CODE +#ifdef MOVE_CODE switch (cmd) { case CON_RD: /* 0x02 */ /* read from device */ @@ -433,22 +448,29 @@ t_stat con_srvi(UNIT *uptr) { int len = chp->ccw_count; /* get command count */ ch = con_data[unit].ibuff[uptr->u4++]; /* get char from read buffer */ sim_debug(DEBUG_CMD, &con_dev, - "con_srvi unit %02x: read %02x incnt %02x u4 %02x len %02x\n", + "con_srvi readbuf unit %02x: read %02x incnt %02x u4 %02x len %02x\n", unit, ch, con_data[unit].incnt, uptr->u4, len); if (chan_write_byte(chsa, &ch)) { /* write byte to memory */ con_data[unit].incnt = 0; /* buffer empty */ cmd = 0; /* no cmd either */ -// uptr->u4 = 0; /* no I/O yet */ + sim_debug(DEBUG_CMD, &con_dev, + "con_srvi write to mem unit %02x: read %02x u4 %02x ccw_count %02x\n", + unit, ch, uptr->u4, chp->ccw_count); + uptr->u4 = 0; /* no I/O yet */ uptr->CMD &= LMASK; /* nothing left, command complete */ chan_end(chsa, SNS_CHNEND|SNS_DEVEND); /* we done */ } else { + if (test_write_byte_end(chsa)) { /* see if read request complete */ // len = chp->ccw_count; /* INCH command count */ // if ((len==0) && uptr->u4 == con_data[unit].incnt) { /* read completed */ - if (uptr->u4 == con_data[unit].incnt) { /* read completed */ +// if (uptr->u4 == con_data[unit].incnt) { /* read completed */ con_data[unit].incnt = 0; /* buffer is empty */ cmd = 0; /* no cmd either */ -// uptr->u4 = 0; /* no I/O yet */ + sim_debug(DEBUG_CMD, &con_dev, + "con_srvi write nothing to mem unit %02x: u4 %02x ccw_count %02x\n", + unit, uptr->u4, chp->ccw_count); + uptr->u4 = 0; /* no I/O yet */ uptr->CMD &= LMASK; /* nothing left, command complete */ chan_end(chsa, SNS_CHNEND|SNS_DEVEND); /* we done */ } @@ -457,11 +479,12 @@ t_stat con_srvi(UNIT *uptr) { // default: break; } +#endif /* check for next input if reading or @@A sequence */ r = sim_poll_kbd(); /* poll for a char */ if (r & SCPE_KFLAG) { /* got a char */ - ch = r & 0377; /* drop any extra bits */ + ch = r & 0xff; /* drop any extra bits */ #ifdef LEAVE_LOWER if ((ch >= 'a') && (ch <= 'z')) ch &= 0xdf; /* make upper case */ @@ -470,6 +493,8 @@ t_stat con_srvi(UNIT *uptr) { atbuf = 0; /* reset attention buffer */ if (ch == '\n') /* convert newline */ ch = '\r'; /* make newline into carriage return */ +#define DO_NO_CASE +#ifdef DO_NO_CASE /* Handle end of buffer */ switch (ch) { #ifdef ONE_AT_A_TIME @@ -497,14 +522,52 @@ t_stat con_srvi(UNIT *uptr) { uptr->CMD |= CON_CR; /* C/R received */ /* fall through */ default: +#endif /* DO_NO_CASE */ +#ifdef MOVE_CODE if (con_data[unit].incnt < sizeof(con_data[unit].ibuff)) { if (uptr->CMD & CON_EKO) /* ECHO requested */ sim_putchar(ch); /* ECHO the char */ con_data[unit].ibuff[con_data[unit].incnt++] = ch; uptr->CMD |= CON_INPUT; /* we have a char available */ + sim_debug(DEBUG_CMD, &con_dev, + "con_srvi readch unit %02x: read %02x u4 %02x ccw_count %02x\n", + unit, ch, uptr->u4, chp->ccw_count); +#else +//MOVE if (con_data[unit].incnt < sizeof(con_data[unit].ibuff)) { + if (uptr->CMD & CON_EKO) /* ECHO requested */ + sim_putchar(ch); /* ECHO the char */ +//MOVE con_data[unit].ibuff[con_data[unit].incnt++] = ch; +//MOVE uptr->CMD |= CON_INPUT; /* we have a char available */ +#endif +#ifndef MOVE_CODE + // CON_RD: /* 0x02 */ /* read from device */ + // CON_ECHO: /* 0x0a */ /* read from device w/ECHO */ + sim_debug(DEBUG_CMD, &con_dev, + "con_srvi unit %02x: read %02x u4 %02x ccw_count %02x\n", + unit, ch, uptr->u4, chp->ccw_count); + + if (chan_write_byte(chsa, &ch)) { /* write byte to memory */ + cmd = 0; /* no cmd left */ + uptr->CMD &= LMASK; /* nothing left, command complete */ + chan_end(chsa, SNS_CHNEND|SNS_DEVEND); /* we done */ + } else +//WAS if (chp->ccw_count == 0) { + if (test_write_byte_end(chsa)) { /* see if read request complete */ + cmd = 0; /* no cmd left */ + uptr->CMD &= LMASK; /* nothing left, command complete */ + chan_end(chsa, SNS_CHNEND|SNS_DEVEND); /* we done */ } + /* We are still looking for input */ + sim_debug(DEBUG_CMD, &con_dev, + "con_srvi still looking unit %02x: read %02x u4 %02x ccw_count %02x\n", + unit, ch, uptr->u4, chp->ccw_count); +#else + } +#endif +#ifdef DO_NO_CASE break; } +#endif /* DO_NO_CASE */ } else { /* look for attention sequence '@@A' */ if (ch == '@' || ch == 'A' || ch == 'a') { @@ -532,9 +595,12 @@ t_stat con_srvi(UNIT *uptr) { if ((r & SCPE_KFLAG) && /* got something and */ ((cmd == CON_RD) || (cmd == CON_ECHO))) /* looking for input */ //WAS return sim_activate (uptr, 20); - return sim_activate (uptr, 100); - return sim_activate (uptr, 500); -//WAS return tmxr_clock_coschedule_tmr (uptr, TMR_RTC, 1); /* come back soon */ +//WAS2 return sim_activate (uptr, 100); +//WAS3 return sim_activate (uptr, 50); +//LAST return sim_activate (uptr, 200); + return sim_activate (uptr, 40); +//TRY return sim_activate (uptr, 500); + return tmxr_clock_coschedule_tmr (uptr, TMR_RTC, 1); /* come back soon */ } t_stat con_reset(DEVICE *dptr) { @@ -547,7 +613,9 @@ uint8 con_haltio(UNIT *uptr) { uint16 chsa = GET_UADDR(uptr->CMD); int cmd = uptr->CMD & CON_MSK; int unit = (uptr - con_unit); /* unit # 0 is read, 1 is write */ - uint8 ch; + uint8 ch = 0x20; /* dummy space char for outstanding input */ + CHANP *chp = find_chanp_ptr(chsa); /* find the chanp pointer */ +// int len = chp->ccw_count; /* command byte count */ sim_debug(DEBUG_EXP, &con_dev, "con_haltio enter chsa %04x cmd = %02x\n", chsa, cmd); @@ -558,30 +626,49 @@ uint8 con_haltio(UNIT *uptr) { /* terminate any input command */ if ((uptr->CMD & CON_MSK) != 0) { /* is unit busy */ sim_debug(DEBUG_CMD, &con_dev, - "con_haltio HIO chsa %04x cmd = %02x\n", chsa, cmd); + "con_haltio HIO chsa %04x cmd = %02x ccw_count %02x\n", chsa, cmd, chp->ccw_count); if (unit == 0) { - if (chan_write_byte(chsa, &ch)) { /* write byte to memory */ + // new code 2/28/2020 + if (test_write_byte_end(chsa)) { /* see if read request complete */ + chan_write_byte(chsa, &ch); /* write fake byte to memory */ con_data[unit].incnt = 0; /* buffer empty */ uptr->CMD &= LMASK; /* nothing left, command complete */ - chan_end(chsa, SNS_CHNEND|SNS_DEVEND); /* we done */ +// chp->ccw_count = 0; /* zero command count */ sim_debug(DEBUG_CMD, &con_dev, - "con_haltio HIO I/O stop chsa %04x cmd = %02x\n", chsa, cmd); + "con_haltio HIO I/O stop chsa %04x cmd %02x ccw_count %02x\n", + chsa, cmd, chp->ccw_count); + chan_end(chsa, SNS_CHNEND|SNS_DEVEND); /* we done */ // return SCPE_OK; /* not busy anymore */ return SCPE_IOERR; } +#ifdef NOT_NOW + else + if (chan_write_byte(chsa, &ch)) { /* write fake byte to memory */ + con_data[unit].incnt = 0; /* buffer is empty */ + sim_debug(DEBUG_CMD, &con_dev, + "con_haltio write nothing to mem unit %02x: u4 %02x ccw_count %02x\n", + unit, uptr->u4, chp->ccw_count); + uptr->u4 = 0; /* no I/O yet */ + uptr->CMD &= LMASK; /* nothing left, command complete */ + chan_end(chsa, SNS_CHNEND|SNS_DEVEND); /* we done */ +//WAS return SCPE_IOERR; + } +#endif } else { + if (chp->ccw_count > 0) { if (chan_read_byte(chsa, &ch)) { /* get byte from memory */ uptr->CMD &= LMASK; /* nothing left, command complete */ - chan_end(chsa, SNS_CHNEND|SNS_DEVEND); /* done */ sim_debug(DEBUG_CMD, &con_dev, "con_haltio HIO I/O stop chsa %04x cmd = %02x\n", chsa, cmd); + chan_end(chsa, SNS_CHNEND|SNS_DEVEND); /* done */ // return SCPE_OK; /* not busy anymore */ return SCPE_IOERR; } + } } uptr->CMD &= LMASK; /* make non-busy */ uptr->SNS = SNS_RDY|SNS_ONLN; /* status is online & ready */ - return SCPE_OK; /* not busy */ + return SCPE_OK; /* not busy */ //no work chan_end(chsa, SNS_CHNEND|SNS_UNITCHK); /* write terminated */ // chan_end(chsa, SNS_CHNEND|SNS_DEVEND|SNS_UNITCHK); /* write terminated */ // chan_end(chsa, SNS_CHNEND|SNS_DEVEND|SNS_UNITEXP); /* done bit 15 */ /* bad status */ diff --git a/SEL32/sel32_cpu.c b/SEL32/sel32_cpu.c index 460142a..7b6710b 100644 --- a/SEL32/sel32_cpu.c +++ b/SEL32/sel32_cpu.c @@ -1424,6 +1424,11 @@ t_stat RealAddr(uint32 addr, uint32 *realaddr, uint32 *prot, uint32 access) else if (access == MEM_WR) TRAPSTATUS |= BIT2; /* set bit 2 of trap status */ + /* returning this error fails test 34/2 of mmm diag */ +/*NEW*/// return MAPFLT; /* map fault error on memory access */ +/*NEW*/// return MACHINECHK_TRAP; /* diags want machine check error */ + /* returning this error fixes 34/2, but still fails 46/2 */ + return NPMEM; /* none present memory error */ } else TRAPSTATUS |= BIT28; /* set bit 28 of trap status */ return NPMEM; /* none present memory error */ @@ -1488,6 +1493,10 @@ t_stat RealAddr(uint32 addr, uint32 *realaddr, uint32 *prot, uint32 access) // 32/97 wants MAPFLT for test 37/1 in CN.MMM TRAPSTATUS |= BIT12; /* set bit 12 of trap status */ return MAPFLT; /* no, map fault error */ +/*TRY*/// return NPMEM; /* no, none present memory error */ +/*TRY*/// return MACHINECHK_TRAP; /* diags want machine check error */ +/*TRY*/// return SYSTEMCHK_TRAP; /* diags want machine check error */ +/*TRY*/// return PRIVVIOL_TRAP; /* set the trap to take */ // if (access == MEM_RD) // TRAPSTATUS |= BIT1; /* set bit 1 of trap status */ // else diff --git a/SEL32/sel32_disk.c b/SEL32/sel32_disk.c index 018763c..25e241c 100644 --- a/SEL32/sel32_disk.c +++ b/SEL32/sel32_disk.c @@ -813,7 +813,16 @@ t_stat disk_srv(UNIT *uptr) sim_activate(uptr, 20); break; } else { - /* we have wasted enough time, we there */ + /* we have wasted enough time, we are there */ +#ifndef DO_SEEK_AGAIN + /* calculate file position in bytes of requested sector */ + /* file offset in bytes */ + tstart = STAR2SEC(uptr->STAR, SPT(type), SPC(type)) * SSB(type); + /* just reseek to the location where we will r/w data */ + if ((sim_fseek(uptr->fileref, tstart, SEEK_SET)) != 0) { /* do seek */ + sim_debug(DEBUG_DETAIL, dptr, "disk_srv Error on seek to %04x\n", tstart); + } +#endif uptr->CHS = uptr->STAR; /* we are there */ sim_activate(uptr, 10); break; @@ -1027,7 +1036,7 @@ rezero: uptr->CHS = disksec2star(tstart, type); /* see of over end of disk */ // if (tstart >= CAPB(type)) { - if (tstart >= CAP(type)) { + if (tstart >= (uint32)CAP(type)) { /* EOM reached, abort */ sim_debug(DEBUG_CMD, dptr, "DISK Read reached EOM for read from disk @ /%04x/%02x/%02x\n", @@ -1108,7 +1117,7 @@ rddone: uptr->CHS = disksec2star(tstart, type); /* see if over end of disk */ // if (tstart >= CAPB(type)) { - if (tstart >= CAP(type)) { + if (tstart >= (uint32)CAP(type)) { /* EOM reached, abort */ sim_debug(DEBUG_CMD, dptr, "DISK Write reached EOM for write to disk @ /%04x/%02x/%02x\n", @@ -1138,10 +1147,15 @@ wrdone: /* reserves the last cylinder, SEL diags reserve the next two, so the */ /* addr is CYL-4/HDS-1/0 and is VDT. The UTX/MPX media table is on */ /* previous track, so MDT = VDT-SPT is CYL-4/HDS-2/0 */ - /* The UTX flaw map is at FMAP = MDT-SPT CYL-4/HDS-3/0 */ - /* UTX media map is 1 track lower at UTXMM=FMAP-SPT CYL-4/HDS-4/0 */ - /* The UTX med map is pointed to by sector label 1 */ - /* simulate pointers here, set wd[3] in label to VDT */ + /* The UTX flaw map is at DMAP = MDT-SPT CYL-4/HDS-3/0 */ + /* UTX media map is 1 track lower at UMAP=DMAP-SPT CYL-4/HDS-4/0 */ + /* The UTX media map is pointed to by sector label 1 */ + /* simulate pointers here, set wd[3] in label to UMAP */ + + /* VDT 249264 (819/18/0) 0x3cdb0 for 9346 - 823/19/16 */ + /* MDT 249248 (819/17/0) 0x3cda0 for 9346 - 823/19/16 */ + /* DMAP 249232 (819/16/0) 0x3cd90 for 9346 - 823/19/16 */ + /* UMAP 249216 (819/15/0) 0x3cd80 for 9346 - 823/19/16 */ sim_debug(DEBUG_CMD, dptr, "disk_startcmd RSL STAR %08x disk geom %08x\n", uptr->CHS, GEOM(type)); @@ -1159,9 +1173,12 @@ wrdone: unit, buf[0], buf[1], buf[2], buf[3]); /* get sector address of UTX media descriptor */ - /* 819/7/0 is right for 8887, 819/16/0 for 9346 */ + /* 819/6/0 is right for 8887, 819/15/0 for 9346 */ + /* UMAP 249216 (819/15/0) 0x3cd80 for 9346 - 823/19/16 */ tstart = ((CYL(type)-4) * SPC(type)) + - ((HDS(type)-2) * SPT(type)) - SPT(type); + ((HDS(type)-4) * SPT(type)) - SPT(type); +//WAS tstart = ((CYL(type)-4) * SPC(type)) + +//WAS ((HDS(type)-2) * SPT(type)) - SPT(type); sim_debug(DEBUG_CMD, dptr, "disk_srv SL1 RSL sector %d %x star %02x %02x %02x %02x\n", @@ -1171,7 +1188,8 @@ wrdone: /* on HSDP UMAP is in wd 4 on label 1 */ /* on UDP & DPII DMAP is in wd 3 on label 0 */ /* on UDP & DPII UMAP is in wd 4 on label 0 */ -// tstart = 0x3cd90; /* 819/16/0 physical 249232 */ +//WAS tstart = 0x3cd90; /* 819/16/0 physical 249232 */ + /* UMAP 249216 (819/15/0) 0x3cd80 for 9346 - 823/19/16 */ /* the address must be physical for UDP */ /* store into sec 1 label */ buf[16] = (tstart >> 24) & 0xff; /* UMAP pointer */ @@ -1255,13 +1273,16 @@ wrdone: /* reserves the last cylinder, SEL diags reserve the next two, so the */ /* addr is CYL-4/HDS-1/0 and is VDT. The UTX/MPX media table is on */ /* previous track, so MDT = VDT-SPT is CYL-4/HDS-2/0 */ - /* The UTX flaw map is at FMAP = MDT-SPT CYL-4/HDS-3/0 */ - /* UTX media map is 1 track lower at UTXMM=FMAP-SPT CYL-4/HDS-4/0 */ + /* The UTX flaw map is at DMAP = MDT-SPT CYL-4/HDS-3/0 */ + /* UTX media map is 1 track lower at UMAP=FMAP-SPT CYL-4/HDS-4/0 */ /* The UTX media map is pointed to by sector label 1 */ /* simulate pointers here, set wd[3] in label to VDT */ /* get sector address of media defect table */ - /* 249264 (819/17/0) 0x3cda0 for 9346 - 823/19/16 */ + /* VDT 249264 (819/18/0) 0x3cdb0 for 9346 - 823/19/16 */ + /* MDT 249248 (819/17/0) 0x3cda0 for 9346 - 823/19/16 */ + /* DMAP 249232 (819/16/0) 0x3cd90 for 9346 - 823/19/16 */ + /* UMAP 249216 (819/15/0) 0x3cd80 for 9346 - 823/19/16 */ tstart = (CYL(type)-4) * SPC(type) + (HDS(type)-2) * SPT(type); cyl = disk_type[type].cyl-1; /* last cyl */ @@ -1283,18 +1304,17 @@ wrdone: buf[15] = (tstart) & 0xff; } -#ifndef NOTNOW /* get sector address of umap table */ - /* 249232 (819/16/0) 0x3cd90 for 9346 - 823/19/16 */ - tstart -= SPT(type); /* calc utxfmap address */ + /* UMAP 249216 (819/15/0) 0x3cd80 for 9346 - 823/19/16 */ +//WAS tstart -= SPT(type); /* calc umap address */ + tstart -= (2*SPT(type)); /* calc umap address */ /* the address must be physical for UDP */ - if (uptr->CHS == 0) { /* only write dmap address on trk 0 */ + if (uptr->CHS == 0) { /* only write umap address on trk 0 */ buf[16] = (tstart >> 24) & 0xff; /* ldeallp UMAP */ buf[17] = (tstart >> 16) & 0xff; buf[18] = (tstart >> 8) & 0xff; buf[19] = (tstart) & 0xff; } -#endif /* the tech doc shows the cyl/trk/sec data is in the first 4 bytes */ /* of the track label, BUT it is really in the configuration data */ @@ -1369,7 +1389,7 @@ int disk_format(UNIT *uptr) { uint32 tsize = disk_type[type].spt; /* get track size in sectors */ uint32 csize = disk_type[type].nhds * tsize; /* get cylinder size in sectors */ uint32 cyl = disk_type[type].cyl; /* get # cylinders */ - uint32 spc = disk_type[type].nhds * disk_type[type].spt; /* sectors/cyl */ +// uint32 spc = disk_type[type].nhds * disk_type[type].spt; /* sectors/cyl */ uint32 cap = disk_type[type].cyl * csize; /* disk capacity in sectors */ uint32 cylv = cyl; /* number of cylinders */ uint8 *buff; @@ -1384,7 +1404,10 @@ int disk_format(UNIT *uptr) { int32 daddr = vaddr - SPT(type); /* get sector address of utx flaw map sec 1 pointer */ /* use this address for sec 1 label pointer */ - int32 uaddr = daddr - SPT(type); +//WASint32 uaddr = daddr - SPT(type); + int32 uaddr = daddr - (2*SPT(type)); + /* last block available */ + int32 luaddr = (CYL(type)-4) * SPC(type); #ifdef MAYBE /* get sector address of utx flaw data (1 track long) */ /* set trace data to zero */ @@ -1404,15 +1427,19 @@ int disk_format(UNIT *uptr) { }; #else { + 0x4e554d50,(cap-1),luaddr-1,0,0,0,0,0xe10, + 0,0x5320,0,0x4e60,0x46,luaddr,0,0xd360, + 0x88,0x186b0,0x13a,0xd100,0x283,0,0,0, + 0,0x22c2813e,0,0x06020000,0xf4,0,0x431b1c,0, /* try to makeup a utx dmap */ // 0xf003d14f,0x8a03cda0,0x9a03cdbf,0x8903cdc0, // 0x9903d01f,0x8c03d020,0x9c03d14f,0xf4000000, - 0xf0000000 | (cap-1), 0x8a000000 | daddr, - 0x9a000000 | (daddr + ((2 * tsize) - 1)), - 0x89000000 | (daddr + (2 * tsize)), - 0x99000000 | ((cap-1)-spc), - 0x8c000000 | (cap-spc), - 0x9c000000 | (cap-1), 0xf4000000, +/// 0xf0000000 | (cap-1), 0x8a000000 | daddr, +/// 0x9a000000 | (daddr + ((2 * tsize) - 1)), +/// 0x89000000 | (daddr + (2 * tsize)), +/// 0x99000000 | ((cap-1)-spc), +/// 0x8c000000 | (cap-spc), +/// 0x9c000000 | (cap-1), 0xf4000000, }; #endif /* 250191 249248 250191 0 */ @@ -1510,7 +1537,7 @@ int disk_format(UNIT *uptr) { /* vaddr is (cap) - 3 cyl - 1 track */ /* seek to vendor label area */ - sim_fseek(uptr->fileref, (vaddr)*ssize, SEEK_SET); /* seek UMAP */ + sim_fseek(uptr->fileref, (vaddr)*ssize, SEEK_SET); /* seek VMAP */ if ((sim_fwrite((char *)&vmap, sizeof(uint32), 2, uptr->fileref)) != 2) { sim_debug(DEBUG_CMD, dptr, "Error on vendor map write to diskfile sect %06x\n", vaddr * ssize); @@ -1526,18 +1553,16 @@ int disk_format(UNIT *uptr) { "Error on dmap write to diskfile sect %06x\n", daddr * ssize); } -#ifndef MAYBE sim_fseek(uptr->fileref, (uaddr)*ssize, SEEK_SET); /* seek UMAP */ if ((sim_fwrite((char *)&umap, sizeof(uint32), 256, uptr->fileref)) != 256) { sim_debug(DEBUG_CMD, dptr, "Error on umap write to diskfile sect %06x\n", uaddr * ssize); } -#endif - printf("writing to vmap sec %x bytes %x\n", - vaddr, (vaddr)*ssize); - printf("writing zeros to umap sec %x bytes %x\n", - uaddr, (uaddr)*ssize); + printf("writing to vmap sec %x (%d) bytes %x (%d)\n", + vaddr, vaddr, (vaddr)*ssize, (vaddr)*ssize); + printf("writing to umap sec %x (%d) bytes %x (%d)\n", + uaddr, uaddr, (uaddr)*ssize, (uaddr)*ssize); printf("writing dmap to %x %d %x %d dmap to %x %d %x %d\n", cap-1, cap-1, (cap-1)*ssize, (cap-1)*ssize, daddr, daddr, daddr*ssize, daddr*ssize); diff --git a/SEL32/sel32_hsdp.c b/SEL32/sel32_hsdp.c index 3b2f00a..3c9172a 100644 --- a/SEL32/sel32_hsdp.c +++ b/SEL32/sel32_hsdp.c @@ -861,6 +861,15 @@ t_stat hsdp_srv(UNIT *uptr) break; } else { /* we have wasted enough time, we there */ +#ifndef DO_SEEK_AGAIN + /* calculate file position in bytes of requested sector */ + /* file offseet in bytes */ + tstart = STAR2SEC(uptr->STAR, SPT(type), SPC(type)) * SSB(type); + /* just reseek to the location where we will r/w data */ + if ((sim_fseek(uptr->fileref, tstart, SEEK_SET)) != 0) { /* do seek */ + sim_debug(DEBUG_DETAIL, dptr, "hsdp_srv Error on seek to %04x\n", tstart); + } +#endif uptr->CHS = uptr->STAR; /* we are there */ sim_activate(uptr, 10); break; @@ -1094,7 +1103,7 @@ rezero: uptr->CHS = hsdpsec2star(tstart, type); /* see of over end of disk */ // if (tstart >= CAPB(type)) { - if (tstart >= CAP(type)) { + if (tstart >= (uint32)CAP(type)) { /* EOM reached, abort */ sim_debug(DEBUG_CMD, dptr, "DISK Read reached EOM for read from disk @ /%04x/%02x/%02x\n", @@ -1215,7 +1224,7 @@ rddone: uptr->CHS = hsdpsec2star(tstart, type); /* see of over end of disk */ // if (tstart >= CAPB(type)) { - if (tstart >= CAP(type)) { + if (tstart >= (uint32)CAP(type)) { /* EOM reached, abort */ sim_debug(DEBUG_CMD, dptr, "DISK Write reached EOM for write to disk @ /%04x/%02x/%02x\n", @@ -1245,8 +1254,8 @@ wrdone: /* reserves the last cylinder, SEL diags reserve the next two, so the */ /* addr is CYL-4/HDS-1/0 and is VDT. The UTX/MPX media table is on */ /* previous track, so MDT = VDT-SPT is CYL-4/HDS-2/0 */ - /* The UTX flaw map is at FMAP = MDT-SPT CYL-4/HDS-3/0 */ - /* UTX media map is 1 track lower at UTXMM=FMAP-SPT CYL-4/HDS-4/0 */ + /* The UTX flaw map is at DMAP = MDT-SPT CYL-4/HDS-3/0 */ + /* UTX media map is 1 track lower at UMAP=DMAP-SPT CYL-4/HDS-4/0 */ /* The UTX med map is pointed to by sector label 1 */ /* simulate pointers here, set wd[3] in label to VDT */ @@ -1266,9 +1275,11 @@ wrdone: unit, buf[0], buf[1], buf[2], buf[3]); /* get sector address of UTX media descriptor */ - /* 819/7/0 is right for 8887, 819/16/0 for 9346 */ + /* 819/6/0 is right for 8887, 819/15/0 for 9346 */ tstart = ((CYL(type)-4) * SPC(type)) + - ((HDS(type)-2) * SPT(type)) - SPT(type); + ((HDS(type)-4) * SPT(type)) - SPT(type); +//WAS tstart = ((CYL(type)-4) * SPC(type)) + +//WAS ((HDS(type)-2) * SPT(type)) - SPT(type); sim_debug(DEBUG_CMD, dptr, "hsdp_srv SL1 RSL sector %d %x star %02x %02x %02x %02x\n", @@ -1278,7 +1289,7 @@ wrdone: /* on HSDP UMAP is in wd 4 on label 1 */ /* on UDP & DPII DMAP is in wd 3 on label 0 */ /* on UDP & DPII UMAP is in wd 4 on label 0 */ -// tstart = 0x440aa; /* 819/7/0 logical 278698 */ +//WAS tstart = 0x440aa; /* 819/7/0 logical 278698 */ /* the address must be logical */ tstart = (tstart * (SPT(type) - 1))/SPT(type); /* make logical */ /* store into sec 1 label */ @@ -1397,10 +1408,10 @@ wrdone: buf[15] = (tstart) & 0xff; } -#ifndef NOTNOW /* get sector address of umap table */ /* 286895 (819/7/0) 0x460af for 8887 - 823/10/36 */ - tstart -= SPT(type); /* calc utxfmap address */ +//WAS tstart -= SPT(type); /* calc utxfmap address */ + tstart -= (2*SPT(type)); /* calc utxfmap address */ /* the address must be logical */ tstart = (tstart * (SPT(type) - 1))/SPT(type); /* make logical */ /* 278698 (819/7/0) 0x440aa for 8887 - 823/10/35 */ @@ -1410,7 +1421,6 @@ wrdone: buf[18] = (tstart >> 8) & 0xff; buf[19] = (tstart) & 0xff; } -#endif /* the tech doc shows the cyl/trk/sec data is in the first 4 bytes */ /* of the track label, BUT it is really in the configuration data */ @@ -1499,7 +1509,10 @@ int hsdp_format(UNIT *uptr) { int32 daddr = vaddr - SPT(type); /* get sector address of utx flaw map sec 1 pointer */ /* use this address for sec 1 label pointer */ - int32 uaddr = daddr - SPT(type); +//WASint32 uaddr = daddr - SPT(type); + int32 uaddr = daddr - (2*SPT(type)); + /* last block available */ + int32 luaddr = (CYL(type)-4) * SPC(type); #ifdef MAYBE /* get sector address of utx flaw data (1 track long) */ /* set trace data to zero */ @@ -1507,7 +1520,7 @@ int hsdp_format(UNIT *uptr) { #endif uint32 umap[256] = #ifndef NOTFORMPX -#ifndef NOERRORS +#ifdef NOERRORS /* try having no error, 7 in 3rd line */ {0x4e554d50,0x4450b,0x43fbb,0,0,0,0,0xe10, // {0x4e554d50,0x3d14f,0x00000,0,0,0,0xffffffff,0xe10, @@ -1522,16 +1535,24 @@ int hsdp_format(UNIT *uptr) { }; #else /* use original copy of geert's left disk */ - {0x4e554d50,0x4450b,0x43fbb,0,0,0,0,0xe10, +//WAS {0x4e554d50,0x4450b,0x43fbb,0,0,0,0,0xe10, + { + 0x4e554d50,(cap-1),luaddr-1,0,0,0,0,0xe10, + 0,0x5258,0,0x4e5c,0x3e,luaddr,0,0xd32c, + 0x79,0x187cc,0x118,0x14410,0x23f,0,0,0, + 0,0x3821a2d6,0,0x1102000,0xf4,0,0,0, +//WAS {0x4e554d50,0x4450b,0x43fbb,0,0,0,0,0xe10, // {0x4e554d50,0x3d14f,0x00000,0,0,0,0xffffffff,0xe10, - 7,0x5258,0,0x4e5c,0x3e,0x43fbc,0,0xd32c, +//WAS 7,0x5258,0,0x4e5c,0x3e,0x43fbc,0,0xd32c, // 0,0x5258,0,0x4e5c,0x3e,0x43fbc,0,0xd32c, - 0x79,0x187cc,0x118,0x14410,0x23f,0,0,0, - 0,0x3821a2d6,0x4608c,0x1102000,0xf4,0,0x4608c,0, +// 0,0x5258,0,0x4e5c,0x3e,0x43fbc,0,0xd32c, +/// 0x79,0x187cc,0x118,0x14410,0x23f,0,0,0, +/// 0,0x3821a2d6,0x4608c,0x1102000,0xf4,0,0x4608c,0, // 0,0x3821a2d6,0,0x1102000,0,0,0x4608c,0, - 0,0x46069,0,0,0x46046,0,0,0x46023, - 0,0,0x46000,0,0,0x45fdd,0,0, - 0x45fba,0,0,0,0,0,0,0, +// 0,0x3821a2d6,0,0x1102000,0,0,0x4608c,0, +/// 0,0x46069,0,0,0x46046,0,0,0x46023, +/// 0,0,0x46000,0,0,0x45fdd,0,0, +/// 0x45fba,0,0,0,0,0,0,0, }; #endif #else @@ -1655,24 +1676,21 @@ int hsdp_format(UNIT *uptr) { /* vaddr is daddr - spt */ sim_fseek(uptr->fileref, (daddr)*ssize, SEEK_SET); /* seek DMAP */ -// if ((sim_fwrite((char *)&vmap, sizeof(uint32), 2, uptr->fileref)) != 2) { if ((sim_fwrite((char *)&dmap, sizeof(uint32), 4, uptr->fileref)) != 4) { sim_debug(DEBUG_CMD, dptr, "Error on dmap write to diskfile sect %06x\n", daddr * ssize); } -#ifndef MAYBE sim_fseek(uptr->fileref, (uaddr)*ssize, SEEK_SET); /* seek UMAP */ if ((sim_fwrite((char *)&umap, sizeof(uint32), 256, uptr->fileref)) != 256) { sim_debug(DEBUG_CMD, dptr, "Error on umap write to diskfile sect %06x\n", uaddr * ssize); } -#endif - printf("writing to vmap sec %x bytes %x\n", - vaddr, (vaddr)*ssize); - printf("writing zeros to umap sec %x bytes %x\n", - uaddr, (uaddr)*ssize); + printf("writing to vmap sec %x (%d) bytes %x (%d)\n", + vaddr, vaddr, (vaddr)*ssize, (vaddr)*ssize); + printf("writing to umap sec %x (%d) bytes %x (%d)\n", + uaddr, uaddr, (uaddr)*ssize, (uaddr)*ssize); printf("writing dmap to %x %d %x %d dmap to %x %d %x %d\n", cap-1, cap-1, (cap-1)*ssize, (cap-1)*ssize, daddr, daddr, daddr*ssize, daddr*ssize); diff --git a/SEL32/taptools/tape2disk.c b/SEL32/taptools/tape2disk.c index f86e032..6295ef9 100644 --- a/SEL32/taptools/tape2disk.c +++ b/SEL32/taptools/tape2disk.c @@ -6,7 +6,7 @@ * MPX 3.x master SDT. For user SDT tapes or MPX 1.X master SDT tapes * leave the #define FMGRTAPE uncommented so it will be defined. The * program will stop on two EOFs. For non MPX tapes, the 2nd EOF means - * EOT. Some tapes have only one EOT and will termonate on EOT detected. + * EOT. Some tapes have only one EOT and will terminate on EOT detected. * Leave off the output file name to just scan the tape and output record * sizes and counts. */ diff --git a/SEL32/tests/diag.ini b/SEL32/tests/diag.ini index 26b445b..f6e1b46 100644 --- a/SEL32/tests/diag.ini +++ b/SEL32/tests/diag.ini @@ -163,5 +163,7 @@ set cpu idle ;bo dpa0 ;bo dma0 ; +; Go to simh on completion of script +expect "DOL>"^M ; Boot from mag tape bo mta0 diff --git a/SEL32/tests/sel32_test.ini b/SEL32/tests/sel32_test.ini index 2b55e23..ebb7afb 100644 --- a/SEL32/tests/sel32_test.ini +++ b/SEL32/tests/sel32_test.ini @@ -1,5 +1,6 @@ cd %~p0 set debug -n sel.log +;set CPU V6 4M ;set CPU 32/67 4M set CPU 32/27 4M set coml0 enable @@ -17,7 +18,7 @@ at lpr lprout at mta0 diag.tap at mta1 temptape.tap at mta2 output.tap -expect "DOL>" +expect "DOL>"^M bo mta0 det all rm temptape.tap diff --git a/doc/sel32_doc.doc b/doc/sel32_doc.doc index 0bcd17e149acf40aaac089a06a55854523e521e0..2aefc9754d7a42d035b0c3dd0f8ffbd615b08990 100644 GIT binary patch literal 77824 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 literal 73728 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 V4L!W(Z68ekd)QRr?QiAw|37wc+++X%