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