mirror of
https://github.com/simh/simh.git
synced 2026-04-03 04:19:16 +00:00
Notes For V2.10-2
1. New Features in 2.10-2
The build procedures have changed. There is only one UNIX makefile.
To compile without Ethernet support, simply type
gmake {target|all}
To compile with Ethernet support, type
gmake USE_NETWORK=1 {target|all}
The Mingw batch files require Mingw release 2 and invoke the Unix
makefile. There are still separate batch files for compilation
with or without Ethernet support.
1.1 SCP and Libraries
- The EVAL command will evaluate a symbolic type-in and display
it in numeric form.
- The ! command (with no arguments) will launch the host operating
system command shell. The ! command (with an argument) executes
the argument as a host operating system command. (Code from
Mark Pizzolato)
- Telnet sessions now recognize BREAK. How a BREAK is transmitted
dependent on the particular Telnet client. (Code from Mark
Pizzolato)
- The sockets library includes code for active connections as
well as listening connections.
- The RESTORE command will restore saved memory size, if the
simulator supports dynamic memory resizing.
1.2 PDP-1
- The PDP-1 supports the Type 24 serial drum (based on recently
discovered documents).
1.3 18b PDP's
- The PDP-4 supports the Type 24 serial drum (based on recently
discovered documents).
1.4 PDP-11
- The PDP-11 implements a stub DEUNA/DELUA (XU). The real XU
module will be included in a later release.
1.5 PDP-10
- The PDP-10 implements a stub DEUNA/DELUA (XU). The real XU
module will be included in a later release.
1.6 HP 2100
- The IOP microinstruction set is supported for the 21MX as well
as the 2100.
- The HP2100 supports the Access Interprocessor Link (IPL).
1.7 VAX
- If the VAX console is attached to a Telnet session, BREAK is
interpreted as console halt.
- The SET/SHOW HISTORY commands enable and display a history of
the most recently executed instructions. (Code from Mark
Pizzolato)
1.8 Terminals Multiplexors
- BREAK detection was added to the HP, DEC, and Interdata terminal
multiplexors.
1.9 Interdata 16b and 32b
- First release. UNIX is not yet working.
1.10 SDS 940
- First release.
2. Bugs Fixed in 2.10-2
- PDP-11 console must default to 7b for early UNIX compatibility.
- PDP-11/VAX TMSCP emulator was using the wrong packet length for
read/write end packets.
- Telnet IAC+IAC processing was fixed, both for input and output
(found by Mark Pizzolato).
- PDP-11/VAX Ethernet setting flag bits wrong for chained
descriptors (found by Mark Pizzolato).
3. New Features in 2.10 vs prior releases
3.1 SCP and Libraries
- The VT emulation package has been replaced by the capability
to remote the console to a Telnet session. Telnet clients
typically have more complete and robust VT100 emulation.
- Simulated devices may now have statically allocated buffers,
in addition to dynamically allocated buffers or disk-based
data stores.
- The DO command now takes substitutable arguments (max 9).
In command files, %n represents substitutable argument n.
- The initial command line is now interpreted as the command
name and substitutable arguments for a DO command. This is
backward compatible to prior versions.
- The initial command line parses switches. -Q is interpreted
as quiet mode; informational messages are suppressed.
- The HELP command now takes an optional argument. HELP <cmd>
types help on the specified command.
- Hooks have been added for implementing GUI-based consoles,
as well as simulator-specific command extensions. A few
internal data structures and definitions have changed.
- Two new routines (tmxr_open_master, tmxr_close_master) have
been added to sim_tmxr.c. The calling sequence for
sim_accept_conn has been changed in sim_sock.c.
- The calling sequence for the VM boot routine has been modified
to add an additional parameter.
- SAVE now saves, and GET now restores, controller and unit flags.
- Library sim_ether.c has been added for Ethernet support.
3.2 VAX
- Non-volatile RAM (NVR) can behave either like a memory or like
a disk-based peripheral. If unattached, it behaves like memory
and is saved and restored by SAVE and RESTORE, respectively.
If attached, its contents are loaded from disk by ATTACH and
written back to disk at DETACH and EXIT.
- SHOW <device> VECTOR displays the device's interrupt vector.
A few devices allow the vector to be changed with SET
<device> VECTOR=nnn.
- SHOW CPU IOSPACE displays the I/O space address map.
- The TK50 (TMSCP tape) has been added.
- The DEQNA/DELQA (Qbus Ethernet controllers) have been added.
- Autoconfiguration support has been added.
- The paper tape reader has been removed from vax_stddev.c and
now references a common implementation file, dec_pt.h.
- Examine and deposit switches now work on all devices, not just
the CPU.
- Device address conflicts are not detected until simulation starts.
3.3 PDP-11
- SHOW <device> VECTOR displays the device's interrupt vector.
Most devices allow the vector to be changed with SET
<device> VECTOR=nnn.
- SHOW CPU IOSPACE displays the I/O space address map.
- The TK50 (TMSCP tape), RK611/RK06/RK07 (cartridge disk),
RX211 (double density floppy), and KW11P programmable clock
have been added.
- The DEQNA/DELQA (Qbus Ethernet controllers) have been added.
- Autoconfiguration support has been added.
- The paper tape reader has been removed from pdp11_stddev.c and
now references a common implementation file, dec_pt.h.
- Device bootstraps now use the actual CSR specified by the
SET ADDRESS command, rather than just the default CSR. Note
that PDP-11 operating systems may NOT support booting with
non-standard addresses.
- Specifying more than 256KB of memory, or changing the bus
configuration, causes all peripherals that are not compatible
with the current bus configuration to be disabled.
- Device address conflicts are not detected until simulation starts.
3.4 PDP-10
- SHOW <device> VECTOR displays the device's interrupt vector.
A few devices allow the vector to be changed with SET
<device> VECTOR=nnn.
- SHOW CPU IOSPACE displays the I/O space address map.
- The RX211 (double density floppy) has been added; it is off
by default.
- The paper tape now references a common implementation file,
dec_pt.h.
- Device address conflicts are not detected until simulation starts.
3.5 PDP-1
- DECtape (then known as MicroTape) support has been added.
- The line printer and DECtape can be disabled and enabled.
3.6 PDP-8
- The RX28 (double density floppy) has been added as an option to
the existing RX8E controller.
- SHOW <device> DEVNO displays the device's device number. Most
devices allow the device number to be changed with SET <device>
DEVNO=nnn.
- Device number conflicts are not detected until simulation starts.
3.7 IBM 1620
- The IBM 1620 simulator has been released.
3.8 AltairZ80
- A hard drive has been added for increased storage.
- Several bugs have been fixed.
3.9 HP 2100
- The 12845A has been added and made the default line printer (LPT).
The 12653A has been renamed LPS and is off by default. It also
supports the diagnostic functions needed to run the DCPC and DMS
diagnostics.
- The 12557A/13210A disk defaults to the 13210A (7900/7901).
- The 12559A magtape is off by default.
- New CPU options (EAU/NOEAU) enable/disable the extended arithmetic
instructions for the 2116. These instructions are standard on
the 2100 and 21MX.
- New CPU options (MPR/NOMPR) enable/disable memory protect for the
2100 and 21MX.
- New CPU options (DMS/NODMS) enable/disable the dynamic mapping
instructions for the 21MX.
- The 12539 timebase generator autocalibrates.
3.10 Simulated Magtapes
- Simulated magtapes recognize end of file and the marker
0xFFFFFFFF as end of medium. Only the TMSCP tape simulator
can generate an end of medium marker.
- The error handling in simulated magtapes was overhauled to be
consistent through all simulators.
3.11 Simulated DECtapes
- Added support for RT11 image file format (256 x 16b) to DECtapes.
4. Bugs Fixed in 2.10 vs prior releases
- TS11/TSV05 was not simulating the XS0_MOT bit, causing failures
under VMS. In addition, two of the CTL options were coded
interchanged.
- IBM 1401 tape was not setting a word mark under group mark for
load mode reads. This caused the diagnostics to crash.
- SCP bugs in ssh_break and set_logon were fixed (found by Dave
Hittner).
- Numerous bugs in the HP 2100 extended arithmetic, floating point,
21MX, DMS, and IOP instructions were fixed. Bugs were also fixed
in the memory protect and DMS functions. The moving head disks
(DP, DQ) were revised to simulate the hardware more accurately.
Missing functions in DQ (address skip, read address) were added.
- PDP-10 tape wouldn't boot, and then wouldn't read (reported by
Michael Thompson and Harris Newman, respectively)
- PDP-1 typewriter is half duplex, with only one shift state for
both input and output (found by Derek Peschel)
5. General Notes
WARNING: V2.10 has reorganized and renamed some of the definition
files for the PDP-10, PDP-11, and VAX. Be sure to delete all
previous source files before you unpack the Zip archive, or
unpack it into a new directory structure.
WARNING: V2.10 has a new, more comprehensive save file format.
Restoring save files from previous releases will cause 'invalid
register' errors and loss of CPU option flags, device enable/
disable flags, unit online/offline flags, and unit writelock
flags.
WARNING: If you are using Visual Studio .NET through the IDE,
be sure to turn off the /Wp64 flag in the project settings, or
dozens of spurious errors will be generated.
WARNING: Compiling Ethernet support under Windows requires
extra steps; see the Ethernet readme file. Ethernet support is
currently available only for Windows, Linux, NetBSD, and OpenBSD.
This commit is contained in:
committed by
Mark Pizzolato
parent
4ea745b3ad
commit
2bcd1e7c4c
@@ -607,7 +607,7 @@ if (!ITS) its_1pr = 0; /* ~ITS, clr 1-proc */
|
||||
abortval = setjmp (save_env); /* set abort hdlr */
|
||||
if ((abortval > 0) || pager_pi) { /* stop or pi err? */
|
||||
if (pager_pi && (abortval == PAGE_FAIL))
|
||||
abortval = STOP_PAGINT; /* stop for pi err */
|
||||
abortval = STOP_PAGINT; /* stop for pi err */
|
||||
saved_PC = pager_PC & AMASK; /* failing instr PC */
|
||||
set_ac_display (ac_cur); /* set up AC display */
|
||||
pcq_r->qptr = pcq_p; /* update pc q ptr */
|
||||
@@ -623,19 +623,20 @@ else if (abortval == PAGE_FAIL) { /* page fail */
|
||||
rlog = 0; /* clear log */
|
||||
if (pager_tc) flags = pager_flags; /* trap? get flags */
|
||||
if (T20) { /* TOPS-20 */
|
||||
WriteP (upta + UPT_T20_PFL, pager_word);/* write page fail wd */
|
||||
WriteP (upta + UPT_T20_OFL, XWD (flags, 0));
|
||||
WriteP (upta + UPT_T20_OPC, pager_PC);
|
||||
mb = ReadP (upta + UPT_T20_NPC); }
|
||||
else { a10 ea; /* TOPS-10 or ITS */
|
||||
if (ITS) { /* ITS? */
|
||||
ea = epta + EPT_ITS_PAG + (pi_m2lvl[pi_act] * 3);
|
||||
if (its_1pr) flags = flags | F_1PR; /* store 1-proc */
|
||||
its_1pr = 0; } /* clear 1-proc */
|
||||
else ea = upta + UPT_T10_PAG;
|
||||
WriteP (ea, pager_word); /* write page fail wd */
|
||||
WriteP (ADDA (ea, 1), XWD (flags, pager_PC));
|
||||
mb = ReadP (ADDA (ea, 2)); }
|
||||
WriteP (upta + UPT_T20_PFL, pager_word); /* write page fail wd */
|
||||
WriteP (upta + UPT_T20_OFL, XWD (flags, 0));
|
||||
WriteP (upta + UPT_T20_OPC, pager_PC);
|
||||
mb = ReadP (upta + UPT_T20_NPC); }
|
||||
else {
|
||||
a10 ea; /* TOPS-10 or ITS */
|
||||
if (ITS) { /* ITS? */
|
||||
ea = epta + EPT_ITS_PAG + (pi_m2lvl[pi_act] * 3);
|
||||
if (its_1pr) flags = flags | F_1PR; /* store 1-proc */
|
||||
its_1pr = 0; } /* clear 1-proc */
|
||||
else ea = upta + UPT_T10_PAG;
|
||||
WriteP (ea, pager_word); /* write page fail wd */
|
||||
WriteP (ADDA (ea, 1), XWD (flags, pager_PC));
|
||||
mb = ReadP (ADDA (ea, 2)); }
|
||||
JUMP (mb); /* set new PC */
|
||||
set_newflags (mb, FALSE); /* set new flags */
|
||||
pi_eval (); } /* eval pi system */
|
||||
@@ -667,30 +668,29 @@ if (qintr) {
|
||||
int32 vec, uba;
|
||||
pager_pi = TRUE; /* flag in pi seq */
|
||||
if (vec = pi_ub_vec (qintr, &uba)) { /* Unibus interrupt? */
|
||||
mb = ReadP (epta + EPT_UBIT + uba); /* get dispatch table */
|
||||
if (mb == 0) ABORT (STOP_ZERINT); /* invalid? stop */
|
||||
inst = ReadE ((((a10) mb) + (vec / 4)) & AMASK);
|
||||
if (inst == 0)
|
||||
ABORT (STOP_ZERINT); }
|
||||
mb = ReadP (epta + EPT_UBIT + uba); /* get dispatch table */
|
||||
if (mb == 0) ABORT (STOP_ZERINT); /* invalid? stop */
|
||||
inst = ReadE ((((a10) mb) + (vec / 4)) & AMASK);
|
||||
if (inst == 0) ABORT (STOP_ZERINT); }
|
||||
else inst = ReadP (epta + EPT_PIIT + (2 * qintr));
|
||||
op = GET_OP (inst); /* get opcode */
|
||||
ac = GET_AC (inst); /* get ac */
|
||||
if (its_1pr && ITS) { /* 1-proc set? */
|
||||
flags = flags | F_1PR; /* store 1-proc */
|
||||
its_1pr = 0; } /* clear 1-proc */
|
||||
flags = flags | F_1PR; /* store 1-proc */
|
||||
its_1pr = 0; } /* clear 1-proc */
|
||||
if (op == OP_JSR) { /* JSR? */
|
||||
ea = calc_ea (inst, MM_CUR); /* calc ea, cur mode */
|
||||
WriteE (ea, FLPC); /* save flags+PC, exec */
|
||||
JUMP (INCA (ea)); /* PC = ea + 1 */
|
||||
set_newflags (0, FALSE); } /* set new flags */
|
||||
ea = calc_ea (inst, MM_CUR); /* calc ea, cur mode */
|
||||
WriteE (ea, FLPC); /* save flags+PC, exec */
|
||||
JUMP (INCA (ea)); /* PC = ea + 1 */
|
||||
set_newflags (0, FALSE); } /* set new flags */
|
||||
else if ((op == OP_JRST) && (ac == AC_XPCW)) { /* XPCW? */
|
||||
ea = calc_ea (inst, MM_CUR); /* calc ea, cur mode */
|
||||
WriteE (ea, XWD (flags, 0)); /* write flags, exec */
|
||||
WriteE (ADDA (ea, 1), PC); /* write PC, exec */
|
||||
rs[0] = ReadE (ADDA (ea, 2)); /* read new flags */
|
||||
rs[1] = ReadE (ADDA (ea, 3)); /* read new PC */
|
||||
JUMP (rs[1]); /* set new PC */
|
||||
set_newflags (rs[0], FALSE); } /* set new flags */
|
||||
ea = calc_ea (inst, MM_CUR); /* calc ea, cur mode */
|
||||
WriteE (ea, XWD (flags, 0)); /* write flags, exec */
|
||||
WriteE (ADDA (ea, 1), PC); /* write PC, exec */
|
||||
rs[0] = ReadE (ADDA (ea, 2)); /* read new flags */
|
||||
rs[1] = ReadE (ADDA (ea, 3)); /* read new PC */
|
||||
JUMP (rs[1]); /* set new PC */
|
||||
set_newflags (rs[0], FALSE); } /* set new flags */
|
||||
else ABORT (STOP_ILLINT); /* invalid instr */
|
||||
pi_act = pi_act | pi_l2bit[qintr]; /* set level active */
|
||||
pi_eval (); /* eval pi system */
|
||||
@@ -712,7 +712,7 @@ if (TSTF (F_T1 | F_T2) && PAGING) {
|
||||
pager_tc = TRUE; /* in a trap sequence */
|
||||
pager_flags = flags; /* save flags */
|
||||
ea = (TSTF (F_USR)? upta + UPT_TRBASE: epta + EPT_TRBASE)
|
||||
+ GET_TRAPS (flags);
|
||||
+ GET_TRAPS (flags);
|
||||
inst = ReadP (ea); /* get trap instr */
|
||||
CLRF (F_T1 | F_T2); } /* clear flags */
|
||||
|
||||
@@ -720,7 +720,7 @@ if (TSTF (F_T1 | F_T2) && PAGING) {
|
||||
|
||||
else { if (sim_brk_summ &&
|
||||
sim_brk_test (PC, SWMASK ('E'))) { /* breakpoint? */
|
||||
ABORT (STOP_IBKPT); } /* stop simulation */
|
||||
ABORT (STOP_IBKPT); } /* stop simulation */
|
||||
|
||||
/* Ready (at last) to get an instruction */
|
||||
|
||||
@@ -790,12 +790,12 @@ case 0037:
|
||||
/* case 0100: MUUO /* UJEN */
|
||||
/* case 0101: MUUO /* unassigned */
|
||||
case 0102: if (ITS && !TSTF (F_USR)) { /* GFAD (KL), XCTRI (ITS) */
|
||||
inst = Read (ea, MM_OPND);
|
||||
pflgs = pflgs | ac; goto XCT; }
|
||||
inst = Read (ea, MM_OPND);
|
||||
pflgs = pflgs | ac; goto XCT; }
|
||||
goto MUUO;
|
||||
case 0103: if (ITS && !TSTF (F_USR)) { /* GFSB (KL), XCTR (ITS) */
|
||||
inst = Read (ea, MM_OPND);
|
||||
pflgs = pflgs | ac; goto XCT; }
|
||||
inst = Read (ea, MM_OPND);
|
||||
pflgs = pflgs | ac; goto XCT; }
|
||||
goto MUUO;
|
||||
/* case 0104: MUUO /* JSYS (T20) */
|
||||
case 0105: AC(ac) = adjsp (AC(ac), ea); break; /* ADJSP */
|
||||
@@ -919,9 +919,9 @@ case 0252: AOBAC; if (TGE (AC(ac))) JUMP (ea); break; /* AOBJP */
|
||||
case 0253: AOBAC; if (TL (AC(ac))) JUMP (ea); break; /* AOBJN */
|
||||
/* case 0254: /* shown later /* JRST */
|
||||
case 0255: if (flags & (ac << 14)) { /* JFCL */
|
||||
JUMP (ea); CLRF (ac << 14); } break;
|
||||
JUMP (ea); CLRF (ac << 14); } break;
|
||||
case 0256: if (xct_cnt++ >= xct_max) /* XCT */
|
||||
ABORT (STOP_XCT);
|
||||
ABORT (STOP_XCT);
|
||||
inst = Read (ea, MM_OPND);
|
||||
if (ac && !TSTF (F_USR) && !ITS) pflgs = pflgs | ac;
|
||||
goto XCT;
|
||||
@@ -1263,16 +1263,17 @@ case 0725: IOA; io725 (AC(ac), ea); break; /* BCIOB, IOWRBQ */
|
||||
default:
|
||||
MUUO: its_2pr = 0; /* clear trap */
|
||||
if (T20) { /* TOPS20? */
|
||||
int32 tf = (op << (INST_V_OP - 18)) | (ac << (INST_V_AC - 18));
|
||||
WriteP (upta + UPT_MUUO, XWD ( /* store flags,,op+ac */
|
||||
flags & ~(F_T2 | F_T1), tf)); /* traps clear */
|
||||
WriteP (upta + UPT_MUPC, PC); /* store PC */
|
||||
WriteP (upta + UPT_T20_UEA, ea); /* store eff addr */
|
||||
WriteP (upta + UPT_T20_CTX, UBRWORD); } /* store context */
|
||||
else { WriteP (upta + UPT_MUUO, UUOWORD); /* store instr word */
|
||||
WriteP (upta + UPT_MUPC, XWD ( /* store flags,,PC */
|
||||
flags & ~(F_T2 | F_T1), PC)); /* traps clear */
|
||||
WriteP (upta + UPT_T10_CTX, UBRWORD); } /* store context */
|
||||
int32 tf = (op << (INST_V_OP - 18)) | (ac << (INST_V_AC - 18));
|
||||
WriteP (upta + UPT_MUUO, XWD ( /* store flags,,op+ac */
|
||||
flags & ~(F_T2 | F_T1), tf)); /* traps clear */
|
||||
WriteP (upta + UPT_MUPC, PC); /* store PC */
|
||||
WriteP (upta + UPT_T20_UEA, ea); /* store eff addr */
|
||||
WriteP (upta + UPT_T20_CTX, UBRWORD); } /* store context */
|
||||
else { /* TOPS10/ITS */
|
||||
WriteP (upta + UPT_MUUO, UUOWORD); /* store instr word */
|
||||
WriteP (upta + UPT_MUPC, XWD ( /* store flags,,PC */
|
||||
flags & ~(F_T2 | F_T1), PC)); /* traps clear */
|
||||
WriteP (upta + UPT_T10_CTX, UBRWORD); } /* store context */
|
||||
ea = upta + (TSTF (F_USR)? UPT_UNPC: UPT_ENPC) +
|
||||
(pager_tc? UPT_NPCT: 0); /* calculate vector */
|
||||
mb = ReadP (ea); /* new flags, PC */
|
||||
@@ -1292,69 +1293,69 @@ MUUO: its_2pr = 0; /* clear trap */
|
||||
case 0254: /* JRST */
|
||||
i = jrst_tab[ac]; /* get subop flags */
|
||||
if ((i == 0) || ((i == JRST_E) && TSTF (F_USR)) ||
|
||||
((i == JRST_UIO) && TSTF (F_USR) && !TSTF (F_UIO)))
|
||||
goto MUUO; /* not legal */
|
||||
((i == JRST_UIO) && TSTF (F_USR) && !TSTF (F_UIO)))
|
||||
goto MUUO; /* not legal */
|
||||
switch (ac) { /* case on subopcode */
|
||||
case 000: /* JRST 0 = jump */
|
||||
case 001: /* JRST 1 = portal */
|
||||
JUMP (ea);
|
||||
break;
|
||||
JUMP (ea);
|
||||
break;
|
||||
case 002: /* JRST 2 = JRSTF */
|
||||
mb = calc_jrstfea (inst, pflgs); /* recalc addr w flgs */
|
||||
JUMP (ea); /* set new PC */
|
||||
set_newflags (mb, TRUE); /* set new flags */
|
||||
break;
|
||||
mb = calc_jrstfea (inst, pflgs); /* recalc addr w flgs */
|
||||
JUMP (ea); /* set new PC */
|
||||
set_newflags (mb, TRUE); /* set new flags */
|
||||
break;
|
||||
case 004: /* JRST 4 = halt */
|
||||
JUMP (ea); /* old_PC = halt + 1 */
|
||||
pager_PC = PC; /* force right PC */
|
||||
ABORT (STOP_HALT); /* known to be exec */
|
||||
break;
|
||||
JUMP (ea); /* old_PC = halt + 1 */
|
||||
pager_PC = PC; /* force right PC */
|
||||
ABORT (STOP_HALT); /* known to be exec */
|
||||
break;
|
||||
case 005: /* JRST 5 = XJRSTF */
|
||||
RD2; /* read doubleword */
|
||||
JUMP (rs[1]); /* set new PC */
|
||||
set_newflags (rs[0], TRUE); /* set new flags */
|
||||
break;
|
||||
RD2; /* read doubleword */
|
||||
JUMP (rs[1]); /* set new PC */
|
||||
set_newflags (rs[0], TRUE); /* set new flags */
|
||||
break;
|
||||
case 006: /* JRST 6 = XJEN */
|
||||
RD2; /* read doubleword */
|
||||
pi_dismiss (); /* page ok, dismiss */
|
||||
JUMP (rs[1]); /* set new PC */
|
||||
set_newflags (rs[0], FALSE); /* known to be exec */
|
||||
break;
|
||||
RD2; /* read doubleword */
|
||||
pi_dismiss (); /* page ok, dismiss */
|
||||
JUMP (rs[1]); /* set new PC */
|
||||
set_newflags (rs[0], FALSE); /* known to be exec */
|
||||
break;
|
||||
case 007: /* JRST 7 = XPCW */
|
||||
ea = ADDA (i = ea, 2); /* new flags, PC */
|
||||
RD2; /* read, test page fail */
|
||||
ReadM (INCA (i), MM_OPND); /* test PC write */
|
||||
Write (i, XWD (flags, 0), MM_OPND); /* write flags */
|
||||
Write (INCA (i), PC, MM_OPND); /* write PC */
|
||||
JUMP (rs[1]); /* set new PC */
|
||||
set_newflags (rs[0], FALSE); /* known to be exec */
|
||||
break;
|
||||
ea = ADDA (i = ea, 2); /* new flags, PC */
|
||||
RD2; /* read, test page fail */
|
||||
ReadM (INCA (i), MM_OPND); /* test PC write */
|
||||
Write (i, XWD (flags, 0), MM_OPND); /* write flags */
|
||||
Write (INCA (i), PC, MM_OPND); /* write PC */
|
||||
JUMP (rs[1]); /* set new PC */
|
||||
set_newflags (rs[0], FALSE); /* known to be exec */
|
||||
break;
|
||||
case 010: /* JRST 10 = dismiss */
|
||||
pi_dismiss (); /* dismiss int */
|
||||
JUMP (ea); /* set new PC */
|
||||
break;
|
||||
pi_dismiss (); /* dismiss int */
|
||||
JUMP (ea); /* set new PC */
|
||||
break;
|
||||
case 012: /* JRST 12 = JEN */
|
||||
mb = calc_jrstfea (inst, pflgs); /* recalc addr w flgs */
|
||||
JUMP (ea); /* set new PC */
|
||||
set_newflags (mb, TRUE); /* set new flags */
|
||||
pi_dismiss (); /* dismiss int */
|
||||
break;
|
||||
mb = calc_jrstfea (inst, pflgs); /* recalc addr w flgs */
|
||||
JUMP (ea); /* set new PC */
|
||||
set_newflags (mb, TRUE); /* set new flags */
|
||||
pi_dismiss (); /* dismiss int */
|
||||
break;
|
||||
case 014: /* JRST 14 = SFM */
|
||||
Write (ea, XWD (flags, 0), MM_OPND);
|
||||
break;
|
||||
Write (ea, XWD (flags, 0), MM_OPND);
|
||||
break;
|
||||
case 015: /* JRST 15 = XJRST */
|
||||
if (!T20) goto MUUO; /* only in TOPS20 */
|
||||
JUMP (Read (ea, MM_OPND)); /* jump to M[ea] */
|
||||
break; } /* end case subop */
|
||||
if (!T20) goto MUUO; /* only in TOPS20 */
|
||||
JUMP (Read (ea, MM_OPND)); /* jump to M[ea] */
|
||||
break; } /* end case subop */
|
||||
break; } /* end case op */
|
||||
|
||||
if (its_2pr) { /* 1-proc trap? */
|
||||
its_1pr = its_2pr = 0; /* clear trap */
|
||||
if (ITS) { /* better be ITS */
|
||||
WriteP (upta + UPT_1PO, FLPC); /* wr old flgs, PC */
|
||||
mb = ReadP (upta + UPT_1PN); /* rd new flgs, PC */
|
||||
JUMP (mb); /* set PC */
|
||||
set_newflags (mb, TRUE); } /* set new flags */
|
||||
WriteP (upta + UPT_1PO, FLPC); /* wr old flgs, PC */
|
||||
mb = ReadP (upta + UPT_1PN); /* rd new flgs, PC */
|
||||
JUMP (mb); /* set PC */
|
||||
set_newflags (mb, TRUE); } /* set new flags */
|
||||
} /* end if 2-proc */
|
||||
} /* end for */
|
||||
|
||||
@@ -1490,15 +1491,17 @@ int32 sc = LIT8 (ea);
|
||||
if (sc > 71) AC(ac) = AC(p1) = 0;
|
||||
else if (ea & RSIGN) {
|
||||
if (sc >= 36) {
|
||||
AC(p1) = AC(ac) >> (sc - 36);
|
||||
AC(ac) = 0; }
|
||||
else { AC(p1) = ((AC(p1) >> sc) | (AC(ac) << (36 - sc))) & DMASK;
|
||||
AC(ac) = AC(ac) >> sc; } }
|
||||
AC(p1) = AC(ac) >> (sc - 36);
|
||||
AC(ac) = 0; }
|
||||
else {
|
||||
AC(p1) = ((AC(p1) >> sc) | (AC(ac) << (36 - sc))) & DMASK;
|
||||
AC(ac) = AC(ac) >> sc; } }
|
||||
else { if (sc >= 36) {
|
||||
AC(ac) = (AC(p1) << (sc - 36)) & DMASK;
|
||||
AC(p1) = 0; }
|
||||
else { AC(ac) = ((AC(ac) << sc) | (AC(p1) >> (36 - sc))) & DMASK;
|
||||
AC(p1) = (AC(p1) << sc) & DMASK; } }
|
||||
AC(ac) = (AC(p1) << (sc - 36)) & DMASK;
|
||||
AC(p1) = 0; }
|
||||
else {
|
||||
AC(ac) = ((AC(ac) << sc) | (AC(p1) >> (36 - sc))) & DMASK;
|
||||
AC(p1) = (AC(p1) << sc) & DMASK; } }
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1530,10 +1533,10 @@ d10 fill = sign? ONES: 0;
|
||||
d10 so;
|
||||
|
||||
if (sc == 0) return val;
|
||||
if (sc > 35) sc = 35; /* cap sc at 35 */
|
||||
if (sc > 35) sc = 35; /* cap sc at 35 */
|
||||
if (ea & RSIGN)
|
||||
return (((val >> sc) | (fill << (36 - sc))) & DMASK);
|
||||
so = val >> (35 - sc); /* bits lost left + sign */
|
||||
so = val >> (35 - sc); /* bits lost left + sign */
|
||||
if (so != (sign? bytemask[sc + 1]: 0)) SETF (F_AOV | F_T1);
|
||||
return (sign | ((val << sc) & MMASK));
|
||||
}
|
||||
@@ -1552,22 +1555,24 @@ AC(ac) = CLRS (AC(ac)); /* clear signs */
|
||||
AC(p1) = CLRS (AC(p1));
|
||||
if (ea & RSIGN) {
|
||||
if (sc >= 35) { /* right 36..70 */
|
||||
AC(p1) = ((AC(ac) >> (sc - 35)) | (fill << (70 - sc))) & DMASK;
|
||||
AC(ac) = fill; }
|
||||
else { AC(p1) = sign | /* right 1..35 */
|
||||
(((AC(p1) >> sc) | (AC(ac) << (35 - sc))) & MMASK);
|
||||
AC(ac) = ((AC(ac) >> sc) | (fill << (35 - sc))) & DMASK; } }
|
||||
AC(p1) = ((AC(ac) >> (sc - 35)) | (fill << (70 - sc))) & DMASK;
|
||||
AC(ac) = fill; }
|
||||
else {
|
||||
AC(p1) = sign | /* right 1..35 */
|
||||
(((AC(p1) >> sc) | (AC(ac) << (35 - sc))) & MMASK);
|
||||
AC(ac) = ((AC(ac) >> sc) | (fill << (35 - sc))) & DMASK; } }
|
||||
else { if (sc >= 35) { /* left 36..70 */
|
||||
so = AC(p1) >> (70 - sc); /* bits lost left */
|
||||
if ((AC(ac) != (sign? MMASK: 0)) ||
|
||||
(so != (sign? bytemask[sc - 35]: 0))) SETF (F_AOV | F_T1);
|
||||
AC(ac) = sign | ((AC(p1) << (sc - 35)) & MMASK);
|
||||
AC(p1) = sign; }
|
||||
else { so = AC(ac) >> (35 - sc); /* bits lost left */
|
||||
if (so != (sign? bytemask[sc]: 0)) SETF (F_AOV | F_T1);
|
||||
AC(ac) = sign |
|
||||
(((AC(ac) << sc) | (AC(p1) >> (35 - sc))) & MMASK);
|
||||
AC(p1) = sign | ((AC(p1) << sc) & MMASK); } }
|
||||
so = AC(p1) >> (70 - sc); /* bits lost left */
|
||||
if ((AC(ac) != (sign? MMASK: 0)) ||
|
||||
(so != (sign? bytemask[sc - 35]: 0))) SETF (F_AOV | F_T1);
|
||||
AC(ac) = sign | ((AC(p1) << (sc - 35)) & MMASK);
|
||||
AC(p1) = sign; }
|
||||
else {
|
||||
so = AC(ac) >> (35 - sc); /* bits lost left */
|
||||
if (so != (sign? bytemask[sc]: 0)) SETF (F_AOV | F_T1);
|
||||
AC(ac) = sign |
|
||||
(((AC(ac) << sc) | (AC(p1) >> (35 - sc))) & MMASK);
|
||||
AC(p1) = sign | ((AC(p1) << sc) & MMASK); } }
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1713,14 +1718,14 @@ if (s) {
|
||||
left = (36 - p) / s; /* bytes to left of p */
|
||||
bywrd = left + (p / s); /* bytes per word */
|
||||
if (bywrd == 0) { /* zero bytes? */
|
||||
SETF (F_AOV | F_T1 | F_DCK); /* set flags */
|
||||
return; } /* abort operation */
|
||||
SETF (F_AOV | F_T1 | F_DCK); /* set flags */
|
||||
return; } /* abort operation */
|
||||
newby = left + SXT (val); /* adjusted byte # */
|
||||
wdadj = newby / bywrd; /* word adjustment */
|
||||
byadj = (newby >= 0)? newby % bywrd: -((-newby) % bywrd);
|
||||
if (byadj <= 0) {
|
||||
byadj = byadj + bywrd; /* make adj positive */
|
||||
wdadj = wdadj - 1; }
|
||||
byadj = byadj + bywrd; /* make adj positive */
|
||||
wdadj = wdadj - 1; }
|
||||
p = (36 - ((int32) byadj) * s) - ((36 - p) % s); /* new p */
|
||||
bp = (PUT_P (bp, p) & LMASK) | ((bp + wdadj) & RMASK); }
|
||||
AC(ac) = bp;
|
||||
@@ -1745,14 +1750,14 @@ int32 flg, t;
|
||||
AC(ac) = XWD (srca + lnt, dsta + lnt);
|
||||
for (flg = 0; dsta <= ea; flg++) { /* loop */
|
||||
if (flg && (t = test_int ())) { /* timer event? */
|
||||
AC(ac) = XWD (srca, dsta); /* AC for intr */
|
||||
ABORT (t); }
|
||||
AC(ac) = XWD (srca, dsta); /* AC for intr */
|
||||
ABORT (t); }
|
||||
if (AccViol (srca & AMASK, MM_BSTK, PTF_RD)) { /* src access viol? */
|
||||
AC(ac) = XWD (srca, dsta); /* AC for page fail */
|
||||
Read (srca & AMASK, MM_BSTK); } /* force trap */
|
||||
AC(ac) = XWD (srca, dsta); /* AC for page fail */
|
||||
Read (srca & AMASK, MM_BSTK); } /* force trap */
|
||||
if (AccViol (dsta & AMASK, MM_OPND, PTF_WR)) { /* dst access viol? */
|
||||
AC(ac) = XWD (srca, dsta); /* AC for page fail */
|
||||
ReadM (dsta & AMASK, MM_OPND); } /* force trap */
|
||||
AC(ac) = XWD (srca, dsta); /* AC for page fail */
|
||||
ReadM (dsta & AMASK, MM_OPND); } /* force trap */
|
||||
srcv = Read (srca & AMASK, MM_BSTK); /* read */
|
||||
Write (dsta & AMASK, srcv, MM_OPND); /* write */
|
||||
srca = srca + 1; /* incr addr */
|
||||
@@ -1779,19 +1784,19 @@ int32 flg, t;
|
||||
AC(ac) = XWD (srca + lnt, dsta + lnt);
|
||||
for (flg = 0; dsta <= ea; flg++) { /* loop */
|
||||
if (flg && (t = test_int ())) { /* timer event? */
|
||||
AC(ac) = XWD (srca, dsta); /* AC for intr */
|
||||
ABORT (t); }
|
||||
AC(ac) = XWD (srca, dsta); /* AC for intr */
|
||||
ABORT (t); }
|
||||
if (AccViol (srca & AMASK, MM_BSTK, PTF_RD)) { /* src access viol? */
|
||||
AC(ac) = XWD (srca, dsta); /* AC for page fail */
|
||||
Read (srca & AMASK, MM_BSTK); } /* force trap */
|
||||
AC(ac) = XWD (srca, dsta); /* AC for page fail */
|
||||
Read (srca & AMASK, MM_BSTK); } /* force trap */
|
||||
if (AccViol (dsta & AMASK, MM_OPND, PTF_WR)) { /* dst access viol? */
|
||||
AC(ac) = XWD (srca, dsta); /* AC for page fail */
|
||||
ReadM (dsta & AMASK, MM_OPND); } /* force trap */
|
||||
AC(ac) = XWD (srca, dsta); /* AC for page fail */
|
||||
ReadM (dsta & AMASK, MM_OPND); } /* force trap */
|
||||
srcv = Read (srca & AMASK, MM_BSTK); /* read */
|
||||
if (dir) dstv = ((srcv << 10) & BYTE1) | ((srcv >> 6) & BYTE2) |
|
||||
((srcv << 12) & BYTE3) | ((srcv >> 4) & BYTE4);
|
||||
((srcv << 12) & BYTE3) | ((srcv >> 4) & BYTE4);
|
||||
else dstv = ((srcv & BYTE1) >> 10) | ((srcv & BYTE2) << 6) |
|
||||
((srcv & BYTE3) >> 12) | ((srcv & BYTE4) << 4);
|
||||
((srcv & BYTE3) >> 12) | ((srcv & BYTE4) << 4);
|
||||
Write (dsta & AMASK, dstv, MM_OPND); /* write */
|
||||
srca = srca + 1; /* incr addr */
|
||||
dsta = dsta + 1; }
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* pdp10_defs.h: PDP-10 simulator definitions
|
||||
|
||||
Copyright (c) 1993-2002, Robert M Supnik
|
||||
Copyright (c) 1993-2003, Robert M Supnik
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
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
|
||||
in this Software without prior written authorization from Robert M Supnik.
|
||||
|
||||
09-Jan-03 RMS Added DEUNA/DELUA support
|
||||
29-Sep-02 RMS Added variable vector, RX211 support
|
||||
22-Apr-02 RMS Removed magtape record length error
|
||||
20-Jan-02 RMS Added multiboard DZ11 support
|
||||
@@ -637,6 +638,8 @@ typedef struct pdp_dib DIB;
|
||||
#define IOLN_UBCS3 001
|
||||
#define IOBA_UBMNT3 (IO_UBA3 + 0763101) /* Unibus 3 maint reg */
|
||||
#define IOLN_UBMNT3 001
|
||||
#define IOBA_XU (IO_UBA3 + 0774510) /* DEUNA/DELUA */
|
||||
#define IOLN_XU 010
|
||||
#define IOBA_RY (IO_UBA3 + 0777170) /* RX211 */
|
||||
#define IOLN_RY 004
|
||||
#define IOBA_TU (IO_UBA3 + 0772440) /* RH11/tape */
|
||||
@@ -672,6 +675,7 @@ typedef struct pdp_dib DIB;
|
||||
|
||||
#define INT_V_RP 6 /* RH11/RP,RM drives */
|
||||
#define INT_V_TU 7 /* RH11/TM03/TU45 */
|
||||
#define INT_V_XU 15 /* DEUNA/DELUA */
|
||||
#define INT_V_DZRX 16 /* DZ11 */
|
||||
#define INT_V_DZTX 17
|
||||
#define INT_V_RY 18 /* RX211 */
|
||||
@@ -681,6 +685,7 @@ typedef struct pdp_dib DIB;
|
||||
|
||||
#define INT_RP (1u << INT_V_RP)
|
||||
#define INT_TU (1u << INT_V_TU)
|
||||
#define INT_XU (1u << INT_V_XU)
|
||||
#define INT_DZRX (1u << INT_V_DZRX)
|
||||
#define INT_DZTX (1u << INT_V_DZTX)
|
||||
#define INT_RY (1u << INT_V_RY)
|
||||
@@ -690,6 +695,7 @@ typedef struct pdp_dib DIB;
|
||||
|
||||
#define IPL_RP 6 /* int levels */
|
||||
#define IPL_TU 6
|
||||
#define IPL_XU 5
|
||||
#define IPL_DZRX 5
|
||||
#define IPL_DZTX 5
|
||||
#define IPL_RY 5
|
||||
@@ -708,6 +714,7 @@ typedef struct pdp_dib DIB;
|
||||
#define VEC_Q 0000 /* vector base */
|
||||
#define VEC_PTR 0070 /* interrupt vectors */
|
||||
#define VEC_PTP 0074
|
||||
#define VEC_XU 0120
|
||||
#define VEC_TU 0224
|
||||
#define VEC_RP 0254
|
||||
#define VEC_RY 0264
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
To: Users
|
||||
From: Bob Supnik
|
||||
Subj: PDP-10 Simulator Usage
|
||||
Date: 15-Nov-2002
|
||||
Date: 15-Jan-2003
|
||||
|
||||
COPYRIGHT NOTICE
|
||||
|
||||
The following copyright notice applies to both the SIMH source and binary:
|
||||
|
||||
Original code published in 1993-2002, written by Robert M Supnik
|
||||
Copyright (c) 1993-2002, Robert M Supnik
|
||||
Original code published in 1993-2003, written by Robert M Supnik
|
||||
Copyright (c) 1993-2003, Robert M Supnik
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
@@ -45,10 +45,12 @@ sim/ dec_dz.h
|
||||
sim_rev.h
|
||||
sim_sock.h
|
||||
sim_tmxr.h
|
||||
sim_ether.h
|
||||
scp.c
|
||||
scp_tty.c
|
||||
sim_sock.c
|
||||
sim_tmxr.c
|
||||
sim_ether.c
|
||||
|
||||
sim/pdp10/ pdp10_defs.h
|
||||
pdp10_cpu.c
|
||||
@@ -65,6 +67,7 @@ sim/pdp10/ pdp10_defs.h
|
||||
pdp10_xtnd.c
|
||||
|
||||
sim/pdp11/ pdp11_ry.c
|
||||
pdp11_xu.c
|
||||
|
||||
2. PDP-10 Features
|
||||
|
||||
@@ -85,6 +88,7 @@ LP20 LP20 line printer
|
||||
RP RH11/RP04/RP05/RP06/RP07/RM03/RM05/RM80 controller with
|
||||
eight drives
|
||||
TU RH11/TM02/TU45 controller with eight drives
|
||||
XU DEUNA/DELUA Ethernet controller
|
||||
|
||||
The PTR, PTP, and RX211 are initially set DISABLED. The DZ11 and LP20 can
|
||||
also be set DISABLED. Some devices support the SET ADDRESS command, which
|
||||
@@ -563,7 +567,12 @@ Error handling is as follows:
|
||||
RX02 data files are buffered in memory; therefore, end of file and OS
|
||||
I/O errors cannot occur.
|
||||
|
||||
2.13 Symbolic Display and Input
|
||||
2.13 DEUNA/DELUA Ethernet Controller (XU)
|
||||
|
||||
XU simulates the DEUNA/DELUA Ethernet controller. The current implementation
|
||||
is a stub and is permanently disabled.
|
||||
|
||||
2.14 Symbolic Display and Input
|
||||
|
||||
The PDP-10 simulator implements symbolic display and input. Display is
|
||||
controlled by command line switches:
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
fe KS10 console front end
|
||||
|
||||
22-Dec-02 RMS Added break support
|
||||
30-May-02 RMS Widened COUNT to 32b
|
||||
30-Nov-01 RMS Added extended SET/SHOW support
|
||||
23-Oct-01 RMS New IO page address constants
|
||||
@@ -128,6 +129,7 @@ int32 temp;
|
||||
|
||||
sim_activate (&fei_unit, fei_unit.wait); /* continue poll */
|
||||
if ((temp = sim_poll_kbd ()) < SCPE_KFLAG) return temp; /* no char or error? */
|
||||
if (temp & SCPE_BREAK) return SCPE_OK; /* ignore break */
|
||||
fei_unit.buf = temp & 0177;
|
||||
fei_unit.pos = fei_unit.pos + 1;
|
||||
M[FE_CTYIN] = fei_unit.buf | FE_CVALID; /* put char in mem */
|
||||
|
||||
@@ -371,9 +371,9 @@ DIB *dibp;
|
||||
for (i = 0; dibp = dib_tab[i]; i++ ) {
|
||||
if ((pa >= dibp->ba) &&
|
||||
(pa < (dibp->ba + dibp->lnt))) {
|
||||
dibp->rd (&val, pa, READ);
|
||||
pi_eval ();
|
||||
return ((d10) val); } }
|
||||
dibp->rd (&val, pa, READ);
|
||||
pi_eval ();
|
||||
return ((d10) val); } }
|
||||
UBNXM_FAIL (pa, READ);
|
||||
}
|
||||
|
||||
@@ -386,9 +386,9 @@ DIB *dibp;
|
||||
for (i = 0; dibp = dib_tab[i]; i++ ) {
|
||||
if ((pa >= dibp->ba) &&
|
||||
(pa < (dibp->ba + dibp->lnt))) {
|
||||
dibp->wr ((int32) val, pa, mode);
|
||||
pi_eval ();
|
||||
return; } }
|
||||
dibp->wr ((int32) val, pa, mode);
|
||||
pi_eval ();
|
||||
return; } }
|
||||
UBNXM_FAIL (pa, mode);
|
||||
}
|
||||
|
||||
@@ -414,8 +414,8 @@ lim = ba + bc;
|
||||
for ( ; ba < lim; ba++) { /* by bytes */
|
||||
pa10 = Map_Addr10 (ba, ub); /* map addr */
|
||||
if ((pa10 < 0) || MEM_ADDR_NXM (pa10)) { /* inv map or NXM? */
|
||||
ubcs[ub] = ubcs[ub] | UBCS_TMO; /* UBA times out */
|
||||
return (lim - ba); } /* return bc */
|
||||
ubcs[ub] = ubcs[ub] | UBCS_TMO; /* UBA times out */
|
||||
return (lim - ba); } /* return bc */
|
||||
*buf++ = (uint8) ((M[pa10] >> ubashf[ba & 3]) & 0377);
|
||||
}
|
||||
return 0;
|
||||
@@ -431,8 +431,8 @@ lim = ba + (bc & ~01);
|
||||
for ( ; ba < lim; ba = ba + 2) { /* by words */
|
||||
pa10 = Map_Addr10 (ba, ub); /* map addr */
|
||||
if ((pa10 < 0) || MEM_ADDR_NXM (pa10)) { /* inv map or NXM? */
|
||||
ubcs[ub] = ubcs[ub] | UBCS_TMO; /* UBA times out */
|
||||
return (lim - ba); } /* return bc */
|
||||
ubcs[ub] = ubcs[ub] | UBCS_TMO; /* UBA times out */
|
||||
return (lim - ba); } /* return bc */
|
||||
*buf++ = (uint16) ((M[pa10] >> ((ba & 2)? 0: 18)) & 0177777);
|
||||
}
|
||||
return 0;
|
||||
@@ -448,8 +448,8 @@ lim = ba + bc;
|
||||
for ( ; ba < lim; ba++) { /* by bytes */
|
||||
pa10 = Map_Addr10 (ba, ub); /* map addr */
|
||||
if ((pa10 < 0) || MEM_ADDR_NXM (pa10)) { /* inv map or NXM? */
|
||||
ubcs[ub] = ubcs[ub] | UBCS_TMO; /* UBA times out */
|
||||
return (lim - ba); } /* return bc */
|
||||
ubcs[ub] = ubcs[ub] | UBCS_TMO; /* UBA times out */
|
||||
return (lim - ba); } /* return bc */
|
||||
M[pa10] = (M[pa10] & ~(mask << ubashf[ba & 3])) |
|
||||
(((d10) *buf++) << ubashf[ba & 3]); }
|
||||
return 0;
|
||||
@@ -466,8 +466,8 @@ lim = ba + (bc & ~01);
|
||||
for ( ; ba < lim; ba++) { /* by bytes */
|
||||
pa10 = Map_Addr10 (ba, ub); /* map addr */
|
||||
if ((pa10 < 0) || MEM_ADDR_NXM (pa10)) { /* inv map or NXM? */
|
||||
ubcs[ub] = ubcs[ub] | UBCS_TMO; /* UBA times out */
|
||||
return (lim - ba); } /* return bc */
|
||||
ubcs[ub] = ubcs[ub] | UBCS_TMO; /* UBA times out */
|
||||
return (lim - ba); } /* return bc */
|
||||
val = *buf++; /* get data */
|
||||
if (ba & 2) M[pa10] = (M[pa10] & 0777777600000) | val;
|
||||
else M[pa10] = (M[pa10] & 0600000777777) | (val << 18);
|
||||
@@ -483,9 +483,9 @@ int32 i, lvl;
|
||||
|
||||
for (i = lvl = 0; i < UBANUM; i++) {
|
||||
if (int_req & ubabr76[i])
|
||||
lvl = lvl | pi_l2bit[UBCS_GET_HI (ubcs[i])];
|
||||
lvl = lvl | pi_l2bit[UBCS_GET_HI (ubcs[i])];
|
||||
if (int_req & ubabr54[i])
|
||||
lvl = lvl | pi_l2bit[UBCS_GET_LO (ubcs[i])]; }
|
||||
lvl = lvl | pi_l2bit[UBCS_GET_LO (ubcs[i])]; }
|
||||
return lvl;
|
||||
}
|
||||
|
||||
@@ -502,15 +502,15 @@ int32 i, masked_irq;
|
||||
|
||||
for (i = masked_irq = 0; i < UBANUM; i++) {
|
||||
if ((rlvl == UBCS_GET_HI (ubcs[i])) && /* req on hi level? */
|
||||
(masked_irq = int_req & ubabr76[i])) break;
|
||||
(masked_irq = int_req & ubabr76[i])) break;
|
||||
if ((rlvl == UBCS_GET_LO (ubcs[i])) && /* req on lo level? */
|
||||
(masked_irq = int_req & ubabr54[i])) break; }
|
||||
(masked_irq = int_req & ubabr54[i])) break; }
|
||||
*uba = (i << 1) + 1; /* store uba # */
|
||||
for (i = 0; (i < 32) && masked_irq; i++) { /* find hi pri req */
|
||||
if ((masked_irq >> i) & 1) {
|
||||
int_req = int_req & ~(1u << i); /* clear req */
|
||||
if (int_ack[i]) return int_ack[i]();
|
||||
return int_vec[i]; } } /* return vector */
|
||||
int_req = int_req & ~(1u << i); /* clear req */
|
||||
if (int_ack[i]) return int_ack[i]();
|
||||
return int_vec[i]; } } /* return vector */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -272,17 +272,17 @@ update_lpcs (0); /* update csr's */
|
||||
switch ((pa >> 1) & 07) { /* case on PA<3:1> */
|
||||
case 00: /* LPCSA */
|
||||
if (access == WRITEB) data = (pa & 1)?
|
||||
(lpcsa & 0377) | (data << 8): (lpcsa & ~0377) | data;
|
||||
(lpcsa & 0377) | (data << 8): (lpcsa & ~0377) | data;
|
||||
if (data & CSA_ECLR) { /* error clear? */
|
||||
lpcsa = (lpcsa | CSA_DONE) & ~CSA_GO; /* set done, clr go */
|
||||
lpcsb = lpcsb & ~CSB_ECLR; /* clear err */
|
||||
sim_cancel (&lp20_unit); } /* cancel I/O */
|
||||
lpcsa = (lpcsa | CSA_DONE) & ~CSA_GO; /* set done, clr go */
|
||||
lpcsb = lpcsb & ~CSB_ECLR; /* clear err */
|
||||
sim_cancel (&lp20_unit); } /* cancel I/O */
|
||||
if (data & CSA_INIT) lp20_reset (&lp20_dev); /* init? */
|
||||
if (data & CSA_GO) { /* go set? */
|
||||
if ((lpcsa & CSA_GO) == 0) { /* not set before? */
|
||||
if (lpcsb & CSB_ERR) lpcsb = lpcsb | CSB_GOE;
|
||||
lpcsum = 0; /* clear checksum */
|
||||
sim_activate (&lp20_unit, lp20_unit.time); } }
|
||||
if ((lpcsa & CSA_GO) == 0) { /* not set before? */
|
||||
if (lpcsb & CSB_ERR) lpcsb = lpcsb | CSB_GOE;
|
||||
lpcsum = 0; /* clear checksum */
|
||||
sim_activate (&lp20_unit, lp20_unit.time); } }
|
||||
else sim_cancel (&lp20_unit); /* go clr, stop DMA */
|
||||
lpcsa = (lpcsa & ~CSA_RW) | (data & CSA_RW);
|
||||
break;
|
||||
@@ -290,31 +290,32 @@ case 01: /* LPCSB */
|
||||
break; /* ignore writes to TEST */
|
||||
case 02: /* LPBA */
|
||||
if (access == WRITEB) data = (pa & 1)?
|
||||
(lpba & 0377) | (data << 8): (lpba & ~0377) | data;
|
||||
(lpba & 0377) | (data << 8): (lpba & ~0377) | data;
|
||||
lpba = data;
|
||||
break;
|
||||
case 03: /* LPBC */
|
||||
if (access == WRITEB) data = (pa & 1)?
|
||||
(lpbc & 0377) | (data << 8): (lpbc & ~0377) | data;
|
||||
(lpbc & 0377) | (data << 8): (lpbc & ~0377) | data;
|
||||
lpbc = data & BC_MASK;
|
||||
lpcsa = lpcsa & ~CSA_DONE;
|
||||
break;
|
||||
case 04: /* LPPAGC */
|
||||
if (access == WRITEB) data = (pa & 1)?
|
||||
(lppagc & 0377) | (data << 8): (lppagc & ~0377) | data;
|
||||
(lppagc & 0377) | (data << 8): (lppagc & ~0377) | data;
|
||||
lppagc = data & PAGC_MASK;
|
||||
break;
|
||||
case 05: /* LPRDAT */
|
||||
if (access == WRITEB) data = (pa & 1)?
|
||||
(lprdat & 0377) | (data << 8): (lprdat & ~0377) | data;
|
||||
(lprdat & 0377) | (data << 8): (lprdat & ~0377) | data;
|
||||
lprdat = data & RDAT_MASK;
|
||||
txram[lpcbuf & TX_AMASK] = lprdat; /* load RAM */
|
||||
break;
|
||||
case 06: /* LPCOLC/LPCBUF */
|
||||
if ((access == WRITEB) && (pa & 1)) /* odd byte */
|
||||
lpcolc = data & 0377;
|
||||
else { lpcbuf = data & 0377; /* even byte, word */
|
||||
if (access == WRITE) lpcolc = (data >> 8) & 0377; }
|
||||
lpcolc = data & 0377;
|
||||
else {
|
||||
lpcbuf = data & 0377; /* even byte, word */
|
||||
if (access == WRITE) lpcolc = (data >> 8) & 0377; }
|
||||
break;
|
||||
case 07: /* LPCSUM/LPPDAT */
|
||||
break; } /* read only */
|
||||
@@ -371,9 +372,9 @@ if ((fnc == FNC_PR) && (dvlnt == 0)) {
|
||||
|
||||
for (i = 0, cont = TRUE; (i < tbc) && cont; ba++, i++) {
|
||||
if (Map_ReadW (ba, 2, &wd10, MAP)) { /* get word, err? */
|
||||
lpcsb = lpcsb | CSB_MTE; /* set NXM error */
|
||||
update_lpcs (CSA_ERR); /* set done */
|
||||
break; }
|
||||
lpcsb = lpcsb | CSB_MTE; /* set NXM error */
|
||||
update_lpcs (CSA_ERR); /* set done */
|
||||
break; }
|
||||
lpcbuf = (wd10 >> ((ba & 1)? 8: 0)) & 0377; /* get character */
|
||||
lpcsum = (lpcsum + lpcbuf) & 0377; /* add into checksum */
|
||||
switch (fnc) { /* switch on function */
|
||||
@@ -381,8 +382,8 @@ for (i = 0, cont = TRUE; (i < tbc) && cont; ba++, i++) {
|
||||
/* Translation RAM load */
|
||||
|
||||
case FNC_RAM: /* RAM load */
|
||||
txram[(i >> 1) & TX_AMASK] = wd10 & TX_DMASK;
|
||||
break;
|
||||
txram[(i >> 1) & TX_AMASK] = wd10 & TX_DMASK;
|
||||
break;
|
||||
|
||||
/* DAVFU RAM load. The DAVFU RAM is actually loaded in bytes, delimited by
|
||||
a start (354 to 356) and stop (357) byte pair. If the number of bytes
|
||||
@@ -390,48 +391,48 @@ for (i = 0, cont = TRUE; (i < tbc) && cont; ba++, i++) {
|
||||
*/
|
||||
|
||||
case FNC_DVU: /* DVU load */
|
||||
if ((lpcbuf >= 0354) && (lpcbuf <= 0356)) /* start DVU load? */
|
||||
dvld = dvlnt = 0; /* reset lnt */
|
||||
else if (lpcbuf == 0357) { /* stop DVU load? */
|
||||
dvptr = 0; /* reset ptr */
|
||||
if (dvld & 1) dvlnt = 0; } /* if odd, invalid */
|
||||
else if (dvld == 0) { /* even state? */
|
||||
temp = lpcbuf & DV_DMASK;
|
||||
dvld = 1; }
|
||||
else if (dvld == 1) { /* odd state? */
|
||||
if (dvlnt < DV_SIZE) davfu[dvlnt++] =
|
||||
temp | ((lpcbuf & DV_DMASK) << 6);
|
||||
dvld = 0; }
|
||||
break;
|
||||
if ((lpcbuf >= 0354) && (lpcbuf <= 0356)) /* start DVU load? */
|
||||
dvld = dvlnt = 0; /* reset lnt */
|
||||
else if (lpcbuf == 0357) { /* stop DVU load? */
|
||||
dvptr = 0; /* reset ptr */
|
||||
if (dvld & 1) dvlnt = 0; } /* if odd, invalid */
|
||||
else if (dvld == 0) { /* even state? */
|
||||
temp = lpcbuf & DV_DMASK;
|
||||
dvld = 1; }
|
||||
else if (dvld == 1) { /* odd state? */
|
||||
if (dvlnt < DV_SIZE) davfu[dvlnt++] =
|
||||
temp | ((lpcbuf & DV_DMASK) << 6);
|
||||
dvld = 0; }
|
||||
break;
|
||||
|
||||
/* Print characters */
|
||||
|
||||
case FNC_PR: /* print */
|
||||
lprdat = txram[lpcbuf]; /* get RAM char */
|
||||
txst = (TX_GETFL (lprdat) << 1) | /* get state */
|
||||
((lpcsa & CSA_DELH)? 1: 0); /* plus delim hold */
|
||||
if (lprdat & TX_DELH) lpcsa = lpcsa | CSA_DELH;
|
||||
else lpcsa = lpcsa & ~CSA_DELH;
|
||||
lpcsa = lpcsa & ~CSA_UNDF; /* assume char ok */
|
||||
switch (txcase[txst]) { /* case on state */
|
||||
case TX_CHR: /* take char */
|
||||
cont = lp20_print (lpcbuf);
|
||||
break;
|
||||
case TX_RAM: /* take translation */
|
||||
cont = lp20_print (lprdat);
|
||||
break;
|
||||
case TX_DVU: /* DAVFU action */
|
||||
if (lprdat & TX_SLEW)
|
||||
cont = lp20_adv (lprdat & TX_VMASK, TRUE);
|
||||
else cont = lp20_davfu (lprdat & TX_VMASK);
|
||||
break;
|
||||
case TX_INT: /* interrupt */
|
||||
lpcsa = lpcsa | CSA_UNDF; /* set flag */
|
||||
cont = FALSE; /* force stop */
|
||||
break; } /* end case char state */
|
||||
lprdat = txram[lpcbuf]; /* get RAM char */
|
||||
txst = (TX_GETFL (lprdat) << 1) | /* get state */
|
||||
((lpcsa & CSA_DELH)? 1: 0); /* plus delim hold */
|
||||
if (lprdat & TX_DELH) lpcsa = lpcsa | CSA_DELH;
|
||||
else lpcsa = lpcsa & ~CSA_DELH;
|
||||
lpcsa = lpcsa & ~CSA_UNDF; /* assume char ok */
|
||||
switch (txcase[txst]) { /* case on state */
|
||||
case TX_CHR: /* take char */
|
||||
cont = lp20_print (lpcbuf);
|
||||
break;
|
||||
case TX_RAM: /* take translation */
|
||||
cont = lp20_print (lprdat);
|
||||
break;
|
||||
case TX_DVU: /* DAVFU action */
|
||||
if (lprdat & TX_SLEW)
|
||||
cont = lp20_adv (lprdat & TX_VMASK, TRUE);
|
||||
else cont = lp20_davfu (lprdat & TX_VMASK);
|
||||
break;
|
||||
case TX_INT: /* interrupt */
|
||||
lpcsa = lpcsa | CSA_UNDF; /* set flag */
|
||||
cont = FALSE; /* force stop */
|
||||
break; } /* end case char state */
|
||||
break;
|
||||
case FNC_TST: /* test */
|
||||
break; } /* end case function */
|
||||
break; } /* end case function */
|
||||
} /* end for */
|
||||
lpba = ba & 0177777;
|
||||
lpcsa = (lpcsa & ~CSA_UAE) | ((ba >> (16 - CSA_V_UAE)) & CSA_UAE);
|
||||
@@ -467,12 +468,12 @@ if (lppdat == 015) lpcolc = 0; /* CR? reset col cntr */
|
||||
else if (lppdat == 011) { /* TAB? simulate */
|
||||
lppdat = ' '; /* with spaces */
|
||||
if (lpcolc >= 128) {
|
||||
r = lp20_adv (1, TRUE); /* eol? adv carriage */
|
||||
rpt = 8; } /* adv to col 9 */
|
||||
r = lp20_adv (1, TRUE); /* eol? adv carriage */
|
||||
rpt = 8; } /* adv to col 9 */
|
||||
else rpt = 8 - (lpcolc & 07); } /* else adv 1 to 8 */
|
||||
else { if (lppdat < 040) lppdat = ' '; /* cvt non-prnt to spc */
|
||||
if (lpcolc >= LP_WIDTH) /* line full? */
|
||||
r = lp20_adv (1, TRUE); } /* adv carriage */
|
||||
r = lp20_adv (1, TRUE); } /* adv carriage */
|
||||
for (i = 0; i < rpt; i++) putc (lppdat, lp20_unit.fileref);
|
||||
lp20_unit.pos = lp20_unit.pos + rpt;
|
||||
lpcolc = lpcolc + rpt;
|
||||
@@ -490,10 +491,11 @@ lp20_unit.pos = lp20_unit.pos + cnt; /* print 'n' newlines */
|
||||
if (dvuadv) dvptr = (dvptr + cnt) % dvlnt; /* update DAVFU ptr */
|
||||
if (davfu[dvptr] & (1 << DV_TOF)) { /* at top of form? */
|
||||
if (lppagc = (lppagc - 1) & PAGC_MASK) { /* decr page cntr */
|
||||
lpcsa = lpcsa & ~CSA_PZRO; /* update status */
|
||||
return TRUE; }
|
||||
else { lpcsa = lpcsa | CSA_PZRO; /* stop if zero */
|
||||
return FALSE; } }
|
||||
lpcsa = lpcsa & ~CSA_PZRO; /* update status */
|
||||
return TRUE; }
|
||||
else {
|
||||
lpcsa = lpcsa | CSA_PZRO; /* stop if zero */
|
||||
return FALSE; } }
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -506,15 +508,16 @@ for (i = 0; i < dvlnt; i++) { /* search DAVFU */
|
||||
dvptr = dvptr + 1; /* adv DAVFU ptr */
|
||||
if (dvptr >= dvlnt) dvptr = 0; /* wrap at end */
|
||||
if (davfu[dvptr] & (1 << cnt)) { /* channel stop set? */
|
||||
if (cnt) return lp20_adv (i + 1, FALSE); /* ~TOF, adv */
|
||||
if (lpcolc) lp20_adv (1, FALSE); /* TOF, need newline? */
|
||||
putc ('\f', lp20_unit.fileref); /* print form feed */
|
||||
lp20_unit.pos = lp20_unit.pos + 1;
|
||||
if (lppagc = (lppagc - 1) & PAGC_MASK) { /* decr page cntr */
|
||||
lpcsa = lpcsa & ~CSA_PZRO; /* update status */
|
||||
return TRUE; }
|
||||
else { lpcsa = lpcsa | CSA_PZRO; /* stop if zero */
|
||||
return FALSE; } }
|
||||
if (cnt) return lp20_adv (i + 1, FALSE); /* ~TOF, adv */
|
||||
if (lpcolc) lp20_adv (1, FALSE); /* TOF, need newline? */
|
||||
putc ('\f', lp20_unit.fileref); /* print form feed */
|
||||
lp20_unit.pos = lp20_unit.pos + 1;
|
||||
if (lppagc = (lppagc - 1) & PAGC_MASK) { /* decr page cntr */
|
||||
lpcsa = lpcsa & ~CSA_PZRO; /* update status */
|
||||
return TRUE; }
|
||||
else {
|
||||
lpcsa = lpcsa | CSA_PZRO; /* stop if zero */
|
||||
return FALSE; } }
|
||||
} /* end for */
|
||||
dvlnt = 0; /* DAVFU error */
|
||||
return FALSE;
|
||||
|
||||
@@ -245,12 +245,12 @@ if (dvd[0] >= dvr) { /* divide fail? */
|
||||
return FALSE; }
|
||||
if (dvd[0] & FIT27) { /* fit in 63b? */
|
||||
for (i = 0, rs[0] = 0; i < 35; i++) { /* 35 quotient bits */
|
||||
dvd[0] = (dvd[0] << 1) | ((dvd[1] >> 34) & 1);
|
||||
dvd[1] = (dvd[1] << 1) & MMASK; /* shift dividend */
|
||||
rs[0] = rs[0] << 1; /* shift quotient */
|
||||
if (dvd[0] >= dvr) { /* subtract work? */
|
||||
dvd[0] = dvd[0] - dvr; /* quo bit is 1 */
|
||||
rs[0] = rs[0] + 1; } }
|
||||
dvd[0] = (dvd[0] << 1) | ((dvd[1] >> 34) & 1);
|
||||
dvd[1] = (dvd[1] << 1) & MMASK; /* shift dividend */
|
||||
rs[0] = rs[0] << 1; /* shift quotient */
|
||||
if (dvd[0] >= dvr) { /* subtract work? */
|
||||
dvd[0] = dvd[0] - dvr; /* quo bit is 1 */
|
||||
rs[0] = rs[0] + 1; } }
|
||||
rs[1] = dvd[0]; } /* store remainder */
|
||||
else { t = (dvd[0] << 35) | dvd[1]; /* concatenate */
|
||||
rs[0] = t / dvr; /* quotient */
|
||||
@@ -282,16 +282,16 @@ AC(ac) = AC(p1) = AC(p2) = AC(p3) = 0; /* clear AC's */
|
||||
if (((mpy[0] | mpy[1]) == 0) || ((mpc[0] | mpc[1]) == 0)) return;
|
||||
for (i = 0; i < 71; i++) { /* 71 mpyer bits */
|
||||
if (i) { /* shift res, mpy */
|
||||
AC(p3) = (AC(p3) >> 1) | ((AC(p2) & 1) << 34);
|
||||
AC(p2) = (AC(p2) >> 1) | ((AC(p1) & 1) << 34);
|
||||
AC(p1) = (AC(p1) >> 1) | ((AC(ac) & 1) << 34);
|
||||
AC(ac) = AC(ac) >> 1;
|
||||
mpy[1] = (mpy[1] >> 1) | ((mpy[0] & 1) << 34);
|
||||
mpy[0] = mpy[0] >> 1; }
|
||||
AC(p3) = (AC(p3) >> 1) | ((AC(p2) & 1) << 34);
|
||||
AC(p2) = (AC(p2) >> 1) | ((AC(p1) & 1) << 34);
|
||||
AC(p1) = (AC(p1) >> 1) | ((AC(ac) & 1) << 34);
|
||||
AC(ac) = AC(ac) >> 1;
|
||||
mpy[1] = (mpy[1] >> 1) | ((mpy[0] & 1) << 34);
|
||||
mpy[0] = mpy[0] >> 1; }
|
||||
if (mpy[1] & 1) { /* if mpy lo bit = 1 */
|
||||
AC(p1) = AC(p1) + mpc[1];
|
||||
AC(ac) = AC(ac) + mpc[0] + (TSTS (AC(p1) != 0));
|
||||
AC(p1) = CLRS (AC(p1)); } }
|
||||
AC(p1) = AC(p1) + mpc[1];
|
||||
AC(ac) = AC(ac) + mpc[0] + (TSTS (AC(p1) != 0));
|
||||
AC(p1) = CLRS (AC(p1)); } }
|
||||
if (TSTS (sign)) { /* result minus? */
|
||||
AC(p3) = (-AC(p3)) & MMASK; /* quad negate */
|
||||
AC(p2) = (~AC(p2) + (AC(p3) == 0)) & MMASK;
|
||||
@@ -317,8 +317,8 @@ for (i = 1; i < 4; i++) dvd[i] = CLRS (AC(ADDAC (ac, i)));
|
||||
sign = AC(ac) ^ dvr[0]; /* sign of result */
|
||||
if (TSTS (AC(ac))) { /* get abs (dividend) */
|
||||
for (i = 3, cryin = 1; i > 0; i--) { /* negate quad */
|
||||
dvd[i] = (~dvd[i] + cryin) & MMASK; /* comp + carry in */
|
||||
if (dvd[i]) cryin = 0; } /* next carry in */
|
||||
dvd[i] = (~dvd[i] + cryin) & MMASK; /* comp + carry in */
|
||||
if (dvd[i]) cryin = 0; } /* next carry in */
|
||||
dvd[0] = (~dvd[0] + cryin) & DMASK; }
|
||||
if (TSTS (dvr[0])) { DMOVN (dvr); } /* get abs (divisor) */
|
||||
else dvr[1] = CLRS (dvr[1]);
|
||||
@@ -334,9 +334,9 @@ for (i = 0; i < 70; i++) { /* 70 quotient bits */
|
||||
qu[0] = (qu[0] << 1) | ((qu[1] >> 34) & 1); /* shift quotient */
|
||||
qu[1] = (qu[1] << 1) & MMASK;
|
||||
if (DCMPGE (dvd, dvr)) { /* subtract work? */
|
||||
dvd[0] = dvd[0] - dvr[0] - (dvd[1] < dvr[1]);
|
||||
dvd[1] = (dvd[1] - dvr[1]) & MMASK; /* do subtract */
|
||||
qu[1] = qu[1] + 1; } } /* set quotient bit */
|
||||
dvd[0] = dvd[0] - dvr[0] - (dvd[1] < dvr[1]);
|
||||
dvd[1] = (dvd[1] - dvr[1]) & MMASK; /* do subtract */
|
||||
qu[1] = qu[1] + 1; } } /* set quotient bit */
|
||||
if (TSTS (sign) && (qu[0] | qu[1])) { MKDNEG (qu); }
|
||||
if (TSTS (AC(ac)) && (dvd[0] | dvd[1])) { MKDNEG (dvd); }
|
||||
AC(ac) = qu[0]; /* quotient */
|
||||
@@ -369,22 +369,23 @@ else { funpack (op1, 0, &a, SFRC); /* unpack operands */
|
||||
funpack (op2, 0, &b, SFRC); /* fracs are 2's comp */
|
||||
ediff = a.exp - b.exp; /* get exp diff */
|
||||
if (ediff < 0) { /* a < b? switch */
|
||||
t = a;
|
||||
a = b;
|
||||
b = t;
|
||||
ediff = -ediff; }
|
||||
t = a;
|
||||
a = b;
|
||||
b = t;
|
||||
ediff = -ediff; }
|
||||
if (ediff > 63) ediff = 63; /* cap diff at 63 */
|
||||
if (ediff) b.fhi = (t_int64) b.fhi >> ediff; /* shift b (signed) */
|
||||
a.fhi = a.fhi + b.fhi; /* add fractions */
|
||||
if (a.sign ^ b.sign) { /* add or subtract? */
|
||||
if (a.fhi & FP_UCRY) { /* subtract, frac -? */
|
||||
a.fhi = UNEG (a.fhi); /* complement result */
|
||||
a.sign = 1; } /* result is - */
|
||||
else a.sign = 0; } /* result is + */
|
||||
else { if (a.sign) a.fhi = UNEG (a.fhi); /* add, src -? comp */
|
||||
if (a.fhi & FP_UCRY) { /* check for carry */
|
||||
a.fhi = a.fhi >> 1; /* flo won't be used */
|
||||
a.exp = a.exp + 1; } } }
|
||||
if (a.fhi & FP_UCRY) { /* subtract, frac -? */
|
||||
a.fhi = UNEG (a.fhi); /* complement result */
|
||||
a.sign = 1; } /* result is - */
|
||||
else a.sign = 0; } /* result is + */
|
||||
else {
|
||||
if (a.sign) a.fhi = UNEG (a.fhi); /* add, src -? comp */
|
||||
if (a.fhi & FP_UCRY) { /* check for carry */
|
||||
a.fhi = a.fhi >> 1; /* flo won't be used */
|
||||
a.exp = a.exp + 1; } } }
|
||||
fnorm (&a, (rnd? FP_URNDS: 0)); /* normalize, round */
|
||||
return fpack (&a, NULL, FALSE);
|
||||
}
|
||||
@@ -434,11 +435,11 @@ if (savhi = a.fhi) { /* dvd = 0? quo = 0 */
|
||||
a.exp = a.exp - b.exp + FP_BIAS + 1; /* result exponent */
|
||||
a.fhi = a.fhi / (b.fhi >> (FP_N_FHI + 1)); /* do divide */
|
||||
if (a.sign && (savhi != (a.fhi * (b.fhi >> (FP_N_FHI + 1)))))
|
||||
rem = TRUE; /* KL/KS hack */
|
||||
rem = TRUE; /* KL/KS hack */
|
||||
a.fhi = a.fhi << (FP_V_UNORM - FP_N_FHI - 1); /* put quo in place */
|
||||
if ((a.fhi & FP_UNORM) == 0) { /* normalize 1b */
|
||||
a.fhi = a.fhi << 1; /* before masking */
|
||||
a.exp = a.exp - 1; }
|
||||
a.fhi = a.fhi << 1; /* before masking */
|
||||
a.exp = a.exp - 1; }
|
||||
a.fhi = a.fhi & (FP_UFHI | FP_URNDS); } /* mask quo to 28b */
|
||||
fnorm (&a, (rnd? FP_URNDS: 0)); /* normalize, round */
|
||||
*rs = fpack (&a, NULL, rem); /* pack result */
|
||||
@@ -489,8 +490,8 @@ else if (a.exp < (FP_BIAS - 1)) AC(ac) = 0;
|
||||
else { sc = FP_V_UNORM - (a.exp - FP_BIAS) + 1;
|
||||
AC(ac) = a.fhi >> sc;
|
||||
if (rnd) {
|
||||
so = a.fhi << (64 - sc);
|
||||
if (so >= (0x8000000000000000 + a.sign)) AC(ac) = AC(ac) + 1; }
|
||||
so = a.fhi << (64 - sc);
|
||||
if (so >= (0x8000000000000000 + a.sign)) AC(ac) = AC(ac) + 1; }
|
||||
if (a.sign) AC(ac) = NEG (AC(ac)); }
|
||||
return;
|
||||
}
|
||||
@@ -508,35 +509,36 @@ UFP a, b, t;
|
||||
|
||||
if (inv) { DMOVN (rs); } /* subtract? -b */
|
||||
if ((AC(ac) | AC(p1)) == 0) funpack (rs[0], rs[1], &a, AFRC);
|
||||
/* a == 0? sum = b */
|
||||
/* a == 0? sum = b */
|
||||
else if ((rs[0] | rs[1]) == 0) funpack (AC(ac), AC(p1), &a, AFRC);
|
||||
/* b == 0? sum = a */
|
||||
/* b == 0? sum = a */
|
||||
else {
|
||||
funpack (AC(ac), AC(p1), &a, SFRC); /* unpack operands */
|
||||
funpack (rs[0], rs[1], &b, SFRC);
|
||||
ediff = a.exp - b.exp; /* get exp diff */
|
||||
if (ediff < 0) { /* a < b? switch */
|
||||
t = a;
|
||||
a = b;
|
||||
b = t;
|
||||
ediff = -ediff; }
|
||||
t = a;
|
||||
a = b;
|
||||
b = t;
|
||||
ediff = -ediff; }
|
||||
if (ediff > 127) ediff = 127; /* cap diff at 127 */
|
||||
if (ediff > 63) { /* diff > 63? */
|
||||
a.flo = (t_int64) b.fhi >> (ediff - 64); /* b hi to a lo */
|
||||
b.fhi = b.sign? FP_ONES: 0; } /* hi = all sign */
|
||||
a.flo = (t_int64) b.fhi >> (ediff - 64); /* b hi to a lo */
|
||||
b.fhi = b.sign? FP_ONES: 0; } /* hi = all sign */
|
||||
else if (ediff) { /* diff <= 63 */
|
||||
a.flo = (b.flo >> ediff) | (b.fhi << (64 - ediff));
|
||||
b.fhi = (t_int64) b.fhi >> ediff; } /* shift b (signed) */
|
||||
a.flo = (b.flo >> ediff) | (b.fhi << (64 - ediff));
|
||||
b.fhi = (t_int64) b.fhi >> ediff; } /* shift b (signed) */
|
||||
a.fhi = a.fhi + b.fhi; /* do add */
|
||||
if (a.sign ^ b.sign) { /* add or subtract? */
|
||||
if (a.fhi & FP_UCRY) { /* subtract, frac -? */
|
||||
DUNEG (a); /* complement result */
|
||||
a.sign = 1; } /* result is - */
|
||||
else a.sign = 0; } /* result is + */
|
||||
else { if (a.sign) { DUNEG (a); }; /* add, src -? comp */
|
||||
if (a.fhi & FP_UCRY) { /* check for carry */
|
||||
a.fhi = a.fhi >> 1; /* flo won't be used */
|
||||
a.exp = a.exp + 1; } } }
|
||||
if (a.fhi & FP_UCRY) { /* subtract, frac -? */
|
||||
DUNEG (a); /* complement result */
|
||||
a.sign = 1; } /* result is - */
|
||||
else a.sign = 0; } /* result is + */
|
||||
else {
|
||||
if (a.sign) { DUNEG (a); }; /* add, src -? comp */
|
||||
if (a.fhi & FP_UCRY) { /* check for carry */
|
||||
a.fhi = a.fhi >> 1; /* flo won't be used */
|
||||
a.exp = a.exp + 1; } } }
|
||||
fnorm (&a, FP_URNDD); /* normalize, round */
|
||||
AC(ac) = fpack (&a, &AC(p1), FALSE); /* pack result */
|
||||
return;
|
||||
@@ -600,14 +602,14 @@ if (a.fhi) { /* dvd = 0? quo = 0 */
|
||||
a.sign = a.sign ^ b.sign; /* result sign */
|
||||
a.exp = a.exp - b.exp + FP_BIAS + 1; /* result exponent */
|
||||
if (a.fhi < b.fhi) { /* make sure initial */
|
||||
a.fhi = a.fhi << 1; /* divide step will work */
|
||||
a.exp = a.exp - 1; }
|
||||
a.fhi = a.fhi << 1; /* divide step will work */
|
||||
a.exp = a.exp - 1; }
|
||||
for (i = 0; i < 63; i++) { /* 63b of quotient */
|
||||
qu = qu << 1; /* shift quotient */
|
||||
if (a.fhi >= b.fhi) { /* will div work? */
|
||||
a.fhi = a.fhi - b.fhi; /* sub, quo = 1 */
|
||||
qu = qu + 1; }
|
||||
a.fhi = a.fhi << 1; } /* shift dividend */
|
||||
qu = qu << 1; /* shift quotient */
|
||||
if (a.fhi >= b.fhi) { /* will div work? */
|
||||
a.fhi = a.fhi - b.fhi; /* sub, quo = 1 */
|
||||
qu = qu + 1; }
|
||||
a.fhi = a.fhi << 1; } /* shift dividend */
|
||||
a.fhi = qu; }
|
||||
fnorm (&a, FP_URNDD); /* normalize, round */
|
||||
AC(ac) = fpack (&a, &AC(p1), FALSE); /* pack result */
|
||||
@@ -629,9 +631,11 @@ r->flo = 0;
|
||||
if (r->sign) {
|
||||
r->exp = r->exp ^ FP_M_EXP;
|
||||
if (sgn) r->fhi = r->fhi | FP_UCRY; /* ext sign */
|
||||
else { if (r->fhi) r->fhi = UNEG (r->fhi) & FP_UFRAC;
|
||||
else { r->exp = r->exp + 1;
|
||||
r->fhi = FP_UNORM; } } }
|
||||
else {
|
||||
if (r->fhi) r->fhi = UNEG (r->fhi) & FP_UFRAC;
|
||||
else {
|
||||
r->exp = r->exp + 1;
|
||||
r->fhi = FP_UNORM; } } }
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -650,15 +654,15 @@ if ((a->fhi | a->flo) == 0) { /* if fraction = 0 */
|
||||
return; }
|
||||
while ((a->fhi & FP_UNORM) == 0) { /* normalized? */
|
||||
for (i = 0; i < 6; i++) {
|
||||
if (a->fhi & normmask[i]) break; }
|
||||
if (a->fhi & normmask[i]) break; }
|
||||
a->fhi = (a->fhi << normtab[i]) | (a->flo >> (64 - normtab[i]));
|
||||
a->flo = a->flo << normtab[i];
|
||||
a->exp = a->exp - normtab[i]; }
|
||||
if (rnd) { /* rounding? */
|
||||
a->fhi = a->fhi + rnd; /* add round const */
|
||||
if (a->fhi & FP_UCRY) { /* if carry out, */
|
||||
a->fhi = a->fhi >> 1; /* renormalize */
|
||||
a->exp = a->exp + 1; } }
|
||||
a->fhi = a->fhi >> 1; /* renormalize */
|
||||
a->exp = a->exp + 1; } }
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -676,8 +680,8 @@ if (lo) val[1] = ((r->fhi & FP_UFLO) >> FP_V_UFLO) & MMASK;
|
||||
else val[1] = 0;
|
||||
if (r->sign) { /* negate? */
|
||||
if (fdvneg) { /* fdvr special? */
|
||||
val[1] = ~val[1] & MMASK; /* 1's comp */
|
||||
val[0] = ~val[0] & DMASK; }
|
||||
val[1] = ~val[1] & MMASK; /* 1's comp */
|
||||
val[0] = ~val[0] & DMASK; }
|
||||
else { DMOVN (val); } } /* 2's comp */
|
||||
if (lo) *lo = val[1];
|
||||
return val[0];
|
||||
|
||||
@@ -306,24 +306,24 @@ if (ITS) { /* ITS paging */
|
||||
|
||||
vpn = ITS_GETVPN (ea); /* get ITS pagno */
|
||||
if (tbl == uptbl)
|
||||
ptead = ((ea & RSIGN)? dbr2: dbr1) + ((vpn >> 1) & 077);
|
||||
ptead = ((ea & RSIGN)? dbr2: dbr1) + ((vpn >> 1) & 077);
|
||||
else ptead = ((ea & RSIGN)? dbr3: dbr4) + ((vpn >> 1) & 077);
|
||||
ptewd = ReadP (ptead); /* get PTE pair */
|
||||
pte = (int32) ((ptewd >> ((vpn & 1)? 0: 18)) & RMASK);
|
||||
acc = ITS_GETACC (pte); /* get access */
|
||||
pager_word = PF_VIRT | ea | ((tbl == uptbl)? PF_USER: 0) |
|
||||
((mode & PTF_WR)? PF_ITS_WRITE: 0) | (acc << PF_ITS_V_ACC);
|
||||
((mode & PTF_WR)? PF_ITS_WRITE: 0) | (acc << PF_ITS_V_ACC);
|
||||
if ((acc != ITS_ACC_NO) && (!(mode & PTF_WR) || (acc == ITS_ACC_RW))) {
|
||||
pte = pte & ~PTE_ITS_AGE; /* clear age */
|
||||
if (vpn & 1) WriteP (ptead, (ptewd & LMASK) | pte);
|
||||
else WriteP (ptead, (ptewd & RMASK) | (((d10) pte) << 18));
|
||||
xpte = ((pte & PTE_ITS_PPMASK) << ITS_V_PN) | PTBL_V |
|
||||
((acc == ITS_ACC_RW)? PTBL_M: 0);
|
||||
decvpn = PAG_GETVPN (ea); /* get tlb idx */
|
||||
if (!(mode & PTF_CON)) {
|
||||
tbl[decvpn & ~1] = xpte; /* map lo ITS page */
|
||||
tbl[decvpn | 1] = xpte + PAG_SIZE; } /* map hi */
|
||||
return (xpte + ((decvpn & 1)? PAG_SIZE: 0)); }
|
||||
pte = pte & ~PTE_ITS_AGE; /* clear age */
|
||||
if (vpn & 1) WriteP (ptead, (ptewd & LMASK) | pte);
|
||||
else WriteP (ptead, (ptewd & RMASK) | (((d10) pte) << 18));
|
||||
xpte = ((pte & PTE_ITS_PPMASK) << ITS_V_PN) | PTBL_V |
|
||||
((acc == ITS_ACC_RW)? PTBL_M: 0);
|
||||
decvpn = PAG_GETVPN (ea); /* get tlb idx */
|
||||
if (!(mode & PTF_CON)) {
|
||||
tbl[decvpn & ~1] = xpte; /* map lo ITS page */
|
||||
tbl[decvpn | 1] = xpte + PAG_SIZE; } /* map hi */
|
||||
return (xpte + ((decvpn & 1)? PAG_SIZE: 0)); }
|
||||
PAGE_FAIL_TRAP;
|
||||
} /* end ITS paging */
|
||||
|
||||
@@ -349,14 +349,14 @@ else if (!T20) { /* TOPS-10 paging */
|
||||
pager_word = PF_VIRT | ea | ((tbl == uptbl)? PF_USER: 0) |
|
||||
((mode & PTF_WR)? PF_WRITE: 0) |
|
||||
((pte & PTE_T10_A)? PF_T10_A |
|
||||
((pte & PTE_T10_S)? PF_T10_S: 0): 0);
|
||||
((pte & PTE_T10_S)? PF_T10_S: 0): 0);
|
||||
if (mode & PTF_MAP) pager_word = pager_word | /* map? add to pf wd */
|
||||
((pte & PTE_T10_W)? PF_T10_W: 0) | /* W, S, C bits */
|
||||
((pte & PTE_T10_S)? PF_T10_S: 0) |
|
||||
((pte & PTE_T10_C)? PF_C: 0);
|
||||
if ((pte & PTE_T10_A) && (!(mode & PTF_WR) || (pte & PTE_T10_W))) {
|
||||
xpte = ((pte & PTE_PPMASK) << PAG_V_PN) | /* calc exp pte */
|
||||
PTBL_V | ((pte & PTE_T10_W)? PTBL_M: 0);
|
||||
PTBL_V | ((pte & PTE_T10_W)? PTBL_M: 0);
|
||||
if (!(mode & PTF_CON)) tbl[vpn] = xpte; /* set tbl if ~cons */
|
||||
return xpte; }
|
||||
PAGE_FAIL_TRAP;
|
||||
@@ -389,7 +389,7 @@ else { /* TOPS-20 paging */
|
||||
d10 acc = PTE_T20_W | PTE_T20_C; /* init access bits */
|
||||
|
||||
pager_word = PF_VIRT | ea | ((tbl == uptbl)? PF_USER: 0) |
|
||||
((mode & PTF_WR)? PF_WRITE: 0); /* set page fail word */
|
||||
((mode & PTF_WR)? PF_WRITE: 0); /* set page fail word */
|
||||
|
||||
/* First phase - evaluate section pointers - returns a ptr to a page map
|
||||
As a single section machine, the KS10 short circuits this part of the
|
||||
@@ -411,90 +411,90 @@ else { /* TOPS-20 paging */
|
||||
pa = (tbl == uptbl)? upta + UPT_T20_SCTN: epta + EPT_T20_SCTN;
|
||||
READPT (ptr, pa & PAMASK); /* get section 0 ptr */
|
||||
for (stop = FALSE, flg = 0; !stop; flg++) { /* eval section ptrs */
|
||||
acc = acc & ptr; /* cascade acc bits */
|
||||
switch (T20_GETTYP (ptr)) { /* case on ptr type */
|
||||
case T20_NOA: /* no access */
|
||||
default: /* undefined type */
|
||||
PAGE_FAIL_TRAP; /* page fail */
|
||||
case T20_IMM: /* immediate */
|
||||
stop = TRUE; /* exit */
|
||||
break;
|
||||
case T20_SHR: /* shared */
|
||||
pa = (int32) (spt + (ptr & RMASK)); /* get SPT idx */
|
||||
READPT (ptr, pa & PAMASK); /* get SPT entry */
|
||||
stop = TRUE; /* exit */
|
||||
break;
|
||||
case T20_IND: /* indirect */
|
||||
if (flg && (t = test_int ())) ABORT (t);
|
||||
pmi = T20_GETPMI (ptr); /* get sect tbl idx */
|
||||
pa = (int32) (spt + (ptr & RMASK)); /* get SPT idx */
|
||||
if (pmi) { /* for dskec */
|
||||
pag_nxm ((pmi << 18) | pa, REF_P, PF_OK);
|
||||
PAGE_FAIL_TRAP; }
|
||||
READPT (ptr, pa & PAMASK); /* get SPT entry */
|
||||
if (ptr & PTE_T20_STM) { PAGE_FAIL_TRAP; }
|
||||
pa = PAG_PTEPA (ptr, pmi); /* index off page */
|
||||
READPT (ptr, pa & PAMASK); /* get pointer */
|
||||
break; /* continue in loop */
|
||||
} /* end case */
|
||||
} /* end for */
|
||||
acc = acc & ptr; /* cascade acc bits */
|
||||
switch (T20_GETTYP (ptr)) { /* case on ptr type */
|
||||
case T20_NOA: /* no access */
|
||||
default: /* undefined type */
|
||||
PAGE_FAIL_TRAP; /* page fail */
|
||||
case T20_IMM: /* immediate */
|
||||
stop = TRUE; /* exit */
|
||||
break;
|
||||
case T20_SHR: /* shared */
|
||||
pa = (int32) (spt + (ptr & RMASK)); /* get SPT idx */
|
||||
READPT (ptr, pa & PAMASK); /* get SPT entry */
|
||||
stop = TRUE; /* exit */
|
||||
break;
|
||||
case T20_IND: /* indirect */
|
||||
if (flg && (t = test_int ())) ABORT (t);
|
||||
pmi = T20_GETPMI (ptr); /* get sect tbl idx */
|
||||
pa = (int32) (spt + (ptr & RMASK)); /* get SPT idx */
|
||||
if (pmi) { /* for dskec */
|
||||
pag_nxm ((pmi << 18) | pa, REF_P, PF_OK);
|
||||
PAGE_FAIL_TRAP; }
|
||||
READPT (ptr, pa & PAMASK); /* get SPT entry */
|
||||
if (ptr & PTE_T20_STM) { PAGE_FAIL_TRAP; }
|
||||
pa = PAG_PTEPA (ptr, pmi); /* index off page */
|
||||
READPT (ptr, pa & PAMASK); /* get pointer */
|
||||
break; /* continue in loop */
|
||||
} /* end case */
|
||||
} /* end for */
|
||||
|
||||
/* Second phase - found page map ptr, evaluate page pointers */
|
||||
|
||||
pa = PAG_PTEPA (ptr, vpn); /* get ptbl address */
|
||||
for (stop = FALSE, flg = 0; !stop; flg++) { /* eval page ptrs */
|
||||
if (ptr & PTE_T20_STM) { PAGE_FAIL_TRAP; } /* non-res? */
|
||||
if (cst) { /* cst really there? */
|
||||
csta = (int32) ((cst + (ptr & PTE_PPMASK)) & PAMASK);
|
||||
READPT (cste, csta); /* get CST entry */
|
||||
if ((cste & CST_AGE) == 0) { PAGE_FAIL_TRAP; }
|
||||
cste = (cste & cstm) | pur; /* update entry */
|
||||
WriteP (csta, cste); } /* rewrite */
|
||||
READPT (ptr, pa & PAMASK); /* get pointer */
|
||||
acc = acc & ptr; /* cascade acc bits */
|
||||
switch (T20_GETTYP (ptr)) { /* case on ptr type */
|
||||
case T20_NOA: /* no access */
|
||||
default: /* undefined type */
|
||||
PAGE_FAIL_TRAP; /* page fail */
|
||||
case T20_IMM: /* immediate */
|
||||
stop = TRUE; /* exit */
|
||||
break;
|
||||
case T20_SHR: /* shared */
|
||||
pa = (int32) (spt + (ptr & RMASK)); /* get SPT idx */
|
||||
READPT (ptr, pa & PAMASK); /* get SPT entry */
|
||||
stop = TRUE; /* exit */
|
||||
break;
|
||||
case T20_IND: /* indirect */
|
||||
if (flg && (t = test_int ())) ABORT (t);
|
||||
pmi = T20_GETPMI (ptr); /* get section index */
|
||||
pa = (int32) (spt + (ptr & RMASK)); /* get SPT idx */
|
||||
READPT (ptr, pa & PAMASK); /* get SPT entry */
|
||||
pa = PAG_PTEPA (ptr, pmi); /* index off page */
|
||||
break; /* continue in loop */
|
||||
} /* end case */
|
||||
} /* end for */
|
||||
if (ptr & PTE_T20_STM) { PAGE_FAIL_TRAP; } /* non-res? */
|
||||
if (cst) { /* cst really there? */
|
||||
csta = (int32) ((cst + (ptr & PTE_PPMASK)) & PAMASK);
|
||||
READPT (cste, csta); /* get CST entry */
|
||||
if ((cste & CST_AGE) == 0) { PAGE_FAIL_TRAP; }
|
||||
cste = (cste & cstm) | pur; /* update entry */
|
||||
WriteP (csta, cste); } /* rewrite */
|
||||
READPT (ptr, pa & PAMASK); /* get pointer */
|
||||
acc = acc & ptr; /* cascade acc bits */
|
||||
switch (T20_GETTYP (ptr)) { /* case on ptr type */
|
||||
case T20_NOA: /* no access */
|
||||
default: /* undefined type */
|
||||
PAGE_FAIL_TRAP; /* page fail */
|
||||
case T20_IMM: /* immediate */
|
||||
stop = TRUE; /* exit */
|
||||
break;
|
||||
case T20_SHR: /* shared */
|
||||
pa = (int32) (spt + (ptr & RMASK)); /* get SPT idx */
|
||||
READPT (ptr, pa & PAMASK); /* get SPT entry */
|
||||
stop = TRUE; /* exit */
|
||||
break;
|
||||
case T20_IND: /* indirect */
|
||||
if (flg && (t = test_int ())) ABORT (t);
|
||||
pmi = T20_GETPMI (ptr); /* get section index */
|
||||
pa = (int32) (spt + (ptr & RMASK)); /* get SPT idx */
|
||||
READPT (ptr, pa & PAMASK); /* get SPT entry */
|
||||
pa = PAG_PTEPA (ptr, pmi); /* index off page */
|
||||
break; /* continue in loop */
|
||||
} /* end case */
|
||||
} /* end for */
|
||||
|
||||
/* Last phase - have final page pointer, check modifiability */
|
||||
|
||||
if (ptr & PTE_T20_STM) { PAGE_FAIL_TRAP; } /* non-resident? */
|
||||
if (cst) { /* CST really there? */
|
||||
csta = (int32) ((cst + (ptr & PTE_PPMASK)) & PAMASK);
|
||||
READPT (cste, csta); /* get CST entry */
|
||||
if ((cste & CST_AGE) == 0) { PAGE_FAIL_TRAP; }
|
||||
cste = (cste & cstm) | pur; } /* update entry */
|
||||
csta = (int32) ((cst + (ptr & PTE_PPMASK)) & PAMASK);
|
||||
READPT (cste, csta); /* get CST entry */
|
||||
if ((cste & CST_AGE) == 0) { PAGE_FAIL_TRAP; }
|
||||
cste = (cste & cstm) | pur; } /* update entry */
|
||||
else cste = 0; /* no, entry = 0 */
|
||||
pager_word = pager_word | PF_T20_DN; /* set eval done */
|
||||
xpte = ((int32) ((ptr & PTE_PPMASK) << PAG_V_PN)) | PTBL_V;
|
||||
if (mode & PTF_WR) { /* write? */
|
||||
if (acc & PTE_T20_W) { /* writable? */
|
||||
xpte = xpte | PTBL_M; /* set PTE M */
|
||||
cste = cste | CST_M; } /* set CST M */
|
||||
else { PAGE_FAIL_TRAP; } } /* no, trap */
|
||||
if (acc & PTE_T20_W) { /* writable? */
|
||||
xpte = xpte | PTBL_M; /* set PTE M */
|
||||
cste = cste | CST_M; } /* set CST M */
|
||||
else { PAGE_FAIL_TRAP; } } /* no, trap */
|
||||
if (cst) WriteP (csta, cste); /* write CST entry */
|
||||
if (mode & PTF_MAP) pager_word = pager_word | /* map? more in pf wd */
|
||||
((xpte & PTBL_M)? PF_T20_M: 0) | /* M, W, C bits */
|
||||
((acc & PTE_T20_W)? PF_T20_W: 0) |
|
||||
((acc & PTE_T20_C)? PF_C: 0);
|
||||
((xpte & PTBL_M)? PF_T20_M: 0) | /* M, W, C bits */
|
||||
((acc & PTE_T20_W)? PF_T20_W: 0) |
|
||||
((acc & PTE_T20_C)? PF_C: 0);
|
||||
if (!(mode & PTF_CON)) tbl[vpn] = xpte; /* set tbl if ~cons */
|
||||
return xpte;
|
||||
} /* end TOPS20 paging */
|
||||
@@ -510,8 +510,9 @@ if (PAGING) {
|
||||
ac_cur = &acs[UBR_GETCURAC (ubr) * AC_NUM];
|
||||
ac_prv = &acs[UBR_GETPRVAC (ubr) * AC_NUM];
|
||||
if (TSTF (F_USR)) ptbl_cur = ptbl_prv = &uptbl[0];
|
||||
else { ptbl_cur = &eptbl[0];
|
||||
ptbl_prv = TSTF (F_UIO)? &uptbl[0]: &eptbl[0]; } }
|
||||
else {
|
||||
ptbl_cur = &eptbl[0];
|
||||
ptbl_prv = TSTF (F_UIO)? &uptbl[0]: &eptbl[0]; } }
|
||||
else { ac_cur = ac_prv = &acs[0];
|
||||
ptbl_cur = ptbl_prv = &physptbl[0]; }
|
||||
t = EBR_GETEBR (ebr);
|
||||
|
||||
112
PDP10/pdp10_rp.c
112
PDP10/pdp10_rp.c
@@ -508,7 +508,7 @@ case 006: /* RPER1 */
|
||||
case 007: /* RPAS */
|
||||
*data = 0;
|
||||
for (i = 0; i < RP_NUMDR; i++)
|
||||
if (rpds[i] & DS_ATA) *data = *data | (AS_U0 << i);
|
||||
if (rpds[i] & DS_ATA) *data = *data | (AS_U0 << i);
|
||||
break;
|
||||
case 010: /* RPLA */
|
||||
*data = GET_SECTOR (rp_rwait, dtype) << LA_V_SC;
|
||||
@@ -575,50 +575,51 @@ switch (j) { /* decode PA<5:1> */
|
||||
case 000: /* RPCS1 */
|
||||
if ((access == WRITEB) && (PA & 1)) data = data << 8;
|
||||
if (data & CS1_TRE) { /* error clear? */
|
||||
rpcs1 = rpcs1 & ~CS1_TRE; /* clr CS1<TRE> */
|
||||
rpcs2 = rpcs2 & ~CS2_ERR; } /* clr CS2<15:8> */
|
||||
rpcs1 = rpcs1 & ~CS1_TRE; /* clr CS1<TRE> */
|
||||
rpcs2 = rpcs2 & ~CS2_ERR; } /* clr CS2<15:8> */
|
||||
if ((access == WRITE) || (PA & 1)) { /* hi byte write? */
|
||||
if (rpcs1 & CS1_DONE) /* done set? */
|
||||
rpcs1 = (rpcs1 & ~CS1_UAE) | (data & CS1_UAE); }
|
||||
if (rpcs1 & CS1_DONE) /* done set? */
|
||||
rpcs1 = (rpcs1 & ~CS1_UAE) | (data & CS1_UAE); }
|
||||
if ((access == WRITE) || !(PA & 1)) { /* lo byte write? */
|
||||
if ((data & CS1_DONE) && (data & CS1_IE)) /* to DONE+IE? */
|
||||
rpiff = 1; /* set CSTB INTR */
|
||||
rpcs1 = (rpcs1 & ~CS1_IE) | (data & CS1_IE);
|
||||
if (uptr->flags & UNIT_DIS) { /* nx disk? */
|
||||
rpcs2 = rpcs2 | CS2_NED; /* set error flag */
|
||||
cs1f = CS1_SC; } /* req interrupt */
|
||||
else if (sim_is_active (uptr))
|
||||
rper1[drv] = rper1[drv] | ER1_RMR; /* won't write */
|
||||
else if (data & CS1_GO) { /* start op */
|
||||
uptr->FUNC = GET_FNC (data); /* set func */
|
||||
if ((uptr->FUNC >= FNC_XFER) && /* data xfer and */
|
||||
((rpcs1 & CS1_DONE) == 0)) /* ~rdy? PGE */
|
||||
rpcs2 = rpcs2 | CS2_PGE;
|
||||
else rp_go (drv, uptr->FUNC); } }
|
||||
if ((data & CS1_DONE) && (data & CS1_IE)) /* to DONE+IE? */
|
||||
rpiff = 1; /* set CSTB INTR */
|
||||
rpcs1 = (rpcs1 & ~CS1_IE) | (data & CS1_IE);
|
||||
if (uptr->flags & UNIT_DIS) { /* nx disk? */
|
||||
rpcs2 = rpcs2 | CS2_NED; /* set error flag */
|
||||
cs1f = CS1_SC; } /* req interrupt */
|
||||
else if (sim_is_active (uptr))
|
||||
rper1[drv] = rper1[drv] | ER1_RMR; /* won't write */
|
||||
else if (data & CS1_GO) { /* start op */
|
||||
uptr->FUNC = GET_FNC (data); /* set func */
|
||||
if ((uptr->FUNC >= FNC_XFER) && /* data xfer and */
|
||||
((rpcs1 & CS1_DONE) == 0)) /* ~rdy? PGE */
|
||||
rpcs2 = rpcs2 | CS2_PGE;
|
||||
else rp_go (drv, uptr->FUNC); } }
|
||||
break;
|
||||
case 001: /* RPWC */
|
||||
if (access == WRITEB) data = (PA & 1)?
|
||||
(rpwc & 0377) | (data << 8): (rpwc & ~0377) | data;
|
||||
(rpwc & 0377) | (data << 8): (rpwc & ~0377) | data;
|
||||
rpwc = data;
|
||||
break;
|
||||
case 002: /* RPBA */
|
||||
if (access == WRITEB) data = (PA & 1)?
|
||||
(rpba & 0377) | (data << 8): (rpba & ~0377) | data;
|
||||
(rpba & 0377) | (data << 8): (rpba & ~0377) | data;
|
||||
rpba = data & ~BA_MBZ;
|
||||
break;
|
||||
case 003: /* RPDA */
|
||||
if (access == WRITEB) data = (PA & 1)?
|
||||
(rpda & 0377) | (data << 8): (rpda & ~0377) | data;
|
||||
(rpda & 0377) | (data << 8): (rpda & ~0377) | data;
|
||||
rpda = data & ~DA_MBZ;
|
||||
break;
|
||||
case 004: /* RPCS2 */
|
||||
if ((access == WRITEB) && (PA & 1)) data = data << 8;
|
||||
if (data & CS2_CLR) rp_reset (&rp_dev); /* init? */
|
||||
else { if ((data & ~rpcs2) & (CS2_PE | CS2_MXF))
|
||||
cs1f = CS1_SC; /* diagn intr */
|
||||
if (access == WRITEB) data = (rpcs2 & /* merge data */
|
||||
((PA & 1)? 0377: 0177400)) | data;
|
||||
rpcs2 = (rpcs2 & ~CS2_RW) | (data & CS2_RW) | CS2_IR | CS2_OR; }
|
||||
else {
|
||||
if ((data & ~rpcs2) & (CS2_PE | CS2_MXF))
|
||||
cs1f = CS1_SC; /* diagn intr */
|
||||
if (access == WRITEB) data = (rpcs2 & /* merge data */
|
||||
((PA & 1)? 0377: 0177400)) | data;
|
||||
rpcs2 = (rpcs2 & ~CS2_RW) | (data & CS2_RW) | CS2_IR | CS2_OR; }
|
||||
drv = GET_UNIT (rpcs2);
|
||||
break;
|
||||
case 006: /* RPER1 */
|
||||
@@ -628,29 +629,28 @@ case 006: /* RPER1 */
|
||||
case 007: /* RPAS */
|
||||
if ((access == WRITEB) && (PA & 1)) break;
|
||||
for (i = 0; i < RP_NUMDR; i++)
|
||||
if (data & (AS_U0 << i)) rpds[i] = rpds[i] & ~DS_ATA;
|
||||
if (data & (AS_U0 << i)) rpds[i] = rpds[i] & ~DS_ATA;
|
||||
break;
|
||||
case 011: /* RPDB */
|
||||
if (access == WRITEB) data = (PA & 1)?
|
||||
(rpdb & 0377) | (data << 8): (rpdb & ~0377) | data;
|
||||
(rpdb & 0377) | (data << 8): (rpdb & ~0377) | data;
|
||||
rpdb = data;
|
||||
break;
|
||||
case 012: /* RPMR */
|
||||
if (access == WRITEB) data = (PA & 1)?
|
||||
(rpmr & 0377) | (data << 8): (rpmr & ~0377) | data;
|
||||
(rpmr & 0377) | (data << 8): (rpmr & ~0377) | data;
|
||||
rpmr = data;
|
||||
break;
|
||||
case 015: /* RPOF */
|
||||
if (access == WRITEB) data = (PA & 1)?
|
||||
(rpof & 0377) | (data << 8): (rpof & ~0377) | data;
|
||||
(rpof & 0377) | (data << 8): (rpof & ~0377) | data;
|
||||
rpof = data & ~OF_MBZ;
|
||||
break;
|
||||
case 016: /* RPDC */
|
||||
if (access == WRITEB) data = (PA & 1)?
|
||||
(rpdc & 0377) | (data << 8): (rpdc & ~0377) | data;
|
||||
(rpdc & 0377) | (data << 8): (rpdc & ~0377) | data;
|
||||
rpdc = data & ~DC_MBZ;
|
||||
break;
|
||||
break;
|
||||
case 005: /* RPDS */
|
||||
case 010: /* RPLA */
|
||||
case 013: /* RPDT */
|
||||
@@ -708,8 +708,8 @@ case FNC_PACK: /* pack acknowledge */
|
||||
case FNC_OFFSET: /* offset mode */
|
||||
case FNC_RETURN:
|
||||
if ((uptr->flags & UNIT_ATT) == 0) { /* not attached? */
|
||||
rper1[drv] = rper1[drv] | ER1_UNS; /* unsafe */
|
||||
break; }
|
||||
rper1[drv] = rper1[drv] | ER1_UNS; /* unsafe */
|
||||
break; }
|
||||
rpds[drv] = (rpds[drv] & ~DS_RDY) | DS_PIP; /* set positioning */
|
||||
sim_activate (uptr, rp_swait); /* time operation */
|
||||
return;
|
||||
@@ -720,13 +720,13 @@ case FNC_RECAL: /* recalibrate */
|
||||
case FNC_SEEK: /* seek */
|
||||
case FNC_SEARCH: /* search */
|
||||
if ((uptr->flags & UNIT_ATT) == 0) { /* not attached? */
|
||||
rper1[drv] = rper1[drv] | ER1_UNS; /* unsafe */
|
||||
break; }
|
||||
rper1[drv] = rper1[drv] | ER1_UNS; /* unsafe */
|
||||
break; }
|
||||
if ((GET_CY (dc) >= drv_tab[dtype].cyl) || /* bad cylinder */
|
||||
(GET_SF (rpda) >= drv_tab[dtype].surf) || /* bad surface */
|
||||
(GET_SC (rpda) >= drv_tab[dtype].sect)) { /* or bad sector? */
|
||||
rper1[drv] = rper1[drv] | ER1_IAE;
|
||||
break; }
|
||||
rper1[drv] = rper1[drv] | ER1_IAE;
|
||||
break; }
|
||||
rpds[drv] = (rpds[drv] & ~DS_RDY) | DS_PIP; /* set positioning */
|
||||
t = abs (dc - uptr->CYL); /* cyl diff */
|
||||
if (t == 0) t = 1; /* min time */
|
||||
@@ -740,15 +740,15 @@ case FNC_WCHK: /* write check */
|
||||
case FNC_READ: /* read */
|
||||
case FNC_READH: /* read headers */
|
||||
if ((uptr->flags & UNIT_ATT) == 0) { /* not attached? */
|
||||
rper1[drv] = rper1[drv] | ER1_UNS; /* unsafe */
|
||||
break; }
|
||||
rper1[drv] = rper1[drv] | ER1_UNS; /* unsafe */
|
||||
break; }
|
||||
rpcs2 = rpcs2 & ~CS2_ERR; /* clear errors */
|
||||
rpcs1 = rpcs1 & ~(CS1_TRE | CS1_MCPE | CS1_DONE);
|
||||
if ((GET_CY (dc) >= drv_tab[dtype].cyl) || /* bad cylinder */
|
||||
(GET_SF (rpda) >= drv_tab[dtype].surf) || /* bad surface */
|
||||
(GET_SC (rpda) >= drv_tab[dtype].sect)) { /* or bad sector? */
|
||||
rper1[drv] = rper1[drv] | ER1_IAE;
|
||||
break; }
|
||||
rper1[drv] = rper1[drv] | ER1_IAE;
|
||||
break; }
|
||||
rpds[drv] = rpds[drv] & ~DS_RDY; /* clear drive rdy */
|
||||
sim_activate (uptr, rp_rwait + (rp_swait * abs (dc - uptr->CYL)));
|
||||
uptr->CYL = dc; /* save cylinder */
|
||||
@@ -812,9 +812,9 @@ case FNC_SEEK: /* seek */
|
||||
|
||||
case FNC_WRITE: /* write */
|
||||
if (uptr->flags & UNIT_WPRT) { /* write locked? */
|
||||
rper1[drv] = rper1[drv] | ER1_WLE; /* set drive error */
|
||||
update_rpcs (CS1_DONE | CS1_TRE, drv); /* set done, err */
|
||||
break; }
|
||||
rper1[drv] = rper1[drv] | ER1_WLE; /* set drive error */
|
||||
update_rpcs (CS1_DONE | CS1_TRE, drv); /* set done, err */
|
||||
break; }
|
||||
case FNC_WCHK: /* write check */
|
||||
case FNC_READ: /* read */
|
||||
case FNC_READH: /* read headers */
|
||||
@@ -822,9 +822,9 @@ case FNC_READH: /* read headers */
|
||||
wc10 = (0200000 - rpwc) >> 1; /* get PDP-10 wc */
|
||||
da = GET_DA (rpdc, rpda, dtype) * RP_NUMWD; /* get disk addr */
|
||||
if ((da + wc10) > drv_tab[dtype].size) { /* disk overrun? */
|
||||
rper1[drv] = rper1[drv] | ER1_AOE;
|
||||
if (wc10 > (drv_tab[dtype].size - da))
|
||||
wc10 = drv_tab[dtype].size - da; }
|
||||
rper1[drv] = rper1[drv] | ER1_AOE;
|
||||
if (wc10 > (drv_tab[dtype].size - da))
|
||||
wc10 = drv_tab[dtype].size - da; }
|
||||
|
||||
err = fseek (uptr->fileref, da * sizeof (d10), SEEK_SET);
|
||||
if (uptr->FUNC == FNC_WRITE) { /* write? */
|
||||
@@ -885,11 +885,11 @@ case FNC_READH: /* read headers */
|
||||
rpdc = da / drv_tab[dtype].surf;
|
||||
|
||||
if (err != 0) { /* error? */
|
||||
rper1[drv] = rper1[drv] | ER1_PAR; /* set drive error */
|
||||
update_rpcs (CS1_DONE | CS1_TRE, drv); /* set done, err */
|
||||
perror ("RP I/O error");
|
||||
clearerr (uptr->fileref);
|
||||
return SCPE_IOERR; }
|
||||
rper1[drv] = rper1[drv] | ER1_PAR; /* set drive error */
|
||||
update_rpcs (CS1_DONE | CS1_TRE, drv); /* set done, err */
|
||||
perror ("RP I/O error");
|
||||
clearerr (uptr->fileref);
|
||||
return SCPE_IOERR; }
|
||||
case FNC_WRITEH: /* write headers stub */
|
||||
update_rpcs (CS1_DONE, drv); /* set done */
|
||||
break; } /* end case func */
|
||||
@@ -961,7 +961,7 @@ for (i = 0; i < RP_NUMDR; i++) {
|
||||
sim_cancel (uptr);
|
||||
uptr->CYL = uptr->FUNC = 0;
|
||||
if (uptr->flags & UNIT_ATT) rpds[i] = (rpds[i] & DS_VV) |
|
||||
DS_DPR | DS_RDY | DS_MOL | ((uptr->flags & UNIT_WPRT)? DS_WRL: 0);
|
||||
DS_DPR | DS_RDY | DS_MOL | ((uptr->flags & UNIT_WPRT)? DS_WRL: 0);
|
||||
else if (uptr->flags & UNIT_DIS) rpds[i] = 0;
|
||||
else rpds[i] = DS_DPR;
|
||||
rper1[i] = 0; }
|
||||
@@ -1008,7 +1008,7 @@ if (sim_is_active (uptr)) { /* unit active? */
|
||||
sim_cancel (uptr); /* cancel operation */
|
||||
rper1[drv] = rper1[drv] | ER1_OPI; /* set drive error */
|
||||
if (uptr->FUNC >= FNC_WCHK) /* data transfer? */
|
||||
rpcs1 = rpcs1 | CS1_DONE | CS1_TRE; } /* set done, err */
|
||||
rpcs1 = rpcs1 | CS1_DONE | CS1_TRE; } /* set done, err */
|
||||
update_rpcs (CS1_SC, drv); /* request intr */
|
||||
return detach_unit (uptr);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* pdp10_sys.c: PDP-10 simulator interface
|
||||
|
||||
Copyright (c) 1993-2002, Robert M Supnik
|
||||
Copyright (c) 1993-2003, Robert M Supnik
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
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
|
||||
in this Software without prior written authorization from Robert M Supnik.
|
||||
|
||||
09-Jan-03 RMS Added DEUNA/DELUA support
|
||||
12-Sep-02 RMS Added RX211 support
|
||||
22-Apr-02 RMS Removed magtape record length error
|
||||
17-Sep-01 RMS Removed multiconsole support
|
||||
@@ -44,6 +45,7 @@ extern DEVICE ptr_dev, ptp_dev;
|
||||
extern DEVICE rp_dev, tu_dev;
|
||||
extern DEVICE dz_dev, ry_dev;
|
||||
extern DEVICE lp20_dev;
|
||||
extern DEVICE xu_dev;
|
||||
extern UNIT cpu_unit;
|
||||
extern REG cpu_reg[];
|
||||
extern d10 *M;
|
||||
@@ -78,6 +80,7 @@ DEVICE *sim_devices[] = {
|
||||
&rp_dev,
|
||||
&tu_dev,
|
||||
&dz_dev,
|
||||
&xu_dev,
|
||||
NULL };
|
||||
|
||||
const char *sim_stop_messages[] = {
|
||||
@@ -129,8 +132,8 @@ word = 0;
|
||||
for (i = 0; i < 6;) {
|
||||
if ((tmp = getc (fileref)) == EOF) return -1;
|
||||
if (tmp & 0200) {
|
||||
word = (word << 6) | ((d10) tmp & 077);
|
||||
i++; } }
|
||||
word = (word << 6) | ((d10) tmp & 077);
|
||||
i++; } }
|
||||
return word;
|
||||
}
|
||||
|
||||
@@ -144,20 +147,21 @@ for ( ;; ) { /* loop until JRST */
|
||||
count = cksm = getrimw (fileref); /* get header */
|
||||
if (count < 0) return SCPE_FMT; /* read err? */
|
||||
if (TSTS (count)) { /* hdr = IOWD? */
|
||||
for ( ; TSTS (count); count = AOB (count)) {
|
||||
data = getrimw (fileref); /* get data wd */
|
||||
if (data < 0) return SCPE_FMT;
|
||||
cksm = cksm + data; /* add to cksm */
|
||||
pa = ((a10) count + 1) & AMASK; /* store */
|
||||
M[pa] = data; } /* end for */
|
||||
data = getrimw (fileref); /* get cksm */
|
||||
if (data < 0) return SCPE_FMT;
|
||||
if ((cksm + data) & DMASK) return SCPE_CSUM; /* test cksm */
|
||||
} /* end if count */
|
||||
else { op = GET_OP (count); /* not IOWD */
|
||||
if (op != OP_JRST) return SCPE_FMT; /* JRST? */
|
||||
saved_PC = (a10) count & AMASK; /* set PC */
|
||||
return SCPE_OK; } /* end else */
|
||||
for ( ; TSTS (count); count = AOB (count)) {
|
||||
data = getrimw (fileref); /* get data wd */
|
||||
if (data < 0) return SCPE_FMT;
|
||||
cksm = cksm + data; /* add to cksm */
|
||||
pa = ((a10) count + 1) & AMASK; /* store */
|
||||
M[pa] = data; } /* end for */
|
||||
data = getrimw (fileref); /* get cksm */
|
||||
if (data < 0) return SCPE_FMT;
|
||||
if ((cksm + data) & DMASK) return SCPE_CSUM;/* test cksm */
|
||||
} /* end if count */
|
||||
else {
|
||||
op = GET_OP (count); /* not IOWD */
|
||||
if (op != OP_JRST) return SCPE_FMT; /* JRST? */
|
||||
saved_PC = (a10) count & AMASK; /* set PC */
|
||||
return SCPE_OK; } /* end else */
|
||||
} /* end for */
|
||||
return SCPE_FMT;
|
||||
}
|
||||
@@ -185,16 +189,17 @@ for ( ;; ) { /* loop */
|
||||
wc = fxread (&count, sizeof (d10), 1, fileref); /* read IOWD */
|
||||
if (wc == 0) return SCPE_OK; /* done? */
|
||||
if (TSTS (count)) { /* IOWD? */
|
||||
for ( ; TSTS (count); count = AOB (count)) {
|
||||
wc = fxread (&data, sizeof (d10), 1, fileref);
|
||||
if (wc == 0) return SCPE_FMT;
|
||||
pa = ((a10) count + 1) & AMASK; /* store data */
|
||||
M[pa] = data; } /* end for */
|
||||
} /* end if count*/
|
||||
else { op = GET_OP (count); /* not IOWD */
|
||||
if (op != OP_JRST) return SCPE_FMT; /* JRST? */
|
||||
saved_PC = (a10) count & AMASK; /* set PC */
|
||||
return SCPE_OK; } /* end else */
|
||||
for ( ; TSTS (count); count = AOB (count)) {
|
||||
wc = fxread (&data, sizeof (d10), 1, fileref);
|
||||
if (wc == 0) return SCPE_FMT;
|
||||
pa = ((a10) count + 1) & AMASK; /* store data */
|
||||
M[pa] = data; } /* end for */
|
||||
} /* end if count*/
|
||||
else {
|
||||
op = GET_OP (count); /* not IOWD */
|
||||
if (op != OP_JRST) return SCPE_FMT; /* JRST? */
|
||||
saved_PC = (a10) count & AMASK; /* set PC */
|
||||
return SCPE_OK; } /* end else */
|
||||
} /* end for */
|
||||
return SCPE_FMT;
|
||||
}
|
||||
@@ -241,25 +246,25 @@ do { wc = fxread (&data, sizeof (d10), 1, fileref); /* read blk hdr */
|
||||
bty = (int32) LRZ (data); /* get type */
|
||||
switch (bty) { /* case type */
|
||||
case EXE_DIR: /* directory */
|
||||
if (ndir) return SCPE_FMT; /* got one */
|
||||
ndir = fxread (dirbuf, sizeof (d10), bsz, fileref);
|
||||
if (ndir < bsz) return SCPE_FMT; /* error */
|
||||
break;
|
||||
if (ndir) return SCPE_FMT; /* got one */
|
||||
ndir = fxread (dirbuf, sizeof (d10), bsz, fileref);
|
||||
if (ndir < bsz) return SCPE_FMT; /* error */
|
||||
break;
|
||||
case EXE_PDV: /* ??? */
|
||||
fseek (fileref, bsz * sizeof (d10), SEEK_CUR);
|
||||
break;
|
||||
fseek (fileref, bsz * sizeof (d10), SEEK_CUR);
|
||||
break;
|
||||
case EXE_VEC: /* entry vec */
|
||||
if (bsz != 2) return SCPE_FMT; /* must be 2 wds */
|
||||
entvec = fxread (entbuf, sizeof (d10), bsz, fileref);
|
||||
if (entvec < 2) return SCPE_FMT; /* error? */
|
||||
cont = 0; /* stop */
|
||||
break;
|
||||
if (bsz != 2) return SCPE_FMT; /* must be 2 wds */
|
||||
entvec = fxread (entbuf, sizeof (d10), bsz, fileref);
|
||||
if (entvec < 2) return SCPE_FMT; /* error? */
|
||||
cont = 0; /* stop */
|
||||
break;
|
||||
case EXE_END: /* end */
|
||||
if (bsz != 0) return SCPE_FMT; /* must be hdr */
|
||||
cont = 0; /* stop */
|
||||
break;
|
||||
if (bsz != 0) return SCPE_FMT; /* must be hdr */
|
||||
cont = 0; /* stop */
|
||||
break;
|
||||
default:
|
||||
return SCPE_FMT; } /* end switch */
|
||||
return SCPE_FMT; } /* end switch */
|
||||
} /* end do */
|
||||
while (cont);
|
||||
|
||||
@@ -268,17 +273,17 @@ for (i = 0; i < ndir; i = i + 2) { /* loop thru dir */
|
||||
mpage = (int32) (dirbuf[i + 1] & RMASK); /* memory page */
|
||||
rpt = (int32) ((dirbuf[i + 1] >> 27) + 1); /* repeat count */
|
||||
for (j = 0; j < rpt; j++, mpage++) { /* loop thru rpts */
|
||||
if (fpage) { /* file pages? */
|
||||
fseek (fileref, (fpage << PAG_V_PN) * sizeof (d10), SEEK_SET);
|
||||
wc = fxread (pagbuf, sizeof (d10), PAG_SIZE, fileref);
|
||||
if (wc < PAG_SIZE) return SCPE_FMT;
|
||||
fpage++; }
|
||||
ma = mpage << PAG_V_PN; /* mem addr */
|
||||
for (k = 0; k < PAG_SIZE; k++, ma++) { /* copy buf to mem */
|
||||
if (MEM_ADDR_NXM (ma)) return SCPE_NXM;
|
||||
M[ma] = fpage? (pagbuf[k] & DMASK): 0;
|
||||
} /* end copy */
|
||||
} /* end rpt */
|
||||
if (fpage) { /* file pages? */
|
||||
fseek (fileref, (fpage << PAG_V_PN) * sizeof (d10), SEEK_SET);
|
||||
wc = fxread (pagbuf, sizeof (d10), PAG_SIZE, fileref);
|
||||
if (wc < PAG_SIZE) return SCPE_FMT;
|
||||
fpage++; }
|
||||
ma = mpage << PAG_V_PN; /* mem addr */
|
||||
for (k = 0; k < PAG_SIZE; k++, ma++) { /* copy buf to mem */
|
||||
if (MEM_ADDR_NXM (ma)) return SCPE_NXM;
|
||||
M[ma] = fpage? (pagbuf[k] & DMASK): 0;
|
||||
} /* end copy */
|
||||
} /* end rpt */
|
||||
} /* end directory */
|
||||
if (entvec && entbuf[1])
|
||||
saved_PC = (int32) entbuf[1] & RMASK; /* start addr */
|
||||
@@ -638,13 +643,13 @@ if (sw & SWMASK ('A')) { /* ASCII? */
|
||||
return SCPE_OK; }
|
||||
if (sw & SWMASK ('C')) { /* character? */
|
||||
for (i = 30; i >= 0; i = i - 6) {
|
||||
c = (int32) ((inst >> i) & 077);
|
||||
fprintf (of, "%c", SIXTOASC (c)); }
|
||||
c = (int32) ((inst >> i) & 077);
|
||||
fprintf (of, "%c", SIXTOASC (c)); }
|
||||
return SCPE_OK; }
|
||||
if (sw & SWMASK ('P')) { /* packed? */
|
||||
for (i = 29; i >= 0; i = i - 7) {
|
||||
c = (int32) ((inst >> i) & 0177);
|
||||
fprintf (of, FMTASC (c)); }
|
||||
c = (int32) ((inst >> i) & 0177);
|
||||
fprintf (of, FMTASC (c)); }
|
||||
return SCPE_OK; }
|
||||
if (!(sw & SWMASK ('M'))) return SCPE_ARG;
|
||||
|
||||
@@ -657,23 +662,23 @@ dev = GET_DEV (inst);
|
||||
for (i = 0; opc_val[i] >= 0; i++) { /* loop thru ops */
|
||||
j = (int32) ((opc_val[i] >> I_V_FL) & I_M_FL); /* get class */
|
||||
if (((opc_val[i] & DMASK) == (inst & masks[j])) && /* match? */
|
||||
(((opc_val[i] & I_ITS) == 0) || ITS)) {
|
||||
(((opc_val[i] & I_ITS) == 0) || ITS)) {
|
||||
fprintf (of, "%s ", opcode[i]); /* opcode */
|
||||
switch (j) { /* case on class */
|
||||
case I_V_AC: /* AC + address */
|
||||
fprintf (of, "%-o,", ac); /* print AC, fall thru */
|
||||
fprintf (of, "%-o,", ac); /* print AC, fall thru */
|
||||
case I_V_OP: /* address only */
|
||||
if (inst & INST_IND) fprintf (of, "@");
|
||||
if (xr) fprintf (of, "%-o(%-o)", y, xr);
|
||||
else fprintf (of, "%-o", y);
|
||||
break;
|
||||
if (inst & INST_IND) fprintf (of, "@");
|
||||
if (xr) fprintf (of, "%-o(%-o)", y, xr);
|
||||
else fprintf (of, "%-o", y);
|
||||
break;
|
||||
case I_V_IO: /* I/O */
|
||||
if (dev < NUMDEV) fprintf (of, "%s,", devnam[dev]);
|
||||
else fprintf (of, "%-o,", dev);
|
||||
if (inst & INST_IND) fprintf (of, "@");
|
||||
if (xr) fprintf (of, "%-o(%-o)", y, xr);
|
||||
else fprintf (of, "%-o", y);
|
||||
break; } /* end case */
|
||||
if (dev < NUMDEV) fprintf (of, "%s,", devnam[dev]);
|
||||
else fprintf (of, "%-o,", dev);
|
||||
if (inst & INST_IND) fprintf (of, "@");
|
||||
if (xr) fprintf (of, "%-o(%-o)", y, xr);
|
||||
else fprintf (of, "%-o", y);
|
||||
break; } /* end case */
|
||||
return SCPE_OK; } /* end if */
|
||||
} /* end for */
|
||||
return SCPE_ARG;
|
||||
@@ -710,7 +715,7 @@ if (*cptr == '(') {
|
||||
cptr++;
|
||||
xr = strtotv (cptr, &tptr, 8);
|
||||
if ((cptr == tptr) || (*tptr != ')') ||
|
||||
(xr > AC_NUM) || (xr == 0)) return 0;
|
||||
(xr > AC_NUM) || (xr == 0)) return 0;
|
||||
cptr = ++tptr; }
|
||||
if (*cptr == 0) *status = SCPE_OK;
|
||||
return (ind | (xr << 18) | val);
|
||||
@@ -739,8 +744,8 @@ cflag = (uptr == NULL) || (uptr == &cpu_unit);
|
||||
while (isspace (*cptr)) cptr++;
|
||||
for (i = 0; i < 6; i++) {
|
||||
if (cptr[i] == 0) {
|
||||
for (j = i + 1; j <= 6; j++) cptr[j] = 0;
|
||||
break; } }
|
||||
for (j = i + 1; j <= 6; j++) cptr[j] = 0;
|
||||
break; } }
|
||||
if ((sw & SWMASK ('A')) || ((*cptr == '\'') && cptr++)) { /* ASCII char? */
|
||||
if (cptr[0] == 0) return SCPE_ARG; /* must have 1 char */
|
||||
val[0] = (t_value) cptr[0];
|
||||
@@ -748,9 +753,9 @@ if ((sw & SWMASK ('A')) || ((*cptr == '\'') && cptr++)) { /* ASCII char? */
|
||||
if ((sw & SWMASK ('C')) || ((*cptr == '"') && cptr++)) { /* sixbit string? */
|
||||
if (cptr[0] == 0) return SCPE_ARG; /* must have 1 char */
|
||||
for (i = 0; i < 6; i++) {
|
||||
val[0] = (val[0] << 6);
|
||||
if (cptr[i]) val[0] = val[0] |
|
||||
((t_value) ((cptr[i] + 040) & 077)); }
|
||||
val[0] = (val[0] << 6);
|
||||
if (cptr[i]) val[0] = val[0] |
|
||||
((t_value) ((cptr[i] + 040) & 077)); }
|
||||
return SCPE_OK; }
|
||||
if ((sw & SWMASK ('P')) || ((*cptr == '#') && cptr++)) { /* packed string? */
|
||||
if (cptr[0] == 0) return SCPE_ARG; /* must have 1 char */
|
||||
@@ -768,11 +773,11 @@ j = (int32) ((opc_val[i] >> I_V_FL) & I_M_FL); /* get class */
|
||||
switch (j) { /* case on class */
|
||||
case I_V_AC: /* AC + operand */
|
||||
if (strchr (cptr, ',')) { /* AC specified? */
|
||||
cptr = get_glyph (cptr, gbuf, ','); /* get glyph */
|
||||
if (gbuf[0]) { /* can be omitted */
|
||||
ac = get_uint (gbuf, 8, AC_NUM - 1, &r);
|
||||
if (r != SCPE_OK) return SCPE_ARG;
|
||||
val[0] = val[0] | (ac << INST_V_AC); } }
|
||||
cptr = get_glyph (cptr, gbuf, ','); /* get glyph */
|
||||
if (gbuf[0]) { /* can be omitted */
|
||||
ac = get_uint (gbuf, 8, AC_NUM - 1, &r);
|
||||
if (r != SCPE_OK) return SCPE_ARG;
|
||||
val[0] = val[0] | (ac << INST_V_AC); } }
|
||||
case I_V_OP: /* operand */
|
||||
cptr = get_glyph (cptr, gbuf, 0);
|
||||
val[0] = val[0] | get_opnd (gbuf, &r);
|
||||
@@ -782,8 +787,8 @@ case I_V_IO: /* I/O */
|
||||
cptr = get_glyph (cptr, gbuf, ','); /* get glyph */
|
||||
for (dev = 0; (dev < NUMDEV) && (strcmp (devnam[dev], gbuf) != 0); dev++);
|
||||
if (dev >= NUMDEV) {
|
||||
dev = get_uint (gbuf, 8, INST_M_DEV, &r);
|
||||
if (r != SCPE_OK) return SCPE_ARG; }
|
||||
dev = get_uint (gbuf, 8, INST_M_DEV, &r);
|
||||
if (r != SCPE_OK) return SCPE_ARG; }
|
||||
val[0] = val[0] | (dev << INST_V_DEV);
|
||||
cptr = get_glyph (cptr, gbuf, 0);
|
||||
val[0] = val[0] | get_opnd (gbuf, &r);
|
||||
|
||||
@@ -153,8 +153,8 @@ if (ttg <= 0) { /* timeout? */
|
||||
if (ITS) { /* ITS? */
|
||||
if (pi_act == 0) quant = (quant + TIM_HWRE) & DMASK;
|
||||
if (TSTS (pcst)) { /* PC sampling? */
|
||||
WriteP ((a10) pcst & AMASK, pager_PC); /* store sample */
|
||||
pcst = AOB (pcst); } /* add 1,,1 */
|
||||
WriteP ((a10) pcst & AMASK, pager_PC); /* store sample */
|
||||
pcst = AOB (pcst); } /* add 1,,1 */
|
||||
} /* end ITS */
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
210
PDP10/pdp10_tu.c
210
PDP10/pdp10_tu.c
@@ -471,48 +471,50 @@ switch (j) { /* decode PA<4:1> */
|
||||
case 000: /* MTCS1 */
|
||||
if ((access == WRITEB) && (PA & 1)) data = data << 8;
|
||||
if (data & CS1_TRE) { /* error clear? */
|
||||
tucs1 = tucs1 & ~CS1_TRE; /* clr CS1<TRE> */
|
||||
tucs2 = tucs2 & ~CS2_ERR; } /* clr CS2<15:8> */
|
||||
tucs1 = tucs1 & ~CS1_TRE; /* clr CS1<TRE> */
|
||||
tucs2 = tucs2 & ~CS2_ERR; } /* clr CS2<15:8> */
|
||||
if ((access == WRITE) || (PA & 1)) { /* hi byte write? */
|
||||
if (tucs1 & CS1_DONE) /* done set? */
|
||||
tucs1 = (tucs1 & ~CS1_UAE) | (data & CS1_UAE); }
|
||||
if (tucs1 & CS1_DONE) /* done set? */
|
||||
tucs1 = (tucs1 & ~CS1_UAE) | (data & CS1_UAE); }
|
||||
if ((access == WRITE) || !(PA & 1)) { /* lo byte write? */
|
||||
if ((data & CS1_DONE) && (data & CS1_IE)) /* to DONE+IE? */
|
||||
tuiff = 1; /* set CSTB INTR */
|
||||
tucs1 = (tucs1 & ~CS1_IE) | (data & CS1_IE);
|
||||
if (fmtr != 0) { /* nx formatter? */
|
||||
tucs2 = tucs2 | CS2_NEF; /* set error flag */
|
||||
cs1f = CS1_SC; } /* req interrupt */
|
||||
else if (tucs1 & CS1_GO) { /* busy? */
|
||||
if (tucs1 & CS1_DONE) tuer = tuer | ER_RMR;
|
||||
else tucs2 = tucs2 | CS2_PGE; }
|
||||
else { tucs1 = (tucs1 & ~CS1_DRV) | (data & CS1_DRV);
|
||||
if (tucs1 & CS1_GO) tu_go (drv); } }
|
||||
if ((data & CS1_DONE) && (data & CS1_IE)) /* to DONE+IE? */
|
||||
tuiff = 1; /* set CSTB INTR */
|
||||
tucs1 = (tucs1 & ~CS1_IE) | (data & CS1_IE);
|
||||
if (fmtr != 0) { /* nx formatter? */
|
||||
tucs2 = tucs2 | CS2_NEF; /* set error flag */
|
||||
cs1f = CS1_SC; } /* req interrupt */
|
||||
else if (tucs1 & CS1_GO) { /* busy? */
|
||||
if (tucs1 & CS1_DONE) tuer = tuer | ER_RMR;
|
||||
else tucs2 = tucs2 | CS2_PGE; }
|
||||
else {
|
||||
tucs1 = (tucs1 & ~CS1_DRV) | (data & CS1_DRV);
|
||||
if (tucs1 & CS1_GO) tu_go (drv); } }
|
||||
break;
|
||||
case 001: /* MTWC */
|
||||
if (access == WRITEB) data = (PA & 1)?
|
||||
(tuwc & 0377) | (data << 8): (tuwc & ~0377) | data;
|
||||
(tuwc & 0377) | (data << 8): (tuwc & ~0377) | data;
|
||||
tuwc = data;
|
||||
break;
|
||||
case 002: /* MTBA */
|
||||
if (access == WRITEB) data = (PA & 1)?
|
||||
(tuba & 0377) | (data << 8): (tuba & ~0377) | data;
|
||||
(tuba & 0377) | (data << 8): (tuba & ~0377) | data;
|
||||
tuba = data & ~BA_MBZ;
|
||||
break;
|
||||
case 003: /* MTFC */
|
||||
if (access == WRITEB) data = (PA & 1)?
|
||||
(tufc & 0377) | (data << 8): (tufc & ~0377) | data;
|
||||
(tufc & 0377) | (data << 8): (tufc & ~0377) | data;
|
||||
tufc = data;
|
||||
tutc = tutc | TC_FCS; /* set fc flag */
|
||||
break;
|
||||
case 004: /* MTCS2 */
|
||||
if ((access == WRITEB) && (PA & 1)) data = data << 8;
|
||||
if (data & CS2_CLR) tu_reset (&tu_dev); /* init? */
|
||||
else { if ((data & ~tucs2) & (CS2_PE | CS2_MXF))
|
||||
cs1f = CS1_SC; /* diagn intr */
|
||||
if (access == WRITEB) data = (tucs2 & /* merge data */
|
||||
((PA & 1)? 0377: 0177400)) | data;
|
||||
tucs2 = (tucs2 & ~CS2_RW) | (data & CS2_RW) | CS2_IR | CS2_OR; }
|
||||
else {
|
||||
if ((data & ~tucs2) & (CS2_PE | CS2_MXF))
|
||||
cs1f = CS1_SC; /* diagn intr */
|
||||
if (access == WRITEB) data = (tucs2 & /* merge data */
|
||||
((PA & 1)? 0377: 0177400)) | data;
|
||||
tucs2 = (tucs2 & ~CS2_RW) | (data & CS2_RW) | CS2_IR | CS2_OR; }
|
||||
break;
|
||||
case 007: /* MTAS */
|
||||
if ((access == WRITEB) && (PA & 1)) break;
|
||||
@@ -520,17 +522,17 @@ case 007: /* MTAS */
|
||||
break;
|
||||
case 011: /* MTDB */
|
||||
if (access == WRITEB) data = (PA & 1)?
|
||||
(tudb & 0377) | (data << 8): (tudb & ~0377) | data;
|
||||
(tudb & 0377) | (data << 8): (tudb & ~0377) | data;
|
||||
tudb = data;
|
||||
break;
|
||||
case 012: /* MTMR */
|
||||
if (access == WRITEB) data = (PA & 1)?
|
||||
(tumr & 0377) | (data << 8): (tumr & ~0377) | data;
|
||||
(tumr & 0377) | (data << 8): (tumr & ~0377) | data;
|
||||
tumr = (tumr & ~MR_RW) | (data & MR_RW);
|
||||
break;
|
||||
case 015: /* MTTC */
|
||||
if (access == WRITEB) data = (PA & 1)?
|
||||
(tutc & 0377) | (data << 8): (tutc & ~0377) | data;
|
||||
(tutc & 0377) | (data << 8): (tutc & ~0377) | data;
|
||||
tutc = (tutc & ~TC_RW) | (data & TC_RW) | TC_SAC;
|
||||
drv = GET_DRV (tutc);
|
||||
break;
|
||||
@@ -586,8 +588,8 @@ case FNC_RIP: /* read-in preset */
|
||||
|
||||
case FNC_UNLOAD: /* unload */
|
||||
if ((uptr->flags & UNIT_ATT) == 0) { /* unattached? */
|
||||
tuer = tuer | ER_UNS;
|
||||
break; }
|
||||
tuer = tuer | ER_UNS;
|
||||
break; }
|
||||
detach_unit (uptr);
|
||||
uptr->USTAT = FS_REW;
|
||||
sim_activate (uptr, tu_time);
|
||||
@@ -595,8 +597,8 @@ case FNC_UNLOAD: /* unload */
|
||||
return;
|
||||
case FNC_REWIND:
|
||||
if ((uptr->flags & UNIT_ATT) == 0) { /* unattached? */
|
||||
tuer = tuer | ER_UNS;
|
||||
break; }
|
||||
tuer = tuer | ER_UNS;
|
||||
break; }
|
||||
uptr->USTAT = FS_PIP | FS_REW;
|
||||
sim_activate (uptr, tu_time);
|
||||
tucs1 = tucs1 & ~CS1_GO;
|
||||
@@ -606,47 +608,47 @@ case FNC_SPACEF:
|
||||
space_test = FS_EOT;
|
||||
case FNC_SPACER:
|
||||
if ((uptr->flags & UNIT_ATT) == 0) { /* unattached? */
|
||||
tuer = tuer | ER_UNS;
|
||||
break; }
|
||||
tuer = tuer | ER_UNS;
|
||||
break; }
|
||||
if ((tufs & space_test) || ((tutc & TC_FCS) == 0)) {
|
||||
tuer = tuer | ER_NXF;
|
||||
break; }
|
||||
tuer = tuer | ER_NXF;
|
||||
break; }
|
||||
uptr->USTAT = FS_PIP;
|
||||
goto GO_XFER;
|
||||
|
||||
case FNC_WCHKR: /* wchk = read */
|
||||
case FNC_READR: /* read rev */
|
||||
if (tufs & FS_BOT) { /* beginning of tape? */
|
||||
tuer = tuer | ER_NXF;
|
||||
break; }
|
||||
tuer = tuer | ER_NXF;
|
||||
break; }
|
||||
goto DATA_XFER;
|
||||
|
||||
case FNC_WRITE: /* write */
|
||||
if (((tutc & TC_FCS) == 0) || /* frame cnt = 0? */
|
||||
((den == TC_800) && (tufc > 0777765))) { /* NRZI, fc < 13? */
|
||||
tuer = tuer | ER_NXF;
|
||||
break; }
|
||||
tuer = tuer | ER_NXF;
|
||||
break; }
|
||||
case FNC_WREOF: /* write tape mark */
|
||||
case FNC_ERASE: /* erase */
|
||||
if (uptr->flags & UNIT_WPRT) { /* write locked? */
|
||||
tuer = tuer | ER_NXF;
|
||||
break; }
|
||||
tuer = tuer | ER_NXF;
|
||||
break; }
|
||||
case FNC_WCHKF: /* wchk = read */
|
||||
case FNC_READF: /* read */
|
||||
DATA_XFER:
|
||||
if ((uptr->flags & UNIT_ATT) == 0) { /* unattached? */
|
||||
tuer = tuer | ER_UNS;
|
||||
break; }
|
||||
tuer = tuer | ER_UNS;
|
||||
break; }
|
||||
if (fmt_test[GET_FMT (tutc)] == 0) { /* invalid format? */
|
||||
tuer = tuer | ER_FER;
|
||||
break; }
|
||||
tuer = tuer | ER_FER;
|
||||
break; }
|
||||
if (den_test[den] == 0) { /* invalid density? */
|
||||
tuer = tuer | ER_NXF;
|
||||
break; }
|
||||
tuer = tuer | ER_NXF;
|
||||
break; }
|
||||
if (uptr->UDENS == UD_UNK) uptr->UDENS = den; /* set dens */
|
||||
/* else if (uptr->UDENS != den) { /* density mismatch? */
|
||||
/* tuer = tuer | ER_NXF;
|
||||
/* break; } */
|
||||
/* tuer = tuer | ER_NXF;
|
||||
/* break; } */
|
||||
uptr->USTAT = 0;
|
||||
tucs1 = tucs1 & ~CS1_DONE; /* clear done */
|
||||
GO_XFER:
|
||||
@@ -706,10 +708,11 @@ switch (f) { /* case on function */
|
||||
/* Unit service - non-data transfer commands - set ATA when done */
|
||||
|
||||
case FNC_SPACEF: /* space forward */
|
||||
do { tufc = (tufc + 1) & 0177777; /* incr fc */
|
||||
if (tu_rdlntf (uptr, &tbc, &err)) break;/* read rec lnt, err? */
|
||||
uptr->pos = uptr->pos + ((MTRL (tbc) + 1) & ~1) +
|
||||
(2 * sizeof (t_mtrlnt)); }
|
||||
do {
|
||||
tufc = (tufc + 1) & 0177777; /* incr fc */
|
||||
if (tu_rdlntf (uptr, &tbc, &err)) break; /* read rec lnt, err? */
|
||||
uptr->pos = uptr->pos + ((MTRL (tbc) + 1) & ~1) +
|
||||
(2 * sizeof (t_mtrlnt)); }
|
||||
while (tufc != 0);
|
||||
if (tufc) tuer = tuer | ER_FCE;
|
||||
else tutc = tutc & ~TC_FCS;
|
||||
@@ -717,11 +720,13 @@ case FNC_SPACEF: /* space forward */
|
||||
break;
|
||||
|
||||
case FNC_SPACER: /* space reverse */
|
||||
do { tufc = (tufc + 1) & 0177777; /* incr wc */
|
||||
if (pnu) pnu = 0; /* pos not upd? */
|
||||
else { if (tu_rdlntr (uptr, &tbc, &err)) break;
|
||||
uptr->pos = uptr->pos - ((MTRL (tbc) + 1) & ~1) -
|
||||
(2 * sizeof (t_mtrlnt)); } }
|
||||
do {
|
||||
tufc = (tufc + 1) & 0177777; /* incr wc */
|
||||
if (pnu) pnu = 0; /* pos not upd? */
|
||||
else {
|
||||
if (tu_rdlntr (uptr, &tbc, &err)) break;
|
||||
uptr->pos = uptr->pos - ((MTRL (tbc) + 1) & ~1) -
|
||||
(2 * sizeof (t_mtrlnt)); } }
|
||||
while (tufc != 0);
|
||||
if (tufc) tuer = tuer | ER_FCE;
|
||||
else tutc = tutc & ~TC_FCS;
|
||||
@@ -757,28 +762,28 @@ case FNC_READF: /* read */
|
||||
case FNC_WCHKF: /* wcheck = read */
|
||||
tufc = 0; /* clear frame count */
|
||||
if ((uptr->UDENS == TC_1600) && (uptr->pos == 0))
|
||||
tufs = tufs | FS_ID; /* PE BOT? ID burst */
|
||||
tufs = tufs | FS_ID; /* PE BOT? ID burst */
|
||||
TXFR (ba, wc, 0); /* validate transfer */
|
||||
if (tu_rdlntf (uptr, &tbc, &err)) break; /* read rec lnt, err? */
|
||||
if (MTRF (tbc)) { /* bad record? */
|
||||
tuer = tuer | ER_CRC; /* set error flag */
|
||||
uptr->pos = uptr->pos + ((MTRL (tbc) + 1) & ~1) +
|
||||
(2 * sizeof (t_mtrlnt));
|
||||
break; }
|
||||
tuer = tuer | ER_CRC; /* set error flag */
|
||||
uptr->pos = uptr->pos + ((MTRL (tbc) + 1) & ~1) +
|
||||
(2 * sizeof (t_mtrlnt));
|
||||
break; }
|
||||
if (tbc > XBUFLNT) return SCPE_MTRLNT; /* bad rec length? */
|
||||
abc = fxread (xbuf, sizeof (int8), tbc, uptr->fileref);
|
||||
if (err = ferror (uptr->fileref)) { /* error? */
|
||||
MT_SET_PNU (uptr); /* pos not upd */
|
||||
break; }
|
||||
MT_SET_PNU (uptr); /* pos not upd */
|
||||
break; }
|
||||
for ( ; abc < tbc + 4; abc++) xbuf[abc] = 0; /* fill/pad with 0's */
|
||||
for (i = j = 0; (i < wc10) && (j < ((int32) tbc)); i++) {
|
||||
if ((i == 0) || NEWPAGE (ba10 + i, 0)) { /* map new page */
|
||||
MAPM (ba10 + i, mpa10, 0); }
|
||||
for (k = 0; k < 4; k++) v[k] = xbuf[j++];
|
||||
val = (v[0] << 28) | (v[1] << 20) | (v[2] << 12) | (v[3] << 4);
|
||||
if (fmt == TC_10C) val = val | ((d10) xbuf[j++] & 017);
|
||||
if (f == FNC_READF) M[mpa10] = val;
|
||||
mpa10 = mpa10 + 1; } /* end for */
|
||||
if ((i == 0) || NEWPAGE (ba10 + i, 0)) { /* map new page */
|
||||
MAPM (ba10 + i, mpa10, 0); }
|
||||
for (k = 0; k < 4; k++) v[k] = xbuf[j++];
|
||||
val = (v[0] << 28) | (v[1] << 20) | (v[2] << 12) | (v[3] << 4);
|
||||
if (fmt == TC_10C) val = val | ((d10) xbuf[j++] & 017);
|
||||
if (f == FNC_READF) M[mpa10] = val;
|
||||
mpa10 = mpa10 + 1; } /* end for */
|
||||
uptr->pos = uptr->pos + ((tbc + 1) & ~1) + (2 * sizeof (t_mtrlnt));
|
||||
tufc = tbc & 0177777;
|
||||
tuwc = (tuwc + (i << 1)) & 0177777;
|
||||
@@ -789,26 +794,27 @@ case FNC_WRITE: /* write */
|
||||
TXFR (ba, wc, 0); /* validate transfer */
|
||||
fseek (uptr->fileref, uptr->pos, SEEK_SET);
|
||||
for (i = j = 0; (i < wc10) && (j < fc); i++) {
|
||||
if ((i == 0) || NEWPAGE (ba10 + i, 0)) { /* map new page */
|
||||
MAPM (ba10 + i, mpa10, 0); }
|
||||
val = M[mpa10];
|
||||
xbuf[j++] = (uint8) ((val >> 28) & 0377);
|
||||
xbuf[j++] = (uint8) ((val >> 20) & 0377);
|
||||
xbuf[j++] = (uint8) ((val >> 12) & 0377);
|
||||
xbuf[j++] = (uint8) ((val >> 4) & 0377);
|
||||
if (fmt == TC_10C) xbuf[j++] = (uint8) (val & 017);
|
||||
mpa10 = mpa10 + 1; } /* end for */
|
||||
if ((i == 0) || NEWPAGE (ba10 + i, 0)) { /* map new page */
|
||||
MAPM (ba10 + i, mpa10, 0); }
|
||||
val = M[mpa10];
|
||||
xbuf[j++] = (uint8) ((val >> 28) & 0377);
|
||||
xbuf[j++] = (uint8) ((val >> 20) & 0377);
|
||||
xbuf[j++] = (uint8) ((val >> 12) & 0377);
|
||||
xbuf[j++] = (uint8) ((val >> 4) & 0377);
|
||||
if (fmt == TC_10C) xbuf[j++] = (uint8) (val & 017);
|
||||
mpa10 = mpa10 + 1; } /* end for */
|
||||
if (j < fc) fc = j; /* short record? */
|
||||
fxwrite (&fc, sizeof (t_mtrlnt), 1, uptr->fileref);
|
||||
fxwrite (xbuf, sizeof (int8), (fc + 1) & ~1, uptr->fileref);
|
||||
fxwrite (&fc, sizeof (t_mtrlnt), 1, uptr->fileref);
|
||||
if (err = ferror (uptr->fileref)) MT_SET_PNU (uptr);
|
||||
else { uptr->pos = uptr->pos + ((fc + 1) & ~1) +
|
||||
(2 * sizeof (t_mtrlnt));
|
||||
tufc = (tufc + fc) & 0177777;
|
||||
if (tufc == 0) tutc = tutc & ~TC_FCS;
|
||||
tuwc = (tuwc + (i << 1)) & 0177777;
|
||||
ba = ba + (i << 2); }
|
||||
else {
|
||||
uptr->pos = uptr->pos + ((fc + 1) & ~1) +
|
||||
(2 * sizeof (t_mtrlnt));
|
||||
tufc = (tufc + fc) & 0177777;
|
||||
if (tufc == 0) tutc = tutc & ~TC_FCS;
|
||||
tuwc = (tuwc + (i << 1)) & 0177777;
|
||||
ba = ba + (i << 2); }
|
||||
break;
|
||||
|
||||
case FNC_READR: /* read reverse */
|
||||
@@ -817,24 +823,24 @@ case FNC_WCHKR: /* wcheck = read */
|
||||
TXFR (ba, wc, 1); /* validate xfer rev */
|
||||
if (tu_rdlntr (uptr, &tbc, &err)) break; /* read rec lnt, err? */
|
||||
if (MTRF (tbc)) { /* bad record? */
|
||||
tuer = tuer | ER_CRC; /* set error flag */
|
||||
uptr->pos = uptr->pos - ((MTRL (tbc) + 1) & ~1) -
|
||||
(2 * sizeof (t_mtrlnt));
|
||||
break; }
|
||||
tuer = tuer | ER_CRC; /* set error flag */
|
||||
uptr->pos = uptr->pos - ((MTRL (tbc) + 1) & ~1) -
|
||||
(2 * sizeof (t_mtrlnt));
|
||||
break; }
|
||||
if (tbc > XBUFLNT) return SCPE_MTRLNT; /* bad rec length? */
|
||||
fseek (uptr->fileref, uptr->pos - sizeof (t_mtrlnt)
|
||||
- ((tbc + 1) & ~1), SEEK_SET);
|
||||
- ((tbc + 1) & ~1), SEEK_SET);
|
||||
fxread (xbuf + 4, sizeof (int8), tbc, uptr->fileref);
|
||||
for (i = 0; i < 4; i++) xbuf[i] = 0;
|
||||
err = ferror (uptr->fileref); /* set err but finish */
|
||||
for (i = 0, j = tbc + 4; (i < wc10) && (j >= 4); i++) {
|
||||
if ((i == 0) || NEWPAGE (ba10 - i, PAG_M_OFF)) { /* map page */
|
||||
MAPM (ba10 - i, mpa10, UMAP_RRV); }
|
||||
val = ((fmt == TC_10C)? (((d10) xbuf [--j]) & 017): 0);
|
||||
for (k = 0; k < 4; i++) v[k] = xbuf[--j];
|
||||
val = val | (v[0] << 4) | (v[1] << 12) | (v[2] << 20) | (v[3] << 28);
|
||||
if (f == FNC_READR) M[mpa10] = val;
|
||||
mpa10 = mpa10 - 1; } /* end for */
|
||||
if ((i == 0) || NEWPAGE (ba10 - i, PAG_M_OFF)) { /* map page */
|
||||
MAPM (ba10 - i, mpa10, UMAP_RRV); }
|
||||
val = ((fmt == TC_10C)? (((d10) xbuf [--j]) & 017): 0);
|
||||
for (k = 0; k < 4; i++) v[k] = xbuf[--j];
|
||||
val = val | (v[0] << 4) | (v[1] << 12) | (v[2] << 20) | (v[3] << 28);
|
||||
if (f == FNC_READR) M[mpa10] = val;
|
||||
mpa10 = mpa10 - 1; } /* end for */
|
||||
uptr->pos = uptr->pos - ((tbc + 1) & ~1) - (2 * sizeof (t_mtrlnt));
|
||||
tufc = tbc & 0177777;
|
||||
tuwc = (tuwc + (i << 1)) & 0177777;
|
||||
@@ -871,10 +877,10 @@ if ((flag & ~tucs1) & CS1_DONE) /* DONE 0 to 1? */
|
||||
if (GET_FMTR (tucs2) == 0) { /* formatter present? */
|
||||
tufs = (tufs & ~FS_DYN) | FS_FPR;
|
||||
if (tu_unit[drv].flags & UNIT_ATT) {
|
||||
tufs = tufs | FS_MOL | tu_unit[drv].USTAT;
|
||||
if (tu_unit[drv].UDENS == TC_1600) tufs = tufs | FS_PE;
|
||||
if (tu_unit[drv].flags & UNIT_WPRT) tufs = tufs | FS_WRL;
|
||||
if ((tu_unit[drv].pos == 0) && !act) tufs = tufs | FS_BOT; }
|
||||
tufs = tufs | FS_MOL | tu_unit[drv].USTAT;
|
||||
if (tu_unit[drv].UDENS == TC_1600) tufs = tufs | FS_PE;
|
||||
if (tu_unit[drv].flags & UNIT_WPRT) tufs = tufs | FS_WRL;
|
||||
if ((tu_unit[drv].pos == 0) && !act) tufs = tufs | FS_BOT; }
|
||||
if (tuer) tufs = tufs | FS_ERR; }
|
||||
else tufs = 0;
|
||||
tucs1 = (tucs1 & ~(CS1_SC | CS1_MCPE | CS1_MBZ)) | CS1_DVA | flag;
|
||||
|
||||
@@ -216,14 +216,14 @@ case XT_CMPSG: /* CMPSG */
|
||||
f2 = Read (ADDA (ea, 2), MM_OPND) & bytemask[GET_S (AC(p4))];
|
||||
b1 = b2 = 0;
|
||||
for (flg = 0; (AC(ac) | AC(p3)) && (b1 == b2); flg++) {
|
||||
if (flg && (t = test_int ())) ABORT (t);
|
||||
rlog = 0; /* clear log */
|
||||
if (AC(ac)) b1 = incloadbp (p1, pflgs); /* src1 */
|
||||
else b1 = f1;
|
||||
if (AC(p3)) b2 = incloadbp (p4, pflgs); /* src2 */
|
||||
else b2 = f2;
|
||||
if (AC(ac)) AC(ac) = (AC(ac) - 1) & XLNTMASK;
|
||||
if (AC(p3)) AC(p3) = (AC(p3) - 1) & XLNTMASK; }
|
||||
if (flg && (t = test_int ())) ABORT (t);
|
||||
rlog = 0; /* clear log */
|
||||
if (AC(ac)) b1 = incloadbp (p1, pflgs); /* src1 */
|
||||
else b1 = f1;
|
||||
if (AC(p3)) b2 = incloadbp (p4, pflgs); /* src2 */
|
||||
else b2 = f2;
|
||||
if (AC(ac)) AC(ac) = (AC(ac) - 1) & XLNTMASK;
|
||||
if (AC(p3)) AC(p3) = (AC(p3) - 1) & XLNTMASK; }
|
||||
switch (xop) {
|
||||
case XT_CMPSL: return (b1 < b2)? XT_SKIP: XT_NOSK;
|
||||
case XT_CMPSE: return (b1 == b2)? XT_SKIP: XT_NOSK;
|
||||
@@ -245,42 +245,43 @@ case XT_CVTBDO: /* CVTBDO */
|
||||
case XT_CVTBDT: /* CVTBDT */
|
||||
e1 = calc_ea (xinst, MM_EA); /* get ext inst addr */
|
||||
if (xop == XT_CVTBDO) /* offset? */
|
||||
xoff = (e1 & RSIGN)? (e1 | LMASK): e1; /* get offset */
|
||||
xoff = (e1 & RSIGN)? (e1 | LMASK): e1; /* get offset */
|
||||
rs[0] = AC(ac); /* get src opnd */
|
||||
rs[1] = CLRS (AC(p1));
|
||||
if (!TSTF (F_FPD)) { /* set up done yet? */
|
||||
if (TSTS (AC(ac))) { DMOVN (rs); } /* get abs value */
|
||||
for (i = 22; i > 1; i--) { /* find field width */
|
||||
if (DCMPGE (rs, pwrs10[i])) break; }
|
||||
if (i > (AC(p3) & XLNTMASK)) return XT_NOSK;
|
||||
if ((i < (AC(p3) & XLNTMASK)) && (AC(p3) & XT_LFLG)) {
|
||||
f1 = Read (ADDA (ea, 1), MM_OPND);
|
||||
filldst (f1, p3, (AC(p3) & XLNTMASK) - i, pflgs); }
|
||||
else AC(p3) = (AC(p3) & XFLGMASK) | i;
|
||||
if (TSTS (AC(ac))) AC(p3) = AC(p3) | XT_MFLG;
|
||||
if (AC(ac) | AC(p1)) AC(p3) = AC(p3) | XT_NFLG;
|
||||
AC(ac) = rs[0]; /* update state */
|
||||
AC(p1) = rs[1];
|
||||
SETF (F_FPD); } /* mark set up done */
|
||||
if (TSTS (AC(ac))) { DMOVN (rs); } /* get abs value */
|
||||
for (i = 22; i > 1; i--) { /* find field width */
|
||||
if (DCMPGE (rs, pwrs10[i])) break; }
|
||||
if (i > (AC(p3) & XLNTMASK)) return XT_NOSK;
|
||||
if ((i < (AC(p3) & XLNTMASK)) && (AC(p3) & XT_LFLG)) {
|
||||
f1 = Read (ADDA (ea, 1), MM_OPND);
|
||||
filldst (f1, p3, (AC(p3) & XLNTMASK) - i, pflgs); }
|
||||
else AC(p3) = (AC(p3) & XFLGMASK) | i;
|
||||
if (TSTS (AC(ac))) AC(p3) = AC(p3) | XT_MFLG;
|
||||
if (AC(ac) | AC(p1)) AC(p3) = AC(p3) | XT_NFLG;
|
||||
AC(ac) = rs[0]; /* update state */
|
||||
AC(p1) = rs[1];
|
||||
SETF (F_FPD); } /* mark set up done */
|
||||
|
||||
/* Now do actual binary to decimal conversion */
|
||||
|
||||
for (flg = 0; AC(p3) & XLNTMASK; flg++) {
|
||||
if (flg && (t = test_int ())) ABORT (t);
|
||||
rlog = 0; /* clear log */
|
||||
i = (int32) AC(p3) & XLNTMASK; /* get length */
|
||||
if (i > 22) i = 22; /* put in range */
|
||||
for (digit = 0; (digit < 10) && DCMPGE (rs, pwrs10[i]); digit++) {
|
||||
rs[0] = rs[0] - pwrs10[i][0] - (rs[1] < pwrs10[i][1]);
|
||||
rs[1] = (rs[1] - pwrs10[i][1]) & MMASK; }
|
||||
if (xop == XT_CVTBDO) digit = (digit + xoff) & DMASK;
|
||||
else { f1 = Read (e1 + (int32) digit, MM_OPND);
|
||||
if ((i == 1) && (AC(p3) & XT_LFLG)) f1 = f1 >> 18;
|
||||
digit = f1 & RMASK; }
|
||||
incstorebp (digit, p4, pflgs); /* store digit */
|
||||
AC(ac) = rs[0]; /* mem access ok */
|
||||
AC(p1) = rs[1]; /* update state */
|
||||
AC(p3) = (AC(p3) & XFLGMASK) | ((AC(p3) - 1) & XLNTMASK); }
|
||||
if (flg && (t = test_int ())) ABORT (t);
|
||||
rlog = 0; /* clear log */
|
||||
i = (int32) AC(p3) & XLNTMASK; /* get length */
|
||||
if (i > 22) i = 22; /* put in range */
|
||||
for (digit = 0; (digit < 10) && DCMPGE (rs, pwrs10[i]); digit++) {
|
||||
rs[0] = rs[0] - pwrs10[i][0] - (rs[1] < pwrs10[i][1]);
|
||||
rs[1] = (rs[1] - pwrs10[i][1]) & MMASK; }
|
||||
if (xop == XT_CVTBDO) digit = (digit + xoff) & DMASK;
|
||||
else {
|
||||
f1 = Read (e1 + (int32) digit, MM_OPND);
|
||||
if ((i == 1) && (AC(p3) & XT_LFLG)) f1 = f1 >> 18;
|
||||
digit = f1 & RMASK; }
|
||||
incstorebp (digit, p4, pflgs); /* store digit */
|
||||
AC(ac) = rs[0]; /* mem access ok */
|
||||
AC(p1) = rs[1]; /* update state */
|
||||
AC(p3) = (AC(p3) & XFLGMASK) | ((AC(p3) - 1) & XLNTMASK); }
|
||||
CLRF (F_FPD); /* clear FPD */
|
||||
return XT_SKIP;
|
||||
|
||||
@@ -298,31 +299,32 @@ case XT_CVTDBO: /* CVTDBO */
|
||||
if ((AC(ac) & XT_SFLG) == 0) AC(p3) = AC(p4) = 0; /* !S? clr res */
|
||||
else AC(p4) = CLRS (AC(p4)); /* clear low sign */
|
||||
if (xop == XT_CVTDBO) { /* offset? */
|
||||
xoff = (e1 & RSIGN)? (e1 | LMASK): e1; /* get offset */
|
||||
AC(ac) = AC(ac) | XT_SFLG; } /* set S flag */
|
||||
xoff = (e1 & RSIGN)? (e1 | LMASK): e1; /* get offset */
|
||||
AC(ac) = AC(ac) | XT_SFLG; } /* set S flag */
|
||||
xflgs = AC(ac) & XFLGMASK; /* get xlation flags */
|
||||
for (flg = 0; AC(ac) & XLNTMASK; flg++) {
|
||||
if (flg && (t = test_int ())) ABORT (t);
|
||||
rlog = 0; /* clear log */
|
||||
b1 = incloadbp (p1, pflgs); /* get byte */
|
||||
if (xop == XT_CVTDBO) b1 = (b1 + xoff) & DMASK;
|
||||
else { b1 = xlate (b1, e1, &xflgs, MM_OPND);
|
||||
if (b1 < 0) { /* terminated? */
|
||||
AC(ac) = xflgs | ((AC(ac) - 1) & XLNTMASK);
|
||||
if (TSTS (AC(p3))) AC(p4) = SETS (AC(p4));
|
||||
return XT_NOSK; }
|
||||
if (xflgs & XT_SFLG) b1 = b1 & XT_DGMASK;
|
||||
else b1 = 0; }
|
||||
AC(ac) = xflgs | ((AC(ac) - 1) & XLNTMASK);
|
||||
if ((b1 < 0) || (b1 > 9)) { /* bad digit? done */
|
||||
if (TSTS (AC(p3))) AC(p4) = SETS (AC(p4));
|
||||
return XT_NOSK; }
|
||||
AC(p4) = (AC(p4) * 10) + b1; /* base * 10 + digit */
|
||||
AC(p3) = ((AC(p3) * 10) + (AC(p4) >> 35)) & DMASK;
|
||||
AC(p4) = AC(p4) & MMASK; }
|
||||
if (flg && (t = test_int ())) ABORT (t);
|
||||
rlog = 0; /* clear log */
|
||||
b1 = incloadbp (p1, pflgs); /* get byte */
|
||||
if (xop == XT_CVTDBO) b1 = (b1 + xoff) & DMASK;
|
||||
else {
|
||||
b1 = xlate (b1, e1, &xflgs, MM_OPND);
|
||||
if (b1 < 0) { /* terminated? */
|
||||
AC(ac) = xflgs | ((AC(ac) - 1) & XLNTMASK);
|
||||
if (TSTS (AC(p3))) AC(p4) = SETS (AC(p4));
|
||||
return XT_NOSK; }
|
||||
if (xflgs & XT_SFLG) b1 = b1 & XT_DGMASK;
|
||||
else b1 = 0; }
|
||||
AC(ac) = xflgs | ((AC(ac) - 1) & XLNTMASK);
|
||||
if ((b1 < 0) || (b1 > 9)) { /* bad digit? done */
|
||||
if (TSTS (AC(p3))) AC(p4) = SETS (AC(p4));
|
||||
return XT_NOSK; }
|
||||
AC(p4) = (AC(p4) * 10) + b1; /* base * 10 + digit */
|
||||
AC(p3) = ((AC(p3) * 10) + (AC(p4) >> 35)) & DMASK;
|
||||
AC(p4) = AC(p4) & MMASK; }
|
||||
if (AC(ac) & XT_MFLG) {
|
||||
AC(p4) = -AC(p4) & MMASK;
|
||||
AC(p3) = (~AC(p3) + (AC(p4) == 0)) & DMASK; }
|
||||
AC(p4) = -AC(p4) & MMASK;
|
||||
AC(p3) = (~AC(p3) + (AC(p4) == 0)) & DMASK; }
|
||||
if (TSTS (AC(p3))) AC(p4) = SETS (AC(p4));
|
||||
return XT_SKIP;
|
||||
|
||||
@@ -343,24 +345,24 @@ case XT_MOVSLJ: /* MOVSLJ */
|
||||
f1 = Read (ADDA (ea, 1), MM_OPND); /* get fill */
|
||||
switch (xop) { /* case on instr */
|
||||
case XT_MOVSO: /* MOVSO */
|
||||
AC(ac) = AC(ac) & XLNTMASK; /* trim src length */
|
||||
xoff = calc_ea (xinst, MM_EA); /* get offset */
|
||||
if (xoff & RSIGN) xoff = xoff | LMASK; /* sign extend 18b */
|
||||
s2 = GET_S (AC(p4)); /* get dst byte size */
|
||||
break;
|
||||
AC(ac) = AC(ac) & XLNTMASK; /* trim src length */
|
||||
xoff = calc_ea (xinst, MM_EA); /* get offset */
|
||||
if (xoff & RSIGN) xoff = xoff | LMASK; /* sign extend 18b */
|
||||
s2 = GET_S (AC(p4)); /* get dst byte size */
|
||||
break;
|
||||
case XT_MOVST: /* MOVST */
|
||||
e1 = calc_ea (xinst, MM_EA); /* get xlate tbl addr */
|
||||
break;
|
||||
e1 = calc_ea (xinst, MM_EA); /* get xlate tbl addr */
|
||||
break;
|
||||
case XT_MOVSRJ: /* MOVSRJ */
|
||||
AC(ac) = AC(ac) & XLNTMASK; /* trim src length */
|
||||
if (AC(p3) == 0) return (AC(ac)? XT_NOSK: XT_SKIP);
|
||||
if (AC(ac) > AC(p3)) { /* adv src ptr */
|
||||
for (flg = 0; AC(ac) > AC(p3); flg++) {
|
||||
if (flg && (t = test_int ())) ABORT (t);
|
||||
AC(p1) = incbp (AC(p1));
|
||||
AC(ac) = (AC(ac) - 1) & XLNTMASK; } }
|
||||
else if (AC(ac) < AC(p3))
|
||||
filldst (f1, p3, AC(p3) - AC(ac), pflgs);
|
||||
AC(ac) = AC(ac) & XLNTMASK; /* trim src length */
|
||||
if (AC(p3) == 0) return (AC(ac)? XT_NOSK: XT_SKIP);
|
||||
if (AC(ac) > AC(p3)) { /* adv src ptr */
|
||||
for (flg = 0; AC(ac) > AC(p3); flg++) {
|
||||
if (flg && (t = test_int ())) ABORT (t);
|
||||
AC(p1) = incbp (AC(p1));
|
||||
AC(ac) = (AC(ac) - 1) & XLNTMASK; } }
|
||||
else if (AC(ac) < AC(p3))
|
||||
filldst (f1, p3, AC(p3) - AC(ac), pflgs);
|
||||
break;
|
||||
case XT_MOVSLJ: /* MOVSLJ */
|
||||
AC(ac) = AC(ac) & XLNTMASK; /* trim src length */
|
||||
@@ -369,27 +371,27 @@ case XT_MOVSLJ: /* MOVSLJ */
|
||||
xflgs = AC(ac) & XFLGMASK; /* get xlation flags */
|
||||
if (AC(p3) == 0) return (AC(ac)? XT_NOSK: XT_SKIP);
|
||||
for (flg = 0; AC(p3) & XLNTMASK; flg++) {
|
||||
if (flg && (t = test_int ())) ABORT (t);
|
||||
rlog = 0; /* clear log */
|
||||
if (AC(ac) & XLNTMASK) { /* any source? */
|
||||
b1 = incloadbp (p1, pflgs); /* src byte */
|
||||
if (xop == XT_MOVSO) { /* offset? */
|
||||
b1 = (b1 + xoff) & DMASK; /* test fit */
|
||||
if (b1 & ~bytemask[s2]) {
|
||||
AC(ac) = xflgs | ((AC(ac) - 1) & XLNTMASK);
|
||||
return XT_NOSK; } }
|
||||
else if (xop == XT_MOVST) { /* translate? */
|
||||
b1 = xlate (b1, e1, &xflgs, MM_OPND);
|
||||
if (b1 < 0) { /* upd flags in AC */
|
||||
AC(ac) = xflgs | ((AC(ac) - 1) & XLNTMASK);
|
||||
return XT_NOSK; }
|
||||
if (xflgs & XT_SFLG) b1 = b1 & XT_BYMASK;
|
||||
else b1 = -1; } }
|
||||
else b1 = f1;
|
||||
if (b1 >= 0) { /* valid byte? */
|
||||
incstorebp (b1, p4, pflgs); /* store byte */
|
||||
AC(p3) = (AC(p3) - 1) & XLNTMASK; } /* update state */
|
||||
if (AC(ac) & XLNTMASK) AC(ac) = xflgs | ((AC(ac) - 1) & XLNTMASK); }
|
||||
if (flg && (t = test_int ())) ABORT (t);
|
||||
rlog = 0; /* clear log */
|
||||
if (AC(ac) & XLNTMASK) { /* any source? */
|
||||
b1 = incloadbp (p1, pflgs); /* src byte */
|
||||
if (xop == XT_MOVSO) { /* offset? */
|
||||
b1 = (b1 + xoff) & DMASK; /* test fit */
|
||||
if (b1 & ~bytemask[s2]) {
|
||||
AC(ac) = xflgs | ((AC(ac) - 1) & XLNTMASK);
|
||||
return XT_NOSK; } }
|
||||
else if (xop == XT_MOVST) { /* translate? */
|
||||
b1 = xlate (b1, e1, &xflgs, MM_OPND);
|
||||
if (b1 < 0) { /* upd flags in AC */
|
||||
AC(ac) = xflgs | ((AC(ac) - 1) & XLNTMASK);
|
||||
return XT_NOSK; }
|
||||
if (xflgs & XT_SFLG) b1 = b1 & XT_BYMASK;
|
||||
else b1 = -1; } }
|
||||
else b1 = f1;
|
||||
if (b1 >= 0) { /* valid byte? */
|
||||
incstorebp (b1, p4, pflgs); /* store byte */
|
||||
AC(p3) = (AC(p3) - 1) & XLNTMASK; } /* update state */
|
||||
if (AC(ac) & XLNTMASK) AC(ac) = xflgs | ((AC(ac) - 1) & XLNTMASK); }
|
||||
return (AC(ac) & XLNTMASK)? XT_NOSK: XT_SKIP;
|
||||
|
||||
/* Edit - checked against KS10 ucode
|
||||
@@ -406,80 +408,82 @@ case XT_EDIT: /* EDIT */
|
||||
xflgs = AC(ac) & XFLGMASK; /* get xlation flags */
|
||||
e1 = calc_ea (xinst, MM_EA); /* get xlate tbl addr */
|
||||
for (ppi = 1, ret = -1, flg = 0; ret < 0; flg++, ppi = 1) {
|
||||
if (flg && (t = test_int ())) ABORT (t);
|
||||
rlog = 0; /* clear log */
|
||||
pp = (int32) AC(ac) & AMASK; /* get pattern ptr */
|
||||
b1 = Read (pp, MM_OPND); /* get pattern word */
|
||||
pat = ED_PBYTE (b1, AC(ac)); /* get pattern byte */
|
||||
switch ((pat < 0100)? pat: ((pat >> ED_V_POPC) + 0100)) {
|
||||
case ED_STOP: /* stop */
|
||||
ret = XT_SKIP; /* exit loop */
|
||||
break;
|
||||
case ED_SELECT: /* select source */
|
||||
b1 = incloadbp (p1, pflgs); /* get src */
|
||||
entad = (e1 + ((int32) b1 >> 1)) & AMASK;
|
||||
f1 = ((Read (entad, MM_OPND) >> ((b1 & 1)? 0: 18)) & RMASK);
|
||||
i = XT_GETCODE (f1);
|
||||
if (i & 2) xflgs =
|
||||
(i & 1)? xflgs | XT_MFLG: xflgs & ~XT_MFLG;
|
||||
switch (i) {
|
||||
case 00: case 02: case 03:
|
||||
if (xflgs & XT_SFLG) f1 = f1 & XT_BYMASK;
|
||||
else { f1 = Read (INCA (ea), MM_OPND);
|
||||
if (f1 == 0) break; }
|
||||
incstorebp (f1, p4, pflgs);
|
||||
break;
|
||||
case 01:
|
||||
ret = XT_NOSK; /* exit loop */
|
||||
break;
|
||||
case 04: case 06: case 07:
|
||||
xflgs = xflgs | XT_NFLG;
|
||||
f1 = f1 & XT_BYMASK;
|
||||
if ((xflgs & XT_SFLG) == 0) {
|
||||
f2 = Read (ADDA (ea, 2), MM_OPND);
|
||||
Write ((a10) AC(p3), AC(p4), MM_OPND);
|
||||
if (f2) incstorebp (f2, p4, pflgs);
|
||||
xflgs = xflgs | XT_SFLG; }
|
||||
incstorebp (f1, p4, pflgs);
|
||||
break;
|
||||
case 05:
|
||||
xflgs = xflgs | XT_NFLG;
|
||||
ret = XT_NOSK; /* exit loop */
|
||||
break; } /* end case xlate op */
|
||||
break;
|
||||
if (flg && (t = test_int ())) ABORT (t);
|
||||
rlog = 0; /* clear log */
|
||||
pp = (int32) AC(ac) & AMASK; /* get pattern ptr */
|
||||
b1 = Read (pp, MM_OPND); /* get pattern word */
|
||||
pat = ED_PBYTE (b1, AC(ac)); /* get pattern byte */
|
||||
switch ((pat < 0100)? pat: ((pat >> ED_V_POPC) + 0100)) {
|
||||
case ED_STOP: /* stop */
|
||||
ret = XT_SKIP; /* exit loop */
|
||||
break;
|
||||
case ED_SELECT: /* select source */
|
||||
b1 = incloadbp (p1, pflgs); /* get src */
|
||||
entad = (e1 + ((int32) b1 >> 1)) & AMASK;
|
||||
f1 = ((Read (entad, MM_OPND) >> ((b1 & 1)? 0: 18)) & RMASK);
|
||||
i = XT_GETCODE (f1);
|
||||
if (i & 2) xflgs =
|
||||
(i & 1)? xflgs | XT_MFLG: xflgs & ~XT_MFLG;
|
||||
switch (i) {
|
||||
case 00: case 02: case 03:
|
||||
if (xflgs & XT_SFLG) f1 = f1 & XT_BYMASK;
|
||||
else {
|
||||
f1 = Read (INCA (ea), MM_OPND);
|
||||
if (f1 == 0) break; }
|
||||
incstorebp (f1, p4, pflgs);
|
||||
break;
|
||||
case 01:
|
||||
ret = XT_NOSK; /* exit loop */
|
||||
break;
|
||||
case 04: case 06: case 07:
|
||||
xflgs = xflgs | XT_NFLG;
|
||||
f1 = f1 & XT_BYMASK;
|
||||
if ((xflgs & XT_SFLG) == 0) {
|
||||
f2 = Read (ADDA (ea, 2), MM_OPND);
|
||||
Write ((a10) AC(p3), AC(p4), MM_OPND);
|
||||
if (f2) incstorebp (f2, p4, pflgs);
|
||||
xflgs = xflgs | XT_SFLG; }
|
||||
incstorebp (f1, p4, pflgs);
|
||||
break;
|
||||
case 05:
|
||||
xflgs = xflgs | XT_NFLG;
|
||||
ret = XT_NOSK; /* exit loop */
|
||||
break; } /* end case xlate op */
|
||||
break;
|
||||
case ED_SIGST: /* start significance */
|
||||
if ((xflgs & XT_SFLG) == 0) {
|
||||
f2 = Read (ADDA (ea, 2), MM_OPND);
|
||||
Write ((a10) AC(p3), AC(p4), MM_OPND);
|
||||
if (f2) incstorebp (f2, p4, pflgs);
|
||||
xflgs = xflgs | XT_SFLG; }
|
||||
break;
|
||||
if ((xflgs & XT_SFLG) == 0) {
|
||||
f2 = Read (ADDA (ea, 2), MM_OPND);
|
||||
Write ((a10) AC(p3), AC(p4), MM_OPND);
|
||||
if (f2) incstorebp (f2, p4, pflgs);
|
||||
xflgs = xflgs | XT_SFLG; }
|
||||
break;
|
||||
case ED_FLDSEP: /* separate fields */
|
||||
xflgs = 0;
|
||||
break;
|
||||
xflgs = 0;
|
||||
break;
|
||||
case ED_EXCHMD: /* exchange */
|
||||
f2 = Read ((int32) (AC(p3) & AMASK), MM_OPND);
|
||||
Write ((int32) (AC(p3) & AMASK), AC(p4), MM_OPND);
|
||||
AC(p4) = f2;
|
||||
break;
|
||||
f2 = Read ((int32) (AC(p3) & AMASK), MM_OPND);
|
||||
Write ((int32) (AC(p3) & AMASK), AC(p4), MM_OPND);
|
||||
AC(p4) = f2;
|
||||
break;
|
||||
case (0100 + (ED_MESSAG >> ED_V_POPC)): /* message */
|
||||
if (xflgs & XT_SFLG)
|
||||
f1 = Read (ea + (pat & ED_M_NUM) + 1, MM_OPND);
|
||||
else { f1 = Read (ea + 1, MM_OPND);
|
||||
if (f1 == 0) break; }
|
||||
incstorebp (f1, p4, pflgs);
|
||||
break;
|
||||
if (xflgs & XT_SFLG)
|
||||
f1 = Read (ea + (pat & ED_M_NUM) + 1, MM_OPND);
|
||||
else {
|
||||
f1 = Read (ea + 1, MM_OPND);
|
||||
if (f1 == 0) break; }
|
||||
incstorebp (f1, p4, pflgs);
|
||||
break;
|
||||
case (0100 + (ED_SKPM >> ED_V_POPC)): /* skip on M */
|
||||
if (xflgs & XT_MFLG) ppi = (pat & ED_M_NUM) + 2;
|
||||
break;
|
||||
if (xflgs & XT_MFLG) ppi = (pat & ED_M_NUM) + 2;
|
||||
break;
|
||||
case (0100 + (ED_SKPN >> ED_V_POPC)): /* skip on N */
|
||||
if (xflgs & XT_NFLG) ppi = (pat & ED_M_NUM) + 2;
|
||||
break;
|
||||
if (xflgs & XT_NFLG) ppi = (pat & ED_M_NUM) + 2;
|
||||
break;
|
||||
case (0100 + (ED_SKPA >> ED_V_POPC)): /* skip always */
|
||||
ppi = (pat & ED_M_NUM) + 2;
|
||||
break;
|
||||
ppi = (pat & ED_M_NUM) + 2;
|
||||
break;
|
||||
default: /* NOP or undefined */
|
||||
break; } /* end case pttrn op */
|
||||
break; } /* end case pttrn op */
|
||||
AC(ac) = AC(ac) + ((ppi & ED_M_PBYN) << ED_V_PBYN);
|
||||
AC(ac) = AC(ac) + (ppi >> 2) + ((AC(ac) & ED_PBYNO)? 1: 0);
|
||||
AC(ac) = xflgs | (AC(ac) & ~(XT_MBZE | XFLGMASK)); }
|
||||
@@ -631,8 +635,8 @@ int32 p, reg;
|
||||
while (logv) {
|
||||
XT_REMRLOG (reg, logv); /* get next reg */
|
||||
if ((reg >= 0) && (reg < AC_NUM)) {
|
||||
p = GET_P (AC(reg)) + GET_S (AC(reg)); /* get p + s */
|
||||
AC(reg) = PUT_P (AC(reg), p); } /* p <- p + s */
|
||||
p = GET_P (AC(reg)) + GET_S (AC(reg)); /* get p + s */
|
||||
AC(reg) = PUT_P (AC(reg), p); } /* p <- p + s */
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user