HP2100: Latest updates: 64-bit clean compiles and revised BOOT support from Dave Bryan
265. PROBLEM: Compiling the HP simulator for 64-bit addressing produces many conversion warnings. OBSERVATION: Compiling the simulator and defining USE_INT64 and USE_ADDR64 with implicit conversion warnings enabled reveals a number of places where assumptions were made that addresses would always be 32 bits. This is a reasonable assumption, as there are no devices (CPU or peripherals) that can handle gigabyte addressing. Still, many of these assumptions are not necessary, and some future peripheral simulator may exceed this limit. CAUSE: Future expansion to 64-bit addressing was not envisioned. RESOLUTION: Modify source files to ensure that "t_addr" and "t_value" types are used instead of "uint32" and "int32" types where addressing and data values may be 64 bits. Also ensure that valid conversions to smaller sizes use explicit casts. 266. PROBLEM: BOOT devices require a duplicate S-register declaration. OBSERVATION: All of the peripheral devices that support the BOOT command set the select code and other parameters into the S register during the boot process. This direct register access requires an external declaration that duplicates the one in the full CPU declarations file (hp2100_cpu.h). A better method that avoids the duplicate declaration would be for the "ibl_copy" routine to modify the S register on behalf of the caller. CAUSE: Poor original implementation. RESOLUTION: Modify "ibl_copy" (hp2100_cpu.c) to take two additional parameters that clear and set bits, respectively, in the S register on behalf of the caller. Modify the boot routines for the CPU, DA, DP, DQ, DR, DS, IPL, MS, and PTR devices to use the new parameters instead of modifying the S register directly.
This commit is contained in:
parent
f8501c2ec2
commit
ecbb20f1a9
30 changed files with 454 additions and 332 deletions
|
@ -1,6 +1,6 @@
|
||||||
/* hp2100_baci.c: HP 12966A buffered asynchronous communications interface simulator
|
/* hp2100_baci.c: HP 12966A buffered asynchronous communications interface simulator
|
||||||
|
|
||||||
Copyright (c) 2007-2013, J. David Bryan
|
Copyright (c) 2007-2014, J. David Bryan
|
||||||
|
|
||||||
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,6 +25,7 @@
|
||||||
|
|
||||||
BACI 12966A BACI card
|
BACI 12966A BACI card
|
||||||
|
|
||||||
|
24-Dec-14 JDB Added casts for explicit downward conversions
|
||||||
10-Jan-13 MP Added DEV_MUX and additional DEVICE field values
|
10-Jan-13 MP Added DEV_MUX and additional DEVICE field values
|
||||||
10-Feb-12 JDB Deprecated DEVNO in favor of SC
|
10-Feb-12 JDB Deprecated DEVNO in favor of SC
|
||||||
Removed DEV_NET to allow restoration of listening port
|
Removed DEV_NET to allow restoration of listening port
|
||||||
|
@ -366,7 +367,7 @@ static int32 service_time (uint32 control_word);
|
||||||
static void update_status (void);
|
static void update_status (void);
|
||||||
static void master_reset (void);
|
static void master_reset (void);
|
||||||
|
|
||||||
static uint32 fifo_get (void);
|
static uint16 fifo_get (void);
|
||||||
static void fifo_put (uint8 ch);
|
static void fifo_put (uint8 ch);
|
||||||
static void clock_uart (void);
|
static void clock_uart (void);
|
||||||
|
|
||||||
|
@ -871,7 +872,8 @@ while (xmit_loop && (baci_uart_thr & IN_VALID)) { /* valid character in UA
|
||||||
if ((status == SCPE_OK) && /* transmitted OK? */
|
if ((status == SCPE_OK) && /* transmitted OK? */
|
||||||
DEBUG_PRI (baci_dev, DEB_XFER))
|
DEBUG_PRI (baci_dev, DEB_XFER))
|
||||||
fprintf (sim_deb, ">>BACI xfer: Character %s "
|
fprintf (sim_deb, ">>BACI xfer: Character %s "
|
||||||
"transmitted from UART\n", fmt_char (baci_uart_tr));
|
"transmitted from UART\n",
|
||||||
|
fmt_char ((uint8) baci_uart_tr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -915,8 +917,11 @@ if (recv_loop && /* ok to process? */
|
||||||
|
|
||||||
/* Reception */
|
/* Reception */
|
||||||
|
|
||||||
while (recv_loop && /* OK to process? */
|
while (recv_loop) { /* OK to process? */
|
||||||
(baci_uart_rr = tmxr_getc_ln (&baci_ldsc))) { /* and new character available? */
|
baci_uart_rr = tmxr_getc_ln (&baci_ldsc); /* get a new character */
|
||||||
|
|
||||||
|
if (baci_uart_rr == 0) /* if there are no more characters available */
|
||||||
|
break; /* then quit the reception loop */
|
||||||
|
|
||||||
if (baci_uart_rr & SCPE_BREAK) { /* break detected? */
|
if (baci_uart_rr & SCPE_BREAK) { /* break detected? */
|
||||||
baci_status = baci_status | IN_BREAK; /* set break status */
|
baci_status = baci_status | IN_BREAK; /* set break status */
|
||||||
|
@ -927,7 +932,7 @@ while (recv_loop && /* OK to process? */
|
||||||
|
|
||||||
data_bits = 5 + (baci_cfcw & OUT_CHARSIZE); /* calculate number of data bits */
|
data_bits = 5 + (baci_cfcw & OUT_CHARSIZE); /* calculate number of data bits */
|
||||||
data_mask = (1 << data_bits) - 1; /* generate mask for data bits */
|
data_mask = (1 << data_bits) - 1; /* generate mask for data bits */
|
||||||
baci_uart_rhr = baci_uart_rr & data_mask; /* mask data into holding register */
|
baci_uart_rhr = (uint16) (baci_uart_rr & data_mask); /* mask data into holding register */
|
||||||
baci_uart_rr = CLEAR_R; /* clear receiver register */
|
baci_uart_rr = CLEAR_R; /* clear receiver register */
|
||||||
|
|
||||||
if (DEBUG_PRI (baci_dev, DEB_XFER))
|
if (DEBUG_PRI (baci_dev, DEB_XFER))
|
||||||
|
@ -935,7 +940,7 @@ while (recv_loop && /* OK to process? */
|
||||||
fmt_char ((uint8) baci_uart_rhr));
|
fmt_char ((uint8) baci_uart_rhr));
|
||||||
|
|
||||||
if (baci_term.flags & UNIT_CAPSLOCK) /* caps lock mode? */
|
if (baci_term.flags & UNIT_CAPSLOCK) /* caps lock mode? */
|
||||||
baci_uart_rhr = toupper (baci_uart_rhr); /* convert to upper case if lower */
|
baci_uart_rhr = (uint16) toupper (baci_uart_rhr); /* convert to upper case if lower */
|
||||||
|
|
||||||
if (baci_cfcw & OUT_ECHO) /* echo wanted? */
|
if (baci_cfcw & OUT_ECHO) /* echo wanted? */
|
||||||
tmxr_putc_ln (&baci_ldsc, baci_uart_rhr); /* send it back */
|
tmxr_putc_ln (&baci_ldsc, baci_uart_rhr); /* send it back */
|
||||||
|
@ -1319,9 +1324,9 @@ return ticks [GET_BAUDRATE (control_word)]; /* return service time f
|
||||||
not 0.
|
not 0.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static uint32 fifo_get (void)
|
static uint16 fifo_get (void)
|
||||||
{
|
{
|
||||||
uint32 data;
|
uint16 data;
|
||||||
|
|
||||||
data = baci_fifo [baci_fget]; /* get character */
|
data = baci_fifo [baci_fget]; /* get character */
|
||||||
|
|
||||||
|
@ -1331,7 +1336,8 @@ if ((baci_fget != baci_fput) || (baci_fcount >= 128)) { /* FIFO occupied? */
|
||||||
|
|
||||||
if (DEBUG_PRI (baci_dev, DEB_BUF))
|
if (DEBUG_PRI (baci_dev, DEB_BUF))
|
||||||
fprintf (sim_deb, ">>BACI buf: Character %s get from FIFO [%d], "
|
fprintf (sim_deb, ">>BACI buf: Character %s get from FIFO [%d], "
|
||||||
"character counter = %d\n", fmt_char (data), baci_fget, baci_fcount);
|
"character counter = %d\n",
|
||||||
|
fmt_char ((uint8) data), baci_fget, baci_fcount);
|
||||||
|
|
||||||
baci_fget = (baci_fget + 1) % FIFO_SIZE; /* bump index modulo array size */
|
baci_fget = (baci_fget + 1) % FIFO_SIZE; /* bump index modulo array size */
|
||||||
|
|
||||||
|
@ -1502,14 +1508,15 @@ if (baci_uart_clk > 0) { /* transfer in progress?
|
||||||
((baci_cfcw & OUT_PARITY) != 0) + /* plus parity bit if used */
|
((baci_cfcw & OUT_PARITY) != 0) + /* plus parity bit if used */
|
||||||
((baci_cfcw & OUT_STBITS) != 0); /* plus extra stop bit if used */
|
((baci_cfcw & OUT_STBITS) != 0); /* plus extra stop bit if used */
|
||||||
|
|
||||||
baci_uart_rhr = baci_uart_rr >> (16 - uart_bits); /* position data to right align */
|
baci_uart_rhr = (uint16) (baci_uart_rr >> (16 - uart_bits)); /* position data to right align */
|
||||||
baci_uart_rr = CLEAR_R; /* clear receiver register */
|
baci_uart_rr = CLEAR_R; /* clear receiver register */
|
||||||
|
|
||||||
if (DEBUG_PRI (baci_dev, DEB_XFER))
|
if (DEBUG_PRI (baci_dev, DEB_XFER))
|
||||||
fprintf (sim_deb, ">>BACI xfer: UART receiver = %06o (%s)\n",
|
fprintf (sim_deb, ">>BACI xfer: UART receiver = %06o (%s)\n",
|
||||||
baci_uart_rhr, fmt_char (baci_uart_rhr & data_mask));
|
baci_uart_rhr,
|
||||||
|
fmt_char ((uint8) (baci_uart_rhr & data_mask)));
|
||||||
|
|
||||||
fifo_put (baci_uart_rhr & data_mask); /* put data in FIFO */
|
fifo_put ((uint8) (baci_uart_rhr & data_mask)); /* put data in FIFO */
|
||||||
update_status (); /* update FIFO status */
|
update_status (); /* update FIFO status */
|
||||||
|
|
||||||
if (baci_cfcw & OUT_PARITY) { /* parity present? */
|
if (baci_cfcw & OUT_PARITY) { /* parity present? */
|
||||||
|
@ -1568,7 +1575,8 @@ if ((baci_uart_clk == 0) && /* start of transfer? */
|
||||||
if (DEBUG_PRI (baci_dev, DEB_XFER))
|
if (DEBUG_PRI (baci_dev, DEB_XFER))
|
||||||
fprintf (sim_deb, ">>BACI xfer: UART transmitter = %06o (%s), "
|
fprintf (sim_deb, ">>BACI xfer: UART transmitter = %06o (%s), "
|
||||||
"clock count = %d\n", baci_uart_tr & DMASK,
|
"clock count = %d\n", baci_uart_tr & DMASK,
|
||||||
fmt_char (baci_uart_thr & data_mask), baci_uart_clk);
|
fmt_char ((uint8) (baci_uart_thr & data_mask)),
|
||||||
|
baci_uart_clk);
|
||||||
}
|
}
|
||||||
|
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
HP 2100 SIMULATOR BUG FIX WRITEUPS
|
HP 2100 SIMULATOR BUG FIX WRITEUPS
|
||||||
==================================
|
==================================
|
||||||
Last update: 2014-12-19
|
Last update: 2015-01-03
|
||||||
|
|
||||||
|
|
||||||
1. PROBLEM: Booting from magnetic tape reports "HALT instruction, P: 77756
|
1. PROBLEM: Booting from magnetic tape reports "HALT instruction, P: 77756
|
||||||
|
@ -6743,3 +6743,49 @@
|
||||||
indications that they are being called in the context of a simulator stop.
|
indications that they are being called in the context of a simulator stop.
|
||||||
|
|
||||||
STATUS: Fixed in version 4.0-0.
|
STATUS: Fixed in version 4.0-0.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
265. PROBLEM: Compiling the HP simulator for 64-bit addressing produces many
|
||||||
|
conversion warnings.
|
||||||
|
|
||||||
|
VERSION: 3.9-0
|
||||||
|
|
||||||
|
OBSERVATION: Compiling the simulator and defining USE_INT64 and USE_ADDR64
|
||||||
|
with implicit conversion warnings enabled reveals a number of places where
|
||||||
|
assumptions were made that addresses would always be 32 bits. This is a
|
||||||
|
reasonable assumption, as there are no devices (CPU or peripherals) that
|
||||||
|
can handle gigabyte addressing. Still, many of these assumptions are not
|
||||||
|
necessary, and some future peripheral simulator may exceed this limit.
|
||||||
|
|
||||||
|
CAUSE: Future expansion to 64-bit addressing was not envisioned.
|
||||||
|
|
||||||
|
RESOLUTION: Modify source files to ensure that "t_addr" and "t_value"
|
||||||
|
types are used instead of "uint32" and "int32" types where addressing and
|
||||||
|
data values may be 64 bits. Also ensure that valid conversions to smaller
|
||||||
|
sizes use explicit casts.
|
||||||
|
|
||||||
|
STATUS: Fixed in version 4.0-0.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
266. PROBLEM: BOOT devices require a duplicate S-register declaration.
|
||||||
|
|
||||||
|
VERSION: 3.9-0
|
||||||
|
|
||||||
|
OBSERVATION: All of the peripheral devices that support the BOOT command
|
||||||
|
set the select code and other parameters into the S register during the
|
||||||
|
boot process. This direct register access requires an external declaration
|
||||||
|
that duplicates the one in the full CPU declarations file (hp2100_cpu.h).
|
||||||
|
A better method that avoids the duplicate declaration would be for the
|
||||||
|
"ibl_copy" routine to modify the S register on behalf of the caller.
|
||||||
|
|
||||||
|
CAUSE: Poor original implementation.
|
||||||
|
|
||||||
|
RESOLUTION: Modify "ibl_copy" (hp2100_cpu.c) to take two additional
|
||||||
|
parameters that clear and set bits, respectively, in the S register on
|
||||||
|
behalf of the caller. Modify the boot routines for the CPU, DA, DP, DQ,
|
||||||
|
DR, DS, IPL, MS, and PTR devices to use the new parameters instead of
|
||||||
|
modifying the S register directly.
|
||||||
|
|
||||||
|
STATUS: Fixed in version 4.0-0.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* hp2100_cpu.c: HP 21xx/1000 CPU simulator
|
/* hp2100_cpu.c: HP 21xx/1000 CPU simulator
|
||||||
|
|
||||||
Copyright (c) 1993-2013, Robert M. Supnik
|
Copyright (c) 1993-2014, 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"),
|
||||||
|
@ -29,6 +29,9 @@
|
||||||
DMA1,DMA2 12607B/12578A/12895A direct memory access controller
|
DMA1,DMA2 12607B/12578A/12895A direct memory access controller
|
||||||
DCPC1,DCPC2 12897B dual channel port controller
|
DCPC1,DCPC2 12897B dual channel port controller
|
||||||
|
|
||||||
|
31-Dec-14 JDB Corrected devdisp data parameters
|
||||||
|
30-Dec-14 JDB Added S-register parameters to ibl_copy
|
||||||
|
24-Dec-14 JDB Added casts for explicit downward conversions
|
||||||
18-Mar-13 JDB Removed redundant extern declarations
|
18-Mar-13 JDB Removed redundant extern declarations
|
||||||
05-Feb-13 JDB HLT instruction handler now relies on sim_vm_fprint_stopped
|
05-Feb-13 JDB HLT instruction handler now relies on sim_vm_fprint_stopped
|
||||||
09-May-12 JDB Separated assignments from conditional expressions
|
09-May-12 JDB Separated assignments from conditional expressions
|
||||||
|
@ -1697,7 +1700,7 @@ while (reason == SCPE_OK) { /* loop until halted */
|
||||||
skip = 1;
|
skip = 1;
|
||||||
} /* end if ~RSS */
|
} /* end if ~RSS */
|
||||||
|
|
||||||
ABREG[absel] = t; /* store result */
|
ABREG[absel] = (uint16) t; /* store result */
|
||||||
PC = (PC + skip) & VAMASK; /* add in skip */
|
PC = (PC + skip) & VAMASK; /* add in skip */
|
||||||
break; /* end if alter/skip */
|
break; /* end if alter/skip */
|
||||||
|
|
||||||
|
@ -1713,7 +1716,7 @@ while (reason == SCPE_OK) { /* loop until halted */
|
||||||
if ((IR & 000010) && ((t & 1) == 0)) /* SLx */
|
if ((IR & 000010) && ((t & 1) == 0)) /* SLx */
|
||||||
PC = (PC + 1) & VAMASK;
|
PC = (PC + 1) & VAMASK;
|
||||||
|
|
||||||
ABREG[absel] = shift (t, IR & 00020, IR); /* do second shift */
|
ABREG[absel] = (uint16) shift (t, IR & 00020, IR); /* do second shift */
|
||||||
break; /* end if shift */
|
break; /* end if shift */
|
||||||
|
|
||||||
/* I/O instructions */
|
/* I/O instructions */
|
||||||
|
@ -1971,7 +1974,7 @@ if ((sop == soFLG) && clf) /* CLF instruction? */
|
||||||
else if (clf) /* CLF with another instruction? */
|
else if (clf) /* CLF with another instruction? */
|
||||||
signal_set = signal_set | ioCLF; /* add CLF signal */
|
signal_set = signal_set | ioCLF; /* add CLF signal */
|
||||||
|
|
||||||
ioreturn = devdisp (dev, signal_set, IORETURN (SCPE_OK, iodata)); /* dispatch I/O signal */
|
ioreturn = devdisp (dev, signal_set, iodata); /* dispatch I/O signal */
|
||||||
|
|
||||||
iostat = IOSTATUS (ioreturn); /* extract status */
|
iostat = IOSTATUS (ioreturn); /* extract status */
|
||||||
iodata = IODATA (ioreturn); /* extract return data value */
|
iodata = IODATA (ioreturn); /* extract return data value */
|
||||||
|
@ -2494,13 +2497,13 @@ return (MAP_GETPAG (mpr) | VA_GETOFF (va)); /* return mapped address
|
||||||
used for restoration.
|
used for restoration.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static uint32 dms_cons (uint32 va, int32 sw)
|
static uint32 dms_cons (t_addr va, int32 sw)
|
||||||
{
|
{
|
||||||
uint32 map_sel;
|
uint32 map_sel;
|
||||||
|
|
||||||
if ((dms_enb == 0) || /* DMS off? */
|
if ((dms_enb == 0) || /* DMS off? */
|
||||||
(sw & (SWMASK ('N') | SIM_SW_REST))) /* no mapping rqst or save/rest? */
|
(sw & (SWMASK ('N') | SIM_SW_REST))) /* no mapping rqst or save/rest? */
|
||||||
return va; /* use physical address */
|
return (uint32) va; /* use physical address */
|
||||||
|
|
||||||
else if (sw & SWMASK ('S'))
|
else if (sw & SWMASK ('S'))
|
||||||
map_sel = SMAP;
|
map_sel = SMAP;
|
||||||
|
@ -2518,13 +2521,13 @@ else /* dflt to log addr, cur
|
||||||
map_sel = dms_ump;
|
map_sel = dms_ump;
|
||||||
|
|
||||||
if (va >= VASIZE) /* virtual, must be 15b */
|
if (va >= VASIZE) /* virtual, must be 15b */
|
||||||
return MEMSIZE;
|
return (uint32) MEMSIZE;
|
||||||
|
|
||||||
else if (dms_enb) /* DMS on? go thru map */
|
else if (dms_enb) /* DMS on? go thru map */
|
||||||
return dms (va, map_sel, NOPROT);
|
return dms ((uint32) va, map_sel, NOPROT);
|
||||||
|
|
||||||
else /* else return virtual */
|
else /* else return virtual */
|
||||||
return va;
|
return (uint32) va;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2754,7 +2757,7 @@ while (working_set) {
|
||||||
E = 1; /* set E register */
|
E = 1; /* set E register */
|
||||||
|
|
||||||
if (UNIT_CPU_FAMILY == UNIT_FAMILY_1000) { /* 1000 series? */
|
if (UNIT_CPU_FAMILY == UNIT_FAMILY_1000) { /* 1000 series? */
|
||||||
memset (M, 0, MEMSIZE * 2); /* zero allocated memory */
|
memset (M, 0, (uint32) MEMSIZE * 2); /* zero allocated memory */
|
||||||
MR = 0077777; /* set M register */
|
MR = 0077777; /* set M register */
|
||||||
PC = 0100000; /* set P register */
|
PC = 0100000; /* set P register */
|
||||||
}
|
}
|
||||||
|
@ -3081,7 +3084,7 @@ while (working_set) {
|
||||||
else if (UNIT_CPU_TYPE == UNIT_TYPE_211X) /* 2115/2116? */
|
else if (UNIT_CPU_TYPE == UNIT_TYPE_211X) /* 2115/2116? */
|
||||||
data = dma [ch].cw3 & 0037777; /* only 14-bit count */
|
data = dma [ch].cw3 & 0037777; /* only 14-bit count */
|
||||||
else /* other models */
|
else /* other models */
|
||||||
data = dma [ch].cw3; /* rest use full value */
|
data = (uint16) dma [ch].cw3; /* rest use full value */
|
||||||
|
|
||||||
stat_data = IORETURN (SCPE_OK, data); /* merge status and remaining word count */
|
stat_data = IORETURN (SCPE_OK, data); /* merge status and remaining word count */
|
||||||
break;
|
break;
|
||||||
|
@ -3364,8 +3367,7 @@ else { /* last cycle */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (input) { /* input cycle? */
|
if (input) { /* input cycle? */
|
||||||
ioresult = devdisp (dev, signals, /* do I/O input */
|
ioresult = devdisp (dev, signals, 0); /* do I/O input */
|
||||||
IORETURN (SCPE_OK, 0));
|
|
||||||
|
|
||||||
status = IOSTATUS (ioresult); /* get cycle status */
|
status = IOSTATUS (ioresult); /* get cycle status */
|
||||||
|
|
||||||
|
@ -3374,8 +3376,8 @@ if (input) { /* input cycle? */
|
||||||
|
|
||||||
if (bytes) { /* byte packing? */
|
if (bytes) { /* byte packing? */
|
||||||
if (even) { /* second byte? */
|
if (even) { /* second byte? */
|
||||||
data = (dma [ch].packer << 8) | /* merge stored byte */
|
data = (uint16) (dma [ch].packer << 8) /* merge stored byte */
|
||||||
(data & DMASK8);
|
| (data & DMASK8);
|
||||||
WriteIO (MA, data, map); /* store word data */
|
WriteIO (MA, data, map); /* store word data */
|
||||||
}
|
}
|
||||||
else /* first byte */
|
else /* first byte */
|
||||||
|
@ -3403,8 +3405,7 @@ else { /* output cycle */
|
||||||
else /* no byte packing */
|
else /* no byte packing */
|
||||||
data = ReadIO (MA, map); /* read word data */
|
data = ReadIO (MA, map); /* read word data */
|
||||||
|
|
||||||
ioresult = devdisp (dev, signals, /* do I/O output */
|
ioresult = devdisp (dev, signals, data); /* do I/O output */
|
||||||
IORETURN (SCPE_OK, data));
|
|
||||||
|
|
||||||
status = IOSTATUS (ioresult); /* get cycle status */
|
status = IOSTATUS (ioresult); /* get cycle status */
|
||||||
}
|
}
|
||||||
|
@ -3670,7 +3671,7 @@ t_stat cpu_set_size (UNIT *uptr, int32 new_size, char *cptr, void *desc)
|
||||||
int32 mc = 0;
|
int32 mc = 0;
|
||||||
uint32 i;
|
uint32 i;
|
||||||
uint32 model = CPU_MODEL_INDEX; /* current CPU model index */
|
uint32 model = CPU_MODEL_INDEX; /* current CPU model index */
|
||||||
uint32 old_size = MEMSIZE; /* current memory size */
|
uint32 old_size = (uint32) MEMSIZE; /* current memory size */
|
||||||
|
|
||||||
if ((uint32) new_size > cpu_features[model].maxmem)
|
if ((uint32) new_size > cpu_features[model].maxmem)
|
||||||
return SCPE_NOFNC; /* mem size unsupported */
|
return SCPE_NOFNC; /* mem size unsupported */
|
||||||
|
@ -3689,10 +3690,10 @@ if (!(sim_switches & SWMASK ('F'))) { /* force truncation? */
|
||||||
if (UNIT_CPU_FAMILY == UNIT_FAMILY_21XX) { /* 21xx CPU? */
|
if (UNIT_CPU_FAMILY == UNIT_FAMILY_21XX) { /* 21xx CPU? */
|
||||||
cpu_set_ldr (uptr, FALSE, NULL, NULL); /* save loader to shadow RAM */
|
cpu_set_ldr (uptr, FALSE, NULL, NULL); /* save loader to shadow RAM */
|
||||||
MEMSIZE = new_size; /* set new memory size */
|
MEMSIZE = new_size; /* set new memory size */
|
||||||
fwanxm = MEMSIZE - IBL_LNT; /* reserve memory for loader */
|
fwanxm = (uint32) MEMSIZE - IBL_LNT; /* reserve memory for loader */
|
||||||
}
|
}
|
||||||
else /* loader unsupported */
|
else /* loader unsupported */
|
||||||
fwanxm = MEMSIZE = new_size; /* set new memory size */
|
MEMSIZE = fwanxm = new_size; /* set new memory size */
|
||||||
|
|
||||||
for (i = fwanxm; i < old_size; i++) /* zero non-existent memory */
|
for (i = fwanxm; i < old_size; i++) /* zero non-existent memory */
|
||||||
M[i] = 0;
|
M[i] = 0;
|
||||||
|
@ -3779,15 +3780,15 @@ if ((MEMSIZE == 0) || /* current mem size not
|
||||||
(MEMSIZE > cpu_features[new_index].maxmem)) /* current mem size too large? */
|
(MEMSIZE > cpu_features[new_index].maxmem)) /* current mem size too large? */
|
||||||
new_memsize = cpu_features[new_index].maxmem; /* set it to max supported */
|
new_memsize = cpu_features[new_index].maxmem; /* set it to max supported */
|
||||||
else
|
else
|
||||||
new_memsize = MEMSIZE; /* or leave it unchanged */
|
new_memsize = (uint32) MEMSIZE; /* or leave it unchanged */
|
||||||
|
|
||||||
result = cpu_set_size (uptr, new_memsize, NULL, NULL); /* set memory size */
|
result = cpu_set_size (uptr, new_memsize, NULL, NULL); /* set memory size */
|
||||||
|
|
||||||
if (result == SCPE_OK) /* memory change OK? */
|
if (result == SCPE_OK) /* memory change OK? */
|
||||||
if (new_family == UNIT_FAMILY_21XX) /* 21xx CPU? */
|
if (new_family == UNIT_FAMILY_21XX) /* 21xx CPU? */
|
||||||
fwanxm = MEMSIZE - IBL_LNT; /* reserve memory for loader */
|
fwanxm = (uint32) MEMSIZE - IBL_LNT; /* reserve memory for loader */
|
||||||
else
|
else
|
||||||
fwanxm = MEMSIZE; /* loader reserved only for 21xx */
|
fwanxm = (uint32) MEMSIZE; /* loader reserved only for 21xx */
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -3914,7 +3915,7 @@ if ((UNIT_CPU_FAMILY != UNIT_FAMILY_21XX) || /* valid only for 21xx *
|
||||||
return SCPE_NOFNC;
|
return SCPE_NOFNC;
|
||||||
|
|
||||||
if (is_enabled && (enable == 0)) { /* disable loader? */
|
if (is_enabled && (enable == 0)) { /* disable loader? */
|
||||||
fwanxm = MEMSIZE - IBL_LNT; /* decrease available memory */
|
fwanxm = (uint32) MEMSIZE - IBL_LNT; /* decrease available memory */
|
||||||
for (i = 0; i < IBL_LNT; i++) { /* copy loader */
|
for (i = 0; i < IBL_LNT; i++) { /* copy loader */
|
||||||
loader[i] = M[fwanxm + i]; /* from memory */
|
loader[i] = M[fwanxm + i]; /* from memory */
|
||||||
M[fwanxm + i] = 0; /* and zero location */
|
M[fwanxm + i] = 0; /* and zero location */
|
||||||
|
@ -3924,7 +3925,7 @@ if (is_enabled && (enable == 0)) { /* disable loader? */
|
||||||
else if ((!is_enabled) && (enable == 1)) { /* enable loader? */
|
else if ((!is_enabled) && (enable == 1)) { /* enable loader? */
|
||||||
for (i = 0; i < IBL_LNT; i++) /* copy loader */
|
for (i = 0; i < IBL_LNT; i++) /* copy loader */
|
||||||
M[fwanxm + i] = loader[i]; /* to memory */
|
M[fwanxm + i] = loader[i]; /* to memory */
|
||||||
fwanxm = MEMSIZE; /* increase available memory */
|
fwanxm = (uint32) MEMSIZE; /* increase available memory */
|
||||||
}
|
}
|
||||||
|
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
|
@ -3963,19 +3964,19 @@ if (dev < 010)
|
||||||
switch (sel) {
|
switch (sel) {
|
||||||
|
|
||||||
case 0: /* PTR boot */
|
case 0: /* PTR boot */
|
||||||
ibl_copy (ptr_rom, dev);
|
ibl_copy (ptr_rom, dev, IBL_S_NOCLR, IBL_S_NOSET);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1: /* DP/DQ boot */
|
case 1: /* DP/DQ boot */
|
||||||
ibl_copy (dq_rom, dev);
|
ibl_copy (dq_rom, dev, IBL_S_NOCLR, IBL_S_NOSET);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2: /* MS boot */
|
case 2: /* MS boot */
|
||||||
ibl_copy (ms_rom, dev);
|
ibl_copy (ms_rom, dev, IBL_S_NOCLR, IBL_S_NOSET);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3: /* DS boot */
|
case 3: /* DS boot */
|
||||||
ibl_copy (ds_rom, dev);
|
ibl_copy (ds_rom, dev, IBL_S_NOCLR, IBL_S_NOSET);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3988,14 +3989,14 @@ return SCPE_OK;
|
||||||
- Use memory size to set the initial PC and base of the boot area
|
- Use memory size to set the initial PC and base of the boot area
|
||||||
- Copy boot ROM to memory, updating I/O instructions
|
- Copy boot ROM to memory, updating I/O instructions
|
||||||
- Place 2s complement of boot base in last location
|
- Place 2s complement of boot base in last location
|
||||||
|
- Modify S register as indicated
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
- SR settings are done by the caller
|
|
||||||
- Boot ROMs must be assembled with a device code of 10 (10 and 11 for
|
- Boot ROMs must be assembled with a device code of 10 (10 and 11 for
|
||||||
devices requiring two codes)
|
devices requiring two codes)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
t_stat ibl_copy (const BOOT_ROM rom, int32 dev)
|
t_stat ibl_copy (const BOOT_ROM rom, int32 dev, uint32 sr_clear, uint32 sr_set)
|
||||||
{
|
{
|
||||||
int32 i;
|
int32 i;
|
||||||
uint16 wd;
|
uint16 wd;
|
||||||
|
@ -4021,5 +4022,8 @@ for (i = 0; i < IBL_LNT; i++) { /* copy bootstrap */
|
||||||
|
|
||||||
M[PC + IBL_DPC] = (M[PC + IBL_DPC] + (dev - 010)) & DMASK; /* patch DMA ctrl */
|
M[PC + IBL_DPC] = (M[PC + IBL_DPC] + (dev - 010)) & DMASK; /* patch DMA ctrl */
|
||||||
M[PC + IBL_END] = (~PC + 1) & DMASK; /* fill in start of boot */
|
M[PC + IBL_END] = (~PC + 1) & DMASK; /* fill in start of boot */
|
||||||
|
|
||||||
|
SR = (SR & sr_clear) | sr_set; /* modify the S register as indicated */
|
||||||
|
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* hp2100_cpu.h: HP 2100 CPU definitions
|
/* hp2100_cpu.h: HP 2100 CPU definitions
|
||||||
|
|
||||||
Copyright (c) 2005-2013, Robert M. Supnik
|
Copyright (c) 2005-2014, 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,7 @@
|
||||||
be used in advertising or otherwise to promote the sale, use or other dealings
|
be 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.
|
||||||
|
|
||||||
|
24-Dec-14 JDB Added casts for explicit downward conversions
|
||||||
18-Mar-13 JDB Added declarations for the MP abort handler and CPU registers
|
18-Mar-13 JDB Added declarations for the MP abort handler and CPU registers
|
||||||
14-Mar-13 MP Changed guard macro name to avoid reserved namespace
|
14-Mar-13 MP Changed guard macro name to avoid reserved namespace
|
||||||
03-Jan-10 RMS Changed declarations of mp_control, mp_mefvv, for VMS compiler
|
03-Jan-10 RMS Changed declarations of mp_control, mp_mefvv, for VMS compiler
|
||||||
|
@ -177,7 +178,7 @@
|
||||||
|
|
||||||
#define PCQ_SIZE 64 /* must be 2**n */
|
#define PCQ_SIZE 64 /* must be 2**n */
|
||||||
#define PCQ_MASK (PCQ_SIZE - 1)
|
#define PCQ_MASK (PCQ_SIZE - 1)
|
||||||
#define PCQ_ENTRY pcq[pcq_p = (pcq_p - 1) & PCQ_MASK] = err_PC
|
#define PCQ_ENTRY pcq[pcq_p = (pcq_p - 1) & PCQ_MASK] = (uint16) err_PC
|
||||||
|
|
||||||
/* Memory reference instructions */
|
/* Memory reference instructions */
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
|
|
||||||
CPU1 Extended arithmetic and optional microcode dispatchers
|
CPU1 Extended arithmetic and optional microcode dispatchers
|
||||||
|
|
||||||
|
24-Dec-14 JDB Added casts for explicit downward conversions
|
||||||
05-Apr-14 JDB Corrected typo in comments for cpu_ops
|
05-Apr-14 JDB Corrected typo in comments for cpu_ops
|
||||||
09-May-12 JDB Separated assignments from conditional expressions
|
09-May-12 JDB Separated assignments from conditional expressions
|
||||||
11-Sep-08 JDB Moved microcode function prototypes to hp2100_cpu1.h
|
11-Sep-08 JDB Moved microcode function prototypes to hp2100_cpu1.h
|
||||||
|
@ -768,11 +769,11 @@ for (i = 0; i < OP_N_F; i++) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_VAR: /* inline variable operand */
|
case OP_VAR: /* inline variable operand */
|
||||||
(*op++).word = PC; /* get pointer to variable */
|
(*op++).word = (uint16) PC; /* get pointer to variable */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_ADR: /* inline address operand */
|
case OP_ADR: /* inline address operand */
|
||||||
(*op++).word = MA; /* get address */
|
(*op++).word = (uint16) MA; /* get address (set by "resolve" above) */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_ADK: /* address of int constant */
|
case OP_ADK: /* address of int constant */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* hp2100_cpu2.c: HP 2100/1000 FP/DMS/EIG/IOP instructions
|
/* hp2100_cpu2.c: HP 2100/1000 FP/DMS/EIG/IOP instructions
|
||||||
|
|
||||||
Copyright (c) 2005-2012, Robert M. Supnik
|
Copyright (c) 2005-2014, 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,6 +26,7 @@
|
||||||
CPU2 Floating-point, dynamic mapping, extended, and I/O processor
|
CPU2 Floating-point, dynamic mapping, extended, and I/O processor
|
||||||
instructions
|
instructions
|
||||||
|
|
||||||
|
24-Dec-14 JDB Added casts for explicit downward conversions
|
||||||
09-May-12 JDB Separated assignments from conditional expressions
|
09-May-12 JDB Separated assignments from conditional expressions
|
||||||
11-Sep-08 JDB Moved microcode function prototypes to hp2100_cpu1.h
|
11-Sep-08 JDB Moved microcode function prototypes to hp2100_cpu1.h
|
||||||
05-Sep-08 JDB Removed option-present tests (now in UIG dispatchers)
|
05-Sep-08 JDB Removed option-present tests (now in UIG dispatchers)
|
||||||
|
@ -118,9 +119,12 @@ uint32 entry;
|
||||||
|
|
||||||
entry = (IR >> 4) & 017; /* mask to entry point */
|
entry = (IR >> 4) & 017; /* mask to entry point */
|
||||||
|
|
||||||
if (op_fp[entry] != OP_N)
|
if (op_fp [entry] != OP_N) {
|
||||||
if (reason = cpu_ops (op_fp[entry], op, intrq)) /* get instruction operands */
|
reason = cpu_ops (op_fp [entry], op, intrq); /* get instruction operands */
|
||||||
return reason;
|
|
||||||
|
if (reason != SCPE_OK) /* evaluation failed? */
|
||||||
|
return reason; /* return reason for failure */
|
||||||
|
}
|
||||||
|
|
||||||
switch (entry) { /* decode IR<7:4> */
|
switch (entry) { /* decode IR<7:4> */
|
||||||
|
|
||||||
|
@ -465,11 +469,11 @@ switch (entry) { /* decode IR<3:0> */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 030: /* RSA, RSB 10x730 (OP_N) */
|
case 030: /* RSA, RSB 10x730 (OP_N) */
|
||||||
ABREG[absel] = dms_upd_sr (); /* save stat */
|
ABREG[absel] = (uint16) dms_upd_sr (); /* save stat */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 031: /* RVA, RVB 10x731 (OP_N) */
|
case 031: /* RVA, RVB 10x731 (OP_N) */
|
||||||
ABREG[absel] = dms_upd_vr (err_PC); /* return updated violation register */
|
ABREG[absel] = (uint16) dms_upd_vr (err_PC); /* return updated violation register */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 032: /* DJP 105732 (OP_A) */
|
case 032: /* DJP 105732 (OP_A) */
|
||||||
|
@ -643,7 +647,7 @@ switch (entry) { /* decode IR<4:0> */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 004: /* CXA, CXB 10x744 (OP_N) */
|
case 004: /* CXA, CXB 10x744 (OP_N) */
|
||||||
ABREG[absel] = XR; /* copy from XR */
|
ABREG[absel] = (uint16) XR; /* copy from XR */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 005: /* LDX 105745 (OP_K)*/
|
case 005: /* LDX 105745 (OP_K)*/
|
||||||
|
@ -660,7 +664,7 @@ switch (entry) { /* decode IR<4:0> */
|
||||||
case 007: /* XAX, XBX 10x747 (OP_N) */
|
case 007: /* XAX, XBX 10x747 (OP_N) */
|
||||||
t = XR; /* exchange XR */
|
t = XR; /* exchange XR */
|
||||||
XR = ABREG[absel];
|
XR = ABREG[absel];
|
||||||
ABREG[absel] = t;
|
ABREG[absel] = (uint16) t;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 010: /* SAY, SBY 10x750 (OP_A) */
|
case 010: /* SAY, SBY 10x750 (OP_A) */
|
||||||
|
@ -682,7 +686,7 @@ switch (entry) { /* decode IR<4:0> */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 014: /* CYA, CYB 10x754 (OP_N) */
|
case 014: /* CYA, CYB 10x754 (OP_N) */
|
||||||
ABREG[absel] = YR; /* copy from YR */
|
ABREG[absel] = (uint16) YR; /* copy from YR */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 015: /* LDY 105755 (OP_K) */
|
case 015: /* LDY 105755 (OP_K) */
|
||||||
|
@ -699,7 +703,7 @@ switch (entry) { /* decode IR<4:0> */
|
||||||
case 017: /* XAY, XBY 10x757 (OP_N) */
|
case 017: /* XAY, XBY 10x757 (OP_N) */
|
||||||
t = YR; /* exchange YR */
|
t = YR; /* exchange YR */
|
||||||
YR = ABREG[absel];
|
YR = ABREG[absel];
|
||||||
ABREG[absel] = t;
|
ABREG[absel] = (uint16) t;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* EIG module 2 */
|
/* EIG module 2 */
|
||||||
|
@ -1027,7 +1031,7 @@ switch (entry) { /* decode IR<5:0> */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 002: /* READF 105462 (OP_N) */
|
case 002: /* READF 105462 (OP_N) */
|
||||||
AR = iop_sp; /* copy stk ptr */
|
AR = (uint16) iop_sp; /* copy stk ptr */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 003: /* INS 105463 (OP_N) */
|
case 003: /* INS 105463 (OP_N) */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* hp2100_cpu3.c: HP 2100/1000 FFP/DBI instructions
|
/* hp2100_cpu3.c: HP 2100/1000 FFP/DBI instructions
|
||||||
|
|
||||||
Copyright (c) 2005-2008, J. David Bryan
|
Copyright (c) 2005-2014, J. David Bryan
|
||||||
|
|
||||||
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,6 +25,7 @@
|
||||||
|
|
||||||
CPU3 Fast FORTRAN and Double Integer instructions
|
CPU3 Fast FORTRAN and Double Integer instructions
|
||||||
|
|
||||||
|
24-Dec-14 JDB Added casts for explicit downward conversions
|
||||||
09-May-12 JDB Separated assignments from conditional expressions
|
09-May-12 JDB Separated assignments from conditional expressions
|
||||||
11-Sep-08 JDB Moved microcode function prototypes to hp2100_cpu1.h
|
11-Sep-08 JDB Moved microcode function prototypes to hp2100_cpu1.h
|
||||||
05-Sep-08 JDB Removed option-present tests (now in UIG dispatchers)
|
05-Sep-08 JDB Removed option-present tests (now in UIG dispatchers)
|
||||||
|
@ -478,8 +479,8 @@ switch (entry) { /* decode IR<4:0> */
|
||||||
WriteW (da++, MA); /* put addr into formal */
|
WriteW (da++, MA); /* put addr into formal */
|
||||||
}
|
}
|
||||||
|
|
||||||
AR = ra; /* return address */
|
AR = (uint16) ra; /* return address */
|
||||||
BR = da; /* addr of 1st unused formal */
|
BR = (uint16) da; /* addr of 1st unused formal */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 024: /* .ENTP 105224 (OP_A) */
|
case 024: /* .ENTP 105224 (OP_A) */
|
||||||
|
@ -518,8 +519,8 @@ switch (entry) { /* decode IR<4:0> */
|
||||||
BR = (BR + 1) & VAMASK; /* incr address */
|
BR = (BR + 1) & VAMASK; /* incr address */
|
||||||
op[0].word = op[0].word - 1; /* decr count */
|
op[0].word = op[0].word - 1; /* decr count */
|
||||||
if (op[0].word && intrq) { /* more and intr? */
|
if (op[0].word && intrq) { /* more and intr? */
|
||||||
AR = sa; /* restore A */
|
AR = (uint16) sa; /* restore A */
|
||||||
BR = sb; /* restore B */
|
BR = (uint16) sb; /* restore B */
|
||||||
PC = err_PC; /* restart instruction */
|
PC = err_PC; /* restart instruction */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -725,10 +726,10 @@ switch (entry) { /* decode IR<3:0> */
|
||||||
t = (rh << 16) | (rl & 0xFFFF); /* combine partials */
|
t = (rh << 16) | (rl & 0xFFFF); /* combine partials */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (O)
|
if (O) /* if overflow occurred */
|
||||||
t = ~SIGN32; /* if overflow, rtn max pos */
|
t = ~SIGN32; /* then return the largest positive number */
|
||||||
else if (sign)
|
else if (sign) /* otherwise if the result is negative */
|
||||||
t = ~t + 1; /* if result neg, 2s compl */
|
t = ~t + 1; /* then return the twos complement (set if O = 0 above) */
|
||||||
|
|
||||||
#endif /* end of int64 support */
|
#endif /* end of int64 support */
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* hp2100_cpu4.c: HP 1000 FPP/SIS
|
/* hp2100_cpu4.c: HP 1000 FPP/SIS
|
||||||
|
|
||||||
Copyright (c) 2006-2012, J. David Bryan
|
Copyright (c) 2006-2014, J. David Bryan
|
||||||
|
|
||||||
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,6 +25,7 @@
|
||||||
|
|
||||||
CPU4 Floating Point Processor and Scientific Instruction Set
|
CPU4 Floating Point Processor and Scientific Instruction Set
|
||||||
|
|
||||||
|
24-Dec-14 JDB Added casts for explicit downward conversions
|
||||||
09-May-12 JDB Separated assignments from conditional expressions
|
09-May-12 JDB Separated assignments from conditional expressions
|
||||||
06-Feb-12 JDB Added OPSIZE casts to fp_accum calls in .FPWR/.TPWR
|
06-Feb-12 JDB Added OPSIZE casts to fp_accum calls in .FPWR/.TPWR
|
||||||
11-Sep-08 JDB Moved microcode function prototypes to hp2100_cpu1.h
|
11-Sep-08 JDB Moved microcode function prototypes to hp2100_cpu1.h
|
||||||
|
@ -312,7 +313,7 @@ switch (entry) { /* decode IR<6:0> */
|
||||||
|
|
||||||
case 0007: /* [stk] 105007 (OP_A) */
|
case 0007: /* [stk] 105007 (OP_A) */
|
||||||
O = 0; /* clear overflow */
|
O = 0; /* clear overflow */
|
||||||
stk_ptr = PC; /* save ptr to next buf */
|
stk_ptr = (uint16) PC; /* save ptr to next buf */
|
||||||
rtn_addr = op[0].word; /* save return address */
|
rtn_addr = op[0].word; /* save return address */
|
||||||
|
|
||||||
while (TRUE) {
|
while (TRUE) {
|
||||||
|
@ -709,7 +710,7 @@ switch (entry) { /* decode IR<3:0> */
|
||||||
op[1].fpk[1] = op[1].fpk[1] | 2; /* set "exponent" to 1 */
|
op[1].fpk[1] = op[1].fpk[1] | 2; /* set "exponent" to 1 */
|
||||||
}
|
}
|
||||||
|
|
||||||
op[2].fpk[0] = exponent;
|
op[2].fpk[0] = (uint16) exponent;
|
||||||
fp_exec (0120, &op[3], op[2], NOP); /* op3 = FLT(exponent) */
|
fp_exec (0120, &op[3], op[2], NOP); /* op3 = FLT(exponent) */
|
||||||
|
|
||||||
fp_exec (0020, &op[4], op[1], plus_1); /* op4 = op1 - 1.0 */
|
fp_exec (0020, &op[4], op[1], plus_1); /* op4 = op1 - 1.0 */
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* hp2100_cpu5.c: HP 1000 RTE-6/VM VMA and RTE-IV EMA instructions
|
/* hp2100_cpu5.c: HP 1000 RTE-6/VM VMA and RTE-IV EMA instructions
|
||||||
|
|
||||||
Copyright (c) 2007-2008, Holger Veit
|
Copyright (c) 2007-2008, Holger Veit
|
||||||
Copyright (c) 2006-2012, J. David Bryan
|
Copyright (c) 2006-2014, J. David Bryan
|
||||||
|
|
||||||
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,6 +26,7 @@
|
||||||
|
|
||||||
CPU5 RTE-6/VM and RTE-IV firmware option instructions
|
CPU5 RTE-6/VM and RTE-IV firmware option instructions
|
||||||
|
|
||||||
|
24-Dec-14 JDB Added casts for explicit downward conversions
|
||||||
17-Dec-12 JDB Fixed cpu_vma_mapte to return FALSE if not a VMA program
|
17-Dec-12 JDB Fixed cpu_vma_mapte to return FALSE if not a VMA program
|
||||||
09-May-12 JDB Separated assignments from conditional expressions
|
09-May-12 JDB Separated assignments from conditional expressions
|
||||||
23-Mar-12 JDB Added sign extension for dim count in "cpu_ema_resolve"
|
23-Mar-12 JDB Added sign extension for dim count in "cpu_ema_resolve"
|
||||||
|
@ -389,8 +390,11 @@ if (debug)
|
||||||
O = 0; /* clear overflow */
|
O = 0; /* clear overflow */
|
||||||
if (ptr & 0x80000000) { /* is it a local reference? */
|
if (ptr & 0x80000000) { /* is it a local reference? */
|
||||||
ptrl = ptr & VAMASK;
|
ptrl = ptr & VAMASK;
|
||||||
if ((ptr&I_IA) && (reason = vma_resolve (ReadW (ptrl), &ptrl, debug)))
|
if (ptr&I_IA) {
|
||||||
|
reason = vma_resolve (ReadW (ptrl), &ptrl, debug);
|
||||||
|
if (reason)
|
||||||
return reason; /* yes, resolve indirect ref */
|
return reason; /* yes, resolve indirect ref */
|
||||||
|
}
|
||||||
BR = ptrl & VAMASK; /* address is local */
|
BR = ptrl & VAMASK; /* address is local */
|
||||||
AR = (ptr >> 16) & DMASK;
|
AR = (ptr >> 16) & DMASK;
|
||||||
if (debug)
|
if (debug)
|
||||||
|
@ -418,7 +422,7 @@ if (!p30) /* matched suit for 1st page
|
||||||
* must be in idx 0 of PTE */
|
* must be in idx 0 of PTE */
|
||||||
if (pgidx==01777) { /* suit switch situation */
|
if (pgidx==01777) { /* suit switch situation */
|
||||||
pgidx = 0; /* select correct idx 0 */
|
pgidx = 0; /* select correct idx 0 */
|
||||||
suit = pagid+1; /* suit needs increment */
|
suit = (uint16) (pagid + 1); /* suit needs increment */
|
||||||
if (suit==0) { /* is it page 65536? */
|
if (suit==0) { /* is it page 65536? */
|
||||||
offset += 02000; /* adjust to 2nd page */
|
offset += 02000; /* adjust to 2nd page */
|
||||||
suit = NILPAGE;
|
suit = NILPAGE;
|
||||||
|
@ -447,8 +451,8 @@ else {
|
||||||
return cpu_vma_fault(pagid+1,page31,31,ptepg,faultab,faultpc,debug);
|
return cpu_vma_fault(pagid+1,page31,31,ptepg,faultab,faultpc,debug);
|
||||||
}
|
}
|
||||||
|
|
||||||
AR = pagid; /* return pagid in A */
|
AR = (uint16) pagid; /* return pagid in A */
|
||||||
BR = page30+offset; /* mapped address in B */
|
BR = (uint16) (page30 + offset); /* mapped address in B */
|
||||||
if (debug)
|
if (debug)
|
||||||
fprintf(sim_deb,">>CPU VMA: cpu_vma_lbp: map done AR=%06o BR=%o6o\n",AR,BR);
|
fprintf(sim_deb,">>CPU VMA: cpu_vma_lbp: map done AR=%06o BR=%o6o\n",AR,BR);
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
|
@ -612,7 +616,8 @@ if (ndim == 0) { /* no dimensions: */
|
||||||
accu = 0;
|
accu = 0;
|
||||||
while (ndim-- > 0) {
|
while (ndim-- > 0) {
|
||||||
MA = ReadW(atbl++); /* get addr of subscript */
|
MA = ReadW(atbl++); /* get addr of subscript */
|
||||||
if ((reason = resolve (MA, &MA, intrq))) /* and resolve it */
|
reason = resolve (MA, &MA, intrq); /* and resolve it */
|
||||||
|
if (reason)
|
||||||
return reason;
|
return reason;
|
||||||
din = ReadOp(MA,ij); /* get actual subscript value */
|
din = ReadOp(MA,ij); /* get actual subscript value */
|
||||||
ax = ij==in_d ? INT32(din.dword) : INT16(din.word);
|
ax = ij==in_d ? INT32(din.dword) : INT16(din.word);
|
||||||
|
@ -647,6 +652,7 @@ t_stat cpu_rte_vma (uint32 IR, uint32 intrq)
|
||||||
t_stat reason = SCPE_OK;
|
t_stat reason = SCPE_OK;
|
||||||
OPS op;
|
OPS op;
|
||||||
OP_PAT pattern;
|
OP_PAT pattern;
|
||||||
|
uint16 t16;
|
||||||
uint32 entry,t32,ndim;
|
uint32 entry,t32,ndim;
|
||||||
uint32 dtbl,atbl; /* descriptor table ptr, actual args ptr */
|
uint32 dtbl,atbl; /* descriptor table ptr, actual args ptr */
|
||||||
OP dop0,dop1;
|
OP dop0,dop1;
|
||||||
|
@ -691,9 +697,9 @@ switch (entry) { /* decode IR<3:0> */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 003: /* [swap] 105243 (OP_N) */
|
case 003: /* [swap] 105243 (OP_N) */
|
||||||
t32 = AR; /* swap A and B registers */
|
t16 = AR; /* swap A and B registers */
|
||||||
AR = BR;
|
AR = BR;
|
||||||
BR = t32;
|
BR = t16;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 004: /* [---] 105244 (OP_N) */
|
case 004: /* [---] 105244 (OP_N) */
|
||||||
|
@ -718,10 +724,12 @@ switch (entry) { /* decode IR<3:0> */
|
||||||
case 010: /* .IMAP 105250 (OP_A) */
|
case 010: /* .IMAP 105250 (OP_A) */
|
||||||
dtbl = op[0].word;
|
dtbl = op[0].word;
|
||||||
atbl = PC;
|
atbl = PC;
|
||||||
if ((reason = cpu_vma_ijmar(in_s,dtbl,atbl,&ndim,intrq,debug))) /* calc the virt address to AB */
|
reason = cpu_vma_ijmar(in_s,dtbl,atbl,&ndim,intrq,debug); /* calc the virt address to AB */
|
||||||
|
if (reason)
|
||||||
return reason;
|
return reason;
|
||||||
t32 = (AR << 16) | (BR & DMASK);
|
t32 = (AR << 16) | (BR & DMASK);
|
||||||
if ((reason = cpu_vma_lbp(t32,0,PC-2,intrq,debug)))
|
reason = cpu_vma_lbp(t32,0,PC-2,intrq,debug);
|
||||||
|
if (reason)
|
||||||
return reason;
|
return reason;
|
||||||
if (PC==pcsave)
|
if (PC==pcsave)
|
||||||
PC = (PC+ndim) & VAMASK; /* adjust PC: skip ndim subscript words */
|
PC = (PC+ndim) & VAMASK; /* adjust PC: skip ndim subscript words */
|
||||||
|
@ -736,10 +744,12 @@ switch (entry) { /* decode IR<3:0> */
|
||||||
case 012: /* .JMAP 105252 (OP_A) */
|
case 012: /* .JMAP 105252 (OP_A) */
|
||||||
dtbl = op[0].word;
|
dtbl = op[0].word;
|
||||||
atbl = PC;
|
atbl = PC;
|
||||||
if ((reason = cpu_vma_ijmar(in_d,dtbl,atbl,&ndim,intrq,debug))) /* calc the virtual address to AB */
|
reason = cpu_vma_ijmar(in_d,dtbl,atbl,&ndim,intrq,debug); /* calc the virtual address to AB */
|
||||||
|
if (reason)
|
||||||
return reason;
|
return reason;
|
||||||
t32 = (AR << 16) | (BR & DMASK);
|
t32 = (AR << 16) | (BR & DMASK);
|
||||||
if ((reason = cpu_vma_lbp(t32,0,PC-2,intrq,debug)))
|
reason = cpu_vma_lbp(t32,0,PC-2,intrq,debug);
|
||||||
|
if (reason)
|
||||||
return reason;
|
return reason;
|
||||||
if (PC==pcsave)
|
if (PC==pcsave)
|
||||||
PC = (PC + ndim) & VAMASK; /* adjust PC: skip ndim subscript dword ptr */
|
PC = (PC + ndim) & VAMASK; /* adjust PC: skip ndim subscript dword ptr */
|
||||||
|
@ -1026,7 +1036,7 @@ YR = ReadW(MA);
|
||||||
WriteW(vout++, MA); vin++; /* copy address of N */
|
WriteW(vout++, MA); vin++; /* copy address of N */
|
||||||
|
|
||||||
if (imax==0) goto easy; /* easy case */
|
if (imax==0) goto easy; /* easy case */
|
||||||
AR = k / imax; AR++; /* calculate K/IMAX */
|
AR = (uint16) (k / imax); AR++; /* calculate K/IMAX */
|
||||||
if (negflag) goto hard; /* had a negative index? */
|
if (negflag) goto hard; /* had a negative index? */
|
||||||
if (YR > AR) goto hard;
|
if (YR > AR) goto hard;
|
||||||
|
|
||||||
|
@ -1192,7 +1202,7 @@ if ((idext0 & 0100000) || /* was nonstd MSEG? */
|
||||||
e->npgs = msnum==e->msegno ? lastpgs : e->msegsz; /* for last MSEG, only map available pgs */
|
e->npgs = msnum==e->msegno ? lastpgs : e->msegsz; /* for last MSEG, only map available pgs */
|
||||||
if (!cpu_ema_mmap01(e)) return FALSE; /* map npgs pages at ipgs */
|
if (!cpu_ema_mmap01(e)) return FALSE; /* map npgs pages at ipgs */
|
||||||
}
|
}
|
||||||
BR = e->mseg + e->msoff; /* return address of element */
|
BR = (uint16) (e->mseg + e->msoff); /* return address of element */
|
||||||
return TRUE; /* and everything done */
|
return TRUE; /* and everything done */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1246,7 +1256,7 @@ if (npgs < e->msegsz) {
|
||||||
e->mseg = mseg; /* logical stat of MSEG */
|
e->mseg = mseg; /* logical stat of MSEG */
|
||||||
if (!cpu_ema_emat(e)) goto em16; /* do a std mapping */
|
if (!cpu_ema_emat(e)) goto em16; /* do a std mapping */
|
||||||
} else {
|
} else {
|
||||||
BR = mseg + e->offs; /* logical start of buffer */
|
BR = (uint16) (mseg + e->offs); /* logical start of buffer */
|
||||||
e->npgs = bufpgs; /* S5 # pgs required */
|
e->npgs = bufpgs; /* S5 # pgs required */
|
||||||
e->ipgs = e->pgoff; /* S6 page offset to reqd pg */
|
e->ipgs = e->pgoff; /* S6 page offset to reqd pg */
|
||||||
if (!cpu_ema_mmap02(e)) goto em16; /* do nonstd mapping */
|
if (!cpu_ema_mmap02(e)) goto em16; /* do nonstd mapping */
|
||||||
|
@ -1325,7 +1335,7 @@ if (xidex) { /* is EMA declared? */
|
||||||
idext0 = ReadWA(xidex+0) | 0100000; /* set NS flag in id extension */
|
idext0 = ReadWA(xidex+0) | 0100000; /* set NS flag in id extension */
|
||||||
WriteIO(xidex+0, idext0, SMAP); /* save back value */
|
WriteIO(xidex+0, idext0, SMAP); /* save back value */
|
||||||
AR = 0; /* was successful */
|
AR = 0; /* was successful */
|
||||||
BR = mseg + offs; /* calculate log address */
|
BR = (uint16) (mseg + offs); /* calculate log address */
|
||||||
(*rtn)++; /* return via good exit */
|
(*rtn)++; /* return via good exit */
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
@ -1348,7 +1358,7 @@ while (ndim > 0) {
|
||||||
if (sum & 0xffff8000) goto em15; /* overflow? */
|
if (sum & 0xffff8000) goto em15; /* overflow? */
|
||||||
ndim--;
|
ndim--;
|
||||||
}
|
}
|
||||||
BR = abase + sum; /* add displacement */
|
BR = (uint16) (abase + sum); /* add displacement */
|
||||||
(*rtn)++; /* return via good exit */
|
(*rtn)++; /* return via good exit */
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* hp2100_cpu6.c: HP 1000 RTE-6/VM OS instructions
|
/* hp2100_cpu6.c: HP 1000 RTE-6/VM OS instructions
|
||||||
|
|
||||||
Copyright (c) 2006-2013, J. David Bryan
|
Copyright (c) 2006-2014, J. David Bryan
|
||||||
|
|
||||||
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,6 +25,7 @@
|
||||||
|
|
||||||
CPU6 RTE-6/VM OS instructions
|
CPU6 RTE-6/VM OS instructions
|
||||||
|
|
||||||
|
24-Dec-14 JDB Added casts for explicit downward conversions
|
||||||
18-Mar-13 JDB Use MP abort handler declaration in hp2100_cpu.h
|
18-Mar-13 JDB Use MP abort handler declaration in hp2100_cpu.h
|
||||||
09-May-12 JDB Separated assignments from conditional expressions
|
09-May-12 JDB Separated assignments from conditional expressions
|
||||||
29-Oct-10 JDB DMA channels renamed from 0,1 to 1,2 to match documentation
|
29-Oct-10 JDB DMA channels renamed from 0,1 to 1,2 to match documentation
|
||||||
|
@ -318,7 +319,7 @@ return reason;
|
||||||
the table.
|
the table.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
uint32 cpu_get_intbl (uint32 select_code)
|
static uint16 cpu_get_intbl (uint32 select_code)
|
||||||
{
|
{
|
||||||
uint16 interrupt_table; /* interrupt table (starts with SC 06) */
|
uint16 interrupt_table; /* interrupt table (starts with SC 06) */
|
||||||
uint16 table_length; /* length of interrupt table */
|
uint16 table_length; /* length of interrupt table */
|
||||||
|
@ -379,7 +380,7 @@ t_stat cpu_rte_os (uint32 IR, uint32 intrq, uint32 iotrap)
|
||||||
t_stat reason = SCPE_OK;
|
t_stat reason = SCPE_OK;
|
||||||
OPS op;
|
OPS op;
|
||||||
OP_PAT pattern;
|
OP_PAT pattern;
|
||||||
uint32 entry, count, cp, sa, da, i, ma;
|
uint32 entry, count, cp, sa, da, i, ma, eqta;
|
||||||
uint16 vectors, save_area, priv_fence, eoreg, eqt, key;
|
uint16 vectors, save_area, priv_fence, eoreg, eqt, key;
|
||||||
char test[6], target[6];
|
char test[6], target[6];
|
||||||
jmp_buf mp_handler;
|
jmp_buf mp_handler;
|
||||||
|
@ -675,12 +676,14 @@ switch (entry) { /* decode IR<3:0> */
|
||||||
eqt = ReadW (eqt1); /* get addr of EQT1 */
|
eqt = ReadW (eqt1); /* get addr of EQT1 */
|
||||||
|
|
||||||
if (AR != eqt) { /* already set up? */
|
if (AR != eqt) { /* already set up? */
|
||||||
for (eqt = eqt1; eqt <= eqt11; eqt++) /* init EQT1-EQT11 */
|
for (eqta = eqt1; eqta <= eqt11; eqta++) /* init EQT1-EQT11 */
|
||||||
WriteW (eqt & VAMASK, (AR++ & DMASK));
|
WriteW (eqta, AR++ & DMASK);
|
||||||
for (eqt = eqt12; eqt <= eqt15; eqt++) /* init EQT12-EQT15 */
|
for (eqta = eqt12; eqta <= eqt15; eqta++) /* init EQT12-EQT15 */
|
||||||
WriteW (eqt & VAMASK, (AR++ & DMASK)); /* (not contig with EQT1-11) */
|
WriteW (eqta, AR++ & DMASK); /* (not contig with EQT1-11) */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AR = AR & DMASK; /* ensure wraparound */
|
||||||
|
|
||||||
if (debug_print) /* debugging? */
|
if (debug_print) /* debugging? */
|
||||||
fprintf (sim_deb, /* print return registers */
|
fprintf (sim_deb, /* print return registers */
|
||||||
", A = %06o, EQT1 = %06o", AR, eqt);
|
", A = %06o, EQT1 = %06o", AR, eqt);
|
||||||
|
@ -724,7 +727,7 @@ switch (entry) { /* decode IR<3:0> */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entry == 016) /* call was .ENTC? */
|
if (entry == 016) /* call was .ENTC? */
|
||||||
AR = sa; /* set A to return address */
|
AR = (uint16) sa; /* set A to return address */
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* hp2100_cpu7.c: HP 1000 VIS and SIGNAL/1000 microcode
|
/* hp2100_cpu7.c: HP 1000 VIS and SIGNAL/1000 microcode
|
||||||
|
|
||||||
Copyright (c) 2008, Holger Veit
|
Copyright (c) 2008, Holger Veit
|
||||||
Copyright (c) 2006-2013, J. David Bryan
|
Copyright (c) 2006-2014, J. David Bryan
|
||||||
|
|
||||||
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,6 +26,7 @@
|
||||||
|
|
||||||
CPU7 Vector Instruction Set and SIGNAL firmware
|
CPU7 Vector Instruction Set and SIGNAL firmware
|
||||||
|
|
||||||
|
24-Dec-14 JDB Added casts for explicit downward conversions
|
||||||
18-Mar-13 JDB Moved EMA helper declarations to hp2100_cpu1.h
|
18-Mar-13 JDB Moved EMA helper declarations to hp2100_cpu1.h
|
||||||
09-May-12 JDB Separated assignments from conditional expressions
|
09-May-12 JDB Separated assignments from conditional expressions
|
||||||
06-Feb-12 JDB Corrected "opsize" parameter type in vis_abs
|
06-Feb-12 JDB Corrected "opsize" parameter type in vis_abs
|
||||||
|
@ -150,7 +151,7 @@ int16 ix1 = INT16(op[2].word) * delta;
|
||||||
uint32 v2addr = op[3].word;
|
uint32 v2addr = op[3].word;
|
||||||
int16 ix2 = INT16(op[4].word) * delta;
|
int16 ix2 = INT16(op[4].word) * delta;
|
||||||
int16 i, n = INT16(op[5].word);
|
int16 i, n = INT16(op[5].word);
|
||||||
uint32 fpuop = (subcode & 060) | (opsize==fp_f ? 0 : 2);
|
uint16 fpuop = (uint16) (subcode & 060) | (opsize==fp_f ? 0 : 2);
|
||||||
|
|
||||||
if (n <= 0) return;
|
if (n <= 0) return;
|
||||||
for (i=0; i<n; i++) {
|
for (i=0; i<n; i++) {
|
||||||
|
@ -174,7 +175,7 @@ int32 ix2 = INT16(op[3].word) * delta;
|
||||||
uint32 v3addr = op[4].word;
|
uint32 v3addr = op[4].word;
|
||||||
int32 ix3 = INT16(op[5].word) * delta;
|
int32 ix3 = INT16(op[5].word) * delta;
|
||||||
int16 i, n = INT16(op[6].word);
|
int16 i, n = INT16(op[6].word);
|
||||||
uint32 fpuop = (subcode & 060) | (opsize==fp_f ? 0 : 2);
|
uint16 fpuop = (uint16) (subcode & 060) | (opsize==fp_f ? 0 : 2);
|
||||||
|
|
||||||
if (n <= 0) return;
|
if (n <= 0) return;
|
||||||
for (i=0; i<n; i++) {
|
for (i=0; i<n; i++) {
|
||||||
|
@ -205,7 +206,7 @@ uint32 v1addr = op[1].word;
|
||||||
int16 ix1 = INT16(op[2].word) * delta;
|
int16 ix1 = INT16(op[2].word) * delta;
|
||||||
int16 n = INT16(op[3].word);
|
int16 n = INT16(op[3].word);
|
||||||
int16 i,mxmn,sign;
|
int16 i,mxmn,sign;
|
||||||
int32 subop = 020 | (opsize==fp_f ? 0 : 2);
|
uint16 subop = 020 | (opsize==fp_f ? 0 : 2);
|
||||||
|
|
||||||
if (n <= 0) return;
|
if (n <= 0) return;
|
||||||
mxmn = 0; /* index of maxmin element */
|
mxmn = 0; /* index of maxmin element */
|
||||||
|
@ -288,7 +289,7 @@ out->fpk[1] = (in.fpk[1] & 0177400) | (in.fpk[3] & 0377);
|
||||||
|
|
||||||
static void vis_vsmnm(OPS op,OPSIZE opsize,t_bool doabs)
|
static void vis_vsmnm(OPS op,OPSIZE opsize,t_bool doabs)
|
||||||
{
|
{
|
||||||
uint32 fpuop;
|
uint16 fpuop;
|
||||||
OP v1,sumnrm = zero;
|
OP v1,sumnrm = zero;
|
||||||
int16 delta = opsize==fp_f ? 2 : 4;
|
int16 delta = opsize==fp_f ? 2 : 4;
|
||||||
uint32 saddr = op[0].word;
|
uint32 saddr = op[0].word;
|
||||||
|
@ -536,7 +537,7 @@ static const OP_PAT op_signal[16] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* complex addition helper */
|
/* complex addition helper */
|
||||||
static void sig_caddsub(uint32 addsub,OPS op)
|
static void sig_caddsub(uint16 addsub,OPS op)
|
||||||
{
|
{
|
||||||
OP a,b,c,d,p1,p2;
|
OP a,b,c,d,p1,p2;
|
||||||
|
|
||||||
|
@ -617,7 +618,7 @@ WriteOp(im+rev, v1i, fp_f);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* helper for PRSCR/UNSCR */
|
/* helper for PRSCR/UNSCR */
|
||||||
static OP sig_scadd(uint32 oper,t_bool addh, OP a, OP b)
|
static OP sig_scadd(uint16 oper,t_bool addh, OP a, OP b)
|
||||||
{
|
{
|
||||||
OP r;
|
OP r;
|
||||||
static const OP plus_half = { { 0040000, 0000000 } }; /* DEC +0.5 */
|
static const OP plus_half = { { 0040000, 0000000 } }; /* DEC +0.5 */
|
||||||
|
|
|
@ -23,7 +23,8 @@
|
||||||
be used in advertising or otherwise to promote the sale, use or other dealings
|
be 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-Dec-14 JDB Added "-Wunused-const-variable" to the suppression pragmas
|
30-Dec-14 JDB Added S-register parameters to ibl_copy, more IBL constants
|
||||||
|
28-Dec-14 JDB Changed suppression from #pragma GCC to #pragma clang
|
||||||
05-Feb-13 JDB Added declaration for hp_fprint_stopped
|
05-Feb-13 JDB Added declaration for hp_fprint_stopped
|
||||||
18-Mar-13 JDB Added "-Wdangling-else" to the suppression pragmas
|
18-Mar-13 JDB Added "-Wdangling-else" to the suppression pragmas
|
||||||
Removed redundant extern declarations
|
Removed redundant extern declarations
|
||||||
|
@ -79,15 +80,18 @@
|
||||||
#include "sim_defs.h" /* simulator defns */
|
#include "sim_defs.h" /* simulator defns */
|
||||||
|
|
||||||
|
|
||||||
/* Required to quell clang precedence warnings */
|
/* The following pragmas quell clang warnings that are on by default but should
|
||||||
|
not be, in my opinion. They warn about the use of perfectly valid code and
|
||||||
|
require the addition of redundant parentheses and braces to silence them.
|
||||||
|
Rather than clutter up the code with scores of extra symbols that, in my
|
||||||
|
view, make the code harder to read and maintain, I elect to suppress these
|
||||||
|
warnings.
|
||||||
|
*/
|
||||||
|
|
||||||
#if defined (__GNUC__)
|
#if defined (__clang__)
|
||||||
#pragma GCC diagnostic ignored "-Wunknown-pragmas"
|
#pragma clang diagnostic ignored "-Wlogical-op-parentheses"
|
||||||
#pragma GCC diagnostic ignored "-Wpragmas"
|
#pragma clang diagnostic ignored "-Wbitwise-op-parentheses"
|
||||||
#pragma GCC diagnostic ignored "-Wlogical-op-parentheses"
|
#pragma clang diagnostic ignored "-Wdangling-else"
|
||||||
#pragma GCC diagnostic ignored "-Wbitwise-op-parentheses"
|
|
||||||
#pragma GCC diagnostic ignored "-Wdangling-else"
|
|
||||||
#pragma GCC diagnostic ignored "-Wunused-const-variable"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -218,6 +222,12 @@ typedef enum { INITIAL, SERVICE } POLLMODE; /* poll synchronization
|
||||||
#define IBL_DPC (IBL_LNT - 2) /* DMA ctrl word */
|
#define IBL_DPC (IBL_LNT - 2) /* DMA ctrl word */
|
||||||
#define IBL_END (IBL_LNT - 1) /* last location */
|
#define IBL_END (IBL_LNT - 1) /* last location */
|
||||||
|
|
||||||
|
#define IBL_S_CLR 0000000 /* ibl_copy mask to clear the S register */
|
||||||
|
#define IBL_S_NOCLR 0177777 /* ibl_copy mask to preserve the S register */
|
||||||
|
#define IBL_S_NOSET 0000000 /* ibl_copy mask to preserve the S register */
|
||||||
|
|
||||||
|
#define IBL_SET_SC(s) ((s) << IBL_V_DEV) /* position the select code in the S register */
|
||||||
|
|
||||||
typedef uint16 BOOT_ROM [IBL_LNT]; /* boot ROM data */
|
typedef uint16 BOOT_ROM [IBL_LNT]; /* boot ROM data */
|
||||||
|
|
||||||
|
|
||||||
|
@ -457,12 +467,11 @@ struct dib { /* Device information bl
|
||||||
|
|
||||||
/* CPU state */
|
/* CPU state */
|
||||||
|
|
||||||
extern uint32 SR; /* S register (for IBL) */
|
|
||||||
extern uint32 dev_prl [2], dev_irq [2], dev_srq [2]; /* I/O signal vectors */
|
extern uint32 dev_prl [2], dev_irq [2], dev_srq [2]; /* I/O signal vectors */
|
||||||
|
|
||||||
/* CPU functions */
|
/* CPU functions */
|
||||||
|
|
||||||
extern t_stat ibl_copy (const BOOT_ROM rom, int32 dev);
|
extern t_stat ibl_copy (const BOOT_ROM rom, int32 dev, uint32 sr_clear, uint32 sr_set);
|
||||||
extern void hp_enbdis_pair (DEVICE *ccp, DEVICE *dcp);
|
extern void hp_enbdis_pair (DEVICE *ccp, DEVICE *dcp);
|
||||||
|
|
||||||
/* System functions */
|
/* System functions */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* hp2100_di.c: HP 12821A HP-IB Disc Interface simulator
|
/* hp2100_di.c: HP 12821A HP-IB Disc Interface simulator
|
||||||
|
|
||||||
Copyright (c) 2010-2012, J. David Bryan
|
Copyright (c) 2010-2014, J. David Bryan
|
||||||
|
|
||||||
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,6 +25,8 @@
|
||||||
|
|
||||||
DI 12821A Disc Interface
|
DI 12821A Disc Interface
|
||||||
|
|
||||||
|
24-Dec-14 JDB Added casts for explicit downward conversions
|
||||||
|
Removed redundant global declarations
|
||||||
13-Feb-12 JDB First release
|
13-Feb-12 JDB First release
|
||||||
15-Dec-11 JDB Added dummy DC device for diagnostics
|
15-Dec-11 JDB Added dummy DC device for diagnostics
|
||||||
09-Oct-10 JDB Created DI simulation
|
09-Oct-10 JDB Created DI simulation
|
||||||
|
@ -191,24 +193,6 @@ typedef enum {
|
||||||
DI_STATE di [card_count]; /* per-card state */
|
DI_STATE di [card_count]; /* per-card state */
|
||||||
|
|
||||||
|
|
||||||
/* Disc interface global VM routines */
|
|
||||||
|
|
||||||
IOHANDLER di_io;
|
|
||||||
t_stat di_reset (DEVICE *dptr);
|
|
||||||
|
|
||||||
/* Disc interface global SCP routines */
|
|
||||||
|
|
||||||
t_stat di_set_address (UNIT *uptr, int32 value, char *cptr, void *desc);
|
|
||||||
t_stat di_show_address (FILE *st, UNIT *uptr, int32 value, void *desc);
|
|
||||||
t_stat di_set_cable (UNIT *uptr, int32 value, char *cptr, void *desc);
|
|
||||||
t_stat di_show_cable (FILE *st, UNIT *uptr, int32 value, void *desc);
|
|
||||||
|
|
||||||
/* Disc interface global bus routines */
|
|
||||||
|
|
||||||
t_bool di_bus_source (CARD_ID card, uint8 data);
|
|
||||||
void di_bus_control (CARD_ID card, uint32 unit, uint8 assert, uint8 deny);
|
|
||||||
void di_poll_response (CARD_ID card, uint32 unit, FLIP_FLOP response);
|
|
||||||
|
|
||||||
/* Disc interface local bus routines */
|
/* Disc interface local bus routines */
|
||||||
|
|
||||||
static t_bool di_bus_accept (CARD_ID card, uint8 data);
|
static t_bool di_bus_accept (CARD_ID card, uint8 data);
|
||||||
|
@ -831,7 +815,7 @@ DEVICE *dptr = (DEVICE *) desc;
|
||||||
if (cptr == NULL) /* if the address is not given */
|
if (cptr == NULL) /* if the address is not given */
|
||||||
return SCPE_ARG; /* report a missing argument */
|
return SCPE_ARG; /* report a missing argument */
|
||||||
|
|
||||||
new_address = get_uint (cptr, 10, 7, &status); /* parse the address value */
|
new_address = (uint32) get_uint (cptr, 10, 7, &status); /* parse the address value */
|
||||||
|
|
||||||
if (status == SCPE_OK) { /* is the parse OK? */
|
if (status == SCPE_OK) { /* is the parse OK? */
|
||||||
if (value) /* are we setting the card address? */
|
if (value) /* are we setting the card address? */
|
||||||
|
@ -1868,11 +1852,11 @@ if (di_card->cntl_register & CNTL_TALK) /* is the card talking?
|
||||||
if (di_card->cntl_register & CNTL_CIC) /* is the card the controller in charge? */
|
if (di_card->cntl_register & CNTL_CIC) /* is the card the controller in charge? */
|
||||||
di_card->bus_cntl = /* assert or deny the ATN bus line */
|
di_card->bus_cntl = /* assert or deny the ATN bus line */
|
||||||
di_card->bus_cntl & ~BUS_ATN /* from the ATN tag value */
|
di_card->bus_cntl & ~BUS_ATN /* from the ATN tag value */
|
||||||
| (tag & TAG_ATN) >> BUS_SHIFT;
|
| (uint8) ((tag & TAG_ATN) >> BUS_SHIFT);
|
||||||
|
|
||||||
di_card->bus_cntl = /* assert or deny the EOI bus line */
|
di_card->bus_cntl = /* assert or deny the EOI bus line */
|
||||||
di_card->bus_cntl & ~BUS_EOI /* from the EOI tag value */
|
di_card->bus_cntl & ~BUS_EOI /* from the EOI tag value */
|
||||||
| (tag & TAG_EOI) >> BUS_SHIFT;
|
| (uint8) ((tag & TAG_EOI) >> BUS_SHIFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (uint16) data; /* return the data value */
|
return (uint16) data; /* return the data value */
|
||||||
|
|
|
@ -144,8 +144,8 @@ typedef enum {
|
||||||
#define GET_UPPER(w) (uint8) (((w) & UPPER_BYTE) >> BYTE_SHIFT)
|
#define GET_UPPER(w) (uint8) (((w) & UPPER_BYTE) >> BYTE_SHIFT)
|
||||||
#define GET_LOWER(w) (uint8) ((w) & LOWER_BYTE)
|
#define GET_LOWER(w) (uint8) ((w) & LOWER_BYTE)
|
||||||
|
|
||||||
#define SET_UPPER(b) ((b) << BYTE_SHIFT)
|
#define SET_UPPER(b) (uint16) ((b) << BYTE_SHIFT)
|
||||||
#define SET_LOWER(b) (b)
|
#define SET_LOWER(b) (uint16) (b)
|
||||||
#define SET_BOTH(b) (SET_UPPER (b) | SET_LOWER (b))
|
#define SET_BOTH(b) (SET_UPPER (b) | SET_LOWER (b))
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* hp2100_di_da.c: HP 12821A HP-IB Disc Interface simulator for Amigo disc drives
|
/* hp2100_di_da.c: HP 12821A HP-IB Disc Interface simulator for Amigo disc drives
|
||||||
|
|
||||||
Copyright (c) 2011-2012, J. David Bryan
|
Copyright (c) 2011-2014, J. David Bryan
|
||||||
|
|
||||||
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,6 +25,9 @@
|
||||||
|
|
||||||
DA 12821A Disc Interface with Amigo disc drives
|
DA 12821A Disc Interface with Amigo disc drives
|
||||||
|
|
||||||
|
30-Dec-14 JDB Added S-register parameters to ibl_copy
|
||||||
|
24-Dec-14 JDB Use T_ADDR_FMT with t_addr values for 64-bit compatibility
|
||||||
|
Removed redundant global declarations
|
||||||
24-Oct-12 JDB Changed CNTLR_OPCODE to title case to avoid name clash
|
24-Oct-12 JDB Changed CNTLR_OPCODE to title case to avoid name clash
|
||||||
07-May-12 JDB Cancel the intersector delay if an untalk is received
|
07-May-12 JDB Cancel the intersector delay if an untalk is received
|
||||||
29-Mar-12 JDB First release
|
29-Mar-12 JDB First release
|
||||||
|
@ -462,21 +465,14 @@ static CNTLR_VARS icd_cntlr [DA_UNITS] = /* ICD controllers: */
|
||||||
|
|
||||||
/* Amigo disc global VM routines */
|
/* Amigo disc global VM routines */
|
||||||
|
|
||||||
t_stat da_service (UNIT *uptr);
|
|
||||||
t_stat da_reset (DEVICE *dptr);
|
t_stat da_reset (DEVICE *dptr);
|
||||||
t_stat da_attach (UNIT *uptr, char *cptr);
|
t_stat da_attach (UNIT *uptr, char *cptr);
|
||||||
t_stat da_detach (UNIT *uptr);
|
t_stat da_detach (UNIT *uptr);
|
||||||
t_stat da_boot (int32 unitno, DEVICE *dptr);
|
|
||||||
|
|
||||||
/* Amigo disc global SCP routines */
|
/* Amigo disc global SCP routines */
|
||||||
|
|
||||||
t_stat da_load_unload (UNIT *uptr, int32 value, char *cptr, void *desc);
|
t_stat da_load_unload (UNIT *uptr, int32 value, char *cptr, void *desc);
|
||||||
|
|
||||||
/* Amigo disc global bus routines */
|
|
||||||
|
|
||||||
t_bool da_bus_accept (uint32 unit, uint8 data);
|
|
||||||
void da_bus_respond (CARD_ID card, uint32 unit, uint8 new_cntl);
|
|
||||||
|
|
||||||
/* Amigo disc local utility routines */
|
/* Amigo disc local utility routines */
|
||||||
|
|
||||||
static t_bool start_command (uint32 unit);
|
static t_bool start_command (uint32 unit);
|
||||||
|
@ -1214,12 +1210,11 @@ t_stat da_boot (int32 unitno, DEVICE *dptr)
|
||||||
if (GET_BUSADR (da_unit [unitno].flags) != 0) /* booting is supported on bus address 0 only */
|
if (GET_BUSADR (da_unit [unitno].flags) != 0) /* booting is supported on bus address 0 only */
|
||||||
return SCPE_NOFNC; /* report "Command not allowed" if attempted */
|
return SCPE_NOFNC; /* report "Command not allowed" if attempted */
|
||||||
|
|
||||||
if (ibl_copy (da_rom, da_dib.select_code)) /* copy the boot ROM to memory and configure */
|
if (ibl_copy (da_rom, da_dib.select_code, /* copy the boot ROM to memory and configure */
|
||||||
|
IBL_OPT | IBL_DS_HEAD, /* the S register accordingly */
|
||||||
|
IBL_DS | IBL_MAN | IBL_SET_SC (da_dib.select_code)))
|
||||||
return SCPE_IERR; /* return an internal error if the copy failed */
|
return SCPE_IERR; /* return an internal error if the copy failed */
|
||||||
|
else
|
||||||
SR = SR & (IBL_OPT | IBL_DS_HEAD) /* set S to a reasonable value */
|
|
||||||
| IBL_DS | IBL_MAN | (da_dib.select_code << IBL_V_DEV); /* before boot execution */
|
|
||||||
|
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1791,7 +1786,7 @@ if (da_unit [unit].wait > 0) /* was service requested
|
||||||
|
|
||||||
if (initiated && DEBUG_PRI (da_dev, DEB_RWSC))
|
if (initiated && DEBUG_PRI (da_dev, DEB_RWSC))
|
||||||
if (if_command [unit] == disc_command)
|
if (if_command [unit] == disc_command)
|
||||||
fprintf (sim_deb, ">>DA rwsc: Unit %d position %d %s disc command initiated\n",
|
fprintf (sim_deb, ">>DA rwsc: Unit %d position %" T_ADDR_FMT "d %s disc command initiated\n",
|
||||||
unit, da_unit [unit].pos, dl_opcode_name (ICD, icd_cntlr [unit].opcode));
|
unit, da_unit [unit].pos, dl_opcode_name (ICD, icd_cntlr [unit].opcode));
|
||||||
else
|
else
|
||||||
fprintf (sim_deb, ">>DA rwsc: Unit %d %s command initiated\n",
|
fprintf (sim_deb, ">>DA rwsc: Unit %d %s command initiated\n",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* hp2100_dp.c: HP 2100 12557A/13210A disk simulator
|
/* hp2100_dp.c: HP 2100 12557A/13210A disk simulator
|
||||||
|
|
||||||
Copyright (c) 1993-2012, Robert M. Supnik
|
Copyright (c) 1993-2014, 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,6 +26,8 @@
|
||||||
DP 12557A 2871 disk subsystem
|
DP 12557A 2871 disk subsystem
|
||||||
13210A 7900 disk subsystem
|
13210A 7900 disk subsystem
|
||||||
|
|
||||||
|
30-Dec-14 JDB Added S-register parameters to ibl_copy
|
||||||
|
24-Dec-14 JDB Added casts for explicit downward conversions
|
||||||
18-Dec-12 MP Now calls sim_activate_time to get remaining seek time
|
18-Dec-12 MP Now calls sim_activate_time to get remaining seek time
|
||||||
09-May-12 JDB Separated assignments from conditional expressions
|
09-May-12 JDB Separated assignments from conditional expressions
|
||||||
10-Feb-12 JDB Deprecated DEVNO in favor of SC
|
10-Feb-12 JDB Deprecated DEVNO in favor of SC
|
||||||
|
@ -575,7 +577,8 @@ while (working_set) {
|
||||||
data = 0;
|
data = 0;
|
||||||
|
|
||||||
for (i = 0; i < DP_NUMDRV; i++) /* form attention register value */
|
for (i = 0; i < DP_NUMDRV; i++) /* form attention register value */
|
||||||
if (dpc_sta[i] & STA_ATN) data = data | (1 << i);
|
if (dpc_sta[i] & STA_ATN)
|
||||||
|
data = data | (uint16) (1 << i);
|
||||||
|
|
||||||
stat_data = IORETURN (SCPE_OK, data); /* merge in return status */
|
stat_data = IORETURN (SCPE_OK, data); /* merge in return status */
|
||||||
break;
|
break;
|
||||||
|
@ -950,7 +953,7 @@ switch (uptr->FNC) { /* case function */
|
||||||
break; /* done */
|
break; /* done */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dpxb[dp_ptr++] = dpd_wval? dpd_obuf: 0; /* store word/fill */
|
dpxb[dp_ptr++] = dpd_wval ? (uint16) dpd_obuf : 0; /* store word/fill */
|
||||||
dpd_wval = 0; /* clr data valid */
|
dpd_wval = 0; /* clr data valid */
|
||||||
if (dp_ptr >= DP_NUMWD) { /* buffer full? */
|
if (dp_ptr >= DP_NUMWD) { /* buffer full? */
|
||||||
da = GETDA (dpc_rarc, dpc_rarh, dpc_rars); /* calc disk addr */
|
da = GETDA (dpc_rarc, dpc_rarh, dpc_rars); /* calc disk addr */
|
||||||
|
@ -1181,12 +1184,15 @@ const BOOT_ROM dp_rom = {
|
||||||
|
|
||||||
t_stat dpc_boot (int32 unitno, DEVICE *dptr)
|
t_stat dpc_boot (int32 unitno, DEVICE *dptr)
|
||||||
{
|
{
|
||||||
int32 dev;
|
const int32 dev = dpd_dib.select_code; /* data chan select code */
|
||||||
|
|
||||||
if (unitno != 0) return SCPE_NOFNC; /* only unit 0 */
|
if (unitno != 0) /* boot supported on drive unit 0 only */
|
||||||
dev = dpd_dib.select_code; /* get data chan dev */
|
return SCPE_NOFNC; /* report "Command not allowed" if attempted */
|
||||||
if (ibl_copy (dp_rom, dev)) return SCPE_IERR; /* copy boot to memory */
|
|
||||||
SR = (SR & IBL_OPT) | IBL_DP | (dev << IBL_V_DEV); /* set SR */
|
if (ibl_copy (dp_rom, dev, IBL_OPT, /* copy the boot ROM to memory and configure */
|
||||||
if (sim_switches & SWMASK ('R')) SR = SR | IBL_DP_REM; /* boot from removable? */
|
IBL_DP | IBL_SET_SC (dev) /* the S register accordingly */
|
||||||
|
| (sim_switches & SWMASK ('R') ? IBL_DP_REM : 0)))
|
||||||
|
return SCPE_IERR; /* return an internal error if the copy failed */
|
||||||
|
else
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* hp2100_dq.c: HP 2100 12565A disk simulator
|
/* hp2100_dq.c: HP 2100 12565A disk simulator
|
||||||
|
|
||||||
Copyright (c) 1993-2006, Bill McDermith
|
Copyright (c) 1993-2006, Bill McDermith
|
||||||
Copyright (c) 2004-2012 J. David Bryan
|
Copyright (c) 2004-2014 J. David Bryan
|
||||||
|
|
||||||
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,6 +26,8 @@
|
||||||
|
|
||||||
DQ 12565A 2883 disk system
|
DQ 12565A 2883 disk system
|
||||||
|
|
||||||
|
30-Dec-14 JDB Added S-register parameters to ibl_copy
|
||||||
|
24-Dec-14 JDB Added casts for explicit downward conversions
|
||||||
18-Dec-12 MP Now calls sim_activate_time to get remaining seek time
|
18-Dec-12 MP Now calls sim_activate_time to get remaining seek time
|
||||||
09-May-12 JDB Separated assignments from conditional expressions
|
09-May-12 JDB Separated assignments from conditional expressions
|
||||||
10-Feb-12 JDB Deprecated DEVNO in favor of SC
|
10-Feb-12 JDB Deprecated DEVNO in favor of SC
|
||||||
|
@ -786,7 +788,7 @@ switch (uptr->FNC) { /* case function */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dqxb[dq_ptr++] = dqd_wval? dqd_obuf: 0; /* store word/fill */
|
dqxb[dq_ptr++] = dqd_wval ? (uint16) dqd_obuf : 0; /* store word/fill */
|
||||||
dqd_wval = 0; /* clr data valid */
|
dqd_wval = 0; /* clr data valid */
|
||||||
if (dq_ptr >= DQ_NUMWD) { /* buffer full? */
|
if (dq_ptr >= DQ_NUMWD) { /* buffer full? */
|
||||||
da = GETDA (dqc_rarc, dqc_rarh, dqc_rars); /* calc disk addr */
|
da = GETDA (dqc_rarc, dqc_rarh, dqc_rars); /* calc disk addr */
|
||||||
|
@ -962,11 +964,14 @@ const BOOT_ROM dq_rom = {
|
||||||
|
|
||||||
t_stat dqc_boot (int32 unitno, DEVICE *dptr)
|
t_stat dqc_boot (int32 unitno, DEVICE *dptr)
|
||||||
{
|
{
|
||||||
int32 dev;
|
const int32 dev = dqd_dib.select_code; /* data chan select code */
|
||||||
|
|
||||||
if (unitno != 0) return SCPE_NOFNC; /* only unit 0 */
|
if (unitno != 0) /* boot supported on drive unit 0 only */
|
||||||
dev = dqd_dib.select_code; /* get data chan dev */
|
return SCPE_NOFNC; /* report "Command not allowed" if attempted */
|
||||||
if (ibl_copy (dq_rom, dev)) return SCPE_IERR; /* copy boot to memory */
|
|
||||||
SR = (SR & IBL_OPT) | IBL_DQ | (dev << IBL_V_DEV); /* set SR */
|
if (ibl_copy (dq_rom, dev, IBL_OPT, /* copy the boot ROM to memory and configure */
|
||||||
|
IBL_DQ | IBL_SET_SC (dev))) /* the S register accordingly */
|
||||||
|
return SCPE_IERR; /* return an internal error if the copy failed */
|
||||||
|
else
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* hp2100_dr.c: HP 2100 12606B/12610B fixed head disk/drum simulator
|
/* hp2100_dr.c: HP 2100 12606B/12610B fixed head disk/drum simulator
|
||||||
|
|
||||||
Copyright (c) 1993-2012, Robert M. Supnik
|
Copyright (c) 1993-2014, 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,6 +26,8 @@
|
||||||
DR 12606B 2770/2771 fixed head disk
|
DR 12606B 2770/2771 fixed head disk
|
||||||
12610B 2773/2774/2775 drum
|
12610B 2773/2774/2775 drum
|
||||||
|
|
||||||
|
30-Dec-14 JDB Added S-register parameters to ibl_copy
|
||||||
|
24-Dec-14 JDB Added casts for explicit downward conversions
|
||||||
10-Feb-12 JDB Deprecated DEVNO in favor of SC
|
10-Feb-12 JDB Deprecated DEVNO in favor of SC
|
||||||
28-Mar-11 JDB Tidied up signal handling
|
28-Mar-11 JDB Tidied up signal handling
|
||||||
26-Oct-10 JDB Changed I/O signal handler for revised signal model
|
26-Oct-10 JDB Changed I/O signal handler for revised signal model
|
||||||
|
@ -466,14 +468,14 @@ while (working_set) {
|
||||||
|
|
||||||
|
|
||||||
case ioIOI: /* I/O data input */
|
case ioIOI: /* I/O data input */
|
||||||
data = drc_sta; /* static bits */
|
data = (uint16) drc_sta; /* static bits */
|
||||||
|
|
||||||
if (!(drc_unit.flags & UNIT_PROT) || /* not protected? */
|
if (!(drc_unit.flags & UNIT_PROT) || /* not protected? */
|
||||||
(CW_GETTRK(drc_cw) >= drc_pcount)) /* or not in range? */
|
(CW_GETTRK(drc_cw) >= drc_pcount)) /* or not in range? */
|
||||||
data = data | DRS_WEN; /* set wrt enb status */
|
data = data | DRS_WEN; /* set wrt enb status */
|
||||||
|
|
||||||
if (drc_unit.flags & UNIT_ATT) { /* attached? */
|
if (drc_unit.flags & UNIT_ATT) { /* attached? */
|
||||||
data = data | (dr_seccntr (sim_gtime()) << DRS_V_NS) | DRS_RDY;
|
data = data | (uint16) (dr_seccntr (sim_gtime()) << DRS_V_NS) | DRS_RDY;
|
||||||
if (sim_is_active (&drc_unit)) /* op in progress? */
|
if (sim_is_active (&drc_unit)) /* op in progress? */
|
||||||
data = data | DRS_BSY;
|
data = data | DRS_BSY;
|
||||||
if (CALC_SCP (sim_gtime())) /* SCP ff set? */
|
if (CALC_SCP (sim_gtime())) /* SCP ff set? */
|
||||||
|
@ -528,7 +530,7 @@ drc_run = 1; /* set run ff */
|
||||||
|
|
||||||
if (drc_cw & CW_WR) { /* write? */
|
if (drc_cw & CW_WR) { /* write? */
|
||||||
if ((da < uptr->capac) && (sec < DR_NUMSC)) {
|
if ((da < uptr->capac) && (sec < DR_NUMSC)) {
|
||||||
bptr[da + drd_ptr] = drd_obuf;
|
bptr[da + drd_ptr] = (uint16) drd_obuf;
|
||||||
if (((uint32) (da + drd_ptr)) >= uptr->hwmark)
|
if (((uint32) (da + drd_ptr)) >= uptr->hwmark)
|
||||||
uptr->hwmark = da + drd_ptr + 1;
|
uptr->hwmark = da + drd_ptr + 1;
|
||||||
}
|
}
|
||||||
|
@ -540,7 +542,7 @@ if (drc_cw & CW_WR) { /* write? */
|
||||||
else { /* done */
|
else { /* done */
|
||||||
if (drd_ptr) /* need to fill? */
|
if (drd_ptr) /* need to fill? */
|
||||||
for ( ; drd_ptr < DR_NUMWD; drd_ptr++)
|
for ( ; drd_ptr < DR_NUMWD; drd_ptr++)
|
||||||
bptr[da + drd_ptr] = drd_obuf; /* fill with last word */
|
bptr[da + drd_ptr] = (uint16) drd_obuf; /* fill with last word */
|
||||||
if (!(drc_unit.flags & UNIT_DRUM)) /* disk? */
|
if (!(drc_unit.flags & UNIT_DRUM)) /* disk? */
|
||||||
drc_sta = drc_sta | DRS_PER; /* parity bit sets on write */
|
drc_sta = drc_sta | DRS_PER; /* parity bit sets on write */
|
||||||
drc_run = 0; /* clear run ff */
|
drc_run = 0; /* clear run ff */
|
||||||
|
@ -735,13 +737,15 @@ t_stat drc_boot (int32 unitno, DEVICE *dptr)
|
||||||
{
|
{
|
||||||
const int32 dev = drd_dib.select_code; /* data chan select code */
|
const int32 dev = drd_dib.select_code; /* data chan select code */
|
||||||
|
|
||||||
if (unitno != 0) /* only unit 0 */
|
if (unitno != 0) /* boot supported on drive unit 0 only */
|
||||||
return SCPE_NOFNC;
|
return SCPE_NOFNC; /* report "Command not allowed" if attempted */
|
||||||
if (ibl_copy (dr_rom, dev)) /* copy boot to memory */
|
|
||||||
return SCPE_IERR;
|
if (ibl_copy (dr_rom, dev, IBL_S_NOCLR, IBL_S_NOSET)) /* copy the boot ROM to memory and configure */
|
||||||
|
return SCPE_IERR; /* return an internal error if the copy failed */
|
||||||
|
|
||||||
WritePW (PC + IBL_DPC, dr_rom [IBL_DPC]); /* restore overwritten word */
|
WritePW (PC + IBL_DPC, dr_rom [IBL_DPC]); /* restore overwritten word */
|
||||||
WritePW (PC + IBL_END, dr_rom [IBL_END]); /* restore overwritten word */
|
WritePW (PC + IBL_END, dr_rom [IBL_END]); /* restore overwritten word */
|
||||||
PC = PC + BOOT_START; /* correct starting address */
|
PC = PC + BOOT_START; /* correct starting address */
|
||||||
|
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* hp2100_ds.c: HP 13037D/13175D disc controller/interface simulator
|
/* hp2100_ds.c: HP 13037D/13175D disc controller/interface simulator
|
||||||
|
|
||||||
Copyright (c) 2004-2012, Robert M. Supnik
|
Copyright (c) 2004-2012, Robert M. Supnik
|
||||||
Copyright (c) 2012-2013 J. David Bryan
|
Copyright (c) 2012-2014 J. David Bryan
|
||||||
|
|
||||||
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,6 +26,8 @@
|
||||||
|
|
||||||
DS 13037D/13175D disc controller/interface
|
DS 13037D/13175D disc controller/interface
|
||||||
|
|
||||||
|
30-Dec-14 JDB Added S-register parameters to ibl_copy
|
||||||
|
24-Dec-14 JDB Use T_ADDR_FMT with t_addr values for 64-bit compatibility
|
||||||
18-Mar-13 JDB Fixed poll_drives definition to match declaration
|
18-Mar-13 JDB Fixed poll_drives definition to match declaration
|
||||||
24-Oct-12 JDB Changed CNTLR_OPCODE to title case to avoid name clash
|
24-Oct-12 JDB Changed CNTLR_OPCODE to title case to avoid name clash
|
||||||
29-Mar-12 JDB Rewritten to use the MAC/ICD disc controller library
|
29-Mar-12 JDB Rewritten to use the MAC/ICD disc controller library
|
||||||
|
@ -1168,12 +1170,11 @@ t_stat ds_boot (int32 unitno, DEVICE *dptr)
|
||||||
if (unitno != 0) /* boot supported on drive unit 0 only */
|
if (unitno != 0) /* boot supported on drive unit 0 only */
|
||||||
return SCPE_NOFNC; /* report "Command not allowed" if attempted */
|
return SCPE_NOFNC; /* report "Command not allowed" if attempted */
|
||||||
|
|
||||||
if (ibl_copy (ds_rom, ds_dib.select_code)) /* copy the boot ROM to memory and configure */
|
if (ibl_copy (ds_rom, ds_dib.select_code, /* copy the boot ROM to memory and configure */
|
||||||
|
IBL_OPT | IBL_DS_HEAD, /* the S register accordingly */
|
||||||
|
IBL_DS | IBL_MAN | IBL_SET_SC (ds_dib.select_code)))
|
||||||
return SCPE_IERR; /* return an internal error if the copy failed */
|
return SCPE_IERR; /* return an internal error if the copy failed */
|
||||||
|
else
|
||||||
SR = SR & (IBL_OPT | IBL_DS_HEAD) /* set S to a reasonable value */
|
|
||||||
| IBL_DS | IBL_MAN | (ds_dib.select_code << IBL_V_DEV); /* before boot execution */
|
|
||||||
|
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1282,7 +1283,7 @@ if (uptr) { /* did the command start
|
||||||
if (unit > DL_MAXDRIVE)
|
if (unit > DL_MAXDRIVE)
|
||||||
fputs ("Controller ", sim_deb);
|
fputs ("Controller ", sim_deb);
|
||||||
else
|
else
|
||||||
fprintf (sim_deb, "Unit %d position %d ", unit, uptr->pos);
|
fprintf (sim_deb, "Unit %d position %" T_ADDR_FMT "d ", unit, uptr->pos);
|
||||||
|
|
||||||
fprintf (sim_deb, "%s command initiated\n",
|
fprintf (sim_deb, "%s command initiated\n",
|
||||||
dl_opcode_name (MAC, mac_cntlr.opcode));
|
dl_opcode_name (MAC, mac_cntlr.opcode));
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* hp2100_fp.c: HP 2100 floating point instructions
|
/* hp2100_fp.c: HP 2100 floating point instructions
|
||||||
|
|
||||||
Copyright (c) 2002-2008, Robert M. Supnik
|
Copyright (c) 2002-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,7 @@
|
||||||
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.
|
||||||
|
|
||||||
|
03-Jan-15 JDB Made the utility routines static
|
||||||
21-Jan-08 JDB Corrected fp_unpack mantissa high-word return
|
21-Jan-08 JDB Corrected fp_unpack mantissa high-word return
|
||||||
(from Mark Pizzolato)
|
(from Mark Pizzolato)
|
||||||
01-Dec-06 JDB Reworked FFP helpers for 1000-F support, deleted f_pwr2
|
01-Dec-06 JDB Reworked FFP helpers for 1000-F support, deleted f_pwr2
|
||||||
|
@ -124,11 +125,12 @@ struct ufp { /* unpacked fp */
|
||||||
|
|
||||||
#define FR_NEG(v) ((~(v) + 1) & DMASK32)
|
#define FR_NEG(v) ((~(v) + 1) & DMASK32)
|
||||||
|
|
||||||
uint32 UnpackFP (struct ufp *fop, uint32 opnd);
|
/* Utility routines */
|
||||||
void NegFP (struct ufp *fop);
|
|
||||||
void NormFP (struct ufp *fop);
|
static uint32 UnpackFP (struct ufp *fop, uint32 opnd);
|
||||||
uint32 PackFP (struct ufp *fop);
|
static void NormFP (struct ufp *fop);
|
||||||
uint32 StoreFP (struct ufp *fop);
|
static uint32 PackFP (struct ufp *fop);
|
||||||
|
static uint32 StoreFP (struct ufp *fop);
|
||||||
|
|
||||||
/* Floating to integer conversion */
|
/* Floating to integer conversion */
|
||||||
|
|
||||||
|
@ -240,7 +242,7 @@ return StoreFP (&res); /* store */
|
||||||
|
|
||||||
/* Floating point divide - reverse engineered from diagnostic */
|
/* Floating point divide - reverse engineered from diagnostic */
|
||||||
|
|
||||||
uint32 divx (uint32 ba, uint32 dvr, uint32 *rem)
|
static uint32 divx (uint32 ba, uint32 dvr, uint32 *rem)
|
||||||
{
|
{
|
||||||
int32 sdvd = 0, sdvr = 0;
|
int32 sdvd = 0, sdvr = 0;
|
||||||
uint32 q, r;
|
uint32 q, r;
|
||||||
|
@ -295,7 +297,7 @@ return StoreFP (&quo); /* store result */
|
||||||
|
|
||||||
/* Unpack operand */
|
/* Unpack operand */
|
||||||
|
|
||||||
uint32 UnpackFP (struct ufp *fop, uint32 opnd)
|
static uint32 UnpackFP (struct ufp *fop, uint32 opnd)
|
||||||
{
|
{
|
||||||
fop->fr = opnd & FP_FR; /* get frac */
|
fop->fr = opnd & FP_FR; /* get frac */
|
||||||
fop->exp = FP_GETEXP (opnd); /* get exp */
|
fop->exp = FP_GETEXP (opnd); /* get exp */
|
||||||
|
@ -305,7 +307,7 @@ return FP_GETSIGN (opnd); /* return sign */
|
||||||
|
|
||||||
/* Normalize unpacked floating point number */
|
/* Normalize unpacked floating point number */
|
||||||
|
|
||||||
void NormFP (struct ufp *fop)
|
static void NormFP (struct ufp *fop)
|
||||||
{
|
{
|
||||||
if (fop->fr) { /* any fraction? */
|
if (fop->fr) { /* any fraction? */
|
||||||
uint32 test = (fop->fr >> 1) & FP_NORM;
|
uint32 test = (fop->fr >> 1) & FP_NORM;
|
||||||
|
@ -320,7 +322,7 @@ return;
|
||||||
|
|
||||||
/* Pack fp number */
|
/* Pack fp number */
|
||||||
|
|
||||||
uint32 PackFP (struct ufp *fop)
|
static uint32 PackFP (struct ufp *fop)
|
||||||
{
|
{
|
||||||
return (fop->fr & FP_FR) | /* merge frac */
|
return (fop->fr & FP_FR) | /* merge frac */
|
||||||
((fop->exp & FP_M_EXP) << FP_V_EXP) | /* and exp */
|
((fop->exp & FP_M_EXP) << FP_V_EXP) | /* and exp */
|
||||||
|
@ -329,7 +331,7 @@ return (fop->fr & FP_FR) | /* merge frac */
|
||||||
|
|
||||||
/* Round fp number, store, generate overflow */
|
/* Round fp number, store, generate overflow */
|
||||||
|
|
||||||
uint32 StoreFP (struct ufp *fop)
|
static uint32 StoreFP (struct ufp *fop)
|
||||||
{
|
{
|
||||||
uint32 sign, svfr, hi, ov = 0;
|
uint32 sign, svfr, hi, ov = 0;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* hp2100_fp1.c: HP 1000 multiple-precision floating point routines
|
/* hp2100_fp1.c: HP 1000 multiple-precision floating point routines
|
||||||
|
|
||||||
Copyright (c) 2005-2013, J. David Bryan
|
Copyright (c) 2005-2014, J. David Bryan
|
||||||
|
|
||||||
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 @@
|
||||||
in advertising or otherwise to promote the sale, use or other dealings in
|
in advertising or otherwise to promote the sale, use or other dealings in
|
||||||
this Software without prior written authorization from the author.
|
this Software without prior written authorization from the author.
|
||||||
|
|
||||||
|
24-Dec-14 JDB Added casts for explicit downward conversions
|
||||||
|
Changed fp_ucom return from uint32 to uint16
|
||||||
18-Mar-13 JDB Changed type of mantissa masks array to to unsigned
|
18-Mar-13 JDB Changed type of mantissa masks array to to unsigned
|
||||||
06-Feb-12 JDB Added missing precision on constant "one" in fp_trun
|
06-Feb-12 JDB Added missing precision on constant "one" in fp_trun
|
||||||
21-Jun-11 JDB Completed the comments for divide; no code changes
|
21-Jun-11 JDB Completed the comments for divide; no code changes
|
||||||
|
@ -510,8 +512,8 @@ uint8 exp;
|
||||||
|
|
||||||
packed = pack_int (unpacked.mantissa, unpacked.precision); /* pack mantissa */
|
packed = pack_int (unpacked.mantissa, unpacked.precision); /* pack mantissa */
|
||||||
|
|
||||||
exp = ((uint8) unpacked.exponent << FP_V_EXP) | /* rotate exponent */
|
exp = (uint8) (unpacked.exponent << FP_V_EXP | /* rotate exponent */
|
||||||
((unpacked.exponent < 0) << FP_V_ESIGN);
|
(unpacked.exponent < 0) << FP_V_ESIGN);
|
||||||
|
|
||||||
switch (unpacked.precision) { /* merge exponent into correct word */
|
switch (unpacked.precision) { /* merge exponent into correct word */
|
||||||
|
|
||||||
|
@ -527,8 +529,8 @@ switch (unpacked.precision) { /* merge exponent into c
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case fp_e: /* place in separate word */
|
case fp_e: /* place in separate word */
|
||||||
packed.fpk[4] = ((uint16) unpacked.exponent << FP_V_EXP) |
|
packed.fpk[4] = (uint16) (unpacked.exponent << FP_V_EXP |
|
||||||
((unpacked.exponent < 0) << FP_V_ESIGN);
|
(unpacked.exponent < 0) << FP_V_ESIGN);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case fp_a: /* no action for value in accum */
|
case fp_a: /* no action for value in accum */
|
||||||
|
@ -970,12 +972,12 @@ else {
|
||||||
|
|
||||||
div = ah >> 2; /* ASR 2 to prevent overflow */
|
div = ah >> 2; /* ASR 2 to prevent overflow */
|
||||||
|
|
||||||
pq1 = div / dh; /* form first partial quotient */
|
pq1 = (int16) (div / dh); /* form first partial quotient */
|
||||||
div = ((div % dh) & ~1) << 15; /* ASR 1, move rem to upper */
|
div = ((div % dh) & ~1) << 15; /* ASR 1, move rem to upper */
|
||||||
pq2 = div / dh; /* form second partial quotient */
|
pq2 = (int16) (div / dh); /* form second partial quotient */
|
||||||
|
|
||||||
div = (uint16) dl << 13; /* move divisor LSB to upper, LSR 3 */
|
div = (uint16) dl << 13; /* move divisor LSB to upper, LSR 3 */
|
||||||
cq = div / dh; /* form correction quotient */
|
cq = (int16) (div / dh); /* form correction quotient */
|
||||||
cp = -cq * pq1; /* and correction product */
|
cp = -cq * pq1; /* and correction product */
|
||||||
|
|
||||||
cp = (((cp >> 14) & ~3) + (int32) pq2) << 1; /* add corr prod and 2nd partial quo */
|
cp = (((cp >> 14) & ~3) + (int32) pq2) << 1; /* add corr prod and 2nd partial quo */
|
||||||
|
@ -1392,7 +1394,7 @@ return 0;
|
||||||
significant in the mantissa.
|
significant in the mantissa.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
uint32 fp_ucom (OP *mantissa, OPSIZE precision)
|
uint16 fp_ucom (OP *mantissa, OPSIZE precision)
|
||||||
{
|
{
|
||||||
FPU unpacked;
|
FPU unpacked;
|
||||||
|
|
||||||
|
@ -1401,7 +1403,7 @@ unpacked.exponent = 0; /* clear undefined expon
|
||||||
unpacked.precision = precision; /* set precision */
|
unpacked.precision = precision; /* set precision */
|
||||||
complement (&unpacked); /* negate it */
|
complement (&unpacked); /* negate it */
|
||||||
*mantissa = pack_int (unpacked.mantissa, precision); /* replace mantissa */
|
*mantissa = pack_int (unpacked.mantissa, precision); /* replace mantissa */
|
||||||
return (uint32) unpacked.exponent; /* return exponent increment */
|
return (uint16) unpacked.exponent; /* return exponent increment */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* hp2100_fp1.h: HP 2100/1000 multiple-precision floating point definitions
|
/* hp2100_fp1.h: HP 2100/1000 multiple-precision floating point definitions
|
||||||
|
|
||||||
Copyright (c) 2005-2013, J. David Bryan
|
Copyright (c) 2005-2014, J. David Bryan
|
||||||
|
|
||||||
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,7 @@
|
||||||
in advertising or otherwise to promote the sale, use or other dealings in
|
in advertising or otherwise to promote the sale, use or other dealings in
|
||||||
this Software without prior written authorization from the author.
|
this Software without prior written authorization from the author.
|
||||||
|
|
||||||
|
24-Dec-14 JDB Changed fp_ucom return from uint32 to uint16
|
||||||
14-Mar-13 MP Changed guard macro name to avoid reserved namespace
|
14-Mar-13 MP Changed guard macro name to avoid reserved namespace
|
||||||
16-Oct-06 JDB Generalized FP calling sequences for F-Series
|
16-Oct-06 JDB Generalized FP calling sequences for F-Series
|
||||||
12-Oct-06 JDB Altered x_trun for F-Series FFP compatibility
|
12-Oct-06 JDB Altered x_trun for F-Series FFP compatibility
|
||||||
|
@ -46,7 +47,7 @@ OP fp_accum (const OP *operand, OPSIZE precision);
|
||||||
uint32 fp_pack (OP *result, OP mantissa, int32 exponent, OPSIZE precision);
|
uint32 fp_pack (OP *result, OP mantissa, int32 exponent, OPSIZE precision);
|
||||||
uint32 fp_nrpack (OP *result, OP mantissa, int32 exponent, OPSIZE precision);
|
uint32 fp_nrpack (OP *result, OP mantissa, int32 exponent, OPSIZE precision);
|
||||||
uint32 fp_unpack (OP *mantissa, int32 *exponent, OP packed, OPSIZE precision);
|
uint32 fp_unpack (OP *mantissa, int32 *exponent, OP packed, OPSIZE precision);
|
||||||
uint32 fp_ucom (OP *mantissa, OPSIZE precision);
|
uint16 fp_ucom (OP *mantissa, OPSIZE precision);
|
||||||
uint32 fp_pcom (OP *packed, OPSIZE precision);
|
uint32 fp_pcom (OP *packed, OPSIZE precision);
|
||||||
uint32 fp_trun (OP *result, OP source, OPSIZE precision);
|
uint32 fp_trun (OP *result, OP source, OPSIZE precision);
|
||||||
uint32 fp_cvt (OP *result, OPSIZE source_precision, OPSIZE dest_precision);
|
uint32 fp_cvt (OP *result, OPSIZE source_precision, OPSIZE dest_precision);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* hp2100_ipl.c: HP 2000 interprocessor link simulator
|
/* hp2100_ipl.c: HP 2000 interprocessor link simulator
|
||||||
|
|
||||||
Copyright (c) 2002-2012, Robert M Supnik
|
Copyright (c) 2002-2014, 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,6 +25,7 @@
|
||||||
|
|
||||||
IPLI, IPLO 12875A interprocessor link
|
IPLI, IPLO 12875A interprocessor link
|
||||||
|
|
||||||
|
30-Dec-14 JDB Added S-register parameters to ibl_copy
|
||||||
12-Dec-12 MP Revised ipl_attach for new socket API
|
12-Dec-12 MP Revised ipl_attach for new socket API
|
||||||
25-Oct-12 JDB Removed DEV_NET to allow restoration of listening ports
|
25-Oct-12 JDB Removed DEV_NET to allow restoration of listening ports
|
||||||
09-May-12 JDB Separated assignments from conditional expressions
|
09-May-12 JDB Separated assignments from conditional expressions
|
||||||
|
@ -647,8 +648,8 @@ if (sim_switches & SWMASK ('W')) { /* wait? */
|
||||||
printf ("Waiting for connnection\n");
|
printf ("Waiting for connnection\n");
|
||||||
sim_os_sleep (1); /* sleep 1 sec */
|
sim_os_sleep (1); /* sleep 1 sec */
|
||||||
}
|
}
|
||||||
if (t)
|
if (t) /* if connected (set by "ipl_check_conn" above) */
|
||||||
printf ("Connection established\n");
|
printf ("Connection established\n"); /* then report */
|
||||||
}
|
}
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
@ -789,8 +790,10 @@ t_stat ipl_boot (int32 unitno, DEVICE *dptr)
|
||||||
const int32 devi = ipli_dib.select_code;
|
const int32 devi = ipli_dib.select_code;
|
||||||
const int32 devp = ptr_dib.select_code;
|
const int32 devp = ptr_dib.select_code;
|
||||||
|
|
||||||
ibl_copy (ipl_rom, devi); /* copy bootstrap to memory */
|
if (ibl_copy (ipl_rom, devi, IBL_S_CLR, /* copy the boot ROM to memory and configure */
|
||||||
SR = (devi << IBL_V_DEV) | devp; /* set SR */
|
IBL_SET_SC (devi) | devp)) /* the S register accordingly */
|
||||||
|
return SCPE_IERR; /* return an internal error if the copy failed */
|
||||||
|
|
||||||
WritePW (PC + MAX_BASE, (~PC + 1) & DMASK); /* fix ups */
|
WritePW (PC + MAX_BASE, (~PC + 1) & DMASK); /* fix ups */
|
||||||
WritePW (PC + IPL_PNTR, ipl_rom [IPL_PNTR] | PC);
|
WritePW (PC + IPL_PNTR, ipl_rom [IPL_PNTR] | PC);
|
||||||
WritePW (PC + PTR_PNTR, ipl_rom [PTR_PNTR] | PC);
|
WritePW (PC + PTR_PNTR, ipl_rom [PTR_PNTR] | PC);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* hp2100_mpx.c: HP 12792C eight-channel asynchronous multiplexer simulator
|
/* hp2100_mpx.c: HP 12792C eight-channel asynchronous multiplexer simulator
|
||||||
|
|
||||||
Copyright (c) 2008-2013, J. David Bryan
|
Copyright (c) 2008-2014, J. David Bryan
|
||||||
|
|
||||||
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,6 +25,7 @@
|
||||||
|
|
||||||
MPX 12792C 8-channel multiplexer card
|
MPX 12792C 8-channel multiplexer card
|
||||||
|
|
||||||
|
24-Dec-14 JDB Added casts for explicit downward conversions
|
||||||
10-Jan-13 MP Added DEV_MUX and additional DEVICE field values
|
10-Jan-13 MP Added DEV_MUX and additional DEVICE field values
|
||||||
28-Dec-12 JDB Allow direct attach to the poll unit only when restoring
|
28-Dec-12 JDB Allow direct attach to the poll unit only when restoring
|
||||||
10-Feb-12 JDB Deprecated DEVNO in favor of SC
|
10-Feb-12 JDB Deprecated DEVNO in favor of SC
|
||||||
|
@ -547,7 +548,7 @@ typedef enum { get, put } BUF_SELECT; /* buffer selector */
|
||||||
static const char *const io_op [] = { "read", /* operation names */
|
static const char *const io_op [] = { "read", /* operation names */
|
||||||
"write" };
|
"write" };
|
||||||
|
|
||||||
static const uint32 buf_size [] = { RD_BUF_SIZE, /* buffer sizes */
|
static const uint16 buf_size [] = { RD_BUF_SIZE, /* buffer sizes */
|
||||||
WR_BUF_SIZE };
|
WR_BUF_SIZE };
|
||||||
|
|
||||||
static uint32 emptying_flags [2]; /* buffer emptying flags [IO_OPER] */
|
static uint32 emptying_flags [2]; /* buffer emptying flags [IO_OPER] */
|
||||||
|
@ -581,7 +582,7 @@ static void buf_remove (IO_OPER rw, uint32 port);
|
||||||
static void buf_term (IO_OPER rw, uint32 port, uint8 header);
|
static void buf_term (IO_OPER rw, uint32 port, uint8 header);
|
||||||
static void buf_free (IO_OPER rw, uint32 port);
|
static void buf_free (IO_OPER rw, uint32 port);
|
||||||
static void buf_cancel (IO_OPER rw, uint32 port, BUF_SELECT which);
|
static void buf_cancel (IO_OPER rw, uint32 port, BUF_SELECT which);
|
||||||
static uint32 buf_len (IO_OPER rw, uint32 port, BUF_SELECT which);
|
static uint16 buf_len (IO_OPER rw, uint32 port, BUF_SELECT which);
|
||||||
static uint32 buf_avail (IO_OPER rw, uint32 port);
|
static uint32 buf_avail (IO_OPER rw, uint32 port);
|
||||||
|
|
||||||
|
|
||||||
|
@ -1101,8 +1102,8 @@ switch (mpx_cmd) {
|
||||||
case UI_RDBUF_AVAIL: /* read buffer notification */
|
case UI_RDBUF_AVAIL: /* read buffer notification */
|
||||||
mpx_flags [mpx_port] &= ~FL_HAVEBUF; /* clear flag */
|
mpx_flags [mpx_port] &= ~FL_HAVEBUF; /* clear flag */
|
||||||
|
|
||||||
mpx_ibuf = buf_get (ioread, mpx_port) << 8 | /* get header value and position */
|
mpx_ibuf = (uint16) (buf_get (ioread, mpx_port) << 8 | /* get header value and position */
|
||||||
buf_len (ioread, mpx_port, get); /* and include buffer length */
|
buf_len (ioread, mpx_port, get)); /* and include buffer length */
|
||||||
|
|
||||||
if (mpx_flags [mpx_port] & FL_RDOVFLOW) { /* did a buffer overflow? */
|
if (mpx_flags [mpx_port] & FL_RDOVFLOW) { /* did a buffer overflow? */
|
||||||
mpx_ibuf = mpx_ibuf | RS_OVERFLOW; /* report it */
|
mpx_ibuf = mpx_ibuf | RS_OVERFLOW; /* report it */
|
||||||
|
@ -1184,9 +1185,9 @@ switch (mpx_cmd) {
|
||||||
case CMD_SET_KEY: /* set port key and configuration */
|
case CMD_SET_KEY: /* set port key and configuration */
|
||||||
port = GET_PORT (mpx_param); /* get target port number */
|
port = GET_PORT (mpx_param); /* get target port number */
|
||||||
mpx_key [port] = (uint8) mpx_portkey; /* set port key */
|
mpx_key [port] = (uint8) mpx_portkey; /* set port key */
|
||||||
mpx_config [port] = mpx_param; /* set port configuration word */
|
mpx_config [port] = (uint16) mpx_param; /* set port configuration word */
|
||||||
|
|
||||||
svc_time = service_time (mpx_param); /* get service time for baud rate */
|
svc_time = service_time (mpx_config [port]); /* get service time for baud rate */
|
||||||
|
|
||||||
if (svc_time) /* want to change? */
|
if (svc_time) /* want to change? */
|
||||||
mpx_unit [port].wait = svc_time; /* set service time */
|
mpx_unit [port].wait = svc_time; /* set service time */
|
||||||
|
@ -1199,7 +1200,7 @@ switch (mpx_cmd) {
|
||||||
port = key_to_port (mpx_portkey); /* get port */
|
port = key_to_port (mpx_portkey); /* get port */
|
||||||
|
|
||||||
if (port >= 0) /* port defined? */
|
if (port >= 0) /* port defined? */
|
||||||
mpx_rcvtype [port] = mpx_param; /* save port receive type */
|
mpx_rcvtype [port] = (uint16) mpx_param; /* save port receive type */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1207,7 +1208,7 @@ switch (mpx_cmd) {
|
||||||
port = key_to_port (mpx_portkey); /* get port */
|
port = key_to_port (mpx_portkey); /* get port */
|
||||||
|
|
||||||
if (port >= 0) /* port defined? */
|
if (port >= 0) /* port defined? */
|
||||||
mpx_charcnt [port] = mpx_param; /* save port character count */
|
mpx_charcnt [port] = (uint16) mpx_param; /* save port character count */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1382,7 +1383,7 @@ switch (mpx_state) { /* dispatch
|
||||||
if (mpx_uien == TRUE) { /* interrupts enabled? */
|
if (mpx_uien == TRUE) { /* interrupts enabled? */
|
||||||
mpx_port = GET_UIPORT (mpx_uicode); /* get port number */
|
mpx_port = GET_UIPORT (mpx_uicode); /* get port number */
|
||||||
mpx_portkey = mpx_key [mpx_port]; /* get port key */
|
mpx_portkey = mpx_key [mpx_port]; /* get port key */
|
||||||
mpx_ibuf = mpx_uicode & UI_REASON | mpx_portkey; /* report UI reason and port key */
|
mpx_ibuf = (uint16) (mpx_uicode & UI_REASON | mpx_portkey); /* report UI reason and port key */
|
||||||
set_flag = TRUE; /* reissue host interrupt */
|
set_flag = TRUE; /* reissue host interrupt */
|
||||||
mpx_uien = FALSE; /* disable UI */
|
mpx_uien = FALSE; /* disable UI */
|
||||||
|
|
||||||
|
@ -1417,7 +1418,7 @@ switch (mpx_state) { /* dispatch
|
||||||
|
|
||||||
if (mpx_uicode) { /* UI to send? */
|
if (mpx_uicode) { /* UI to send? */
|
||||||
mpx_port = i; /* set port number for Acknowledge */
|
mpx_port = i; /* set port number for Acknowledge */
|
||||||
mpx_ibuf = mpx_uicode | mpx_portkey; /* merge UI reason and port key */
|
mpx_ibuf = (uint16) (mpx_uicode | mpx_portkey); /* merge UI reason and port key */
|
||||||
mpx_uicode = mpx_uicode | mpx_port; /* save UI reason and port */
|
mpx_uicode = mpx_uicode | mpx_port; /* save UI reason and port */
|
||||||
set_flag = TRUE; /* interrupt host */
|
set_flag = TRUE; /* interrupt host */
|
||||||
mpx_uien = FALSE; /* disable UI */
|
mpx_uien = FALSE; /* disable UI */
|
||||||
|
@ -1498,7 +1499,7 @@ switch (mpx_state) { /* dispatch
|
||||||
buf_put (iowrite, mpx_port, LF); /* add LF to buffer */
|
buf_put (iowrite, mpx_port, LF); /* add LF to buffer */
|
||||||
}
|
}
|
||||||
|
|
||||||
buf_term (iowrite, mpx_port, mpx_param >> 8); /* terminate buffer */
|
buf_term (iowrite, mpx_port, (uint8) (mpx_param >> 8)); /* terminate buffer */
|
||||||
mpx_iolen = -1; /* mark as done */
|
mpx_iolen = -1; /* mark as done */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1541,7 +1542,7 @@ switch (mpx_state) { /* dispatch
|
||||||
if (i) /* high or low byte? */
|
if (i) /* high or low byte? */
|
||||||
mpx_ibuf = mpx_ibuf | ch; /* low byte */
|
mpx_ibuf = mpx_ibuf | ch; /* low byte */
|
||||||
else
|
else
|
||||||
mpx_ibuf = ch << 8; /* high byte */
|
mpx_ibuf = (uint16) (ch << 8); /* high byte */
|
||||||
|
|
||||||
mpx_iolen = mpx_iolen - 1; /* drop count */
|
mpx_iolen = mpx_iolen - 1; /* drop count */
|
||||||
}
|
}
|
||||||
|
@ -1733,8 +1734,11 @@ while (xmit_loop && (buf_len (iowrite, port, get) > 0)) { /* character availab
|
||||||
|
|
||||||
/* Reception service */
|
/* Reception service */
|
||||||
|
|
||||||
while (recv_loop && /* OK to process? */
|
while (recv_loop) { /* OK to process? */
|
||||||
(chx = tmxr_getc_ln (&mpx_ldsc [port]))) { /* and new char available? */
|
chx = tmxr_getc_ln (&mpx_ldsc [port]); /* get a new character */
|
||||||
|
|
||||||
|
if (chx == 0) /* if there are no more characters available */
|
||||||
|
break; /* then quit the reception loop */
|
||||||
|
|
||||||
if (chx & SCPE_BREAK) { /* break detected? */
|
if (chx & SCPE_BREAK) { /* break detected? */
|
||||||
mpx_flags [port] |= FL_BREAK; /* set break status */
|
mpx_flags [port] |= FL_BREAK; /* set break status */
|
||||||
|
@ -1748,7 +1752,7 @@ while (recv_loop && /* OK to process? */
|
||||||
continue; /* discard NUL that accompanied BREAK */
|
continue; /* discard NUL that accompanied BREAK */
|
||||||
}
|
}
|
||||||
|
|
||||||
ch = chx & data_mask; /* mask to bits per char */
|
ch = (uint8) (chx & data_mask); /* mask to bits per char */
|
||||||
|
|
||||||
if ((ch == XOFF) && /* XOFF? */
|
if ((ch == XOFF) && /* XOFF? */
|
||||||
(mpx_flowcntl [port] & FC_XONXOFF)) { /* and handshaking enabled? */
|
(mpx_flowcntl [port] & FC_XONXOFF)) { /* and handshaking enabled? */
|
||||||
|
@ -1822,7 +1826,7 @@ while (recv_loop && /* OK to process? */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uptr->flags & UNIT_CAPSLOCK) /* caps lock mode? */
|
if (uptr->flags & UNIT_CAPSLOCK) /* caps lock mode? */
|
||||||
ch = toupper (ch); /* convert to upper case if lower */
|
ch = (uint8) toupper (ch); /* convert to upper case if lower */
|
||||||
|
|
||||||
if (rt & RT_ENAB_ECHO) /* echo enabled? */
|
if (rt & RT_ENAB_ECHO) /* echo enabled? */
|
||||||
tmxr_putc_ln (&mpx_ldsc [port], ch); /* echo the char */
|
tmxr_putc_ln (&mpx_ldsc [port], ch); /* echo the char */
|
||||||
|
@ -1890,7 +1894,7 @@ while (recv_loop && /* OK to process? */
|
||||||
buf_remove (ioread, port); /* back out dummy char leaving header */
|
buf_remove (ioread, port); /* back out dummy char leaving header */
|
||||||
}
|
}
|
||||||
|
|
||||||
buf_term (ioread, port, mpx_param >> 8); /* terminate buffer and set header */
|
buf_term (ioread, port, (uint8) (mpx_param >> 8)); /* terminate buffer and set header */
|
||||||
|
|
||||||
if (buf_avail (ioread, port) == 1) /* first read buffer? */
|
if (buf_avail (ioread, port) == 1) /* first read buffer? */
|
||||||
mpx_flags [port] |= FL_HAVEBUF; /* indicate availability */
|
mpx_flags [port] |= FL_HAVEBUF; /* indicate availability */
|
||||||
|
@ -1920,7 +1924,7 @@ if (fast_binary_read) { /* fast binary read
|
||||||
}
|
}
|
||||||
|
|
||||||
else /* first character */
|
else /* first character */
|
||||||
mpx_ibuf = (chx & DMASK8) << 8; /* put in top half of word */
|
mpx_ibuf = (uint16) ((chx & DMASK8) << 8); /* put in top half of word */
|
||||||
|
|
||||||
mpx_flags [0] ^= FL_WANTBUF; /* toggle byte flag */
|
mpx_flags [0] ^= FL_WANTBUF; /* toggle byte flag */
|
||||||
}
|
}
|
||||||
|
@ -2219,7 +2223,7 @@ for (i = 0; i < MPX_PORTS; i++) { /* clear per-line variab
|
||||||
if (i == 0) /* default port configurations */
|
if (i == 0) /* default port configurations */
|
||||||
mpx_config [0] = SK_PWRUP_0; /* port 0 is separate from 1-7 */
|
mpx_config [0] = SK_PWRUP_0; /* port 0 is separate from 1-7 */
|
||||||
else
|
else
|
||||||
mpx_config [i] = SK_PWRUP_1 | i;
|
mpx_config [i] = (uint16) (SK_PWRUP_1 | i);
|
||||||
|
|
||||||
mpx_rcvtype [i] = RT_PWRUP; /* power on config for echoplex */
|
mpx_rcvtype [i] = RT_PWRUP; /* power on config for echoplex */
|
||||||
mpx_charcnt [i] = 0; /* default character count */
|
mpx_charcnt [i] = 0; /* default character count */
|
||||||
|
@ -2658,9 +2662,9 @@ return;
|
||||||
length for the allocated header.
|
length for the allocated header.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static uint32 buf_len (IO_OPER rw, uint32 port, BUF_SELECT which)
|
static uint16 buf_len (IO_OPER rw, uint32 port, BUF_SELECT which)
|
||||||
{
|
{
|
||||||
int32 length;
|
int16 length;
|
||||||
|
|
||||||
if (which == put)
|
if (which == put)
|
||||||
length = mpx_put [port] [rw] - mpx_sep [port] [rw] - /* calculate length */
|
length = mpx_put [port] [rw] - mpx_sep [port] [rw] - /* calculate length */
|
||||||
|
|
|
@ -26,6 +26,9 @@
|
||||||
MS 13181A 7970B 800bpi nine track magnetic tape
|
MS 13181A 7970B 800bpi nine track magnetic tape
|
||||||
13183A 7970E 1600bpi nine track magnetic tape
|
13183A 7970E 1600bpi nine track magnetic tape
|
||||||
|
|
||||||
|
30-Dec-14 JDB Added S-register parameters to ibl_copy
|
||||||
|
24-Dec-14 JDB Use T_ADDR_FMT with t_addr values for 64-bit compatibility
|
||||||
|
Added casts for explicit downward conversions
|
||||||
11-Dec-14 JDB Updated for new erase gap API, added CRCC/LRCC support
|
11-Dec-14 JDB Updated for new erase gap API, added CRCC/LRCC support
|
||||||
10-Jan-13 MP Added DEV_TAPE to DEVICE flags
|
10-Jan-13 MP Added DEV_TAPE to DEVICE flags
|
||||||
09-May-12 JDB Separated assignments from conditional expressions
|
09-May-12 JDB Separated assignments from conditional expressions
|
||||||
|
@ -528,10 +531,10 @@ while (working_set) {
|
||||||
|
|
||||||
|
|
||||||
case ioIOI: /* I/O data input */
|
case ioIOI: /* I/O data input */
|
||||||
data = msc_sta & ~STA_DYN; /* get card status */
|
data = (uint16) (msc_sta & ~STA_DYN); /* get card status */
|
||||||
|
|
||||||
if ((uptr->flags & UNIT_OFFLINE) == 0) { /* online? */
|
if ((uptr->flags & UNIT_OFFLINE) == 0) { /* online? */
|
||||||
data = data | uptr->UST; /* add unit status */
|
data = data | (uint16) uptr->UST; /* add unit status */
|
||||||
|
|
||||||
if (sim_tape_bot (uptr)) /* BOT? */
|
if (sim_tape_bot (uptr)) /* BOT? */
|
||||||
data = data | STA_BOT;
|
data = data | STA_BOT;
|
||||||
|
@ -551,7 +554,7 @@ while (working_set) {
|
||||||
data = data | STA_TBSY | STA_LOCAL;
|
data = data | STA_TBSY | STA_LOCAL;
|
||||||
|
|
||||||
if (ms_ctype == A13183) /* 13183A? */
|
if (ms_ctype == A13183) /* 13183A? */
|
||||||
data = data | STA_PE | (msc_usl << STA_V_SEL);
|
data = data | STA_PE | (uint16) (msc_usl << STA_V_SEL);
|
||||||
|
|
||||||
if (DEBUG_PRI (msc_dev, DEB_CPU))
|
if (DEBUG_PRI (msc_dev, DEB_CPU))
|
||||||
fprintf (sim_deb, ">>MSC LIx: Status = %06o\n", data);
|
fprintf (sim_deb, ">>MSC LIx: Status = %06o\n", data);
|
||||||
|
@ -644,7 +647,7 @@ while (working_set) {
|
||||||
if (DEBUG_PRI (msc_dev, DEB_CMDS))
|
if (DEBUG_PRI (msc_dev, DEB_CMDS))
|
||||||
fprintf (sim_deb,
|
fprintf (sim_deb,
|
||||||
">>MSC STC: Unit %d command %03o (%s) scheduled, "
|
">>MSC STC: Unit %d command %03o (%s) scheduled, "
|
||||||
"pos = %d, time = %d\n",
|
"pos = %" T_ADDR_FMT "d, time = %d\n",
|
||||||
msc_usl, uptr->FNC, ms_cmd_name (uptr->FNC),
|
msc_usl, uptr->FNC, ms_cmd_name (uptr->FNC),
|
||||||
uptr->pos, sched_time);
|
uptr->pos, sched_time);
|
||||||
}
|
}
|
||||||
|
@ -741,9 +744,10 @@ switch (uptr->FNC) { /* case on function */
|
||||||
fprintf (sim_deb,
|
fprintf (sim_deb,
|
||||||
">>MSC svc: Unit %d wrote gap\n",
|
">>MSC svc: Unit %d wrote gap\n",
|
||||||
unum);
|
unum);
|
||||||
if ((r = ms_write_gap (uptr)) || /* write tape gap; error? */
|
r = ms_write_gap (uptr); /* write tape gap*/
|
||||||
(uptr->FNC != FNC_GFM)) /* not GFM? */
|
|
||||||
break; /* bail out now */
|
if (r || (uptr->FNC != FNC_GFM)) /* if error or not GFM */
|
||||||
|
break; /* then bail out now */
|
||||||
/* else drop into WFM */
|
/* else drop into WFM */
|
||||||
case FNC_WFM: /* write file mark */
|
case FNC_WFM: /* write file mark */
|
||||||
if ((ms_timing == 0) && sim_tape_bot (uptr)) { /* realistic timing + BOT? */
|
if ((ms_timing == 0) && sim_tape_bot (uptr)) { /* realistic timing + BOT? */
|
||||||
|
@ -862,7 +866,7 @@ switch (uptr->FNC) { /* case on function */
|
||||||
}
|
}
|
||||||
else { /* not 1st, next char */
|
else { /* not 1st, next char */
|
||||||
if (ms_ptr < DBSIZE) { /* room in buffer? */
|
if (ms_ptr < DBSIZE) { /* room in buffer? */
|
||||||
msxb[ms_ptr] = msd_buf >> 8; /* store 2 char */
|
msxb[ms_ptr] = (uint8) (msd_buf >> 8); /* store 2 char */
|
||||||
msxb[ms_ptr + 1] = msd_buf & 0377;
|
msxb[ms_ptr + 1] = msd_buf & 0377;
|
||||||
ms_ptr = ms_ptr + 2;
|
ms_ptr = ms_ptr + 2;
|
||||||
}
|
}
|
||||||
|
@ -1303,13 +1307,18 @@ const BOOT_ROM ms_rom = {
|
||||||
|
|
||||||
t_stat msc_boot (int32 unitno, DEVICE *dptr)
|
t_stat msc_boot (int32 unitno, DEVICE *dptr)
|
||||||
{
|
{
|
||||||
int32 dev;
|
const int32 dev = msd_dib.select_code; /* get data chan device no */
|
||||||
|
|
||||||
|
if (unitno != 0) /* boot supported on drive unit 0 only */
|
||||||
|
return SCPE_NOFNC; /* report "Command not allowed" if attempted */
|
||||||
|
|
||||||
|
if (ibl_copy (ms_rom, dev, IBL_OPT, /* copy the boot ROM to memory and configure */
|
||||||
|
IBL_MS | IBL_SET_SC (dev))) /* the S register accordingly */
|
||||||
|
return SCPE_IERR; /* return an internal error if the copy failed */
|
||||||
|
|
||||||
|
if ((sim_switches & SWMASK ('S')) && AR) /* if -S is specified and the A register is non-zero */
|
||||||
|
SR = SR | 1; /* then set to skip to the file number in A */
|
||||||
|
|
||||||
if (unitno != 0) return SCPE_NOFNC; /* only unit 0 */
|
|
||||||
dev = msd_dib.select_code; /* get data chan dev */
|
|
||||||
if (ibl_copy (ms_rom, dev)) return SCPE_IERR; /* copy boot to memory */
|
|
||||||
SR = (SR & IBL_OPT) | IBL_MS | (dev << IBL_V_DEV); /* set SR */
|
|
||||||
if ((sim_switches & SWMASK ('S')) && AR) SR = SR | 1; /* skip? */
|
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* hp2100_mt.c: HP 2100 12559A magnetic tape simulator
|
/* hp2100_mt.c: HP 2100 12559A magnetic tape simulator
|
||||||
|
|
||||||
Copyright (c) 1993-2013, Robert M. Supnik
|
Copyright (c) 1993-2014, 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,6 +25,7 @@
|
||||||
|
|
||||||
MT 12559A 3030 nine track magnetic tape
|
MT 12559A 3030 nine track magnetic tape
|
||||||
|
|
||||||
|
24-Dec-14 JDB Added casts for explicit downward conversions
|
||||||
10-Jan-13 MP Added DEV_TAPE to DEVICE flags
|
10-Jan-13 MP Added DEV_TAPE to DEVICE flags
|
||||||
09-May-12 JDB Separated assignments from conditional expressions
|
09-May-12 JDB Separated assignments from conditional expressions
|
||||||
25-Mar-12 JDB Removed redundant MTAB_VUN from "format" MTAB entry
|
25-Mar-12 JDB Removed redundant MTAB_VUN from "format" MTAB entry
|
||||||
|
@ -552,7 +553,7 @@ switch (mtc_fnc) { /* case on function */
|
||||||
if (mtc_1st) mtc_1st = 0; /* no xfr on first */
|
if (mtc_1st) mtc_1st = 0; /* no xfr on first */
|
||||||
else {
|
else {
|
||||||
if (mt_ptr < DBSIZE) { /* room in buffer? */
|
if (mt_ptr < DBSIZE) { /* room in buffer? */
|
||||||
mtxb[mt_ptr++] = mtc_unit.buf;
|
mtxb[mt_ptr++] = (uint8) mtc_unit.buf;
|
||||||
mtc_sta = mtc_sta & ~STA_BOT; /* clear BOT */
|
mtc_sta = mtc_sta & ~STA_BOT; /* clear BOT */
|
||||||
}
|
}
|
||||||
else mtc_sta = mtc_sta | STA_PAR;
|
else mtc_sta = mtc_sta | STA_PAR;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* hp2100_mux.c: HP 2100 12920A terminal multiplexor simulator
|
/* hp2100_mux.c: HP 2100 12920A terminal multiplexor simulator
|
||||||
|
|
||||||
Copyright (c) 2002-2013, Robert M Supnik
|
Copyright (c) 2002-2014, 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,6 +25,7 @@
|
||||||
|
|
||||||
MUX,MUXL,MUXM 12920A terminal multiplexor
|
MUX,MUXL,MUXM 12920A terminal multiplexor
|
||||||
|
|
||||||
|
24-Dec-14 JDB Added casts for explicit downward conversions
|
||||||
10-Jan-13 MP Added DEV_MUX and additional DEVICE field values
|
10-Jan-13 MP Added DEV_MUX and additional DEVICE field values
|
||||||
10-Feb-12 JDB Deprecated DEVNO in favor of SC
|
10-Feb-12 JDB Deprecated DEVNO in favor of SC
|
||||||
Removed DEV_NET to allow restoration of listening port
|
Removed DEV_NET to allow restoration of listening port
|
||||||
|
@ -711,7 +712,7 @@ while (working_set) {
|
||||||
if (muxl_obuf & OTL_TX) { /* transmit? */
|
if (muxl_obuf & OTL_TX) { /* transmit? */
|
||||||
if (ln < MUX_LINES) { /* line valid? */
|
if (ln < MUX_LINES) { /* line valid? */
|
||||||
if (muxl_obuf & OTL_P) { /* parameter? */
|
if (muxl_obuf & OTL_P) { /* parameter? */
|
||||||
mux_xpar[ln] = muxl_obuf; /* store param value */
|
mux_xpar[ln] = (uint16) muxl_obuf; /* store param value */
|
||||||
if (DEBUG_PRI (muxu_dev, DEB_CMDS))
|
if (DEBUG_PRI (muxu_dev, DEB_CMDS))
|
||||||
fprintf (sim_deb,
|
fprintf (sim_deb,
|
||||||
">>MUXl cmds: [STC%s] Transmit channel %d parameter %06o stored\n",
|
">>MUXl cmds: [STC%s] Transmit channel %d parameter %06o stored\n",
|
||||||
|
@ -723,7 +724,7 @@ while (working_set) {
|
||||||
muxl_obuf = /* add parity bit */
|
muxl_obuf = /* add parity bit */
|
||||||
muxl_obuf & ~OTL_PAR |
|
muxl_obuf & ~OTL_PAR |
|
||||||
XMT_PAR(muxl_obuf);
|
XMT_PAR(muxl_obuf);
|
||||||
mux_xbuf[ln] = muxl_obuf; /* load buffer */
|
mux_xbuf[ln] = (uint16) muxl_obuf; /* load buffer */
|
||||||
|
|
||||||
if (sim_is_active (&muxl_unit[ln])) { /* still working? */
|
if (sim_is_active (&muxl_unit[ln])) { /* still working? */
|
||||||
mux_sta[ln] = mux_sta[ln] | LIU_LOST; /* char lost */
|
mux_sta[ln] = mux_sta[ln] | LIU_LOST; /* char lost */
|
||||||
|
@ -748,7 +749,7 @@ while (working_set) {
|
||||||
else /* receive */
|
else /* receive */
|
||||||
if (ln < (MUX_LINES + MUX_ILINES)) { /* line valid? */
|
if (ln < (MUX_LINES + MUX_ILINES)) { /* line valid? */
|
||||||
if (muxl_obuf & OTL_P) { /* parameter? */
|
if (muxl_obuf & OTL_P) { /* parameter? */
|
||||||
mux_rpar[ln] = muxl_obuf; /* store param value */
|
mux_rpar[ln] = (uint16) muxl_obuf; /* store param value */
|
||||||
if (DEBUG_PRI (muxu_dev, DEB_CMDS))
|
if (DEBUG_PRI (muxu_dev, DEB_CMDS))
|
||||||
fprintf (sim_deb,
|
fprintf (sim_deb,
|
||||||
">>MUXl cmds: [STC%s] Receive channel %d parameter %06o stored\n",
|
">>MUXl cmds: [STC%s] Receive channel %d parameter %06o stored\n",
|
||||||
|
@ -890,10 +891,10 @@ while (working_set) {
|
||||||
|
|
||||||
|
|
||||||
case ioIOI: /* I/O data input */
|
case ioIOI: /* I/O data input */
|
||||||
data = LIC_MBO | PUT_CCH (muxc_chan) | /* mbo, chan num */
|
data = (uint16) (LIC_MBO | PUT_CCH (muxc_chan) | /* mbo, chan num */
|
||||||
LIC_TSTI (muxc_chan) | /* I2, I1 */
|
LIC_TSTI (muxc_chan) | /* I2, I1 */
|
||||||
(muxc_ota[muxc_chan] & (OTC_ES2 | OTC_ES1)) | /* ES2, ES1 */
|
(muxc_ota[muxc_chan] & (OTC_ES2 | OTC_ES1)) | /* ES2, ES1 */
|
||||||
(muxc_lia[muxc_chan] & (LIC_S2 | LIC_S1)); /* S2, S1 */
|
(muxc_lia[muxc_chan] & (LIC_S2 | LIC_S1))); /* S2, S1 */
|
||||||
|
|
||||||
if (DEBUG_PRI (muxu_dev, DEB_CPU))
|
if (DEBUG_PRI (muxu_dev, DEB_CPU))
|
||||||
fprintf (sim_deb, ">>MUXc cpu: [LIx%s] Status = %06o, channel = %d\n",
|
fprintf (sim_deb, ">>MUXc cpu: [LIx%s] Status = %06o, channel = %d\n",
|
||||||
|
@ -1148,7 +1149,7 @@ else { /* normal */
|
||||||
tmxr_poll_tx (&mux_desc); /* poll xmt */
|
tmxr_poll_tx (&mux_desc); /* poll xmt */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mux_rbuf[ln] = c; /* save char */
|
mux_rbuf[ln] = (uint16) c; /* save char */
|
||||||
}
|
}
|
||||||
|
|
||||||
mux_rchp[ln] = 1; /* char pending */
|
mux_rchp[ln] = 1; /* char pending */
|
||||||
|
@ -1269,7 +1270,7 @@ for (i = MUX_LINES; i < (MUX_LINES + MUX_ILINES); i++) {
|
||||||
else {
|
else {
|
||||||
if (mux_rchp[i]) mux_sta[i] = mux_sta[i] | LIU_LOST;
|
if (mux_rchp[i]) mux_sta[i] = mux_sta[i] | LIU_LOST;
|
||||||
mux_rchp[i] = 1;
|
mux_rchp[i] = 1;
|
||||||
mux_rbuf[i] = c;
|
mux_rbuf[i] = (uint16) c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -1278,7 +1279,7 @@ return;
|
||||||
|
|
||||||
/* Reset an individual line */
|
/* Reset an individual line */
|
||||||
|
|
||||||
void mux_reset_ln (int32 i)
|
static void mux_reset_ln (int32 i)
|
||||||
{
|
{
|
||||||
mux_rbuf[i] = mux_xbuf[i] = 0; /* clear state */
|
mux_rbuf[i] = mux_xbuf[i] = 0; /* clear state */
|
||||||
mux_rpar[i] = mux_xpar[i] = 0;
|
mux_rpar[i] = mux_xpar[i] = 0;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* hp2100_stddev.c: HP2100 standard devices simulator
|
/* hp2100_stddev.c: HP2100 standard devices simulator
|
||||||
|
|
||||||
Copyright (c) 1993-2012, Robert M. Supnik
|
Copyright (c) 1993-2014, 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"),
|
||||||
|
@ -28,6 +28,8 @@
|
||||||
TTY 12531C buffered teleprinter interface
|
TTY 12531C buffered teleprinter interface
|
||||||
TBG 12539C time base generator
|
TBG 12539C time base generator
|
||||||
|
|
||||||
|
30-Dec-14 JDB Added S-register parameters to ibl_copy
|
||||||
|
24-Dec-14 JDB Added casts for explicit downward conversions
|
||||||
28-Dec-12 JDB Allocate the TBG logical name during power-on reset
|
28-Dec-12 JDB Allocate the TBG logical name during power-on reset
|
||||||
18-Dec-12 MP Now calls sim_activate_time to get remaining poll time
|
18-Dec-12 MP Now calls sim_activate_time to get remaining poll time
|
||||||
09-May-12 JDB Separated assignments from conditional expressions
|
09-May-12 JDB Separated assignments from conditional expressions
|
||||||
|
@ -610,11 +612,12 @@ const BOOT_ROM ptr_rom = {
|
||||||
|
|
||||||
t_stat ptr_boot (int32 unitno, DEVICE *dptr)
|
t_stat ptr_boot (int32 unitno, DEVICE *dptr)
|
||||||
{
|
{
|
||||||
int32 dev;
|
const int32 dev = ptr_dib.select_code; /* get device no */
|
||||||
|
|
||||||
dev = ptr_dib.select_code; /* get device no */
|
if (ibl_copy (ptr_rom, dev, IBL_OPT, /* copy the boot ROM to memory and configure */
|
||||||
if (ibl_copy (ptr_rom, dev)) return SCPE_IERR; /* copy boot to memory */
|
IBL_PTR | IBL_SET_SC (dev))) /* the S register accordingly */
|
||||||
SR = (SR & IBL_OPT) | IBL_PTR | (dev << IBL_V_DEV); /* set SR */
|
return SCPE_IERR; /* return an internal error if the copy failed */
|
||||||
|
else
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -777,7 +780,7 @@ while (working_set) {
|
||||||
|
|
||||||
|
|
||||||
case ioIOI: /* I/O data input */
|
case ioIOI: /* I/O data input */
|
||||||
data = tty_buf;
|
data = (uint16) tty_buf;
|
||||||
|
|
||||||
if (!(tty_mode & TM_KBD) && sim_is_active (&tty_unit[TTO]))
|
if (!(tty_mode & TM_KBD) && sim_is_active (&tty_unit[TTO]))
|
||||||
data = data | TP_BUSY;
|
data = data | TP_BUSY;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* hp2100_sys.c: HP 2100 simulator interface
|
/* hp2100_sys.c: HP 2100 simulator interface
|
||||||
|
|
||||||
Copyright (c) 1993-2013, Robert M. Supnik
|
Copyright (c) 1993-2014, 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.
|
||||||
|
|
||||||
|
24-Dec-14 JDB Added casts to t_addr and t_value for 64-bit compatibility
|
||||||
|
Made local routines static
|
||||||
05-Feb-13 JDB Added hp_fprint_stopped to handle HLT instruction message
|
05-Feb-13 JDB Added hp_fprint_stopped to handle HLT instruction message
|
||||||
18-Mar-13 JDB Moved CPU state variable declarations to hp2100_cpu.h
|
18-Mar-13 JDB Moved CPU state variable declarations to hp2100_cpu.h
|
||||||
09-May-12 JDB Quieted warnings for assignments in conditional expressions
|
09-May-12 JDB Quieted warnings for assignments in conditional expressions
|
||||||
|
@ -186,7 +188,7 @@ return TRUE;
|
||||||
The checksum includes the origin but not the count.
|
The checksum includes the origin but not the count.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int32 fgetw (FILE *fileref)
|
static int32 fgetw (FILE *fileref)
|
||||||
{
|
{
|
||||||
int c1, c2;
|
int c1, c2;
|
||||||
|
|
||||||
|
@ -435,7 +437,7 @@ int32 cflag, cm, i, j, inst, disp;
|
||||||
uint32 irq;
|
uint32 irq;
|
||||||
|
|
||||||
cflag = (uptr == NULL) || (uptr == &cpu_unit);
|
cflag = (uptr == NULL) || (uptr == &cpu_unit);
|
||||||
inst = val[0];
|
inst = (int32) val[0];
|
||||||
if (sw & SWMASK ('A')) { /* ASCII? */
|
if (sw & SWMASK ('A')) { /* ASCII? */
|
||||||
if (inst > 0377) return SCPE_ARG;
|
if (inst > 0377) return SCPE_ARG;
|
||||||
fprintf (of, FMTASC (inst & 0177));
|
fprintf (of, FMTASC (inst & 0177));
|
||||||
|
@ -460,7 +462,7 @@ if (sw & SIM_SW_STOP) { /* simulator stop? */
|
||||||
|
|
||||||
if (irq && (!ion_defer || !calc_defer())) { /* pending interrupt and not deferred? */
|
if (irq && (!ion_defer || !calc_defer())) { /* pending interrupt and not deferred? */
|
||||||
addr = irq; /* set display address to trap cell */
|
addr = irq; /* set display address to trap cell */
|
||||||
inst = val[0] = ReadIO (irq, SMAP); /* load trap cell instruction */
|
val[0] = inst = ReadIO (irq, SMAP); /* load trap cell instruction */
|
||||||
val[1] = ReadIO (irq + 1, SMAP); /* might be multi-word */
|
val[1] = ReadIO (irq + 1, SMAP); /* might be multi-word */
|
||||||
val[2] = ReadIO (irq + 2, SMAP); /* although it's unlikely */
|
val[2] = ReadIO (irq + 2, SMAP); /* although it's unlikely */
|
||||||
fprintf (of, "IAK %2o: ", irq); /* report acknowledged interrupt */
|
fprintf (of, "IAK %2o: ", irq); /* report acknowledged interrupt */
|
||||||
|
@ -485,8 +487,10 @@ for (i = 0; opc_val[i] >= 0; i++) { /* loop thru ops */
|
||||||
disp = inst & I_DISP; /* displacement */
|
disp = inst & I_DISP; /* displacement */
|
||||||
fprintf (of, "%s ", opcode[i]); /* opcode */
|
fprintf (of, "%s ", opcode[i]); /* opcode */
|
||||||
if (inst & I_CP) { /* current page? */
|
if (inst & I_CP) { /* current page? */
|
||||||
if (cflag) fprintf (of, "%-o", (addr & I_PAGENO) | disp);
|
if (cflag)
|
||||||
else fprintf (of, "C %-o", disp);
|
fprintf (of, "%-o", ((uint32) addr & I_PAGENO) | disp);
|
||||||
|
else
|
||||||
|
fprintf (of, "C %-o", disp);
|
||||||
}
|
}
|
||||||
else fprintf (of, "%-o", disp); /* page zero */
|
else fprintf (of, "%-o", disp); /* page zero */
|
||||||
if (inst & I_IA) fprintf (of, ",I");
|
if (inst & I_IA) fprintf (of, ",I");
|
||||||
|
@ -512,7 +516,7 @@ for (i = 0; opc_val[i] >= 0; i++) { /* loop thru ops */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case I_V_EMR: /* extended mem ref */
|
case I_V_EMR: /* extended mem ref */
|
||||||
fprintf (of, "%s %-o", opcode[i], val[1] & VAMASK);
|
fprintf (of, "%s %-o", opcode[i], (uint32) val[1] & VAMASK);
|
||||||
if (val[1] & I_IA) fprintf (of, ",I");
|
if (val[1] & I_IA) fprintf (of, ",I");
|
||||||
return -1; /* extra word */
|
return -1; /* extra word */
|
||||||
|
|
||||||
|
@ -526,14 +530,14 @@ for (i = 0; opc_val[i] >= 0; i++) { /* loop thru ops */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case I_V_EGZ: /* ext grp 1 op + 0 */
|
case I_V_EGZ: /* ext grp 1 op + 0 */
|
||||||
fprintf (of, "%s %-o", opcode[i], val[1] & VAMASK);
|
fprintf (of, "%s %-o", opcode[i], (uint32) val[1] & VAMASK);
|
||||||
if (val[1] & I_IA) fprintf (of, ",I");
|
if (val[1] & I_IA) fprintf (of, ",I");
|
||||||
return -2; /* extra words */
|
return -2; /* extra words */
|
||||||
|
|
||||||
case I_V_EG2: /* ext grp 2 op */
|
case I_V_EG2: /* ext grp 2 op */
|
||||||
fprintf (of, "%s %-o", opcode[i], val[1] & VAMASK);
|
fprintf (of, "%s %-o", opcode[i], (uint32) val[1] & VAMASK);
|
||||||
if (val[1] & I_IA) fprintf (of, ",I");
|
if (val[1] & I_IA) fprintf (of, ",I");
|
||||||
fprintf (of, " %-o", val[2] & VAMASK);
|
fprintf (of, " %-o", (uint32) val[2] & VAMASK);
|
||||||
if (val[2] & I_IA) fprintf (of, ",I");
|
if (val[2] & I_IA) fprintf (of, ",I");
|
||||||
return -2; /* extra words */
|
return -2; /* extra words */
|
||||||
|
|
||||||
|
@ -569,14 +573,14 @@ return SCPE_ARG;
|
||||||
-1 if error
|
-1 if error
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int32 get_addr (char *cptr)
|
static int32 get_addr (char *cptr)
|
||||||
{
|
{
|
||||||
int32 d;
|
int32 d;
|
||||||
t_stat r;
|
t_stat r;
|
||||||
char gbuf[CBUFSIZE];
|
char gbuf[CBUFSIZE];
|
||||||
|
|
||||||
cptr = get_glyph (cptr, gbuf, ','); /* get next field */
|
cptr = get_glyph (cptr, gbuf, ','); /* get next field */
|
||||||
d = get_uint (gbuf, 8, VAMASK, &r); /* construe as addr */
|
d = (int32) get_uint (gbuf, 8, VAMASK, &r); /* construe as addr */
|
||||||
if (r != SCPE_OK) return -1;
|
if (r != SCPE_OK) return -1;
|
||||||
if (*cptr != 0) { /* more? */
|
if (*cptr != 0) { /* more? */
|
||||||
cptr = get_glyph (cptr, gbuf, 0); /* look for indirect */
|
cptr = get_glyph (cptr, gbuf, 0); /* look for indirect */
|
||||||
|
@ -640,11 +644,14 @@ if (opcode[i]) { /* found opcode? */
|
||||||
|
|
||||||
case I_V_MRF: /* mem ref */
|
case I_V_MRF: /* mem ref */
|
||||||
cptr = get_glyph (cptr, gbuf, 0); /* get next field */
|
cptr = get_glyph (cptr, gbuf, 0); /* get next field */
|
||||||
if ((k = (strcmp (gbuf, "C") == 0))) { /* C specified? */
|
k = strcmp (gbuf, "C");
|
||||||
|
if (k == 0) { /* C specified? */
|
||||||
val[0] = val[0] | I_CP;
|
val[0] = val[0] | I_CP;
|
||||||
cptr = get_glyph (cptr, gbuf, 0);
|
cptr = get_glyph (cptr, gbuf, 0);
|
||||||
}
|
}
|
||||||
else if ((k = (strcmp (gbuf, "Z") == 0))) { /* Z specified? */
|
else {
|
||||||
|
k = strcmp (gbuf, "Z");
|
||||||
|
if (k == 0) /* Z specified? */
|
||||||
cptr = get_glyph (cptr, gbuf, ',');
|
cptr = get_glyph (cptr, gbuf, ',');
|
||||||
}
|
}
|
||||||
if ((d = get_addr (gbuf)) < 0) return SCPE_ARG;
|
if ((d = get_addr (gbuf)) < 0) return SCPE_ARG;
|
||||||
|
@ -656,7 +663,7 @@ if (opcode[i]) { /* found opcode? */
|
||||||
|
|
||||||
case I_V_ESH: /* extended shift */
|
case I_V_ESH: /* extended shift */
|
||||||
cptr = get_glyph (cptr, gbuf, 0);
|
cptr = get_glyph (cptr, gbuf, 0);
|
||||||
d = get_uint (gbuf, 10, 16, &r);
|
d = (int32) get_uint (gbuf, 10, 16, &r);
|
||||||
if ((r != SCPE_OK) || (d == 0)) return SCPE_ARG;
|
if ((r != SCPE_OK) || (d == 0)) return SCPE_ARG;
|
||||||
val[0] = val[0] | (d & 017);
|
val[0] = val[0] | (d & 017);
|
||||||
break;
|
break;
|
||||||
|
@ -670,7 +677,7 @@ if (opcode[i]) { /* found opcode? */
|
||||||
|
|
||||||
case I_V_IO1: /* IOT + optional C */
|
case I_V_IO1: /* IOT + optional C */
|
||||||
cptr = get_glyph (cptr, gbuf, ','); /* get device */
|
cptr = get_glyph (cptr, gbuf, ','); /* get device */
|
||||||
d = get_uint (gbuf, 8, I_DEVMASK, &r);
|
d = (int32) get_uint (gbuf, 8, I_DEVMASK, &r);
|
||||||
if (r != SCPE_OK) return SCPE_ARG;
|
if (r != SCPE_OK) return SCPE_ARG;
|
||||||
val[0] = val[0] | d;
|
val[0] = val[0] | d;
|
||||||
if (*cptr != 0) {
|
if (*cptr != 0) {
|
||||||
|
@ -682,7 +689,7 @@ if (opcode[i]) { /* found opcode? */
|
||||||
|
|
||||||
case I_V_IO2: /* IOT */
|
case I_V_IO2: /* IOT */
|
||||||
cptr = get_glyph (cptr, gbuf, 0); /* get device */
|
cptr = get_glyph (cptr, gbuf, 0); /* get device */
|
||||||
d = get_uint (gbuf, 8, I_DEVMASK, &r);
|
d = (int32) get_uint (gbuf, 8, I_DEVMASK, &r);
|
||||||
if (r != SCPE_OK) return SCPE_ARG;
|
if (r != SCPE_OK) return SCPE_ARG;
|
||||||
val[0] = val[0] | d;
|
val[0] = val[0] | d;
|
||||||
break;
|
break;
|
||||||
|
@ -825,7 +832,7 @@ dibptr = (DIB *) dptr->ctxt;
|
||||||
if (dibptr == NULL)
|
if (dibptr == NULL)
|
||||||
return SCPE_IERR;
|
return SCPE_IERR;
|
||||||
|
|
||||||
newdev = get_uint (cptr, 8, I_DEVMASK - num, &r);
|
newdev = (int32) get_uint (cptr, 8, I_DEVMASK - num, &r);
|
||||||
|
|
||||||
if (r != SCPE_OK)
|
if (r != SCPE_OK)
|
||||||
return r;
|
return r;
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
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 the authors.
|
in this Software without prior written authorization from the authors.
|
||||||
|
|
||||||
|
24-Dec-14 JDB Added casts for explicit downward conversions
|
||||||
27-Oct-14 JDB Corrected the relative movement calculation in start_seek
|
27-Oct-14 JDB Corrected the relative movement calculation in start_seek
|
||||||
20-Dec-12 JDB sim_is_active() now returns t_bool
|
20-Dec-12 JDB sim_is_active() now returns t_bool
|
||||||
24-Oct-12 JDB Changed CNTLR_OPCODE to title case to avoid name clash
|
24-Oct-12 JDB Changed CNTLR_OPCODE to title case to avoid name clash
|
||||||
|
@ -311,8 +312,8 @@
|
||||||
#define GET_HEAD(p) (((p) >> DL_V_HEAD) & DL_M_HEAD)
|
#define GET_HEAD(p) (((p) >> DL_V_HEAD) & DL_M_HEAD)
|
||||||
#define GET_SECTOR(p) (((p) >> DL_V_SECTOR) & DL_M_SECTOR)
|
#define GET_SECTOR(p) (((p) >> DL_V_SECTOR) & DL_M_SECTOR)
|
||||||
|
|
||||||
#define SET_HEAD(c) (((c)->head & DL_M_HEAD) << DL_V_HEAD)
|
#define SET_HEAD(c) (uint16) (((c)->head & DL_M_HEAD) << DL_V_HEAD)
|
||||||
#define SET_SECTOR(c) (((c)->sector & DL_M_SECTOR) << DL_V_SECTOR)
|
#define SET_SECTOR(c) (uint16) (((c)->sector & DL_M_SECTOR) << DL_V_SECTOR)
|
||||||
|
|
||||||
|
|
||||||
/* Drive properties table.
|
/* Drive properties table.
|
||||||
|
@ -831,8 +832,8 @@ switch (cvptr->opcode) { /* dispatch the command
|
||||||
|
|
||||||
|
|
||||||
case Request_Status:
|
case Request_Status:
|
||||||
cvptr->buffer [0] = /* set the Status-1 value */
|
cvptr->buffer [0] = (uint16) (cvptr->spd_unit /* set the Status-1 value */
|
||||||
cvptr->spd_unit | SET_S1STAT (cvptr->status); /* into the buffer */
|
| SET_S1STAT (cvptr->status)); /* into the buffer */
|
||||||
|
|
||||||
if (cvptr->type == MAC) /* is this a MAC controller? */
|
if (cvptr->type == MAC) /* is this a MAC controller? */
|
||||||
if (unit > unit_limit) /* if the unit number is invalid */
|
if (unit > unit_limit) /* if the unit number is invalid */
|
||||||
|
@ -876,8 +877,8 @@ switch (cvptr->opcode) { /* dispatch the command
|
||||||
|
|
||||||
|
|
||||||
case Request_Syndrome:
|
case Request_Syndrome:
|
||||||
cvptr->buffer [0] = /* return the Status-1 value in buffer 0 */
|
cvptr->buffer [0] = (uint16) (cvptr->spd_unit /* return the Status-1 value */
|
||||||
cvptr->spd_unit | SET_S1STAT (cvptr->status);
|
| SET_S1STAT (cvptr->status)); /* in buffer 0 */
|
||||||
|
|
||||||
set_address (cvptr, 1); /* return the CHS values in buffer 1-2 */
|
set_address (cvptr, 1); /* return the CHS values in buffer 1-2 */
|
||||||
|
|
||||||
|
@ -2289,8 +2290,12 @@ return SCPE_IOERR; /* return an I/O error t
|
||||||
|
|
||||||
static void set_address (CVPTR cvptr, uint32 index)
|
static void set_address (CVPTR cvptr, uint32 index)
|
||||||
{
|
{
|
||||||
cvptr->buffer [index] = cvptr->cylinder + (cvptr->eoc == SET ? 1 : 0); /* update the cylinder if EOC is set */
|
cvptr->buffer [index] = (uint16) cvptr->cylinder /* update the cylinder if EOC is set */
|
||||||
cvptr->buffer [index + 1] = SET_HEAD (cvptr) | SET_SECTOR (cvptr); /* merge the head and sector */
|
+ (cvptr->eoc == SET ? 1 : 0);
|
||||||
|
|
||||||
|
cvptr->buffer [index + 1] = SET_HEAD (cvptr) /* merge the head and sector */
|
||||||
|
| SET_SECTOR (cvptr);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2362,7 +2367,7 @@ if (uptr == NULL) /* if the unit is invali
|
||||||
return DL_S2ERR | DL_S2NR; /* then it does not respond */
|
return DL_S2ERR | DL_S2NR; /* then it does not respond */
|
||||||
|
|
||||||
model = GET_MODEL (uptr->flags); /* get the drive model */
|
model = GET_MODEL (uptr->flags); /* get the drive model */
|
||||||
status = drive_props [model].type | uptr->STAT; /* start with the drive type and unit status */
|
status = (uint16) (drive_props [model].type | uptr->STAT); /* start with the drive type and unit status */
|
||||||
|
|
||||||
if (uptr->flags & UNIT_WPROT) /* is the write protect switch set? */
|
if (uptr->flags & UNIT_WPROT) /* is the write protect switch set? */
|
||||||
status |= DL_S2RO; /* set the Protected status bit */
|
status |= DL_S2RO; /* set the Protected status bit */
|
||||||
|
|
Loading…
Add table
Reference in a new issue