fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
1/*****************************************************************************
2 * pce *
3 *****************************************************************************/
4
5/*****************************************************************************
6 * File name: src/devices/memory.c *
7 * Created: 2000-04-23 by Hampa Hug <hampa@hampa.ch> *
8 * Copyright: (C) 2000-2013 Hampa Hug <hampa@hampa.ch> *
9 *****************************************************************************/
10
11/*****************************************************************************
12 * This program is free software. You can redistribute it and / or modify it *
13 * under the terms of the GNU General Public License version 2 as published *
14 * by the Free Software Foundation. *
15 * *
16 * This program is distributed in the hope that it will be useful, but *
17 * WITHOUT ANY WARRANTY, without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General *
19 * Public License for more details. *
20 *****************************************************************************/
21
22
23#include <stdlib.h>
24#include <string.h>
25
26#include "memory.h"
27
28
29int mem_blk_init (mem_blk_t *blk, unsigned long base, unsigned long size, int alloc)
30{
31 if (alloc) {
32 blk->data = malloc (size + 16);
33 if (blk->data == NULL) {
34 return (1);
35 }
36 }
37 else {
38 blk->data = NULL;
39 }
40
41 blk->get_uint8 = NULL;
42 blk->get_uint16 = NULL;
43 blk->get_uint32 = NULL;
44 blk->set_uint8 = NULL;
45 blk->set_uint16 = NULL;
46 blk->set_uint32 = NULL;
47
48 blk->ext = blk;
49
50 blk->active = 1;
51 blk->readonly = 0;
52 blk->data_del = (blk->data != NULL);
53 blk->addr1 = base;
54 blk->addr2 = base + size - 1;
55 blk->size = size;
56
57 return (0);
58}
59
60mem_blk_t *mem_blk_new (unsigned long base, unsigned long size, int alloc)
61{
62 mem_blk_t *blk;
63
64 blk = (mem_blk_t *) malloc (sizeof (mem_blk_t));
65 if (blk == NULL) {
66 return (NULL);
67 }
68
69 if (mem_blk_init (blk, base, size, alloc)) {
70 free (blk);
71 return (NULL);
72 }
73
74 return (blk);
75}
76
77void mem_blk_free (mem_blk_t *blk)
78{
79 if (blk != NULL) {
80 if (blk->data_del) {
81 free (blk->data);
82 }
83 }
84}
85
86void mem_blk_del (mem_blk_t *blk)
87{
88 if (blk != NULL) {
89 mem_blk_free (blk);
90 free (blk);
91 }
92}
93
94mem_blk_t *mem_blk_clone (const mem_blk_t *blk)
95{
96 mem_blk_t *ret;
97
98 ret = malloc (sizeof (mem_blk_t));
99 if (ret == NULL) {
100 return (NULL);
101 }
102
103 *ret = *blk;
104
105 ret->data_del = 0;
106 ret->active = 1;
107
108 return (ret);
109}
110
111void mem_blk_fix_fct (mem_blk_t *blk)
112{
113 if (blk->data != NULL) {
114 return;
115 }
116
117 if (blk->get_uint8 == NULL) {
118 blk->get_uint8 = (void *) mem_blk_get_uint8_null;
119 }
120
121 if (blk->get_uint16 == NULL) {
122 blk->get_uint16 = (void *) mem_blk_get_uint16_null;
123 }
124
125 if (blk->get_uint32 == NULL) {
126 blk->get_uint32 = (void *) mem_blk_get_uint32_null;
127 }
128
129 if (blk->set_uint8 == NULL) {
130 blk->set_uint8 = (void *) mem_blk_set_uint8_null;
131 }
132
133 if (blk->set_uint16 == NULL) {
134 blk->set_uint16 = (void *) mem_blk_set_uint16_null;
135 }
136
137 if (blk->set_uint32 == NULL) {
138 blk->set_uint32 = (void *) mem_blk_set_uint32_null;
139 }
140}
141
142void mem_blk_set_fget (mem_blk_t *blk, void *ext, void *g8, void *g16, void *g32)
143{
144 blk->ext = ext;
145 blk->get_uint8 = g8;
146 blk->get_uint16 = g16;
147 blk->get_uint32 = g32;
148
149 mem_blk_fix_fct (blk);
150}
151
152void mem_blk_set_fset (mem_blk_t *blk, void *ext, void *s8, void *s16, void *s32)
153{
154 blk->ext = ext;
155 blk->set_uint8 = s8;
156 blk->set_uint16 = s16;
157 blk->set_uint32 = s32;
158
159 mem_blk_fix_fct (blk);
160}
161
162void mem_blk_set_fct (mem_blk_t *blk, void *ext,
163 void *g8, void *g16, void *g32, void *s8, void *s16, void *s32)
164{
165 blk->ext = ext;
166
167 blk->get_uint8 = g8;
168 blk->get_uint16 = g16;
169 blk->get_uint32 = g32;
170
171 blk->set_uint8 = s8;
172 blk->set_uint16 = s16;
173 blk->set_uint32 = s32;
174
175 mem_blk_fix_fct (blk);
176}
177
178void mem_blk_set_ext (mem_blk_t *blk, void *ext)
179{
180 blk->ext = ext;
181}
182
183void mem_blk_clear (mem_blk_t *blk, unsigned char val)
184{
185 if (blk->data != NULL) {
186 memset (blk->data, val, blk->size);
187 }
188}
189
190unsigned char *mem_blk_get_data (mem_blk_t *blk)
191{
192 return (blk->data);
193}
194
195void mem_blk_set_data (mem_blk_t *blk, void *data, int del)
196{
197 if (blk->data_del) {
198 free (blk->data);
199 }
200
201 blk->data = data;
202 blk->data_del = (data != NULL) && del;
203}
204
205int mem_blk_get_active (mem_blk_t *blk)
206{
207 return (blk->active);
208}
209
210void mem_blk_set_active (mem_blk_t *blk, int val)
211{
212 blk->active = (val != 0);
213}
214
215int mem_blk_get_readonly (mem_blk_t *blk)
216{
217 return (blk->readonly);
218}
219
220void mem_blk_set_readonly (mem_blk_t *blk, int val)
221{
222 blk->readonly = (val != 0);
223}
224
225unsigned long mem_blk_get_addr (const mem_blk_t *blk)
226{
227 return (blk->addr1);
228}
229
230void mem_blk_set_addr (mem_blk_t *blk, unsigned long addr)
231{
232 blk->addr1 = addr;
233 blk->addr2 = addr + blk->size - 1;
234}
235
236unsigned long mem_blk_get_size (const mem_blk_t *blk)
237{
238 return (blk->size);
239}
240
241void mem_blk_set_size (mem_blk_t *blk, unsigned long size)
242{
243 blk->size = size;
244 blk->addr2 = blk->addr1 + size - 1;
245}
246
247
248void buf_set_uint8 (void *buf, unsigned long addr, unsigned char val)
249{
250 unsigned char *tmp = (unsigned char *) buf + addr;
251
252 tmp[0] = val;
253}
254
255void buf_set_uint16_be (void *buf, unsigned long addr, unsigned short val)
256{
257 unsigned char *tmp = (unsigned char *) buf + addr;
258
259 tmp[0] = (val >> 8) & 0xff;
260 tmp[1] = val & 0xff;
261}
262
263void buf_set_uint16_le (void *buf, unsigned long addr, unsigned short val)
264{
265 unsigned char *tmp = (unsigned char *) buf + addr;
266
267 tmp[0] = val & 0xff;
268 tmp[1] = (val >> 8) & 0xff;
269}
270
271void buf_set_uint32_be (void *buf, unsigned long addr, unsigned long val)
272{
273 unsigned char *tmp = (unsigned char *) buf + addr;
274
275 tmp[0] = (val >> 24) & 0xff;
276 tmp[1] = (val >> 16) & 0xff;
277 tmp[2] = (val >> 8) & 0xff;
278 tmp[3] = val & 0xff;
279}
280
281void buf_set_uint32_le (void *buf, unsigned long addr, unsigned long val)
282{
283 unsigned char *tmp = (unsigned char *) buf + addr;
284
285 tmp[0] = val & 0xff;
286 tmp[1] = (val >> 8) & 0xff;
287 tmp[2] = (val >> 16) & 0xff;
288 tmp[3] = (val >> 24) & 0xff;
289}
290
291unsigned char buf_get_uint8 (const void *buf, unsigned long addr)
292{
293 const unsigned char *tmp = (const unsigned char *) buf + addr;
294
295 return (tmp[0]);
296}
297
298unsigned short buf_get_uint16_be (const void *buf, unsigned long addr)
299{
300 const unsigned char *tmp = (const unsigned char *) buf + addr;
301 unsigned short ret;
302
303 ret = tmp[0];
304 ret = (ret << 8) | tmp[1];
305
306 return (ret);
307}
308
309unsigned short buf_get_uint16_le (const void *buf, unsigned long addr)
310{
311 const unsigned char *tmp = (const unsigned char *) buf + addr;
312 unsigned short ret;
313
314 ret = tmp[1];
315 ret = (ret << 8) | tmp[0];
316
317 return (ret);
318}
319
320unsigned long buf_get_uint32_be (const void *buf, unsigned long addr)
321{
322 const unsigned char *tmp = (const unsigned char *) buf + addr;
323 unsigned long ret;
324
325 ret = tmp[0];
326 ret = (ret << 8) | tmp[1];
327 ret = (ret << 8) | tmp[2];
328 ret = (ret << 8) | tmp[3];
329
330 return (ret);
331}
332
333unsigned long buf_get_uint32_le (const void *buf, unsigned long addr)
334{
335 const unsigned char *tmp = (const unsigned char *) buf + addr;
336 unsigned long ret;
337
338 ret = tmp[3];
339 ret = (ret << 8) | tmp[2];
340 ret = (ret << 8) | tmp[1];
341 ret = (ret << 8) | tmp[0];
342
343 return (ret);
344}
345
346
347void mem_blk_set_uint8 (mem_blk_t *blk, unsigned long addr, unsigned char val)
348{
349 blk->data[addr] = val;
350}
351
352void mem_blk_set_uint8_null (void *ext, unsigned long addr, unsigned char val)
353{
354}
355
356void mem_blk_set_uint16_be (mem_blk_t *blk, unsigned long addr, unsigned short val)
357{
358 blk->data[addr] = (val >> 8) & 0xff;
359 blk->data[addr + 1] = val & 0xff;
360}
361
362void mem_blk_set_uint16_le (mem_blk_t *blk, unsigned long addr, unsigned short val)
363{
364 blk->data[addr] = val & 0xff;
365 blk->data[addr + 1] = (val >> 8) & 0xff;
366}
367
368void mem_blk_set_uint16_null (void *ext, unsigned long addr, unsigned short val)
369{
370}
371
372void mem_blk_set_uint32_be (mem_blk_t *blk, unsigned long addr, unsigned long val)
373{
374 blk->data[addr] = (val >> 24) & 0xff;
375 blk->data[addr + 1] = (val >> 16) & 0xff;
376 blk->data[addr + 2] = (val >> 8) & 0xff;
377 blk->data[addr + 3] = val & 0xff;
378}
379
380void mem_blk_set_uint32_le (mem_blk_t *blk, unsigned long addr, unsigned long val)
381{
382 blk->data[addr] = val & 0xff;
383 blk->data[addr + 1] = (val >> 8) & 0xff;
384 blk->data[addr + 2] = (val >> 16) & 0xff;
385 blk->data[addr + 3] = (val >> 24) & 0xff;
386}
387
388void mem_blk_set_uint32_null (void *ext, unsigned long addr, unsigned long val)
389{
390}
391
392unsigned char mem_blk_get_uint8 (const mem_blk_t *blk, unsigned long addr)
393{
394 return (blk->data[addr]);
395}
396
397unsigned char mem_blk_get_uint8_null (const void *ext, unsigned long addr)
398{
399 return (0);
400}
401
402unsigned short mem_blk_get_uint16_be (const mem_blk_t *blk, unsigned long addr)
403{
404 unsigned short ret;
405
406 ret = blk->data[addr];
407 ret = (ret << 8) | blk->data[addr + 1];
408
409 return (ret);
410}
411
412unsigned short mem_blk_get_uint16_le (const mem_blk_t *blk, unsigned long addr)
413{
414 unsigned short ret;
415
416 ret = blk->data[addr + 1];
417 ret = (ret << 8) | blk->data[addr];
418
419 return (ret);
420}
421
422unsigned short mem_blk_get_uint16_null (const void *ext, unsigned long addr)
423{
424 return (0);
425}
426
427unsigned long mem_blk_get_uint32_be (const mem_blk_t *blk, unsigned long addr)
428{
429 unsigned long ret;
430
431 ret = blk->data[addr];
432 ret = (ret << 8) | blk->data[addr + 1];
433 ret = (ret << 8) | blk->data[addr + 2];
434 ret = (ret << 8) | blk->data[addr + 3];
435
436 return (ret);
437}
438
439unsigned long mem_blk_get_uint32_le (const mem_blk_t *blk, unsigned long addr)
440{
441 unsigned long ret;
442
443 ret = blk->data[addr + 3];
444 ret = (ret << 8) | blk->data[addr + 2];
445 ret = (ret << 8) | blk->data[addr + 1];
446 ret = (ret << 8) | blk->data[addr];
447
448 return (ret);
449}
450
451unsigned long mem_blk_get_uint32_null (const void *ext, unsigned long addr)
452{
453 return (0);
454}
455
456
457static
458void mem_init_last (memory_t *mem)
459{
460 unsigned i;
461
462 for (i = 0; i < MEM_LAST_CNT; i++) {
463 mem->last[i] = NULL;
464 }
465}
466
467void mem_init (memory_t *mem)
468{
469 mem->cnt = 0;
470 mem->lst = NULL;
471
472 mem_init_last (mem);
473
474 mem->ext = NULL;
475 mem->get_uint8 = NULL;
476 mem->get_uint16 = NULL;
477 mem->get_uint32 = NULL;
478 mem->set_uint8 = NULL;
479 mem->set_uint16 = NULL;
480 mem->set_uint32 = NULL;
481
482 mem->defval = 0xffffffff;
483}
484
485memory_t *mem_new (void)
486{
487 memory_t *mem;
488
489 mem = malloc (sizeof (memory_t));
490 if (mem == NULL) {
491 return (NULL);
492 }
493
494 mem_init (mem);
495
496 return (mem);
497}
498
499void mem_free (memory_t *mem)
500{
501 unsigned i;
502
503 if (mem != NULL) {
504 for (i = 0; i < mem->cnt; i++) {
505 if (mem->lst[i].del) {
506 mem_blk_del (mem->lst[i].blk);
507 }
508 }
509
510 free (mem->lst);
511 }
512}
513
514void mem_del (memory_t *mem)
515{
516 if (mem != NULL) {
517 mem_free (mem);
518 free (mem);
519 }
520}
521
522void mem_set_fct (memory_t *mem, void *ext,
523 void *g8, void *g16, void *g32, void *s8, void *s16, void *s32)
524{
525 mem->ext = ext;
526
527 mem->get_uint8 = g8;
528 mem->get_uint16 = g16;
529 mem->get_uint32 = g32;
530
531 mem->set_uint8 = s8;
532 mem->set_uint16 = s16;
533 mem->set_uint32 = s32;
534}
535
536void mem_set_default (memory_t *mem, unsigned char val)
537{
538 unsigned long tmp;
539
540 tmp = val & 0xff;
541 tmp = (tmp << 8) | tmp;
542 tmp = (tmp << 16) | tmp;
543
544 mem->defval = tmp;
545}
546
547void mem_prt_state (memory_t *mem, FILE *fp)
548{
549 unsigned i;
550 mem_lst_t *lst;
551
552 for (i = 0; i < mem->cnt; i++) {
553 lst = &mem->lst[i];
554
555 fprintf (fp, "BLK %04X: A1=%08lX A2=%08lX S=%08lX RO=%d\n",
556 i, lst->blk->addr1, lst->blk->addr2, lst->blk->size,
557 (lst->blk->readonly != 0)
558 );
559 }
560}
561
562void mem_add_blk (memory_t *mem, mem_blk_t *blk, int del)
563{
564 mem_lst_t *lst;
565
566 if (blk == NULL) {
567 return;
568 }
569
570 lst = realloc (mem->lst, (mem->cnt + 1) * sizeof (mem_lst_t));
571 if (lst == NULL) {
572 return;
573 }
574
575 mem->lst = lst;
576
577 lst += mem->cnt;
578 mem->cnt += 1;
579
580 lst->blk = blk;
581 lst->del = (del != 0);
582
583 mem_init_last (mem);
584}
585
586void mem_rmv_blk (memory_t *mem, const mem_blk_t *blk)
587{
588 unsigned i, j;
589 mem_lst_t *lst;
590
591 i = 0;
592 j = 0;
593 lst = mem->lst;
594
595 while (i < mem->cnt) {
596 if (lst[i].blk != blk) {
597 lst[j++] = lst[i];
598 }
599
600 i += 1;
601 }
602
603 mem->cnt = j;
604
605 mem_init_last (mem);
606}
607
608void mem_rmv_all (memory_t *mem)
609{
610 unsigned i;
611
612 for (i = 0; i < mem->cnt; i++) {
613 if (mem->lst[i].del) {
614 mem_blk_del (mem->lst[i].blk);
615 }
616 }
617
618 mem->cnt = 0;
619
620 mem_init_last (mem);
621}
622
623void mem_move_to_front (memory_t *mem, unsigned long addr)
624{
625 unsigned i;
626 mem_blk_t *blk;
627
628 blk = mem_get_blk (mem, addr);
629
630 if (blk == NULL) {
631 return;
632 }
633
634 for (i = 0; i < mem->cnt; i++) {
635 if (mem->lst[i].blk == blk) {
636 while (i > 0) {
637 mem->lst[i].blk = mem->lst[i - 1].blk;
638 i -= 1;
639 }
640
641 mem->lst[0].blk = blk;
642
643 return;
644 }
645 }
646}
647
648static inline
649mem_blk_t *mem_get_blk_inline (memory_t *mem, unsigned long addr, unsigned last)
650{
651 unsigned i;
652 mem_blk_t *blk;
653 mem_lst_t *lst;
654
655 last &= (MEM_LAST_CNT - 1);
656
657 if (mem->last[last] != NULL) {
658 blk = mem->last[last]->blk;
659 if (blk->active && (addr >= blk->addr1) && (addr <= blk->addr2)) {
660 return (blk);
661 }
662 }
663
664 lst = mem->lst;
665
666 for (i = 0; i < mem->cnt; i++) {
667 blk = lst->blk;
668 if (blk->active && (addr >= blk->addr1) && (addr <= blk->addr2)) {
669 mem->last[last] = lst;
670 return (blk);
671 }
672
673 lst += 1;
674 }
675
676 return (NULL);
677}
678
679mem_blk_t *mem_get_blk (memory_t *mem, unsigned long addr)
680{
681 return (mem_get_blk_inline (mem, addr, 0));
682}
683
684void *mem_get_ptr (memory_t *mem, unsigned long addr, unsigned long size)
685{
686 mem_blk_t *blk;
687
688 if ((blk = mem_get_blk (mem, addr)) == NULL) {
689 return (NULL);
690 }
691
692 if (blk->data == NULL) {
693 return (NULL);
694 }
695
696 addr -= blk->addr1;
697
698 if ((blk->size - addr) < size) {
699 return (NULL);
700 }
701
702 return (blk->data + addr);
703}
704
705unsigned char mem_get_uint8 (memory_t *mem, unsigned long addr)
706{
707 mem_blk_t *blk;
708
709 blk = mem_get_blk_inline (mem, addr, 1);
710
711 if (blk != NULL) {
712 addr -= blk->addr1;
713
714 if (blk->get_uint8 != NULL) {
715 return (blk->get_uint8 (blk->ext, addr));
716 }
717 else {
718 return (blk->data[addr]);
719 }
720 }
721
722 if (mem->get_uint8 != NULL) {
723 return (mem->get_uint8 (mem->ext, addr));
724 }
725
726 return (mem->defval & 0xff);
727}
728
729unsigned short mem_get_uint16_be (memory_t *mem, unsigned long addr)
730{
731 unsigned short val;
732 mem_blk_t *blk;
733
734 blk = mem_get_blk_inline (mem, addr, 1);
735
736 if (blk != NULL) {
737 if ((addr + 1) > blk->addr2) {
738 val = (unsigned short) mem_get_uint8 (mem, addr) << 8;
739 val |= mem_get_uint8 (mem, addr + 1);
740 return (val);
741 }
742
743 addr -= blk->addr1;
744
745 if (blk->get_uint16 != NULL) {
746 return (blk->get_uint16 (blk->ext, addr));
747 }
748 else {
749 val = (unsigned short) blk->data[addr] << 8;
750 val |= blk->data[addr + 1];
751 return (val);
752 }
753 }
754
755 if (mem->get_uint16 != NULL) {
756 return (mem->get_uint16 (mem->ext, addr));
757 }
758
759 return (mem->defval & 0xffff);
760}
761
762unsigned short mem_get_uint16_le (memory_t *mem, unsigned long addr)
763{
764 unsigned short val;
765 mem_blk_t *blk;
766
767 blk = mem_get_blk_inline (mem, addr, 1);
768
769 if (blk != NULL) {
770 if ((addr + 1) > blk->addr2) {
771 val = mem_get_uint8 (mem, addr);
772 val |= (unsigned short) mem_get_uint8 (mem, addr + 1) << 8;
773 return (val);
774 }
775
776 addr -= blk->addr1;
777
778 if (blk->get_uint16 != NULL) {
779 return (blk->get_uint16 (blk->ext, addr));
780 }
781 else {
782 val = blk->data[addr];
783 val |= (unsigned short) blk->data[addr + 1] << 8;
784 return (val);
785 }
786 }
787
788 if (mem->get_uint16 != NULL) {
789 return (mem->get_uint16 (mem->ext, addr));
790 }
791
792 return (mem->defval & 0xffff);
793}
794
795unsigned long mem_get_uint32_be (memory_t *mem, unsigned long addr)
796{
797 unsigned long val;
798 mem_blk_t *blk;
799
800 blk = mem_get_blk_inline (mem, addr, 1);
801
802 if (blk != NULL) {
803 if ((addr + 3) > blk->addr2) {
804 val = (unsigned long) mem_get_uint8 (mem, addr) << 24;
805 val |= (unsigned long) mem_get_uint8 (mem, addr + 1) << 16;
806 val |= (unsigned long) mem_get_uint8 (mem, addr + 2) << 8;
807 val |= mem_get_uint8 (mem, addr + 3);
808 return (val);
809 }
810
811 addr -= blk->addr1;
812
813 if (blk->get_uint32 != NULL) {
814 return (blk->get_uint32 (blk->ext, addr));
815 }
816 else {
817 val = (unsigned long) blk->data[addr] << 24;
818 val |= (unsigned long) blk->data[addr + 1] << 16;
819 val |= (unsigned long) blk->data[addr + 2] << 8;
820 val |= blk->data[addr + 3];
821 return (val);
822 }
823 }
824
825 if (mem->get_uint32 != NULL) {
826 return (mem->get_uint32 (mem->ext, addr));
827 }
828
829 return (mem->defval);
830}
831
832unsigned long mem_get_uint32_le (memory_t *mem, unsigned long addr)
833{
834 unsigned long val;
835 mem_blk_t *blk;
836
837 blk = mem_get_blk_inline (mem, addr, 1);
838
839 if (blk != NULL) {
840 if ((addr + 3) > blk->addr2) {
841 val = (unsigned long) mem_get_uint8 (mem, addr);
842 val |= (unsigned long) mem_get_uint8 (mem, addr + 1) << 8;
843 val |= (unsigned long) mem_get_uint8 (mem, addr + 2) << 16;
844 val |= (unsigned long) mem_get_uint8 (mem, addr + 3) << 24;
845 return (val);
846 }
847
848 addr -= blk->addr1;
849
850 if (blk->get_uint32 != NULL) {
851 return (blk->get_uint32 (blk->ext, addr));
852 }
853 else {
854 val = (unsigned long) blk->data[addr];
855 val |= (unsigned long) blk->data[addr + 1] << 8;
856 val |= (unsigned long) blk->data[addr + 2] << 16;
857 val |= (unsigned long) blk->data[addr + 3] << 24;
858 return (val);
859 }
860 }
861
862 if (mem->get_uint32 != NULL) {
863 return (mem->get_uint32 (mem->ext, addr));
864 }
865
866 return (mem->defval);
867}
868
869void mem_set_uint8_rw (memory_t *mem, unsigned long addr, unsigned char val)
870{
871 mem_blk_t *blk;
872
873 blk = mem_get_blk (mem, addr);
874
875 if (blk != NULL) {
876 addr -= blk->addr1;
877
878 if (blk->set_uint8 != NULL) {
879 blk->set_uint8 (blk->ext, addr, val);
880 }
881 else {
882 blk->data[addr] = val;
883 }
884 }
885 else if (mem->set_uint8 != NULL) {
886 mem->set_uint8 (mem->ext, addr, val);
887 }
888}
889
890void mem_set_uint8 (memory_t *mem, unsigned long addr, unsigned char val)
891{
892 mem_blk_t *blk;
893
894 blk = mem_get_blk_inline (mem, addr, 2);
895
896 if (blk != NULL) {
897 if (blk->readonly) {
898 return;
899 }
900
901 addr -= blk->addr1;
902
903 if (blk->set_uint8 != NULL) {
904 blk->set_uint8 (blk->ext, addr, val);
905 }
906 else {
907 blk->data[addr] = val;
908 }
909 }
910 else if (mem->set_uint8 != NULL) {
911 mem->set_uint8 (mem->ext, addr, val);
912 }
913}
914
915void mem_set_uint16_be (memory_t *mem, unsigned long addr, unsigned short val)
916{
917 mem_blk_t *blk;
918
919 blk = mem_get_blk_inline (mem, addr, 2);
920
921 if (blk != NULL) {
922 if ((addr + 1) > blk->addr2) {
923 mem_set_uint8 (mem, addr, (val >> 8) & 0xff);
924 mem_set_uint8 (mem, addr + 1, val & 0xff);
925 return;
926 }
927
928 if (blk->readonly) {
929 return;
930 }
931
932 addr -= blk->addr1;
933
934 if (blk->set_uint16 != NULL) {
935 blk->set_uint16 (blk->ext, addr, val);
936 }
937 else {
938 blk->data[addr] = (val >> 8) & 0xff;
939 blk->data[addr + 1] = val & 0xff;
940 }
941 }
942 else if (mem->set_uint16 != NULL) {
943 mem->set_uint16 (mem->ext, addr, val);
944 }
945}
946
947void mem_set_uint16_le (memory_t *mem, unsigned long addr, unsigned short val)
948{
949 mem_blk_t *blk;
950
951 blk = mem_get_blk_inline (mem, addr, 2);
952
953 if (blk != NULL) {
954 if ((addr + 1) > blk->addr2) {
955 mem_set_uint8 (mem, addr, val & 0xff);
956 mem_set_uint8 (mem, addr + 1, (val >> 8) & 0xff);
957 return;
958 }
959
960 if (blk->readonly) {
961 return;
962 }
963
964 addr -= blk->addr1;
965
966 if (blk->set_uint16 != NULL) {
967 blk->set_uint16 (blk->ext, addr, val);
968 }
969 else {
970 blk->data[addr] = val & 0xff;
971 blk->data[addr + 1] = (val >> 8) & 0xff;
972 }
973 }
974 else if (mem->set_uint16 != NULL) {
975 mem->set_uint16 (mem->ext, addr, val);
976 }
977}
978
979void mem_set_uint32_be (memory_t *mem, unsigned long addr, unsigned long val)
980{
981 mem_blk_t *blk;
982
983 blk = mem_get_blk_inline (mem, addr, 2);
984
985 if (blk != NULL) {
986 if ((addr + 3) > blk->addr2) {
987 mem_set_uint8 (mem, addr, (val >> 24) & 0xff);
988 mem_set_uint8 (mem, addr + 1, (val >> 16) & 0xff);
989 mem_set_uint8 (mem, addr + 2, (val >> 8) & 0xff);
990 mem_set_uint8 (mem, addr + 3, val & 0xff);
991 return;
992 }
993
994 if (blk->readonly) {
995 return;
996 }
997
998 addr -= blk->addr1;
999
1000 if (blk->set_uint32 != NULL) {
1001 blk->set_uint32 (blk->ext, addr, val);
1002 }
1003 else {
1004 blk->data[addr] = (val >> 24) & 0xff;
1005 blk->data[addr + 1] = (val >> 16) & 0xff;
1006 blk->data[addr + 2] = (val >> 8) & 0xff;
1007 blk->data[addr + 3] = val & 0xff;
1008 }
1009 }
1010 else if (mem->set_uint32 != NULL) {
1011 mem->set_uint32 (mem->ext, addr, val);
1012 }
1013}
1014
1015void mem_set_uint32_le (memory_t *mem, unsigned long addr, unsigned long val)
1016{
1017 mem_blk_t *blk;
1018
1019 blk = mem_get_blk_inline (mem, addr, 2);
1020
1021 if (blk != NULL) {
1022 if ((addr + 3) > blk->addr2) {
1023 mem_set_uint8 (mem, addr, val & 0xff);
1024 mem_set_uint8 (mem, addr + 1, (val >> 8) & 0xff);
1025 mem_set_uint8 (mem, addr + 2, (val >> 16) & 0xff);
1026 mem_set_uint8 (mem, addr + 3, (val >> 24) & 0xff);
1027 return;
1028 }
1029
1030 if (blk->readonly) {
1031 return;
1032 }
1033
1034 addr -= blk->addr1;
1035
1036 if (blk->set_uint32 != NULL) {
1037 blk->set_uint32 (blk->ext, addr, val);
1038 }
1039 else {
1040 blk->data[addr] = val & 0xff;
1041 blk->data[addr + 1] = (val >> 8) & 0xff;
1042 blk->data[addr + 2] = (val >> 16) & 0xff;
1043 blk->data[addr + 3] = (val >> 24) & 0xff;
1044 }
1045 }
1046 else if (mem->set_uint32 != NULL) {
1047 mem->set_uint32 (mem->ext, addr, val);
1048 }
1049}