commit cd7d534ad2ba92363e8b3d0806ea389404ea703b
parent 970fcf1ba6cca4ef3b8d42d574881c3954f63d39
Author: Virgil Dupras <hsoft@hardcoded.net>
Date: Wed, 1 Jun 2022 13:51:40 -0400
Add A register words
Diffstat:
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 ;