| /* pdp18b_defs.h: 18b PDP simulator definitions | |
| Copyright (c) 1993-2001, 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"), | |
| to deal in the Software without restriction, including without limitation | |
| the rights to use, copy, modify, merge, publish, distribute, sublicense, | |
| and/or sell copies of the Software, and to permit persons to whom the | |
| Software is furnished to do so, subject to the following conditions: | |
| The above copyright notice and this permission notice shall be included in | |
| all copies or substantial portions of the Software. | |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |
| ROBERT M SUPNIK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | |
| IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
| CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
| Except as contained in this notice, the name of Robert M Supnik shall not | |
| 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. | |
| 27-May-01 RMS Added second Teletype support | |
| 21-Jan-01 RMS Added DECtape support | |
| 14-Apr-99 RMS Changed t_addr to unsigned | |
| 02-Jan-96 RMS Added fixed head and moving head disks | |
| 31-Dec-95 RMS Added memory management | |
| 19-Mar-95 RMS Added dynamic memory size | |
| The author gratefully acknowledges the help of Craig St. Clair and | |
| Deb Tevonian in locating archival material about the 18b PDP's, and of | |
| Al Kossow and Max Burnet in making documentation and software available. | |
| */ | |
| #include "sim_defs.h" /* simulator defns */ | |
| /* Models: only one should be defined | |
| model memory CPU options I/O options | |
| PDP4 8K ??Type 18 EAE Type 65 KSR-28 Teletype (Baudot) | |
| integral paper tape reader | |
| Type 75 paper tape punch | |
| integral real time clock | |
| Type 62 line printer (Hollerith) | |
| PDP7 32K Type 177 EAE Type 649 KSR-33 Teletype | |
| Type 148 mem extension Type 444 paper tape reader | |
| Type 75 paper tape punch | |
| integral real time clock | |
| Type 647B line printer (sixbit) | |
| Type 24 serial drum | |
| PDP9 32K KE09A EAE KSR-33 Teletype | |
| KF09A auto pri intr PC09A paper tape reader and punch | |
| KG09B mem extension integral real time clock | |
| KP09A power detection Type 647D/E line printer (sixbit) | |
| KX09A mem protection RF09/RS09 fixed head disk | |
| TC59 magnetic tape | |
| TC02/TU55 DECtape | |
| LT09A second Teletype | |
| PDP15 128K KE15 EAE KSR-35 Teletype | |
| KA15 auto pri intr PC15 paper tape reader and punch | |
| KF15 power detection KW15 real time clock | |
| KM15 mem protection LP15 line printer | |
| ??KT15 mem relocation RP15 disk pack | |
| RF15/RF09 fixed head disk | |
| TC59D magnetic tape | |
| TC15/TU56 DECtape | |
| LT15 second Teletype | |
| ??Indicates not implemented. The PDP-4 manual refers to both an EAE | |
| ??and a memory extension control; there is no documentation on either. | |
| */ | |
| #if !defined (PDP4) && !defined (PDP7) && !defined (PDP9) && !defined (PDP15) | |
| #define PDP9 0 /* default to PDP-9 */ | |
| #endif | |
| /* Simulator stop codes */ | |
| #define STOP_RSRV 1 /* must be 1 */ | |
| #define STOP_HALT 2 /* HALT */ | |
| #define STOP_IBKPT 3 /* breakpoint */ | |
| #define STOP_XCT 4 /* nested XCT's */ | |
| #define STOP_API 5 /* invalid API int */ | |
| /* Peripheral configuration */ | |
| #if defined (PDP4) | |
| #define ADDRSIZE 13 | |
| #define KSR28 0 /* Baudot terminal */ | |
| #define TYPE62 0 /* Hollerith printer */ | |
| #elif defined (PDP7) | |
| #define ADDRSIZE 15 | |
| #define TYPE647 0 /* sixbit printer */ | |
| #define DRM 0 /* drum */ | |
| #elif defined (PDP9) | |
| #define ADDRSIZE 15 | |
| #define TYPE647 0 /* sixbit printer */ | |
| #define RF 0 /* fixed head disk */ | |
| #define MTA 0 /* magtape */ | |
| #define DTA 0 /* DECtape */ | |
| #define TTY1 0 /* second Teletype */ | |
| #define BRMASK 0076000 /* bounds mask */ | |
| #elif defined (PDP15) | |
| #define ADDRSIZE 17 | |
| #define LP15 0 /* ASCII printer */ | |
| #define RF 0 /* fixed head disk */ | |
| #define RP 0 /* disk pack */ | |
| #define MTA 0 /* magtape */ | |
| #define DTA 0 /* DECtape */ | |
| #define TTY1 0 /* second Teletype */ | |
| #define BRMASK 0377400 /* bounds mask */ | |
| #endif | |
| /* Memory */ | |
| #define ADDRMASK ((1 << ADDRSIZE) - 1) /* address mask */ | |
| #define IAMASK 077777 /* ind address mask */ | |
| #define BLKMASK (ADDRMASK & (~IAMASK)) /* block mask */ | |
| #define MAXMEMSIZE (1 << ADDRSIZE) /* max memory size */ | |
| #define MEMSIZE (cpu_unit.capac) /* actual memory size */ | |
| #define MEM_ADDR_OK(x) (((t_addr) (x)) < MEMSIZE) | |
| /* Architectural constants */ | |
| #define DMASK 0777777 /* data mask */ | |
| #define LINK (DMASK + 1) /* link */ | |
| #define LACMASK (LINK | DMASK) /* link + data */ | |
| #define SIGN 0400000 /* sign bit */ | |
| #define OP_JMS 0100000 /* JMS */ | |
| #define OP_JMP 0600000 /* JMP */ | |
| #define OP_HLT 0740040 /* HLT */ | |
| /* IOT subroutine return codes */ | |
| #define IOT_V_SKP 18 /* skip */ | |
| #define IOT_V_REASON 19 /* reason */ | |
| #define IOT_SKP (1 << IOT_V_SKP) | |
| #define IOT_REASON (1 << IOT_V_REASON) | |
| #define IORETURN(f,v) ((f)? (v): SCPE_OK) /* stop on error */ | |
| /* Interrupt system | |
| The interrupt system can be modelled on either the flag driven system | |
| of the PDP-4 and PDP-7 or the API driven system of the PDP-9 and PDP-15. | |
| If flag based, API is hard to implement; if API based, IORS requires | |
| extra code for implementation. I've chosen an API based model. | |
| API channel Device API priority Notes | |
| 00 software 4 4 | |
| 01 software 5 5 | |
| 02 software 6 6 | |
| 03 software 7 7 | |
| 04 TC02/TC15 1 | |
| 05 TC59D 1 | |
| 06 drum 1 PDP-9 only | |
| 07 disk 1 PDP-9 only | |
| 10 paper tape reader 2 | |
| 11 real time clock 3 | |
| 12 power fail 0 | |
| 13 memory parity 0 | |
| 14 display 2 | |
| 15 card reader 2 | |
| 16 line printer 2 | |
| 17 A/D converter 0 | |
| 20 interprocessor buffer 3 | |
| 21 360 link 3 PDP-9 only | |
| 22 data phone 2 PDP-15 only | |
| 23 RF09/RF15 1 | |
| 24 RP15 1 PDP-15 only | |
| 25 plotter 1 PDP-15 only | |
| 26 - | |
| 27 - | |
| 30 - | |
| 31 - | |
| 32 - | |
| 33 - | |
| 34 LT15 TTO 3 PDP-15 only | |
| 35 LT15 TTI 3 PDP-15 only | |
| 36 - | |
| 37 - | |
| Interrupt system, priority is left to right. | |
| <30:28> = priority 0 | |
| <27:20> = priority 1 | |
| <19:12> = priority 2 | |
| <11:8> = priority 3 | |
| <7:0> = PI only | |
| */ | |
| #define API_L0 0xF0000000 | |
| #define API_L1 0x0FF00000 | |
| #define API_L2 0x000FF000 | |
| #define API_L3 0x00000F00 | |
| #define INT_V_PWRFL 30 /* powerfail */ | |
| #define INT_V_DTA 27 /* DECtape */ | |
| #define INT_V_MTA 26 /* magtape */ | |
| #define INT_V_DRM 25 /* drum */ | |
| #define INT_V_RF 24 /* fixed head disk */ | |
| #define INT_V_RP 23 /* disk pack */ | |
| #define INT_V_PTR 19 /* paper tape reader */ | |
| #define INT_V_LPT 18 /* line printer */ | |
| #define INT_V_LPTSPC 17 /* line printer spc */ | |
| #define INT_V_CLK 11 /* clock */ | |
| #define INT_V_TTI1 10 /* LT15 keyboard */ | |
| #define INT_V_TTO1 9 /* LT15 output */ | |
| #define INT_V_TTI 7 /* console keyboard */ | |
| #define INT_V_TTO 6 /* console output */ | |
| #define INT_V_PTP 5 /* paper tape punch */ | |
| #define INT_PWRFL (1 << INT_V_PWRFL) | |
| #define INT_DTA (1 << INT_V_DTA) | |
| #define INT_MTA (1 << INT_V_MTA) | |
| #define INT_DRM (1 << INT_V_DRM) | |
| #define INT_RF (1 << INT_V_RF) | |
| #define INT_RP (1 << INT_V_RP) | |
| #define INT_PTR (1 << INT_V_PTR) | |
| #define INT_LPT (1 << INT_V_LPT) | |
| #define INT_LPTSPC (1 << INT_V_LPTSPC) | |
| #define INT_CLK (1 << INT_V_CLK) | |
| #define INT_TTI1 (1 << INT_V_TTI1) | |
| #define INT_TTO1 (1 << INT_V_TTO1) | |
| #define INT_TTI (1 << INT_V_TTI) | |
| #define INT_TTO (1 << INT_V_TTO) | |
| #define INT_PTP (1 << INT_V_PTP) | |
| #define ACH_SWRE 040 /* API channels */ | |
| #define ACH_PWRFL 052 | |
| #define ACH_DTA 044 | |
| #define ACH_MTA 045 | |
| #define ACH_DRM 046 | |
| #define ACH_RF 063 | |
| #define ACH_RP 064 | |
| #define ACH_PTR 050 | |
| #define ACH_LPT 056 | |
| #define ACH_CLK 051 | |
| #define ACH_TTI1 075 | |
| #define ACH_TTO1 074 | |
| /* I/O status flags for the IORS instruction | |
| bit PDP-4 PDP-7 PDP-9 PDP-15 | |
| 0 intr on intr on intr on intr on | |
| 1 tape rdr flag* tape rdr flag* tape rdr flag* tape rdr flag* | |
| 2 tape pun flag* tape pun flag* tape pun flag* tape pun flag* | |
| 3 keyboard flag* keyboard flag* keyboard flag* keyboard flag* | |
| 4 type out flag* type out flag* type out flag* type out flag* | |
| 5 display flag* display flag* light pen flag* light pen flag* | |
| 6 clk ovflo flag* clk ovflo flag* clk ovflo flag* clk ovflo flag* | |
| 7 clk enable flag clk enable flag clk enable flag clk enable flag | |
| 8 mag tape flag* mag tape flag* tape rdr empty* tape rdr empty* | |
| 9 card rdr col* * tape pun empty tape pun empty | |
| 10 card rdr ~busy DECtape flag* DECtape flag* | |
| 11 card rdr error magtape flag* magtape flag* | |
| 12 card rdr EOF disk pack flag* | |
| 13 card pun row* DECdisk flag* DECdisk flag* | |
| 14 card pun error lpt flag* | |
| 15 lpt flag* lpt flag* lpt flag* | |
| 16 lpt space flag* lpt error flag lpt error flag | |
| 17 drum flag* drum flag* | |
| */ | |
| #define IOS_ION 0400000 /* interrupts on */ | |
| #define IOS_PTR 0200000 /* tape reader */ | |
| #define IOS_PTP 0100000 /* tape punch */ | |
| #define IOS_TTI 0040000 /* keyboard */ | |
| #define IOS_TTO 0020000 /* terminal */ | |
| #define IOS_LPEN 0010000 /* light pen */ | |
| #define IOS_CLK 0004000 /* clock */ | |
| #define IOS_CLKON 0002000 /* clock enable */ | |
| #define IOS_DTA 0000200 /* DECtape */ | |
| #define IOS_RP 0000040 /* disk pack */ | |
| #define IOS_RF 0000020 /* fixed head disk */ | |
| #define IOS_DRM 0000001 /* drum */ | |
| #if defined (PDP4) || defined (PDP7) | |
| #define IOS_MTA 0001000 /* magtape */ | |
| #define IOS_LPT 0000004 /* line printer */ | |
| #define IOS_LPT1 0000002 /* line printer stat */ | |
| #elif defined (PDP9) | |
| #define IOS_PTRERR 0001000 /* reader empty */ | |
| #define IOS_PTPERR 0000400 /* punch empty */ | |
| #define IOS_MTA 0000100 /* magtape */ | |
| #define IOS_LPT 0000004 /* line printer */ | |
| #define IOS_LPT1 0000002 /* line printer stat */ | |
| #elif defined (PDP15) | |
| #define IOS_PTRERR 0001000 /* reader empty */ | |
| #define IOS_PTPERR 0000400 /* punch empty */ | |
| #define IOS_MTA 0000100 /* magtape */ | |
| #define IOS_LPT 0000010 /* line printer */ | |
| #endif |