aboutsummaryrefslogtreecommitdiff
path: root/interpreter/ElymasAsm.pm
diff options
context:
space:
mode:
Diffstat (limited to 'interpreter/ElymasAsm.pm')
-rw-r--r--interpreter/ElymasAsm.pm41
1 files changed, 28 insertions, 13 deletions
diff --git a/interpreter/ElymasAsm.pm b/interpreter/ElymasAsm.pm
index 63b7803..2bf2295 100644
--- a/interpreter/ElymasAsm.pm
+++ b/interpreter/ElymasAsm.pm
@@ -6,25 +6,40 @@ use warnings;
use Elymas;
use ACME::Bare::Metal;
+sub constructBlock {
+ my ($block, $size) = @_;
+
+ my $scope; $scope = \{
+ 'base' => [$block, 'int', 'passive'],
+ 'size' => [$size, 'int', 'passive'],
+ 'free' => [sub {
+ my ($data) = @_;
+
+ ACME::Bare::Metal::deallocate($$scope->{'base'}->[0], $$scope->{'size'}->[0]);
+ }, ['func', 'sys .asm .free'], 'active'],
+ };
+
+ return $$scope;
+}
+
our $asm = {
'alloc' => [sub {
- my ($data) = @_;
+ my ($data) = @_;
- my $size = popInt($data);
- my $block = ACME::Bare::Metal::allocate($size);
+ my $size = popInt($data);
+ my $block = ACME::Bare::Metal::allocate($size);
- my $scope; $scope = \{
- 'base' => [$block, 'int', 'passive'],
- 'size' => [$size, 'int', 'passive'],
- 'free' => [sub {
- my ($data) = @_;
+ push @$data, [enstruct(constructBlock($block, $size))];
+ }, ['func', 'sys .asm .alloc'], 'active'],
+ 'allocAt' => [sub {
+ my ($data) = @_;
- ACME::Bare::Metal::deallocate($$scope->{'base'}->[0], $$scope->{'size'}->[0]);
- }, ['func', 'sys .asm .free'], 'active'],
- };
+ my $addr = popInt($data);
+ my $size = popInt($data);
+ my $block = ACME::Bare::Metal::allocateAt($size, $addr);
- push @$data, [enstruct($$scope)];
- }, ['func', 'sys .asm .alloc'], 'active'],
+ push @$data, [enstruct(constructBlock($block, $size))];
+ }, ['func', 'sys .asm .alloc'], 'active'],
'poke' => [sub {
my ($data, $scope) = @_;