HP2100 update from Dave Bryan

This commit is contained in:
Mark Pizzolato 2012-04-04 12:31:43 -07:00
parent a14a1ab5cd
commit 40deb20ccd
16 changed files with 1087 additions and 1022 deletions

View file

@ -2,7 +2,8 @@ Notes For V3.9
The makefile now works for all *nix platforms and with cygwin and MinGW32
on Windows.
on Windows. It will automatically detect the availability of libpcap
components and build network capable simulators if they are available.
1. New Features
@ -14,15 +15,32 @@ on Windows.
- added *nix READLINE support (Mark Pizzolato)
- added "SHOW SHOW" and "SHOW <dev> SHOW" commands (Mark Pizzolato)
- added support for BREAK key on Windows (Mark Pizzolato)
- added ethernet support (Mark Pizzolato)
windows host <-> simulator NIC sharing
native tap interfaces on BSD, Linux and OSX
vde (Virtual Distributed Ethernet) networking
Large Send Offload support
UDP and TCP Checksum offload support
dynamic libpcap loading on *nix platforms
1.1.2 PDP-8
- floating point processor is now enabled
1.1.3 IA64 VMS Ethernet Support
1.1.3 HP2100 (Dave Bryan)
- added support for 12821A HP-IB disk controller,
7906H/20H/25H disks
1.1.4 PDP11 and VAX (Mark Pizzolato)
- Added DELQA-Plus device.
1.1.5 IA64 VMS Ethernet Support
- Identified compiler version issues and added IA64 support (Matt Burke)
1.1.6 Visual Studio Projects (Mark Pizzolato)
2. Bugs Fixed

View file

