2 FUJITSU FM Towns Emulator 'eFMTowns'
4 Author : Kyuma.Ohta <whatisthis.sowhat _at_ gmail.com>
10 #ifndef _TOWNS_MEMORY_H_
11 #define _TOWNS_MEMORY_H_
14 #include "../../common.h"
15 #include "../memory.h"
16 #include "./towns_common.h"
18 #define SIG_FMTOWNS_MACHINE_ID 1
19 #define SIG_MEMORY_EXTNMI 2
22 // 00000000 - 000fffff : SYSTEM RAM PAGE 0 (Similar to FMR-50).
23 // 00100000 - 3fffffff : EXTRA RAM (for i386 native mode.Page size is 1MB.)
24 // 40000000 - 7fffffff : External I/O BOX.Not accessible.
25 // 80000000 - bfffffff : VRAM (Reserved 01020000H bytes with earlier Towns.)
26 // c0000000 - c21fffff : ROM card and dictionaly/font/DOS ROMs.
27 // c2200000 - c2200fff : PCM RAM (Banked).
28 // c2201000 - fffbffff : Reserved.
29 // FFFC0000 - FFFFFFFF : Towns System ROM.
33 TOWNS_MEMORY_NORMAL = 0,
34 TOWNS_MEMORY_FMR_VRAM,
35 TOWNS_MEMORY_FMR_TEXT,
36 TOWNS_MEMORY_FMR_VRAM_RESERVE,
37 TOWNS_MEMORY_SPRITE_ANKCG1,
40 TOWNS_MEMORY_MMIO_0CC,
42 TOWNS_MEMORY_TYPE_EXT_MMIO,
43 TOWNS_MEMORY_TYPE_LEARN_RAM,
44 TOWNS_MEMORY_TYPE_WAVERAM,
47 // Please set from config
48 #define TOWNS_EXTRAM_PAGES 6
60 #undef TOWNS_MEMORY_MAP_SHIFT
61 #define TOWNS_MEMORY_MAP_SHIFT 15
62 #undef TOWNS_MEMORY_MAP_SIZE
63 #define TOWNS_MEMORY_MAP_SIZE (1 << (32 - TOWNS_MEMORY_MAP_SHIFT))
65 class TOWNS_MEMORY : public DEVICE
73 DEVICE* d_sprite; // 0x81000000 - 0x8101ffff ?
74 DEVICE* d_pcm; // 0xc2200000 - 0xc2200fff
89 const uint32_t NOT_NEED_TO_OFFSET = UINT32_MAX;
91 typedef struct memory_device_map_s {
96 } memory_device_map_t;
97 memory_device_map_t membus_read_map[TOWNS_MEMORY_MAP_SIZE];
98 memory_device_map_t membus_write_map[TOWNS_MEMORY_MAP_SIZE];
99 memory_device_map_t dma_read_map[TOWNS_MEMORY_MAP_SIZE];
100 memory_device_map_t dma_write_map[TOWNS_MEMORY_MAP_SIZE];
102 outputs_t outputs_ram_wait;
103 outputs_t outputs_rom_wait;
116 uint8_t *extra_ram; // 0x00000000 - (0x3fffffff) : Size is defined by extram_size + 0x00100000;
117 uint32_t extram_size;
118 uint32_t cpu_clock_val;
119 uint32_t vram_wait_val;
120 uint32_t mem_wait_val;
122 uint8_t wait_register_older; // 05E0h
123 uint8_t wait_register_ram; // 05E2h
124 uint8_t wait_register_vram; // 05E6h
130 bool nmi_vector_protect;
135 uint32_t vram_size; // Normally 512KB.
139 uint8_t reg_misc3; // 0024
140 uint8_t reg_misc4; // 0025
143 virtual void reset_wait_values();
144 virtual void set_wait_values();
145 virtual void update_machine_features();
146 virtual void __FASTCALL config_page0f(const bool sysrombank, const bool force);
147 virtual void __FASTCALL config_page0c_0e(const bool vrambank, const bool dictbank, const bool force);
149 virtual bool set_cpu_clock_by_wait();
150 virtual void __FASTCALL write_fmr_ports8(uint32_t addr, uint32_t data);
151 virtual uint8_t __FASTCALL read_fmr_ports8(uint32_t addr);
152 virtual void __FASTCALL write_sys_ports8(uint32_t addr, uint32_t data);
153 virtual uint8_t __FASTCALL read_sys_ports8(uint32_t addr);
155 void __FASTCALL set_memory_devices_map_values(uint32_t start, uint32_t end, memory_device_map_t* dataptr, uint8_t* baseptr, DEVICE* device, uint32_t base_offset = UINT32_MAX);
156 void __FASTCALL set_memory_devices_map_wait(uint32_t start, uint32_t end, memory_device_map_t* dataptr, int wait = WAITVAL_RAM);
157 void __FASTCALL unset_memory_devices_map(uint32_t start, uint32_t end, memory_device_map_t* dataptr, int wait = WAITVAL_RAM);
159 constexpr uint32_t read_beyond_boundary_data16(memory_device_map_t *_map, const uint32_t addr, const uint32_t offset, const uint32_t mapptr, const bool is_dma, int* wait)
162 int waitvals[2] = {0};
164 w.b.l = read_dma_data8w(addr , &(waitvals[0]));
165 w.b.h = read_dma_data8w(addr + 1, &(waitvals[1]));
167 w.b.l = read_data8w(addr , &(waitvals[0]));
168 w.b.h = read_data8w(addr + 1, &(waitvals[1]));
170 __LIKELY_IF(wait != NULL) {
172 //*wait = waitvals[0] + waitvals[1];
174 return (uint32_t)(w.w);
176 constexpr uint32_t read_beyond_boundary_data32(memory_device_map_t *_map, const uint32_t addr, const uint32_t offset, const uint32_t mapptr, const bool is_dma, int* wait)
180 int waitvals[3] = {0};
185 d.b.l = read_dma_data8w (addr , &(waitvals[0]));
186 w.w = read_dma_data16w(addr + 1, &(waitvals[1]));
187 d.b.h3 = read_dma_data8w (addr + 3, &(waitvals[2]));
189 d.b.l = read_data8w (addr , &(waitvals[0]));
190 w.w = read_data16w(addr + 1, &(waitvals[1]));
191 d.b.h3 = read_data8w (addr + 3, &(waitvals[2]));
198 d.w.l = read_dma_data16w(addr , &(waitvals[0]));
199 d.w.h = read_dma_data16w(addr + 2, &(waitvals[1]));
201 d.w.l = read_data16w(addr , &(waitvals[0]));
202 d.w.h = read_data16w(addr + 2, &(waitvals[1]));
207 waitvals[0] = _map[mapptr].waitval;
211 __LIKELY_IF(wait != NULL) {
212 for(int i = 0; i < 2; i++) {
213 __UNLIKELY_IF(waitvals[i] < 0) {
214 waitvals[i] = (waitvals[i] == WAITVAL_VRAM) ? vram_wait_val : mem_wait_val;
218 //*wait = waitvals[0] + waitvals[1] + waitvals[2];
223 constexpr void write_beyond_boundary_data16(memory_device_map_t *_map, const uint32_t addr, const uint32_t offset, const uint32_t mapptr, const bool is_dma, uint32_t data, int* wait)
227 int waitvals[2] = {0};
229 write_dma_data8w(addr , w.b.l, &(waitvals[0]));
230 write_dma_data8w(addr + 1, w.b.h, &(waitvals[1]));
232 write_data8w(addr , w.b.l, &(waitvals[0]));
233 write_data8w(addr + 1, w.b.h, &(waitvals[1]));
235 __LIKELY_IF(wait != NULL) {
237 //*wait = waitvals[0] + waitvals[1];
240 constexpr void write_beyond_boundary_data32(memory_device_map_t *_map, const uint32_t addr, const uint32_t offset, const uint32_t mapptr, const bool is_dma, uint32_t data, int* wait)
245 int waitvals[3] = {0};
252 write_dma_data8w (addr , d.b.l, &(waitvals[0]));
253 write_dma_data16w(addr + 1, w.w, &(waitvals[1]));
254 write_dma_data8w (addr + 3, d.b.h3, &(waitvals[2]));
256 write_data8w (addr , d.b.l, &(waitvals[0]));
257 write_data16w(addr + 1, w.w, &(waitvals[1]));
258 write_data8w (addr + 3, d.b.h3, &(waitvals[2]));
263 write_dma_data16w(addr , d.w.l, &(waitvals[0]));
264 write_dma_data16w(addr + 2, d.w.h, &(waitvals[1]));
266 write_data16w(addr , d.w.l, &(waitvals[0]));
267 write_data16w(addr + 2, d.w.h, &(waitvals[1]));
271 waitvals[0] = _map[mapptr].waitval;
275 __LIKELY_IF(wait != NULL) {
276 for(int i = 0; i < 2; i++) {
277 __UNLIKELY_IF(waitvals[i] < 0) {
278 waitvals[i] = (waitvals[i] == WAITVAL_VRAM) ? vram_wait_val : mem_wait_val;
282 //*wait = waitvals[0] + waitvals[1] + waitvals[2];
286 constexpr bool check_device_boundary(memory_device_map_t *_map, uint32_t offset, uint32_t mapptr, const uint8_t bytewidth)
288 __UNLIKELY_IF((offset + bytewidth) > memory_map_grain()) {
289 __LIKELY_IF(mapptr < memory_map_size()) {
290 __LIKELY_IF((_map[mapptr].device_ptr == _map[mapptr + 1].device_ptr) && (_map[mapptr].mem_ptr == _map[mapptr + 1].mem_ptr)) {
300 constexpr uint32_t read_8bit_data(memory_device_map_t *_map, uint32_t mapptr, uint32_t addr, uint32_t offset, const bool is_dma, int* wait)
304 uint32_t base = _map[mapptr].base_offset;
305 __LIKELY_IF(_map[mapptr].mem_ptr != NULL) {
306 uint8_t* ptr = _map[mapptr].mem_ptr;
307 __UNLIKELY_IF(base == UINT32_MAX) {
310 val = ptr[offset + base];
311 } else if(_map[mapptr].device_ptr != NULL) {
312 DEVICE* dev = _map[mapptr].device_ptr;
313 __LIKELY_IF(base == UINT32_MAX) {
318 const bool is_this = (dev == this);
319 if((is_dma) && !(is_this)) {
320 val = dev->read_dma_data8(offset);
322 val = dev->read_memory_mapped_io8(offset);
325 __LIKELY_IF(wait != NULL) {
326 waitval = _map[mapptr].waitval;
327 __LIKELY_IF(waitval < 0) {
328 waitval = (waitval == WAITVAL_VRAM) ? vram_wait_val : mem_wait_val;
334 constexpr uint32_t read_16bit_data(memory_device_map_t *_map, uint32_t mapptr, uint32_t addr, uint32_t offset, const bool is_dma, int* wait)
336 uint16_t val = 0xffff;
338 uint32_t base = _map[mapptr].base_offset;
339 __LIKELY_IF(_map[mapptr].mem_ptr != NULL) {
340 uint8_t* ptr = _map[mapptr].mem_ptr;
341 __UNLIKELY_IF(base == UINT32_MAX) {
344 ptr = &(ptr[offset + base]);
346 w.read_2bytes_le_from(ptr);
348 } else if(_map[mapptr].device_ptr != NULL) {
349 DEVICE* dev = _map[mapptr].device_ptr;
350 __LIKELY_IF(base == UINT32_MAX) {
355 const bool is_this = (dev == this);
356 if((is_dma) && !(is_this)) {
357 val = dev->read_dma_data16(offset);
359 val = dev->read_memory_mapped_io16(offset);
362 __LIKELY_IF(wait != NULL) {
363 waitval = _map[mapptr].waitval;
364 __LIKELY_IF(waitval < 0) {
365 waitval = (waitval == WAITVAL_VRAM) ? vram_wait_val : mem_wait_val;
367 //__LIKELY_IF((offset & 1) == 0) {
370 // *wait = waitval * 2;
375 constexpr uint32_t read_32bit_data(memory_device_map_t *_map, uint32_t mapptr, uint32_t addr, uint32_t offset, const bool is_dma, int* wait)
377 uint32_t val = 0xffffffff;
378 uint32_t base = _map[mapptr].base_offset;
379 __LIKELY_IF(_map[mapptr].mem_ptr != NULL) {
380 uint8_t* ptr = _map[mapptr].mem_ptr;
381 __UNLIKELY_IF(base == UINT32_MAX) {
384 ptr = &(ptr[offset + base]);
386 d.read_4bytes_le_from(ptr);
388 } else if(_map[mapptr].device_ptr != NULL) {
389 DEVICE* dev = _map[mapptr].device_ptr;
390 __LIKELY_IF(base == UINT32_MAX) {
395 const bool is_this = (dev == this);
396 if((is_dma) && !(is_this)) {
397 val = dev->read_dma_data32(offset);
399 val = dev->read_memory_mapped_io32(offset);
402 __LIKELY_IF(wait != NULL) {
403 int waitval = _map[mapptr].waitval;
404 __LIKELY_IF(waitval < 0) {
405 waitval = (waitval == WAITVAL_VRAM) ? vram_wait_val : mem_wait_val;
407 //__LIKELY_IF((offset & 1) == 0) {
410 // *wait = waitval * 2;
415 constexpr void write_8bit_data(memory_device_map_t *_map, uint32_t mapptr, uint32_t addr, uint32_t offset, const bool is_dma, uint32_t data, int* wait)
418 uint32_t base = _map[mapptr].base_offset;
419 __LIKELY_IF(_map[mapptr].mem_ptr != NULL) {
420 uint8_t* ptr = _map[mapptr].mem_ptr;
421 __UNLIKELY_IF(base == UINT32_MAX) {
424 ptr[offset + base] = data;
425 } else if(_map[mapptr].device_ptr != NULL) {
426 DEVICE* dev = _map[mapptr].device_ptr;
427 __LIKELY_IF(base == UINT32_MAX) {
432 const bool is_this = (dev == this);
433 if((is_dma) && !(is_this)) {
434 dev->write_dma_data8(offset, data);
436 dev->write_memory_mapped_io8(offset, data);
439 __LIKELY_IF(wait != NULL) {
440 waitval = _map[mapptr].waitval;
441 __LIKELY_IF(waitval < 0) {
442 waitval = (waitval == WAITVAL_VRAM) ? vram_wait_val : mem_wait_val;
448 constexpr void write_16bit_data(memory_device_map_t *_map, uint32_t mapptr, uint32_t addr, uint32_t offset, const bool is_dma, uint32_t data, int* wait)
451 uint32_t base = _map[mapptr].base_offset;
452 __LIKELY_IF(_map[mapptr].mem_ptr != NULL) {
453 uint8_t* ptr = _map[mapptr].mem_ptr;
454 __UNLIKELY_IF(base == UINT32_MAX) {
457 ptr = &(ptr[offset + base]);
460 w.write_2bytes_le_to(ptr);
461 } else if(_map[mapptr].device_ptr != NULL) {
462 DEVICE* dev = _map[mapptr].device_ptr;
463 __LIKELY_IF(base == UINT32_MAX) {
468 const bool is_this = (dev == this);
469 if((is_dma) && !(is_this)) {
470 dev->write_dma_data16(offset, data);
472 dev->write_memory_mapped_io16(offset, data);
475 __LIKELY_IF(wait != NULL) {
476 waitval = _map[mapptr].waitval;
477 __LIKELY_IF(waitval < 0) {
478 waitval = (waitval == WAITVAL_VRAM) ? vram_wait_val : mem_wait_val;
480 //__LIKELY_IF((offset & 1) == 0) {
483 // *wait = waitval * 2;
487 constexpr void write_32bit_data(memory_device_map_t *_map, uint32_t mapptr, uint32_t addr, uint32_t offset, const bool is_dma, uint32_t data, int* wait)
489 uint32_t base = _map[mapptr].base_offset;
490 __LIKELY_IF(_map[mapptr].mem_ptr != NULL) {
491 uint8_t* ptr = _map[mapptr].mem_ptr;
492 __UNLIKELY_IF(base == UINT32_MAX) {
495 ptr = &(ptr[offset + base]);
498 d.write_4bytes_le_to(ptr);
499 } else if(_map[mapptr].device_ptr != NULL) {
500 DEVICE* dev = _map[mapptr].device_ptr;
501 __LIKELY_IF(base == UINT32_MAX) {
506 const bool is_this = (dev == this);
507 if((is_dma) && !(is_this)) {
508 dev->write_dma_data32(offset, data);
510 dev->write_memory_mapped_io32(offset, data);
513 __LIKELY_IF(wait != NULL) {
514 int waitval = _map[mapptr].waitval;
515 __LIKELY_IF(waitval < 0) {
516 waitval = (waitval == WAITVAL_VRAM) ? vram_wait_val : mem_wait_val;
518 //__LIKELY_IF((offset & 1) == 0) {
521 // *wait = waitval * 2;
525 inline bool is_faster_wait()
527 return ((mem_wait_val == 0) && (vram_wait_val < 3)) ? true : false;
530 @note Use memory map per 32KB (131072 entries) as 1st tier.
531 And, at Some pages hadles special devices,
532 000C8000h - 000CFFFFh : this
533 C2140000h - C2141FFFh : DICTIONARY (CMOS)
534 C2200000h - C2200FFFh : RF5C68 (PCM SOUND)
537 inline const uint64_t memory_map_size() { return TOWNS_MEMORY_MAP_SIZE; }
538 inline const uint64_t memory_map_shift() { return TOWNS_MEMORY_MAP_SHIFT; }
539 constexpr uint64_t memory_map_mask() { return ((1 << TOWNS_MEMORY_MAP_SHIFT) - 1); }
540 constexpr uint64_t memory_map_grain() { return (1 << TOWNS_MEMORY_MAP_SHIFT); }
543 TOWNS_MEMORY(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu) : DEVICE(parent_vm, parent_emu) {
544 set_device_name(_T("FMTOWNS_MEMORY"));
546 extram_size = 0x00200000; // Basically 2MB
568 initialize_output_signals(&outputs_ram_wait);
569 initialize_output_signals(&outputs_rom_wait);
570 // Note: machine id must set before initialize() from set_context_machine_id() by VM::VM().
571 // machine_id = 0x0100; // FM-Towns 1,2
572 // machine_id = 0x0200 // FM-Towns 1F/2F/1H/2H
573 // machine_id = 0x0300 // FM-Towns UX10/UX20/UX40
574 // machine_id = 0x0400 // FM-Towns 10F/20F/40H/80H
575 // machine_id = 0x0500 // FM-Towns2 CX10/CX20/CX40/CX100
576 // machine_id = 0x0600 // FM-Towns2 UG10/UG20/UG40/UG80
577 // machine_id = 0x0700 // FM-Towns2 HR20/HR100/HR200
578 // machine_id = 0x0800 // FM-Towns2 HG20/HG40/HG100
579 // machine_id = 0x0900 // FM-Towns2 UR20/UR40/UR80
580 // machine_id = 0x0b00 // FM-Towns2 MA20/MA170/MA340
581 // machine_id = 0x0c00 // FM-Towns2 MX20/MX170/MX340
582 // machine_id = 0x0d00 // FM-Towns2 ME20/ME170
583 // machine_id = 0x0f00 // FM-Towns2 MF20/MF170/Fresh
584 machine_id = 0x0100; // FM-Towns 1,2
586 // Note: cpu id must set before initialize() from set_context_cpu_id() by VM::VM().
587 // cpu_id = 0x00; // 80286.
588 // cpu_id = 0x01; // 80386DX.
589 // cpu_id = 0x02; // 80486SX/DX.
590 // cpu_id = 0x03; // 80386SX.
591 cpu_id = 0x01; // 80386DX.
593 unset_mmio_rw(0x00000000, 0xffffffff);
594 unset_dma_rw(0x00000000, 0xffffffff);
600 void initialize() override;
601 void release() override;
602 void reset() override;
604 virtual uint32_t __FASTCALL read_data8w(uint32_t addr, int* wait) override;
605 virtual uint32_t __FASTCALL read_data16w(uint32_t addr, int* wait) override;
606 virtual uint32_t __FASTCALL read_data32w(uint32_t addr, int* wait) override;
608 virtual void __FASTCALL write_data8w(uint32_t addr, uint32_t data, int* wait) override;
609 virtual void __FASTCALL write_data16w(uint32_t addr, uint32_t data, int* wait) override;
610 virtual void __FASTCALL write_data32w(uint32_t addr, uint32_t data, int* wait) override;
612 virtual uint32_t __FASTCALL read_dma_data8w(uint32_t addr, int* wait) override;
613 virtual uint32_t __FASTCALL read_dma_data16w(uint32_t addr, int* wait) override;
614 virtual uint32_t __FASTCALL read_dma_data32w(uint32_t addr, int* wait) override;
615 virtual void __FASTCALL write_dma_data8w(uint32_t addr, uint32_t data, int* wait) override;
616 virtual void __FASTCALL write_dma_data16w(uint32_t addr, uint32_t data, int* wait) override;
617 virtual void __FASTCALL write_dma_data32w(uint32_t addr, uint32_t data, int* wait) override;
619 virtual void __FASTCALL write_io8(uint32_t addr, uint32_t data) override;
620 virtual uint32_t __FASTCALL read_io8(uint32_t addr) override;
622 virtual void __FASTCALL write_memory_mapped_io8(uint32_t addr, uint32_t data) override;
623 virtual uint32_t __FASTCALL read_memory_mapped_io8(uint32_t addr) override;
625 virtual void __FASTCALL write_memory_mapped_io16(uint32_t addr, uint32_t data) override;
626 virtual uint32_t __FASTCALL read_memory_mapped_io16(uint32_t addr) override;
628 virtual void __FASTCALL write_memory_mapped_io32(uint32_t addr, uint32_t data) override;
629 virtual uint32_t __FASTCALL read_memory_mapped_io32(uint32_t addr) override;
631 virtual void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask) override;
632 virtual uint32_t __FASTCALL read_signal(int ch) override;
634 //void event_frame();
635 virtual void __FASTCALL set_intr_line(bool line, bool pending, uint32_t bit) override;
637 bool process_state(FILEIO* state_fio, bool loading) override;
640 void set_extra_ram_size(uint32_t megabytes)
643 uint32_t minimum = 2;
644 switch((machine_id & 0xff00) >> 8) {
646 case 0x01: // Towns 1/2 : Not Supported.
649 case 0x03: // TOWNS2 UX
650 case 0x06: // TOWNS2 UG
652 limit = 9; // 2MB + 4MB x 2? - 1MB
654 case 0x02: // TOWNS 2F/2H
655 case 0x04: // TOWNS 10F/10H/20F/20H
657 limit = 7; // 2MB + 2MB x 3
659 case 0x05: // TOWNS II CX
660 case 0x08: // TOWNS II HG
661 limit = 15; // 8MB x 2 - 1MB?
663 case 0x07: // Towns II HR
664 case 0x09: // Towns II UR
665 limit = 31; // 16MB x 2 - 1MB?
667 default: // After MA/MX/ME/MF, Fresh
668 limit = 127; // 128MB - 1MB?
671 if(megabytes > limit) megabytes = limit;
672 if(megabytes < minimum) megabytes = minimum;
673 extram_size = megabytes << 20;
676 virtual void __FASTCALL set_mmio_memory_r(uint32_t start, uint32_t end, uint8_t* ptr, uint32_t base_offset = 0);
677 virtual void __FASTCALL set_mmio_memory_w(uint32_t start, uint32_t end, uint8_t* ptr, uint32_t base_offset = 0);
678 inline void __FASTCALL set_mmio_memory_rw(uint32_t start, uint32_t end, uint8_t* ptr, uint32_t base_offset = 0)
680 set_mmio_memory_r(start, end, ptr, base_offset);
681 set_mmio_memory_w(start, end, ptr, base_offset);
684 virtual void __FASTCALL set_mmio_wait_r(uint32_t start, uint32_t end, int wait);
685 virtual void __FASTCALL set_mmio_wait_w(uint32_t start, uint32_t end, int wait);
686 inline void __FASTCALL set_mmio_wait_rw(uint32_t start, uint32_t end, int wait)
688 set_mmio_wait_r(start, end, wait);
689 set_mmio_wait_w(start, end, wait);
692 virtual void __FASTCALL set_mmio_device_r(uint32_t start, uint32_t end, DEVICE* baseptr, uint32_t baseaddress = UINT32_MAX);
693 virtual void __FASTCALL set_mmio_device_w(uint32_t start, uint32_t end, DEVICE* baseptr, uint32_t baseaddress = UINT32_MAX);
694 inline void __FASTCALL set_mmio_device_rw(uint32_t start, uint32_t end, DEVICE* baseptr, uint32_t baseaddress = UINT32_MAX)
696 set_mmio_device_r(start, end, baseptr, baseaddress);
697 set_mmio_device_w(start, end, baseptr, baseaddress);
700 virtual void __FASTCALL set_dma_memory_r(uint32_t start, uint32_t end, uint8_t* ptr, uint32_t base_offset = 0);
701 virtual void __FASTCALL set_dma_memory_w(uint32_t start, uint32_t end, uint8_t* ptr, uint32_t base_offset = 0);
702 inline void __FASTCALL set_dma_memory_rw(uint32_t start, uint32_t end, uint8_t* ptr, uint32_t base_offset = 0)
704 set_dma_memory_r(start, end, ptr, base_offset);
705 set_dma_memory_w(start, end, ptr, base_offset);
708 virtual void __FASTCALL set_dma_wait_r(uint32_t start, uint32_t end, int wait);
709 virtual void __FASTCALL set_dma_wait_w(uint32_t start, uint32_t end, int wait);
710 inline void __FASTCALL set_dma_wait_rw(uint32_t start, uint32_t end, int wait)
712 set_dma_wait_r(start, end, wait);
713 set_dma_wait_w(start, end, wait);
716 virtual void __FASTCALL set_dma_device_r(uint32_t start, uint32_t end, DEVICE* ptr, uint32_t baseaddress = UINT32_MAX);
717 virtual void __FASTCALL set_dma_device_w(uint32_t start, uint32_t end, DEVICE* ptr, uint32_t baseaddress = UINT32_MAX);
718 inline void __FASTCALL set_dma_device_rw(uint32_t start, uint32_t end, DEVICE* ptr, uint32_t baseaddress = UINT32_MAX)
720 set_dma_device_r(start, end, ptr, baseaddress);
721 set_dma_device_w(start, end, ptr, baseaddress);
724 inline void __FASTCALL set_region_memory_r(uint32_t start, uint32_t end, uint8_t* baseptr, uint32_t base_offset = 0)
726 set_mmio_memory_r(start, end, baseptr, base_offset);
727 set_dma_memory_r (start, end, baseptr, base_offset);
730 inline void __FASTCALL set_region_memory_w(uint32_t start, uint32_t end, uint8_t* baseptr,uint32_t base_offset = 0)
732 set_mmio_memory_w(start, end, baseptr, base_offset);
733 set_dma_memory_w (start, end, baseptr, base_offset);
735 inline void __FASTCALL set_region_memory_rw(uint32_t start, uint32_t end, uint8_t* baseptr, uint32_t base_offset = 0)
737 set_region_memory_r(start, end, baseptr, base_offset);
738 set_region_memory_w(start, end, baseptr, base_offset);
741 inline void __FASTCALL set_region_device_r(uint32_t start, uint32_t end, DEVICE* ptr, uint32_t baseaddress = UINT32_MAX)
743 set_mmio_device_r(start, end, ptr, baseaddress);
744 set_dma_device_r (start, end, ptr, baseaddress);
746 inline void __FASTCALL set_region_device_w(uint32_t start, uint32_t end, DEVICE* ptr, uint32_t baseaddress = UINT32_MAX)
748 set_mmio_device_w(start, end, ptr, baseaddress);
749 set_dma_device_w (start, end, ptr, baseaddress);
751 inline void __FASTCALL set_region_device_rw(uint32_t start, uint32_t end, DEVICE* ptr, uint32_t baseaddress = UINT32_MAX)
753 set_region_device_r(start, end, ptr, baseaddress);
754 set_region_device_w(start, end, ptr, baseaddress);
756 virtual void __FASTCALL unset_mmio_r(uint32_t start, uint32_t end, int wait = WAITVAL_RAM);
757 virtual void __FASTCALL unset_mmio_w(uint32_t start, uint32_t end, int wait = WAITVAL_RAM);
758 inline void __FASTCALL unset_mmio_rw(uint32_t start, uint32_t end, int wait = WAITVAL_RAM)
760 unset_mmio_r(start, end, wait);
761 unset_mmio_w(start, end, wait);
764 virtual void __FASTCALL unset_dma_r(uint32_t start, uint32_t end, int wait = WAITVAL_RAM);
765 virtual void __FASTCALL unset_dma_w(uint32_t start, uint32_t end, int wait = WAITVAL_RAM);
766 inline void __FASTCALL unset_dma_rw(uint32_t start, uint32_t end, int wait = WAITVAL_RAM)
768 unset_dma_r(start, end, wait);
769 unset_dma_w(start, end, wait);
772 inline void __FASTCALL unset_range_r(uint32_t start, uint32_t end, int wait = WAITVAL_RAM)
774 unset_mmio_r(start, end, wait);
775 unset_dma_r(start, end, wait);
778 inline void __FASTCALL unset_range_w(uint32_t start, uint32_t end, int wait = WAITVAL_RAM)
780 unset_mmio_w(start, end, wait);
781 unset_dma_w(start, end, wait);
783 inline void __FASTCALL unset_range_rw(uint32_t start, uint32_t end, int wait = WAITVAL_RAM)
785 unset_range_r(start, end, wait);
786 unset_range_w(start, end, wait);
789 void set_context_cpu(I386* device)
793 void set_context_dmac(DEVICE* device)
797 virtual void set_context_vram(DEVICE* device)
802 void set_context_system_rom(DEVICE* device)
806 void set_context_font_rom(DEVICE* device)
810 void set_context_font_20pix_rom(DEVICE* device)
812 d_font_20pix = device;
814 void set_context_dictionary(DEVICE* device)
816 d_dictionary = device;
818 void set_context_msdos(DEVICE* device)
822 void set_context_timer(DEVICE* device)
826 void set_context_sprite(DEVICE* device)
830 void set_context_crtc(DEVICE* device)
834 void set_context_iccard(DEVICE* device, int num)
836 d_iccard[num & 1] = device;
838 void set_context_pcm(DEVICE* device)
842 void set_context_serial_rom(DEVICE* device)
844 d_serialrom = device;
846 void set_context_planevram(DEVICE *dev)
850 void set_machine_id(uint16_t val)
852 machine_id = val & 0xfff8;
854 void set_cpu_id(uint16_t val)