Do some stuff
This commit is contained in:
93
cpu/memory.c
93
cpu/memory.c
@@ -6,6 +6,12 @@
|
||||
|
||||
#define SFR_OFFSET (0xDF00)
|
||||
|
||||
#define GPU_OFFSET (0xEF00)
|
||||
|
||||
#define GPU_SIZE (160 * 160)
|
||||
|
||||
#define GPU_END (GPU_OFFSET + GPU_SIZE)
|
||||
|
||||
uint8_t write_mem(CPU *cpu, uint32_t addr, uint8_t value) {
|
||||
if (addr >= MEM_SIZE) {
|
||||
return 1;
|
||||
@@ -15,47 +21,110 @@ uint8_t write_mem(CPU *cpu, uint32_t addr, uint8_t value) {
|
||||
|
||||
case SFR_OFFSET + 0x00:
|
||||
pcm_buffer_push(&audioData.pcmVoice, value << 8 | cpu->memory[SFR_OFFSET + 0x01]);
|
||||
break;
|
||||
|
||||
case SFR_OFFSET + 0x02:
|
||||
audioData.synthVoices[0].volume = value;
|
||||
break;
|
||||
|
||||
case SFR_OFFSET + 0x03:
|
||||
audioData.synthVoices[0].waveform = value;
|
||||
break;
|
||||
|
||||
case SFR_OFFSET + 0x04:
|
||||
audioData.synthVoices[0].phase = value;
|
||||
break;
|
||||
|
||||
case SFR_OFFSET + 0x05:
|
||||
audioData.synthVoices[0].frequency = value << 8 | cpu->memory[SFR_OFFSET + 0x06];
|
||||
break;
|
||||
|
||||
case SFR_OFFSET + 0x07:
|
||||
audioData.synthVoices[1].volume = value;
|
||||
break;
|
||||
|
||||
case SFR_OFFSET + 0x08:
|
||||
audioData.synthVoices[1].waveform = value;
|
||||
break;
|
||||
|
||||
case SFR_OFFSET + 0x09:
|
||||
audioData.synthVoices[1].phase = value;
|
||||
break;
|
||||
|
||||
case SFR_OFFSET + 0x0A:
|
||||
audioData.synthVoices[1].frequency = value << 8 | cpu->memory[SFR_OFFSET + 0x0B];
|
||||
break;
|
||||
|
||||
case SFR_OFFSET + 0x0C:
|
||||
audioData.synthVoices[2].volume = value;
|
||||
break;
|
||||
|
||||
case SFR_OFFSET + 0x0D:
|
||||
audioData.synthVoices[2].waveform = value;
|
||||
break;
|
||||
|
||||
case SFR_OFFSET + 0x0E:
|
||||
audioData.synthVoices[2].phase = value;
|
||||
break;
|
||||
|
||||
case SFR_OFFSET + 0x0F:
|
||||
audioData.synthVoices[2].frequency = value << 8 | cpu->memory[SFR_OFFSET + 0x10];
|
||||
break;
|
||||
|
||||
case SFR_OFFSET + 0x12:
|
||||
displayA.value = value;
|
||||
break;
|
||||
|
||||
case SFR_OFFSET + 0x13:
|
||||
displayB.value = value;
|
||||
break;
|
||||
|
||||
case SFR_OFFSET + 0x14:
|
||||
displayC.value = value;
|
||||
break;
|
||||
|
||||
case SFR_OFFSET + 0x15:
|
||||
displayD.value = value;
|
||||
break;
|
||||
|
||||
case SFR_OFFSET + 0x16:
|
||||
displayE.value = value;
|
||||
break;
|
||||
|
||||
case SFR_OFFSET + 0x17:
|
||||
displayF.value = value;
|
||||
break;
|
||||
|
||||
case SFR_OFFSET + 0x18:
|
||||
displayG.value = value;
|
||||
break;
|
||||
|
||||
case SFR_OFFSET + 0x19:
|
||||
displayH.value = value;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (addr >= GPU_OFFSET && addr < GPU_END) {
|
||||
const int index = addr - GPU_OFFSET;
|
||||
int x = index % 160;
|
||||
int y = index / 160;
|
||||
|
||||
// Proper color scaling from 3-bit and 2-bit channels
|
||||
Uint8 r = ((value & 0xE0) >> 5) * 36; // 0–7 mapped to 0–255
|
||||
Uint8 g = ((value & 0x1C) >> 2) * 36;
|
||||
Uint8 b = ((value & 0x03)) * 85; // 0–3 mapped to 0–255
|
||||
|
||||
// Ensure texture format matches RGBA8888
|
||||
Uint32 color = (255 << 24) | (r << 16) | (g << 8) | b;
|
||||
|
||||
Uint32 *pixels = (Uint32 *) gpuSurf->pixels;
|
||||
pixels[(y * gpuSurf->w) + x] = color;
|
||||
gpuSurfDirty = true;
|
||||
}
|
||||
|
||||
cpu->memory[addr] = value;
|
||||
return 0;
|
||||
}
|
||||
@@ -66,6 +135,30 @@ uint8_t read_mem(CPU *cpu, uint32_t addr) {
|
||||
}
|
||||
switch (addr) {
|
||||
|
||||
case SFR_OFFSET + 0x20:
|
||||
return (switchesA.value >> 8) & 0xFF;
|
||||
|
||||
case SFR_OFFSET + 0x21:
|
||||
return switchesA.value & 0xFF;
|
||||
|
||||
case SFR_OFFSET + 0x22:
|
||||
return (switchesB.value >> 8) & 0xFF;
|
||||
|
||||
case SFR_OFFSET + 0x23:
|
||||
return switchesB.value & 0xFF;
|
||||
|
||||
case SFR_OFFSET + 0x24:
|
||||
return (switchesC.value >> 8) & 0xFF;
|
||||
|
||||
case SFR_OFFSET + 0x25:
|
||||
return switchesC.value & 0xFF;
|
||||
|
||||
case SFR_OFFSET + 0x26:
|
||||
return (switchesD.value >> 8) & 0xFF;
|
||||
|
||||
case SFR_OFFSET + 0x27:
|
||||
return switchesD.value & 0xFF;
|
||||
|
||||
default:
|
||||
return cpu->memory[addr];
|
||||
}
|
||||
|
Reference in New Issue
Block a user