Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 1 | /* vax_watch.c: VAX watch chip
|
| 2 |
|
| 3 | Copyright (c) 2011-2012, Matt Burke
|
| 4 |
|
| 5 | Permission is hereby granted, free of charge, to any person obtaining a
|
| 6 | copy of this software and associated documentation files (the "Software"),
|
| 7 | to deal in the Software without restriction, including without limitation
|
| 8 | the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
| 9 | and/or sell copies of the Software, and to permit persons to whom the
|
| 10 | Software is furnished to do so, subject to the following conditions:
|
| 11 |
|
| 12 | The above copyright notice and this permission notice shall be included in
|
| 13 | all copies or substantial portions of the Software.
|
| 14 |
|
| 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
| 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
| 18 | THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
| 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
| 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
| 21 |
|
| 22 | Except as contained in this notice, the name of the author shall not be
|
| 23 | used in advertising or otherwise to promote the sale, use or other dealings
|
| 24 | in this Software without prior written authorization from the author.
|
| 25 |
|
| 26 | wtc Watch chip
|
| 27 |
|
| 28 | 08-Nov-2012 MB First version
|
| 29 |
|
| 30 | This file covers the watch chip (MC146818) which is used by several VAX
|
| 31 | models including the KA620, KA630, KA410, KA420 and KA820.
|
| 32 | */
|
| 33 |
|
| 34 | #include "vax_defs.h"
|
| 35 | #include <time.h>
|
| 36 |
|
| 37 | /* control/status registers */
|
| 38 |
|
Mark Pizzolato | 19d30d9 | 2013-08-21 13:54:00 -0700 | [diff] [blame] | 39 | #define WTC_CSRA_RS 0x0F /* Rate Select Bits (Not Used by VMS) */
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 40 | #define WTC_CSRA_V_DV 4
|
| 41 | #define WTC_CSRA_M_DV 0x7
|
| 42 | #define WTC_CSRA_DV (WTC_CSRA_M_DV << WTC_CSRA_V_DV)
|
Mark Pizzolato | 19d30d9 | 2013-08-21 13:54:00 -0700 | [diff] [blame] | 43 | #define WTC_CSRA_UIP 0x80 /* update in progess (BUSY) */
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 44 | #define WTC_CSRA_WR (WTC_CSRA_RS | WTC_CSRA_DV)
|
Mark Pizzolato | db91afb | 2013-09-05 23:30:22 -0700 | [diff] [blame] | 45 | const char *wtc_dv_modes[] = {"4.194304MHz", "1.048576MHz", "32.768KHz", "Any", "Any", "Test-Only", "Test-Only", "Test-Only"};
|
Mark Pizzolato | 19d30d9 | 2013-08-21 13:54:00 -0700 | [diff] [blame] | 46 | BITFIELD wtc_csra_bits[] = {
|
| 47 | BITNCF(4), /* Rate Select - unused MBZ for VMS */
|
| 48 | BITFNAM(DV,3,wtc_dv_modes), /* Divider Select */
|
| 49 | BIT(UIP), /* Update In Progress */
|
| 50 | ENDBITS
|
| 51 | };
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 52 |
|
| 53 | #define WTC_CSRB_DSE 0x01 /* daylight saving en */
|
Mark Pizzolato | 19d30d9 | 2013-08-21 13:54:00 -0700 | [diff] [blame] | 54 | #define WTC_CSRB_2412 0x02 /* 24/12hr select (1 -> 24 hr) */
|
| 55 | #define WTC_CSRB_DM 0x04 /* data mode (1 -> binary, 0 -> BCD) */
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 56 | #define WTC_CSRB_SET 0x80 /* set time */
|
Mark Pizzolato | 19d30d9 | 2013-08-21 13:54:00 -0700 | [diff] [blame] | 57 | #define WTC_CSRB_PIE 0x40 /* periodic interrupt enable (Not Used by VMS) */
|
| 58 | #define WTC_CSRB_AIE 0x20 /* alarm interrupt enable (Not Used by VMS) */
|
| 59 | #define WTC_CSRB_UIE 0x10 /* update ended interrupt enable (Not Used by VMS) */
|
| 60 | #define WTC_CSRB_SQWE 0x08 /* square wave enable (Not Used by VMS) */
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 61 | #define WTC_CSRB_WR (WTC_CSRB_DSE | WTC_CSRB_2412 | WTC_CSRB_DM | WTC_CSRB_SET)
|
Mark Pizzolato | db91afb | 2013-09-05 23:30:22 -0700 | [diff] [blame] | 62 | const char *wtc_dse_modes[] = {"Disabled", "Enabled"};
|
| 63 | const char *wtc_hr_modes[] = {"12Hr", "24Hr"};
|
| 64 | const char *wtc_data_modes[] = {"BCD", "Binary"};
|
Mark Pizzolato | 19d30d9 | 2013-08-21 13:54:00 -0700 | [diff] [blame] | 65 | BITFIELD wtc_csrb_bits[] = {
|
| 66 | BITFNAM(DST,1,wtc_dse_modes), /* Daylight Savings Time Enable */
|
| 67 | BITFNAM(24HR,1,wtc_hr_modes), /* 24/12 Hour Mode */
|
| 68 | BITFNAM(DM,1,wtc_data_modes), /* Data Mode */
|
| 69 | BITNCF(4), /* Unused SQWE, UIE, AIE, PIE */
|
| 70 | BIT(SET), /* Set In Progress */
|
| 71 | ENDBITS
|
| 72 | };
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 73 |
|
Mark Pizzolato | 19d30d9 | 2013-08-21 13:54:00 -0700 | [diff] [blame] | 74 | BITFIELD wtc_csrc_bits[] = {
|
| 75 | BITF(VALUE,8), /* Should be unused */
|
| 76 | ENDBITS
|
| 77 | };
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 78 | #define WTC_CSRD_VRT 0x80 /* valid time */
|
| 79 | #define WTC_CSRD_RD (WTC_CSRD_VRT)
|
Mark Pizzolato | 19d30d9 | 2013-08-21 13:54:00 -0700 | [diff] [blame] | 80 | #define WTC_CSRD_WR (WTC_CSRD_VRT)
|
| 81 | BITFIELD wtc_csrd_bits[] = {
|
| 82 | BITNCF(7),
|
| 83 | BIT(VALID), /* Valid RAM and Time (VRT) */
|
| 84 | ENDBITS
|
| 85 | };
|
| 86 |
|
| 87 | BITFIELD wtc_value_bits[] = {
|
| 88 | BITFFMT(VALUE,8,%d), /* Decimal Value */
|
| 89 | ENDBITS
|
| 90 | };
|
| 91 | BITFIELD* wtc_bitdefs[] = {wtc_value_bits, wtc_value_bits, wtc_value_bits, wtc_value_bits,
|
| 92 | wtc_value_bits, wtc_value_bits, wtc_value_bits, wtc_value_bits,
|
| 93 | wtc_value_bits, wtc_value_bits, wtc_csra_bits, wtc_csrb_bits,
|
| 94 | wtc_csrc_bits, wtc_csrd_bits, wtc_value_bits, wtc_value_bits};
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 95 |
|
| 96 | #define WTC_MODE_STD 0
|
| 97 | #define WTC_MODE_VMS 1
|
Mark Pizzolato | db91afb | 2013-09-05 23:30:22 -0700 | [diff] [blame] | 98 | const char *wtc_modes[] = {"Std", "VMS"};
|
Mark Pizzolato | 19d30d9 | 2013-08-21 13:54:00 -0700 | [diff] [blame] | 99 | BITFIELD wtc_mode_bits[] = {
|
| 100 | BITFNAM(MODE,1,wtc_modes), /* Watch Date/Time mode */
|
| 101 | ENDBITS
|
| 102 | };
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 103 |
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 104 | int32 wtc_csra = 0;
|
| 105 | int32 wtc_csrb = 0;
|
| 106 | int32 wtc_csrc = 0;
|
| 107 | int32 wtc_csrd = 0;
|
| 108 | int32 wtc_mode = WTC_MODE_VMS;
|
| 109 |
|
Mark Pizzolato | 5531ccb | 2016-05-15 15:25:33 -0700 | [diff] [blame] | 110 | t_stat wtc_set (UNIT *uptr, int32 val, CONST char *cptr, void *desc);
|
| 111 | t_stat wtc_show (FILE *st, UNIT *uptr, int32 val, CONST void *desc);
|
Mark Pizzolato | ef9d1ad | 2015-02-13 06:18:24 -0800 | [diff] [blame] | 112 | t_stat wtc_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr);
|
| 113 | const char *wtc_description (DEVICE *dptr);
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 114 | t_stat wtc_reset (DEVICE *dptr);
|
| 115 | void wtc_set_valid (void);
|
| 116 | void wtc_set_invalid (void);
|
| 117 |
|
| 118 | UNIT wtc_unit = { UDATA (NULL, 0, 0) };
|
| 119 |
|
| 120 | REG wtc_reg[] = {
|
Mark Pizzolato | 19d30d9 | 2013-08-21 13:54:00 -0700 | [diff] [blame] | 121 | { HRDATADF (CSRA, wtc_csra, 8, "CSRA", wtc_csra_bits) },
|
| 122 | { HRDATADF (CSRB, wtc_csrb, 8, "CSRB", wtc_csrb_bits) },
|
| 123 | { HRDATADF (CSRC, wtc_csrc, 8, "CSRC", wtc_csrc_bits) },
|
| 124 | { HRDATADF (CSRD, wtc_csrd, 8, "CSRD", wtc_csrd_bits) },
|
| 125 | { HRDATADF (MODE, wtc_mode, 8, "Watch Mode", wtc_mode_bits) },
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 126 | { NULL }
|
| 127 | };
|
| 128 |
|
| 129 | MTAB wtc_mod[] = {
|
Mark Pizzolato | 28b9055 | 2013-02-02 16:29:38 -0800 | [diff] [blame] | 130 | { MTAB_XTD|MTAB_VDV, 0, "TIME", "TIME={VMS|STD}", &wtc_set, &wtc_show, NULL, "Display watch time mode" },
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 131 | { 0 }
|
| 132 | };
|
| 133 |
|
Mark Pizzolato | 19d30d9 | 2013-08-21 13:54:00 -0700 | [diff] [blame] | 134 | /* debugging bitmaps */
|
| 135 | #define DBG_REG 0x0001 /* trace read/write registers */
|
| 136 |
|
| 137 | DEBTAB wtc_debug[] = {
|
| 138 | {"REG", DBG_REG},
|
| 139 | {0}
|
| 140 | };
|
| 141 |
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 142 | DEVICE wtc_dev = {
|
| 143 | "WTC", &wtc_unit, wtc_reg, wtc_mod,
|
| 144 | 1, 16, 16, 1, 16, 8,
|
| 145 | NULL, NULL, &wtc_reset,
|
| 146 | NULL, NULL, NULL,
|
Mark Pizzolato | 19d30d9 | 2013-08-21 13:54:00 -0700 | [diff] [blame] | 147 | NULL, DEV_DEBUG, 0, wtc_debug, NULL, NULL, &wtc_help, NULL, NULL,
|
Mark Pizzolato | cbe1114 | 2013-01-25 12:04:25 -0800 | [diff] [blame] | 148 | &wtc_description
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 149 | };
|
Mark Pizzolato | 19d30d9 | 2013-08-21 13:54:00 -0700 | [diff] [blame] | 150 |
|
| 151 | /* Register names for Debug tracing */
|
Mark Pizzolato | 5531ccb | 2016-05-15 15:25:33 -0700 | [diff] [blame] | 152 | static const char *wtc_regs[] =
|
Mark Pizzolato | 19d30d9 | 2013-08-21 13:54:00 -0700 | [diff] [blame] | 153 | {"SEC ", "SECA", "MIN ", "MINA",
|
| 154 | "HR ", "HRA ", "DOW ", "DOM ",
|
| 155 | "MON ", "YEAR", "CSRA", "CSRB",
|
| 156 | "CSRC", "CSRD" };
|
| 157 |
|
| 158 |
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 159 |
|
| 160 | int32 wtc_rd (int32 pa)
|
| 161 | {
|
| 162 | int32 rg = (pa >> 1) & 0xF;
|
| 163 | int32 val = 0;
|
| 164 | time_t curr;
|
Mark Pizzolato | 39d2944 | 2016-11-16 23:50:53 -0800 | [diff] [blame] | 165 | struct timespec now;
|
Mark Pizzolato | b4b4a88 | 2016-04-13 12:12:29 -0700 | [diff] [blame] | 166 | static int mdays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
Mark Pizzolato | 50cf91d | 2012-12-18 09:52:14 -0800 | [diff] [blame] | 167 | struct tm *ctm = NULL;
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 168 |
|
| 169 | if (rg < 10) { /* time reg? */
|
Mark Pizzolato | 39d2944 | 2016-11-16 23:50:53 -0800 | [diff] [blame] | 170 | sim_rtcn_get_time (&now, TMR_CLK);
|
| 171 | curr = now.tv_sec; /* get curr time */
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 172 | if (curr == (time_t) -1) /* error? */
|
| 173 | return 0;
|
| 174 | ctm = localtime (&curr); /* decompose */
|
| 175 | if (ctm == NULL) /* error? */
|
| 176 | return 0;
|
Mark Pizzolato | b4b4a88 | 2016-04-13 12:12:29 -0700 | [diff] [blame] | 177 | if ((wtc_mode == WTC_MODE_VMS) &&
|
| 178 | ((ctm->tm_year % 4) == 0)) { /* Leap Year? */
|
| 179 | if (ctm->tm_mon > 1) { /* Past February? */
|
| 180 | ++ctm->tm_mday; /* Adjust for Leap Day */
|
| 181 | if (ctm->tm_mday > mdays[ctm->tm_mon]) { /* wrap to last day of prior month */
|
| 182 | ++ctm->tm_mon;
|
| 183 | ctm->tm_mday = 1;
|
| 184 | }
|
| 185 | }
|
| 186 | else
|
| 187 | if ((ctm->tm_mon == 1) && /* February 29th? */
|
| 188 | (ctm->tm_mday == 29)) {
|
| 189 | ctm->tm_mon = 2; /* Is March 1 in 1982 */
|
| 190 | ctm->tm_mday = 1;
|
| 191 | }
|
| 192 | }
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 193 | }
|
| 194 |
|
| 195 | switch(rg) {
|
| 196 |
|
| 197 | case 0: /* seconds */
|
| 198 | val = ctm->tm_sec;
|
| 199 | break;
|
| 200 |
|
| 201 | case 2: /* minutes */
|
| 202 | val = ctm->tm_min;
|
| 203 | break;
|
| 204 |
|
| 205 | case 4: /* hours */
|
| 206 | val = ctm->tm_hour;
|
| 207 | break;
|
| 208 |
|
| 209 | case 6: /* day of week */
|
| 210 | val = ctm->tm_wday;
|
| 211 | break;
|
| 212 |
|
| 213 | case 7: /* day of month */
|
| 214 | val = ctm->tm_mday;
|
| 215 | break;
|
| 216 |
|
| 217 | case 8: /* month */
|
Mark Pizzolato | b4b4a88 | 2016-04-13 12:12:29 -0700 | [diff] [blame] | 218 | val = ctm->tm_mon + 1;
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 219 | break;
|
| 220 |
|
| 221 | case 9: /* year */
|
| 222 | if (wtc_mode == WTC_MODE_VMS)
|
| 223 | val = 82; /* always 1982 for VMS */
|
| 224 | else
|
| 225 | val = (int32)(ctm->tm_year % 100);
|
| 226 | break;
|
| 227 |
|
| 228 | case 10: /* CSR A */
|
| 229 | val = wtc_csra;
|
| 230 | break;
|
| 231 |
|
| 232 | case 11: /* CSR B */
|
| 233 | val = wtc_csrb;
|
| 234 | break;
|
| 235 |
|
| 236 | case 12: /* CSR C */
|
| 237 | val = wtc_csrc;
|
| 238 | break;
|
| 239 |
|
| 240 | case 13: /* CSR D */
|
| 241 | val = wtc_csrd & WTC_CSRD_RD;
|
| 242 | break;
|
| 243 | }
|
| 244 |
|
Mark Pizzolato | 19d30d9 | 2013-08-21 13:54:00 -0700 | [diff] [blame] | 245 | sim_debug(DBG_REG, &wtc_dev, "wtc_rd(pa=0x%08X [%s], data=0x%X) ", pa, wtc_regs[rg], val);
|
| 246 | sim_debug_bits(DBG_REG, &wtc_dev, wtc_bitdefs[rg], (uint32)val, (uint32)val, TRUE);
|
| 247 |
|
| 248 | if (rg & 1)
|
| 249 | val = (val << 16); /* word aligned? */
|
| 250 |
|
| 251 | return val;
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 252 | }
|
| 253 |
|
| 254 | void wtc_wr (int32 pa, int32 val, int32 lnt)
|
| 255 | {
|
| 256 | int32 rg = (pa >> 1) & 0xF;
|
Mark Pizzolato | 19d30d9 | 2013-08-21 13:54:00 -0700 | [diff] [blame] | 257 | int32 new_val = val;
|
| 258 |
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 259 | val = val & 0xFF;
|
| 260 |
|
| 261 | switch(rg) {
|
| 262 |
|
| 263 | case 10: /* CSR A */
|
| 264 | val = val & WTC_CSRA_WR;
|
Mark Pizzolato | 19d30d9 | 2013-08-21 13:54:00 -0700 | [diff] [blame] | 265 | new_val = wtc_csra = (wtc_csra & ~WTC_CSRA_WR) | val;
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 266 | break;
|
| 267 |
|
| 268 | case 11: /* CSR B */
|
| 269 | val = val & WTC_CSRB_WR;
|
Mark Pizzolato | 19d30d9 | 2013-08-21 13:54:00 -0700 | [diff] [blame] | 270 | new_val = wtc_csrb = (wtc_csrb & ~WTC_CSRB_WR) | val;
|
| 271 | break;
|
| 272 |
|
| 273 | case 12: /* CSR C */
|
| 274 | break;
|
| 275 |
|
| 276 | case 13: /* CSR D */
|
| 277 | val = val & WTC_CSRD_WR;
|
| 278 | new_val = wtc_csrd = (wtc_csrd & ~WTC_CSRD_WR) | val;
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 279 | break;
|
| 280 | }
|
Mark Pizzolato | 19d30d9 | 2013-08-21 13:54:00 -0700 | [diff] [blame] | 281 |
|
| 282 | sim_debug(DBG_REG, &wtc_dev, "wtc_wr(pa=0x%08X [%s], data=0x%X) ", pa, wtc_regs[rg], val);
|
| 283 | sim_debug_bits(DBG_REG, &wtc_dev, wtc_bitdefs[rg], (uint32)new_val, (uint32)new_val, TRUE);
|
| 284 |
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 285 | }
|
| 286 |
|
| 287 | t_stat wtc_reset (DEVICE *dptr)
|
| 288 | {
|
| 289 | if (sim_switches & SWMASK ('P')) { /* powerup? */
|
| 290 | wtc_csra = 0;
|
| 291 | wtc_csrb = 0;
|
| 292 | wtc_csrc = 0;
|
| 293 | wtc_csrd = 0;
|
| 294 | wtc_mode = WTC_MODE_VMS;
|
| 295 | }
|
| 296 | return SCPE_OK;
|
| 297 | }
|
| 298 |
|
Mark Pizzolato | 5531ccb | 2016-05-15 15:25:33 -0700 | [diff] [blame] | 299 | t_stat wtc_set (UNIT *uptr, int32 val, CONST char *cptr, void *desc)
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 300 | {
|
Mark Pizzolato | 39d2944 | 2016-11-16 23:50:53 -0800 | [diff] [blame] | 301 | if (cptr != NULL)
|
| 302 | wtc_mode = ((strcmp(cptr, "STD") != 0) ? WTC_MODE_VMS : WTC_MODE_STD);
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 303 | return SCPE_OK;
|
| 304 | }
|
| 305 |
|
Mark Pizzolato | 5531ccb | 2016-05-15 15:25:33 -0700 | [diff] [blame] | 306 | t_stat wtc_show (FILE *st, UNIT *uptr, int32 val, CONST void *desc)
|
Mark Pizzolato | b01fa8f | 2012-11-09 12:18:15 -0800 | [diff] [blame] | 307 | {
|
| 308 | fprintf(st, "time=%s", (wtc_mode ? "vms" :"std"));
|
| 309 | return SCPE_OK;
|
| 310 | }
|
| 311 |
|
| 312 | void wtc_set_valid (void)
|
| 313 | {
|
| 314 | wtc_csra |= (2 << WTC_CSRA_V_DV);
|
| 315 | wtc_csrb |= (WTC_CSRB_DM | WTC_CSRB_2412);
|
| 316 | wtc_csrd |= WTC_CSRD_VRT;
|
| 317 | }
|
| 318 |
|
| 319 | void wtc_set_invalid (void)
|
| 320 | {
|
| 321 | wtc_csrd &= ~WTC_CSRD_VRT;
|
| 322 | }
|
Mark Pizzolato | cbe1114 | 2013-01-25 12:04:25 -0800 | [diff] [blame] | 323 |
|
Mark Pizzolato | ef9d1ad | 2015-02-13 06:18:24 -0800 | [diff] [blame] | 324 | t_stat wtc_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr)
|
Mark Pizzolato | e2fb364 | 2013-01-30 07:33:24 -0800 | [diff] [blame] | 325 | {
|
| 326 | fprintf (st, "Watch Chip (WTC)\n\n");
|
| 327 | fprintf (st, "The WTC simulates the MC146818 watch chip. It recognizes the following options:\n\n");
|
Mark Pizzolato | 651780c | 2013-06-03 06:29:01 -0700 | [diff] [blame] | 328 | fprintf (st, " SET WTC TIME=STD standard time mode\n");
|
| 329 | fprintf (st, " SET WTC TIME=VMS VMS time mode\n\n");
|
Mark Pizzolato | e2fb364 | 2013-01-30 07:33:24 -0800 | [diff] [blame] | 330 | fprintf (st, "When running in standard mode the current year reported by the watch chip is\n");
|
| 331 | fprintf (st, "determined by the date/time of the host system. When running in VMS mode the\n");
|
| 332 | fprintf (st, "year is fixed at 1982, which is one of the conditions VMS expects in order to\n");
|
| 333 | fprintf (st, "verify that the time reported is valid. The default mode is VMS.\n\n");
|
| 334 | return SCPE_OK;
|
| 335 | }
|
| 336 |
|
Mark Pizzolato | ef9d1ad | 2015-02-13 06:18:24 -0800 | [diff] [blame] | 337 | const char *wtc_description (DEVICE *dptr)
|
Mark Pizzolato | cbe1114 | 2013-01-25 12:04:25 -0800 | [diff] [blame] | 338 | {
|
| 339 | return "watch chip";
|
| 340 | }
|