<commit_before>#include "casl2.h"
#include "assemble.h"

/* 値を格納するポインタ */
WORD ptr;

/* リテラル（=付きの値）を格納するポインタ */
WORD lptr;

/* 他のプログラムで参照する入口名 */
char *prog;

/* 汎用レジスタを表す文字列「GR[0-7]」から、レジスタ番号[0-7]をWORD値で返す */
/* 文字列が汎用レジスタを表さない場合は、0xFFFFを返す */
/* is_xがtrueの場合は指標レジスタ。GR0は、COMET IIの仕様により、エラー発生 */
WORD getgr(const char *str, bool is_x)
{
    assert(str != NULL);
    WORD r;
    /* 「GR[0-7]」以外の文字列では、0xFFFFを返して終了 */
    if(!(strlen(str) == 3 && strncmp(str, "GR", 2) == 0 &&
         (*(str+2) >= '0' && *(str+2) <= '7')))
    {
        return 0xFFFF;
    }
    r = (WORD)(*(str+2) - '0');
    /* 指標レジスタとして用いることはできない */
    if(is_x == true && r == 0x0) {
        setcerr(120, NULL);    /* GR0 in operand x */
        return 0x0;
    }
    return r;
}

/* アドレスを返す */
/* アドレスには、リテラル／10進定数／16進定数／アドレス定数が含まれる */
WORD getadr(const char *prog, const char *str, PASS pass)
{
    WORD adr = 0x0;
    if(*str == '=') {
        adr = getliteral(str, pass);
    } else if((*str == '#') || isdigit(*str) || *str == '-') {
        adr = nh2word(str);
    } else {
        if(pass == SECOND && (adr = getlabel(prog, str)) == 0xFFFF) {
            if(prog != NULL) {
                setcerr(103, str);    /* label not found */
            }
        }
    }
    return adr;
}

/* WORD値wordをアドレスadrに書込 */
/* 書込に成功した場合はtrue、失敗した場合はfalseを返す */
bool writememory(WORD word, WORD adr, PASS pass)
{
    bool status = false;
    /* COMET IIメモリオーバーの場合 */
    if(adr >= memsize) {
        setcerr(119, word2n(adr));    /* out of COMET II memory */
    }
    if(cerrno == 0) {
        memory[adr] = word;
        if(pass == SECOND && (&asmode)->asdetail == true) {
            fprintf(stdout, "\t#%04X\t#%04X\n", adr, word);
        }
        status = true;
    }
    return status;
}

/* 定数の前に等号（=）をつけて記述されるリテラルを返す */
/* リテラルには、10進定数／16進定数／文字定数が含まれる */
WORD getliteral(const char *str, PASS pass)
{
    WORD adr = lptr;
    assert(*str == '=');
    if(*(++str) == '\'') {    /* 文字定数 */
        writestr(str, true, pass);
    } else {
        writememory(nh2word(str), lptr++, pass);
    }
    return adr;
}

/* ' 'で囲まれた文字定数をメモリに書込 */
/* DC命令とリテラルで使い、リテラルの場合はリテラル領域に書込 */
void writestr(const char *str, bool literal, PASS pass)
{
    assert(cerrno == 0 && *str == '\'');
    const char *p = str + 1;
    bool lw = false;

    for(; ;) {
        /* 閉じ「'」がないまま文字列が終了した場合 */
        if(*p == '\0') {
            setcerr(123, str);    /* illegal string */
            break;
        }
        /* 「'」の場合、次の文字が「'」でない場合は正常終了 */
        if(*p == '\'' && *(++p) != '\'') {
            break;
        } else if(literal == true && lw == true) {
            setcerr(124, str);    /* more than one character in literal */
            break;
        }
        /*リテラルの場合はリテラル領域に書込 */
        if(literal == true) {
            writememory(*(p++), lptr++, pass);
            lw = true;
        } else {
            writememory(*(p++), ptr++, pass);
        }
    }
}

/* アセンブラ命令DCをメモリに書込 */
void writeDC(const char *str, PASS pass)
{
    WORD adr = 0x0;
    if(*str == '\'') {
        writestr(str, false, pass);
    } else {
        if(*str == '#' || isdigit(*str) || *str == '-') {
            adr = nh2word(str);
        } else {
            if(pass == SECOND && (adr = getlabel(prog, str)) == 0xFFFF) {
                setcerr(103, str);    /* label not found */
            }
        }
        writememory(adr, ptr++, pass);
    }
}

