#define YACASL2_CASL2_INCLUDED
#include <stdio.h>
-#include <malloc.h>
+#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#include <assert.h>
#ifndef YACASL2_CERR_H_INCLUDED
#define YACASL2_CERR_H_INCLUDED
-#include <malloc.h>
+#include <stdlib.h>
#include <string.h>
#include <assert.h>
char *msg;
} CERRARRAY;
+enum {
+ MSGSIZE = 60,
+};
+
/* エラー番号とエラーメッセージを設定 */
void setcerr(int num, const char *val);
void setcerr(int num, const char *val)
{
cerrno = num;
- cerrmsg = malloc(256);
+ cerrmsg = malloc(MSGSIZE + 1);
if(val != NULL) {
strcpy(cerrmsg, val);
strcat(cerrmsg, ": ");
long temp;
FR = 0x0;
- temp = (short)val0 + (short)val1;
+ temp = (signed short)val0 + (signed short)val1;
if(temp > 32767 || temp < -32768) {
FR += OF;
}
- res = (WORD)(temp & 0xFFFF);
- if((res & 0x8000) > 0x0) {
+ if(((res = (WORD)(temp & 0xFFFF)) & 0x8000) == 0x8000) {
FR += SF;
} else if(res == 0x0) {
FR += ZF;
WORD res;
FR = 0x0;
- temp = val0 + val1;
- if(temp < 0 || temp > 65535) {
+ if((temp = val0 + val1) < 0 || temp > 65535) {
FR += OF;
}
- res = (WORD)(temp & 0xFFFF);
- if((res & 0x8000) > 0x0) {
+ if(((res = (WORD)(temp & 0xFFFF)) & 0x8000) == 0x8000) {
FR += SF;
} else if(res == 0x0) {
FR += ZF;
}
}
-/* 算術左シフト。フラグを設定して値を返す。
- 算術演算なので、第15ビットは送り出されない */
+/* 算術左シフト。フラグを設定して値を返す。 */
+/* 算術演算なので、第15ビットは送り出されない */
WORD sla(WORD val0, WORD val1)
{
FR = 0x0;
res = (val0 & 0x7FFF) >> val1;
/* 符号(第15ビット)が1の場合、符号と空いたビット位置に1を設定
COMET IIの仕様で、シフトの結果空いたビット位置には符号と同じものが入る */
- if((sign = val0 & 0x8000) > 0x0) {
+ if((sign = val0 & 0x8000) == 0x8000) {
for(i = 0; i <= val1; i++) {
res |= onbit;
onbit >>= 1;
FR += OF;
}
/* 第15ビットが1のとき、SFは1 */
- if((res & 0x8000) > 0x0) {
+ if((res & 0x8000) == 0x8000) {
FR += SF;
}
/* 演算結果が0のとき、ZFは1 */
void reset()
{
int i;
- for(i = 0; i <= 7; i++) {
+ for(i = 0; i < REGSIZE; i++) {
GR[i] = 0x0;
}
SP = PR = FR = 0x0;
}
/* nが-32768〜32767の範囲にないときは、その下位16ビットを格納 */
if(n < -32768 || n > 32767) {
- n = n % 0x10000;
+ n = n & 0xFFFF;
}
return (WORD)n;
}
WORD h2word(const char *str)
{
assert(*str == '#');
- WORD w = 0x0;
+ WORD word = 0x0;
char *check;
str++;
if(*str == '-' || strlen(str) > 4) {
return 0;
}
/* WORD値に変換 */
- w = (WORD)strtol(str, &check, 16);
+ word = (WORD)strtol(str, &check, 16);
if(*check != '\0') {
setcerr(115, str-1); /* not hex */
return 0x0;
}
- return w;
+ return word;
}
/* 10進数または16進数の文字列をWORD値に変換 */
INCLUDE = ../../../include
CC = gcc
CFLAGS = -g -Wall -I $(INCLUDE)
-COMMONSRC = $(SRCDIR)/word.o $(SRCDIR)/struct.o $(SRCDIR)/hash.o $(SRCDIR)/cmd.o $(SRCDIR)/cerr.o
-ASSRC = $(SRCDIR)/assemble.o $(SRCDIR)/token.o $(SRCDIR)/label.o $(SRCDIR)/macro.o
-EXECSRC = $(SRCDIR)/exec.o $(SRCDIR)/dump.o
+COMMONSRC = $(SRCDIR)/word.c $(SRCDIR)/struct.c $(SRCDIR)/hash.c $(SRCDIR)/cmd.c $(SRCDIR)/cerr.c
+ASSRC = $(SRCDIR)/assemble.c $(SRCDIR)/token.c $(SRCDIR)/label.c $(SRCDIR)/macro.c
+EXECSRC = $(SRCDIR)/exec.c $(SRCDIR)/dump.c
ifeq "$(UCLASS)" "AS"
SRC = $(COMMONSRC) $(ASSRC)
@rm -f a.out 1.txt diff.txt report.txt
cleanall: clean
@rm -f 0.txt
-$(SRCDIR)/%.o: $(SRCDIR)/%.c
- @$(CC) -c $(CFLAGS) $<
a.out: $(SRC) $(TESTSRCFILE)
@gcc $(CFLAGS) $(SRC) $(TESTSRCFILE)
0.txt 1.txt: a.out
121, 122, 123, 124, 201, 202, 203, 204, 205, 206, 207, 999
};
const char *str[] = {NULL, "foobar"};
-
+
for(i = 0; i < sizeof(str)/sizeof(str[0]); i++) {
for(j = 0; j < sizeof(code)/sizeof(code[0]); j++) {
setcerr(code[j], str[i]);
HASH VALUE: 20
HASH VALUE: 11
-HASH VALUE: 3
+HASH VALUE: 21