From 855e8f8dffcf70c770978ff34c729e71504ec05b Mon Sep 17 00:00:00 2001 From: nihonium Date: Mon, 7 Mar 2022 20:53:09 +0300 Subject: [PATCH 1/7] new file: cpu/notes.md --- cpu/notes.md | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 cpu/notes.md diff --git a/cpu/notes.md b/cpu/notes.md new file mode 100644 index 0000000..0bef044 --- /dev/null +++ b/cpu/notes.md @@ -0,0 +1,57 @@ +# cpu + +* Беззнаковые +* По модулю 256 (8-битность) +* Switch +* Массив регистров +* #ifdef REGISTERS + +Используем REGISTERS + +# cache + +* Первая лекция Северова +* "Размазывает" справа налево +* Обнулять массив через {0}/{} +* Двумерный массив можно инициализировать последовательным списком +* Адрес массива - не lvalue +* Матрицы симметричны относительно диагонали +* У второй матрицы меняем индексы местами + +# neo + +* number/_of_/anomaly = 6 +* Переписать значение в другой части структуры +* Учитывать "дырки" в структуре, тут её нет + +# flag + +* Анализ операций +* MOV меняет флаг + +# cuda + +* Прочитать =3 + +# simple_page + +* Можно посчитать размер страницы +* Одноуровневая система адресов (в 32х-битном, на самом деле, двухуровневая) +* Остаток бит - смещение внутри страницы + +# pdp_rw + +* typedef +* Функции - однострочные +* char mem[64K] +* typedef short/int/_16t word (+stdint) +* Приводим через указатель к word: *(word *)(mem + i) + +# pdp_load + +* Текстовый файл (r/rt) + +# Заметки +* (int (*)[10])p - "приведение" к массиву длины 10 +* PAE (трехстраничная память) +* Массив указателей на функции - для будущего эмулятора. From 4746ed521145e90954848b4234716a0fdd6e7e79 Mon Sep 17 00:00:00 2001 From: nihonium Date: Mon, 7 Mar 2022 20:56:43 +0300 Subject: [PATCH 2/7] cpu notes finally --- cpu/notes.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cpu/notes.md b/cpu/notes.md index 682ca3b..0bef044 100644 --- a/cpu/notes.md +++ b/cpu/notes.md @@ -55,7 +55,3 @@ * (int (*)[10])p - "приведение" к массиву длины 10 * PAE (трехстраничная память) * Массив указателей на функции - для будущего эмулятора. -<<<<<<< HEAD -======= - ->>>>>>> bd6796763e5da48785f5da39a062672d1e55a436 From 0802b2508e3a8d671c73808c0e1734ebd44f7340 Mon Sep 17 00:00:00 2001 From: nihonium Date: Tue, 8 Mar 2022 00:37:32 +0300 Subject: [PATCH 3/7] cpu --- cpu/cpu.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 cpu/cpu.c diff --git a/cpu/cpu.c b/cpu/cpu.c new file mode 100644 index 0000000..a13b59e --- /dev/null +++ b/cpu/cpu.c @@ -0,0 +1,68 @@ +#include +#include +//#define _DEBUG +int check_registers(int a, int b, int max_reg); +int main() { + int max_reg = 4; +#ifdef REGISTERS + max_reg = REGISTERS; +#endif + /* A, B, C, D. Indice + 5 */ + uint8_t reg[4] = {0, 0, 0, 0}; + int i; + uint8_t a, b; + uint8_t x; + +#ifdef _DEBUG + printf("%hhu\n", x); +#endif + + while (1) { + x = getchar() - '0'; +#ifdef _DEBUG + printf("x:%hhu\n", x); +#endif + switch (x) { + case 0: + return 0; + break; + case 1: + scanf("%hhu %hhu\n", &a, &b); + if (check_registers(a, b, max_reg)) { + printf("-1\n"); + return 0; + } + reg[a-5] += reg[b-5]; + break; + case 2: + scanf("%hhu %hhu\n", &a, &b); + if(check_registers(a, b, max_reg)) { + printf("-1\n"); + return 0; + } + reg[a-5] -= reg[b-5]; + break; + case 3: + scanf("%hhu %hhu\n", &a, &b); + if(check_registers(a, 0, max_reg)) { + printf("-1\n"); + return 0; + } + reg[a-5] = b; + break; + case 4: + for (i = 0; i < max_reg; ++i) + printf("%hhu ", reg[i]); + putchar('\n'); + break; + } + } +} + +int check_registers(int a, int b, int max_reg) { + a -= 5; + b -= 5; + if ((a >= max_reg) || (b >= max_reg)) + return 1; + return 0; +} From 852fe43c21895c0eeb97d45bf2e5af0d842af1b7 Mon Sep 17 00:00:00 2001 From: nihonium Date: Tue, 8 Mar 2022 00:54:17 +0300 Subject: [PATCH 4/7] neo --- cpu/neo.c | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 cpu/neo.c diff --git a/cpu/neo.c b/cpu/neo.c new file mode 100644 index 0000000..9b19ef7 --- /dev/null +++ b/cpu/neo.c @@ -0,0 +1,6 @@ +char* whatisyourname() { + char *res = calloc(256+1, sizeof(char)); + for (int i = 0; i < 256; ++i) + res[i] = '1'; + return res; +} From f5028031024b0257652f2e9d682c36f0d616a61e Mon Sep 17 00:00:00 2001 From: nihonium Date: Thu, 10 Mar 2022 14:08:43 +0300 Subject: [PATCH 5/7] gpg test --- cpu/cpu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpu/cpu.c b/cpu/cpu.c index a13b59e..9a62ea6 100644 --- a/cpu/cpu.c +++ b/cpu/cpu.c @@ -1,6 +1,6 @@ #include #include -//#define _DEBUG + int check_registers(int a, int b, int max_reg); int main() { int max_reg = 4; From d85ee21d5bd4e8e59e6f0cb1d2ce0f2aeff11e5c Mon Sep 17 00:00:00 2001 From: nihonium Date: Thu, 10 Mar 2022 23:21:37 +0300 Subject: [PATCH 6/7] cache, flag --- cpu/cache.c | 45 +++++++++++++++++++++++++ cpu/flag.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 cpu/cache.c create mode 100644 cpu/flag.c diff --git a/cpu/cache.c b/cpu/cache.c new file mode 100644 index 0000000..824d1de --- /dev/null +++ b/cpu/cache.c @@ -0,0 +1,45 @@ +#include +#define N 1024 + +int gcd(int a, int b); +int main() { + int n, d; + int i, j, k; + /* to use shorter types such as short is a BAD idea */ + static int A[N][N], B[N][N], C[N][N]; + int res = 0; + + scanf("%d %d", &n, &d); + + for (i = 0; i < n; ++i) + for (j = i; j < n; ++j) { + //printf("%d %d\n", i ,j); + A[i][j] = gcd(i + 2,j + 2); + A[j][i] = A[i][j]; + } + //printf("nya!\n"); + for (i = 0; i < n; ++i) + for (j = i; j < n; ++j) { + //printf("%d %d\n", i ,j); + B[i][j] = gcd(n - i,n - j); + B[j][i] = B[i][j]; + } + + for (i = 0; i < n; ++i) + for (j = 0; j < n; ++j) + for (k = 0; k < n; ++k) { + //printf("i:%d, j^%d, k^%d\n", i, j, k); + C[i][j] += A[i][k] * B[j][k]; + } + for (i = 0; i < n; ++i) + for (j = 0; j < n; ++j) + if (C[i][j] % d == 0) + ++res; + + printf("%d", res); +} + +int gcd(int a, int b) { + return (a == 0) ? b : gcd(b % a, a); +} + diff --git a/cpu/flag.c b/cpu/flag.c new file mode 100644 index 0000000..a41ec7e --- /dev/null +++ b/cpu/flag.c @@ -0,0 +1,94 @@ +#include +#include + +int check_registers(int a, int b, int max_reg); +int main() { + int max_reg = 4; + int zf = 0, to_exec = 1; +#ifdef REGISTERS + max_reg = REGISTERS; +#endif + /* A, B, C, D. Indice - 5 */ + uint8_t reg[4] = {0, 0, 0, 0}; + int i; + uint8_t a, b; + uint8_t x; + + while (1) {; + scanf("%hhu", &x); +#ifdef _DEBUG + printf("x:%hhu\n", x); +#endif + if ((x & (1 << 7)) && !zf) { + to_exec = 0; + //zf = 0; + } + x &= 0x7F; +#ifdef _DEBUG + printf("zf:%d, to_exec:%d\n", zf, to_exec); +#endif + if (to_exec == 0) { + if ((x >= 1) && (x <= 3)) + scanf("%hhu %hhu\n", &a, &b); + to_exec = 1; + zf = 0; + continue; + } + + switch (x) { + case 0: + return 0; + break; + case 1: + scanf("%hhu %hhu\n", &a, &b); + if (check_registers(a, b, max_reg)) { + printf("-1\n"); + return 0; + } + reg[a-5] += reg[b-5]; + if (reg[a-5] == 0) + zf = 1; + else + zf = 0; + break; + case 2: + scanf("%hhu %hhu\n", &a, &b); + if(check_registers(a, b, max_reg)) { + printf("-1\n"); + return 0; + } + reg[a-5] -= reg[b-5]; + if (reg[a-5] == 0) + zf = 1; + else + zf = 0; + break; + case 3: + scanf("%hhu %hhu\n", &a, &b); + if(check_registers(a, 0, max_reg)) { + printf("-1\n"); + return 0; + } + reg[a-5] = b; + if (reg[a-5] == 0) + zf = 1; + else + zf = 0; + break; + case 4: + for (i = 0; i < max_reg; ++i) + printf("%hhu ", reg[i]); + putchar('\n'); + break; + } + to_exec = 1; + } +} + +int check_registers(int a, int b, int max_reg) { + a -= 5; + b -= 5; + if ((a >= max_reg) || (b >= max_reg)) + return 1; + return 0; +} From 3a8fbfd762b2d1e5ba12d5791fcab8b081789387 Mon Sep 17 00:00:00 2001 From: nihonium Date: Mon, 14 Mar 2022 22:08:02 +0300 Subject: [PATCH 7/7] cpu full --- cpu/cuda.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++ cpu/pdp_rw.c | 46 +++++++++++++++++++++++++++++++++++++ cpu/simple_page.c | 27 ++++++++++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 cpu/cuda.c create mode 100644 cpu/pdp_rw.c create mode 100644 cpu/simple_page.c diff --git a/cpu/cuda.c b/cpu/cuda.c new file mode 100644 index 0000000..4704943 --- /dev/null +++ b/cpu/cuda.c @@ -0,0 +1,58 @@ +#include +#include +#define THR 32 +#define MEM 128 +#define REG 2 +#define MAXTHR 1536 +#define MAXMEM 49152 +#define MAXREG 32768 + + +int check_use(int x, const int frac); + +int main() { + int reg, thr, mem; + int nbreg, nbmem, nbthr; + int nthr; + int min = 0; + + freopen("cuda.in", "r", stdin); +#ifndef _DEBUG + freopen("cuda.out", "w", stdout); +#endif + scanf("%d %d %d", &thr, ®, &mem); + + nthr = check_use(thr, THR); + nbthr = (int) MAXTHR / nthr; + nbreg = (int) MAXREG / (nthr*check_use(reg, REG)); + nbmem = (int) MAXMEM / check_use(mem, MEM); + + + if ((nbthr <= nbreg) && (nbthr <= nbmem)) + min = nbthr; + else if ((nbreg <= nbthr) && (nbreg <= nbmem)) + min = nbreg; + else if ((nbmem <= nbthr) && (nbmem <= nbreg)) + min = nbmem; +#ifdef _DEBUG + printf("used: %d %d %d\n", check_use(thr, THR), nthr*check_use(reg, REG), check_use(mem, MEM)); + printf("By threads: %d, by registers: %d, by memory: %d\n", nbthr, nbreg, nbmem); +#endif + printf("%d", (int)round((thr*min*100)/(double)MAXTHR)); + return 0; +} + +int check_use(int x, const int frac) { + int real_x = frac; + while (1) { + real_x += frac; + if (real_x >= x) { + x = real_x; + break; + } + } +#ifdef _DEBUG + printf("%d %d\n", x, real_x); +#endif + return x; +} diff --git a/cpu/pdp_rw.c b/cpu/pdp_rw.c new file mode 100644 index 0000000..5274d3a --- /dev/null +++ b/cpu/pdp_rw.c @@ -0,0 +1,46 @@ +#include +#include +typedef uint8_t byte; +typedef uint16_t word; +typedef uint16_t adr; + +byte mem[1 << 16]; + +byte b_read (adr a) { + return mem[a]; +} +void b_write (adr a, byte val) { + mem[a] = val; +} +word w_read (adr a) { + return *(word*)&mem[a]; +} +void w_write (adr a, word val) { + *(word*)&mem[a] = val; +} +void load_file() { + adr a; + int n, i; + byte x; + + while(scanf("%hx %x", &a, &n) != EOF) { + //printf("%x", n); + for (i = 0; i < n; ++i) { + //printf("number %d\n", i); + scanf("%hhx", &x); + b_write(a+i, x); + //printf("Read %hx\n", mem[a+2*i]); + } + } +} + +void mem_dump(adr start, word n) { + for (int i = 0; i < n; i+=2) { + //printf("%d:read from %hx: %hx\n", i,start+i, *(word*)&mem[start+i]); + printf("%06ho : %06ho\n", start+i, *(word*)&mem[start+i]); + } +} +//int main() { +// load_file(); +// mem_dump(0x40, 4); +//} diff --git a/cpu/simple_page.c b/cpu/simple_page.c new file mode 100644 index 0000000..e04de79 --- /dev/null +++ b/cpu/simple_page.c @@ -0,0 +1,27 @@ +#include +#include + +int main() { + unsigned N, i, page_n, log; + + scanf("%u", &N); + unsigned *mem = (unsigned*)calloc(N, sizeof(unsigned)); + for (i = 0; i < N; ++i) { + scanf("%x", &mem[i]); + } + + scanf("%x", &log); + page_n = (log >> 26) & 0b111111; + if (page_n < N) { + printf("%x", mem[page_n]+(log << 6 >> 6)); + } + else { + printf("error"); + } + + + free(mem); + return 0; + + +}