diff --git a/A2Mac/ViewController.swift b/A2Mac/ViewController.swift index 03ab330..ecdd8cf 100644 --- a/A2Mac/ViewController.swift +++ b/A2Mac/ViewController.swift @@ -164,8 +164,8 @@ class ViewController: NSViewController { // static let blockChar : Character = "░" // static var flashingSpace : Character = " " - let ramBufferPointer = UnsafeRawBufferPointer(start: RAM, count: 64 * 1024) - let textBufferPointer = UnsafeRawBufferPointer(start: RAM + textBaseAddr, count: textBufferSize * 2) + let ramBufferPointer = UnsafeRawBufferPointer(start: MEM, count: 64 * 1024) + let textBufferPointer = UnsafeRawBufferPointer(start: MEM + textBaseAddr, count: textBufferSize * 2) let textAuxBufferPointer = UnsafeRawBufferPointer(start: AUX + textBaseAddr, count: textBufferSize) static let textArraySize = textLines * (textCols + lineEndChars) + textCols * 2 diff --git a/src/cpu/6502.h b/src/cpu/6502.h index cad0a43..713040d 100644 --- a/src/cpu/6502.h +++ b/src/cpu/6502.h @@ -129,7 +129,7 @@ extern MEMcfg_t MEMcfg; extern m6502_t m6502; extern uint8_t * const AUX; // Pointer to the auxiliary memory so we can use this from Swift extern uint8_t * const RAM; -//extern uint8_t * AUX_VID_RAM; +extern uint8_t * const MEM; // Pointer to the Shadow Memory Map so we can use this from Swift//extern uint8_t * AUX_VID_RAM; extern uint32_t * videoMemPtr; extern void hires_Update(void); diff --git a/src/cpu/instructions/6502_instr_stack.h b/src/cpu/instructions/6502_instr_stack.h index d7d9f0f..3c13232 100644 --- a/src/cpu/instructions/6502_instr_stack.h +++ b/src/cpu/instructions/6502_instr_stack.h @@ -13,9 +13,8 @@ static const uint16_t stack_base_addr = 0x100; INLINE void PUSH( uint8_t src ) { -// RAM[ stack_base_addr | m6502.SP-- ] = src; // DO NOT MAKE IT NICER! faster this way! - *( RAM_PG_WR_TBL[ stack_base_addr >> 8 ] + m6502.SP-- ) = src; + WRLOMEM[ stack_base_addr | m6502.SP-- ] = src; } INLINE uint8_t POP() { diff --git a/src/dev/mem/mmio.h b/src/dev/mem/mmio.h index 9ca777d..00ff13d 100644 --- a/src/dev/mem/mmio.h +++ b/src/dev/mem/mmio.h @@ -427,37 +427,36 @@ void resetMemory() { } +static uint8_t page2 = 0; + void textPageSelect() { uint8_t * shadow = Apple2_64K_MEM + 0x400; - uint8_t * memory; - - if ( MEMcfg.is_80STORE && MEMcfg.txt_page_2 ) { - memory = Apple2_64K_AUX + 0x400; + + if ( page2 != MEMcfg.txt_page_2 ) { + page2 = MEMcfg.txt_page_2; - // save the content of Shadow Memory - memcpy(Apple2_64K_RAM + 0x400, shadow, 0x400); - - // load the content of Video Page 2 - memcpy(Apple2_64K_MEM + 0x400, Apple2_64K_AUX, 0x400); - - SWITCH_VIDEO_RAM( RAM_PG_RD_TBL, 0x04, Apple2_64K_AUX, 0x04) - SWITCH_VIDEO_RAM( RAM_PG_WR_TBL, 0x04, Apple2_64K_AUX, 0x04) + if ( MEMcfg.is_80STORE && MEMcfg.txt_page_2 ) { + // save the content of Shadow Memory + memcpy(Apple2_64K_RAM + 0x400, shadow, 0x400); + + // load the content of Video Page 2 + memcpy(shadow, Apple2_64K_AUX, 0x400); + + SWITCH_VIDEO_RAM( RAM_PG_RD_TBL, 0x04, Apple2_64K_MEM, 0x04) + SWITCH_VIDEO_RAM( RAM_PG_WR_TBL, 0x04, Apple2_64K_MEM, 0x04) + } + else { + // save the content of Shadow Memory + memcpy(Apple2_64K_AUX + 0x400, shadow, 0x400); + + // load the content of Video Page 2 + memcpy(shadow, Apple2_64K_RAM, 0x400); + + SWITCH_VIDEO_RAM( RAM_PG_RD_TBL, 0x04, Apple2_64K_MEM, 0x04) + SWITCH_VIDEO_RAM( RAM_PG_WR_TBL, 0x04, Apple2_64K_MEM, 0x04) + } } - else { - memory = Apple2_64K_RAM + 0x400; - - // save the content of Shadow Memory - memcpy(Apple2_64K_AUX + 0x400, shadow, 0x400); - - // load the content of Video Page 2 - memcpy(Apple2_64K_MEM + 0x400, Apple2_64K_RAM, 0x400); - - SWITCH_VIDEO_RAM( RAM_PG_RD_TBL, 0x04, Apple2_64K_RAM, 0x04) - SWITCH_VIDEO_RAM( RAM_PG_WR_TBL, 0x04, Apple2_64K_RAM, 0x04) - } - - // load new content to shadow memory - memcpy(shadow, memory, 0x400); + } @@ -475,7 +474,7 @@ void auxMemorySelect() { // load the content of Aux Memory memcpy(Apple2_64K_MEM + 0x200, Apple2_64K_AUX, 0xA00); - SWITCH_AUX_MEM( RAM_PG_RD_TBL, Apple2_64K_AUX ); + SWITCH_AUX_MEM( RAM_PG_RD_TBL, Apple2_64K_MEM ); } else { memory = Apple2_64K_RAM + 0x200; @@ -486,19 +485,19 @@ void auxMemorySelect() { // load the content of Int Memory memcpy(Apple2_64K_MEM + 0x200, Apple2_64K_RAM, 0xA00); - SWITCH_AUX_MEM( RAM_PG_RD_TBL, Apple2_64K_RAM ); + SWITCH_AUX_MEM( RAM_PG_RD_TBL, Apple2_64K_MEM ); } if ( MEMcfg.WR_AUX_MEM ) { - SWITCH_AUX_MEM( RAM_PG_WR_TBL, Apple2_64K_AUX ); + SWITCH_AUX_MEM( RAM_PG_WR_TBL, Apple2_64K_MEM ); } else { - SWITCH_AUX_MEM( RAM_PG_WR_TBL, Apple2_64K_RAM ); + SWITCH_AUX_MEM( RAM_PG_WR_TBL, Apple2_64K_MEM ); } } else { - SWITCH_AUX_MEM( RAM_PG_RD_TBL, Apple2_64K_RAM ); - SWITCH_AUX_MEM( RAM_PG_WR_TBL, Apple2_64K_RAM ); + SWITCH_AUX_MEM( RAM_PG_RD_TBL, Apple2_64K_MEM ); + SWITCH_AUX_MEM( RAM_PG_WR_TBL, Apple2_64K_MEM ); } // load new content to shadow memory @@ -946,9 +945,11 @@ INLINE uint8_t memread( uint16_t addr ) { return ioRead(addr); } +// return memread8_paged(addr); return memread8_high(addr); } +// return memread8_paged(addr); return memread8_low(addr); // return memread8(addr); @@ -1031,8 +1032,7 @@ INLINE uint8_t src_abs() { return memread( addr_abs() ); } INLINE uint8_t * dest_abs() { - uint16_t addr = addr_abs(); - return ( RAM_PG_WR_TBL[addr >> 8] + (addr & 0xFF) ); + return WRLOMEM + addr_abs(); } @@ -1063,8 +1063,7 @@ INLINE uint8_t src_abs_X() { return memread( addr_abs_X() ); } INLINE uint8_t * dest_abs_X() { - uint16_t addr = addr_abs_X(); - return ( RAM_PG_WR_TBL[addr >> 8] + (addr & 0xFF) ); + return WRLOMEM + addr_abs_X(); } @@ -1081,8 +1080,7 @@ INLINE uint8_t src_abs_Y() { return memread(addr_abs_Y()); } INLINE uint8_t * dest_abs_Y() { - uint16_t addr = addr_abs_Y(); - return ( RAM_PG_WR_TBL[addr >> 8] + (addr & 0xFF) ); + return WRLOMEM + addr_abs_Y(); } INLINE uint16_t imm() { @@ -1104,8 +1102,7 @@ INLINE uint8_t src_zp() { return memread8(addr_zp()); } INLINE uint8_t * dest_zp() { - uint16_t addr = addr_zp(); - return ( RAM_PG_WR_TBL[addr >> 8] + (addr & 0xFF) ); + return WRLOMEM + addr_zp(); } /** @@ -1133,8 +1130,7 @@ INLINE uint8_t src_X_ind() { return memread( addr_X_ind() ); } INLINE uint8_t * dest_X_ind() { - uint16_t addr = addr_X_ind(); - return ( RAM_PG_WR_TBL[addr >> 8] + (addr & 0xFF) ); + return WRLOMEM + addr_X_ind(); } /** @@ -1153,8 +1149,7 @@ INLINE uint8_t src_ind_Y() { return memread( addr_ind_Y() ); } INLINE uint8_t * dest_ind_Y() { - uint16_t addr = addr_ind_Y(); - return ( RAM_PG_WR_TBL[addr >> 8] + (addr & 0xFF) ); + return WRLOMEM + addr_ind_Y(); } /** @@ -1170,8 +1165,7 @@ INLINE uint8_t src_zp_X() { return memread8(addr_zp_X()); } INLINE uint8_t * dest_zp_X() { - uint16_t addr = addr_zp_X(); - return ( RAM_PG_WR_TBL[addr >> 8] + (addr & 0xFF) ); + return WRLOMEM + addr_zp_X(); } /** @@ -1187,8 +1181,7 @@ INLINE uint8_t src_zp_Y() { return memread8(addr_zp_Y()); } INLINE uint8_t * dest_zp_Y() { - uint16_t addr = addr_zp_Y(); - return ( RAM_PG_WR_TBL[addr >> 8] + (addr & 0xFF) ); + return WRLOMEM + addr_zp_Y(); }