Some changes
This commit is contained in:
79
cpu/core.c
79
cpu/core.c
@@ -93,10 +93,10 @@ void step(CPU *cpu) {
|
||||
write_mem(cpu, addrTemp, temp - 1);
|
||||
break;
|
||||
|
||||
case MOV_RN_IMM:
|
||||
case MOV_IMM_RN:
|
||||
//Load from immediate to register
|
||||
reg1 = read_reg_number(cpu);
|
||||
imm = read_mem(cpu, cpu->pc++);
|
||||
reg1 = read_reg_number(cpu);
|
||||
cpu->regs[reg1] = imm;
|
||||
break;
|
||||
|
||||
@@ -372,7 +372,43 @@ void step(CPU *cpu) {
|
||||
break;
|
||||
}
|
||||
|
||||
case JMP_BIT_SET_RN:
|
||||
case BITS_RN: {
|
||||
// Jump if bit in register set
|
||||
reg1 = read_reg_number(cpu);
|
||||
uint8_t bit = read_mem(cpu, cpu->pc++);
|
||||
|
||||
temp = read_reg(cpu, reg1);
|
||||
if (reg1 >= REG_COUNT) {
|
||||
reg1 = REG_COUNT - 1;
|
||||
}
|
||||
if (bit > 7) {
|
||||
bit = 7;
|
||||
}
|
||||
temp |= (1 << bit);
|
||||
write_reg(cpu, reg1, temp);
|
||||
cpu->pc += CPU_INSTRUCTION_SIZE;
|
||||
break;
|
||||
}
|
||||
|
||||
case BITC_RN: {
|
||||
// Jump if bit in register set
|
||||
reg1 = read_reg_number(cpu);
|
||||
uint8_t bit = read_mem(cpu, cpu->pc++);
|
||||
|
||||
temp = read_reg(cpu, reg1);
|
||||
if (reg1 >= REG_COUNT) {
|
||||
reg1 = REG_COUNT - 1;
|
||||
}
|
||||
if (bit > 7) {
|
||||
bit = 7;
|
||||
}
|
||||
temp &= ~(1 << bit);
|
||||
write_reg(cpu, reg1, temp);
|
||||
cpu->pc += CPU_INSTRUCTION_SIZE;
|
||||
break;
|
||||
}
|
||||
|
||||
case BIT_TS_RN: {
|
||||
// Jump if bit in register set
|
||||
reg1 = read_reg_number(cpu);
|
||||
uint8_t bit = read_mem(cpu, cpu->pc++);
|
||||
@@ -391,13 +427,40 @@ void step(CPU *cpu) {
|
||||
}
|
||||
cpu->pc += CPU_INSTRUCTION_SIZE;
|
||||
break;
|
||||
}
|
||||
|
||||
case JMP_BIT_SET_ADDR: {
|
||||
case BITS_ADDR: {
|
||||
// Jump if bit in register set
|
||||
addrTemp = read_address_argument(cpu);
|
||||
if (addrTemp >= MEM_SIZE) {
|
||||
addrTemp = MEM_SIZE - 1;
|
||||
uint8_t bit = read_mem(cpu, cpu->pc++);
|
||||
temp = read_mem(cpu, addrTemp);
|
||||
if (bit > 7) {
|
||||
bit = 7;
|
||||
}
|
||||
temp |= (1 << bit);
|
||||
write_mem(cpu, addrTemp, temp);
|
||||
cpu->pc += CPU_INSTRUCTION_SIZE;
|
||||
break;
|
||||
}
|
||||
|
||||
case BITC_ADDR: {
|
||||
// Jump if bit in register set
|
||||
addrTemp = read_address_argument(cpu);
|
||||
uint8_t bit = read_mem(cpu, cpu->pc++);
|
||||
|
||||
temp = read_mem(cpu, addrTemp);
|
||||
if (bit > 7) {
|
||||
bit = 7;
|
||||
}
|
||||
temp &= ~(1 << bit);
|
||||
write_mem(cpu, addrTemp, temp);
|
||||
cpu->pc += CPU_INSTRUCTION_SIZE;
|
||||
break;
|
||||
}
|
||||
|
||||
case BIT_TS_ADDR: {
|
||||
// Jump if bit in register set
|
||||
addrTemp = read_address_argument(cpu);
|
||||
uint8_t bit = read_mem(cpu, cpu->pc++);
|
||||
if (bit > 7) {
|
||||
bit = 7;
|
||||
@@ -423,7 +486,7 @@ void step(CPU *cpu) {
|
||||
break;
|
||||
}
|
||||
|
||||
case JMP_BIT_CLEAR_RN: {
|
||||
case BIT_TC_RN: {
|
||||
// Jump if bit in register set
|
||||
reg1 = read_reg_number(cpu);
|
||||
temp = read_reg(cpu, reg1);
|
||||
@@ -440,7 +503,7 @@ void step(CPU *cpu) {
|
||||
break;
|
||||
}
|
||||
|
||||
case JMP_BIT_CLEAR_ADDR: {
|
||||
case BIT_TC_ADDR: {
|
||||
// Jump if bit in register set
|
||||
addrTemp = read_address_argument(cpu);
|
||||
uint8_t bit = read_mem(cpu, cpu->pc++);
|
||||
|
17
cpu/core.h
17
cpu/core.h
@@ -22,6 +22,7 @@
|
||||
#define CPU_MODE_LOOP (1 << 3)
|
||||
#define CPU_MODE_STEP (1 << 4)
|
||||
#define CPU_MODE_SECOND (1 << 5)
|
||||
#define CPU_MODE_FRAME (1 << 6)
|
||||
|
||||
#define CPU_INSTRUCTION_SIZE 8 //Biggest instruction
|
||||
|
||||
@@ -56,7 +57,7 @@ typedef enum {
|
||||
|
||||
HLT,
|
||||
|
||||
MOV_RN_IMM, // MOV Rn, Imm - Move immediate to register (Rn = Imm)
|
||||
MOV_IMM_RN, // MOV Rn, Imm - Move immediate to register (Rn = Imm)
|
||||
MOV_RN_RM, // MOV Rn, Rm - Move value from one register to another (Rn = Rm)
|
||||
MOV_RN_ADDR, // MOV Rn, [Addr] - Load value from memory address into register (Rn = [Addr])
|
||||
MOV_ADDR_RN, // MOV [Addr], Rn - Store register value into memory address ([Addr] = Rn)
|
||||
@@ -114,11 +115,17 @@ typedef enum {
|
||||
JE, // JE Addr - Jump if equal (if zero flag set, PC = Addr)
|
||||
JNE, // JNE Addr - Jump if not equal (if zero flag not set, PC = Addr)
|
||||
|
||||
JMP_BIT_SET_RN, // jump relative if a given bit in a register is set
|
||||
JMP_BIT_SET_ADDR, // jump relative if a given bit in memory is set
|
||||
BIT_TS_RN, // jump relative if a given bit in a register is set
|
||||
BIT_TS_ADDR, // jump relative if a given bit in memory is set
|
||||
|
||||
JMP_BIT_CLEAR_RN, // jump relative if a given bit in a register is not set
|
||||
JMP_BIT_CLEAR_ADDR, // jump relative if a given bit in memory is not set
|
||||
BIT_TC_RN, // jump relative if a given bit in a register is not set
|
||||
BIT_TC_ADDR, // jump relative if a given bit in memory is not set
|
||||
|
||||
BITS_RN, // jump relative if a given bit in a register is set
|
||||
BITS_ADDR, // jump relative if a given bit in memory is set
|
||||
|
||||
BITC_RN, // jump relative if a given bit in a register is not set
|
||||
BITC_ADDR, // jump relative if a given bit in memory is not set
|
||||
|
||||
JG, // JG Addr - Jump if greater (if greater flag set, PC = Addr)
|
||||
|
||||
|
53
cpu/memory.c
53
cpu/memory.c
@@ -4,6 +4,8 @@
|
||||
|
||||
#include "memory.h"
|
||||
|
||||
#define SFR_OFFSET (0xDF00)
|
||||
|
||||
uint8_t write_mem(CPU *cpu, uint32_t addr, uint8_t value) {
|
||||
if (addr >= MEM_SIZE) {
|
||||
return 1;
|
||||
@@ -11,10 +13,50 @@ uint8_t write_mem(CPU *cpu, uint32_t addr, uint8_t value) {
|
||||
|
||||
switch (addr) {
|
||||
|
||||
case SFR_OFFSET + 0x00:
|
||||
pcm_buffer_push(&audioData.pcmVoice, value << 8 | cpu->memory[SFR_OFFSET + 0x01]);
|
||||
|
||||
case SFR_OFFSET + 0x02:
|
||||
audioData.synthVoices[0].volume = value;
|
||||
|
||||
case SFR_OFFSET + 0x03:
|
||||
audioData.synthVoices[0].waveform = value;
|
||||
|
||||
case SFR_OFFSET + 0x04:
|
||||
audioData.synthVoices[0].phase = value;
|
||||
|
||||
case SFR_OFFSET + 0x05:
|
||||
audioData.synthVoices[0].frequency = value << 8 | cpu->memory[SFR_OFFSET + 0x06];
|
||||
|
||||
case SFR_OFFSET + 0x07:
|
||||
audioData.synthVoices[1].volume = value;
|
||||
|
||||
case SFR_OFFSET + 0x08:
|
||||
audioData.synthVoices[1].waveform = value;
|
||||
|
||||
case SFR_OFFSET + 0x09:
|
||||
audioData.synthVoices[1].phase = value;
|
||||
|
||||
case SFR_OFFSET + 0x0A:
|
||||
audioData.synthVoices[1].frequency = value << 8 | cpu->memory[SFR_OFFSET + 0x0B];
|
||||
|
||||
case SFR_OFFSET + 0x0C:
|
||||
audioData.synthVoices[2].volume = value;
|
||||
|
||||
case SFR_OFFSET + 0x0D:
|
||||
audioData.synthVoices[2].waveform = value;
|
||||
|
||||
case SFR_OFFSET + 0x0E:
|
||||
audioData.synthVoices[2].phase = value;
|
||||
|
||||
case SFR_OFFSET + 0x0F:
|
||||
audioData.synthVoices[2].frequency = value << 8 | cpu->memory[SFR_OFFSET + 0x10];
|
||||
|
||||
default:
|
||||
cpu->memory[addr] = value;
|
||||
break;
|
||||
}
|
||||
|
||||
cpu->memory[addr] = value;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -50,6 +92,15 @@ uint32_t read_address_argument(CPU *cpu) {
|
||||
return out;
|
||||
}
|
||||
|
||||
uint8_t read_register_argument(CPU *cpu) {
|
||||
uint8_t out = read_mem(cpu, cpu->pc);
|
||||
cpu->pc += 1;
|
||||
if (out >= REG_COUNT) {
|
||||
out = REG_COUNT - 1;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
// Push a 32-bit program counter (PC) onto the stack
|
||||
void write_stack(CPU *cpu) {
|
||||
if (cpu->pc >= MEM_SIZE) {
|
||||
|
@@ -7,6 +7,7 @@
|
||||
|
||||
#include <stdint.h>
|
||||
#include "../cpu/core.h"
|
||||
#include "../peripherals/peripheraldata.h"
|
||||
|
||||
uint8_t write_mem32(CPU *cpu, uint32_t addr, uint32_t value);
|
||||
|
||||
@@ -32,5 +33,7 @@ uint8_t read_mem(CPU *cpu, uint32_t addr);
|
||||
|
||||
uint8_t write_mem(CPU *cpu, uint32_t addr, uint8_t value);
|
||||
|
||||
uint8_t read_register_argument(CPU *cpu);
|
||||
|
||||
|
||||
#endif //RISCB_MEMORY_H
|
||||
|
Reference in New Issue
Block a user