|
|
| version 1.2, 2003/10/21 11:22:05 | version 1.6, 2003/12/12 01:04:40 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #include "i286.h" | #include "cpucore.h" |
| #include "memory.h" | |
| #include "pccore.h" | #include "pccore.h" |
| #include "iocore.h" | #include "iocore.h" |
| BYTE *extmemmng_ptr; | |
| UINT32 extmemmng_size; | |
| void extmemmng_clear(void) { | void extmemmng_clear(void) { |
| if (extmemmng_ptr) { | if (CPU_EXTMEM) { |
| free(extmemmng_ptr); | _MFREE(CPU_EXTMEM); |
| extmemmng_ptr = NULL; | CPU_EXTMEM = NULL; |
| extmemmng_size = 0; | CPU_EXTMEMSIZE = 0; |
| } | } |
| } | } |
| BOOL extmemmng_realloc(UINT megabytes) { | BOOL extmemmng_realloc(UINT megabytes) { |
| megabytes <<= 20; | megabytes <<= 20; |
| if (megabytes != extmemmng_size) { | if (megabytes != CPU_EXTMEMSIZE) { |
| extmemmng_clear(); | extmemmng_clear(); |
| if (megabytes) { | if (megabytes) { |
| extmemmng_ptr = (BYTE *)malloc(megabytes + 16); | CPU_EXTMEM = (BYTE *)_MALLOC(megabytes + 16, "EXTMEM"); |
| if (extmemmng_ptr == NULL) { | if (CPU_EXTMEM == NULL) { |
| return(FAILURE); | return(FAILURE); |
| } | } |
| } | } |
| extmemmng_size = megabytes; | CPU_EXTMEMSIZE = megabytes; |
| } | } |
| return(SUCCESS); | return(SUCCESS); |
| } | } |
| Line 37 BOOL extmemmng_realloc(UINT megabytes) { | Line 32 BOOL extmemmng_realloc(UINT megabytes) { |
| // ---- I/O | // ---- I/O |
| static void IOOUTCALL emm_o08e1(UINT port, BYTE dat) { | static void IOOUTCALL emm_o08e1(UINT port, REG8 dat) { |
| UINT pos; | UINT pos; |
| if (!(CPUTYPE & CPUTYPE_V30)) { | if (!(CPU_TYPE & CPUTYPE_V30)) { |
| pos = (port >> 1) & 3; | pos = (port >> 1) & 3; |
| if (!extmem.target) { // ver0.28 | if (!extmem.target) { // ver0.28 |
| extmem.page[pos] = 0xffffffff; | extmem.page[pos] = 0xffffffff; |
| Line 49 static void IOOUTCALL emm_o08e1(UINT por | Line 44 static void IOOUTCALL emm_o08e1(UINT por |
| } | } |
| else if (extmem.target < extmem.maxmem) { // ver0.28 | else if (extmem.target < extmem.maxmem) { // ver0.28 |
| dat &= 0xfc; | dat &= 0xfc; |
| extmem.page[pos] = ((extmem.target-1) << 8) + dat; | extmem.page[pos] = ((extmem.target - 1) << 8) + dat; |
| extmem.pageptr[pos] = extmemmng_ptr + | extmem.pageptr[pos] = CPU_EXTMEM + (extmem.page[pos] << 12); |
| (extmem.page[pos] << 12); | |
| } | } |
| } | } |
| } | } |
| static void IOOUTCALL emm_o08e9(UINT port, BYTE dat) { | static void IOOUTCALL emm_o08e9(UINT port, REG8 dat) { |
| if (!(CPUTYPE & CPUTYPE_V30)) { | if (!(CPU_TYPE & CPUTYPE_V30)) { |
| extmem.target = dat & 0x0f; | extmem.target = dat & 0x0f; |
| } | } |
| (void)port; | (void)port; |
| } | } |
| static BYTE IOINPCALL emm_i08e9(UINT port) { | static REG8 IOINPCALL emm_i08e9(UINT port) { |
| if ((!(CPUTYPE & CPUTYPE_V30)) && | if ((!(CPU_TYPE & CPUTYPE_V30)) && |
| (extmem.target) && (extmem.target < extmem.maxmem)) { | (extmem.target) && (extmem.target < extmem.maxmem)) { |
| return(0); | return(0); |
| } | } |
| Line 83 BOOL extmem_init(BYTE usemem) { | Line 77 BOOL extmem_init(BYTE usemem) { |
| UINT i; | UINT i; |
| if (usemem > 13) { // ver0.28 | if (usemem > 13) { |
| usemem = 13; | usemem = 13; |
| } | } |
| extmem.adrsmask = 0x0fffff; | |
| extmem.target = 0; | extmem.target = 0; |
| extmem.maxmem = 0; | extmem.maxmem = 0; |
| for (i=0; i<4; i++) { | for (i=0; i<4; i++) { |
| extmem.page[i] = 0xffffffff; | extmem.page[i] = 0xffffffff; |
| extmem.pageptr[i] = mem + 0xc0000 + (i << 14); // ver0.28 | extmem.pageptr[i] = mem + 0xc0000 + (i << 14); |
| } | } |
| if (extmemmng_realloc(usemem)) { | if (extmemmng_realloc(usemem)) { |
| return(FAILURE); | return(FAILURE); |
| } | } |
| extmem.maxmem = usemem + 1; | extmem.maxmem = usemem + 1; |
| #if defined(CPUCORE_IA32) | |
| init_cpumem(usemem); | |
| #endif | |
| return(SUCCESS); | return(SUCCESS); |
| } | } |