aboutsummaryrefslogtreecommitdiff
path: root/pu2/pu2.out.c
blob: 05d96c33494acc29c3897a84287a0a272f8b6958 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#pragma clang diagnostic ignored "-Wparentheses"
#pragma clang diagnostic ignored "-Wreturn-type"
#pragma clang diagnostic ignored "-Wempty-body"

// pu2!
// maybe compacter? idk
// last cpu: 167 chars

#define A 8
// change this for error reporting on unknown instructions!
// examples:
// #define A __builtin_trap()
// ^ does SIGTRAP
// #define A my_custom_cpu_error_trap()
// ^ calls my_custom_cpu_error_trap()

// clang-format off
#define S 1<<25
#define J while
#define H !--c
m[S],c,v,a,b,u;pu2(){J(c=m[m[7]++],v=m[m[7]++],c){H?a=v:H?a=m[b]:H?u?m[a]=b:0:H?v=a,a=b,b=v:H?a+=b:H?a-=b:H?a&=b:H?a=!a:H?u=v:H?u=a:H?a=u:H?u=b:H?b=u:A;}}
// clang-format on

// there's just memory. no, really
// ok actually there's two registers called a and b
// 0  HLT: halt
// 1  IMM: a = imm
// 2  LOD: a = m[b]
// 3  STR: m[a] = b (only happens if acc != 0)
// 4  SWP: swap a and b
// 5  ADD: a += b
// 6  SUB: a -= b
// 7  AND: a &= b
// 8  NOT: a = !a
// 9  ACC: u = imm
// 10 A2U: u = a
// 11 U2A: a = u
// 12 B2U: u = b
// 13 U2B: b = u

// NOTE: Memory indexes less than 1024 should be considered as temporary/compute memory, and
// programs should be written at index 1024 and upwards.
//
// NOTE: Memory index 7 is the program
// counter, in which the current instruction is read from m[m[7]] at each cycle

// -------------------------

// yeehaw baby it's time for as2
// E is the error code loc. zero it before calling as2
// Y is macro storage. extend as needed
// set O for output before running. keep in mind, it gets modified whilst as2 is running.
//    therefore, i recommend you store a copy somewhere!

// clang-format off
char*C="hltimmlodstrswpaddsubandnotacca2uu2ab2uu2b",*Y[1<<10],*E,*L,i;*K;as2(char*I){J(c=*I++){if(c==35){J(*++I-10);c=*I++;}L=C;(!isspace(c)?c-39?c-125?c-123?c-64?({i=0,I--;J(i++,*L)strncmp(L,I,3)?L+=3:({I+=3;*K++=i-1;*K++=(i-2&&i-9)?0:strtol(I,&I,10);goto Q;});E=I;return 1;Q:;}):as2(Y[strtol(I,&I,10)]):({Y[strtol(I,&I,10)]=I+1;J(*I++-125);}):({break;}):({*K++=1;*K++=*I++;}):0);}}
// clang-format on

// #undef S
#undef H
#undef J
#undef E