diff --git a/Makefile b/Makefile index fb216c1..f25f662 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ test: kas out/a.out @out/k.exe out/a.out > out/stdout.txt @echo "output:" @echo ">>>>>>>>" - @cat out/stdout.txt + @cat -v out/stdout.txt @echo @echo "<<<<<<<<" @echo diff --git a/as/k-as.py b/as/k-as.py index 4d48351..dda27ad 100755 --- a/as/k-as.py +++ b/as/k-as.py @@ -156,11 +156,20 @@ def parse(): if len(line) == 0: continue + quote = False for i in range(len(line)): - if line[i] in '#;@!/': + if line[i] in "'\"": + quote = not quote + + if line[i] in '#;@!/' and not quote: line = line[:i].rstrip() break + if quote: + print("Unterminated string in line: {}".format(line)) + leave() + sys.exit(1) + if len(line) == 0: continue diff --git a/dos/main.k b/dos/main.k index 5c695a6..ecbb58d 100644 --- a/dos/main.k +++ b/dos/main.k @@ -7,22 +7,28 @@ main: enter + mov ax0, .buf + call print + + prn 10 mov ax0, .msg call print mov ax0, .buf mov ax1, .msg - call strrev + mov ax2, 5 + call strnzcpy prn 10 mov ax0, .buf - call print + mov ax1, 10 + call print_n leave ret -.msg = "Hello World :)" -.buf = "!!!!!!!!!!!!!!!!!!!!!" +.msg = "HelloWorld :)" +.buf = "!!!!!!!!!!!!!" ; ; Exit function diff --git a/dos/prn/print.k b/dos/prn/print.k index 7c5a41e..a05b2ef 100644 --- a/dos/prn/print.k +++ b/dos/prn/print.k @@ -16,6 +16,7 @@ print: .1: test b[ax0], b[ax0] cjmpz .2 + prn b[ax0] inc ax0 loop .1 diff --git a/dos/str/strcpy.k b/dos/str/strcpy.k index 819031c..0b1d092 100644 --- a/dos/str/strcpy.k +++ b/dos/str/strcpy.k @@ -5,26 +5,54 @@ ; void strcpy(char *, const char *) ; strcpy: + mov b[ax0], b[ax1] + test b[ax1], b[ax1] - cmovz b[ax0], 0 cretz -.1: - test b[ax1], b[ax1] - cmovz b[ax0], 0 - cretz - - ret + inc ax0 + inc ax1 + jmp strcpy ; ; void strncpy(char *, const char *, int) ; strncpy: + mov rcx, ax2 + jcxz .2 + dec rcx + +.1: + mov b[ax0], b[ax1] + + test b[ax1], b[ax1] + cretz + + inc ax0 + inc ax1 + loop .1 + +.2: ret ; ; void strnzcpy(char *, const char *, int) ; strnzcpy: - ret + mov rcx, ax2 + jcxz .2 + dec rcx +.1: + mov b[ax0], b[ax1] + + test b[ax1], b[ax1] + cretz + + inc ax0 + inc ax1 + loop .1 + +.2: + mov b[ax0], 0 + ret diff --git a/dos/str/strlen.k b/dos/str/strlen.k index 9bc9a58..c9e2d35 100644 --- a/dos/str/strlen.k +++ b/dos/str/strlen.k @@ -21,7 +21,7 @@ strlen: strnlen: xor rax, rax mov rcx, ax1 - ;jcxz .2 + jcxz .2 dec rcx .1: @@ -32,4 +32,5 @@ strnlen: inc ax0 loop .1 +.2: ret diff --git a/pc/instrs/instrs.c b/pc/instrs/instrs.c index a791f7f..28fdb65 100644 --- a/pc/instrs/instrs.c +++ b/pc/instrs/instrs.c @@ -22,13 +22,14 @@ IMPL_START_1(prn) log("prn warning: large access size\n"); } +/* if (!(v1 >= ' ' && v1 < 128) && v1 != '\t' && v1 != '\n') { log("prn on invalid character: %ld\n", v1); + return; } +*/ - else { - putchar((int)v1); - } + putchar((int)v1); } IMPL_END; diff --git a/pc/mem.c b/pc/mem.c index cf1d95c..bc81b36 100644 --- a/pc/mem.c +++ b/pc/mem.c @@ -95,22 +95,12 @@ void writemem8(ctx_t *ctx, ulong val, ulong addr) ushort v = ctx->mp[real]; if (!(addr % 2)) { - ctx->mp[real] = ((v & 0xFF00) << 8) | (val & 0xFF); - } - - else { - ctx->mp[real] = (v & 0xFF) | (((val & 0xFF) << 8)); - } - -/* - if (addr % 2) { ctx->mp[real] = (v & 0xFF00) | (val & 0xFF); } else { ctx->mp[real] = (v & 0xFF) | (((val & 0xFF) << 8)); } -*/ } void writemem16(ctx_t *ctx, ulong val, ulong addr)