summaryrefslogtreecommitdiff
path: root/opcode.c
diff options
context:
space:
mode:
authormrb0nk500 <b0nk@b0nk.xyz>2019-12-06 11:21:12 -0500
committermrb0nk500 <b0nk@b0nk.xyz>2019-12-06 11:21:12 -0500
commitb4f547ecb600729e0e1b980c27c154b2a99bbca1 (patch)
tree3873c155918deadfa0bbaa91551deb31d62793e3 /opcode.c
parent5962c60342b9ed6562d7fb0f71a50ca9700b3735 (diff)
Finally got multithreading support working!!
I have also added a program that computes the Fibonacci sequence that I wrote in Sux assembly.
Diffstat (limited to 'opcode.c')
-rw-r--r--opcode.c167
1 files changed, 0 insertions, 167 deletions
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;
}