| version 1.2, 2003/10/21 11:22:05 | version 1.5, 2003/12/08 06:24:03 | 
| Line 1 | Line 1 | 
 | #include        "compiler.h" | #include        "compiler.h" | 
| #include        "i286.h" | #include        "cpucore.h" | 
 | #include        "memory.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 33  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 45  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 78  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); | 
 | } | } | 
 |  |  |