From 3c16d5d7bd5b3a6ad2c70a821c73e9aacf75f217 Mon Sep 17 00:00:00 2001 From: attilavs2 Date: Sun, 26 Jan 2025 12:08:44 +0100 Subject: [PATCH] =?UTF-8?q?Progr=C3=A8s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + interpr/a.out | Bin 16336 -> 16504 bytes interpr/src/main.c | 119 +++++++++++++++++++-------------------------- interpr/test.bin | Bin 0 -> 570 bytes spec.txt | 24 ++++++--- 5 files changed, 68 insertions(+), 76 deletions(-) create mode 100644 .gitignore create mode 100644 interpr/test.bin diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f47cb20 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.out diff --git a/interpr/a.out b/interpr/a.out index fb0e5df22c661149fbd6ba2bd0d407bf56e550ac..e95aaaac1d1843dd64535aafa69f111986750eca 100755 GIT binary patch literal 16504 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 qTVu9|*I$|+YkRgRv`*zRE&Khi-m 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 diff --git a/interpr/src/main.c b/interpr/src/main.c index 161e81c..f0924b7 100644 --- a/interpr/src/main.c +++ b/interpr/src/main.c @@ -2,37 +2,27 @@ #include #include #include +#include #define MEM_ALLOC 0xFFFF //64KiB #define TOTAL_ALLOC (MEM_ALLOC) -#define BOOTCODE_S 18 - -uint8_t bootcode[] = { - 0x00,0xFF, - 0xFF,0x00, - 0x00,0x06, - 0x72,0x00, - 0xB6,0xE0, - 0xE0,0x0E, - 0xB6,0xE0, - 0xE0,0x1E, - 0x34,0x00 -}; - typedef struct{ uint8_t *mem; uint8_t greg[16]; - uint16_t sreg[2]; + union { + uint16_t sreg[2]; + uint8_t sreg_b[4]; + }; uint8_t interr[16]; uint8_t intern; - uint8_t interen; + bool interen; uint8_t tbit; @@ -47,16 +37,9 @@ int init_proc(ProcDat *procdat){ return 1; } - for(int i=0; imem[i] = bootcode[i-1]; - } - for(int i=BOOTCODE_S; imem[i] = 1; - } + memset(procdat->mem, 0x1, MEM_ALLOC); - procdat->sreg[1] = procdat->mem[0]<<8 + procdat->mem[1]; - printf("%x\n", procdat->mem[1]); - procdat->interen = 1; + procdat->interen = true; procdat->interr[0] = 0b01; procdat->intern = 1; procdat->cycles = 0; @@ -68,36 +51,62 @@ void free_proc(ProcDat *procdat){ free(procdat->mem); } +int load_bin(ProcDat *procdat, char *filename){ + FILE *file = fopen(filename, "r"); + + if(!fgets(procdat->mem, MEM_ALLOC, file)){ + fclose(file); + return 1; + } + + procdat->sreg[1] = 0x28; + + fclose(file); + + return 0; +} + void itp(uint8_t interrupt, uint8_t call_type, ProcDat *procdat){ - if(!procdat->interen)return; - if(!(procdat->interr[interrupt] & 0x2) && call_type) return; + if(!procdat->interen) + return; + if(!(procdat->interr[interrupt] & 0x2) && call_type) + return; printf("Interrupt %x, PC : %x\n", interrupt, procdat->sreg[1]); - uint16_t st = procdat->mem[0x2]<<8 + procdat->mem[0x3]; + uint16_t st = (procdat->mem[0x2]<<8) + procdat->mem[0x3]; procdat->mem[st+procdat->greg[12]] = procdat->sreg[1] >> 8; procdat->greg[12]++; procdat->mem[st+procdat->greg[12]] = procdat->sreg[1] & 0xFF; procdat->greg[12]++; - procdat->sreg[1] = procdat->mem[3]<<8 + procdat->mem[4]; + procdat->sreg[1] = (procdat->mem[3]<<8) + procdat->mem[4]; } -int exec_instr(uint16_t instr, ProcDat *procdat){ - int8_t in0 = instr & 0xFF; +int exec_instr(ProcDat *procdat){ + uint16_t addr = procdat->sreg[1]; + uint16_t instr = procdat->mem[addr]<<8 | procdat->mem[addr+1]; + int16_t in0 = (int8_t)(instr & 0xFF); uint8_t in1 = instr & 0xF; uint8_t in2 = (instr>>4) & 0xF; uint8_t in3 = (instr>>8) & 0xF; uint8_t in4 = instr>>12; - uint8_t *greg = &procdat->greg; - uint16_t *sreg = &procdat->sreg; + uint8_t *greg = procdat->greg; + uint16_t *sreg = procdat->sreg; + uint8_t *sreg_b = procdat->sreg_b; uint8_t *mem = procdat->mem; uint16_t st = mem[0x2]<<8 + mem[0x3]; int32_t cycles = 0; + printf("Executing %x : %x \n", sreg[1], instr); + switch(in4){ + case 0x0 : { + cycles++; + break; + } case 0x2 : { greg[in2] = greg[in1]; cycles++; @@ -106,6 +115,7 @@ int exec_instr(uint16_t instr, ProcDat *procdat){ case 0x3 : { switch(in3){ case 0x0 : { + printf("br to : %x\n", sreg[1]+in0*2); sreg[1] += in0*2; cycles++; break; @@ -130,6 +140,7 @@ int exec_instr(uint16_t instr, ProcDat *procdat){ break; } case 0x4 : { + printf("jmp to : %x\n", sreg[0]); sreg[1] = sreg[0]; cycles+=2; break; @@ -335,7 +346,7 @@ int exec_instr(uint16_t instr, ProcDat *procdat){ switch(in3){ case 0x0 : { if(in2 < 2){ - sreg[1] = (sreg[1] & (0x00FF00>>(8*in2))) + greg[in1]<<(8*in2); + sreg_b[in2] = greg[in1]; } cycles++; break; @@ -367,11 +378,10 @@ int exec_instr(uint16_t instr, ProcDat *procdat){ if(mem[sreg[1]] == 1){ return 0; } - if(mem[sreg[1]]) return 1; } -int main(){ +int main(int argc, char *argv[]){ ProcDat procdat; @@ -381,40 +391,13 @@ int main(){ return 1; } - char *buf = malloc(100); - - while(1){ - int inp = 0; - int i; - - scanf("%X", &inp); - if(inp == 0x1){ - scanf("%99s", buf); - if(!memcmp(buf, "-d", 2)){ - printf("PC : %x AC : %x\n", procdat.sreg[1], procdat.sreg[0]); - for(i=0; i<16; i++){ - printf("r%d : %x\n", i, procdat.greg[i]); - } - for(i=0; i rn ? 1:0 + t <- rm > rn ? 1:0 (signed) (signed) 1 clock eql rm,rn: