sigma_rad:fix wp test in sense and write op
This commit is contained in:
parent
49eccc768a
commit
609d46e801
1 changed files with 21 additions and 8 deletions
|
@ -64,9 +64,9 @@
|
||||||
#define RADA_GETTK(x) (((x) >> rad_tab[rad_model].tk_v) & rad_tab[rad_model].tk_m)
|
#define RADA_GETTK(x) (((x) >> rad_tab[rad_model].tk_v) & rad_tab[rad_model].tk_m)
|
||||||
#define RADA_GETSC(x) (((x) >> rad_tab[rad_model].sc_v) & rad_tab[rad_model].sc_m)
|
#define RADA_GETSC(x) (((x) >> rad_tab[rad_model].sc_v) & rad_tab[rad_model].sc_m)
|
||||||
|
|
||||||
/* Address bad flag */
|
/* Write protect flag */
|
||||||
|
|
||||||
#define RADA_INV 0x80
|
#define RADA_WP 0x80
|
||||||
|
|
||||||
/* Status byte 3 is current sector */
|
/* Status byte 3 is current sector */
|
||||||
/* Status byte 4 (7212 only) is failing sector */
|
/* Status byte 4 (7212 only) is failing sector */
|
||||||
|
@ -131,6 +131,7 @@ t_stat rad_showtype (FILE *st, UNIT *uptr, int32 val, CONST void *desc);
|
||||||
t_bool rad_inv_ad (uint32 *da);
|
t_bool rad_inv_ad (uint32 *da);
|
||||||
t_bool rad_inc_ad (void);
|
t_bool rad_inc_ad (void);
|
||||||
t_bool rad_end_sec (UNIT *uptr, uint32 lnt, uint32 exp, uint32 st);
|
t_bool rad_end_sec (UNIT *uptr, uint32 lnt, uint32 exp, uint32 st);
|
||||||
|
t_bool rad_wp_trk (uint32 adr);
|
||||||
|
|
||||||
/* RAD data structures
|
/* RAD data structures
|
||||||
|
|
||||||
|
@ -263,7 +264,7 @@ return 0;
|
||||||
|
|
||||||
t_stat rad_svc (UNIT *uptr)
|
t_stat rad_svc (UNIT *uptr)
|
||||||
{
|
{
|
||||||
uint32 i, sc, da, cmd, wd, wd1, c[4], gp;
|
uint32 i, sc, da, cmd, wd, wd1, c[4];
|
||||||
uint32 *fbuf = (uint32 *) uptr->filebuf;
|
uint32 *fbuf = (uint32 *) uptr->filebuf;
|
||||||
uint32 un = uptr - rad_unit;
|
uint32 un = uptr - rad_unit;
|
||||||
uint32 dva = rad_dib.dva | un;
|
uint32 dva = rad_dib.dva | un;
|
||||||
|
@ -318,8 +319,10 @@ switch (rad_cmd) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RADS_SENSE: /* sense */
|
case RADS_SENSE: /* sense */
|
||||||
c[0] = ((rad_ad >> 8) & 0x7F) | (rad_inv_ad (NULL)? RADA_INV: 0);
|
c[0] = (rad_ad >> 8) & 0x7F; /* addr hi */
|
||||||
c[1] = rad_ad & 0xFF; /* address */
|
if (rad_wp_trk (rad_ad)) /* addr wr prot? */
|
||||||
|
c[0] |= RADA_WP; /* set flag */
|
||||||
|
c[1] = rad_ad & 0xFF; /* addr lo */
|
||||||
c[2] = GET_PSC (rad_time); /* curr sector */
|
c[2] = GET_PSC (rad_time); /* curr sector */
|
||||||
c[3] = 0;
|
c[3] = 0;
|
||||||
for (i = 0, st = 0; (i < rad_tab[rad_model].nbys) && (st != CHS_ZBC); i++) {
|
for (i = 0, st = 0; (i < rad_tab[rad_model].nbys) && (st != CHS_ZBC); i++) {
|
||||||
|
@ -333,9 +336,7 @@ switch (rad_cmd) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RADS_WRITE: /* write */
|
case RADS_WRITE: /* write */
|
||||||
gp = (RADA_GETSC (rad_ad) * RAD_N_WLK) / /* write lock group */
|
if (rad_wp_trk (rad_ad)) { /* write protected? */
|
||||||
rad_tab[rad_model].tkun;
|
|
||||||
if ((rad_wlk >> gp) & 1) { /* write lock set? */
|
|
||||||
rad_flags |= RADV_WPE; /* set status */
|
rad_flags |= RADV_WPE; /* set status */
|
||||||
chan_uen (dva); /* uend */
|
chan_uen (dva); /* uend */
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
|
@ -500,6 +501,18 @@ if (tk >= rad_tab[rad_model].tkun) /* overflow? */
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Test disk addr for protected tracks */
|
||||||
|
|
||||||
|
t_bool rad_wp_trk (uint32 adr)
|
||||||
|
{
|
||||||
|
uint32 trk = RADA_GETTK (adr); /* track */
|
||||||
|
uint32 sw = (trk * RAD_N_WLK) / rad_tab[rad_model].tkun; /* switch num */
|
||||||
|
|
||||||
|
if ((rad_wlk >> sw) & 1) /* switch set? */
|
||||||
|
return TRUE;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Channel error */
|
/* Channel error */
|
||||||
|
|
||||||
t_stat rad_chan_err (uint32 dva, uint32 st)
|
t_stat rad_chan_err (uint32 dva, uint32 st)
|
||||||
|
|
Loading…
Add table
Reference in a new issue