mirror of
https://gitlab.os-k.eu/os-k-team/kvisc.git
synced 2023-08-25 14:05:46 +02:00
dir
This commit is contained in:
parent
a336937994
commit
63aeda2878
22
Makefile
22
Makefile
@ -3,8 +3,6 @@
|
|||||||
|
|
||||||
KODIR=fs
|
KODIR=fs
|
||||||
|
|
||||||
AOUT=$(KODIR)/dos.com
|
|
||||||
ASYM=$(KODIR)/dos.sym
|
|
||||||
KVVM=$(KODIR)/kvisc.exe
|
KVVM=$(KODIR)/kvisc.exe
|
||||||
|
|
||||||
all: kas
|
all: kas
|
||||||
@ -15,18 +13,22 @@ kpc: vm/Makefile
|
|||||||
kas: kpc as/regs.lst as/k-as.py
|
kas: kpc as/regs.lst as/k-as.py
|
||||||
@cp vm/in/instrs.lst as
|
@cp vm/in/instrs.lst as
|
||||||
|
|
||||||
DOSK = $(shell find ka -name '*.k')
|
dos: kas dosclean
|
||||||
|
@cd ka && make --no-print-directory -s
|
||||||
|
|
||||||
$(AOUT): $(DOSK) kas
|
#@as/k-as.py ka/dos.k 0x100000 $(AOUT) $(ASYM)
|
||||||
@as/k-as.py ka/dos.k 0x100000 $(AOUT) $(ASYM)
|
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean dosclean
|
||||||
clean:
|
|
||||||
|
dosclean:
|
||||||
|
@rm -f $(KODIR)/*.com $(KODIR)/*.sym
|
||||||
|
|
||||||
|
clean: dosclean
|
||||||
@cd vm && make clean --no-print-directory -s verbose=no
|
@cd vm && make clean --no-print-directory -s verbose=no
|
||||||
@rm -f $(AOUT) $(ASYM) $(KVVM) as/instrs.lst
|
@rm -f $(KVVM) as/instrs.lst
|
||||||
|
|
||||||
test: $(AOUT)
|
test: dos
|
||||||
@$(KVVM) $(AOUT) $(ASYM)
|
@$(KVVM) $(KODIR)/doskrnl.com $(KODIR)/doskrnl.sym
|
||||||
@rm -f $(AOUT) $(ASYM)
|
@rm -f $(AOUT) $(ASYM)
|
||||||
|
|
||||||
wc: clean
|
wc: clean
|
||||||
|
@ -11,6 +11,8 @@ from array import array
|
|||||||
from tempfile import TemporaryFile
|
from tempfile import TemporaryFile
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
|
||||||
|
#print("k-as command line: '{}'".format(sys.argv))
|
||||||
|
|
||||||
WANT_DISASM = False
|
WANT_DISASM = False
|
||||||
|
|
||||||
if len(sys.argv) != 5:
|
if len(sys.argv) != 5:
|
||||||
@ -32,7 +34,7 @@ b_sym = open(sys.argv[4], "w")
|
|||||||
|
|
||||||
start_addr = int(sys.argv[2], base=0)
|
start_addr = int(sys.argv[2], base=0)
|
||||||
|
|
||||||
os.chdir(os.path.dirname(sys.argv[1]))
|
# os.chdir(os.path.dirname(sys.argv[1]))
|
||||||
|
|
||||||
def leave():
|
def leave():
|
||||||
source.close()
|
source.close()
|
||||||
|
15
ka/Makefile
Normal file
15
ka/Makefile
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# The OS/K Team licenses this file to you under the MIT license.
|
||||||
|
# See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
|
all: dos
|
||||||
|
|
||||||
|
KODIR=../fs
|
||||||
|
|
||||||
|
KSRC = $(shell ls *.k)
|
||||||
|
KCOM = $(patsubst %.k,$(KODIR)/%.com,$(KSRC))
|
||||||
|
|
||||||
|
$(KODIR)/%.com: %.k
|
||||||
|
@../as/k-as.py $< 0x100000 $@ $(patsubst %.k,$(KODIR)/%.sym,$<)
|
||||||
|
|
||||||
|
dos: $(KCOM)
|
||||||
|
|
@ -1,6 +1,13 @@
|
|||||||
; The OS/K Team licenses this file to you under the MIT license.
|
; The OS/K Team licenses this file to you under the MIT license.
|
||||||
; See the LICENSE file in the project root for more information.
|
; See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
SCR_TEXTMODE_WIDTH := 80
|
start:
|
||||||
SCR_TEXTMODE_HEIGHT := 25
|
call CMD.builtins.dir
|
||||||
|
stop
|
||||||
|
|
||||||
|
|
||||||
|
include "crt/crt.k"
|
||||||
|
|
||||||
|
include "usr/cmd/dir.k"
|
||||||
|
include "sys/drv/diskdev.k"
|
||||||
|
|
@ -4,6 +4,7 @@
|
|||||||
;
|
;
|
||||||
; Include CRT librairies
|
; Include CRT librairies
|
||||||
;
|
;
|
||||||
|
include "crt/limits.k"
|
||||||
include "crt/err/errno.k"
|
include "crt/err/errno.k"
|
||||||
include "crt/fmt/format.k"
|
include "crt/fmt/format.k"
|
||||||
include "crt/str/string.k"
|
include "crt/str/string.k"
|
||||||
|
@ -19,6 +19,15 @@ printf:
|
|||||||
lea ax3, b[rsp+8]
|
lea ax3, b[rsp+8]
|
||||||
jmp doprnt
|
jmp doprnt
|
||||||
|
|
||||||
|
;
|
||||||
|
; int nprintf(const char *fmt, int n, ...)
|
||||||
|
;
|
||||||
|
nprintf:
|
||||||
|
mov ax2, ax0
|
||||||
|
mov ax0, putc
|
||||||
|
lea ax3, b[rsp+8]
|
||||||
|
jmp doprnt
|
||||||
|
|
||||||
;
|
;
|
||||||
; Print a string
|
; Print a string
|
||||||
;
|
;
|
||||||
|
@ -10,7 +10,7 @@ start:
|
|||||||
|
|
||||||
call main
|
call main
|
||||||
|
|
||||||
call dir_test
|
call CMD.builtins.dir
|
||||||
|
|
||||||
hlt
|
hlt
|
||||||
|
|
||||||
@ -25,9 +25,6 @@ start:
|
|||||||
prn rax
|
prn rax
|
||||||
jmp .1
|
jmp .1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
include "inc/limits.k"
|
|
||||||
include "crt/crt.k"
|
include "crt/crt.k"
|
||||||
|
|
||||||
;
|
;
|
||||||
@ -41,3 +38,4 @@ include "sys/drv/diskdev.k"
|
|||||||
include "sys/tests.k"
|
include "sys/tests.k"
|
||||||
include "sys/main.k"
|
include "sys/main.k"
|
||||||
|
|
||||||
|
include "usr/cmd/dir.k"
|
121
ka/usr/cmd/dir.k
Normal file
121
ka/usr/cmd/dir.k
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
NAME_MAX := 256
|
||||||
|
|
||||||
|
CMD.builtins.dir:
|
||||||
|
push nx0
|
||||||
|
|
||||||
|
sub nx0, nx0 # no. of files found
|
||||||
|
|
||||||
|
mov ax0, .dirmsg
|
||||||
|
call print
|
||||||
|
|
||||||
|
.dirmsg = " Directory of C:\\\n\n"
|
||||||
|
|
||||||
|
.first:
|
||||||
|
mov ax0, .buf
|
||||||
|
mov ax1, NAME_MAX
|
||||||
|
call DISK.FindFirst
|
||||||
|
jmp .list
|
||||||
|
|
||||||
|
.next:
|
||||||
|
mov ax0, .buf
|
||||||
|
mov ax1, NAME_MAX
|
||||||
|
call DISK.FindNext
|
||||||
|
|
||||||
|
.list:
|
||||||
|
test rax, rax
|
||||||
|
j.z .end
|
||||||
|
|
||||||
|
; found something
|
||||||
|
inc nx0
|
||||||
|
|
||||||
|
; separate extension from file name
|
||||||
|
mov rcx, NAME_MAX
|
||||||
|
mov r10, .buf
|
||||||
|
mov r11, r10
|
||||||
|
scasb.rep.nz r10, '.'
|
||||||
|
|
||||||
|
.print_file_name:
|
||||||
|
prn b[r11]
|
||||||
|
inc r11
|
||||||
|
|
||||||
|
cmp r11, r10
|
||||||
|
j.b .print_file_name
|
||||||
|
|
||||||
|
; calculate where to put extension
|
||||||
|
lea r11, b[r10 - 1]
|
||||||
|
sub r11, .buf
|
||||||
|
|
||||||
|
.ext_pad:
|
||||||
|
; print at least 11 non-space characters before extension
|
||||||
|
cmp r11, 11
|
||||||
|
j.ae .print_ext
|
||||||
|
prn ' '
|
||||||
|
inc r11
|
||||||
|
jmp .ext_pad
|
||||||
|
|
||||||
|
.print_ext:
|
||||||
|
; here we print at least 4 characters excluding '.'
|
||||||
|
mov rcx, 4
|
||||||
|
prn ' '
|
||||||
|
|
||||||
|
cmp b[r10], '.'
|
||||||
|
inc.z r10
|
||||||
|
|
||||||
|
.print_ext.1:
|
||||||
|
cmp b[r10], 0
|
||||||
|
j.z .print_ext.2
|
||||||
|
|
||||||
|
; print and decrease rcx, unless it's already 0
|
||||||
|
prn b[r10]
|
||||||
|
inc r10
|
||||||
|
test rcx, rcx
|
||||||
|
dec.nz rcx
|
||||||
|
|
||||||
|
jmp .print_ext.1
|
||||||
|
|
||||||
|
.print_ext.2:
|
||||||
|
; did we print at least 4 bytes?
|
||||||
|
test rcx, rcx
|
||||||
|
j.z .print_bytes ; yes, carry on
|
||||||
|
|
||||||
|
prn.rep ' '
|
||||||
|
jmp .print_ext.2
|
||||||
|
|
||||||
|
.print_bytes:
|
||||||
|
; print file size in bytes
|
||||||
|
prn ' '
|
||||||
|
prn ' '
|
||||||
|
prn ' '
|
||||||
|
|
||||||
|
mov rax, rdx
|
||||||
|
shr rax, 10
|
||||||
|
and rdx, 1023
|
||||||
|
|
||||||
|
mov ax0, .bytesstr
|
||||||
|
push rdx
|
||||||
|
push rax
|
||||||
|
call printf
|
||||||
|
add rsp, 16
|
||||||
|
|
||||||
|
.bytesstr = "%d kilobytes + %d bytes"
|
||||||
|
|
||||||
|
.prepare_next:
|
||||||
|
; go find next entry
|
||||||
|
prn 10
|
||||||
|
jmp .next
|
||||||
|
|
||||||
|
.end:
|
||||||
|
mov ax0, .endstr1
|
||||||
|
push nx0
|
||||||
|
call printf
|
||||||
|
add rsp, 8
|
||||||
|
|
||||||
|
mov ax0, .endstr2
|
||||||
|
call print
|
||||||
|
|
||||||
|
pop nx0
|
||||||
|
ret
|
||||||
|
|
||||||
|
.buf = [256]
|
||||||
|
.endstr1 = " %d file(s)\n"
|
||||||
|
.endstr2 = " 0 dir(s)\n"
|
@ -10,11 +10,13 @@ Disk device function slots:
|
|||||||
|
|
||||||
16 p i - - firstfile
|
16 p i - - firstfile
|
||||||
- write name of first file on disk in #ax1-sized buffer #ax0
|
- write name of first file on disk in #ax1-sized buffer #ax0
|
||||||
- rax = number of bytes written (0 = no files found)
|
|
||||||
|
|
||||||
17 p i - - findnext
|
17 p i - - findnext
|
||||||
- write name of next file on disk in #ax1-sized buffer #ax0
|
- write name of next file on disk in #ax1-sized buffer #ax0
|
||||||
|
|
||||||
|
For both slot #16 and slot #17:
|
||||||
- rax = number of bytes written (0 = no files found)
|
- rax = number of bytes written (0 = no files found)
|
||||||
|
- rdx = number of bytes in file
|
||||||
|
|
||||||
18-25 - - - - (reserved) (reserved)
|
18-25 - - - - (reserved) (reserved)
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
#include <pc/device.h>
|
#include <pc/device.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
|
||||||
#define MAXOPEN 4096
|
#define MAXOPEN 4096
|
||||||
@ -26,6 +27,8 @@ struct disk_t
|
|||||||
|
|
||||||
long diskdev_findnext(ctx_t *ctx, dev_t *dev)
|
long diskdev_findnext(ctx_t *ctx, dev_t *dev)
|
||||||
{
|
{
|
||||||
|
struct stat st;
|
||||||
|
char name[NAME_MAX+4];
|
||||||
dirent_t *ent;
|
dirent_t *ent;
|
||||||
GETDISK();
|
GETDISK();
|
||||||
|
|
||||||
@ -47,6 +50,17 @@ long diskdev_findnext(ctx_t *ctx, dev_t *dev)
|
|||||||
|
|
||||||
rax = copystr(ctx, ax0, ax1, ent->d_name);
|
rax = copystr(ctx, ax0, ax1, ent->d_name);
|
||||||
|
|
||||||
|
snprintf(name, NAME_MAX+4, "fs/%s", ent->d_name);
|
||||||
|
|
||||||
|
if (stat(name, &st) < 0)
|
||||||
|
{
|
||||||
|
perror("diskdev: couldn't stat file in directory: ");
|
||||||
|
rdx = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
rdx = st.st_size;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,10 +74,6 @@
|
|||||||
<regex>\b([1-9][0-9]*|0)([Uu]([Ll]|LL|ll)?|([Ll]|LL|ll)[Uu]?)?\b</regex>
|
<regex>\b([1-9][0-9]*|0)([Uu]([Ll]|LL|ll)?|([Ll]|LL|ll)[Uu]?)?\b</regex>
|
||||||
</pattern-item>
|
</pattern-item>
|
||||||
|
|
||||||
<pattern-item _name = "Floating Point Number" style = "Floating Point">
|
|
||||||
<regex>\b([0-9]+[Ee][-]?[0-9]+|([0-9]*\.[0-9]+|[0-9]+\.)([Ee][-]?[0-9]+)?)[fFlL]?</regex>
|
|
||||||
</pattern-item>
|
|
||||||
|
|
||||||
<pattern-item _name = "Hex Number" style = "Decimal">
|
<pattern-item _name = "Hex Number" style = "Decimal">
|
||||||
<regex>\b0[xX][0-9a-fA-F]+([Uu]([Ll]|LL|ll)?|([Ll]|LL|ll)[Uu]?)?\b</regex>
|
<regex>\b0[xX][0-9a-fA-F]+([Uu]([Ll]|LL|ll)?|([Ll]|LL|ll)[Uu]?)?\b</regex>
|
||||||
</pattern-item>
|
</pattern-item>
|
||||||
|
Loading…
Reference in New Issue
Block a user