mirror of
https://gitlab.os-k.eu/os-k-team/kvisc.git
synced 2023-08-25 14:05:46 +02:00
dos
This commit is contained in:
parent
474de0309d
commit
fa4457c567
17
Makefile
17
Makefile
@ -11,12 +11,21 @@ kas: kpc as/k-as.py as/regs.lst
|
|||||||
@cp pc/instrs/instrs.lst as
|
@cp pc/instrs/instrs.lst as
|
||||||
@rm -f pc/instrs/instrs.lst
|
@rm -f pc/instrs/instrs.lst
|
||||||
|
|
||||||
asm: dos/dos.k dos/print.k
|
DOSK = $(shell find dos -name '*.k')
|
||||||
@as/k-as.py dos/dos.k 0x100000 out/a.out
|
|
||||||
|
|
||||||
test: kas asm
|
out/a.out: $(DOSK)
|
||||||
|
@cd dos && ../as/k-as.py dos.k 0x100000 ../out/a.out
|
||||||
|
|
||||||
|
test: kas out/a.out
|
||||||
@out/k.exe out/a.out > out/stdout.txt
|
@out/k.exe out/a.out > out/stdout.txt
|
||||||
|
@echo "output:"
|
||||||
|
@echo ">>>>>>>>"
|
||||||
|
@cat out/stdout.txt
|
||||||
|
@echo
|
||||||
|
@echo "<<<<<<<<"
|
||||||
|
@echo
|
||||||
|
@rm -f out/a.out
|
||||||
|
|
||||||
disasm: kas asm
|
disasm: kas out/a.out
|
||||||
@out/k.exe os/a.out -d
|
@out/k.exe os/a.out -d
|
||||||
@mv fwprog.dis out
|
@mv fwprog.dis out
|
||||||
|
@ -263,7 +263,7 @@ def parse_preproc(line):
|
|||||||
assert(written == 1)
|
assert(written == 1)
|
||||||
pdata += 1
|
pdata += 1
|
||||||
|
|
||||||
pdefs[tok[0] + "_len"] = str(real_len)
|
pdefs[label + "_len"] = str(real_len)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print("Invalid format: {}".format(line))
|
print("Invalid format: {}".format(line))
|
||||||
@ -516,4 +516,4 @@ parse()
|
|||||||
gentext()
|
gentext()
|
||||||
genout()
|
genout()
|
||||||
leave()
|
leave()
|
||||||
|
sys.exit(0)
|
||||||
|
13
dos/dos.k
13
dos/dos.k
@ -15,6 +15,15 @@ _start:
|
|||||||
stop
|
stop
|
||||||
jmp .1
|
jmp .1
|
||||||
|
|
||||||
include "dos/print.k"
|
;
|
||||||
include "dos/main.k"
|
; Include librairies
|
||||||
|
;
|
||||||
|
include "fmt/fmt.k"
|
||||||
|
include "prn/print.k"
|
||||||
|
include "str/string.k"
|
||||||
|
|
||||||
|
;
|
||||||
|
; Disk Operating System
|
||||||
|
;
|
||||||
|
include "main.k"
|
||||||
|
|
||||||
|
5
dos/fmt/fmt.k
Normal file
5
dos/fmt/fmt.k
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
; The OS/K Team licenses this file to you under the MIT license.
|
||||||
|
; See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
|
include "fmt/itoa.k"
|
||||||
|
|
6
dos/fmt/itoa.k
Normal file
6
dos/fmt/itoa.k
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
; The OS/K Team licenses this file to you under the MIT license.
|
||||||
|
; See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
|
;
|
||||||
|
; char *itoa(char *buf, int num, int base)
|
||||||
|
;
|
11
dos/main.k
11
dos/main.k
@ -9,20 +9,27 @@ main:
|
|||||||
|
|
||||||
mov ax0, .msg
|
mov ax0, .msg
|
||||||
call print
|
call print
|
||||||
|
break
|
||||||
|
|
||||||
call exit
|
mov ax0, .buf
|
||||||
|
mov ax1, .msg
|
||||||
|
call strrev
|
||||||
|
break
|
||||||
|
|
||||||
|
mov ax0, .buf
|
||||||
|
call print
|
||||||
|
|
||||||
leave
|
leave
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.msg = "Hello World :)\n"
|
.msg = "Hello World :)\n"
|
||||||
|
.buf = " "
|
||||||
|
|
||||||
;
|
;
|
||||||
; Exit function
|
; Exit function
|
||||||
;
|
;
|
||||||
exit:
|
exit:
|
||||||
enter
|
enter
|
||||||
break
|
|
||||||
|
|
||||||
mov ax0, .msg
|
mov ax0, .msg
|
||||||
call print
|
call print
|
||||||
|
6
dos/str/string.k
Normal file
6
dos/str/string.k
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
; The OS/K Team licenses this file to you under the MIT license.
|
||||||
|
; See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
|
include "str/strlen.k"
|
||||||
|
include "str/strrev.k"
|
||||||
|
|
39
dos/str/strlen.k
Normal file
39
dos/str/strlen.k
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
; The OS/K Team licenses this file to you under the MIT license.
|
||||||
|
; See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
|
;
|
||||||
|
; int strlen(char *)
|
||||||
|
;
|
||||||
|
strlen:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
.1:
|
||||||
|
test b[ax0], b[ax0]
|
||||||
|
jz .2
|
||||||
|
|
||||||
|
inc rax
|
||||||
|
inc ax0
|
||||||
|
jmp .1
|
||||||
|
|
||||||
|
.2:
|
||||||
|
ret
|
||||||
|
|
||||||
|
;
|
||||||
|
; int strnlen(char *, int)
|
||||||
|
;
|
||||||
|
strnlen:
|
||||||
|
xor rax, rax
|
||||||
|
mov rcx, ax1
|
||||||
|
jcxz .2
|
||||||
|
dec rcx
|
||||||
|
|
||||||
|
.1:
|
||||||
|
test b[ax0], b[ax0]
|
||||||
|
jz .2
|
||||||
|
|
||||||
|
inc rax
|
||||||
|
inc ax0
|
||||||
|
loop .1
|
||||||
|
|
||||||
|
.2:
|
||||||
|
ret
|
33
dos/str/strrev.k
Normal file
33
dos/str/strrev.k
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
; The OS/K Team licenses this file to you under the MIT license.
|
||||||
|
; See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
|
;
|
||||||
|
; void strrev(char *buf, const char *str)
|
||||||
|
;
|
||||||
|
strrev:
|
||||||
|
test b[ax1], b[ax1]
|
||||||
|
cmovz b[ax0], 0
|
||||||
|
jz .4
|
||||||
|
|
||||||
|
.1:
|
||||||
|
test b[ax1+1], b[ax1+1]
|
||||||
|
jz .2
|
||||||
|
|
||||||
|
inc ax1
|
||||||
|
jmp .1
|
||||||
|
|
||||||
|
.2:
|
||||||
|
mov b[ax0], b[ax1]
|
||||||
|
|
||||||
|
test b[ax1], b[ax1]
|
||||||
|
jz .3
|
||||||
|
|
||||||
|
inc ax0
|
||||||
|
dec ax1
|
||||||
|
jmp .2
|
||||||
|
|
||||||
|
.3:
|
||||||
|
mov b[ax0+1], 0
|
||||||
|
|
||||||
|
.4:
|
||||||
|
ret
|
@ -6,7 +6,7 @@ all: k.exe
|
|||||||
src = instrs/instrs.c decd.c main.c regs.c dump.c \
|
src = instrs/instrs.c decd.c main.c regs.c dump.c \
|
||||||
instrs/jumps.c except.c disd.c mem.c instrs/logic.c \
|
instrs/jumps.c except.c disd.c mem.c instrs/logic.c \
|
||||||
instrs/stack.c instrs/super.c instrs/arith.c log.c \
|
instrs/stack.c instrs/super.c instrs/arith.c log.c \
|
||||||
instrs/debug.c
|
instrs/debug.c instrs/mov.c
|
||||||
|
|
||||||
obj = $(patsubst %.c,%.o,$(src))
|
obj = $(patsubst %.c,%.o,$(src))
|
||||||
|
|
||||||
|
@ -137,7 +137,8 @@ jb i
|
|||||||
jbe r
|
jbe r
|
||||||
jbe i
|
jbe i
|
||||||
|
|
||||||
jcxz
|
jcxz r
|
||||||
|
jcxz i
|
||||||
|
|
||||||
#
|
#
|
||||||
# Movement instructions
|
# Movement instructions
|
||||||
@ -160,6 +161,20 @@ xchg m m
|
|||||||
lea r m
|
lea r m
|
||||||
lea m m
|
lea m m
|
||||||
|
|
||||||
|
cmovz r r
|
||||||
|
cmovz r i
|
||||||
|
cmovz r m
|
||||||
|
cmovz m r
|
||||||
|
cmovz m i
|
||||||
|
cmovz m m
|
||||||
|
|
||||||
|
cmovnz r r
|
||||||
|
cmovnz r i
|
||||||
|
cmovnz r m
|
||||||
|
cmovnz m r
|
||||||
|
cmovnz m i
|
||||||
|
cmovnz m m
|
||||||
|
|
||||||
#
|
#
|
||||||
# Stack manipulation instructions
|
# Stack manipulation instructions
|
||||||
#
|
#
|
||||||
|
@ -12,40 +12,6 @@ IMPL_START_0(nop)
|
|||||||
}
|
}
|
||||||
IMPL_END;
|
IMPL_END;
|
||||||
|
|
||||||
//
|
|
||||||
// Movement instructions
|
|
||||||
//
|
|
||||||
|
|
||||||
IMPL_START_2(mov)
|
|
||||||
{
|
|
||||||
v1 = v2;
|
|
||||||
}
|
|
||||||
IMPL_OUT;
|
|
||||||
|
|
||||||
IMPL_START_2(xchg)
|
|
||||||
{
|
|
||||||
ulong t = v1;
|
|
||||||
v1 = v2;
|
|
||||||
v2 = t;
|
|
||||||
}
|
|
||||||
IMPL_OUT;
|
|
||||||
|
|
||||||
IMPL_START_1(lea)
|
|
||||||
{
|
|
||||||
if (!p2->mem) {
|
|
||||||
_except(ctx, E_ILL, "Bad LEA format");
|
|
||||||
}
|
|
||||||
|
|
||||||
v1 = (p2->type == A_REG ? ctx->r[p2->val].val : p2->val) + p2->off;
|
|
||||||
}
|
|
||||||
IMPL_OUT;
|
|
||||||
|
|
||||||
IMPL_START_1(gcs)
|
|
||||||
{
|
|
||||||
v1 = ctx->r[CR1].val;
|
|
||||||
}
|
|
||||||
IMPL_OUT;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Misc. instructions
|
// Misc. instructions
|
||||||
//
|
//
|
||||||
|
54
pc/instrs/mov.c
Normal file
54
pc/instrs/mov.c
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
// The OS/K Team licenses this file to you under the MIT license.
|
||||||
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
|
#include "instrs.h"
|
||||||
|
#include "arch_i.h"
|
||||||
|
|
||||||
|
//
|
||||||
|
// Movement instructions
|
||||||
|
//
|
||||||
|
|
||||||
|
IMPL_START_2(mov)
|
||||||
|
{
|
||||||
|
v1 = v2;
|
||||||
|
}
|
||||||
|
IMPL_OUT;
|
||||||
|
|
||||||
|
IMPL_START_2(xchg)
|
||||||
|
{
|
||||||
|
ulong t = v1;
|
||||||
|
v1 = v2;
|
||||||
|
v2 = t;
|
||||||
|
}
|
||||||
|
IMPL_OUT;
|
||||||
|
|
||||||
|
IMPL_START_1(lea)
|
||||||
|
{
|
||||||
|
if (!p2->mem) {
|
||||||
|
_except(ctx, E_ILL, "Bad LEA format");
|
||||||
|
}
|
||||||
|
|
||||||
|
v1 = (p2->type == A_REG ? ctx->r[p2->val].val : p2->val) + p2->off;
|
||||||
|
}
|
||||||
|
IMPL_OUT;
|
||||||
|
|
||||||
|
IMPL_START_1(gcs)
|
||||||
|
{
|
||||||
|
v1 = ctx->r[CR1].val;
|
||||||
|
}
|
||||||
|
IMPL_OUT;
|
||||||
|
|
||||||
|
IMPL_START_2(cmovz)
|
||||||
|
{
|
||||||
|
if (ctx->r[FLG].val & ZF)
|
||||||
|
v1 = v2;
|
||||||
|
}
|
||||||
|
IMPL_OUT;
|
||||||
|
|
||||||
|
IMPL_START_2(cmovnz)
|
||||||
|
{
|
||||||
|
if (!(ctx->r[FLG].val & ZF))
|
||||||
|
v1 = v2;
|
||||||
|
}
|
||||||
|
IMPL_OUT;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user