fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
at master 1049 lines 21 kB view raw
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}