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