Home | History | Annotate | Line # | Download | only in erc32
erc32.c revision 1.3.2.1
      1 /* This file is part of SIS (SPARC instruction simulator)
      2 
      3    Copyright (C) 1995-2015 Free Software Foundation, Inc.
      4    Contributed by Jiri Gaisler, European Space Agency
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3 of the License, or
      9    (at your option) any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     18 
     19 /* The control space devices */
     20 
     21 #include "config.h"
     22 #include <sys/types.h>
     23 #include <stdio.h>
     24 #include <string.h>
     25 #include <termios.h>
     26 #include <sys/fcntl.h>
     27 #include <sys/file.h>
     28 #include <unistd.h>
     29 #include "sis.h"
     30 #include "sim-config.h"
     31 
     32 extern int      ctrl_c;
     33 extern int32    sis_verbose;
     34 extern int32    sparclite, sparclite_board;
     35 extern int      rom8,wrp,uben;
     36 extern char     uart_dev1[], uart_dev2[];
     37 
     38 int dumbio = 0; /* normal, smart, terminal oriented IO by default */
     39 
     40 /* MEC registers */
     41 #define MEC_START 	0x01f80000
     42 #define MEC_END 	0x01f80100
     43 
     44 /* Memory exception waitstates */
     45 #define MEM_EX_WS 	1
     46 
     47 /* ERC32 always adds one waitstate during RAM std */
     48 #define STD_WS 1
     49 
     50 #ifdef ERRINJ
     51 extern int errmec;
     52 #endif
     53 
     54 #define MEC_WS	0		/* Waitstates per MEC access (0 ws) */
     55 #define MOK	0
     56 
     57 /* MEC register addresses */
     58 
     59 #define MEC_MCR		0x000
     60 #define MEC_SFR  	0x004
     61 #define MEC_PWDR  	0x008
     62 #define MEC_MEMCFG	0x010
     63 #define MEC_IOCR	0x014
     64 #define MEC_WCR		0x018
     65 
     66 #define MEC_MAR0  	0x020
     67 #define MEC_MAR1  	0x024
     68 
     69 #define MEC_SSA1 	0x020
     70 #define MEC_SEA1 	0x024
     71 #define MEC_SSA2 	0x028
     72 #define MEC_SEA2 	0x02C
     73 #define MEC_ISR		0x044
     74 #define MEC_IPR		0x048
     75 #define MEC_IMR 	0x04C
     76 #define MEC_ICR 	0x050
     77 #define MEC_IFR 	0x054
     78 #define MEC_WDOG  	0x060
     79 #define MEC_TRAPD  	0x064
     80 #define MEC_RTC_COUNTER	0x080
     81 #define MEC_RTC_RELOAD	0x080
     82 #define MEC_RTC_SCALER	0x084
     83 #define MEC_GPT_COUNTER	0x088
     84 #define MEC_GPT_RELOAD	0x088
     85 #define MEC_GPT_SCALER	0x08C
     86 #define MEC_TIMER_CTRL	0x098
     87 #define MEC_SFSR	0x0A0
     88 #define MEC_FFAR	0x0A4
     89 #define MEC_ERSR	0x0B0
     90 #define MEC_DBG		0x0C0
     91 #define MEC_TCR		0x0D0
     92 
     93 #define MEC_BRK		0x0C4
     94 #define MEC_WPR		0x0C8
     95 
     96 #define MEC_UARTA	0x0E0
     97 #define MEC_UARTB	0x0E4
     98 #define MEC_UART_CTRL	0x0E8
     99 #define SIM_LOAD	0x0F0
    100 
    101 /* Memory exception causes */
    102 #define PROT_EXC	0x3
    103 #define UIMP_ACC	0x4
    104 #define MEC_ACC		0x6
    105 #define WATCH_EXC	0xa
    106 #define BREAK_EXC	0xb
    107 
    108 /* Size of UART buffers (bytes) */
    109 #define UARTBUF	1024
    110 
    111 /* Number of simulator ticks between flushing the UARTS. 	 */
    112 /* For good performance, keep above 1000			 */
    113 #define UART_FLUSH_TIME	  3000
    114 
    115 /* MEC timer control register bits */
    116 #define TCR_GACR 1
    117 #define TCR_GACL 2
    118 #define TCR_GASE 4
    119 #define TCR_GASL 8
    120 #define TCR_TCRCR 0x100
    121 #define TCR_TCRCL 0x200
    122 #define TCR_TCRSE 0x400
    123 #define TCR_TCRSL 0x800
    124 
    125 /* New uart defines */
    126 #define UART_TX_TIME	1000
    127 #define UART_RX_TIME	1000
    128 #define UARTA_DR	0x1
    129 #define UARTA_SRE	0x2
    130 #define UARTA_HRE	0x4
    131 #define UARTA_OR	0x40
    132 #define UARTA_CLR	0x80
    133 #define UARTB_DR	0x10000
    134 #define UARTB_SRE	0x20000
    135 #define UARTB_HRE	0x40000
    136 #define UARTB_OR	0x400000
    137 #define UARTB_CLR	0x800000
    138 
    139 #define UART_DR		0x100
    140 #define UART_TSE	0x200
    141 #define UART_THE	0x400
    142 
    143 /* MEC registers */
    144 
    145 static char     fname[256];
    146 static int32    find = 0;
    147 static uint32   mec_ssa[2];	/* Write protection start address */
    148 static uint32   mec_sea[2];	/* Write protection end address */
    149 static uint32   mec_wpr[2];	/* Write protection control fields */
    150 static uint32   mec_sfsr;
    151 static uint32   mec_ffar;
    152 static uint32   mec_ipr;
    153 static uint32   mec_imr;
    154 static uint32   mec_isr;
    155 static uint32   mec_icr;
    156 static uint32   mec_ifr;
    157 static uint32   mec_mcr;	/* MEC control register */
    158 static uint32   mec_memcfg;	/* Memory control register */
    159 static uint32   mec_wcr;	/* MEC waitstate register */
    160 static uint32   mec_iocr;	/* MEC IO control register */
    161 static uint32   posted_irq;
    162 static uint32   mec_ersr;	/* MEC error and status register */
    163 static uint32   mec_tcr;	/* MEC test comtrol register */
    164 
    165 static uint32   rtc_counter;
    166 static uint32   rtc_reload;
    167 static uint32   rtc_scaler;
    168 static uint32   rtc_scaler_start;
    169 static uint32   rtc_enabled;
    170 static uint32   rtc_cr;
    171 static uint32   rtc_se;
    172 
    173 static uint32   gpt_counter;
    174 static uint32   gpt_reload;
    175 static uint32   gpt_scaler;
    176 static uint32   gpt_scaler_start;
    177 static uint32   gpt_enabled;
    178 static uint32   gpt_cr;
    179 static uint32   gpt_se;
    180 
    181 static uint32   wdog_scaler;
    182 static uint32   wdog_counter;
    183 static uint32   wdog_rst_delay;
    184 static uint32   wdog_rston;
    185 
    186 enum wdog_type {
    187     init, disabled, enabled, stopped
    188 };
    189 
    190 static enum wdog_type wdog_status;
    191 
    192 
    193 /* ROM size 1024 Kbyte */
    194 #define ROM_SZ	 	0x100000
    195 #define ROM_MASK 	0x0fffff
    196 
    197 /* RAM size 4 Mbyte */
    198 #define RAM_START 	0x02000000
    199 #define RAM_END 	0x02400000
    200 #define RAM_MASK 	0x003fffff
    201 
    202 /* SPARClite boards all seem to have RAM at the same place. */
    203 #define RAM_START_SLITE	0x40000000
    204 #define RAM_END_SLITE 	0x40400000
    205 #define RAM_MASK_SLITE 	0x003fffff
    206 
    207 /* Memory support variables */
    208 
    209 static uint32   mem_ramr_ws;	/* RAM read waitstates */
    210 static uint32   mem_ramw_ws;	/* RAM write waitstates */
    211 static uint32   mem_romr_ws;	/* ROM read waitstates */
    212 static uint32   mem_romw_ws;	/* ROM write waitstates */
    213 static uint32	mem_ramstart;	/* RAM start */
    214 static uint32	mem_ramend;	/* RAM end */
    215 static uint32	mem_rammask;	/* RAM address mask */
    216 static uint32   mem_ramsz;	/* RAM size */
    217 static uint32   mem_romsz;	/* ROM size */
    218 static uint32   mem_accprot;	/* RAM write protection enabled */
    219 static uint32   mem_blockprot;	/* RAM block write protection enabled */
    220 
    221 static unsigned char	romb[ROM_SZ];
    222 static unsigned char	ramb[RAM_END - RAM_START];
    223 
    224 
    225 /* UART support variables */
    226 
    227 static int32    fd1, fd2;	/* file descriptor for input file */
    228 static int32    Ucontrol;	/* UART status register */
    229 static unsigned char aq[UARTBUF], bq[UARTBUF];
    230 static int32    anum, aind = 0;
    231 static int32    bnum, bind = 0;
    232 static char     wbufa[UARTBUF], wbufb[UARTBUF];
    233 static unsigned wnuma;
    234 static unsigned wnumb;
    235 static FILE    *f1in, *f1out, *f2in, *f2out;
    236 static struct termios ioc1, ioc2, iocold1, iocold2;
    237 static int      f1open = 0, f2open = 0;
    238 
    239 static char     uarta_sreg, uarta_hreg, uartb_sreg, uartb_hreg;
    240 static uint32   uart_stat_reg;
    241 static uint32   uarta_data, uartb_data;
    242 
    243 #ifdef ERA
    244 int era = 0;
    245 int erareg;
    246 #endif
    247 
    248 /* Forward declarations */
    249 
    250 static void	decode_ersr (void);
    251 #ifdef ERRINJ
    252 static void	iucomperr (void);
    253 #endif
    254 static void	mecparerror (void);
    255 static void	decode_memcfg (void);
    256 static void	decode_wcr (void);
    257 static void	decode_mcr (void);
    258 static void	close_port (void);
    259 static void	mec_reset (void);
    260 static void	mec_intack (int32 level);
    261 static void	chk_irq (void);
    262 static void	mec_irq (int32 level);
    263 static void	set_sfsr (uint32 fault, uint32 addr,
    264 			  uint32 asi, uint32 read);
    265 static int32	mec_read (uint32 addr, uint32 asi, uint32 *data);
    266 static int	mec_write (uint32 addr, uint32 data);
    267 static void	port_init (void);
    268 static uint32	read_uart (uint32 addr);
    269 static void	write_uart (uint32 addr, uint32 data);
    270 static void	flush_uart (void);
    271 static void	uarta_tx (void);
    272 static void	uartb_tx (void);
    273 static void	uart_rx (caddr_t arg);
    274 static void	uart_intr (caddr_t arg);
    275 static void	uart_irq_start (void);
    276 static void	wdog_intr (caddr_t arg);
    277 static void	wdog_start (void);
    278 static void	rtc_intr (caddr_t arg);
    279 static void	rtc_start (void);
    280 static uint32	rtc_counter_read (void);
    281 static void	rtc_scaler_set (uint32 val);
    282 static void	rtc_reload_set (uint32 val);
    283 static void	gpt_intr (caddr_t arg);
    284 static void	gpt_start (void);
    285 static uint32	gpt_counter_read (void);
    286 static void	gpt_scaler_set (uint32 val);
    287 static void	gpt_reload_set (uint32 val);
    288 static void	timer_ctrl (uint32 val);
    289 static unsigned char *
    290 		get_mem_ptr (uint32 addr, uint32 size);
    291 static void	store_bytes (unsigned char *mem, uint32 waddr,
    292 			uint32 *data, int sz, int32 *ws);
    293 
    294 extern int	ext_irl;
    295 
    296 
    297 /* One-time init */
    298 
    299 void
    300 init_sim()
    301 {
    302     port_init();
    303 }
    304 
    305 /* Power-on reset init */
    306 
    307 void
    308 reset()
    309 {
    310     mec_reset();
    311     uart_irq_start();
    312     wdog_start();
    313 }
    314 
    315 static void
    316 decode_ersr()
    317 {
    318     if (mec_ersr & 0x01) {
    319 	if (!(mec_mcr & 0x20)) {
    320 	    if (mec_mcr & 0x40) {
    321 	        sys_reset();
    322 	        mec_ersr = 0x8000;
    323 	        if (sis_verbose)
    324 	            printf("Error manager reset - IU in error mode\n");
    325 	    } else {
    326 	        sys_halt();
    327 	        mec_ersr |= 0x2000;
    328 	        if (sis_verbose)
    329 	            printf("Error manager halt - IU in error mode\n");
    330 	    }
    331 	} else
    332 	    mec_irq(1);
    333     }
    334     if (mec_ersr & 0x04) {
    335 	if (!(mec_mcr & 0x200)) {
    336 	    if (mec_mcr & 0x400) {
    337 	        sys_reset();
    338 	        mec_ersr = 0x8000;
    339 	        if (sis_verbose)
    340 	            printf("Error manager reset - IU comparison error\n");
    341 	    } else {
    342 	        sys_halt();
    343 	        mec_ersr |= 0x2000;
    344 	        if (sis_verbose)
    345 	            printf("Error manager halt - IU comparison error\n");
    346 	    }
    347 	} else
    348 	    mec_irq(1);
    349     }
    350     if (mec_ersr & 0x20) {
    351 	if (!(mec_mcr & 0x2000)) {
    352 	    if (mec_mcr & 0x4000) {
    353 	        sys_reset();
    354 	        mec_ersr = 0x8000;
    355 	        if (sis_verbose)
    356 	            printf("Error manager reset - MEC hardware error\n");
    357 	    } else {
    358 	        sys_halt();
    359 	        mec_ersr |= 0x2000;
    360 	        if (sis_verbose)
    361 	            printf("Error manager halt - MEC hardware error\n");
    362 	    }
    363 	} else
    364 	    mec_irq(1);
    365     }
    366 }
    367 
    368 #ifdef ERRINJ
    369 static void
    370 iucomperr()
    371 {
    372     mec_ersr |= 0x04;
    373     decode_ersr();
    374 }
    375 #endif
    376 
    377 static void
    378 mecparerror()
    379 {
    380     mec_ersr |= 0x20;
    381     decode_ersr();
    382 }
    383 
    384 
    385 /* IU error mode manager */
    386 
    387 void
    388 error_mode(pc)
    389     uint32          pc;
    390 {
    391 
    392     mec_ersr |= 0x1;
    393     decode_ersr();
    394 }
    395 
    396 
    397 /* Check memory settings */
    398 
    399 static void
    400 decode_memcfg()
    401 {
    402     if (rom8) mec_memcfg &= ~0x20000;
    403     else mec_memcfg |= 0x20000;
    404 
    405     mem_ramsz = (256 * 1024) << ((mec_memcfg >> 10) & 7);
    406     mem_romsz = (128 * 1024) << ((mec_memcfg >> 18) & 7);
    407 
    408     if (sparclite_board) {
    409 	mem_ramstart = RAM_START_SLITE;
    410 	mem_ramend = RAM_END_SLITE;
    411 	mem_rammask = RAM_MASK_SLITE;
    412     }
    413     else {
    414 	mem_ramstart = RAM_START;
    415 	mem_ramend = RAM_END;
    416 	mem_rammask = RAM_MASK;
    417     }
    418     if (sis_verbose)
    419 	printf("RAM start: 0x%x, RAM size: %d K, ROM size: %d K\n",
    420 	       mem_ramstart, mem_ramsz >> 10, mem_romsz >> 10);
    421 }
    422 
    423 static void
    424 decode_wcr()
    425 {
    426     mem_ramr_ws = mec_wcr & 3;
    427     mem_ramw_ws = (mec_wcr >> 2) & 3;
    428     mem_romr_ws = (mec_wcr >> 4) & 0x0f;
    429     if (rom8) {
    430     	if (mem_romr_ws > 0 )  mem_romr_ws--;
    431 	mem_romr_ws = 5 + (4*mem_romr_ws);
    432     }
    433     mem_romw_ws = (mec_wcr >> 8) & 0x0f;
    434     if (sis_verbose)
    435 	printf("Waitstates = RAM read: %d, RAM write: %d, ROM read: %d, ROM write: %d\n",
    436 	       mem_ramr_ws, mem_ramw_ws, mem_romr_ws, mem_romw_ws);
    437 }
    438 
    439 static void
    440 decode_mcr()
    441 {
    442     mem_accprot = (mec_wpr[0] | mec_wpr[1]);
    443     mem_blockprot = (mec_mcr >> 3) & 1;
    444     if (sis_verbose && mem_accprot)
    445 	printf("Memory block write protection enabled\n");
    446     if (mec_mcr & 0x08000) {
    447 	mec_ersr |= 0x20;
    448 	decode_ersr();
    449     }
    450     if (sis_verbose && (mec_mcr & 2))
    451 	printf("Software reset enabled\n");
    452     if (sis_verbose && (mec_mcr & 1))
    453 	printf("Power-down mode enabled\n");
    454 }
    455 
    456 /* Flush ports when simulator stops */
    457 
    458 void
    459 sim_halt()
    460 {
    461 #ifdef FAST_UART
    462     flush_uart();
    463 #endif
    464 }
    465 
    466 int
    467 sim_stop(SIM_DESC sd)
    468 {
    469   ctrl_c = 1;
    470   return 1;
    471 }
    472 
    473 static void
    474 close_port()
    475 {
    476     if (f1open && f1in != stdin)
    477 	fclose(f1in);
    478     if (f2open && f2in != stdin)
    479 	fclose(f2in);
    480 }
    481 
    482 void
    483 exit_sim()
    484 {
    485     close_port();
    486 }
    487 
    488 static void
    489 mec_reset()
    490 {
    491     int             i;
    492 
    493     find = 0;
    494     for (i = 0; i < 2; i++)
    495 	mec_ssa[i] = mec_sea[i] = mec_wpr[i] = 0;
    496     mec_mcr = 0x01350014;
    497     mec_iocr = 0;
    498     mec_sfsr = 0x078;
    499     mec_ffar = 0;
    500     mec_ipr = 0;
    501     mec_imr = 0x7ffe;
    502     mec_isr = 0;
    503     mec_icr = 0;
    504     mec_ifr = 0;
    505     mec_memcfg = 0x10000;
    506     mec_wcr = -1;
    507     mec_ersr = 0;		/* MEC error and status register */
    508     mec_tcr = 0;		/* MEC test comtrol register */
    509 
    510     decode_memcfg();
    511     decode_wcr();
    512     decode_mcr();
    513 
    514     posted_irq = 0;
    515     wnuma = wnumb = 0;
    516     anum = aind = bnum = bind = 0;
    517 
    518     uart_stat_reg = UARTA_SRE | UARTA_HRE | UARTB_SRE | UARTB_HRE;
    519     uarta_data = uartb_data = UART_THE | UART_TSE;
    520 
    521     rtc_counter = 0xffffffff;
    522     rtc_reload = 0xffffffff;
    523     rtc_scaler = 0xff;
    524     rtc_enabled = 0;
    525     rtc_cr = 0;
    526     rtc_se = 0;
    527 
    528     gpt_counter = 0xffffffff;
    529     gpt_reload = 0xffffffff;
    530     gpt_scaler = 0xffff;
    531     gpt_enabled = 0;
    532     gpt_cr = 0;
    533     gpt_se = 0;
    534 
    535     wdog_scaler = 255;
    536     wdog_rst_delay = 255;
    537     wdog_counter = 0xffff;
    538     wdog_rston = 0;
    539     wdog_status = init;
    540 
    541 #ifdef ERA
    542     erareg = 0;
    543 #endif
    544 
    545 }
    546 
    547 
    548 
    549 static void
    550 mec_intack(level)
    551     int32           level;
    552 {
    553     int             irq_test;
    554 
    555     if (sis_verbose)
    556 	printf("interrupt %d acknowledged\n", level);
    557     irq_test = mec_tcr & 0x80000;
    558     if ((irq_test) && (mec_ifr & (1 << level)))
    559 	mec_ifr &= ~(1 << level);
    560     else
    561 	mec_ipr &= ~(1 << level);
    562    chk_irq();
    563 }
    564 
    565 static void
    566 chk_irq()
    567 {
    568     int32           i;
    569     uint32          itmp;
    570     int		    old_irl;
    571 
    572     old_irl = ext_irl;
    573     if (mec_tcr & 0x80000) itmp = mec_ifr;
    574     else itmp  = 0;
    575     itmp = ((mec_ipr | itmp) & ~mec_imr) & 0x0fffe;
    576     ext_irl = 0;
    577     if (itmp != 0) {
    578 	for (i = 15; i > 0; i--) {
    579 	    if (((itmp >> i) & 1) != 0) {
    580 		if ((sis_verbose) && (i > old_irl))
    581 		    printf("IU irl: %d\n", i);
    582 		ext_irl = i;
    583 	        set_int(i, mec_intack, i);
    584 		break;
    585 	    }
    586 	}
    587     }
    588 }
    589 
    590 static void
    591 mec_irq(level)
    592     int32           level;
    593 {
    594     mec_ipr |= (1 << level);
    595     chk_irq();
    596 }
    597 
    598 static void
    599 set_sfsr(fault, addr, asi, read)
    600     uint32          fault;
    601     uint32          addr;
    602     uint32          asi;
    603     uint32          read;
    604 {
    605     if ((asi == 0xa) || (asi == 0xb)) {
    606 	mec_ffar = addr;
    607 	mec_sfsr = (fault << 3) | (!read << 15);
    608 	mec_sfsr |= ((mec_sfsr & 1) ^ 1) | (mec_sfsr & 1);
    609 	switch (asi) {
    610 	case 0xa:
    611 	    mec_sfsr |= 0x0004;
    612 	    break;
    613 	case 0xb:
    614 	    mec_sfsr |= 0x1004;
    615 	    break;
    616 	}
    617     }
    618 }
    619 
    620 static int32
    621 mec_read(addr, asi, data)
    622     uint32          addr;
    623     uint32          asi;
    624     uint32         *data;
    625 {
    626 
    627     switch (addr & 0x0ff) {
    628 
    629     case MEC_MCR:		/* 0x00 */
    630 	*data = mec_mcr;
    631 	break;
    632 
    633     case MEC_MEMCFG:		/* 0x10 */
    634 	*data = mec_memcfg;
    635 	break;
    636 
    637     case MEC_IOCR:
    638 	*data = mec_iocr;	/* 0x14 */
    639 	break;
    640 
    641     case MEC_SSA1:		/* 0x20 */
    642 	*data = mec_ssa[0] | (mec_wpr[0] << 23);
    643 	break;
    644     case MEC_SEA1:		/* 0x24 */
    645 	*data = mec_sea[0];
    646 	break;
    647     case MEC_SSA2:		/* 0x28 */
    648 	*data = mec_ssa[1] | (mec_wpr[1] << 23);
    649 	break;
    650     case MEC_SEA2:		/* 0x2c */
    651 	*data = mec_sea[1];
    652 	break;
    653 
    654     case MEC_ISR:		/* 0x44 */
    655 	*data = mec_isr;
    656 	break;
    657 
    658     case MEC_IPR:		/* 0x48 */
    659 	*data = mec_ipr;
    660 	break;
    661 
    662     case MEC_IMR:		/* 0x4c */
    663 	*data = mec_imr;
    664 	break;
    665 
    666     case MEC_IFR:		/* 0x54 */
    667 	*data = mec_ifr;
    668 	break;
    669 
    670     case MEC_RTC_COUNTER:	/* 0x80 */
    671 	*data = rtc_counter_read();
    672 	break;
    673     case MEC_RTC_SCALER:	/* 0x84 */
    674 	if (rtc_enabled)
    675 	    *data = rtc_scaler - (now() - rtc_scaler_start);
    676 	else
    677 	    *data = rtc_scaler;
    678 	break;
    679 
    680     case MEC_GPT_COUNTER:	/* 0x88 */
    681 	*data = gpt_counter_read();
    682 	break;
    683 
    684     case MEC_GPT_SCALER:	/* 0x8c */
    685 	if (rtc_enabled)
    686 	    *data = gpt_scaler - (now() - gpt_scaler_start);
    687 	else
    688 	    *data = gpt_scaler;
    689 	break;
    690 
    691 
    692     case MEC_SFSR:		/* 0xA0 */
    693 	*data = mec_sfsr;
    694 	break;
    695 
    696     case MEC_FFAR:		/* 0xA4 */
    697 	*data = mec_ffar;
    698 	break;
    699 
    700     case SIM_LOAD:
    701 	fname[find] = 0;
    702 	if (find == 0)
    703 	    strcpy(fname, "simload");
    704 	find = bfd_load(fname);
    705  	if (find == -1)
    706 	    *data = 0;
    707 	else
    708 	    *data = 1;
    709 	find = 0;
    710 	break;
    711 
    712     case MEC_ERSR:		/* 0xB0 */
    713 	*data = mec_ersr;
    714 	break;
    715 
    716     case MEC_TCR:		/* 0xD0 */
    717 	*data = mec_tcr;
    718 	break;
    719 
    720     case MEC_UARTA:		/* 0xE0 */
    721     case MEC_UARTB:		/* 0xE4 */
    722 	if (asi != 0xb) {
    723 	    set_sfsr(MEC_ACC, addr, asi, 1);
    724 	    return 1;
    725 	}
    726 	*data = read_uart(addr);
    727 	break;
    728 
    729     case MEC_UART_CTRL:		/* 0xE8 */
    730 
    731 	*data = read_uart(addr);
    732 	break;
    733 
    734     case 0xF4:		/* simulator RAM size in bytes */
    735 	*data = 4096*1024;
    736 	break;
    737 
    738     case 0xF8:		/* simulator ROM size in bytes */
    739 	*data = 1024*1024;
    740 	break;
    741 
    742     default:
    743 	set_sfsr(MEC_ACC, addr, asi, 1);
    744 	return 1;
    745 	break;
    746     }
    747     return MOK;
    748 }
    749 
    750 static int
    751 mec_write(addr, data)
    752     uint32          addr;
    753     uint32          data;
    754 {
    755     if (sis_verbose > 1)
    756 	printf("MEC write a: %08x, d: %08x\n",addr,data);
    757     switch (addr & 0x0ff) {
    758 
    759     case MEC_MCR:
    760 	mec_mcr = data;
    761 	decode_mcr();
    762         if (mec_mcr & 0x08000) mecparerror();
    763 	break;
    764 
    765     case MEC_SFR:
    766 	if (mec_mcr & 0x2) {
    767 	    sys_reset();
    768 	    mec_ersr = 0x4000;
    769     	    if (sis_verbose)
    770 	    	printf(" Software reset issued\n");
    771 	}
    772 	break;
    773 
    774     case MEC_IOCR:
    775 	mec_iocr = data;
    776         if (mec_iocr & 0xC0C0C0C0) mecparerror();
    777 	break;
    778 
    779     case MEC_SSA1:		/* 0x20 */
    780         if (data & 0xFE000000) mecparerror();
    781 	mec_ssa[0] = data & 0x7fffff;
    782 	mec_wpr[0] = (data >> 23) & 0x03;
    783 	mem_accprot = mec_wpr[0] || mec_wpr[1];
    784 	if (sis_verbose && mec_wpr[0])
    785 	    printf("Segment 1 memory protection enabled (0x02%06x - 0x02%06x)\n",
    786 		   mec_ssa[0] << 2, mec_sea[0] << 2);
    787 	break;
    788     case MEC_SEA1:		/* 0x24 */
    789         if (data & 0xFF800000) mecparerror();
    790 	mec_sea[0] = data & 0x7fffff;
    791 	break;
    792     case MEC_SSA2:		/* 0x28 */
    793         if (data & 0xFE000000) mecparerror();
    794 	mec_ssa[1] = data & 0x7fffff;
    795 	mec_wpr[1] = (data >> 23) & 0x03;
    796 	mem_accprot = mec_wpr[0] || mec_wpr[1];
    797 	if (sis_verbose && mec_wpr[1])
    798 	    printf("Segment 2 memory protection enabled (0x02%06x - 0x02%06x)\n",
    799 		   mec_ssa[1] << 2, mec_sea[1] << 2);
    800 	break;
    801     case MEC_SEA2:		/* 0x2c */
    802         if (data & 0xFF800000) mecparerror();
    803 	mec_sea[1] = data & 0x7fffff;
    804 	break;
    805 
    806     case MEC_UARTA:
    807     case MEC_UARTB:
    808         if (data & 0xFFFFFF00) mecparerror();
    809     case MEC_UART_CTRL:
    810         if (data & 0xFF00FF00) mecparerror();
    811 	write_uart(addr, data);
    812 	break;
    813 
    814     case MEC_GPT_RELOAD:
    815 	gpt_reload_set(data);
    816 	break;
    817 
    818     case MEC_GPT_SCALER:
    819         if (data & 0xFFFF0000) mecparerror();
    820 	gpt_scaler_set(data);
    821 	break;
    822 
    823     case MEC_TIMER_CTRL:
    824         if (data & 0xFFFFF0F0) mecparerror();
    825 	timer_ctrl(data);
    826 	break;
    827 
    828     case MEC_RTC_RELOAD:
    829 	rtc_reload_set(data);
    830 	break;
    831 
    832     case MEC_RTC_SCALER:
    833         if (data & 0xFFFFFF00) mecparerror();
    834 	rtc_scaler_set(data);
    835 	break;
    836 
    837     case MEC_SFSR:		/* 0xA0 */
    838         if (data & 0xFFFF0880) mecparerror();
    839 	mec_sfsr = 0x78;
    840 	break;
    841 
    842     case MEC_ISR:
    843         if (data & 0xFFFFE000) mecparerror();
    844 	mec_isr = data;
    845 	break;
    846 
    847     case MEC_IMR:		/* 0x4c */
    848 
    849         if (data & 0xFFFF8001) mecparerror();
    850 	mec_imr = data & 0x7ffe;
    851 	chk_irq();
    852 	break;
    853 
    854     case MEC_ICR:		/* 0x50 */
    855 
    856         if (data & 0xFFFF0001) mecparerror();
    857 	mec_ipr &= ~data & 0x0fffe;
    858 	chk_irq();
    859 	break;
    860 
    861     case MEC_IFR:		/* 0x54 */
    862 
    863         if (mec_tcr & 0x080000) {
    864             if (data & 0xFFFF0001) mecparerror();
    865 	    mec_ifr = data & 0xfffe;
    866 	    chk_irq();
    867 	}
    868 	break;
    869     case SIM_LOAD:
    870 	fname[find++] = (char) data;
    871 	break;
    872 
    873 
    874     case MEC_MEMCFG:		/* 0x10 */
    875         if (data & 0xC0E08000) mecparerror();
    876 	mec_memcfg = data;
    877 	decode_memcfg();
    878 	if (mec_memcfg & 0xc0e08000)
    879 	    mecparerror();
    880 	break;
    881 
    882     case MEC_WCR:		/* 0x18 */
    883 	mec_wcr = data;
    884 	decode_wcr();
    885 	break;
    886 
    887     case MEC_ERSR:		/* 0xB0 */
    888 	if (mec_tcr & 0x100000)
    889             if (data & 0xFFFFEFC0) mecparerror();
    890 	    mec_ersr = data & 0x103f;
    891 	break;
    892 
    893     case MEC_TCR:		/* 0xD0 */
    894         if (data & 0xFFE1FFC0) mecparerror();
    895 	mec_tcr = data & 0x1e003f;
    896 	break;
    897 
    898     case MEC_WDOG:		/* 0x60 */
    899 	wdog_scaler = (data >> 16) & 0x0ff;
    900 	wdog_counter = data & 0x0ffff;
    901 	wdog_rst_delay = data >> 24;
    902 	wdog_rston = 0;
    903 	if (wdog_status == stopped)
    904 	    wdog_start();
    905 	wdog_status = enabled;
    906 	break;
    907 
    908     case MEC_TRAPD:		/* 0x64 */
    909 	if (wdog_status == init) {
    910 	    wdog_status = disabled;
    911 	    if (sis_verbose)
    912 		printf("Watchdog disabled\n");
    913 	}
    914 	break;
    915 
    916     case MEC_PWDR:
    917 	if (mec_mcr & 1)
    918 	    wait_for_irq();
    919 	break;
    920 
    921     default:
    922 	set_sfsr(MEC_ACC, addr, 0xb, 0);
    923 	return 1;
    924 	break;
    925     }
    926     return MOK;
    927 }
    928 
    929 
    930 /* MEC UARTS */
    931 
    932 static int      ifd1 = -1, ifd2 = -1, ofd1 = -1, ofd2 = -1;
    933 
    934 void
    935 init_stdio()
    936 {
    937     if (dumbio)
    938         return; /* do nothing */
    939     if (!ifd1)
    940 	tcsetattr(0, TCSANOW, &ioc1);
    941     if (!ifd2)
    942 	tcsetattr(0, TCSANOW, &ioc2);
    943 }
    944 
    945 void
    946 restore_stdio()
    947 {
    948     if (dumbio)
    949         return; /* do nothing */
    950     if (!ifd1)
    951 	tcsetattr(0, TCSANOW, &iocold1);
    952     if (!ifd2)
    953 	tcsetattr(0, TCSANOW, &iocold2);
    954 }
    955 
    956 #define DO_STDIO_READ( _fd_, _buf_, _len_ )          \
    957              ( dumbio                                \
    958                ? (0) /* no bytes read, no delay */   \
    959                : read( _fd_, _buf_, _len_ ) )
    960 
    961 
    962 static void
    963 port_init()
    964 {
    965 
    966     if (uben) {
    967     f2in = stdin;
    968     f1in = NULL;
    969     f2out = stdout;
    970     f1out = NULL;
    971     } else {
    972     f1in = stdin;
    973     f2in = NULL;
    974     f1out = stdout;
    975     f2out = NULL;
    976     }
    977     if (uart_dev1[0] != 0)
    978 	if ((fd1 = open(uart_dev1, O_RDWR | O_NONBLOCK)) < 0) {
    979 	    printf("Warning, couldn't open output device %s\n", uart_dev1);
    980 	} else {
    981 	    if (sis_verbose)
    982 		printf("serial port A on %s\n", uart_dev1);
    983 	    f1in = f1out = fdopen(fd1, "r+");
    984 	    setbuf(f1out, NULL);
    985 	    f1open = 1;
    986 	}
    987     if (f1in) ifd1 = fileno(f1in);
    988     if (ifd1 == 0) {
    989 	if (sis_verbose)
    990 	    printf("serial port A on stdin/stdout\n");
    991         if (!dumbio) {
    992             tcgetattr(ifd1, &ioc1);
    993             iocold1 = ioc1;
    994             ioc1.c_lflag &= ~(ICANON | ECHO);
    995             ioc1.c_cc[VMIN] = 0;
    996             ioc1.c_cc[VTIME] = 0;
    997         }
    998 	f1open = 1;
    999     }
   1000 
   1001     if (f1out) {
   1002 	ofd1 = fileno(f1out);
   1003     	if (!dumbio && ofd1 == 1) setbuf(f1out, NULL);
   1004     }
   1005 
   1006     if (uart_dev2[0] != 0)
   1007 	if ((fd2 = open(uart_dev2, O_RDWR | O_NONBLOCK)) < 0) {
   1008 	    printf("Warning, couldn't open output device %s\n", uart_dev2);
   1009 	} else {
   1010 	    if (sis_verbose)
   1011 		printf("serial port B on %s\n", uart_dev2);
   1012 	    f2in = f2out = fdopen(fd2, "r+");
   1013 	    setbuf(f2out, NULL);
   1014 	    f2open = 1;
   1015 	}
   1016     if (f2in)  ifd2 = fileno(f2in);
   1017     if (ifd2 == 0) {
   1018 	if (sis_verbose)
   1019 	    printf("serial port B on stdin/stdout\n");
   1020         if (!dumbio) {
   1021             tcgetattr(ifd2, &ioc2);
   1022             iocold2 = ioc2;
   1023             ioc2.c_lflag &= ~(ICANON | ECHO);
   1024             ioc2.c_cc[VMIN] = 0;
   1025             ioc2.c_cc[VTIME] = 0;
   1026         }
   1027 	f2open = 1;
   1028     }
   1029 
   1030     if (f2out) {
   1031 	ofd2 = fileno(f2out);
   1032         if (!dumbio && ofd2 == 1) setbuf(f2out, NULL);
   1033     }
   1034 
   1035     wnuma = wnumb = 0;
   1036 
   1037 }
   1038 
   1039 static uint32
   1040 read_uart(addr)
   1041     uint32          addr;
   1042 {
   1043 
   1044     unsigned        tmp;
   1045 
   1046     tmp = 0;
   1047     switch (addr & 0xff) {
   1048 
   1049     case 0xE0:			/* UART 1 */
   1050 #ifndef _WIN32
   1051 #ifdef FAST_UART
   1052 
   1053 	if (aind < anum) {
   1054 	    if ((aind + 1) < anum)
   1055 		mec_irq(4);
   1056 	    return (0x700 | (uint32) aq[aind++]);
   1057 	} else {
   1058 	    if (f1open) {
   1059 	        anum = DO_STDIO_READ(ifd1, aq, UARTBUF);
   1060 	    }
   1061 	    if (anum > 0) {
   1062 		aind = 0;
   1063 		if ((aind + 1) < anum)
   1064 		    mec_irq(4);
   1065 		return (0x700 | (uint32) aq[aind++]);
   1066 	    } else {
   1067 		return (0x600 | (uint32) aq[aind]);
   1068 	    }
   1069 
   1070 	}
   1071 #else
   1072 	tmp = uarta_data;
   1073 	uarta_data &= ~UART_DR;
   1074 	uart_stat_reg &= ~UARTA_DR;
   1075 	return tmp;
   1076 #endif
   1077 #else
   1078 	return 0;
   1079 #endif
   1080 	break;
   1081 
   1082     case 0xE4:			/* UART 2 */
   1083 #ifndef _WIN32
   1084 #ifdef FAST_UART
   1085 	if (bind < bnum) {
   1086 	    if ((bind + 1) < bnum)
   1087 		mec_irq(5);
   1088 	    return (0x700 | (uint32) bq[bind++]);
   1089 	} else {
   1090 	    if (f2open) {
   1091 		bnum = DO_STDIO_READ(ifd2, bq, UARTBUF);
   1092 	    }
   1093 	    if (bnum > 0) {
   1094 		bind = 0;
   1095 		if ((bind + 1) < bnum)
   1096 		    mec_irq(5);
   1097 		return (0x700 | (uint32) bq[bind++]);
   1098 	    } else {
   1099 		return (0x600 | (uint32) bq[bind]);
   1100 	    }
   1101 
   1102 	}
   1103 #else
   1104 	tmp = uartb_data;
   1105 	uartb_data &= ~UART_DR;
   1106 	uart_stat_reg &= ~UARTB_DR;
   1107 	return tmp;
   1108 #endif
   1109 #else
   1110 	return 0;
   1111 #endif
   1112 	break;
   1113 
   1114     case 0xE8:			/* UART status register	 */
   1115 #ifndef _WIN32
   1116 #ifdef FAST_UART
   1117 
   1118 	Ucontrol = 0;
   1119 	if (aind < anum) {
   1120 	    Ucontrol |= 0x00000001;
   1121 	} else {
   1122 	    if (f1open) {
   1123 	        anum = DO_STDIO_READ(ifd1, aq, UARTBUF);
   1124             }
   1125 	    if (anum > 0) {
   1126 		Ucontrol |= 0x00000001;
   1127 		aind = 0;
   1128 		mec_irq(4);
   1129 	    }
   1130 	}
   1131 	if (bind < bnum) {
   1132 	    Ucontrol |= 0x00010000;
   1133 	} else {
   1134 	    if (f2open) {
   1135 		bnum = DO_STDIO_READ(ifd2, bq, UARTBUF);
   1136 	    }
   1137 	    if (bnum > 0) {
   1138 		Ucontrol |= 0x00010000;
   1139 		bind = 0;
   1140 		mec_irq(5);
   1141 	    }
   1142 	}
   1143 
   1144 	Ucontrol |= 0x00060006;
   1145 	return Ucontrol;
   1146 #else
   1147 	return uart_stat_reg;
   1148 #endif
   1149 #else
   1150 	return 0x00060006;
   1151 #endif
   1152 	break;
   1153     default:
   1154 	if (sis_verbose)
   1155 	    printf("Read from unimplemented MEC register (%x)\n", addr);
   1156 
   1157     }
   1158     return 0;
   1159 }
   1160 
   1161 static void
   1162 write_uart(addr, data)
   1163     uint32          addr;
   1164     uint32          data;
   1165 {
   1166     unsigned char   c;
   1167 
   1168     c = (unsigned char) data;
   1169     switch (addr & 0xff) {
   1170 
   1171     case 0xE0:			/* UART A */
   1172 #ifdef FAST_UART
   1173 	if (f1open) {
   1174 	    if (wnuma < UARTBUF)
   1175 	        wbufa[wnuma++] = c;
   1176 	    else {
   1177 	        while (wnuma)
   1178 		    wnuma -= fwrite(wbufa, 1, wnuma, f1out);
   1179 	        wbufa[wnuma++] = c;
   1180 	    }
   1181 	}
   1182 	mec_irq(4);
   1183 #else
   1184 	if (uart_stat_reg & UARTA_SRE) {
   1185 	    uarta_sreg = c;
   1186 	    uart_stat_reg &= ~UARTA_SRE;
   1187 	    event(uarta_tx, 0, UART_TX_TIME);
   1188 	} else {
   1189 	    uarta_hreg = c;
   1190 	    uart_stat_reg &= ~UARTA_HRE;
   1191 	}
   1192 #endif
   1193 	break;
   1194 
   1195     case 0xE4:			/* UART B */
   1196 #ifdef FAST_UART
   1197 	if (f2open) {
   1198 	    if (wnumb < UARTBUF)
   1199 		wbufb[wnumb++] = c;
   1200 	    else {
   1201 		while (wnumb)
   1202 		    wnumb -= fwrite(wbufb, 1, wnumb, f2out);
   1203 		wbufb[wnumb++] = c;
   1204 	    }
   1205 	}
   1206 	mec_irq(5);
   1207 #else
   1208 	if (uart_stat_reg & UARTB_SRE) {
   1209 	    uartb_sreg = c;
   1210 	    uart_stat_reg &= ~UARTB_SRE;
   1211 	    event(uartb_tx, 0, UART_TX_TIME);
   1212 	} else {
   1213 	    uartb_hreg = c;
   1214 	    uart_stat_reg &= ~UARTB_HRE;
   1215 	}
   1216 #endif
   1217 	break;
   1218     case 0xE8:			/* UART status register */
   1219 #ifndef FAST_UART
   1220 	if (data & UARTA_CLR) {
   1221 	    uart_stat_reg &= 0xFFFF0000;
   1222 	    uart_stat_reg |= UARTA_SRE | UARTA_HRE;
   1223 	}
   1224 	if (data & UARTB_CLR) {
   1225 	    uart_stat_reg &= 0x0000FFFF;
   1226 	    uart_stat_reg |= UARTB_SRE | UARTB_HRE;
   1227 	}
   1228 #endif
   1229 	break;
   1230     default:
   1231 	if (sis_verbose)
   1232 	    printf("Write to unimplemented MEC register (%x)\n", addr);
   1233 
   1234     }
   1235 }
   1236 
   1237 static void
   1238 flush_uart()
   1239 {
   1240     while (wnuma && f1open)
   1241 	wnuma -= fwrite(wbufa, 1, wnuma, f1out);
   1242     while (wnumb && f2open)
   1243 	wnumb -= fwrite(wbufb, 1, wnumb, f2out);
   1244 }
   1245 
   1246 
   1247 
   1248 static void
   1249 uarta_tx()
   1250 {
   1251 
   1252     while (f1open && fwrite(&uarta_sreg, 1, 1, f1out) != 1);
   1253     if (uart_stat_reg & UARTA_HRE) {
   1254 	uart_stat_reg |= UARTA_SRE;
   1255     } else {
   1256 	uarta_sreg = uarta_hreg;
   1257 	uart_stat_reg |= UARTA_HRE;
   1258 	event(uarta_tx, 0, UART_TX_TIME);
   1259     }
   1260     mec_irq(4);
   1261 }
   1262 
   1263 static void
   1264 uartb_tx()
   1265 {
   1266     while (f2open && fwrite(&uartb_sreg, 1, 1, f2out) != 1);
   1267     if (uart_stat_reg & UARTB_HRE) {
   1268 	uart_stat_reg |= UARTB_SRE;
   1269     } else {
   1270 	uartb_sreg = uartb_hreg;
   1271 	uart_stat_reg |= UARTB_HRE;
   1272 	event(uartb_tx, 0, UART_TX_TIME);
   1273     }
   1274     mec_irq(5);
   1275 }
   1276 
   1277 static void
   1278 uart_rx(arg)
   1279     caddr_t         arg;
   1280 {
   1281     int32           rsize;
   1282     char            rxd;
   1283 
   1284 
   1285     rsize = 0;
   1286     if (f1open)
   1287         rsize = DO_STDIO_READ(ifd1, &rxd, 1);
   1288     if (rsize > 0) {
   1289 	uarta_data = UART_DR | rxd;
   1290 	if (uart_stat_reg & UARTA_HRE)
   1291 	    uarta_data |= UART_THE;
   1292 	if (uart_stat_reg & UARTA_SRE)
   1293 	    uarta_data |= UART_TSE;
   1294 	if (uart_stat_reg & UARTA_DR) {
   1295 	    uart_stat_reg |= UARTA_OR;
   1296 	    mec_irq(7);		/* UART error interrupt */
   1297 	}
   1298 	uart_stat_reg |= UARTA_DR;
   1299 	mec_irq(4);
   1300     }
   1301     rsize = 0;
   1302     if (f2open)
   1303         rsize = DO_STDIO_READ(ifd2, &rxd, 1);
   1304     if (rsize) {
   1305 	uartb_data = UART_DR | rxd;
   1306 	if (uart_stat_reg & UARTB_HRE)
   1307 	    uartb_data |= UART_THE;
   1308 	if (uart_stat_reg & UARTB_SRE)
   1309 	    uartb_data |= UART_TSE;
   1310 	if (uart_stat_reg & UARTB_DR) {
   1311 	    uart_stat_reg |= UARTB_OR;
   1312 	    mec_irq(7);		/* UART error interrupt */
   1313 	}
   1314 	uart_stat_reg |= UARTB_DR;
   1315 	mec_irq(5);
   1316     }
   1317     event(uart_rx, 0, UART_RX_TIME);
   1318 }
   1319 
   1320 static void
   1321 uart_intr(arg)
   1322     caddr_t         arg;
   1323 {
   1324     read_uart(0xE8);		/* Check for UART interrupts every 1000 clk */
   1325     flush_uart();		/* Flush UART ports      */
   1326     event(uart_intr, 0, UART_FLUSH_TIME);
   1327 }
   1328 
   1329 
   1330 static void
   1331 uart_irq_start()
   1332 {
   1333 #ifdef FAST_UART
   1334     event(uart_intr, 0, UART_FLUSH_TIME);
   1335 #else
   1336 #ifndef _WIN32
   1337     event(uart_rx, 0, UART_RX_TIME);
   1338 #endif
   1339 #endif
   1340 }
   1341 
   1342 /* Watch-dog */
   1343 
   1344 static void
   1345 wdog_intr(arg)
   1346     caddr_t         arg;
   1347 {
   1348     if (wdog_status == disabled) {
   1349 	wdog_status = stopped;
   1350     } else {
   1351 
   1352 	if (wdog_counter) {
   1353 	    wdog_counter--;
   1354 	    event(wdog_intr, 0, wdog_scaler + 1);
   1355 	} else {
   1356 	    if (wdog_rston) {
   1357 		printf("Watchdog reset!\n");
   1358 		sys_reset();
   1359 		mec_ersr = 0xC000;
   1360 	    } else {
   1361 		mec_irq(15);
   1362 		wdog_rston = 1;
   1363 		wdog_counter = wdog_rst_delay;
   1364 		event(wdog_intr, 0, wdog_scaler + 1);
   1365 	    }
   1366 	}
   1367     }
   1368 }
   1369 
   1370 static void
   1371 wdog_start()
   1372 {
   1373     event(wdog_intr, 0, wdog_scaler + 1);
   1374     if (sis_verbose)
   1375 	printf("Watchdog started, scaler = %d, counter = %d\n",
   1376 	       wdog_scaler, wdog_counter);
   1377 }
   1378 
   1379 
   1380 /* MEC timers */
   1381 
   1382 
   1383 static void
   1384 rtc_intr(arg)
   1385     caddr_t         arg;
   1386 {
   1387     if (rtc_counter == 0) {
   1388 
   1389 	mec_irq(13);
   1390 	if (rtc_cr)
   1391 	    rtc_counter = rtc_reload;
   1392 	else
   1393 	    rtc_se = 0;
   1394     } else
   1395 	rtc_counter -= 1;
   1396     if (rtc_se) {
   1397 	event(rtc_intr, 0, rtc_scaler + 1);
   1398 	rtc_scaler_start = now();
   1399 	rtc_enabled = 1;
   1400     } else {
   1401 	if (sis_verbose)
   1402 	    printf("RTC stopped\n\r");
   1403 	rtc_enabled = 0;
   1404     }
   1405 }
   1406 
   1407 static void
   1408 rtc_start()
   1409 {
   1410     if (sis_verbose)
   1411 	printf("RTC started (period %d)\n\r", rtc_scaler + 1);
   1412     event(rtc_intr, 0, rtc_scaler + 1);
   1413     rtc_scaler_start = now();
   1414     rtc_enabled = 1;
   1415 }
   1416 
   1417 static uint32
   1418 rtc_counter_read()
   1419 {
   1420     return rtc_counter;
   1421 }
   1422 
   1423 static void
   1424 rtc_scaler_set(val)
   1425     uint32          val;
   1426 {
   1427     rtc_scaler = val & 0x0ff;	/* eight-bit scaler only */
   1428 }
   1429 
   1430 static void
   1431 rtc_reload_set(val)
   1432     uint32          val;
   1433 {
   1434     rtc_reload = val;
   1435 }
   1436 
   1437 static void
   1438 gpt_intr(arg)
   1439     caddr_t         arg;
   1440 {
   1441     if (gpt_counter == 0) {
   1442 	mec_irq(12);
   1443 	if (gpt_cr)
   1444 	    gpt_counter = gpt_reload;
   1445 	else
   1446 	    gpt_se = 0;
   1447     } else
   1448 	gpt_counter -= 1;
   1449     if (gpt_se) {
   1450 	event(gpt_intr, 0, gpt_scaler + 1);
   1451 	gpt_scaler_start = now();
   1452 	gpt_enabled = 1;
   1453     } else {
   1454 	if (sis_verbose)
   1455 	    printf("GPT stopped\n\r");
   1456 	gpt_enabled = 0;
   1457     }
   1458 }
   1459 
   1460 static void
   1461 gpt_start()
   1462 {
   1463     if (sis_verbose)
   1464 	printf("GPT started (period %d)\n\r", gpt_scaler + 1);
   1465     event(gpt_intr, 0, gpt_scaler + 1);
   1466     gpt_scaler_start = now();
   1467     gpt_enabled = 1;
   1468 }
   1469 
   1470 static uint32
   1471 gpt_counter_read()
   1472 {
   1473     return gpt_counter;
   1474 }
   1475 
   1476 static void
   1477 gpt_scaler_set(val)
   1478     uint32          val;
   1479 {
   1480     gpt_scaler = val & 0x0ffff;	/* 16-bit scaler */
   1481 }
   1482 
   1483 static void
   1484 gpt_reload_set(val)
   1485     uint32          val;
   1486 {
   1487     gpt_reload = val;
   1488 }
   1489 
   1490 static void
   1491 timer_ctrl(val)
   1492     uint32          val;
   1493 {
   1494 
   1495     rtc_cr = ((val & TCR_TCRCR) != 0);
   1496     if (val & TCR_TCRCL) {
   1497 	rtc_counter = rtc_reload;
   1498     }
   1499     if (val & TCR_TCRSL) {
   1500     }
   1501     rtc_se = ((val & TCR_TCRSE) != 0);
   1502     if (rtc_se && (rtc_enabled == 0))
   1503 	rtc_start();
   1504 
   1505     gpt_cr = (val & TCR_GACR);
   1506     if (val & TCR_GACL) {
   1507 	gpt_counter = gpt_reload;
   1508     }
   1509     if (val & TCR_GACL) {
   1510     }
   1511     gpt_se = (val & TCR_GASE) >> 2;
   1512     if (gpt_se && (gpt_enabled == 0))
   1513 	gpt_start();
   1514 }
   1515 
   1516 /* Store data in host byte order.  MEM points to the beginning of the
   1517    emulated memory; WADDR contains the index the emulated memory,
   1518    DATA points to words in host byte order to be stored.  SZ contains log(2)
   1519    of the number of bytes to retrieve, and can be 0 (1 byte), 1 (one half-word),
   1520    2 (one word), or 3 (two words); WS should return the number of
   1521    wait-states.  */
   1522 
   1523 static void
   1524 store_bytes (unsigned char *mem, uint32 waddr, uint32 *data, int32 sz,
   1525 	     int32 *ws)
   1526 {
   1527     switch (sz) {
   1528 	case 0:
   1529 	    waddr ^= EBT;
   1530 	    mem[waddr] = *data & 0x0ff;
   1531 	    *ws = mem_ramw_ws + 3;
   1532 	    break;
   1533 	case 1:
   1534 #ifdef HOST_LITTLE_ENDIAN
   1535 	    waddr ^= 2;
   1536 #endif
   1537 	    memcpy (&mem[waddr], data, 2);
   1538 	    *ws = mem_ramw_ws + 3;
   1539 	    break;
   1540 	case 2:
   1541 	    memcpy (&mem[waddr], data, 4);
   1542 	    *ws = mem_ramw_ws;
   1543 	    break;
   1544 	case 3:
   1545 	    memcpy (&mem[waddr], data, 8);
   1546 	    *ws = 2 * mem_ramw_ws + STD_WS;
   1547 	    break;
   1548     }
   1549 }
   1550 
   1551 
   1552 /* Memory emulation */
   1553 
   1554 int
   1555 memory_iread (uint32 addr, uint32 *data, int32 *ws)
   1556 {
   1557     uint32          asi;
   1558     if ((addr >= mem_ramstart) && (addr < (mem_ramstart + mem_ramsz))) {
   1559 	memcpy (data, &ramb[addr & mem_rammask & ~3], 4);
   1560 	*ws = mem_ramr_ws;
   1561 	return 0;
   1562     } else if (addr < mem_romsz) {
   1563 	memcpy (data, &romb[addr & ~3], 4);
   1564 	*ws = mem_romr_ws;
   1565 	return 0;
   1566     }
   1567 
   1568     if (sis_verbose)
   1569 	printf ("Memory exception at %x (illegal address)\n", addr);
   1570     if (sregs.psr & 0x080)
   1571         asi = 9;
   1572     else
   1573         asi = 8;
   1574     set_sfsr (UIMP_ACC, addr, asi, 1);
   1575     *ws = MEM_EX_WS;
   1576     return 1;
   1577 }
   1578 
   1579 int
   1580 memory_read(asi, addr, data, sz, ws)
   1581     int32           asi;
   1582     uint32          addr;
   1583     uint32         *data;
   1584     int32           sz;
   1585     int32          *ws;
   1586 {
   1587     int32           mexc;
   1588 
   1589 #ifdef ERRINJ
   1590     if (errmec) {
   1591 	if (sis_verbose)
   1592 	    printf("Inserted MEC error %d\n",errmec);
   1593 	set_sfsr(errmec, addr, asi, 1);
   1594 	if (errmec == 5) mecparerror();
   1595 	if (errmec == 6) iucomperr();
   1596 	errmec = 0;
   1597 	return 1;
   1598     }
   1599 #endif
   1600 
   1601     if ((addr >= mem_ramstart) && (addr < (mem_ramstart + mem_ramsz))) {
   1602 	memcpy (data, &ramb[addr & mem_rammask & ~3], 4);
   1603 	*ws = mem_ramr_ws;
   1604 	return 0;
   1605     } else if ((addr >= MEC_START) && (addr < MEC_END)) {
   1606 	mexc = mec_read(addr, asi, data);
   1607 	if (mexc) {
   1608 	    set_sfsr(MEC_ACC, addr, asi, 1);
   1609 	    *ws = MEM_EX_WS;
   1610 	} else {
   1611 	    *ws = 0;
   1612 	}
   1613 	return mexc;
   1614 
   1615 #ifdef ERA
   1616 
   1617     } else if (era) {
   1618     	if ((addr < 0x100000) ||
   1619 	    ((addr>= 0x80000000) && (addr < 0x80100000))) {
   1620 	    memcpy (data, &romb[addr & ROM_MASK & ~3], 4);
   1621 	    *ws = 4;
   1622 	    return 0;
   1623 	} else if ((addr >= 0x10000000) &&
   1624 		   (addr < (0x10000000 + (512 << (mec_iocr & 0x0f)))) &&
   1625 		   (mec_iocr & 0x10))  {
   1626 	    *data = erareg;
   1627 	    return 0;
   1628 	}
   1629 
   1630     } else  if (addr < mem_romsz) {
   1631 	memcpy (data, &romb[addr & ~3], 4);
   1632 	*ws = mem_romr_ws;
   1633 	return 0;
   1634 #else
   1635     } else if (addr < mem_romsz) {
   1636 	memcpy (data, &romb[addr & ~3], 4);
   1637 	*ws = mem_romr_ws;
   1638 	return 0;
   1639 #endif
   1640 
   1641     }
   1642 
   1643     if (sis_verbose)
   1644 	printf ("Memory exception at %x (illegal address)\n", addr);
   1645     set_sfsr(UIMP_ACC, addr, asi, 1);
   1646     *ws = MEM_EX_WS;
   1647     return 1;
   1648 }
   1649 
   1650 int
   1651 memory_write(asi, addr, data, sz, ws)
   1652     int32           asi;
   1653     uint32          addr;
   1654     uint32         *data;
   1655     int32           sz;
   1656     int32          *ws;
   1657 {
   1658     uint32          byte_addr;
   1659     uint32          byte_mask;
   1660     uint32          waddr;
   1661     uint32         *ram;
   1662     int32           mexc;
   1663     int             i;
   1664     int             wphit[2];
   1665 
   1666 #ifdef ERRINJ
   1667     if (errmec) {
   1668 	if (sis_verbose)
   1669 	    printf("Inserted MEC error %d\n",errmec);
   1670 	set_sfsr(errmec, addr, asi, 0);
   1671 	if (errmec == 5) mecparerror();
   1672 	if (errmec == 6) iucomperr();
   1673 	errmec = 0;
   1674 	return 1;
   1675     }
   1676 #endif
   1677 
   1678     if ((addr >= mem_ramstart) && (addr < (mem_ramstart + mem_ramsz))) {
   1679 	if (mem_accprot) {
   1680 
   1681 	    waddr = (addr & 0x7fffff) >> 2;
   1682 	    for (i = 0; i < 2; i++)
   1683 		wphit[i] =
   1684 		    (((asi == 0xa) && (mec_wpr[i] & 1)) ||
   1685 		     ((asi == 0xb) && (mec_wpr[i] & 2))) &&
   1686 		    ((waddr >= mec_ssa[i]) && ((waddr | (sz == 3)) < mec_sea[i]));
   1687 
   1688 	    if (((mem_blockprot) && (wphit[0] || wphit[1])) ||
   1689 		((!mem_blockprot) &&
   1690 		 !((mec_wpr[0] && wphit[0]) || (mec_wpr[1] && wphit[1]))
   1691 		 )) {
   1692 		if (sis_verbose)
   1693 		    printf("Memory access protection error at 0x%08x\n", addr);
   1694 		set_sfsr(PROT_EXC, addr, asi, 0);
   1695 		*ws = MEM_EX_WS;
   1696 		return 1;
   1697 	    }
   1698 	}
   1699 	waddr = addr & mem_rammask;
   1700 	store_bytes (ramb, waddr, data, sz, ws);
   1701 	return 0;
   1702     } else if ((addr >= MEC_START) && (addr < MEC_END)) {
   1703 	if ((sz != 2) || (asi != 0xb)) {
   1704 	    set_sfsr(MEC_ACC, addr, asi, 0);
   1705 	    *ws = MEM_EX_WS;
   1706 	    return 1;
   1707 	}
   1708 	mexc = mec_write(addr, *data);
   1709 	if (mexc) {
   1710 	    set_sfsr(MEC_ACC, addr, asi, 0);
   1711 	    *ws = MEM_EX_WS;
   1712 	} else {
   1713 	    *ws = 0;
   1714 	}
   1715 	return mexc;
   1716 
   1717 #ifdef ERA
   1718 
   1719     } else if (era) {
   1720     	if ((erareg & 2) &&
   1721 	((addr < 0x100000) || ((addr >= 0x80000000) && (addr < 0x80100000)))) {
   1722 	    addr &= ROM_MASK;
   1723 	    *ws = sz == 3 ? 8 : 4;
   1724 	    store_bytes (romb, addr, data, sz, ws);
   1725             return 0;
   1726 	} else if ((addr >= 0x10000000) &&
   1727 		   (addr < (0x10000000 + (512 << (mec_iocr & 0x0f)))) &&
   1728 		   (mec_iocr & 0x10))  {
   1729 	    erareg = *data & 0x0e;
   1730 	    return 0;
   1731 	}
   1732 
   1733     } else if ((addr < mem_romsz) && (mec_memcfg & 0x10000) && (wrp) &&
   1734                (((mec_memcfg & 0x20000) && (sz > 1)) ||
   1735 		(!(mec_memcfg & 0x20000) && (sz == 0)))) {
   1736 
   1737 	*ws = mem_romw_ws + 1;
   1738 	if (sz == 3)
   1739 	    *ws += mem_romw_ws + STD_WS;
   1740 	store_bytes (romb, addr, data, sz, ws);
   1741         return 0;
   1742 
   1743 #else
   1744     } else if ((addr < mem_romsz) && (mec_memcfg & 0x10000) && (wrp) &&
   1745                (((mec_memcfg & 0x20000) && (sz > 1)) ||
   1746 		(!(mec_memcfg & 0x20000) && (sz == 0)))) {
   1747 
   1748 	*ws = mem_romw_ws + 1;
   1749 	if (sz == 3)
   1750             *ws += mem_romw_ws + STD_WS;
   1751 	store_bytes (romb, addr, data, sz, ws);
   1752         return 0;
   1753 
   1754 #endif
   1755 
   1756     }
   1757 
   1758     *ws = MEM_EX_WS;
   1759     set_sfsr(UIMP_ACC, addr, asi, 0);
   1760     return 1;
   1761 }
   1762 
   1763 static unsigned char  *
   1764 get_mem_ptr(addr, size)
   1765     uint32          addr;
   1766     uint32          size;
   1767 {
   1768     if ((addr + size) < ROM_SZ) {
   1769 	return &romb[addr];
   1770     } else if ((addr >= mem_ramstart) && ((addr + size) < mem_ramend)) {
   1771 	return &ramb[addr & mem_rammask];
   1772     }
   1773 
   1774 #ifdef ERA
   1775       else if ((era) && ((addr <0x100000) ||
   1776 	((addr >= (unsigned) 0x80000000) && ((addr + size) < (unsigned) 0x80100000)))) {
   1777 	return &romb[addr & ROM_MASK];
   1778     }
   1779 #endif
   1780 
   1781     return (char *) -1;
   1782 }
   1783 
   1784 int
   1785 sis_memory_write(addr, data, length)
   1786     uint32               addr;
   1787     const unsigned char *data;
   1788     uint32               length;
   1789 {
   1790     char           *mem;
   1791 
   1792     if ((mem = get_mem_ptr(addr, length)) == ((char *) -1))
   1793 	return 0;
   1794 
   1795     memcpy(mem, data, length);
   1796     return length;
   1797 }
   1798 
   1799 int
   1800 sis_memory_read(addr, data, length)
   1801     uint32          addr;
   1802     char           *data;
   1803     uint32          length;
   1804 {
   1805     char           *mem;
   1806 
   1807     if ((mem = get_mem_ptr(addr, length)) == ((char *) -1))
   1808 	return 0;
   1809 
   1810     memcpy(data, mem, length);
   1811     return length;
   1812 }
   1813 
   1814 extern struct pstate sregs;
   1815 
   1816 void
   1817 boot_init (void)
   1818 {
   1819     mec_write(MEC_WCR, 0);	/* zero waitstates */
   1820     mec_write(MEC_TRAPD, 0);	/* turn off watch-dog */
   1821     mec_write(MEC_RTC_SCALER, sregs.freq - 1); /* generate 1 MHz RTC tick */
   1822     mec_write(MEC_MEMCFG, (3 << 18) | (4 << 10)); /* 1 MB ROM, 4 MB RAM */
   1823     sregs.wim = 2;
   1824     sregs.psr = 0x110010e0;
   1825     sregs.r[30] = RAM_END;
   1826     sregs.r[14] = sregs.r[30] - 96 * 4;
   1827     mec_mcr |= 1;		/* power-down enabled */
   1828 }
   1829