|
|
| version 1.10, 2003/12/08 00:55:31 | version 1.11, 2003/12/08 17:57:29 |
|---|---|
| Line 624 typedef REG8 (MEMCALL * MEM8READ)(UINT32 | Line 624 typedef REG8 (MEMCALL * MEM8READ)(UINT32 |
| typedef void (MEMCALL * MEM16WRITE)(UINT32 address, REG16 value); | typedef void (MEMCALL * MEM16WRITE)(UINT32 address, REG16 value); |
| typedef REG16 (MEMCALL * MEM16READ)(UINT32 address); | typedef REG16 (MEMCALL * MEM16READ)(UINT32 address); |
| static MEM8WRITE memory_write[] = { | typedef struct { |
| i286_wt, i286_wt, i286_wt, i286_wt, // 00 | MEM8READ rd8[0x20]; |
| i286_wt, i286_wt, i286_wt, i286_wt, // 20 | MEM8WRITE wr8[0x20]; |
| i286_wt, i286_wt, i286_wt, i286_wt, // 40 | MEM16READ rd16[0x20]; |
| i286_wt, i286_wt, i286_wt, i286_wt, // 60 | MEM16WRITE wr16[0x20]; |
| i286_wt, i286_wt, i286_wt, i286_wt, // 80 | } MEMFN; |
| tram_wt, vram_w0, vram_w0, vram_w0, // a0 | |
| emmc_wt, emmc_wt, i286_wn, i286_wn, // c0 | typedef struct { |
| vram_w0, i286_wn, i286_wn, i286_wn}; // e0 | MEM8READ rd8; |
| MEM8WRITE wr8; | |
| MEM16READ rd16; | |
| MEM16WRITE wr16; | |
| } VACCTBL; | |
| static MEM8READ memory_read[] = { | static MEMFN memfn = { |
| i286_rd, i286_rd, i286_rd, i286_rd, // 00 | {i286_rd, i286_rd, i286_rd, i286_rd, // 00 |
| i286_rd, i286_rd, i286_rd, i286_rd, // 20 | i286_rd, i286_rd, i286_rd, i286_rd, // 20 |
| i286_rd, i286_rd, i286_rd, i286_rd, // 40 | i286_rd, i286_rd, i286_rd, i286_rd, // 40 |
| i286_rd, i286_rd, i286_rd, i286_rd, // 60 | i286_rd, i286_rd, i286_rd, i286_rd, // 60 |
| i286_rd, i286_rd, i286_rd, i286_rd, // 80 | i286_rd, i286_rd, i286_rd, i286_rd, // 80 |
| tram_rd, vram_r0, vram_r0, vram_r0, // a0 | tram_rd, vram_r0, vram_r0, vram_r0, // a0 |
| emmc_rd, emmc_rd, i286_rd, i286_rd, // c0 | emmc_rd, emmc_rd, i286_rd, i286_rd, // c0 |
| vram_r0, i286_rd, i286_rd, i286_itf}; // f0 | vram_r0, i286_rd, i286_rd, i286_itf}, // f0 |
| static MEM16WRITE memword_write[] = { | {i286_wt, i286_wt, i286_wt, i286_wt, // 00 |
| i286w_wt, i286w_wt, i286w_wt, i286w_wt, // 00 | i286_wt, i286_wt, i286_wt, i286_wt, // 20 |
| i286w_wt, i286w_wt, i286w_wt, i286w_wt, // 20 | i286_wt, i286_wt, i286_wt, i286_wt, // 40 |
| i286w_wt, i286w_wt, i286w_wt, i286w_wt, // 40 | i286_wt, i286_wt, i286_wt, i286_wt, // 60 |
| i286w_wt, i286w_wt, i286w_wt, i286w_wt, // 60 | i286_wt, i286_wt, i286_wt, i286_wt, // 80 |
| i286w_wt, i286w_wt, i286w_wt, i286w_wt, // 80 | tram_wt, vram_w0, vram_w0, vram_w0, // a0 |
| tramw_wt, vramw_w0, vramw_w0, vramw_w0, // a0 | emmc_wt, emmc_wt, i286_wn, i286_wn, // c0 |
| emmcw_wt, emmcw_wt, i286w_wn, i286w_wn, // c0 | vram_w0, i286_wn, i286_wn, i286_wn}, // e0 |
| vramw_w0, i286w_wn, i286w_wn, i286w_wn}; // e0 | |
| static MEM16READ memword_read[] = { | {i286w_rd, i286w_rd, i286w_rd, i286w_rd, // 00 |
| i286w_rd, i286w_rd, i286w_rd, i286w_rd, // 00 | |
| i286w_rd, i286w_rd, i286w_rd, i286w_rd, // 20 | i286w_rd, i286w_rd, i286w_rd, i286w_rd, // 20 |
| i286w_rd, i286w_rd, i286w_rd, i286w_rd, // 40 | i286w_rd, i286w_rd, i286w_rd, i286w_rd, // 40 |
| i286w_rd, i286w_rd, i286w_rd, i286w_rd, // 60 | i286w_rd, i286w_rd, i286w_rd, i286w_rd, // 60 |
| i286w_rd, i286w_rd, i286w_rd, i286w_rd, // 80 | i286w_rd, i286w_rd, i286w_rd, i286w_rd, // 80 |
| tramw_rd, vramw_r0, vramw_r0, vramw_r0, // a0 | tramw_rd, vramw_r0, vramw_r0, vramw_r0, // a0 |
| emmcw_rd, emmcw_rd, i286w_rd, i286w_rd, // c0 | emmcw_rd, emmcw_rd, i286w_rd, i286w_rd, // c0 |
| vramw_r0, i286w_rd, i286w_rd, i286w_itf}; // e0 | vramw_r0, i286w_rd, i286w_rd, i286w_itf}, // e0 |
| static const MEM8WRITE vram_write[] = { | {i286w_wt, i286w_wt, i286w_wt, i286w_wt, // 00 |
| vram_w0, vram_w1, vram_w0, vram_w1, // 00 | i286w_wt, i286w_wt, i286w_wt, i286w_wt, // 20 |
| vram_w0, vram_w1, vram_w0, vram_w1, // 40 | i286w_wt, i286w_wt, i286w_wt, i286w_wt, // 40 |
| grcg_tdw0, grcg_tdw1, egc_wt, egc_wt, // 80 tdw/tcr | i286w_wt, i286w_wt, i286w_wt, i286w_wt, // 60 |
| grcg_rmw0, grcg_rmw1, egc_wt, egc_wt}; // c0 rmw | i286w_wt, i286w_wt, i286w_wt, i286w_wt, // 80 |
| tramw_wt, vramw_w0, vramw_w0, vramw_w0, // a0 | |
| static const MEM8READ vram_read[] = { | emmcw_wt, emmcw_wt, i286w_wn, i286w_wn, // c0 |
| vram_r0, vram_r1, vram_r0, vram_r1, // 00 | vramw_w0, i286w_wn, i286w_wn, i286w_wn}}; // e0 |
| vram_r0, vram_r1, vram_r0, vram_r1, // 40 | |
| grcg_tcr0, grcg_tcr1, egc_rd, egc_rd, // 80 tdw/tcr | static const VACCTBL vacctbl[0x10] = { |
| vram_r0, vram_r1, egc_rd, egc_rd}; // c0 rmw | {vram_r0, vram_w0, vramw_r0, vramw_w0}, // 00 |
| {vram_r1, vram_w1, vramw_r1, vramw_w1}, | |
| static const MEM16WRITE vramw_write[] = { | {vram_r0, vram_w0, vramw_r0, vramw_w0}, |
| vramw_w0, vramw_w1, vramw_w0, vramw_w1, // 00 | {vram_r1, vram_w1, vramw_r1, vramw_w1}, |
| vramw_w0, vramw_w1, vramw_w0, vramw_w1, // 40 | {vram_r0, vram_w0, vramw_r0, vramw_w0}, // 40 |
| grcgw_tdw0, grcgw_tdw1, egcw_wt, egcw_wt, // 80 tdw/tcr | {vram_r1, vram_w1, vramw_r1, vramw_w1}, |
| grcgw_rmw0, grcgw_rmw1, egcw_wt, egcw_wt}; // c0 rmw | {vram_r0, vram_w0, vramw_r0, vramw_w0}, |
| {vram_r1, vram_w1, vramw_r1, vramw_w1}, | |
| static const MEM16READ vramw_read[] = { | {grcg_tcr0, grcg_tdw0, grcgw_tcr0, grcgw_tdw0}, // 80 tdw/tcr |
| vramw_r0, vramw_r1, vramw_r0, vramw_r1, // 00 | {grcg_tcr1, grcg_tdw1, grcgw_tcr1, grcgw_tdw1}, |
| vramw_r0, vramw_r1, vramw_r0, vramw_r1, // 40 | {egc_rd, egc_wt, egcw_rd, egcw_wt}, |
| grcgw_tcr0, grcgw_tcr1, egcw_rd, egcw_rd, // 80 tdw/tcr | {egc_rd, egc_wt, egcw_rd, egcw_wt}, |
| vramw_r0, vramw_r1, egcw_rd, egcw_rd}; // c0 rmw | {vram_r0, grcg_rmw0, vramw_r0, grcgw_rmw0}, // c0 rmw |
| {vram_r1, grcg_rmw1, vramw_r1, grcgw_rmw1}, | |
| {egc_rd, egc_wt, egcw_rd, egcw_wt}, | |
| {egc_rd, egc_wt, egcw_rd, egcw_wt}}; | |
| static REG8 MEMCALL i286_nonram_r(UINT32 address) { | static REG8 MEMCALL i286_nonram_r(UINT32 address) { |
| Line 703 static REG16 MEMCALL i286_nonram_rw(UINT | Line 708 static REG16 MEMCALL i286_nonram_rw(UINT |
| void MEMCALL i286_vram_dispatch(UINT func) { | void MEMCALL i286_vram_dispatch(UINT func) { |
| UINT proc; | const VACCTBL *vacc; |
| vacc = vacctbl + (func & 0x0f); | |
| proc = func & 0x0f; | memfn.rd8[0xa8000 >> 15] = vacc->rd8; |
| memory_write[0xa8000 >> 15] = vram_write[proc]; | memfn.rd8[0xb0000 >> 15] = vacc->rd8; |
| memory_write[0xb0000 >> 15] = vram_write[proc]; | memfn.rd8[0xb8000 >> 15] = vacc->rd8; |
| memory_write[0xb8000 >> 15] = vram_write[proc]; | memfn.rd8[0xe0000 >> 15] = vacc->rd8; |
| memory_write[0xe0000 >> 15] = vram_write[proc]; | |
| memfn.wr8[0xa8000 >> 15] = vacc->wr8; | |
| memory_read[0xa8000 >> 15] = vram_read[proc]; | memfn.wr8[0xb0000 >> 15] = vacc->wr8; |
| memory_read[0xb0000 >> 15] = vram_read[proc]; | memfn.wr8[0xb8000 >> 15] = vacc->wr8; |
| memory_read[0xb8000 >> 15] = vram_read[proc]; | memfn.wr8[0xe0000 >> 15] = vacc->wr8; |
| memory_read[0xe0000 >> 15] = vram_read[proc]; | |
| memfn.rd16[0xa8000 >> 15] = vacc->rd16; | |
| memword_write[0xa8000 >> 15] = vramw_write[proc]; | memfn.rd16[0xb0000 >> 15] = vacc->rd16; |
| memword_write[0xb0000 >> 15] = vramw_write[proc]; | memfn.rd16[0xb8000 >> 15] = vacc->rd16; |
| memword_write[0xb8000 >> 15] = vramw_write[proc]; | memfn.rd16[0xe0000 >> 15] = vacc->rd16; |
| memword_write[0xe0000 >> 15] = vramw_write[proc]; | |
| memfn.wr16[0xa8000 >> 15] = vacc->wr16; | |
| memword_read[0xa8000 >> 15] = vramw_read[proc]; | memfn.wr16[0xb0000 >> 15] = vacc->wr16; |
| memword_read[0xb0000 >> 15] = vramw_read[proc]; | memfn.wr16[0xb8000 >> 15] = vacc->wr16; |
| memword_read[0xb8000 >> 15] = vramw_read[proc]; | memfn.wr16[0xe0000 >> 15] = vacc->wr16; |
| memword_read[0xe0000 >> 15] = vramw_read[proc]; | |
| if (!(func & 0x10)) { // degital | if (!(func & 0x10)) { // degital |
| memory_write[0xe0000 >> 15] = i286_wn; | memfn.wr8[0xe0000 >> 15] = i286_wn; |
| memword_write[0xe0000 >> 15] = i286w_wn; | memfn.wr16[0xe0000 >> 15] = i286w_wn; |
| memory_read[0xe0000 >> 15] = i286_nonram_r; | memfn.rd8[0xe0000 >> 15] = i286_nonram_r; |
| memword_read[0xe0000 >> 15] = i286_nonram_rw; | memfn.rd16[0xe0000 >> 15] = i286_nonram_rw; |
| } | } |
| } | } |
| Line 752 static REG8 MEMCALL _i286_memoryread(UIN | Line 758 static REG8 MEMCALL _i286_memoryread(UIN |
| } | } |
| #endif | #endif |
| else { | else { |
| return(memory_read[(address >> 15) & 0x1f](address)); | return(memfn.rd8[(address >> 15) & 0x1f](address)); |
| } | } |
| } | } |
| Line 786 static REG16 MEMCALL _i286_memoryread_w( | Line 792 static REG16 MEMCALL _i286_memoryread_w( |
| } | } |
| #endif | #endif |
| else if ((address & 0x7fff) != 0x7fff) { | else if ((address & 0x7fff) != 0x7fff) { |
| return(memword_read[(address >> 15) & 0x1f](address)); | return(memfn.rd16[(address >> 15) & 0x1f](address)); |
| } | } |
| else { | else { |
| ret = memory_read[(address >> 15) & 0x1f](address); | ret = memfn.rd8[(address >> 15) & 0x1f](address); |
| address++; | address++; |
| ret += memory_read[(address >> 15) & 0x1f](address) << 8; | ret += memfn.rd8[(address >> 15) & 0x1f](address) << 8; |
| return(ret); | return(ret); |
| } | } |
| } | } |
| Line 835 REG8 MEMCALL i286_memoryread(UINT32 addr | Line 841 REG8 MEMCALL i286_memoryread(UINT32 addr |
| } | } |
| #endif | #endif |
| else { | else { |
| return(memory_read[(address >> 15) & 0x1f](address)); | return(memfn.rd8[(address >> 15) & 0x1f](address)); |
| } | } |
| } | } |
| Line 869 REG16 MEMCALL i286_memoryread_w(UINT32 a | Line 875 REG16 MEMCALL i286_memoryread_w(UINT32 a |
| } | } |
| #endif | #endif |
| else if ((address & 0x7fff) != 0x7fff) { | else if ((address & 0x7fff) != 0x7fff) { |
| return(memword_read[(address >> 15) & 0x1f](address)); | return(memfn.rd16[(address >> 15) & 0x1f](address)); |
| } | } |
| else { | else { |
| ret = memory_read[(address >> 15) & 0x1f](address); | ret = memfn.rd8[(address >> 15) & 0x1f](address); |
| address++; | address++; |
| ret += memory_read[(address >> 15) & 0x1f](address) << 8; | ret += memfn.rd8[(address >> 15) & 0x1f](address) << 8; |
| return(ret); | return(ret); |
| } | } |
| } | } |
| Line 894 void MEMCALL i286_memorywrite(UINT32 add | Line 900 void MEMCALL i286_memorywrite(UINT32 add |
| } | } |
| #endif | #endif |
| else { | else { |
| memory_write[(address >> 15) & 0x1f](address, value); | memfn.wr8[(address >> 15) & 0x1f](address, value); |
| } | } |
| } | } |
| Line 919 void MEMCALL i286_memorywrite_w(UINT32 a | Line 925 void MEMCALL i286_memorywrite_w(UINT32 a |
| } | } |
| #endif | #endif |
| else if ((address & 0x7fff) != 0x7fff) { | else if ((address & 0x7fff) != 0x7fff) { |
| memword_write[(address >> 15) & 0x1f](address, value); | memfn.wr16[(address >> 15) & 0x1f](address, value); |
| } | } |
| else { | else { |
| memory_write[(address >> 15) & 0x1f](address, (BYTE)value); | memfn.wr8[(address >> 15) & 0x1f](address, (BYTE)value); |
| address++; | address++; |
| memory_write[(address >> 15) & 0x1f](address, (BYTE)(value >> 8)); | memfn.wr8[(address >> 15) & 0x1f](address, (BYTE)(value >> 8)); |
| } | } |
| } | } |