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