diff --git a/HP2100/hp2100_bugfixes.txt b/HP2100/hp2100_bugfixes.txt index da1e22a1..57ef7392 100644 --- a/HP2100/hp2100_bugfixes.txt +++ b/HP2100/hp2100_bugfixes.txt @@ -1,6 +1,6 @@ HP 2100 SIMULATOR BUG FIX WRITEUPS ================================== - Last update: 2012-03-17 + Last update: 2012-03-20 1. PROBLEM: Booting from magnetic tape reports "HALT instruction, P: 77756 @@ -4386,10 +4386,11 @@ CAUSE: The "exdep_cmd" routine is calling "find_reg_glob" if the "find_reg" routine returns a not-found error for the selected device. - "find_reg_glob" searches for a unique name among all devices and returns - it if found. + "find_reg_glob" searches for a unique name among all devices and returns it + if found. - RESOLUTION: None. + RESOLUTION: Modify "exdep_cmd" (scp.c) to search for a global register + name only if the device was not explicitly specified. STATUS: Fixed in version 3.8-0. @@ -5701,7 +5702,8 @@ -227. PROBLEM: The 79xx disc returns incorrect status for a disabled drive. +227. PROBLEM: The 13037 disc controller returns incorrect status for a disabled + drive. VERSION: 3.8-1 @@ -5711,9 +5713,9 @@ CAUSE: SIMH initially defines the DS device as having eight 7905 drives connected to the controller. Each drive reports "heads unloaded" status - (status-2 bits 1-0 = 11) until it has a disc image attached. If a unit is + (Status-2 bits 1-0 = 11) until it has a disc image attached. If a unit is disabled, it continues to report "heads unloaded" status. It should be - reporting "unit not present" (status-2 bits 1-0 = 10) status. + reporting "unit not present" (Status-2 bits 1-0 = 10) status. RESOLUTION: Modify "ds_updds2" (hp2100_ds.c) to report an "enabled and unloaded" condition as Not Ready and Busy, and a "disabled" condition as @@ -5723,8 +5725,8 @@ -228. PROBLEM: The 79xx disc returns incorrect status for an auto-seek beyond - the drive limits. +228. PROBLEM: The 13037 disc controller returns incorrect status for an + auto-seek beyond the drive limits. VERSION: 3.8-1 @@ -5771,8 +5773,8 @@ -229. PROBLEM: The Read Without Verify command does not verify the address when a - track boundary is crossed. +229. PROBLEM: The 13037 Read Without Verify command does not verify the address + when a track boundary is crossed. VERSION: 3.8-1 @@ -5832,7 +5834,7 @@ -230. PROBLEM: The Request Sector Address command does not check the unit +230. PROBLEM: The 13037 Request Sector Address command does not check the unit number. VERSION: 3.8-1 @@ -5888,7 +5890,7 @@ -231. PROBLEM: The Wakeup command does not check the unit number. +231. PROBLEM: The 13037 Wakeup command does not check the unit number. VERSION: 3.8-1 @@ -6001,7 +6003,7 @@ or SHOW lists but can still be displayed or modified if requested explicitly. Add hp_setsc and hp_showsc functions (hp2100_sys.c) to set and show the select code, and modify hp_setdev and hp_showdev to call hp_setsc - and hp_showsc, respectively, and to work aroung newline suppression for + and hp_showsc, respectively, and to work around newline suppression for MTAB_NMO entries. Modify the documentation to change device number references to select code references. @@ -6171,44 +6173,7 @@ -242. PROBLEM: The DO -E command continues to execute commands after a VM error. - - VERSION: 3.8-1 - - OBSERVATION: According to the manual, when invoking a DO command file and - specifying the -E switch, "command processing (including nested command - invocations) will be aborted if any error is encountered." Errors that - occur as a result of commands, e.g., an invalid unit name supplied to the - ATTACH command, correctly terminate the DO command. However, errors that - occur when running the simulated CPU (e.g., a host I/O error) do not; the - error is printed on the console, but the command file continues to execute. - - CAUSE: When the -E switch is specified, the DO command processor checks - the return status from each command invoked and aborts execution of the - command file if the return is not SCPE_OK. When a RUN, GO, STEP, CONT, or - BOOT command is invoked, the run command processor calls the VM-provided - instruction execution function to start the simulation. - - When simulation is stopped, the instruction executor returns a status code - to indicate why execution has stopped. The reason might be a VM-defined - condition (e.g., execution of a "halt" instruction) or a system condition - (e.g., a host file system I/O error). The run command processor uses this - code to print an error message, but then returns SCPE_OK to the caller. As - the DO command processor never sees the error message, it continues to - execute commands. - - RESOLUTION: Modify "run_cmd" (scp.c) to return the correct status instead - of SCPE_OK. Consolidate the error printing code from "run_cmd", "main", - and "do_cmd" into a new "fprint_error" function that combines both VM stop - and command error messages. Modify the error checkers in "main" and - "do_cmd" to call "fprint_error" to avoid printing messages from "run_cmd" - twice. - - STATUS: Fixed in version 3.9-0. - - - -243. ENHANCEMENT: Modify the 13037 disc simulator to use the common disc +242. ENHANCEMENT: Modify the 13037 disc simulator to use the common disc controller library. VERSION: 3.8-1 @@ -6225,7 +6190,7 @@ -244. ENHANCEMENT: Add debug printout support to the 13037 disc simulator. +243. ENHANCEMENT: Add debug printout support to the 13037 disc simulator. VERSION: 3.8-1 @@ -6238,7 +6203,7 @@ -245. ENHANCEMENT: Eliminate the poll for parameters to 13037 disc commands. +244. ENHANCEMENT: Eliminate the poll for parameters to 13037 disc commands. VERSION: 3.8-1 diff --git a/HP2100/hp2100_cpu5.c b/HP2100/hp2100_cpu5.c index 6285ef10..a680f864 100644 --- a/HP2100/hp2100_cpu5.c +++ b/HP2100/hp2100_cpu5.c @@ -1,7 +1,7 @@ /* hp2100_cpu5.c: HP 1000 RTE-6/VM VMA and RTE-IV EMA instructions Copyright (c) 2007-2008, Holger Veit - Copyright (c) 2006-2011, J. David Bryan + Copyright (c) 2006-2012, J. David Bryan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -26,6 +26,7 @@ CPU5 RTE-6/VM and RTE-IV firmware option instructions + 20-Mar-12 JDB Added sign extension for dim count in "cpu_ema_resolve" 28-Dec-11 JDB Eliminated unused variable in "cpu_ema_vset" 11-Sep-08 JDB Moved microcode function prototypes to hp2100_cpu1.h 05-Sep-08 JDB Removed option-present tests (now in UIG dispatchers) @@ -815,7 +816,7 @@ static t_bool cpu_ema_resolve(uint32 dtbl,uint32 atbl,uint32* sum) int32 sub, act, low, sz; uint32 MA, base; -int32 ndim = ReadW(dtbl++); /* # dimensions */ +int32 ndim = SEXT(ReadW(dtbl++)); /* # dimensions */ if (ndim < 0) return FALSE; /* invalid? */ *sum = 0; /* accu for index calc */ diff --git a/HP2100/hp2100_diag.txt b/HP2100/hp2100_diag.txt index 67cc0fc3..358e0bb5 100644 --- a/HP2100/hp2100_diag.txt +++ b/HP2100/hp2100_diag.txt @@ -1,6 +1,6 @@ SIMH/HP 21XX DIAGNOSTICS PERFORMANCE ==================================== - Last update: 2012-02-13 + Last update: 2012-02-20 The HP 24396 diagnostic suite has been run against the SIMH HP 21xx simulation. @@ -127,12 +127,12 @@ offline diagnostics: Date Host Date SIMH Part Number Diagnostic Name Code Op. Sys. Code Vers. Result ----------- ------------------------------- ---- -------- ---- ----- ---------- -92067-16013 Extended Memory Area Firmware 1805 RTE-IVB 5010 3.8-0 Passed -92084-16423 Virtual Memory Area Firmware 2121 RTE-6/VM 6200 3.8-0 Passed 12824-16002 Vector Instruction Set Firmware 2026 RTE-IVB 5010 3.8-0 Passed -12829-16006 Vector Instruction Set Firmware 2226 RTE-6/VM 6200 3.8-0 Passed -92835-16006 SIGNAL/1000 Firmware Diagnostic 2040 RTE-6/VM 6200 3.8-0 Passed 91711-12032 ICD/MAC Disc Diagnostic 2201 RTE-IVB 5010 3.8-2 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 The "SIMH Version" is the version number of the earliest SIMH system that was @@ -3497,54 +3497,6 @@ system. ------------------------------------------------- -#EMA - Extended Memory Array Firmware Diagnostic ------------------------------------------------- - -TESTED DEVICE: CPU (hp2100_cpu5.c) - -BINARY FILE: 92067-16013 Rev. 1805 - -HOST SYSTEM: RTE-IVB Rev. 5010 - -CONFIGURATION: sim> set CPU EMA - sim> go - -TEST REPORT: EMA ON-LINE DIAGNOSTIC SUCCESSFUL COMPLETION - -TEST RESULT: Passed. - - - ------------------------------------------------- -VMACK - Virtual Memory Array Firmware Diagnostic ------------------------------------------------- - -TESTED DEVICE: CPU (hp2100_cpu5.c) - -BINARY FILE: 92084-16423 Rev. 2121 - -HOST SYSTEM: RTE-6/VM Rev. 6200 - -CONFIGURATION: sim> set CPU 1000-F - sim> set CPU VMA - sim> go - -TEST REPORT: VMACK - VMA FIRMWARE DIAGNOSTIC, FIRMWARE REV# 003 - VMACK - .IMAR NO ERRORS DETECTED PASS# 1 - VMACK - .JMAR NO ERRORS DETECTED PASS# 1 - VMACK - .LBP NO ERRORS DETECTED PASS# 1 - VMACK - .LBPR NO ERRORS DETECTED PASS# 1 - VMACK - .LPX NO ERRORS DETECTED PASS# 1 - VMACK - .LPXR NO ERRORS DETECTED PASS# 1 - VMACK - .PMAP NO ERRORS DETECTED PASS# 1 - VMACK - .IMAP NO ERRORS DETECTED PASS# 1 - VMACK - .JMAP NO ERRORS DETECTED PASS# 1 - -TEST RESULT: Passed. - - - -------------------------------------------------- VISOD - Vector Instruction Set Firmware Diagnostic -------------------------------------------------- @@ -3565,49 +3517,6 @@ TEST RESULT: Passed. --------------------------------------------------- -VISOD - Vector Instruction Set Firmware Diagnostic --------------------------------------------------- - -TESTED DEVICE: CPU (hp2100_cpu7.c) - -BINARY FILE: 12829-16006 Rev. 2226 - -HOST SYSTEM: RTE-6/VM Rev. 6200 - -CONFIGURATION: sim> set CPU 1000-F - sim> set CPU VIS - sim> go - -TEST REPORT: VIS ON-LINE DIAGNOSTIC SUCCESSFUL COMPLETION - -TEST RESULT: Passed. - - - ---------------------------------------- -SDIAG - SIGNAL/1000 Firmware Diagnostic ---------------------------------------- - -TESTED DEVICE: CPU (hp2100_cpu7.c) - -BINARY FILE: 92835-16006 Rev. 2040 - -HOST SYSTEM: RTE-6/VM Rev. 6200 - -CONFIGURATION: sim> set CPU 1000-F - sim> set CPU VIS - sim> set CPU SIGNAL - sim> go - -TEST REPORT: SIGNAL/1000 FIRMWARE DIAGNOSTIC - - SIGNAL/1000 FIRMWARE DIAGNOSTIC SUCCESSFUL COMPLETION - -TEST RESULT: Passed. - - - ------------------------------ DIAG - ICD/MAC Disc Diagnostic ------------------------------ @@ -3618,7 +3527,8 @@ BINARY FILE: 91711-12032 Rev. 2201 HOST SYSTEM: RTE-IVB Rev. 5010 -CONFIGURATION: sim> go +CONFIGURATION: sim> set DS0 FORMAT + sim> go TEST REPORT: DIAG : HP-IB DISC DIAGNOSTIC @@ -4122,3 +4032,94 @@ TEST NOTES: Steps 11-14 test CRC generation and checking. Steps 21 and 28 bit. Step 30 tests track sparing. Steps 52, 54, and 55 test cylinder, head, and sector miscompares by writing incorrect preambles. These features are not simulated. + + + +------------------------------------------------ +#EMA - Extended Memory Array Firmware Diagnostic +------------------------------------------------ + +TESTED DEVICE: CPU (hp2100_cpu5.c) + +BINARY FILE: 92067-16013 Rev. 1805 + +HOST SYSTEM: RTE-IVB Rev. 5010 + +CONFIGURATION: sim> set CPU EMA + sim> go + +TEST REPORT: EMA ON-LINE DIAGNOSTIC SUCCESSFUL COMPLETION + +TEST RESULT: Passed. + + + +-------------------------------------------------- +VISOD - Vector Instruction Set Firmware Diagnostic +-------------------------------------------------- + +TESTED DEVICE: CPU (hp2100_cpu7.c) + +BINARY FILE: 12829-16006 Rev. 2226 + +HOST SYSTEM: RTE-6/VM Rev. 6200 + +CONFIGURATION: sim> set CPU 1000-F + sim> set CPU VIS + sim> go + +TEST REPORT: VIS ON-LINE DIAGNOSTIC SUCCESSFUL COMPLETION + +TEST RESULT: Passed. + + + +------------------------------------------------ +VMACK - Virtual Memory Array Firmware Diagnostic +------------------------------------------------ + +TESTED DEVICE: CPU (hp2100_cpu5.c) + +BINARY FILE: 92084-16423 Rev. 2121 + +HOST SYSTEM: RTE-6/VM Rev. 6200 + +CONFIGURATION: sim> set CPU 1000-F + sim> set CPU VMA + sim> go + +TEST REPORT: VMACK - VMA FIRMWARE DIAGNOSTIC, FIRMWARE REV# 003 + VMACK - .IMAR NO ERRORS DETECTED PASS# 1 + VMACK - .JMAR NO ERRORS DETECTED PASS# 1 + VMACK - .LBP NO ERRORS DETECTED PASS# 1 + VMACK - .LBPR NO ERRORS DETECTED PASS# 1 + VMACK - .LPX NO ERRORS DETECTED PASS# 1 + VMACK - .LPXR NO ERRORS DETECTED PASS# 1 + VMACK - .PMAP NO ERRORS DETECTED PASS# 1 + VMACK - .IMAP NO ERRORS DETECTED PASS# 1 + VMACK - .JMAP NO ERRORS DETECTED PASS# 1 + +TEST RESULT: Passed. + + + +--------------------------------------- +SDIAG - SIGNAL/1000 Firmware Diagnostic +--------------------------------------- + +TESTED DEVICE: CPU (hp2100_cpu7.c) + +BINARY FILE: 92835-16006 Rev. 2040 + +HOST SYSTEM: RTE-6/VM Rev. 6200 + +CONFIGURATION: sim> set CPU 1000-F + sim> set CPU VIS + sim> set CPU SIGNAL + sim> go + +TEST REPORT: SIGNAL/1000 FIRMWARE DIAGNOSTIC + + SIGNAL/1000 FIRMWARE DIAGNOSTIC SUCCESSFUL COMPLETION + +TEST RESULT: Passed. diff --git a/HP2100/hp_disclib.c b/HP2100/hp_disclib.c index 2424c05c..14e3aaa7 100644 --- a/HP2100/hp_disclib.c +++ b/HP2100/hp_disclib.c @@ -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. - 15-Mar-12 JDB First release + 20-Mar-12 JDB First release 09-Nov-11 JDB Created disc controller common library from DS simulator References: @@ -436,110 +436,49 @@ static const DRIVE_PROPERTIES drive_props [] = { command, and flags to indicate certain common actions that should be taken. */ -#define CP_V_CLRS 15 /* bits 15-15: command clears the controller status */ -#define CP_V_WAIT 14 /* bits 14-15: command waits for seek completion */ -#define CP_V_UACC 13 /* bits 13-13: command accesses the unit */ -#define CP_V_UCHK 12 /* bits 12-12: command checks for unit legality */ -#define CP_V_UNIT 11 /* bits 11-11: command has a unit field */ -#define CP_V_CTYPE 9 /* bits 10- 9: valid controller types */ -#define CP_V_CLASS 6 /* bits 8- 6: command classification code */ -#define CP_V_INCNT 3 /* bits 5- 3: inbound parameter word count */ -#define CP_V_OUTCNT 0 /* bits 2- 0: outbound parameter word count */ - -#define CP_M_CTYPE 3 /* 2-bit valid controller types mask */ -#define CP_M_CLASS 7 /* 3-bit classification code mask */ -#define CP_M_INCNT 7 /* 3-bit inbound parameter word count mask */ -#define CP_M_OUTCNT 7 /* 3-bit outbound parameter word count mask */ - -#define CP_CLRS (1 << CP_V_CLRS) -#define CP_WAIT (1 << CP_V_WAIT) -#define CP_UACC (1 << CP_V_UACC) -#define CP_UCHK (1 << CP_V_UCHK) -#define CP_UNIT (1 << CP_V_UNIT) - -#define CP_MAC (MAC << CP_V_CTYPE) /* command is valid for MAC controllers */ -#define CP_ICD (ICD << CP_V_CTYPE) /* command is valid for ICD controllers */ - -#define CP_INVAL (class_invalid << CP_V_CLASS) /* invalid classification */ -#define CP_READ (class_read << CP_V_CLASS) /* read classification */ -#define CP_WRITE (class_write << CP_V_CLASS) /* write classification */ -#define CP_CNTL (class_control << CP_V_CLASS) /* control classification */ -#define CP_STAT (class_status << CP_V_CLASS) /* status classification */ - -#define TO_CTYPE(t) (uint32) ((t) << CP_V_CTYPE) - -#define GET_CLASS(c) (CNTLR_CLASS) (((c) >> CP_V_CLASS) & CP_M_CLASS) -#define GET_INCNT(c) (((c) >> CP_V_INCNT) & CP_M_INCNT) -#define GET_OUTCNT(c) (((c) >> CP_V_OUTCNT) & CP_M_OUTCNT) - -// >>> better? -#if 0 typedef struct { - CNTLR_OPCODE code; - uint32 inbound; - uint32 outbound; - CNTLR_CLASS class; - t_bool mac; - t_bool icd; - t_bool clear_status; - t_bool unit_field; - t_bool unit_check; - t_bool unit_access; - t_bool seek_wait; + uint32 params_in; /* count of input parameters */ + uint32 params_out; /* count of output parameters */ + CNTLR_CLASS classification; /* command classification */ + t_bool valid [TYPE_COUNT]; /* per-type command validity */ + t_bool clear_status; /* command clears status */ + t_bool unit_field; /* command has a unit field */ + t_bool unit_check; /* command checks unit number validity */ + t_bool unit_access; /* command accesses the drive unit */ + t_bool seek_wait; /* command waits for seek completion */ } DS_PROPS; -static const DS_PROPS cmd_props [] = { -/* in out class mac icd clst unit uchk uacc wait */ - { 0, 0, class_read, 1, 1, 1, 0, 1, 1, 0 }, /* cold load read */ - { 0, 0, class_control, 1, 1, 1, 1, 1, 1, 1 }, /* recalibrate */ - { 2, 0, class_control, 1, 1, 1, 1, 1, 1, 0 }, /* seek */ - { 0, 2, class_status, 1, 1, 0, 1, 0, 0, 0 }, /* request status */ - { 0, 1, class_status, 1, 1, 1, 1, 1, 0, 0 }, /* request sector address */ - { 0, 0, class_read, 1, 1, 1, 1, 1, 1, 1 }, /* read */ - { 0, 0, class_read, 1, 1, 1, 1, 1, 1, 1 }, /* read full sector */ - { 1, 0, class_read, 1, 1, 1, 1, 1, 1, 1 }, /* verify */ - { 0, 0, class_write, 1, 1, 1, 1, 1, 1, 1 }, /* write */ - { 0, 0, class_write, 1, 1, 1, 1, 1, 1, 1 }, /* write full sector */ - { 0, 0, class_control, 1, 1, 1, 0, 0, 0, 0 }, /* clear */ - { 0, 0, class_write, 1, 1, 1, 1, 1, 1, 1 }, /* initialize */ - { 2, 0, class_control, 1, 1, 1, 0, 0, 0, 0 }, /* address record */ - { 0, 7, class_status, 1, 0, 0, 0, 0, 0, 0 }, /* request syndrome */ - { 1, 0, class_read, 1, 1, 1, 1, 1, 1, 1 }, /* read with offset */ - { 0, 0, class_control, 1, 1, 1, 0, 0, 0, 0 }, /* set file mask */ - { 0, 0, class_invalid, 0, 0, 1, 0, 0, 0, 0 }, /* invalid */ - { 0, 0, class_invalid, 0, 0, 1, 0, 0, 0, 0 }, /* invalid */ - { 0, 0, class_read, 1, 1, 1, 1, 1, 1, 1 }, /* read without verify */ - { 1, 0, class_status, 1, 0, 1, 0, 0, 0, 0 }, /* load TIO register */ - { 0, 2, class_status, 1, 1, 0, 0, 0, 0, 0 }, /* request disc address */ - { 0, 0, class_control, 1, 1, 1, 0, 0, 0, 0 }, /* end */ - { 0, 0, class_control, 1, 0, 1, 1, 1, 0, 0 } /* wakeup */ - }; -#endif +typedef const DS_PROPS *PRPTR; -static const uint32 cmd_props [] = { - 000 | CP_READ | CP_MAC | CP_ICD | CP_CLRS | CP_UCHK | CP_UACC, /* cold load read */ - 000 | CP_CNTL | CP_MAC | CP_ICD | CP_CLRS | CP_UNIT | CP_UCHK | CP_UACC | CP_WAIT, /* recalibrate */ - 020 | CP_CNTL | CP_MAC | CP_ICD | CP_CLRS | CP_UNIT | CP_UCHK | CP_UACC, /* seek */ - 002 | CP_STAT | CP_MAC | CP_ICD | CP_UNIT, /* request status */ - 001 | CP_STAT | CP_MAC | CP_ICD | CP_CLRS | CP_UNIT | CP_UCHK, /* request sector address */ - 000 | CP_READ | CP_MAC | CP_ICD | CP_CLRS | CP_UNIT | CP_UCHK | CP_UACC | CP_WAIT, /* read */ - 000 | CP_READ | CP_MAC | CP_ICD | CP_CLRS | CP_UNIT | CP_UCHK | CP_UACC | CP_WAIT, /* read full sector */ - 010 | CP_READ | CP_MAC | CP_ICD | CP_CLRS | CP_UNIT | CP_UCHK | CP_UACC | CP_WAIT, /* verify */ - 000 | CP_WRITE | CP_MAC | CP_ICD | CP_CLRS | CP_UNIT | CP_UCHK | CP_UACC | CP_WAIT, /* write */ - 000 | CP_WRITE | CP_MAC | CP_ICD | CP_CLRS | CP_UNIT | CP_UCHK | CP_UACC | CP_WAIT, /* write full sector */ - 000 | CP_CNTL | CP_MAC | CP_ICD | CP_CLRS, /* clear */ - 000 | CP_WRITE | CP_MAC | CP_ICD | CP_CLRS | CP_UNIT | CP_UCHK | CP_UACC | CP_WAIT, /* initialize */ - 020 | CP_CNTL | CP_MAC | CP_ICD | CP_CLRS, /* address record */ - 007 | CP_STAT | CP_MAC, /* request syndrome */ - 010 | CP_READ | CP_MAC | CP_ICD | CP_CLRS | CP_UNIT | CP_UCHK | CP_UACC | CP_WAIT, /* read with offset */ - 000 | CP_CNTL | CP_MAC | CP_ICD | CP_CLRS, /* set file mask */ - 000 | CP_INVAL | CP_CLRS, /* invalid */ - 000 | CP_INVAL | CP_CLRS, /* invalid */ - 000 | CP_READ | CP_MAC | CP_ICD | CP_CLRS | CP_UNIT | CP_UCHK | CP_UACC | CP_WAIT, /* read without verify */ - 010 | CP_STAT | CP_MAC | CP_CLRS, /* load TIO register */ - 002 | CP_STAT | CP_MAC | CP_ICD, /* request disc address */ - 000 | CP_CNTL | CP_MAC | CP_ICD | CP_CLRS, /* end */ - 000 | CP_CNTL | CP_MAC | CP_CLRS | CP_UNIT | CP_UCHK /* wakeup */ +#define T TRUE +#define F FALSE + +static const DS_PROPS cmd_props [] = { +/* par par opcode valid for clear unit unit unit seek */ +/* in out classification MAC ICD stat field check acces wait */ + { 0, 0, class_read, { T, T }, T, F, T, T, F }, /* 00 = cold load read */ + { 0, 0, class_control, { T, T }, T, T, T, T, T }, /* 01 = recalibrate */ + { 2, 0, class_control, { T, T }, T, T, T, T, F }, /* 02 = seek */ + { 0, 2, class_status, { T, T }, F, T, F, F, F }, /* 03 = request status */ + { 0, 1, class_status, { T, T }, T, T, T, F, F }, /* 04 = request sector address */ + { 0, 0, class_read, { T, T }, T, T, T, T, T }, /* 05 = read */ + { 0, 0, class_read, { T, T }, T, T, T, T, T }, /* 06 = read full sector */ + { 1, 0, class_read, { T, T }, T, T, T, T, T }, /* 07 = verify */ + { 0, 0, class_write, { T, T }, T, T, T, T, T }, /* 10 = write */ + { 0, 0, class_write, { T, T }, T, T, T, T, T }, /* 11 = write full sector */ + { 0, 0, class_control, { T, T }, T, F, F, F, F }, /* 12 = clear */ + { 0, 0, class_write, { T, T }, T, T, T, T, T }, /* 13 = initialize */ + { 2, 0, class_control, { T, T }, T, F, F, F, F }, /* 14 = address record */ + { 0, 7, class_status, { T, F }, F, F, F, F, F }, /* 15 = request syndrome */ + { 1, 0, class_read, { T, T }, T, T, T, T, T }, /* 16 = read with offset */ + { 0, 0, class_control, { T, T }, T, F, F, F, F }, /* 17 = set file mask */ + { 0, 0, class_invalid, { F, F }, T, F, F, F, F }, /* 20 = invalid */ + { 0, 0, class_invalid, { F, F }, T, F, F, F, F }, /* 21 = invalid */ + { 0, 0, class_read, { T, T }, T, T, T, T, T }, /* 22 = read without verify */ + { 1, 0, class_status, { T, F }, T, F, F, F, F }, /* 23 = load TIO register */ + { 0, 2, class_status, { T, T }, F, F, F, F, F }, /* 24 = request disc address */ + { 0, 0, class_control, { T, T }, T, F, F, F, F }, /* 25 = end */ + { 0, 0, class_control, { T, F }, T, T, T, F, F } /* 26 = wakeup */ }; @@ -547,7 +486,7 @@ static const uint32 cmd_props [] = { typedef enum { controller = 0, /* controller unit index */ - timer = 1 /* command wait timer index */ + timer /* command wait timer index */ } AUX_INDEX; @@ -640,7 +579,8 @@ static uint16 drive_status (UNIT *uptr); t_bool dl_prepare_command (CVPTR cvptr, UNIT *units, uint32 unit_limit) { -uint32 props, unit; +uint32 unit; +PRPTR props; CNTLR_OPCODE opcode; set_timer (cvptr, CLEAR); /* stop the command wait timer */ @@ -648,12 +588,12 @@ set_timer (cvptr, CLEAR); /* stop the command wait opcode = GET_OPCODE (cvptr->buffer [0]); /* get the opcode from the command */ if (opcode > last_opcode) /* is the opcode invalid? */ - props = CP_CLRS; /* undefined commands clear prior status */ + props = &cmd_props [invalid_opcode]; /* undefined commands clear prior status */ else /* the opcode is potentially valid */ - props = cmd_props [opcode]; /* get the command properties */ + props = &cmd_props [opcode]; /* get the command properties */ if (cvptr->type == MAC) /* is this a MAC controller? */ - if (props & CP_UNIT) /* is the unit field defined for this command? */ + if (props->unit_field) /* is the unit field defined for this command? */ unit = GET_UNIT (cvptr->buffer [0]); /* get the unit from the command */ else /* no unit specified in the command */ unit = 0; /* so the unit is always unit 0 */ @@ -661,19 +601,20 @@ if (cvptr->type == MAC) /* is this a MAC control else /* an ICD controller */ unit = unit_limit; /* uses the supplied unit number */ -if (props & CP_CLRS) { /* clear the prior controller status */ +if (props->clear_status) { /* clear the prior controller status */ cvptr->status = normal_completion; /* if indicated for this command */ cvptr->spd_unit = SET_S1UNIT (unit); /* save the unit number for status requests */ } -if (props & TO_CTYPE (cvptr->type)) /* is the opcode defined for this controller? */ - if ((props & CP_UCHK) && unit > DL_MAXUNIT) /* if the unit number is checked and is illegal, */ +if (cvptr->type <= last_type /* is the controller type legal? */ + && props->valid [cvptr->type]) /* and the opcode defined for this controller? */ + if (props->unit_check && unit > DL_MAXUNIT) /* if the unit number is checked and is illegal, */ dl_end_command (cvptr, unit_unavailable); /* end with a unit unavailable error */ else { cvptr->state = cntlr_busy; /* legal unit, so controller is now busy */ cvptr->opcode = opcode; /* save the controller opcode */ - cvptr->length = GET_INCNT (props); /* set the inbound parameter count */ + cvptr->length = props->params_in; /* set the inbound parameter count */ cvptr->index = 1; /* point at the first parameter element (if any) */ if (cvptr->type == MAC && cvptr->length) { /* MAC controller and inbound parameters? */ @@ -780,28 +721,30 @@ return FALSE; /* the preparation has f drive units but are scheduled on the controller unit because they may be issued while a drive is processing a seek. - 8. The activation time is set to one-half of the intersector time (latency) - for read and write commands, and to the controller processing time for - all others. + 8. The activation time is set to the intersector time (latency) for read and + write commands, and to the controller processing time for all others. + This time cannot be shorter than 20 instructions, or DVR32 will be unable + to start DCPC in time to avoid an over/underrun. */ UNIT *dl_start_command (CVPTR cvptr, UNIT *units, uint32 unit_limit) { UNIT *uptr, *rptr; -uint32 props, unit; +uint32 unit; +PRPTR props; t_bool is_seeking = FALSE; -props = cmd_props [cvptr->opcode]; /* get the command properties */ +props = &cmd_props [cvptr->opcode]; /* get the command properties */ if (cvptr->type == MAC) { /* is this a MAC controller? */ - if (props & CP_UNIT) /* is the unit field defined for this command? */ + if (props->unit_field) /* is the unit field defined for this command? */ unit = GET_UNIT (cvptr->buffer [0]); /* get the unit number from the command */ else /* no unit is specified in the command */ unit = 0; /* so the unit number defaults to 0 */ if (unit > unit_limit) /* if the unit number is invalid, */ uptr = NULL; /* it does not correspond to a unit */ - else if (props & CP_UACC) /* if the command accesses a drive, */ + else if (props->unit_access) /* if the command accesses a drive, */ uptr = units + unit; /* get the address of the unit */ else /* the command accesses the controller only */ uptr = cvptr->aux + controller; /* so use the controller unit */ @@ -812,17 +755,16 @@ else { /* for an ICD controller uptr = units + unit_limit; /* and we use the indicated unit */ } -if ((props & CP_UCHK) && !uptr /* if the unit number is checked and is invalid */ - || (props & CP_WAIT) /* or the command waits for the drive */ - && (drive_status (uptr) & DL_S2STOPS)) { /* and the drive is offline or faulted */ - dl_end_command (cvptr, status_2_error); /* then the command ends with a Status-2 error */ - uptr = NULL; /* prevent command from starting */ +if (props->unit_check && !uptr /* if the unit number is checked and is invalid */ + || props->seek_wait && (drive_status (uptr) & DL_S2STOPS)) { /* or if waiting for an offline drive */ + dl_end_command (cvptr, status_2_error); /* then the command ends with a Status-2 error */ + uptr = NULL; /* prevent the command from starting */ } else if (uptr) { /* otherwise, we have a valid unit */ uptr->wait = cvptr->cmd_time; /* most commands use the command delay */ - if (props & CP_UACC) { /* does the command access the unit? */ + if (props->unit_access) { /* does the command access the unit? */ is_seeking = sim_is_active (uptr) != 0; /* see if the unit is busy */ if (is_seeking) /* if a seek is in progress, */ @@ -831,15 +773,15 @@ else if (uptr) { /* otherwise, we have a else { /* otherwise, the unit is idle */ uptr->STAT &= ~DL_S2ATN; /* clear the drive Attention status */ - if (GET_CLASS (props) == class_read /* if a read command */ - || GET_CLASS (props) == class_write) /* or a write command */ - uptr->wait = cvptr->sector_time / 2; /* schedule the sector start latency */ + if (props->classification == class_read /* if a read command */ + || props->classification == class_write) /* or a write command */ + uptr->wait = cvptr->sector_time; /* schedule the sector start latency */ } } } cvptr->index = 0; /* reset the buffer index */ -cvptr->length = GET_OUTCNT (props); /* set the count of outbound parameters */ +cvptr->length = props->params_out; /* set the count of outbound parameters */ cvptr->eod = CLEAR; /* clear the end of data flag */ @@ -1643,17 +1585,11 @@ return SCPE_OK; CNTLR_CLASS dl_classify (CNTLR_VARS cntlr) { -uint32 flags; - -if (cntlr.opcode > last_opcode) /* is the opcode illegal? */ - return class_invalid; /* return an invalid classification */ - -flags = cmd_props [cntlr.opcode]; /* get the opcode properties */ - -if (cntlr.type == MAC && (flags & CP_MAC) /* is the opcode */ - || cntlr.type == ICD && (flags & CP_ICD)) /* defined for this controller? */ - return GET_CLASS (cmd_props [cntlr.opcode]); /* yes, so return the command classification */ -else /* opcode is undefined */ +if (cntlr.type <= last_type /* if the controller type is legal, */ + && cntlr.opcode <= last_opcode /* and the opcode is legal */ + && cmd_props [cntlr.opcode].valid [cntlr.type]) /* and is defined for this controller, */ + return cmd_props [cntlr.opcode].classification; /* then return the command classification */ +else /* type or opcode is illegal */ return class_invalid; /* so return an invalid classification */ } @@ -1667,17 +1603,11 @@ else /* opcode is undefined * const char *dl_opcode_name (CNTLR_TYPE controller, CNTLR_OPCODE opcode) { -uint32 flags; - -if (opcode > last_opcode) /* is the opcode illegal? */ - return invalid_name; /* return an error indication */ - -flags = cmd_props [opcode]; /* get the opcode properties */ - -if (controller == MAC && (flags & CP_MAC) || /* is the opcode */ - controller == ICD && (flags & CP_ICD)) /* defined for this controller? */ - return opcode_name [opcode]; /* yes, so return the opcode name */ -else /* opcode is undefined, */ +if (controller <= last_type /* if the controller type is legal, */ + && opcode <= last_opcode /* and the opcode is legal */ + && cmd_props [opcode].valid [controller]) /* and is defined for this controller, */ + return opcode_name [opcode]; /* then return the opcode name */ +else /* type or opcode is illegal, */ return invalid_name; /* so return an error indication */ } @@ -1690,10 +1620,10 @@ else /* opcode is undefined, const char *dl_phase_name (CNTLR_PHASE phase) { -if (phase > last_phase) /* is the phase illegal? */ - return invalid_name; /* return an error indication */ -else /* phase is defined, */ - return phase_name [phase]; /* so return the phase name */ +if (phase <= last_phase) /* if the phase is legal, */ + return phase_name [phase]; /* return the phase name */ +else /* phase is illegal, */ + return invalid_name; /* so return an error indication */ } diff --git a/HP2100/hp_disclib.h b/HP2100/hp_disclib.h index 90056b27..52c4a161 100644 --- a/HP2100/hp_disclib.h +++ b/HP2100/hp_disclib.h @@ -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. - 15-Mar-12 JDB First release + 19-Mar-12 JDB First release 09-Nov-11 JDB Created disc controller common library from DS simulator @@ -191,11 +191,12 @@ #define MODEL_7925 SET_MODEL (D7925_MODEL) -/* Controller types (values must be powers of 2) */ +/* Controller types */ typedef enum { - MAC = 1, - ICD = 2 + MAC = 0, + ICD, last_type = ICD, /* last valid type */ + TYPE_COUNT /* count of controller types */ } CNTLR_TYPE; @@ -218,11 +219,12 @@ typedef enum { request_syndrome = 015, read_with_offset = 016, set_file_mask = 017, + invalid_opcode = 020, read_without_verify = 022, load_tio_register = 023, request_disc_address = 024, end = 025, - wakeup = 026, last_opcode = wakeup /* last opcode */ + wakeup = 026, last_opcode = wakeup /* last valid opcode */ } CNTLR_OPCODE; #define DL_OPCODE_MASK 037 @@ -231,9 +233,9 @@ typedef enum { /* Controller command phases */ typedef enum { - start_phase, + start_phase = 0, data_phase, - end_phase, last_phase = end_phase /* last phase */ + end_phase, last_phase = end_phase /* last valid phase */ } CNTLR_PHASE; diff --git a/sim_console.c b/sim_console.c index 200749bc..6b6d8fcb 100644 --- a/sim_console.c +++ b/sim_console.c @@ -1015,7 +1015,8 @@ t_stat sim_os_poll_kbd (void) int c = -1; DWORD nkbevents, nkbevent; INPUT_RECORD rec; -extern int32 sim_switches; + +\ if ((std_input == NULL) || /* No keyboard for */ (std_input == INVALID_HANDLE_VALUE)) /* background processes */ diff --git a/sim_rev.h b/sim_rev.h index e82247d9..78259a30 100644 --- a/sim_rev.h +++ b/sim_rev.h @@ -1,6 +1,6 @@ /* sim_rev.h: simulator revisions and current rev level - Copyright (c) 1993-2011, Robert M Supnik + Copyright (c) 1993-2012, 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"), @@ -38,6 +38,7 @@ patch date module(s) and fix(es) 0 xx-yyy-1 scp.c: - added *nix READLINE support (Mark Pizzolato) + - fixed "SHOW DEVICE" with only one enabled unit (Dave Bryan) - fixed handling of DO with no arguments (Dave Bryan) - clarified some help messages (Mark Pizzolato) - added "SHOW SHOW" and "SHOW SHOW" commands (Mark Pizzolato) @@ -50,7 +51,8 @@ patch date module(s) and fix(es) - major revision (Dave Hittner and Mark Pizzolato) sim_tmxr.c: - - made option negotiation more reliable (Mark Pizzolato) + - made telnet option negotiation more reliable. + VAX works with PuTTY. (Mark Pizzolato) h316_cpu.c: - fixed bugs in MPY, DIV introduced in 3.8-1 (from Theo Engel) @@ -59,8 +61,13 @@ patch date module(s) and fix(es) hp2100 all peripherals (Dave Bryan): - Changed I/O signal handlers for newly revised signal model + - Deprecated DEVNO modifier in favor of SC hp2100_cpu.c (Dave Bryan): + - Minor speedup in "is_mapped" + - Added casts to cpu_mod, dmasio, dmapio, cpu_reset, dma_reset + - Fixed I/O return status bug for DMA cycles + - Failed I/O cycles now stop on failing instruction - Revised DMA for new multi-card paradigm - Consolidated DMA reset routines - DMA channels renamed from 0,1 to 1,2 to match documentation @@ -70,8 +77,6 @@ patch date module(s) and fix(es) - Fixed DMA requests to enable stealing every cycle - Fixed DMA priority for channel 1 over channel 2 - Corrected comments for "cpu_set_idle" - - Fixed I/O return status bug for DMA cycles - - Failed I/O cycles now stop on failing instruction hp2100_cpu.h: - Changed declarations for VMS compiler @@ -79,15 +84,42 @@ patch date module(s) and fix(es) hp2100_cpu0.c (Dave Bryan): - Removed DS note regarding PIF card (is now implemented) + hp2100_cpu4.c (Dave Bryan): + - Added OPSIZE casts to fp_accum calls in .FPWR/.TPWR + + hp2100_cpu5.c (Dave Bryan): + - Added OPSIZE casts to fp_accum calls in .FPWR/.TPWR + hp2100_cpu6.c (Dave Bryan): - - DMA channels renamed from 0,1 to 1,2 to match documentation + - Eliminated unused variable in "cpu_ema_vset" + + hp2100_cpu7.c (Dave Bryan): + - Corrected "opsize" parameter type in vis_abs hp2100_defs.h (Dave Bryan): + - Added hp_setsc, hp_showsc functions to support SC modifier - DMA channels renamed from 0,1 to 1,2 to match documentation - Revised I/O signal enum values for concurrent signals - Revised I/O macros for new signal handling + - Added DA and DC device select code assignments + + hp2100_di.c (Dave Bryan): + - Implemented 12821A HP-IB Disc Interface + + hp2100_di_da.c (Dave Bryan): + - Implemented 7906H/20H/25H ICD disc drives + + hp2100_dp.c (Dave Bryan): + - Added CNTLR_TYPE cast to dp_settype hp2100_ds.c (Dave Bryan): + - Rewritten to use the MAC/ICD disc controller library + - ioIOO now notifies controller service of parameter output + - Corrected SRQ generation and FIFO under/overrun detection + - Corrected Clear command to conform to the hardware + - Fixed Request Status to return Unit Unavailable if illegal + - Seek and Cold Load Read now Seek Check if seek in progress + - Remodeled command wait for seek completion - Corrected status returns for disabled drive, auto-seek beyond drive limits, Request Sector Address and Wakeup with invalid or offline unit @@ -95,23 +127,38 @@ patch date module(s) and fix(es) Read Without Verify hp2100_fp1.c (Dave Bryan): + - Added missing precision on constant "one" in fp_trun - Completed the comments for divide; no code changes hp2100_ipl.c (Dave Bryan): - - Revised for new multi-card paradigm + - Added CARD_INDEX casts to dib.card_index - A failed STC may now be retried + - Consolidated reporting of consecutive CRS signals + - Revised for new multi-card paradigm hp2100_lps.c (Dave Bryan): - - Corrected 12566B (DIAG mode) jumper settings - Revised detection of CLC at last DMA cycle + - Corrected 12566B (DIAG mode) jumper settings + + hp2100_ms.c (Dave Bryan): + - Added CNTLR_TYPE cast to ms_settype hp2100_mt.c (Dave Bryan): - - Fixed error in command scan in mtcio ioIOO handler + - Fixed command scanning error in mtcio ioIOO handler + + hp2100_stddev.c (Dave Bryan): + - Add TBG as a logical name for the CLK device hp2100_sys.c (Dave Bryan): + - Add TBG as a logical name for the CLK device + - Added hp_setsc, hp_showsc functions to support SC modifier + - Added DA and dummy DC devices - DMA channels renamed from 0,1 to 1,2 to match documentation - Changed DIB access for revised signal model + hp_disclib.c, hp_disclib.h (Dave Bryan) + - Created MAC/ICD disc controller library + i1401_cd.c: - fixed read stacker operation in column binary mode - fixed punch stacker operation (Van Snyder)