📄 memory.c
字号:
address8(io_registers, address) = value; break; // Sound FIFO A case 0xA0: sound_timer_queue8(0, value); break; // Sound FIFO B case 0xA4: sound_timer_queue8(1, value); break; // DMA control (trigger byte) case 0xBB: access_register8_low(0xBA); trigger_dma(0); break; case 0xC7: access_register8_low(0xC6); trigger_dma(1); break; case 0xD3: access_register8_low(0xD2); trigger_dma(2); break; case 0xDF: access_register8_low(0xDE); trigger_dma(3); break; // Timer counts case 0x100: access_register8_low(0x100); count_timer(0); break; case 0x101: access_register8_high(0x100); count_timer(0); break; case 0x104: access_register8_low(0x104); count_timer(1); break; case 0x105: access_register8_high(0x104); count_timer(1); break; case 0x108: access_register8_low(0x108); count_timer(2); break; case 0x109: access_register8_high(0x108); count_timer(2); break; case 0x10C: access_register8_low(0x10C); count_timer(3); break; case 0x10D: access_register8_high(0x10C); count_timer(3); break; // Timer control (trigger byte) case 0x103: access_register8_low(0x102); trigger_timer(0); break; case 0x107: access_register8_low(0x106); trigger_timer(1); break; case 0x10B: access_register8_low(0x10A); trigger_timer(2); break; case 0x10F: access_register8_low(0x10E); trigger_timer(3); break; // IF case 0x202: address8(io_registers, 0x202) &= ~value; break; case 0x203: address8(io_registers, 0x203) &= ~value; break; // Halt case 0x301: if((value & 0x01) == 0) reg[CPU_HALT_STATE] = CPU_HALT; else reg[CPU_HALT_STATE] = CPU_STOP; return CPU_ALERT_HALT; break; default: address8(io_registers, address) = value; break; } return CPU_ALERT_NONE;}cpu_alert_type function_cc write_io_register16(u32 address, u32 value){ switch(address) { case 0x00: { u32 dispcnt = io_registers[REG_DISPCNT]; if(value != dispcnt) oam_update = 1; address16(io_registers, 0x00) = value; break; } // DISPSTAT case 0x04: address16(io_registers, 0x04) = (address16(io_registers, 0x04) & 0x07) | (value & ~0x07); break; // VCOUNT case 0x06: break; // BG2 reference X case 0x28: access_register16_low(0x28); affine_reference_x[0] = (s32)(value << 4) >> 4; address32(io_registers, 0x28) = value; break; case 0x2A: access_register16_high(0x28); affine_reference_x[0] = (s32)(value << 4) >> 4; address32(io_registers, 0x28) = value; break; // BG2 reference Y case 0x2C: access_register16_low(0x2C); affine_reference_y[0] = (s32)(value << 4) >> 4; address32(io_registers, 0x2C) = value; break; case 0x2E: access_register16_high(0x2C); affine_reference_y[0] = (s32)(value << 4) >> 4; address32(io_registers, 0x2C) = value; break; // BG3 reference X case 0x38: access_register16_low(0x38); affine_reference_x[1] = (s32)(value << 4) >> 4; address32(io_registers, 0x38) = value; break; case 0x3A: access_register16_high(0x38); affine_reference_x[1] = (s32)(value << 4) >> 4; address32(io_registers, 0x38) = value; break; // BG3 reference Y case 0x3C: access_register16_low(0x3C); affine_reference_y[1] = (s32)(value << 4) >> 4; address32(io_registers, 0x3C) = value; break; case 0x3E: access_register16_high(0x3C); affine_reference_y[1] = (s32)(value << 4) >> 4; address32(io_registers, 0x3C) = value; break; // Sound 1 control sweep case 0x60: gbc_sound_tone_control_sweep(); break; // Sound 1 control duty/length/envelope case 0x62: gbc_sound_tone_control_low(0, 0x62); break; // Sound 1 control frequency case 0x64: gbc_sound_tone_control_high(0, 0x64); break; // Sound 2 control duty/length/envelope case 0x68: gbc_sound_tone_control_low(1, 0x68); break; // Sound 2 control frequency case 0x6C: gbc_sound_tone_control_high(1, 0x6C); break; // Sound 3 control wave case 0x70: gbc_sound_wave_control(); break; // Sound 3 control length/volume case 0x72: gbc_sound_tone_control_low_wave(); break; // Sound 3 control frequency case 0x74: gbc_sound_tone_control_high_wave(); break; // Sound 4 control length/envelope case 0x78: gbc_sound_tone_control_low(3, 0x78); break; // Sound 4 control frequency case 0x7C: gbc_sound_noise_control(); break; // Sound control L case 0x80: gbc_trigger_sound(); break; // Sound control H case 0x82: trigger_sound(); break; // Sound control X case 0x84: sound_on(); break; // Sound wave RAM case 0x90 ... 0x9E: gbc_sound_wave_update = 1; address16(io_registers, address) = value; break; // Sound FIFO A case 0xA0: sound_timer_queue16(0, value); break; // Sound FIFO B case 0xA4: sound_timer_queue16(1, value); break; // DMA control case 0xBA: trigger_dma(0); break; case 0xC6: trigger_dma(1); break; case 0xD2: trigger_dma(2); break; case 0xDE: trigger_dma(3); break; // Timer counts case 0x100: count_timer(0); break; case 0x104: count_timer(1); break; case 0x108: count_timer(2); break; case 0x10C: count_timer(3); break; // Timer control case 0x102: trigger_timer(0); break; case 0x106: trigger_timer(1); break; case 0x10A: trigger_timer(2); break; case 0x10E: trigger_timer(3); break; // P1 case 0x130: break; // Interrupt flag case 0x202: address16(io_registers, 0x202) &= ~value; break; // WAITCNT case 0x204: break; // Halt case 0x300: if(((value >> 8) & 0x01) == 0) reg[CPU_HALT_STATE] = CPU_HALT; else reg[CPU_HALT_STATE] = CPU_STOP; return CPU_ALERT_HALT; default: address16(io_registers, address) = value; break; } return CPU_ALERT_NONE;}cpu_alert_type function_cc write_io_register32(u32 address, u32 value){ switch(address) { // BG2 reference X case 0x28: affine_reference_x[0] = (s32)(value << 4) >> 4; address32(io_registers, 0x28) = value; break; // BG2 reference Y case 0x2C: affine_reference_y[0] = (s32)(value << 4) >> 4; address32(io_registers, 0x2C) = value; break; // BG3 reference X case 0x38: affine_reference_x[1] = (s32)(value << 4) >> 4; address32(io_registers, 0x38) = value; break; // BG3 reference Y case 0x3C: affine_reference_y[1] = (s32)(value << 4) >> 4; address32(io_registers, 0x3C) = value; break; // Sound FIFO A case 0xA0: sound_timer_queue32(0, value); break; // Sound FIFO B case 0xA4: sound_timer_queue32(1, value); break; default: { cpu_alert_type alert_low = write_io_register16(address, value & 0xFFFF); cpu_alert_type alert_high = write_io_register16(address + 2, value >> 16); if(alert_high) return alert_high; return alert_low; } } return CPU_ALERT_NONE;}#define write_palette8(address, value) \#define write_palette16(address, value) \{ \ u32 palette_address = address; \ address16(palette_ram, palette_address) = value; \ convert_palette(value); \ address16(palette_ram_converted, palette_address) = value; \} \#define write_palette32(address, value) \{ \ u32 palette_address = address; \ u32 value_high = value >> 16; \ u32 value_low = value & 0xFFFF; \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -