vax610_sysdev.c - Generalized the boot parsing.
The supported boot options now are: B XQ ; Network boot B XQA ; equivalent B XQA0 ; equivalent B RQ ; Boot RQ0 B RQ0 ; equivalent B DUA ; equivalent B DUA0 ; equivalent B RQn ; Boot RQn B DUAn ; equivalent B DUn ; equivalent B ; Boot using boot ROM device search Also the R5 boot options can be specified either before or after the device name and with or without the R5: For example: B /R5:1 XQ B /1 XQ B XQ /R5:1 B XQ/1 are all equivalent
This commit is contained in:
parent
03bbd66cef
commit
732ef8307e
1 changed files with 52 additions and 18 deletions
|
@ -41,7 +41,8 @@
|
|||
/* MicroVAX I boot device definitions */
|
||||
|
||||
struct boot_dev {
|
||||
char *name;
|
||||
char *devname;
|
||||
char *devalias;
|
||||
int32 code;
|
||||
};
|
||||
|
||||
|
@ -60,8 +61,9 @@ int32 conisp, conpc, conpsl; /* console reg */
|
|||
char cpu_boot_cmd[CBUFSIZE] = { 0 }; /* boot command */
|
||||
|
||||
static struct boot_dev boot_tab[] = {
|
||||
{ "RQ", 0x00415544 }, /* DUAn */
|
||||
{ "XQ", 0x00415158 }, /* XQAn */
|
||||
{ "RQ", "DUA", 0x00415544 }, /* DUAn */
|
||||
{ "RQ", "DU", 0x00415544 }, /* DUAn */
|
||||
{ "XQ", "XQA", 0x00415158 }, /* XQAn */
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
|
@ -342,26 +344,26 @@ return run_cmd (flag, "CPU");
|
|||
|
||||
t_stat vax610_boot_parse (int32 flag, char *ptr)
|
||||
{
|
||||
char gbuf[CBUFSIZE];
|
||||
char gbuf[CBUFSIZE], dbuf[CBUFSIZE], rbuf[CBUFSIZE];
|
||||
char *slptr, *regptr;
|
||||
int32 i, r5v, unitno;
|
||||
DEVICE *dptr;
|
||||
UNIT *uptr;
|
||||
DIB *dibp;
|
||||
t_stat r;
|
||||
|
||||
regptr = get_glyph (ptr, gbuf, 0); /* get glyph */
|
||||
if ((slptr = strchr (gbuf, '/'))) { /* found slash? */
|
||||
if (ptr && (*ptr == '/')) { /* handle "BOOT /R5:n DEV" format */
|
||||
ptr = get_glyph (ptr, rbuf, 0); /* get glyph */
|
||||
regptr = rbuf;
|
||||
ptr = get_glyph (ptr, gbuf, 0); /* get glyph */
|
||||
}
|
||||
else { /* handle "BOOT DEV /R5:n" format */
|
||||
regptr = get_glyph (ptr, gbuf, 0); /* get glyph */
|
||||
if ((slptr = strchr (gbuf, '/'))) { /* found slash? */
|
||||
regptr = strchr (ptr, '/'); /* locate orig */
|
||||
*slptr = 0; /* zero in string */
|
||||
}
|
||||
dptr = find_unit (gbuf, &uptr); /* find device */
|
||||
if ((dptr == NULL) || (uptr == NULL))
|
||||
return SCPE_ARG;
|
||||
dibp = (DIB *) dptr->ctxt; /* get DIB */
|
||||
if (dibp == NULL)
|
||||
return SCPE_ARG;
|
||||
unitno = (int32) (uptr - dptr->units);
|
||||
}
|
||||
/* parse R5 parameter value */
|
||||
r5v = 0;
|
||||
if ((strncmp (regptr, "/R5:", 4) == 0) ||
|
||||
(strncmp (regptr, "/R5=", 4) == 0) ||
|
||||
|
@ -371,10 +373,33 @@ if ((strncmp (regptr, "/R5:", 4) == 0) ||
|
|||
if (r != SCPE_OK)
|
||||
return r;
|
||||
}
|
||||
else if (*regptr == '/') {
|
||||
r5v = (int32) get_uint (regptr + 1, 16, LMASK, &r);
|
||||
if (r != SCPE_OK)
|
||||
return r;
|
||||
}
|
||||
else if (*regptr != 0)
|
||||
return SCPE_ARG;
|
||||
for (i = 0; boot_tab[i].name != NULL; i++) {
|
||||
if (strcmp (dptr->name, boot_tab[i].name) == 0) {
|
||||
if (gbuf[0]) {
|
||||
unitno = -1;
|
||||
for (i = 0; boot_tab[i].devname != NULL; i++) {
|
||||
if (memcmp (gbuf, boot_tab[i].devalias, strlen(boot_tab[i].devalias)) == 0) {
|
||||
sprintf(dbuf, "%s%s", boot_tab[i].devname, gbuf + strlen(boot_tab[i].devalias));
|
||||
dptr = find_unit (dbuf, &uptr);
|
||||
if ((dptr == NULL) || (uptr == NULL))
|
||||
return SCPE_ARG;
|
||||
unitno = (int32) (uptr - dptr->units);
|
||||
}
|
||||
if ((unitno == -1) &&
|
||||
(memcmp (gbuf, boot_tab[i].devname, strlen(boot_tab[i].devname)) == 0)) {
|
||||
sprintf(dbuf, "%s%s", boot_tab[i].devname, gbuf + strlen(boot_tab[i].devname));
|
||||
dptr = find_unit (dbuf, &uptr);
|
||||
if ((dptr == NULL) || (uptr == NULL))
|
||||
return SCPE_ARG;
|
||||
unitno = (int32) (uptr - dptr->units);
|
||||
}
|
||||
if (unitno == -1)
|
||||
continue;
|
||||
R[0] = boot_tab[i].code | (('0' + unitno) << 24);
|
||||
R[1] = 0xC0;
|
||||
R[2] = 0;
|
||||
|
@ -384,6 +409,15 @@ for (i = 0; boot_tab[i].name != NULL; i++) {
|
|||
return SCPE_OK;
|
||||
}
|
||||
}
|
||||
else {
|
||||
R[0] = 0;
|
||||
R[1] = 0xC0;
|
||||
R[2] = 0;
|
||||
R[3] = 0;
|
||||
R[4] = 0;
|
||||
R[5] = r5v;
|
||||
return SCPE_OK;
|
||||
}
|
||||
return SCPE_NOFNC;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue