add jacaranda-8 toolchain
diff --git a/verilog/dv/jacaranda_test/as-for-caravel.c b/verilog/dv/jacaranda_test/as-for-caravel.c
new file mode 100644
index 0000000..d888ecf
--- /dev/null
+++ b/verilog/dv/jacaranda_test/as-for-caravel.c
@@ -0,0 +1,279 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <stdint.h>
+#include <ctype.h>
+
+//#define DEBUG
+
+#define MODE_BIN 0
+#define MODE_VERILOG 1
+
+struct label {
+    char name;
+    uint8_t addr;
+    struct label *next;
+};
+
+struct label *head;
+
+typedef enum {
+    MOV = 0,
+    ADD,
+    AND = 3,
+    OR,
+    NOT,
+    SLL,
+    SRL,
+    SRA,
+    CMP,
+    JE,
+    JMP,
+    LDIH,
+    LDIL,
+    LD,
+    ST,
+    IRET,
+    LDI
+} inst_t;
+
+typedef enum {
+    R0,
+    R1,
+    R2,
+    R3
+} reg_t;
+
+int8_t
+opcode(char *mnemonic)
+{
+    if(!strncmp(mnemonic, "mov", 3))
+        return MOV;
+    if(!strncmp(mnemonic, "add", 3))
+        return ADD;
+    if(!strncmp(mnemonic, "and", 3))
+        return AND;
+    if(!strncmp(mnemonic, "or", 2))
+        return OR;
+    if(!strncmp(mnemonic, "not", 3))
+        return NOT;
+    if(!strncmp(mnemonic, "sll", 3))
+        return SLL;
+    if(!strncmp(mnemonic, "srl", 3))
+        return SRL;
+    if(!strncmp(mnemonic, "sra", 3))
+        return SRA;
+    if(!strncmp(mnemonic, "cmp", 3))
+        return CMP;
+    if(!strncmp(mnemonic, "je", 2))
+        return JE;
+    if(!strncmp(mnemonic, "jmp", 3))
+        return JMP;
+    if(!strncmp(mnemonic, "ldih", 4))
+        return LDIH;
+    if(!strncmp(mnemonic, "ldil", 4))
+        return LDIL;
+    if(!strncmp(mnemonic, "ldi", 3))
+        return LDI;
+    if(!strncmp(mnemonic, "ld", 2))
+        return LD;
+    if(!strncmp(mnemonic, "st", 2))
+        return ST;
+    if(!strncmp(mnemonic, "iret", 4))
+        return IRET;
+    return -1;
+}
+
+void
+new_label(char name, int addr)
+{
+    struct label *p;
+    p = head;
+
+    while(p->next != NULL)
+        p = p->next;
+
+    p->next = (struct label *)malloc(sizeof(struct label));
+    p->next->name = name;
+    p->next->addr = addr;
+    p->next->next = NULL;
+}
+
+uint8_t
+search_label(char name)
+{
+    struct label *p;
+    p = head->next;
+
+    while(p != NULL) {
+        if(p->name == name) {
+            return p->addr;
+        }
+        p = p->next;
+    }
+    printf("unknown label referenced: %c\n", name);
+    exit(-1);
+}
+
+uint8_t
+rs(char *p)
+{
+#ifdef DEBUG
+    printf("arguments(rs): %s\n", p);
+#endif
+    return strtol(++p, &p, 16);
+}
+
+uint8_t
+imm(char *p)
+{
+#ifdef DEBUG
+    printf("arguments(imm): %s\n", p);
+#endif
+    return strtol(p, &p, 16);
+}
+
+uint8_t
+ex_imm(char *p)
+{
+#ifdef DEBUG
+    printf("arguments(ex_imm): %s\n", p);
+#endif
+    if(isalpha(*p))
+        return search_label(*p);
+    return strtol(p, &p, 16);
+}
+
+uint8_t
+rdrs(char *p)
+{
+#ifdef DEBUG
+    printf("arguments(rd/rs): %s\n", p);
+#endif
+    int rd, rs;
+    rd = strtol(++p, &p, 16);
+    while(isspace(*p) || *p == ',')
+        ++p;
+    rs = strtol(++p, &p, 16);
+    return (rd << 2) + rs;
+}
+
+int
+main(int argc, char *argv[])
+{
+    char mode = MODE_BIN;
+    char buf[256];
+    char *p;
+    int8_t inst, result;
+    int i;
+    FILE *in, *out;
+
+    if((in = fopen(argv[1], "r")) == NULL) {
+        puts("file open error!");
+        return -1;
+    }
+
+    if(argc > 2) {
+        if(strncmp(argv[2], "verilog", 7) == 0)
+            mode = MODE_VERILOG;
+    }
+
+    if(mode == MODE_BIN) {
+        if((out = fopen("out.bin", "wb")) == NULL) {
+            puts("file open error!");
+            return -1;
+        }
+    }
+    else {
+        if((out = fopen("out.txt", "w")) == NULL) {
+            puts("file open error!");
+            return -1;
+        }
+    }
+
+    head = (struct label *)malloc(sizeof(struct label));
+    head->name = 0;
+    head->addr = 0;
+    head->next = NULL;
+
+    i = 0;
+    while(fgets(buf, 256, in) != NULL) {
+        if(*buf == '\n') continue;
+        p = buf;
+        while(isspace(*p)) ++p;
+        if(!strncmp(p, "//", 2)) continue;
+        inst = opcode(p);
+        while(isalpha(*p)) ++p;
+        if(*p == ':') {
+#ifdef DEBUG
+            printf("new label in L%d: %c\n", i, *(p-1));
+#endif
+            new_label(*(p-1), i);
+        }
+        else {
+            if(inst == LDI) ++i;
+            ++i;
+            continue;
+        }
+    }
+
+    rewind(in);
+    i = 0;
+    while(fgets(buf, 256, in) != NULL) {
+        if(*buf == '\n') continue;
+        p = buf;
+        while(isspace(*p)) ++p;
+        if(!strncmp(p, "//", 2)) continue;
+        inst = opcode(p);
+#ifdef DEBUG
+        printf("instruction number: %d\n", inst);
+#endif
+        while(isalpha(*p)) ++p;
+        if(*p == ':') continue;
+        while(isspace(*p)) ++p;
+        switch(inst) {
+            case -1:
+                printf("invalid instruction!!!\n");
+                return -1;
+            case JE:
+            case JMP:
+                result = (inst << 4) | rs(p);
+                mode == MODE_BIN 
+                    ? fwrite(&result, 1, 1, out) 
+                    : fprintf(out, "mem[%d] = 0x%02x;\n", i++, result & 0x000000ff);
+                break;
+            case LDIH:
+            case LDIL:
+                result = (inst << 4) | imm(p);
+                mode == MODE_BIN 
+                    ? fwrite(&result, 1, 1, out) 
+                    : fprintf(out, "mem[%d] = 0x%02x;\n", i++, result & 0x000000ff);
+                break;
+            case IRET:
+                result = 0xb4;
+                mode == MODE_BIN
+                    ? fwrite(&result, 1, 1, out)
+                    : fprintf(out, "mem[%d] = 0x%02x;\n", i++, result & 0x000000ff);
+                break;
+            case LDI:
+                result = (LDIH << 4) | (ex_imm(p) >> 4);
+                mode == MODE_BIN
+                    ? fwrite(&result, 1, 1, out)
+                    : fprintf(out, "mem[%d] = 0x%02x;\n", i++, result & 0x000000ff);
+                result = (LDIL << 4) | (ex_imm(p) & 0x0f);
+                mode == MODE_BIN
+                    ? fwrite(&result, 1, 1, out)
+                    : fprintf(out, "mem[%d] = 0x%02x;\n", i++, result & 0x000000ff);
+                break;
+            default:
+                result = (inst << 4) | rdrs(p);
+                mode == MODE_BIN 
+                    ? fwrite(&result, 1, 1, out) 
+                    : fprintf(out, "mem[%d] = 0x%02x;\n", i++, result & 0x000000ff);
+                break;
+        }
+    }
+    return 0;
+}
+
diff --git a/verilog/dv/jacaranda_test/uart.s b/verilog/dv/jacaranda_test/uart.s
new file mode 100644
index 0000000..80c1e98
--- /dev/null
+++ b/verilog/dv/jacaranda_test/uart.s
@@ -0,0 +1,26 @@
+ldih 0
+ldil 1
+mov r0, r3
+ldih f
+ldil f
+st r0, r3
+ldih 4
+ldil 1
+mov r0, r3
+ldih f
+ldil d
+mov r1, r3
+ldih f
+ldil e
+ld r2, r3
+ldih 0
+ldil 1
+and r2, r3
+cmp r2, r3
+ldih 0
+ldil c
+je r3
+st r0, r1
+ldih 0
+ldil 6
+jmp r3