mirror of
https://gitlab.os-k.eu/os-k-team/kvisc.git
synced 2023-08-25 14:05:46 +02:00
m
This commit is contained in:
parent
6b3ac53eb4
commit
c79ade6609
2
ka/dos.k
2
ka/dos.k
@ -12,7 +12,7 @@ start:
|
|||||||
|
|
||||||
call dir_test
|
call dir_test
|
||||||
|
|
||||||
;hlt
|
hlt
|
||||||
|
|
||||||
; Wait for and print input indefinitely
|
; Wait for and print input indefinitely
|
||||||
.1:
|
.1:
|
||||||
|
@ -46,7 +46,10 @@ IDT slots:
|
|||||||
513-767 maskable hardware interrupts (see ...), OVERRIDES slot 512
|
513-767 maskable hardware interrupts (see ...), OVERRIDES slot 512
|
||||||
|
|
||||||
768 a handler in this slot will receive all non-maskable hardware interrupts
|
768 a handler in this slot will receive all non-maskable hardware interrupts
|
||||||
769-1023 non-maskable hardware interrupts (see ...), OVERRIDES slot 768
|
769-1022 non-maskable hardware interrupts (see ...), OVERRIDES slot 768
|
||||||
|
|
||||||
|
1023 Uncatchable exception, guarantees shutdown. Only throwable by supervisor
|
||||||
|
via the CRASH instruction, or by the machine in case of irrecoverable failure
|
||||||
|
|
||||||
A handler for some E/I must use the 'idtdone' iocall to show that it is done dealing with
|
A handler for some E/I must use the 'idtdone' iocall to show that it is done dealing with
|
||||||
a certain E/I. If that same E/I happens again before that, the following happens:
|
a certain E/I. If that same E/I happens again before that, the following happens:
|
||||||
|
@ -10,7 +10,7 @@ It will take registers ax0-ax7 as its parameters, and
|
|||||||
return a value in rdx:rax.
|
return a value in rdx:rax.
|
||||||
|
|
||||||
The return value in rax is a status value:
|
The return value in rax is a status value:
|
||||||
≥0 ok (>0 only if meaningful)
|
≥0 ok (>0 only when meaningful)
|
||||||
-1 unspecified error
|
-1 unspecified error
|
||||||
-2 no such device
|
-2 no such device
|
||||||
-3 device powered off
|
-3 device powered off
|
||||||
|
23
vm/in/JUMPS
23
vm/in/JUMPS
@ -6,7 +6,7 @@
|
|||||||
#---------------------------------------------------------------------------#
|
#---------------------------------------------------------------------------#
|
||||||
|
|
||||||
#
|
#
|
||||||
# Unconditional jump (JMP) instruction
|
# Absolute jump (JMP) instruction
|
||||||
#
|
#
|
||||||
# RIP = $1
|
# RIP = $1
|
||||||
#
|
#
|
||||||
@ -14,7 +14,7 @@ j ri
|
|||||||
jmp ri
|
jmp ri
|
||||||
|
|
||||||
#
|
#
|
||||||
# RCX-dependent jump (LOOP) instruction
|
# RCX-dependent absolute jump (LOOP) instruction
|
||||||
#
|
#
|
||||||
# IF (RCX > 0) THEN
|
# IF (RCX > 0) THEN
|
||||||
# RCX = RCX - 1
|
# RCX = RCX - 1
|
||||||
@ -22,3 +22,22 @@ jmp ri
|
|||||||
# FI
|
# FI
|
||||||
#
|
#
|
||||||
loop ri
|
loop ri
|
||||||
|
|
||||||
|
#
|
||||||
|
# Relative jump (BCH) instruction ("branch")
|
||||||
|
#
|
||||||
|
# RIP = RIP + $1
|
||||||
|
#
|
||||||
|
b ri
|
||||||
|
bch ri
|
||||||
|
|
||||||
|
#
|
||||||
|
# RCX-dependent relative jump (BOOP) instruction
|
||||||
|
#
|
||||||
|
# IF (RCX > 0) THEN
|
||||||
|
# RCX = RCX - 1
|
||||||
|
# RIP = RIP + $1
|
||||||
|
# FI
|
||||||
|
#
|
||||||
|
boop ri
|
||||||
|
|
||||||
|
12
vm/in/SUPER
12
vm/in/SUPER
@ -5,6 +5,18 @@
|
|||||||
# Supervisor only instructions #
|
# Supervisor only instructions #
|
||||||
#---------------------------------------------------------------------------#
|
#---------------------------------------------------------------------------#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Crash virtual machine (CRASH)
|
||||||
|
#
|
||||||
|
# THROW #1023
|
||||||
|
#
|
||||||
|
# Throws:
|
||||||
|
# #SYS if not in supervisor mode
|
||||||
|
# #ILL if disabled through DV
|
||||||
|
# #1023 otherwise
|
||||||
|
#
|
||||||
|
crash
|
||||||
|
|
||||||
#
|
#
|
||||||
# Initiate machine shutdown (STOP)
|
# Initiate machine shutdown (STOP)
|
||||||
#
|
#
|
||||||
|
@ -28,3 +28,24 @@ IMPL_START_1(loop)
|
|||||||
}
|
}
|
||||||
IMPL_END;
|
IMPL_END;
|
||||||
|
|
||||||
|
IMPL_START_1(b)
|
||||||
|
{
|
||||||
|
rip += v1;
|
||||||
|
}
|
||||||
|
IMPL_END;
|
||||||
|
|
||||||
|
IMPL_START_1(bch)
|
||||||
|
{
|
||||||
|
rip += v1;
|
||||||
|
}
|
||||||
|
IMPL_END;
|
||||||
|
|
||||||
|
IMPL_START_1(boop)
|
||||||
|
{
|
||||||
|
if (rcx > 0) {
|
||||||
|
rcx--;
|
||||||
|
rip += v1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
IMPL_END;
|
||||||
|
|
||||||
|
@ -13,6 +13,13 @@ IMPL_START_0(stop)
|
|||||||
}
|
}
|
||||||
IMPL_END;
|
IMPL_END;
|
||||||
|
|
||||||
|
IMPL_START_0(crash)
|
||||||
|
{
|
||||||
|
CHK_SUPERV();
|
||||||
|
_except(ctx, 1023, "CRASH instruction");
|
||||||
|
}
|
||||||
|
IMPL_END;
|
||||||
|
|
||||||
IMPL_START_0(hlt)
|
IMPL_START_0(hlt)
|
||||||
{
|
{
|
||||||
CHK_SUPERV();
|
CHK_SUPERV();
|
||||||
@ -26,7 +33,11 @@ IMPL_START_0(hlt)
|
|||||||
die(0);
|
die(0);
|
||||||
|
|
||||||
if (evt.type == SDL_KEYDOWN)
|
if (evt.type == SDL_KEYDOWN)
|
||||||
|
{
|
||||||
console_handle_input(ctx, evt.key.keysym.sym);
|
console_handle_input(ctx, evt.key.keysym.sym);
|
||||||
|
if (evt.key.keysym.sym == SDLK_RETURN)
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
-->
|
-->
|
||||||
<!DOCTYPE language SYSTEM "language.dtd">
|
<!DOCTYPE language SYSTEM "language.dtd">
|
||||||
|
|
||||||
<language _name="Assembler (K-Arch)" version="1.0" _section="Sources" globs="*.k" mimetypes="text/x-asm;text/x-assembler">
|
<language _name="Assembler (KVISC)" version="1.0" _section="Sources" globs="*.k" mimetypes="text/x-asm;text/x-assembler">
|
||||||
|
|
||||||
<escape-char>\</escape-char>
|
<escape-char>\</escape-char>
|
||||||
|
|
||||||
@ -56,14 +56,13 @@
|
|||||||
|
|
||||||
<!-- KVISC -->
|
<!-- KVISC -->
|
||||||
<keyword>(inv|flg|[re]?pc)</keyword>
|
<keyword>(inv|flg|[re]?pc)</keyword>
|
||||||
<keyword>[a-z]x[0-9]+</keyword>
|
<keyword>[re][a-z][xi]l?</keyword>
|
||||||
<keyword>[re][a-z]x</keyword>
|
<keyword>[a-z]x[0-9]+[bwdlq]?</keyword>
|
||||||
|
|
||||||
<!-- x86-64 -->
|
<!-- x86-64 -->
|
||||||
<keyword>[c-gs]s</keyword>
|
<keyword>[c-gs]s</keyword>
|
||||||
<keyword>[re]?flags</keyword>
|
<keyword>[re]?flags</keyword>
|
||||||
<keyword>([gil]d)?tr</keyword>
|
<keyword>([gil]d)?tr</keyword>
|
||||||
<keyword>[re]?[ds]il?</keyword>
|
|
||||||
<keyword>[re]?[sbi]pl?</keyword>
|
<keyword>[re]?[sbi]pl?</keyword>
|
||||||
<keyword>[x-z]mm[0-9]+</keyword>
|
<keyword>[x-z]mm[0-9]+</keyword>
|
||||||
<keyword>[re]?[a-d][xhl]</keyword>
|
<keyword>[re]?[a-d][xhl]</keyword>
|
@ -32,7 +32,7 @@ void _except(ctx_t *ctx, int _code, char *fmt, ...)
|
|||||||
exit(-12);
|
exit(-12);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (code >= IDT_SLOTS)
|
if (code >= IDT_SLOTS || code == 1023)
|
||||||
goto actually_die;
|
goto actually_die;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -140,7 +140,6 @@ int main(int argc, char **argv)
|
|||||||
main_ctx.mz = MEMSIZE;
|
main_ctx.mz = MEMSIZE;
|
||||||
|
|
||||||
main_ctx.get = bget;
|
main_ctx.get = bget;
|
||||||
|
|
||||||
main_ctx.rf[RIP] = MEMOFF;
|
main_ctx.rf[RIP] = MEMOFF;
|
||||||
|
|
||||||
if (main_ctx.mp == 0) {
|
if (main_ctx.mp == 0) {
|
||||||
|
@ -27,7 +27,7 @@ int create_symtab(const char *name)
|
|||||||
logerr("Symbol addresses in symbol table not in increasing order\n");
|
logerr("Symbol addresses in symbol table not in increasing order\n");
|
||||||
logerr("Previous symbol: '%s' '%lu'\n", symtab[it-1].name, prev_addr);
|
logerr("Previous symbol: '%s' '%lu'\n", symtab[it-1].name, prev_addr);
|
||||||
logerr("Current symbol: '%s' '%lu'\n", buf, addr);
|
logerr("Current symbol: '%s' '%lu'\n", buf, addr);
|
||||||
exit(-55);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
prev_addr = addr;
|
prev_addr = addr;
|
||||||
|
Loading…
Reference in New Issue
Block a user