From b4f547ecb600729e0e1b980c27c154b2a99bbca1 Mon Sep 17 00:00:00 2001 From: mrb0nk500 Date: Fri, 6 Dec 2019 11:21:12 -0500 Subject: Finally got multithreading support working!! I have also added a program that computes the Fibonacci sequence that I wrote in Sux assembly. --- opcode.c | 167 --------------------------------------------------------------- 1 file changed, 167 deletions(-) (limited to 'opcode.c') diff --git a/opcode.c b/opcode.c index 036a4fb..847ff80 100644 --- a/opcode.c +++ b/opcode.c @@ -9,55 +9,6 @@ void setps(struct sux *cpu, uint8_t thread) { (cpu->n[thread]) ? (cpu->ps |= (N << 8*thread)) : (cpu->ps &= ~(N << 8*thread)); } -void adc(struct sux *cpu, uint64_t adr, uint8_t thread, uint8_t regsize) { - uint64_t value; - value = (uint64_t)addr[adr]; - if (regsize >= 2) { - value += (uint64_t)addr[adr+1] << 8; - } - if (regsize >= 4) { - value += (uint64_t)addr[adr+2] << 16; - value += (uint64_t)addr[adr+3] << 24; - } - if (regsize >= 8) { - value += (uint64_t)addr[adr+4] << 32; - value += (uint64_t)addr[adr+5] << 40; - value += (uint64_t)addr[adr+6] << 48; - value += (uint64_t)addr[adr+7] << 56; - } - uint64_t sum = cpu->a[thread]+value+cpu->c[thread]; - cpu->z[thread] = (sum == 0); - cpu->n[thread] = (sum >> 63); - cpu->v[thread] = !((cpu->a[thread]^value) & 0x8000000000000000) && ((cpu->a[thread]^sum) & 0x8000000000000000); - cpu->c[thread] = (sum < value); - cpu->a[thread] = sum; - setps(cpu, thread); -} - -void sbc(struct sux *cpu, uint64_t adr, uint8_t thread, uint8_t regsize) { - uint64_t value; - value = (uint64_t)addr[adr]; - if (regsize >= 2) - value += (uint64_t)addr[adr+1] << 8; - if (regsize >= 4) { - value += (uint64_t)addr[adr+2] << 16; - value += (uint64_t)addr[adr+3] << 24; - } - if (regsize >= 8) { - value += (uint64_t)addr[adr+4] << 32; - value += (uint64_t)addr[adr+5] << 40; - value += (uint64_t)addr[adr+6] << 48; - value += (uint64_t)addr[adr+7] << 56; - } - uint64_t sum = cpu->a[thread]-value-!cpu->c[thread]; - cpu->z[thread] = (sum == 0); - cpu->n[thread] = (sum >> 63); - cpu->v[thread] = ((cpu->a[thread]^value) & 0x8000000000000000) && ((cpu->a[thread]^sum) & 0x8000000000000000); - cpu->c[thread] = (sum > value); - cpu->a[thread] = sum; - setps(cpu, thread); -} - void mul(struct sux *cpu, uint64_t adr, uint8_t thread, uint8_t regsize) { uint64_t value; value = (uint64_t)addr[adr]; @@ -104,15 +55,6 @@ void divd(struct sux *cpu, uint64_t adr, uint8_t thread, uint8_t regsize) { setps(cpu, thread); } -uint64_t and(struct sux *cpu, uint64_t value, uint8_t thread) { - uint64_t sum; - sum &= value; - cpu->z[thread] = (sum == 0); - cpu->n[thread] = (sum >> 63); - setps(cpu, thread); - return sum; -} - void and_addr(struct sux *cpu, uint64_t* const reg, uint64_t adr, uint8_t thread, uint8_t regsize) { uint64_t value; value = (uint64_t)addr[adr]; @@ -134,15 +76,6 @@ void and_addr(struct sux *cpu, uint64_t* const reg, uint64_t adr, uint8_t thread setps(cpu, thread); } -uint64_t or(struct sux *cpu, uint64_t value, uint8_t thread) { - uint64_t sum; - sum |= value; - cpu->z[thread] = (sum == 0); - cpu->n[thread] = (sum >> 63); - setps(cpu, thread); - return sum; -} - void or_addr(struct sux *cpu, uint64_t* const reg, uint64_t adr, uint8_t thread, uint8_t regsize) { uint64_t value; value = (uint64_t)addr[adr]; @@ -164,15 +97,6 @@ void or_addr(struct sux *cpu, uint64_t* const reg, uint64_t adr, uint8_t thread, setps(cpu, thread); } -uint64_t xor(struct sux *cpu, uint64_t value, uint8_t thread) { - uint64_t sum; - sum ^= value; - cpu->z[thread] = (sum == 0); - cpu->n[thread] = (sum >> 63); - setps(cpu, thread); - return sum; -} - void xor_addr(struct sux *cpu, uint64_t* const reg, uint64_t adr, uint8_t thread, uint8_t regsize) { uint64_t value; value = (uint64_t)addr[adr]; @@ -194,50 +118,6 @@ void xor_addr(struct sux *cpu, uint64_t* const reg, uint64_t adr, uint8_t thread setps(cpu, thread); } -void rol(struct sux *cpu, uint64_t adr, uint8_t thread) { - uint64_t value = addr[adr]; - uint64_t sum = cpu->a[thread] << value; - sum |= cpu->c[thread]; - cpu->z[thread] = (sum == 0); - cpu->n[thread] = (sum >> 63); - cpu->c[thread] = cpu->a[thread] >> (uint64_t)64-value; - cpu->a[thread] = sum; - setps(cpu, thread); -} - -void ror(struct sux *cpu, uint64_t adr, uint8_t thread) { - uint64_t value = addr[adr]; - uint64_t sum = cpu->a[thread] >> value; - sum |= (uint64_t)cpu->c[thread] << (uint64_t)64-value; - cpu->c[thread] = cpu->a[thread] & 1; - cpu->a[thread] = sum; - setps(cpu, thread); -} - -void lsl(struct sux *cpu, uint64_t adr, uint8_t thread) { - uint64_t value = addr[adr]; - uint64_t sum = (value < 64) ? cpu->a[thread] << value : 0; - cpu->c[thread] = cpu->a[thread] >> 64-value; - cpu->a[thread] = sum; - setps(cpu, thread); -} - -void lsr(struct sux *cpu, uint64_t adr, uint8_t thread) { - uint64_t value = addr[adr]; - uint64_t sum = (value < 64) ? cpu->a[thread] >> value : 0; - cpu->c[thread] = cpu->a[thread] & 1; - cpu->a[thread] = sum; - setps(cpu, thread); -} - -void inc_addr(struct sux *cpu, uint64_t adr, uint8_t thread) { - addr[adr]++; -} - -void dec_addr(struct sux *cpu, uint64_t adr, uint8_t thread) { - addr[adr]--; -} - void stt(struct sux* const cpu, uint8_t value) { uint16_t tv = 0xFF50; /* Thread Vector. */ uint8_t t = addr[value]; @@ -313,52 +193,9 @@ uint8_t pull(struct sux *cpu) { return addr[STK_STADDR+cpu->sp]; } -void cmp_addr(struct sux *cpu, uint64_t reg, uint64_t adr, uint8_t thread, uint8_t regsize) { - uint64_t value; - value = (uint64_t)addr[adr]; - if (regsize >= 2) - value += (uint64_t)addr[adr+1] << 8; - if (regsize >= 4) { - value += (uint64_t)addr[adr+2] << 16; - value += (uint64_t)addr[adr+3] << 24; - } - if (regsize >= 8) { - value += (uint64_t)addr[adr+4] << 32; - value += (uint64_t)addr[adr+5] << 40; - value += (uint64_t)addr[adr+6] << 48; - value += (uint64_t)addr[adr+7] << 56; - } - uint64_t sum = reg-value; - cpu->n[thread] = (sum & 0x8000000000000000) ? 1 : 0; - cpu->z[thread] = (sum == 0) ? 1 : 0; - cpu->c[thread] = (sum > value) ? 1 : 0; - setps(cpu, thread); -} - -void cmp(struct sux *cpu, uint64_t reg1, uint64_t reg2, uint8_t thread) { - uint64_t sum = reg1-reg2; - cpu->n[thread] = (sum & 0x8000000000000000) ? 1 : 0; - cpu->z[thread] = (sum == 0) ? 1 : 0; - cpu->c[thread] = (sum > reg2) ? 1 : 0; - setps(cpu, thread); -} - -/* Branch if Flag Set. */ -void bfs(struct sux *cpu, uint8_t flag, uint64_t adr, uint8_t thread) { - if (flag) - cpu->pc[thread] = adr; -} - -/* Branch if Flag Clear. */ -void bfc(struct sux *cpu, uint8_t flag, uint64_t adr, uint8_t thread) { - if (!flag) - cpu->pc[thread] = adr; -} - uint64_t immaddr(struct sux *cpu, uint8_t thread, uint8_t size) { uint64_t adr = cpu->pc[thread]; cpu->pc[thread]+=size; - clk++; return adr; } @@ -372,7 +209,6 @@ uint64_t absaddr(struct sux *cpu, uint8_t thread) { | (uint64_t)addr[cpu->pc[thread]+6] << 48 | (uint64_t)addr[cpu->pc[thread]+7] << 56; cpu->pc[thread]+=8; - clk++; return adr; } @@ -382,7 +218,6 @@ uint32_t zeromtx(struct sux *cpu, uint8_t thread) { | (uint32_t)addr[cpu->pc[thread]+2] << 16 | (uint32_t)addr[cpu->pc[thread]+3] << 24; cpu->pc[thread]+=4; - clk++; return adr; } @@ -393,7 +228,6 @@ uint32_t zeromx(struct sux *cpu, uint8_t thread) { | (uint32_t)addr[cpu->pc[thread]+3] << 24; adr += cpu->x[thread]; cpu->pc[thread]+=4; - clk++; return adr; } @@ -404,6 +238,5 @@ uint32_t zeromy(struct sux *cpu, uint8_t thread) { | (uint32_t)addr[cpu->pc[thread]+3] << 24; adr += cpu->y[thread]; cpu->pc[thread]+=4; - clk++; return adr; } -- cgit v1.2.3-13-gbd6f