/* 命令がアセンブラ命令の場合は処理を実行 */
/* 実行に成功した場合はtrue、それ以外の場合はfalseを返す */
bool assemblecmd(const CMDLINE *cmdl, PASS pass)
{
    int i = 0;
    CASLCMD cmd = 0;
    bool status = false;
    CMDARRAY ascmd[] = {
        { START, 0, 1, "START" },
        { END, 0, 0, "END" },
        { DC, 0, OPDSIZE, "DC" },
        { DS, 1, 1, "DS" },<commit_msg>DC命令で引数がない場合はエラー<commit_after>#include "casl2.h"
#include "assemble.h"

/* 値を格納するポインタ */
WORD ptr;

/* リテラル（=付きの値）を格納するポインタ */
WORD lptr;

/* 他のプログラムで参照する入口名 */
char *prog;

/* 汎用レジスタを表す文字列「GR[0-7]」から、レジスタ番号[0-7]をWORD値で返す */
/* 文字列が汎用レジスタを表さない場合は、0xFFFFを返す */
/* is_xがtrueの場合は指標レジスタ。GR0は、COMET IIの仕様により、エラー発生 */
WORD getgr(const char *str, bool is_x)
{
    assert(str != NULL);
    WORD r;
    /* 「GR[0-7]」以外の文字列では、0xFFFFを返して終了 */
    if(!(strlen(str) == 3 && strncmp(str, "GR", 2) == 0 &&
         (*(str+2) >= '0' && *(str+2) <= '7')))
    {
        return 0xFFFF;
    }
    r = (WORD)(*(str+2) - '0');
    /* 指標レジスタとして用いることはできない */
    if(is_x == true && r == 0x0) {
        setcerr(120, NULL);    /* GR0 in operand x */
        return 0x0;
    }
    return r;
}

/* アドレスを返す */
/* アドレスには、リテラル／10進定数／16進定数／アドレス定数が含まれる */
WORD getadr(const char *prog, const char *str, PASS pass)
{
    WORD adr = 0x0;
    if(*str == '=') {
        adr = getliteral(str, pass);
    } else if((*str == '#') || isdigit(*str) || *str == '-') {
        adr = nh2word(str);
    } else {
        if(pass == SECOND && (adr = getlabel(prog, str)) == 0xFFFF) {
            if(prog != NULL) {
                setcerr(103, str);    /* label not found */
            }
        }
    }
    return adr;
}

/* WORD値wordをアドレスadrに書込 */
/* 書込に成功した場合はtrue、失敗した場合はfalseを返す */
bool writememory(WORD word, WORD adr, PASS pass)
{
    bool status = false;
    /* COMET IIメモリオーバーの場合 */
    if(adr >= memsize) {
        setcerr(119, word2n(adr));    /* out of COMET II memory */
    }
    if(cerrno == 0) {
        memory[adr] = word;
        if(pass == SECOND && (&asmode)->asdetail == true) {
            fprintf(stdout, "\t#%04X\t#%04X\n", adr, word);
        }
        status = true;
    }
    return status;
}

/* 定数の前に等号（=）をつけて記述されるリテラルを返す */
/* リテラルには、10進定数／16進定数／文字定数が含まれる */
WORD getliteral(const char *str, PASS pass)
{
    WORD adr = lptr;
    assert(*str == '=');
    if(*(++str) == '\'') {    /* 文字定数 */
        writestr(str, true, pass);
    } else {
        writememory(nh2word(str), lptr++, pass);
    }
    return adr;
}

/* ' 'で囲まれた文字定数をメモリに書込 */
/* DC命令とリテラルで使い、リテラルの場合はリテラル領域に書込 */
void writestr(const char *str, bool literal, PASS pass)
{
    assert(cerrno == 0 && *str == '\'');
    const char *p = str + 1;
    bool lw = false;

    for(; ;) {
        /* 閉じ「'」がないまま文字列が終了した場合 */
        if(*p == '\0') {
            setcerr(123, str);    /* illegal string */
            break;
        }
        /* 「'」の場合、次の文字が「'」でない場合は正常終了 */
        if(*p == '\'' && *(++p) != '\'') {
            break;
        } else if(literal == true && lw == true) {
            setcerr(124, str);    /* more than one character in literal */
            break;
        }
        /*リテラルの場合はリテラル領域に書込 */
        if(literal == true) {
            writememory(*(p++), lptr++, pass);
            lw = true;
        } else {
            writememory(*(p++), ptr++, pass);
        }
    }
}

/* アセンブラ命令DCをメモリに書込 */
void writeDC(const char *str, PASS pass)
{
    WORD adr = 0x0;
    if(*str == '\'') {
        writestr(str, false, pass);
    } else {
        if(*str == '#' || isdigit(*str) || *str == '-') {
            adr = nh2word(str);
        } else {
            if(pass == SECOND && (adr = getlabel(prog, str)) == 0xFFFF) {
                setcerr(103, str);    /* label not found */
            }
        }
        writememory(adr, ptr++, pass);
    }
}

/* 命令がアセンブラ命令の場合は処理を実行 */
/* 実行に成功した場合はtrue、それ以外の場合はfalseを返す */
bool assemblecmd(const CMDLINE *cmdl, PASS pass)
{
    int i = 0;
    CASLCMD cmd = 0;
    bool status = false;
    CMDARRAY ascmd[] = {
        { START, 0, 1, "START" },
        { END, 0, 0, "END" },
        { DC, 1, OPDSIZE, "DC" },
        { DS, 1, 1, "DS" },
{'fraction_non_alphanumeric': 0.1909224795822734, 'fraction_numerical': 0.02088633016468068, 'mean_word_length': 1.9654624851131401, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 9, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6366750', 'n_tokens_mistral': 3559, 'n_tokens_neox': 3453, 'n_words': 580}