@ -1,6 +1,6 @@
HP 2100 SIMULATOR BUG FIX WRITEUPS
==================================
Last update: 2012-03-23
Last update: 2012-03-25
1. PROBLEM: Booting from magnetic tape reports "HALT instruction, P: 77756
@ -6257,3 +6257,26 @@
16-bit dimension count.
STATUS: Fixed in version 3.9-0.
246. PROBLEM: SHOW MTC SHOW lists the FORMAT modifier twice.
VERSION: 3.8-1
OBSERVATION: Entering the planned SHOW MTC SHOW command results in the
following display:
sim> SHOW MTC SHOW
sh{ow} MTC FORMAT, SC, DEVNO
sh{ow} MTCn FORMAT
FORMAT is listed both as a device and as a unit modifier.
CAUSE: The FORMAT entry in the modifier table contains both the MTAB_VDV
and the MTAB_VUN flags.
RESOLUTION: Remove the redundant MTAB_VUN flag from the "mtc_mod" array
(hp2100_mt.c).
STATUS: Fixed in version 3.9-0.

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,4 @@
/* hp2100_di.h: HP 12821A HP-IB Disc Interface simulator common definitions
/* hp2100_di.h: HP 12821A HP-IB Disc Interface simulator definitions
Copyright (c) 2010-2012, J. David Bryan
@ -41,8 +41,8 @@
only the DA device is implemented. However, as the 12821A diagnostic
requires two cards to test I/O fully, a dummy DC device is provided by
the DA simulator. It is enabled only when the DA card is configured for
diagnostic mode. This dummy device may be removed when either the DC or
MA device is implemented.
diagnostic mode. This dummy device should be removed when either the DC
or MA device is implemented.
*/
@ -51,19 +51,21 @@
#define FIFO_SIZE 16 /* FIFO depth */
typedef enum { da, dc, ma, /* card IDs */
first_card = da, /* first card ID */
last_card = ma, /* last card ID */
card_count } CARD_ID; /* count of card IDs */
typedef enum {
da, dc, ma, /* card IDs */
first_card = da, /* first card ID */
last_card = ma, /* last card ID */
card_count /* count of card IDs */
} CARD_ID;
/* Device flags and accessors (leaves space for disc/tape flags) */
/* Device flags and accessors (bits 7-0 are reserved for disc/tape flags) */
#define DEV_V_BUSADR (DEV_V_UF + 8) /* bits 10-8: HP-IB address */
#define DEV_V_BUSADR (DEV_V_UF + 8) /* bits 10-8: interface HP-IB address */
#define DEV_V_DIAG (DEV_V_UF + 11) /* bit 11: diagnostic mode */
#define DEV_V_W1 (DEV_V_UF + 12) /* bit 12: DCPC pacing jumper */
#define DEV_M_BUSADR 7 /* bus address mask */
#define DEV_M_BUSADR 07 /* bus address mask */
#define DEV_BUSADR (DEV_M_BUSADR << DEV_V_BUSADR)
#define DEV_DIAG (1 << DEV_V_DIAG)
@ -73,11 +75,11 @@ typedef enum { da, dc, ma, /* card IDs */
#define SET_DIADR(f) (((f) & DEV_M_BUSADR) << DEV_V_BUSADR)
/* Unit flags and accessors (leaves space for disc/tape flags) */
/* Unit flags and accessors (bits 7-0 are reserved for disc/tape flags) */
#define UNIT_V_BUSADR (UNIT_V_UF + 8) /* bits 10-8: HP-IB address */
#define UNIT_V_BUSADR (UNIT_V_UF + 8) /* bits 10-8: unit HP-IB address */
#define UNIT_M_BUSADR 7 /* bus address mask */
#define UNIT_M_BUSADR 07 /* bus address mask */
#define UNIT_BUSADR (UNIT_M_BUSADR << UNIT_V_BUSADR)
@ -95,10 +97,10 @@ typedef enum { da, dc, ma, /* card IDs */
#define DEB_SERV (1 << 5) /* unit service scheduling calls */
/* HP-IB control state bit flags.
/* HP-IB control line state bit flags.
NOTE that these flags align with the corresponding flags in the DI status
register, so don't change the order!
register, so don't change the numerical values!
*/
#define BUS_ATN 0001 /* attention */
@ -128,7 +130,7 @@ typedef enum { da, dc, ma, /* card IDs */
#define BUS_UCG 0020 /* universal command group */
#define BUS_ACG 0000 /* addressed command group */
#define BUS_UNADDRESS 0037 /* unlisten and untalk */
#define BUS_UNADDRESS 0037 /* unlisten and untalk addresses */
#define PPR(a) (uint8) (1 << (7 - (a))) /* parallel poll response */
@ -146,8 +148,10 @@ typedef enum { da, dc, ma, /* card IDs */
#define SET_LOWER(b) (b)
#define SET_BOTH(b) (SET_UPPER (b) | SET_LOWER (b))
typedef enum { upper, /* byte selector */
lower } SELECTOR;
typedef enum {
upper, /* upper byte selected */
lower /* lower byte selected */
} SELECTOR;
/* Per-card state variables */
@ -170,9 +174,9 @@ typedef struct {
uint32 fifo_count; /* FIFO occupancy counter */
REG *fifo_reg; /* FIFO register pointer */
uint32 acceptors; /* unit bitmap of bus acceptors */
uint32 listeners; /* unit bitmap of bus listeners */
uint32 talker; /* unit bitmap of bus talker */
uint32 acceptors; /* unit bitmap of the bus acceptors */
uint32 listeners; /* unit bitmap of the bus listeners */
uint32 talker; /* unit bitmap of the bus talker */
uint8 bus_cntl; /* HP-IB bus control state (ATN, EOI, etc.) */
uint8 poll_response; /* address bitmap of parallel poll responses */
@ -183,7 +187,7 @@ typedef struct {
/* Disc interface VM global register definitions.
Include these definitions before any device-specific registers.
These definitions should be included before any device-specific registers.
Implementation notes:
@ -222,7 +226,7 @@ typedef struct {
/* Disc interface VM global modifier definitions.
Include these definitions before any device-specific modifiers.
These definitions should be included before any device-specific modifiers.
*/
#define DI_MODS(dev) \

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
SIMH/HP 21XX DIAGNOSTICS PERFORMANCE
====================================
Last update: 2012-02-20
Last update: 2012-03-30
The HP 24396 diagnostic suite has been run against the SIMH HP 21xx simulation.
@ -70,7 +70,7 @@ The results of the diagnostic runs are summarized below:
103116 12967 Synchronous Interface 1438 - No simulation
103017 12966 Asynchronous Data Set 1519 3.8-0 Passed
103121 12968 Asynchronous Comm. Interface 1602 - No simulation
103024 12821 ICD Disc Interface 1928 3.8-2 Passed
103024 12821 ICD Disc Interface 1928 3.9-0 Passed
104000 2600 Keyboard Display Terminal 1615 - No simulation
104003 Teleprinter 1509 3.2-3 Partial
@ -128,8 +128,9 @@ offline diagnostics:
Part Number Diagnostic Name Code Op. Sys. Code Vers. Result
----------- ------------------------------- ---- -------- ---- ----- ----------
12824-16002 Vector Instruction Set Firmware 2026 RTE-IVB 5010 3.8-0 Passed
91711-12032 ICD/MAC Disc Diagnostic 2201 RTE-IVB 5010 3.8-2 Partial
91711-12032 ICD/MAC Disc Diagnostic 2201 RTE-IVB 5010 3.9-0 Partial
92067-16013 Extended Memory Area Firmware 1805 RTE-IVB 5010 3.8-0 Passed
12829-16006 Vector Instruction Set Firmware 2226 RTE-6/VM 6200 3.8-0 Passed
92084-16423 Virtual Memory Area Firmware 2121 RTE-6/VM 6200 3.8-0 Passed
92835-16006 SIGNAL/1000 Firmware Diagnostic 2040 RTE-6/VM 6200 3.8-0 Passed
@ -3527,7 +3528,9 @@ BINARY FILE: 91711-12032 Rev. 2201
HOST SYSTEM: RTE-IVB Rev. 5010
CONFIGURATION: sim> set DS0 FORMAT
CONFIGURATION: sim> set DA1 7906H
sim> set DA1 FORMAT
sim> attach DA1 scratch.U1.7906H.disc
sim> go
TEST REPORT: DIAG : HP-IB DISC DIAGNOSTIC
@ -3540,12 +3543,12 @@ TEST REPORT: DIAG : HP-IB DISC DIAGNOSTIC
DIAG : Start trace at what step ? 0
DIAG : Trace operations which are not part of the test steps ? NO
DIAG : Stop after first failure ? NO
DIAG : Disc LU ? 41
DIAG : Disc address ? 0
DIAG : Disc LU ? 14
DIAG : Disc address ? 1
DIAG : Drive model number ? 06
DIAG : Do you want to run the interactive part of the test ? YES
DIAG : LU 41 address 0 select code 25 7906 drive
DIAG : LU 14 address 1 select code 12 7906 drive
DIAG : CHECK THAT ALL SWITCHES ARE SET CORRECTLY.
DIAG : THE RUN/STOP SWITCH SHOULD BE IN THE RUN POSITION.
@ -3569,7 +3572,7 @@ TEST REPORT: DIAG : HP-IB DISC DIAGNOSTIC
DIAG : STEP 1 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : REQUEST STATUS drive type 0 0 0 50 0
DIAG : REQUEST STATUS drive type 0 0 0 40 0
DIAG : IDENTIFY result 3 0 0 40 0
DIAG : STEP 3 PASSED
@ -3580,19 +3583,19 @@ TEST REPORT: DIAG : HP-IB DISC DIAGNOSTIC
DIAG : cylinders: 0 - 410 heads: 0 - 3 sectors: 0 - 47
DIAG : First and last tracks on LU:
DIAG : cylinder 0 head 0 (track 0)
DIAG : cylinder 199 head 1 (track 399)
DIAG : cylinder 49 head 1 (track 99)
DIAG : First and last spares on LU:
DIAG : cylinder 200 head 0 (track 400)
DIAG : cylinder 202 head 1 (track 405)
DIAG : cylinder 50 head 0
DIAG : cylinder 49 head 1 (track 99)
DIAG : Heads on LU (first - last): 0 - 1
DIAG : Searching entire LU for file directory:
DIAG : NO DIRECTORY OR UNABLE TO READ DIRECTORY ON TEST LU
DIAG : First and last tracks available for testing:
DIAG : cylinder 0 head 0 (track 0)
DIAG : cylinder 199 head 1 (track 399)
DIAG : cylinder 49 head 1 (track 99)
DIAG : Default test tracks:
DIAG : cylinder 199 head 0 (track 398)
DIAG : cylinder 199 head 1 (track 399)
DIAG : cylinder 49 head 0 (track 98)
DIAG : cylinder 49 head 1 (track 99)
DIAG : Use default test tracks ? YES
DIAG : Checking test track preambles.
@ -3601,11 +3604,11 @@ TEST REPORT: DIAG : HP-IB DISC DIAGNOSTIC
DIAG : Beginning part 2 of diagnostic.
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : STEP 4 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : REQUEST DISC ADDR cy 199 hd 0 sec 0 0 0 40 0
DIAG : REQUEST DISC ADDR cy 49 hd 0 sec 0 0 0 40 0
DIAG : STEP 5 PASSED
DIAG : operation parameters/results spd cs ds DSJ
@ -3614,8 +3617,8 @@ TEST REPORT: DIAG : HP-IB DISC DIAGNOSTIC
DIAG : STEP 6 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : REQUEST SECTOR ADDR sec 2 0 0 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : REQUEST SECTOR ADDR sec 6 0 0 40 0
DIAG : STEP 7 PASSED
DIAG : operation parameters/results spd cs ds DSJ
@ -3626,153 +3629,153 @@ TEST REPORT: DIAG : HP-IB DISC DIAGNOSTIC
DIAG : STEP 8 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : READ FULL SECTOR length 138 0 0 40 0
DIAG : decode preamble cy 199 hd 0 sec 0 spd 0
DIAG : decode preamble cy 49 hd 0 sec 0 spd 0
DIAG : STEP 9 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : WRITE FULL SECTOR length 138 0 0 40 0
DIAG : STEP 10 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : VERIFY sector count 1 0 0 40 0
DIAG : STEP 11 FAILED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : READ length 128 0 0 40 0
DIAG : STEP 12 FAILED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : READ WITH OFFSET length 128 offset 55 0 0 40 0
DIAG : STEP 13 FAILED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : READ WITHOUT VERIFY length 128 0 0 40 0
DIAG : STEP 14 FAILED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SET FILE MASK mask 0 0 0 40 0
DIAG : SEEK cy 199 hd 0 sec 47 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 47 0 37 40 0
DIAG : READ FULL SECTOR length 140 0 14 40 1
DIAG : STEP 16 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SET FILE MASK mask 2 0 0 40 0
DIAG : SEEK cy 199 hd 0 sec 47 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 47 0 37 40 0
DIAG : READ FULL SECTOR length 140 0 0 40 0
DIAG : STEP 17 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SET FILE MASK mask 2 0 0 40 0
DIAG : SEEK cy 199 hd 3 sec 47 0 37 40 0
DIAG : SEEK cy 49 hd 3 sec 47 0 37 40 0
DIAG : READ FULL SECTOR length 140 0 14 40 1
DIAG : STEP 18 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SET FILE MASK mask 3 0 0 40 0
DIAG : SEEK cy 199 hd 3 sec 47 0 37 40 0
DIAG : SEEK cy 49 hd 3 sec 47 0 37 40 0
DIAG : READ FULL SECTOR length 140 0 0 40 0
DIAG : REQUEST DISC ADDR cy 200 hd 0 sec 1 0 0 40 0
DIAG : REQUEST DISC ADDR cy 50 hd 0 sec 1 0 0 40 0
DIAG : STEP 19 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SET FILE MASK mask 11 0 0 40 0
DIAG : SEEK cy 199 hd 0 sec 47 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 47 0 37 40 0
DIAG : READ FULL SECTOR length 140 0 0 40 0
DIAG : REQUEST DISC ADDR cy 198 hd 0 sec 1 0 0 40 0
DIAG : REQUEST DISC ADDR cy 48 hd 0 sec 1 0 0 40 0
DIAG : STEP 20 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 199 hd 1 sec 0 0 0 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 49 hd 1 sec 0 0 0 40 0
DIAG : INITIALIZE length 6144 spd 1 1 0 40 0
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : READ FULL SECTOR length 3 0 0 40 0
DIAG : decode preamble cy 199 hd 0 sec 0 spd 0
DIAG : decode preamble cy 49 hd 0 sec 0 spd 0
DIAG : STEP 21 FAILED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 199 hd 0 sec 0 0 0 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 49 hd 0 sec 0 0 0 40 0
DIAG : INITIALIZE length 6144 spd 4 4 0 40 0
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : READ FULL SECTOR length 3 0 0 40 0
DIAG : decode preamble cy 199 hd 1 sec 0 spd 0
DIAG : decode preamble cy 49 hd 1 sec 0 spd 0
DIAG : STEP 22 FAILED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 199 hd 1 sec 0 0 0 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 49 hd 1 sec 0 0 0 40 0
DIAG : INITIALIZE length 6144 spd 2 2 0 40 0
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : READ FULL SECTOR length 3 0 0 40 0
DIAG : decode preamble cy 199 hd 1 sec 0 spd 0
DIAG : decode preamble cy 49 hd 1 sec 0 spd 0
DIAG : STEP 25 FAILED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 199 hd 0 sec 0 0 0 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 49 hd 0 sec 0 0 0 40 0
DIAG : INITIALIZE length 6144 spd 6 6 0 40 0
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : READ FULL SECTOR length 3 0 0 40 0
DIAG : decode preamble cy 199 hd 1 sec 0 spd 0
DIAG : decode preamble cy 49 hd 1 sec 0 spd 0
DIAG : STEP 26 FAILED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 199 hd 1 sec 0 0 0 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 49 hd 1 sec 0 0 0 40 0
DIAG : INITIALIZE length 6144 spd 3 3 0 40 0
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : READ FULL SECTOR length 3 0 0 40 0
DIAG : decode preamble cy 199 hd 1 sec 0 spd 0
DIAG : decode preamble cy 49 hd 1 sec 0 spd 0
DIAG : STEP 28 FAILED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 199 hd 0 sec 0 0 0 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 49 hd 0 sec 0 0 0 40 0
DIAG : INITIALIZE length 6144 spd 4 4 0 40 0
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : READ FULL SECTOR length 3 0 0 40 0
DIAG : decode preamble cy 199 hd 1 sec 0 spd 0
DIAG : decode preamble cy 49 hd 1 sec 0 spd 0
DIAG : STEP 30 FAILED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 199 hd 0 sec 0 0 0 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 49 hd 0 sec 0 0 0 40 0
DIAG : INITIALIZE length 6144 spd 0 0 0 40 0
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : READ FULL SECTOR length 3 0 0 40 0
DIAG : decode preamble cy 199 hd 0 sec 0 spd 0
DIAG : decode preamble cy 49 hd 0 sec 0 spd 0
DIAG : SET FILE MASK mask 0 0 0 40 0
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : READ length 128 0 0 40 0
DIAG : STEP 31 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 199 hd 1 sec 0 0 0 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 49 hd 1 sec 0 0 0 40 0
DIAG : INITIALIZE length 6144 spd 0 0 0 40 0
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : READ FULL SECTOR length 3 0 0 40 0
DIAG : decode preamble cy 199 hd 1 sec 0 spd 0
DIAG : decode preamble cy 49 hd 1 sec 0 spd 0
DIAG : SET FILE MASK mask 0 0 0 40 0
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : READ length 128 0 0 40 0
DIAG : STEP 32 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : WRITE length 128 0 0 40 0
DIAG : STEP 35 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : READ length 128 0 0 40 0
DIAG : test data read test passed
DIAG : STEP 36 PASSED
@ -3801,19 +3804,19 @@ TEST REPORT: DIAG : HP-IB DISC DIAGNOSTIC
DIAG : STEP 40 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : VERIFY sector count 1 0 0 40 0
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : VERIFY sector count 2 0 0 40 0
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : VERIFY sector count 4 0 0 40 0
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : VERIFY sector count 8 0 0 40 0
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : VERIFY sector count 16 0 0 40 0
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : VERIFY sector count 32 0 0 40 0
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : VERIFY sector count 48 0 0 40 0
DIAG : STEP 45 PASSED
@ -3854,38 +3857,38 @@ TEST REPORT: DIAG : HP-IB DISC DIAGNOSTIC
DIAG : STEP 50 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 198 hd 1 sec 0 0 0 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 48 hd 1 sec 0 0 0 40 0
DIAG : INITIALIZE length 6144 spd 0 0 0 40 0
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : READ FULL SECTOR length 3 0 0 40 0
DIAG : decode preamble cy 199 hd 1 sec 0 spd 0
DIAG : decode preamble cy 49 hd 1 sec 0 spd 0
DIAG : STEP 52 FAILED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 199 hd 0 sec 0 0 0 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 49 hd 0 sec 0 0 0 40 0
DIAG : INITIALIZE length 6144 spd 0 0 0 40 0
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : READ FULL SECTOR length 3 0 0 40 0
DIAG : decode preamble cy 199 hd 1 sec 0 spd 0
DIAG : decode preamble cy 49 hd 1 sec 0 spd 0
DIAG : STEP 54 FAILED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 199 hd 1 sec 0 0 0 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 49 hd 1 sec 0 0 0 40 0
DIAG : INITIALIZE length 6144 spd 0 0 0 40 0
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : READ FULL SECTOR length 3 0 0 40 0
DIAG : decode preamble cy 199 hd 1 sec 0 spd 0
DIAG : decode preamble cy 49 hd 1 sec 0 spd 0
DIAG : SET FILE MASK mask 0 0 0 40 0
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : READ length 128 0 0 40 0
DIAG : SEEK cy 199 hd 1 sec 5 0 37 40 0
DIAG : SEEK cy 49 hd 1 sec 5 0 37 40 0
DIAG : READ FULL SECTOR length 138 0 0 40 0
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : WRITE FULL SECTOR length 138 0 0 40 0
DIAG : SEEK cy 199 hd 1 sec 1 0 37 40 0
DIAG : SEEK cy 49 hd 1 sec 1 0 37 40 0
DIAG : READ length 128 0 0 40 0
DIAG : STEP 55 FAILED
@ -3912,7 +3915,7 @@ TEST REPORT: DIAG : HP-IB DISC DIAGNOSTIC
DIAG : STEP 60 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 4 sec 0 0 23 44 1
DIAG : SEEK cy 49 hd 4 sec 0 0 23 44 1
DIAG : SEEK cy 0 hd 0 sec 0 0 37 40 0
DIAG : STEP 72 PASSED
@ -3922,7 +3925,7 @@ TEST REPORT: DIAG : HP-IB DISC DIAGNOSTIC
DIAG : STEP 73 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 1 sec 49 0 23 44 1
DIAG : SEEK cy 49 hd 1 sec 49 0 23 44 1
DIAG : SEEK cy 0 hd 0 sec 0 0 37 40 0
DIAG : STEP 74 PASSED
@ -3948,12 +3951,12 @@ TEST REPORT: DIAG : HP-IB DISC DIAGNOSTIC
DIAG : STEP 81 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 199 hd 1 sec 0 0 0 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : ADDRESS RECORD cy 49 hd 1 sec 0 0 0 40 0
DIAG : INITIALIZE length 6144 spd 2 2 0 40 0
DIAG : SEEK cy 199 hd 1 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 40 0
DIAG : READ FULL SECTOR length 3 0 0 40 0
DIAG : decode preamble cy 199 hd 1 sec 0 spd 0
DIAG : decode preamble cy 49 hd 1 sec 0 spd 0
DIAG : STEP 82 FAILED
@ -3965,17 +3968,17 @@ TEST REPORT: DIAG : HP-IB DISC DIAGNOSTIC
DIAG : STEP 83 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 1 sec 0 0 37 0 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 0 0
DIAG : WRITE length 1 0 0 0 0
DIAG : STEP 84 FAILED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 1 sec 0 0 37 0 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 0 0
DIAG : WRITE FULL SECTOR length 1 0 23 0 1
DIAG : STEP 85 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 1 sec 0 0 37 0 0
DIAG : SEEK cy 49 hd 1 sec 0 0 37 0 0
DIAG : INITIALIZE length 1 spd 0 0 23 0 1
DIAG : STEP 86 PASSED
@ -3992,21 +3995,21 @@ TEST REPORT: DIAG : HP-IB DISC DIAGNOSTIC
DIAG : Type <space>,<return>
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 0 sec 0 0 37 140 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 140 0
DIAG : STEP 89 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 0 sec 0 0 37 140 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 140 0
DIAG : WRITE length 1 0 23 140 1
DIAG : STEP 90 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 0 sec 0 0 37 140 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 140 0
DIAG : WRITE FULL SECTOR length 1 0 23 140 1
DIAG : STEP 91 PASSED
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 0 sec 0 0 37 140 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 140 0
DIAG : INITIALIZE length 1 spd 0 0 23 140 1
DIAG : STEP 92 PASSED
@ -4015,7 +4018,7 @@ TEST REPORT: DIAG : HP-IB DISC DIAGNOSTIC
DIAG : Type <space>,<return>
DIAG : operation parameters/results spd cs ds DSJ
DIAG : SEEK cy 199 hd 0 sec 0 0 37 40 0
DIAG : SEEK cy 49 hd 0 sec 0 0 37 40 0
DIAG : STEP 97 PASSED
DIAG : Part 3 of diagnostic completed.

View file

@ -859,7 +859,7 @@ t_stat dpc_svc (UNIT *uptr)
int32 da, drv, err;
err = 0; /* assume no err */
drv = uptr - dpc_dev.units; /* get drive no */
drv = uptr - dpc_unit; /* get drive no */
if (uptr->flags & UNIT_UNLOAD) { /* drive down? */
dpc.command = CLEAR; /* clr cch cmd */
@ -1052,7 +1052,7 @@ return detach_unit (uptr); /* detach unit */
t_stat dpc_load_unload (UNIT *uptr, int32 value, char *cptr, void *desc)
{
uint32 drv;
int32 drv;
if ((uptr->flags & UNIT_ATT) == 0) return SCPE_UNATT; /* must be attached to load */
@ -1060,7 +1060,7 @@ if (value == UNIT_UNLOAD) /* unload heads? */
uptr->flags = uptr->flags | UNIT_UNLOAD; /* indicate unload */
else { /* load heads */
uptr->flags = uptr->flags & ~UNIT_UNLOAD; /* indicate load */
drv = uptr - dpc_dev.units; /* get drive no */
drv = uptr - dpc_unit; /* get drive no */
dpc_sta[drv] = dpc_sta[drv] | STA_ATN | STA_1ST; /* update status */
if (dpc_poll) /* polling enabled? */
dpcio (&dpc_dib, ioENF, 0); /* set flag */

View file

@ -678,7 +678,7 @@ t_stat dqc_svc (UNIT *uptr)
int32 da, drv, err;
err = 0; /* assume no err */
drv = uptr - dqc_dev.units; /* get drive no */
drv = uptr - dqc_unit; /* get drive no */
if (uptr->flags & UNIT_UNLOAD) { /* drive down? */
dqc.command = CLEAR; /* clr cch cmd */
dqcio (&dqc_dib, ioENF, 0); /* set cch flg */

View file

@ -26,7 +26,7 @@
DS 13037D/13175D disc controller/interface
02-Mar-12 JDB Rewritten to use the MAC/ICD disc controller library
29-Mar-12 JDB Rewritten to use the MAC/ICD disc controller library
ioIOO now notifies controller service of parameter output
14-Feb-12 JDB Corrected SRQ generation and FIFO under/overrun detection
Corrected Clear command to conform to the hardware
@ -60,15 +60,14 @@
The 13037D multiple-access (MAC) disc controller supports from one to eight
HP 7905 (15 MB), 7906 (20MB), 7920 (50 MB), and 7925 (120 MB) disc drives
accessed by one to eight CPUs. The controller hardware consists of a 16-bit
microprogrammed processor constructed from 74S181 bit slices and operating at
5 MHz, a device controller providing the interconnections to the drives and
CPU interfaces, and error correction circuitry that enables the controller to
correct up to a 32-bit error burst. 1024 words of 24-bit firmware are stored
in ROM.
microprogrammed processor constructed from 74S181 bit slices operating at 5
MHz, a device controller providing the interconnections to the drives and CPU
interfaces, and an error correction controller that enables the correction of
up to 32-bit error bursts. 1024 words of 24-bit firmware are stored in ROM.
The 13175D disc interface is used to connect the CPU to the 13037 device
controller. In a multiple-CPU system, one interface is strapped to reset the
controller when the CPU's front panel PRESET button is pressed.
The 13175D disc interface is used to connect the HP 1000 CPU to the 13037
device controller. In a multiple-CPU system, one interface is strapped to
reset the controller when the CPU's front panel PRESET button is pressed.
This module simulates a 13037D connected to a single 13175D interface. From
one to eight drives may be connected, and drive types may be freely
@ -134,7 +133,7 @@
#define FIFO_STOP (ds.fifo_count >= 5) /* FIFO stop filling test */
#define FIFO_FULL (ds.fifo_count == FIFO_SIZE) /* FIFO full test */
#define PRESET_ENABLE TRUE /* Preset Jumper (W4) enabled */
#define PRESET_ENABLE TRUE /* Preset Jumper (W4) is enabled */
/* Debug flags */
@ -223,7 +222,7 @@ static t_stat activate_unit (UNIT *uptr);
1. The validation routine does not allow the model number or autosizing
option to be changed when the unit is attached. Therefore, specifying
UNIT_ATT in the mask field has no deleterious effect.
UNIT_ATT in the mask field has no adverse effect.
2. The modifier DEVNO is deprecated in favor of SC but is retained for
compatibility.
@ -237,14 +236,14 @@ static DIB ds_dib = { &ds_io, DS };
#define UNIT_FLAGS (UNIT_FIX | UNIT_ATTABLE | UNIT_ROABLE | UNIT_DISABLE | UNIT_UNLOAD)
static UNIT ds_unit [] = {
{ UDATA (&ds_service_drive, UNIT_FLAGS | MODEL_7905, D7905_WORDS) }, /* unit 0 */
{ UDATA (&ds_service_drive, UNIT_FLAGS | MODEL_7905, D7905_WORDS) }, /* unit 1 */
{ UDATA (&ds_service_drive, UNIT_FLAGS | MODEL_7905, D7905_WORDS) }, /* unit 2 */
{ UDATA (&ds_service_drive, UNIT_FLAGS | MODEL_7905, D7905_WORDS) }, /* unit 3 */
{ UDATA (&ds_service_drive, UNIT_FLAGS | MODEL_7905, D7905_WORDS) }, /* unit 4 */
{ UDATA (&ds_service_drive, UNIT_FLAGS | MODEL_7905, D7905_WORDS) }, /* unit 5 */
{ UDATA (&ds_service_drive, UNIT_FLAGS | MODEL_7905, D7905_WORDS) }, /* unit 6 */
{ UDATA (&ds_service_drive, UNIT_FLAGS | MODEL_7905, D7905_WORDS) }, /* unit 7 */
{ UDATA (&ds_service_drive, UNIT_FLAGS | MODEL_7905, D7905_WORDS) }, /* drive unit 0 */
{ UDATA (&ds_service_drive, UNIT_FLAGS | MODEL_7905, D7905_WORDS) }, /* drive unit 1 */
{ UDATA (&ds_service_drive, UNIT_FLAGS | MODEL_7905, D7905_WORDS) }, /* drive unit 2 */
{ UDATA (&ds_service_drive, UNIT_FLAGS | MODEL_7905, D7905_WORDS) }, /* drive unit 3 */
{ UDATA (&ds_service_drive, UNIT_FLAGS | MODEL_7905, D7905_WORDS) }, /* drive unit 4 */
{ UDATA (&ds_service_drive, UNIT_FLAGS | MODEL_7905, D7905_WORDS) }, /* drive unit 5 */
{ UDATA (&ds_service_drive, UNIT_FLAGS | MODEL_7905, D7905_WORDS) }, /* drive unit 6 */
{ UDATA (&ds_service_drive, UNIT_FLAGS | MODEL_7905, D7905_WORDS) }, /* drive unit 7 */
{ UDATA (&ds_service_controller, UNIT_DIS, 0) }, /* controller unit */
{ UDATA (&ds_service_timer, UNIT_DIS, 0) } /* timer unit */
};
@ -252,8 +251,8 @@ static UNIT ds_unit [] = {
static REG ds_reg [] = {
{ FLDATA (CMFOL, ds.cmfol, 0) },
{ FLDATA (CMRDY, ds.cmrdy, 0) },
{ BRDATA (FIFO, ds.fifo, 8, 16, FIFO_SIZE), REG_CIRC },
{ DRDATA (FCNT, ds.fifo_count, 5) },
{ BRDATA (FIFO, ds.fifo, 8, 16, FIFO_SIZE), REG_CIRC },
{ ORDATA (FREG, ds.fifo_reg, 32), REG_HRO },
{ ORDATA (CNTYPE, mac_cntlr.type, 2), REG_HRO },
@ -375,13 +374,13 @@ DEVICE ds_dev = {
The control path consists of the usual control, flag buffer, flag, and SRQ
flip-flops, although flag and SRQ are decoupled to allow the full DCPC
transfer rate through the FIFO (driving SRQ from the flag limits transfers to
only every other cycle). SRQ is based on the FIFO level: if data or room in
the FIFO is available, SRQ is set to transfer it. The flag is only used to
signal an interrupt at the end of a command.
every other cycle). SRQ is based on the FIFO level: if data or room in the
FIFO is available, SRQ is set to initiate a transfer. The flag is only used
to signal an interrupt at the end of a command.
One unusual aspect is that SFC and SFS test different things, rather than
complementary states of the same thing. SFC tests the busy flip-flop, and
SFS tests the flag flip-flop.
complementary states of the same thing. SFC tests the controller busy state,
and SFS tests the flag flip-flop.
In addition, the card contains end-of-data-transfer, command-follows, and
command-ready flip-flops. EDT is set when the DCPC EDT signal is asserted
@ -397,16 +396,16 @@ DEVICE ds_dev = {
1. In hardware, SRQ is enabled only when the controller is reading or
writing the disc (IFIN or IFOUT functions are asserted) and set when the
FIFO is not empty (read) or not full (write). In simulation, SRQ is set
by the unit service read/write data phase transfers and cleared below
when the FIFO is empty (read) or full (write).
by the unit service read/write data phase transfers and cleared in the
IOI and IOO signal handlers when the FIFO is empty (read) or full
(write).
2. The DCPC EDT signal cannot set the controller's end-of-data flag directly
because a write EOD must occur only after the FIFO has been drained.
3. Polling the interface or drives must be deferred to the end of the I/O
signal service. If they are performed in the IOO/STC handlers
themselves, an associated CLF might clear the flag that was set by the
poll.
3. Polling the interface or drives must be deferred to the end of I/O signal
handling. If they are performed in the IOO/STC handlers themselves, an
associated CLF might clear the flag that was set by the poll.
4. Executing a CLC sets the controller's end-of-data flag, which will abort
a read or write data transfer in progress. Parameter transfers are not
@ -417,7 +416,7 @@ DEVICE ds_dev = {
5. The hardware Interface Function and Flag Buses are not implemented
explicitly. Instead, interface functions and signals are inferred by the
interface by the current command operation and phase.
interface from the current command operation and phase.
*/
uint32 ds_io (DIB *dibptr, IOCYCLE signal_set, uint32 stat_data)
@ -512,7 +511,7 @@ while (working_set) {
if (ds.srq == SET && DEBUG_PRI (ds_dev, DEB_CMDS))
fprintf (sim_deb, ">>DS cmds: [OTx%s] SRQ cleared\n", hold_or_clear);
ds.srq = CLEAR; /* clear SRQ */
ds.srq = CLEAR; /* clear SRQ to stop filling */
}
}
break;
@ -622,7 +621,7 @@ return stat_data;
overrun error.
Write transfers set the initial SRQ to request words from the CPU. As each
arrives, it is unloaded from the FIFO into the sector buffer, and SRQ is
word arrives, it is unloaded from the FIFO into the sector buffer, and SRQ is
enabled. If the current sector transfer is complete, the controller is moved
to the end phase. If the FIFO underflows, the write terminates with a data
overrun error.
@ -639,12 +638,12 @@ return stat_data;
Implementation notes:
1. Every command except Seek, Recalibrate, and End set the flag when the
1. Every command except Seek, Recalibrate, and End sets the flag when the
command completes. A command completes when the controller is no longer
busy (it becomes idle for Seek, Recalibrate, and End, and becomes waiting
for all others). Seek and Recalibrate may generate errors (e.g., heads
unloaded), in which case the flag must be set. But in these cases, the
controller state is waiting, not idle.
busy (it becomes idle for Seek, Recalibrate, and End, or it becomes
waiting for all others). Seek and Recalibrate may generate errors (e.g.,
heads unloaded), in which case the flag must be set. But in these cases,
the controller state is waiting, not idle.
However, it is insufficient simply to check that the controller has moved
to the wait state, because a seek may complete while the controller is
@ -653,8 +652,9 @@ return stat_data;
completes, another command is issued that attempts to access unit 1,
which is not ready. The command fails with a Status-2 error, and the
controller moves to the wait state. When the seek completes, the
controller is waiting with error status. We must determine if the seek
completed successfully or not, as we must interrupt in the latter case.
controller is waiting with error status. We must determine whether the
seek completed successfully or not, as we must interrupt in the latter
case.
Therefore, we determine seek completion by checking if the Attention
status was set. Attention sets only if the seek completes successfully.
@ -663,31 +663,31 @@ return stat_data;
command terminated before the seek ever started. Also, a seek may
complete while the controller is busy, waiting, or idle.)
2. For debug printouts, we want to print the name of the command that has
completed when the controller returns to the idle or wait state.
Normally, we would use the controller's "opcode" field to identify the
command that completed. However, while waiting for Seek or Recalibrate
completion, "opcode" may be set to another command if that command does
not access this drive. For example, it might be set to a Read of
another unit, or a Request Status for this unit. So we can't rely on
"opcode" to report the correct positioning command completion.
2. For debug printouts, we want to print the name of the command that has
completed when the controller returns to the idle or wait state.
Normally, we would use the controller's "opcode" field to identify the
command that completed. However, while waiting for Seek or Recalibrate
completion, "opcode" may be set to another command if that command does
not access this drive. For example, it might be set to a Read of another
unit, or a Request Status for this unit. So we can't rely on "opcode" to
report the correct name of the completed positioning command.
However, we cannot rely on "uptr->OP" either, as it can be changed
during the course of a command. For example, Read Without Verify is
changed to Read after a track crossing.
However, we cannot rely on "uptr->OP" either, as that can be changed
during the course of a command. For example, Read Without Verify is
changed to Read after a track crossing.
Instead, we have to determine whether a seek is completing. If it is,
then we report "uptr->OP"; otherwise, we report "opcode".
Instead, we have to determine whether a seek is completing. If it is,
then we report "uptr->OP"; otherwise, we report "opcode".
3. The initial write SRQ must set only at the transition from the start
phase to the data phase. If a write command begins with an auto-seek,
the drive service will be entered twice in the start phase (the first
entry performs the seek, and the second begins the write). In hardware,
SRQ does not assert until the write begins.
3. The initial write SRQ must set only at the transition from the start
phase to the data phase. If a write command begins with an auto-seek,
the drive service will be entered twice in the start phase (the first
entry performs the seek, and the second begins the write). In hardware,
SRQ does not assert until the write begins.
4. The DCPC EDT signal cannot set the controller's end-of-data flag
directly because a write EOD must only occur after the FIFO has been
drained.
4. The DCPC EDT signal cannot set the controller's end-of-data flag
directly because a write EOD must only occur after the FIFO has been
drained.
*/
t_stat ds_service_drive (UNIT *uptr)
@ -695,9 +695,10 @@ t_stat ds_service_drive (UNIT *uptr)
static const char completion_message [] = ">>DS rwsc: Unit %d %s command completed\n";
t_stat result;
t_bool seek_completion;
FLIP_FLOP entry_srq = ds.srq; /* SRQ state on entry */
CNTLR_PHASE entry_phase = (CNTLR_PHASE) uptr->PHASE; /* operation phase on entry */
uint32 entry_status = uptr->STAT; /* drive status on entry */
int32 unit;
FLIP_FLOP entry_srq = ds.srq; /* get the SRQ state on entry */
CNTLR_PHASE entry_phase = (CNTLR_PHASE) uptr->PHASE; /* get the operation phase on entry */
uint32 entry_status = uptr->STAT; /* get the drive status on entry */
result = dl_service_drive (&mac_cntlr, uptr); /* service the drive */
@ -764,7 +765,7 @@ if ((CNTLR_PHASE) uptr->PHASE == data_phase) /* is the drive in the d
break;
default: /* entered with an invalid state */
default: /* we were entered with an invalid state */
result = SCPE_IERR; /* return an internal (programming) error */
break;
} /* end of data phase operation dispatch */
@ -774,13 +775,13 @@ if (DEBUG_PRI (ds_dev, DEB_CMDS) && entry_srq != ds.srq)
fprintf (sim_deb, ">>DS cmds: SRQ %s\n", ds.srq == SET ? "set" : "cleared");
if (uptr->wait) /* is service requested? */
if (uptr->wait) /* was service requested? */
activate_unit (uptr); /* schedule the next event */
seek_completion = ~entry_status & uptr->STAT & DL_S2ATN; /* seek is complete when Attention sets */
if (mac_cntlr.state != cntlr_busy) { /* is the command complete? */
if (mac_cntlr.state == cntlr_wait && !seek_completion) /* is it command and not seek completion? */
if (mac_cntlr.state == cntlr_wait && !seek_completion) /* is it command but not seek completion? */
ds_io (&ds_dib, ioENF, 0); /* set the data flag to interrupt the CPU */
poll_interface (); /* poll the interface for the next command */
@ -788,22 +789,22 @@ if (mac_cntlr.state != cntlr_busy) { /* is the command co
}
if (DEBUG_PRI (ds_dev, DEB_RWSC))
if (DEBUG_PRI (ds_dev, DEB_RWSC)) {
unit = uptr - ds_unit; /* get the unit number */
if (result == SCPE_IERR) /* did an internal error occur? */
fprintf (sim_deb, ">>DS rwsc: Unit %d %s command %s phase service not handled\n",
uptr - ds_dev.units,
dl_opcode_name (MAC, (CNTLR_OPCODE) uptr->OP),
unit, dl_opcode_name (MAC, (CNTLR_OPCODE) uptr->OP),
dl_phase_name ((CNTLR_PHASE) uptr->PHASE));
else if (seek_completion) /* if a seek has completed */
fprintf (sim_deb, completion_message, /* report the unit command */
uptr - ds_dev.units,
dl_opcode_name (MAC, (CNTLR_OPCODE) uptr->OP));
unit, dl_opcode_name (MAC, (CNTLR_OPCODE) uptr->OP));
else if (mac_cntlr.state == cntlr_wait) /* if the controller has stopped */
fprintf (sim_deb, completion_message, /* report the controller command */
uptr - ds_dev.units,
dl_opcode_name (MAC, mac_cntlr.opcode));
unit, dl_opcode_name (MAC, mac_cntlr.opcode));
}
return result; /* return the result of the service */
}
@ -862,11 +863,11 @@ switch ((CNTLR_PHASE) uptr->PHASE) { /* dispatch the current
case clear:
case set_file_mask:
case wakeup:
ds_io (&ds_dib, ioENF, 0); /* complete the operation with the flag set */
ds_io (&ds_dib, ioENF, 0); /* complete the operation and set the flag */
break;
default: /* entered with an invalid state */
default: /* we were entered with an invalid state */
result = SCPE_IERR; /* return an internal (programming) error */
break;
} /* end of operation dispatch */
@ -917,7 +918,7 @@ switch ((CNTLR_PHASE) uptr->PHASE) { /* dispatch the current
break;
default: /* entered with an invalid state */
default: /* we were entered with an invalid state */
result = SCPE_IERR; /* return an internal (programming) error */
break;
} /* end of operation dispatch */
@ -976,7 +977,7 @@ return result; /* return the result of
1. During a power-on reset, a pointer to the FIFO simulation register is
saved to allow access to the "qptr" field during FIFO loading and
unloading. This enables the SCP to view the FIFO as a circular queue, so
unloading. This enables SCP to view the FIFO as a circular queue, so
that the bottom word of the FIFO is always displayed as FIFO[0],
regardless of where it is in the actual FIFO array.
@ -992,7 +993,7 @@ if (sim_switches & SWMASK ('P')) { /* is this a power-on re
ds.fifo_reg = find_reg ("FIFO", NULL, dptr); /* find the FIFO register entry */
if (ds.fifo_reg == NULL) /* if it cannot be found, */
return SCPE_IERR; /* report a programming error! */
return SCPE_IERR; /* report a programming error */
else { /* found it */
ds.fifo_reg->qptr = 0; /* so reset the FIFO bottom index */
@ -1064,7 +1065,7 @@ return result;
/* Boot a MAC disc drive.
The MAC disc bootstrap program is loaded from the HP 12992B Boot Loader ROM
into memory, the I/O instructions are configured from the interface card
into memory, the I/O instructions are configured for the interface card's
select code, and the program is run to boot from the specified unit. The
loader supports booting from cylinder 0 of drive unit 0 only. Before
execution, the S register is automatically set as follows:
@ -1166,7 +1167,7 @@ if (unitno != 0) /* boot supported on
return SCPE_NOFNC; /* report "Command not allowed" if attempted */
if (ibl_copy (ds_rom, ds_dib.select_code)) /* copy the boot ROM to memory and configure */
return SCPE_IERR; /* return an internal error if failed */
return SCPE_IERR; /* return an internal error if the copy failed */
SR = SR & (IBL_OPT | IBL_DS_HEAD) /* set S to a reasonable value */
| IBL_DS | IBL_MAN | (ds_dib.select_code << IBL_V_DEV); /* before boot execution */
@ -1193,7 +1194,7 @@ return SCPE_OK;
t_stat ds_load_unload (UNIT *uptr, int32 value, char *cptr, void *desc)
{
const t_bool load = (value != UNIT_UNLOAD); /* true if heads are loading */
const t_bool load = (value != UNIT_UNLOAD); /* true if the heads are loading */
return dl_load_unload (&mac_cntlr, uptr, load); /* load or unload the heads */
}
@ -1265,7 +1266,7 @@ if (uptr) { /* did the command start
time = uptr->wait; /* save the activation time */
if (time) /* was the unit scheduled? */
activate_unit (uptr); /* activate it (clears "wait") */
activate_unit (uptr); /* activate it (and clear the "wait" field) */
if (DEBUG_PRI (ds_dev, DEB_RWSC)) {
unit = uptr - ds_unit; /* get the unit number */
@ -1337,8 +1338,8 @@ return;
void poll_drives (void)
{
if (mac_cntlr.state == cntlr_idle && ds.control == SET) /* controller is idle and OK to interrupt? */
if (dl_poll_drives (&mac_cntlr, ds_unit, DL_MAXDRIVE)) /* poll drives; was Attention seen? */
if (mac_cntlr.state == cntlr_idle && ds.control == SET) /* is the controller idle and interrupts are allowed? */
if (dl_poll_drives (&mac_cntlr, ds_unit, DL_MAXDRIVE)) /* poll the drives; was Attention seen? */
ds_io (&ds_dib, ioENF, 0); /* request an interrupt */
return;
}
@ -1455,7 +1456,7 @@ return;
static t_stat activate_unit (UNIT *uptr)
{
uint32 unit;
int32 unit;
t_stat result;
if (DEBUG_PRI (ds_dev, DEB_SERV)) {

View file

@ -1658,7 +1658,7 @@ return SCPE_OK;
t_stat mpx_line_svc (UNIT *uptr)
{
const uint32 port = uptr - mpx_unit; /* port number */
const int32 port = uptr - mpx_unit; /* port number */
const uint16 rt = mpx_rcvtype [port]; /* receive type for port */
const uint32 data_bits = 5 + GET_BPC (mpx_config [port]); /* number of data bits */
const uint32 data_mask = (1 << data_bits) - 1; /* mask for data bits */

View file

@ -690,7 +690,7 @@ int32 unum;
t_mtrlnt tbc;
t_stat st, r = SCPE_OK;
unum = uptr - msc_dev.units; /* get unit number */
unum = uptr - msc_unit; /* get unit number */
if ((uptr->FNC != FNC_RWS) && (uptr->flags & UNIT_OFFLINE)) { /* offline? */
msc_sta = (msc_sta | STA_REJ) & ~STA_BUSY; /* reject */
@ -905,7 +905,7 @@ else
t_stat ms_map_err (UNIT *uptr, t_stat st)
{
int32 unum = uptr - msc_dev.units; /* get unit number */
int32 unum = uptr - msc_unit; /* get unit number */
if (DEBUG_PRI (msc_dev, DEB_RWS))
fprintf (sim_deb,

View file

@ -25,6 +25,7 @@
MT 12559A 3030 nine track magnetic tape
25-Mar-12 JDB Removed redundant MTAB_VUN from "format" MTAB entry
10-Feb-12 JDB Deprecated DEVNO in favor of SC
28-Mar-11 JDB Tidied up signal handling
29-Oct-10 JDB Fixed command scanning error in mtcio ioIOO handler
@ -220,7 +221,7 @@ REG mtc_reg[] = {
MTAB mtc_mod[] = {
{ MTUF_WLK, 0, "write enabled", "WRITEENABLED", NULL },
{ MTUF_WLK, MTUF_WLK, "write locked", "LOCKED", NULL },
{ MTAB_XTD | MTAB_VDV | MTAB_VUN, 0, "FORMAT", "FORMAT",
{ MTAB_XTD | MTAB_VDV, 0, "FORMAT", "FORMAT",
&sim_tape_set_fmt, &sim_tape_show_fmt, NULL },
{ MTAB_XTD | MTAB_VDV, 1, "SC", "SC", &hp_setsc, &hp_showsc, &mtd_dev },
{ MTAB_XTD | MTAB_VDV | MTAB_NMO, 1, "DEVNO", "DEVNO", &hp_setdev, &hp_showdev, &mtd_dev },

View file

@ -985,7 +985,7 @@ return SCPE_OK;
t_stat tty_set_opt (UNIT *uptr, int32 val, char *cptr, void *desc)
{
int32 u = uptr - tty_dev.units;
int32 u = uptr - tty_unit;
if (u > TTO) return SCPE_NOFNC;
if ((u == TTI) && (val == TT_MODE_7P))
@ -997,7 +997,7 @@ return SCPE_OK;
t_stat tty_set_alf (UNIT *uptr, int32 val, char *cptr, void *desc)
{
int32 u = uptr - tty_dev.units;
int32 u = uptr - tty_unit;
if (u != TTI) return SCPE_NOFNC;
return SCPE_OK;

File diff suppressed because it is too large Load diff

View file

@ -24,7 +24,7 @@
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from the authors.
19-Mar-12 JDB First release
30-Mar-12 JDB First release
09-Nov-11 JDB Created disc controller common library from DS simulator
@ -66,7 +66,7 @@
#define CYL u3 /* current drive cylinder */
#define STAT u4 /* current drive status (Status 2) */
#define OP u5 /* current drive operation in process */
#define PHASE u6 /* current command phase */
#define PHASE u6 /* current drive operation phase */
/* Unit flags and accessors */
@ -78,7 +78,7 @@
#define UNIT_V_AUTO (UNIT_V_UF + 5) /* bits 5-5: autosize */
#define DL_V_UF (UNIT_V_UF + 6) /* first free unit flag bit */
#define UNIT_M_MODEL 3 /* model ID mask */
#define UNIT_M_MODEL 03 /* model ID mask */
#define UNIT_MODEL (UNIT_M_MODEL << UNIT_V_MODEL)
#define UNIT_WLK (1 << UNIT_V_WLK)
@ -96,9 +96,9 @@
#define DL_V_S1SPD 13 /* bits 15-13: S/P/D flags */
#define DL_V_S1STAT 8 /* bits 12- 8: controller status */
#define DL_V_S1UNIT 0 /* bits 7- 0: last unit number */
#define DL_V_S1UNIT 0 /* bits 3- 0: last unit number */
#define DL_M_S1UNIT 15 /* unit mask */
#define DL_M_S1UNIT 017 /* unit number mask */
#define GET_S1UNIT(v) (((v) >> DL_V_S1UNIT) & DL_M_S1UNIT)
@ -107,7 +107,7 @@
#define SET_S1UNIT(v) ((v) << DL_V_S1UNIT)
/* Status-2 accessors (+ = kept in unit status, - = determined dynamically */
/* Status-2 accessors (+ = kept in unit status, - = determined dynamically) */
#define DL_V_S2ERR 15 /* bits 15-15: (-) any error flag */
#define DL_V_S2DTYP 9 /* bits 12- 9: (-) drive type */
@ -116,7 +116,7 @@
#define DL_V_S2FMT 5 /* bits 5- 5: (-) format enabled flag */
#define DL_V_S2FAULT 4 /* bits 4- 4: (+) drive fault flag */
#define DL_V_S2FS 3 /* bits 3- 3: (+) first status flag */
#define DL_V_S2SC 2 /* bits 2- 2: (+) seek error flag */
#define DL_V_S2SC 2 /* bits 2- 2: (+) seek check flag */
#define DL_V_S2NR 1 /* bits 1- 1: (-) not ready flag */
#define DL_V_S2BUSY 0 /* bits 0- 1: (-) drive busy flag */
@ -195,8 +195,9 @@
typedef enum {
MAC = 0,
ICD, last_type = ICD, /* last valid type */
TYPE_COUNT /* count of controller types */
ICD,
last_type = ICD, /* last valid type */
type_count /* count of controller types */
} CNTLR_TYPE;
@ -224,7 +225,8 @@ typedef enum {
load_tio_register = 023,
request_disc_address = 024,
end = 025,
wakeup = 026, last_opcode = wakeup /* last valid opcode */
wakeup = 026,
last_opcode = wakeup /* last valid opcode */
} CNTLR_OPCODE;
#define DL_OPCODE_MASK 037
@ -235,7 +237,8 @@ typedef enum {
typedef enum {
start_phase = 0,
data_phase,
end_phase, last_phase = end_phase /* last valid phase */
end_phase,
last_phase = end_phase /* last valid phase */
} CNTLR_PHASE;
@ -324,22 +327,22 @@ typedef struct {
uint32 verify_count; /* count of sectors to verify */
uint32 poll_unit; /* last unit polled for attention */
uint16 *buffer; /* data buffer pointer */
uint32 index; /* data buffer index */
uint32 length; /* data buffer length */
UNIT *aux; /* auxiliary units (controller and timer) */
int32 seek_time; /* seek delay time (per cylinder) */
uint32 index; /* data buffer current index */
uint32 length; /* data buffer valid length */
UNIT *aux; /* MAC auxiliary units (controller and timer) */
int32 seek_time; /* per-cylinder seek delay time */
int32 sector_time; /* intersector delay time */
int32 cmd_time; /* command start delay time */
int32 data_time; /* data transfer delay time */
int32 wait_time; /* command wait timeout */
int32 cmd_time; /* command response time */
int32 data_time; /* data transfer response time */
int32 wait_time; /* command wait time */
} CNTLR_VARS;
typedef CNTLR_VARS *CVPTR; /* pointer to controller state variables */
/* Controller state variables initialiation.
/* Controller state variables initialization.
Parameters are:
The parameters are:
ctype - type of the controller (CNTLR_TYPE)
bufptr - pointer to the data buffer

Binary file not shown.