duskos

dusk os fork
git clone git://git.alexwennerberg.com/duskos
Log | Files | Refs | README | LICENSE

commit cd7d534ad2ba92363e8b3d0806ea389404ea703b
parent 970fcf1ba6cca4ef3b8d42d574881c3954f63d39
Author: Virgil Dupras <hsoft@hardcoded.net>
Date:   Wed,  1 Jun 2022 13:51:40 -0400

Add A register words

Diffstat:
MMakefile | 5+++--
Mdusk.asm | 16+++++++++++-----
Mf2asm.py | 30+++++++++++++++++++++++++++---
Mword_macros.asm | 10++++++++++
Awords/acfetch.asm | 6++++++
Awords/acstore.asm | 6++++++
Awords/adec.asm | 6++++++
Awords/aget.asm | 6++++++
Awords/ainc.asm | 5+++++
Awords/aset.asm | 7+++++++
Mwords/rot.asm | 2--
Mxcomp2.txt | 6+++++-
12 files changed, 92 insertions(+), 13 deletions(-)

diff --git a/Makefile b/Makefile @@ -1,6 +1,7 @@ TARGETS = dusk WORDOBJS = xcomp.o $(addsuffix .o,$(addprefix words/, \ - bye emit drop dup swap over rot)) + bye emit drop dup swap over rot \ + aset aget acfetch acstore ainc adec)) all: $(TARGETS) @@ -11,7 +12,7 @@ xcomp.asm: xcomp2.txt f2asm.py ./f2asm.py xcomp2.txt > $@ dusk: dusk.asm $(WORDOBJS) - nasm -f elf32 dusk.asm -o dusk.o + nasm -f elf32 -p word_macros.asm dusk.asm -o dusk.o ld -m elf_i386 dusk.o $(WORDOBJS) -o $@ .PHONY: clean diff --git a/dusk.asm b/dusk.asm @@ -3,18 +3,24 @@ BITS 32 %define PS_SZ 4096 %define RS_SZ 4096 SECTION .bss +GLOBAL areg +areg: resd 1 resd RS_SZ rs_top: resd PS_SZ ps_top: SECTION .text - GLOBAL _start - EXTERN word_boot - EXTERN word_bye +GLOBAL _start _start: cld mov esp, rs_top mov ebp, ps_top - call word_boot - call word_bye + EXTERN word_boot + jmp word_boot + +GLOBAL cellword +cellword: + pop eax + pspush eax + ret diff --git a/f2asm.py b/f2asm.py @@ -16,7 +16,16 @@ aliases = { 'A>r': 'a2rs', 'r>A': 'rs2a', 'rot>': 'rotr', + '>A': 'aset', + 'A>': 'aget', + 'Ac@': 'acfetch', + 'Ac!': 'acstore', + 'A+': 'ainc', + 'A-': 'adec', + 'Ac@+': 'acfetchplus', + 'Ac!+': 'acstoreplus', } +knownwords = set() def out(*args): print(*args, end='') @@ -51,6 +60,7 @@ def newword(name=None, imm=False): if imm: count |= 0x80 alias = aliases.get(name, name) + knownwords.add(alias) out(f"defword '{name}', {count}, word_{alias}, word_{prevword}\n") prevword = alias @@ -92,7 +102,13 @@ def exitwr(): out('ret\n') def strwr(): - out('TODO\n') + s = '' + c = fp.read(1) + while c and c != '"': + s += c + c = fp.read(1) + out(f"db '{s}'\n") + return s def slitwr(): out('TODO\n') @@ -148,7 +164,10 @@ special = { 'pspushop': _pspushop_, 'exitop': _exitop_, } +out("""; This file is autogenerated +EXTERN cellword +""") t = nextt() while t: if t in special: @@ -157,8 +176,13 @@ while t: n = litparse(t) if n is None: name = aliases.get(t, t) - out(f'EXTERN word_{name}\n') - out(f'call word_{name}\n') + if name in nasmmacros: + out(f'{name}\n') + else: + if name not in knownwords: + out(f'EXTERN word_{name}\n') + knownwords.add(name) + out(f'call word_{name}\n') else: out(f'pspush {n}\n') t = nextt() diff --git a/word_macros.asm b/word_macros.asm @@ -24,3 +24,13 @@ _word %1,%2,%3,0 EXTERN %4 _word %1,%2,%3,%4 %endmacro + +%macro ps2rs 0 +push dword [ebp] +add ebp,4 +%endmacro + +%macro rs2ps 0 +sub ebp,4 +pop dword [ebp] +%endmacro diff --git a/words/acfetch.asm b/words/acfetch.asm @@ -0,0 +1,6 @@ +defword 'Ac@', 3, word_acfetch, word_rot +EXTERN areg + mov eax, [areg] + mov eax, [eax] + pspush eax + ret diff --git a/words/acstore.asm b/words/acstore.asm @@ -0,0 +1,6 @@ +defword 'Ac!', 3, word_acstore, word_acfetch +EXTERN areg + pspop eax + mov eax, [areg] + mov [eax], eax + ret diff --git a/words/adec.asm b/words/adec.asm @@ -0,0 +1,6 @@ +defword 'A-', 2, word_adec, word_ainc +GLOBAL word_asmlast +word_asmlast: +EXTERN areg + dec dword [areg] + ret diff --git a/words/aget.asm b/words/aget.asm @@ -0,0 +1,6 @@ +defword 'A>', 2, word_aget, word_rot +EXTERN areg + mov eax, [areg] + pspush eax + ret + diff --git a/words/ainc.asm b/words/ainc.asm @@ -0,0 +1,5 @@ +defword 'A+', 2, word_ainc, word_acstore +EXTERN areg + inc dword [areg] + ret + diff --git a/words/aset.asm b/words/aset.asm @@ -0,0 +1,7 @@ +defword '>A', 2, word_aset, word_aget +EXTERN areg + pspop eax + mov [areg], eax + ret + + diff --git a/words/rot.asm b/words/rot.asm @@ -1,6 +1,4 @@ defword 'rot', 3, word_rot, word_over -GLOBAL word_asmlast -word_asmlast: mov eax, [ebp] mov ebx, [ebp+4] mov ecx, [ebp+8] diff --git a/xcomp2.txt b/xcomp2.txt @@ -3,4 +3,8 @@ : nip swap drop ; : tuck swap over ; : rot> rot rot ; -: boot 'f' 'o' dup rot emit emit emit ; +: leave r> r~ 1 >r >r ; +: Ac@+ Ac@ A+ ; +: Ac!+ Ac! A+ ; +create _ ," foo" +: boot _ >A Ac@+ emit Ac@+ emit Ac@+ emit bye ;