H316: Merge updates from Bob Supnik and Bob Armstrong (Instruction decoding)
This commit is contained in:
parent
2f350955ec
commit
fb3c5327b7
8 changed files with 165 additions and 116 deletions
|
@ -1,6 +1,6 @@
|
||||||
/* h316_cpu.c: Honeywell 316/516 CPU simulator
|
/* h316_cpu.c: Honeywell 316/516 CPU simulator
|
||||||
|
|
||||||
Copyright (c) 1999-2011, Robert M. Supnik
|
Copyright (c) 1999-2015, Robert M. Supnik
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
copy of this software and associated documentation files (the "Software"),
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
@ -508,13 +508,16 @@ if (chan_req) { /* channel request? */
|
||||||
/* Interrupts */
|
/* Interrupts */
|
||||||
|
|
||||||
//[RLA] Todo - add WDT interrupts ????
|
//[RLA] Todo - add WDT interrupts ????
|
||||||
|
|
||||||
iack = FALSE;
|
iack = FALSE;
|
||||||
if ((dev_int & (INT_PEND|INT_NMI|dev_enb)) > INT_PEND) { // [RLA] check for standard interrupt
|
if ((dev_int & (INT_PEND|INT_NMI|dev_enb)) > INT_PEND) { // [RLA] check for standard interrupt
|
||||||
MB = cpu_interrupt(M_INT); iack = TRUE;
|
MB = cpu_interrupt(M_INT);
|
||||||
|
iack = TRUE;
|
||||||
}
|
}
|
||||||
else if (((dev_ext_int & dev_ext_enb) != 0) // [RLA] check for extended interrupt
|
else if (((dev_ext_int & dev_ext_enb) != 0) // [RLA] check for extended interrupt
|
||||||
&& ((dev_int & INT_PEND) == INT_PEND)) {
|
&& ((dev_int & INT_PEND) == INT_PEND)) {
|
||||||
MB = cpu_ext_interrupt(); iack = TRUE;
|
MB = cpu_ext_interrupt ();
|
||||||
|
iack = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Instruction fetch */
|
/* Instruction fetch */
|
||||||
|
@ -578,9 +581,11 @@ switch (I_GETOP (MB)) { /* case on <1:6> */
|
||||||
case 004: case 024: case 044: case 064: /* STA */
|
case 004: case 024: case 044: case 064: /* STA */
|
||||||
if ((reason = Ea (MB, &Y))) /* eff addr */
|
if ((reason = Ea (MB, &Y))) /* eff addr */
|
||||||
break;
|
break;
|
||||||
if ((reason = Write(Y, AR))) break; /* [RLA] store A */
|
if ((reason = Write(Y, AR)))
|
||||||
|
break; /* [RLA] store A */
|
||||||
if (dp) { /* double prec? */
|
if (dp) { /* double prec? */
|
||||||
if ((reason = Write(Y | 1, BR))) break; /* [RLA] store B */
|
if ((reason = Write(Y | 1, BR)))
|
||||||
|
break; /* [RLA] store B */
|
||||||
sc = 0;
|
sc = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -621,7 +626,8 @@ switch (I_GETOP (MB)) { /* case on <1:6> */
|
||||||
if ((reason = Ea (MB, &Y))) /* eff addr */
|
if ((reason = Ea (MB, &Y))) /* eff addr */
|
||||||
break;
|
break;
|
||||||
MB = NEWA (Read (Y), PC); /* merge old PC */
|
MB = NEWA (Read (Y), PC); /* merge old PC */
|
||||||
if ((reason = Write(Y, MB))) break; // [RLA]
|
if ((reason = Write(Y, MB)))
|
||||||
|
break; // [RLA]
|
||||||
PCQ_ENTRY;
|
PCQ_ENTRY;
|
||||||
PC = NEWA (PC, Y + 1); /* set new PC */
|
PC = NEWA (PC, Y + 1); /* set new PC */
|
||||||
break;
|
break;
|
||||||
|
@ -640,7 +646,8 @@ switch (I_GETOP (MB)) { /* case on <1:6> */
|
||||||
if ((reason = Ea (MB, &Y))) /* eff addr */
|
if ((reason = Ea (MB, &Y))) /* eff addr */
|
||||||
break;
|
break;
|
||||||
MB = (Read (Y) + 1) & DMASK; /* incr, rewrite */
|
MB = (Read (Y) + 1) & DMASK; /* incr, rewrite */
|
||||||
if ((reason = Write(Y, MB))) break; // [RLA]
|
if ((reason = Write(Y, MB)))
|
||||||
|
break; // [RLA]
|
||||||
if (MB == 0) /* skip if zero */
|
if (MB == 0) /* skip if zero */
|
||||||
PC = NEWA (PC, PC + 1);
|
PC = NEWA (PC, PC + 1);
|
||||||
break;
|
break;
|
||||||
|
@ -649,14 +656,16 @@ switch (I_GETOP (MB)) { /* case on <1:6> */
|
||||||
if ((reason = Ea (MB, &Y))) /* eff addr */
|
if ((reason = Ea (MB, &Y))) /* eff addr */
|
||||||
break;
|
break;
|
||||||
MB = Read (Y);
|
MB = Read (Y);
|
||||||
if ((reason = Write(Y, AR))) break; /* [RLA] A to mem */
|
if ((reason = Write(Y, AR)))
|
||||||
|
break; /* [RLA] A to mem */
|
||||||
AR = MB; /* mem to A */
|
AR = MB; /* mem to A */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 015: case 055: /* STX */
|
case 015: case 055: /* STX */
|
||||||
if ((reason = Ea (MB & ~IDX, &Y))) /* eff addr */
|
if ((reason = Ea (MB & ~IDX, &Y))) /* eff addr */
|
||||||
break;
|
break;
|
||||||
if ((reason = Write(Y, XR))) break; /* [RLA] store XR */
|
if ((reason = Write(Y, XR)))
|
||||||
|
break; /* [RLA] store XR */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 035: case 075: /* LDX */
|
case 035: case 075: /* LDX */
|
||||||
|
@ -1127,9 +1136,12 @@ return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
// [RLA] Standard (fixed vector) interrupt action ...
|
// [RLA] Standard (fixed vector) interrupt action ...
|
||||||
int32 cpu_interrupt (int32 vec) {
|
|
||||||
|
int32 cpu_interrupt (int32 vec)
|
||||||
|
{
|
||||||
pme = ext; /* save extend */
|
pme = ext; /* save extend */
|
||||||
if (cpu_unit.flags & UNIT_EXT) ext = 1; /* ext opt? extend on */
|
if (cpu_unit.flags & UNIT_EXT)
|
||||||
|
ext = 1; /* ext opt? extend on */
|
||||||
dev_int = dev_int & ~INT_ON; /* intr off */
|
dev_int = dev_int & ~INT_ON; /* intr off */
|
||||||
return 0120000 | vec; /* inst = JST* vector */
|
return 0120000 | vec; /* inst = JST* vector */
|
||||||
}
|
}
|
||||||
|
@ -1191,11 +1203,6 @@ int32 sim_ota_2024 (int32 inst, int32 fnc, int32 dat, int32 dev)
|
||||||
// flags (single or double precision HSA, extended addressing mode,
|
// flags (single or double precision HSA, extended addressing mode,
|
||||||
// the carry flag, etc).
|
// the carry flag, etc).
|
||||||
//
|
//
|
||||||
// The original simh implementation handled the regular SMK and OTK
|
|
||||||
// as special cases in the CLK device. Why the CLK device??? Because
|
|
||||||
// it also uses device code 20! Shame - these have nothing to do with
|
|
||||||
// the clock!
|
|
||||||
//
|
|
||||||
// This routine implements these special OTKs as part of the CPU.
|
// This routine implements these special OTKs as part of the CPU.
|
||||||
// That allows us to implement the extra interrupt masks needed by the
|
// That allows us to implement the extra interrupt masks needed by the
|
||||||
// IMP, and it also allows the CLK device to be disabled without losing
|
// IMP, and it also allows the CLK device to be disabled without losing
|
||||||
|
@ -1204,15 +1211,20 @@ int32 sim_ota_2024 (int32 inst, int32 fnc, int32 dat, int32 dev)
|
||||||
// needs it to be disabled.
|
// needs it to be disabled.
|
||||||
|
|
||||||
// Although OTA 24 is reserved nothing we currently simulate uses it!
|
// Although OTA 24 is reserved nothing we currently simulate uses it!
|
||||||
if (dev == 024) return IOBADFNC (dat);
|
|
||||||
|
if (dev == 024)
|
||||||
|
return IOBADFNC (dat);
|
||||||
|
|
||||||
// Device code 20...
|
// Device code 20...
|
||||||
switch (fnc) {
|
switch (fnc) {
|
||||||
case 000: // SMK 020 - set standard interrupt mask
|
case 000: // SMK 020 - set standard interrupt mask
|
||||||
dev_enb = dat; break;
|
dev_enb = dat;
|
||||||
|
break;
|
||||||
case 001: // SMK 120 - set extended interrupt mask #1
|
case 001: // SMK 120 - set extended interrupt mask #1
|
||||||
if (ext_ints < 16) return IOBADFNC(dat);
|
if (ext_ints < 16)
|
||||||
dev_ext_enb = dat; break;
|
return IOBADFNC(dat);
|
||||||
|
dev_ext_enb = dat;
|
||||||
|
break;
|
||||||
case 002: // SMK 220 - set extended interrupt mask #2
|
case 002: // SMK 220 - set extended interrupt mask #2
|
||||||
case 003: // SMK 320 - set extended interrupt mask #3
|
case 003: // SMK 320 - set extended interrupt mask #3
|
||||||
return IOBADFNC(dat);
|
return IOBADFNC(dat);
|
||||||
|
@ -1647,8 +1659,8 @@ return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up I/O dispatch and channel maps */
|
/* Set up I/O dispatch and channel maps */
|
||||||
|
|
||||||
// [RLA] Check for DMC conflicts (on both DMC channels!) ...
|
// [RLA] Check for DMC conflicts (on both DMC channels!) ...
|
||||||
|
|
||||||
t_bool set_chanmap (DEVICE *dptr, DIB *dibp, uint32 dno, uint32 chan)
|
t_bool set_chanmap (DEVICE *dptr, DIB *dibp, uint32 dno, uint32 chan)
|
||||||
{
|
{
|
||||||
if ((chan < DMC_V_DMC1) && (chan >= dma_nch)) {
|
if ((chan < DMC_V_DMC1) && (chan >= dma_nch)) {
|
||||||
|
@ -1692,9 +1704,11 @@ for (i = 0; (dptr = sim_devices[i]); i++) { /* loop thru devices */
|
||||||
} /* end for */
|
} /* end for */
|
||||||
// [RLA] set up the channel map
|
// [RLA] set up the channel map
|
||||||
if (dibp->chan != 0)
|
if (dibp->chan != 0)
|
||||||
if (set_chanmap(dptr, dibp, dno, dibp->chan-1)) return TRUE;
|
if (set_chanmap(dptr, dibp, dno, dibp->chan-1))
|
||||||
|
return TRUE;
|
||||||
if (dibp->chan2 != 0)
|
if (dibp->chan2 != 0)
|
||||||
if (set_chanmap(dptr, dibp, dno, dibp->chan2-1)) return TRUE;
|
if (set_chanmap(dptr, dibp, dno, dibp->chan2-1))
|
||||||
|
return TRUE;
|
||||||
// [RLA] If the device uses extended interrupts, check that they're enabled.
|
// [RLA] If the device uses extended interrupts, check that they're enabled.
|
||||||
if ((dibp->inum != INT_V_NONE) && (dibp->inum >= INT_V_EXTD) && (ext_ints == 0)) {
|
if ((dibp->inum != INT_V_NONE) && (dibp->inum >= INT_V_EXTD) && (ext_ints == 0)) {
|
||||||
sim_printf ("%s uses extended interrupts but that option is disabled\n", sim_dname (dptr));
|
sim_printf ("%s uses extended interrupts but that option is disabled\n", sim_dname (dptr));
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* h316_defs.h: Honeywell 316/516 simulator definitions
|
/* h316_defs.h: Honeywell 316/516 simulator definitions
|
||||||
|
|
||||||
Copyright (c) 1999-2011, Robert M. Supnik
|
Copyright (c) 1999-2015, Robert M. Supnik
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
copy of this software and associated documentation files (the "Software"),
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
@ -218,6 +218,7 @@ typedef struct h316_dib DIB;
|
||||||
#define TST_EXT_INTREQ(x) ((dev_ext_int & dev_ext_enb & (x)) != 0)
|
#define TST_EXT_INTREQ(x) ((dev_ext_int & dev_ext_enb & (x)) != 0)
|
||||||
|
|
||||||
/* Prototypes */
|
/* Prototypes */
|
||||||
|
|
||||||
t_stat io_set_iobus (UNIT *uptr, int32 val, char *cptr, void *desc);
|
t_stat io_set_iobus (UNIT *uptr, int32 val, char *cptr, void *desc);
|
||||||
t_stat io_set_dma (UNIT *uptr, int32 val, char *cptr, void *desc);
|
t_stat io_set_dma (UNIT *uptr, int32 val, char *cptr, void *desc);
|
||||||
t_stat io_set_dmc (UNIT *uptr, int32 val, char *cptr, void *desc);
|
t_stat io_set_dmc (UNIT *uptr, int32 val, char *cptr, void *desc);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* h316_dp.c: Honeywell 4623, 4651, 4720 disk simulator
|
/* h316_dp.c: Honeywell 4623, 4651, 4720 disk simulator
|
||||||
|
|
||||||
Copyright (c) 2003-2012, Robert M. Supnik
|
Copyright (c) 2003-2015, Robert M. Supnik
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
copy of this software and associated documentation files (the "Software"),
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
@ -27,7 +27,7 @@
|
||||||
4651 disk subsystem
|
4651 disk subsystem
|
||||||
4720 disk subsystem
|
4720 disk subsystem
|
||||||
|
|
||||||
3-Jul-13 RLA compatibility changes for extended interrupts
|
03-Jul-13 RLA compatibility changes for extended interrupts
|
||||||
19-Mar-12 RMS Fixed declaration of chan_req (Mark Pizzolato)
|
19-Mar-12 RMS Fixed declaration of chan_req (Mark Pizzolato)
|
||||||
04-Sep-05 RMS Fixed missing return (Peter Schorn)
|
04-Sep-05 RMS Fixed missing return (Peter Schorn)
|
||||||
15-Jul-05 RMS Fixed bug in attach routine
|
15-Jul-05 RMS Fixed bug in attach routine
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* h316_fhd.c: H316/516 fixed head simulator
|
/* h316_fhd.c: H316/516 fixed head simulator
|
||||||
|
|
||||||
Copyright (c) 2003-2013, Robert M. Supnik
|
Copyright (c) 2003-2015, Robert M. Supnik
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
copy of this software and associated documentation files (the "Software"),
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
@ -26,7 +26,7 @@
|
||||||
fhd 516-4400 fixed head disk
|
fhd 516-4400 fixed head disk
|
||||||
|
|
||||||
03-Sep-13 RMS Added explicit void * cast
|
03-Sep-13 RMS Added explicit void * cast
|
||||||
3-Jul-13 RLA compatibility changes for extended interrupts
|
03-Jul-13 RLA compatibility changes for extended interrupts
|
||||||
19-Mar-12 RMS Fixed declaration of chan_req (Mark Pizzolato)
|
19-Mar-12 RMS Fixed declaration of chan_req (Mark Pizzolato)
|
||||||
15-May-06 RMS Fixed bug in autosize attach (David Gesswein)
|
15-May-06 RMS Fixed bug in autosize attach (David Gesswein)
|
||||||
04-Jan-04 RMS Changed sim_fsize calling sequence
|
04-Jan-04 RMS Changed sim_fsize calling sequence
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* h316_lp.c: Honeywell 316/516 line printer
|
/* h316_lp.c: Honeywell 316/516 line printer
|
||||||
|
|
||||||
Copyright (c) 1999-2008, Robert M. Supnik
|
Copyright (c) 1999-2015, Robert M. Supnik
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
copy of this software and associated documentation files (the "Software"),
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
@ -25,7 +25,7 @@
|
||||||
|
|
||||||
lpt line printer
|
lpt line printer
|
||||||
|
|
||||||
3-Jul-13 RLA compatibility changes for extended interrupts
|
03-Jul-13 RLA compatibility changes for extended interrupts
|
||||||
09-Jun-07 RMS Fixed lost last print line (Theo Engel)
|
09-Jun-07 RMS Fixed lost last print line (Theo Engel)
|
||||||
19-Jan-06 RMS Added UNIT_TEXT flag
|
19-Jan-06 RMS Added UNIT_TEXT flag
|
||||||
03-Apr-06 RMS Fixed bug in blanks backscanning (Theo Engel)
|
03-Apr-06 RMS Fixed bug in blanks backscanning (Theo Engel)
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
|
|
||||||
mt 516-4100 seven track magnetic tape
|
mt 516-4100 seven track magnetic tape
|
||||||
|
|
||||||
3-Jul-13 RLA compatibility changes for extended interrupts
|
03-Jul-13 RLA compatibility changes for extended interrupts
|
||||||
19-Mar-12 RMS Fixed declaration of chan_req (Mark Pizzolato)
|
19-Mar-12 RMS Fixed declaration of chan_req (Mark Pizzolato)
|
||||||
09-Jun-07 RMS Fixed bug in write without stop (Theo Engel)
|
09-Jun-07 RMS Fixed bug in write without stop (Theo Engel)
|
||||||
16-Feb-06 RMS Added tape capacity checking
|
16-Feb-06 RMS Added tape capacity checking
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* h316_stddev.c: Honeywell 316/516 standard devices
|
/* h316_stddev.c: Honeywell 316/516 standard devices
|
||||||
|
|
||||||
Copyright (c) 1999-2013, Robert M. Supnik
|
Copyright (c) 1999-2015, Robert M. Supnik
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
copy of this software and associated documentation files (the "Software"),
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
10-Sep-13 RMS Fixed several bugs in the TTY logic
|
10-Sep-13 RMS Fixed several bugs in the TTY logic
|
||||||
Added SET file type commands to PTR/PTP
|
Added SET file type commands to PTR/PTP
|
||||||
3-Jul-13 RLA compatibility changes for extended interrupts
|
03-Jul-13 RLA compatibility changes for extended interrupts
|
||||||
23-May-13 RLA Move the SMK/OTK to h316_cpu (where it belongs!)
|
23-May-13 RLA Move the SMK/OTK to h316_cpu (where it belongs!)
|
||||||
Allow the CLK device to be disabled
|
Allow the CLK device to be disabled
|
||||||
09-Jun-07 RMS Fixed bug in clock increment (Theo Engel)
|
09-Jun-07 RMS Fixed bug in clock increment (Theo Engel)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* h316_sys.c: Honeywell 316/516 simulator interface
|
/* h316_sys.c: Honeywell 316/516 simulator interface
|
||||||
|
|
||||||
Copyright (c) 1999-2008, Robert M Supnik
|
Copyright (c) 1999-2015, Robert M Supnik
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
copy of this software and associated documentation files (the "Software"),
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
@ -23,6 +23,8 @@
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
used in advertising or otherwise to promote the sale, use or other dealings
|
||||||
in this Software without prior written authorization from Robert M Supnik.
|
in this Software without prior written authorization from Robert M Supnik.
|
||||||
|
|
||||||
|
15-Sep-13 RMS Added device name support for IO instructions
|
||||||
|
Fixed handling of OTK
|
||||||
21-May-13 RLA Add IMP/TIP devices
|
21-May-13 RLA Add IMP/TIP devices
|
||||||
01-Dec-04 RMS Fixed fprint_opr calling sequence
|
01-Dec-04 RMS Fixed fprint_opr calling sequence
|
||||||
24-Oct-03 RMS Added DMA/DMC support
|
24-Oct-03 RMS Added DMA/DMC support
|
||||||
|
@ -144,7 +146,7 @@ static const char *opcode[] = {
|
||||||
"CAR", "CAL", "ICL",
|
"CAR", "CAL", "ICL",
|
||||||
"AOA", "ACA", "ICR", "ICA",
|
"AOA", "ACA", "ICR", "ICA",
|
||||||
"NOP", "SKP", "SSR", "SSS",
|
"NOP", "SKP", "SSR", "SSS",
|
||||||
"JMP", "JMP*",
|
"OTK", "JMP", "JMP*",
|
||||||
"LDA", "LDA*", "ANA", "ANA*",
|
"LDA", "LDA*", "ANA", "ANA*",
|
||||||
"STA", "STA*", "ERA", "ERA*",
|
"STA", "STA*", "ERA", "ERA*",
|
||||||
"ADD", "ADD*", "SUB", "SUB*",
|
"ADD", "ADD*", "SUB", "SUB*",
|
||||||
|
@ -168,6 +170,17 @@ static const char *opcode[] = {
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const char *ioname[DEV_MAX] = {
|
||||||
|
NULL, "PTR", "PTP", "LPT", "TTY", "CDR", NULL, NULL,
|
||||||
|
"MT", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
"CLK", NULL, "FHD", NULL, "DMA", "DP", NULL, NULL,
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||||||
|
};
|
||||||
|
|
||||||
static const int32 opc_val[] = {
|
static const int32 opc_val[] = {
|
||||||
0000000+I_NPN, 0000005+I_NPN, 0000007+I_NPN,
|
0000000+I_NPN, 0000005+I_NPN, 0000007+I_NPN,
|
||||||
0000011+I_NPN, 0000013+I_NPN, 0000021+I_NPN,
|
0000011+I_NPN, 0000013+I_NPN, 0000021+I_NPN,
|
||||||
|
@ -179,7 +192,7 @@ static const int32 opc_val[] = {
|
||||||
0141044+I_NPN, 0141050+I_NPN, 0141140+I_NPN,
|
0141044+I_NPN, 0141050+I_NPN, 0141140+I_NPN,
|
||||||
0141206+I_NPN, 0141216+I_NPN, 0141240+I_NPN, 0141340+I_NPN,
|
0141206+I_NPN, 0141216+I_NPN, 0141240+I_NPN, 0141340+I_NPN,
|
||||||
0101000+I_NPN, 0100000+I_NPN, 0100036+I_NPN, 0101036+I_NPN,
|
0101000+I_NPN, 0100000+I_NPN, 0100036+I_NPN, 0101036+I_NPN,
|
||||||
0002000+I_MRF, 0102000+I_MRF,
|
0171020+I_NPN, 0002000+I_MRF, 0102000+I_MRF,
|
||||||
0004000+I_MRF, 0104000+I_MRF, 0006000+I_MRF, 0106000+I_MRF,
|
0004000+I_MRF, 0104000+I_MRF, 0006000+I_MRF, 0106000+I_MRF,
|
||||||
0010000+I_MRF, 0110000+I_MRF, 0012000+I_MRF, 0112000+I_MRF,
|
0010000+I_MRF, 0110000+I_MRF, 0012000+I_MRF, 0112000+I_MRF,
|
||||||
0014000+I_MRF, 0114000+I_MRF, 0016000+I_MRF, 0116000+I_MRF,
|
0014000+I_MRF, 0114000+I_MRF, 0016000+I_MRF, 0116000+I_MRF,
|
||||||
|
@ -251,7 +264,7 @@ return;
|
||||||
t_stat fprint_sym (FILE *of, t_addr addr, t_value *val,
|
t_stat fprint_sym (FILE *of, t_addr addr, t_value *val,
|
||||||
UNIT *uptr, int32 sw)
|
UNIT *uptr, int32 sw)
|
||||||
{
|
{
|
||||||
int32 cflag, i, j, inst, disp;
|
int32 cflag, i, j, inst, fnc, disp;
|
||||||
|
|
||||||
cflag = (uptr == NULL) || (uptr == &cpu_unit);
|
cflag = (uptr == NULL) || (uptr == &cpu_unit);
|
||||||
inst = val[0];
|
inst = val[0];
|
||||||
|
@ -295,8 +308,11 @@ for (i = 0; opc_val[i] >= 0; i++) { /* loop thru ops */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case I_V_IOT: /* I/O */
|
case I_V_IOT: /* I/O */
|
||||||
disp = inst & 01777; /* pulse+dev */
|
fnc = I_GETFNC (inst); /* get func */
|
||||||
fprintf (of, "%s %o", opcode[i], disp);
|
disp = inst & DEVMASK; /* get dev */
|
||||||
|
if (ioname[disp] != NULL)
|
||||||
|
fprintf (of, "%s %o,%s", opcode[i], fnc, ioname[disp]);
|
||||||
|
else fprintf (of, "%s %o,%o", opcode[i], fnc, disp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case I_V_SHF: /* shift */
|
case I_V_SHF: /* shift */
|
||||||
|
@ -364,11 +380,29 @@ switch (j) { /* case on class */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case I_V_IOT: /* IOT */
|
case I_V_IOT: /* IOT */
|
||||||
cptr = get_glyph (cptr, gbuf, 0); /* get pulse+dev */
|
cptr = get_glyph (cptr, gbuf, ','); /* get field */
|
||||||
d = get_uint (gbuf, 8, 01777, &r);
|
if (*cptr == 0) { /* single field? */
|
||||||
|
d = get_uint (gbuf, 8, 01777, &r); /* pulse+dev */
|
||||||
if (r != SCPE_OK)
|
if (r != SCPE_OK)
|
||||||
return SCPE_ARG;
|
return SCPE_ARG;
|
||||||
val[0] = val[0] | d;
|
val[0] = val[0] | d;
|
||||||
|
}
|
||||||
|
else { /* multiple fields */
|
||||||
|
d = get_uint (gbuf, 8, 017, &r); /* get pulse */
|
||||||
|
if (r != SCPE_OK)
|
||||||
|
return SCPE_ARG;
|
||||||
|
cptr = get_glyph (cptr, gbuf, 0); /* get dev name */
|
||||||
|
for (k = 0; k < DEV_MAX; k++) { /* sch for name */
|
||||||
|
if ((ioname[k] != NULL) && (strcmp (gbuf, ioname[k]) == 0))
|
||||||
|
break; /* match? */
|
||||||
|
}
|
||||||
|
if (k >= DEV_MAX) { /* no match */
|
||||||
|
k = get_uint (gbuf, 8, DEV_MAX - 1, &r);/* integer */
|
||||||
|
if (r != SCPE_OK)
|
||||||
|
return SCPE_ARG;
|
||||||
|
}
|
||||||
|
val[0] = val[0] | (d << I_V_FNC) | k;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case I_V_SHF: /* shift */
|
case I_V_SHF: /* shift */
|
||||||
|
|
Loading…
Add table
Reference in a new issue