/* Set the memory pointers according to the values in the registers. */ void ted_update_memory_ptrs(unsigned int cycle) { /* FIXME: This is *horrible*! */ static BYTE *old_screen_ptr, *old_bitmap_ptr, *old_chargen_ptr; static BYTE *old_color_ptr; WORD screen_addr, char_addr, bitmap_addr, color_addr; BYTE *screen_base; /* Pointer to screen memory. */ BYTE *char_base; /* Pointer to character memory. */ BYTE *bitmap_base; /* Pointer to bitmap memory. */ BYTE *color_base; /* Pointer to color memory. */ int tmp; unsigned int video_romsel; unsigned int cpu_romsel; video_romsel = ted.regs[0x12] & 4; cpu_romsel = (ted.regs[0x13] & 1) << 2; screen_addr = ((ted.regs[0x14] & 0xf8) << 8) | 0x400; screen_base = mem_get_tedmem_base((screen_addr >> 14) | cpu_romsel) + (screen_addr & 0x3fff); TED_DEBUG_REGISTER(("\tVideo memory at $%04X", screen_addr)); bitmap_addr = (ted.regs[0x12] & 0x38) << 10; bitmap_base = mem_get_tedmem_base((bitmap_addr >> 14) | video_romsel) + (bitmap_addr & 0x3fff); TED_DEBUG_REGISTER(("\tBitmap memory at $%04X", bitmap_addr)); char_addr = (ted.regs[0x13] & (((ted.regs[0x06] & 0x40) | (ted.regs[0x07] & 0x80)) ? 0xf8 : 0xfc)) << 8; char_base = mem_get_tedmem_base((char_addr >> 14) | video_romsel) + (char_addr & 0x3fff); TED_DEBUG_REGISTER(("\tUser-defined character set at $%04X", char_addr)); color_addr = ((ted.regs[0x14] & 0xf8) << 8); color_base = mem_get_tedmem_base((color_addr >> 14) | cpu_romsel) + (color_addr & 0x3fff); TED_DEBUG_REGISTER(("\tColor memory at $%04X", color_addr)); tmp = TED_RASTER_CHAR(cycle); /* FIXME */ if (ted.idle_data_location != IDLE_NONE) { if (ted.idle_data_location == IDLE_39FF) { raster_changes_foreground_add_int(&ted.raster, TED_RASTER_CHAR(cycle), &ted.idle_data, mem_ram[0x39ff]); } else { raster_changes_foreground_add_int(&ted.raster, TED_RASTER_CHAR(cycle), &ted.idle_data, mem_ram[0x3fff]); } } if (ted.raster.skip_frame || (tmp <= 0 && maincpu_clk < ted.draw_clk)) { old_screen_ptr = ted.screen_ptr = screen_base; old_bitmap_ptr = ted.bitmap_ptr = bitmap_base; old_chargen_ptr = ted.chargen_ptr = char_base; old_color_ptr = ted.color_ptr = color_base; } else if (tmp < TED_SCREEN_TEXTCOLS) { if (screen_base != old_screen_ptr) { raster_changes_foreground_add_ptr(&ted.raster, tmp, (void *)&ted.screen_ptr, (void *)screen_base); old_screen_ptr = screen_base; } if (bitmap_base != old_bitmap_ptr) { raster_changes_foreground_add_ptr(&ted.raster, tmp, (void *)&ted.bitmap_ptr, (void *)(bitmap_base)); old_bitmap_ptr = bitmap_base; } if (char_base != old_chargen_ptr) { raster_changes_foreground_add_ptr(&ted.raster, tmp, (void *)&ted.chargen_ptr, (void *)char_base); old_chargen_ptr = char_base; } if (color_base != old_color_ptr) { raster_changes_foreground_add_ptr(&ted.raster, tmp, (void *)&ted.color_ptr, (void *)color_base); old_color_ptr = color_base; } } else { if (screen_base != old_screen_ptr) { raster_changes_next_line_add_ptr(&ted.raster, (void *)&ted.screen_ptr, (void *)screen_base); old_screen_ptr = screen_base; } if (bitmap_base != old_bitmap_ptr) { raster_changes_next_line_add_ptr(&ted.raster, (void *)&ted.bitmap_ptr, (void *)(bitmap_base)); old_bitmap_ptr = bitmap_base; } if (char_base != old_chargen_ptr) { raster_changes_next_line_add_ptr(&ted.raster, (void *)&ted.chargen_ptr, (void *)char_base); old_chargen_ptr = char_base; } if (color_base != old_color_ptr) { raster_changes_next_line_add_ptr(&ted.raster, (void *)&ted.color_ptr, (void *)color_base); old_color_ptr = color_base; } } }
/* Set the memory pointers according to the values stored in the VIC registers. */ void vic_update_memory_ptrs(void) { static BYTE *old_chargen_ptr = NULL; static BYTE *old_color_ptr = NULL; static BYTE *old_screen_ptr = NULL; WORD char_addr; int tmp; BYTE *new_chargen_ptr; BYTE *new_color_ptr; BYTE *new_screen_ptr; tmp = vic.regs[0x5] & 0xf; char_addr = (tmp & 0x8) ? 0x0000 : 0x8000; char_addr += (tmp & 0x7) * 0x400; if (char_addr >= 0x8000 && char_addr < 0x9000) { new_chargen_ptr = vic20memrom_chargen_rom + 0x400 + (char_addr & 0xfff); VIC_DEBUG_REGISTER(("Character memory at $%04X " "(character ROM + $%04X).", char_addr, char_addr & 0xfff)); } else { if (char_addr == 0x1c00) new_chargen_ptr = vic20memrom_chargen_rom; /* handle wraparound */ else new_chargen_ptr = mem_ram + char_addr; VIC_DEBUG_REGISTER (("Character memory at $%04X.", char_addr)); } new_color_ptr = mem_ram + 0x9400 + (vic.regs[0x2] & 0x80 ? 0x200 : 0x0); new_screen_ptr = mem_ram + (((vic.regs[0x2] & 0x80) << 2) | ((vic.regs[0x5] & 0x70) << 6)); VIC_DEBUG_REGISTER(("Color memory at $%04X.", vic.color_ptr - ram)); VIC_DEBUG_REGISTER(("Screen memory at $%04X.", vic.screen_ptr - ram)); if (new_chargen_ptr != old_chargen_ptr) { raster_changes_foreground_add_ptr(&vic.raster, VIC_RASTER_CHAR(VIC_RASTER_CYCLE(maincpu_clk) + 2), (void*)&vic.chargen_ptr, new_chargen_ptr); old_chargen_ptr = new_chargen_ptr; } if (new_color_ptr != old_color_ptr) { raster_changes_foreground_add_ptr(&vic.raster, VIC_RASTER_CHAR(VIC_RASTER_CYCLE(maincpu_clk) + 3), (void*)&vic.color_ptr, new_color_ptr); old_color_ptr = new_color_ptr; } if (new_screen_ptr != old_screen_ptr) { raster_changes_foreground_add_ptr(&vic.raster, VIC_RASTER_CHAR(VIC_RASTER_CYCLE(maincpu_clk) + 3), (void*)&vic.screen_ptr, new_screen_ptr); old_screen_ptr = new_screen_ptr; } }