Add support for Nix Flake
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -29,3 +29,5 @@ cabal.project.local~
|
|||||||
|
|
||||||
# End of https://www.toptal.com/developers/gitignore/api/haskell
|
# End of https://www.toptal.com/developers/gitignore/api/haskell
|
||||||
|
|
||||||
|
result
|
||||||
|
.direnv
|
||||||
|
|||||||
20
MVM.cabal
20
MVM.cabal
@@ -40,11 +40,11 @@ executable MVM
|
|||||||
-- LANGUAGE extensions used by modules in this package.
|
-- LANGUAGE extensions used by modules in this package.
|
||||||
-- other-extensions:
|
-- other-extensions:
|
||||||
build-depends:
|
build-depends:
|
||||||
base ^>=4.15.0.0,
|
base >=4.15.0.0,
|
||||||
bytestring ^>=0.11.0.0,
|
bytestring >=0.11.0.0,
|
||||||
containers ^>=0.6.4.1,
|
containers >=0.6.4.1,
|
||||||
mtl ^>=2.2.2,
|
mtl >=2.2.2,
|
||||||
transformers ^>=0.5.6.2
|
transformers >=0.5.6.2
|
||||||
|
|
||||||
hs-source-dirs: app
|
hs-source-dirs: app
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
@@ -57,11 +57,11 @@ test-suite spec
|
|||||||
test
|
test
|
||||||
ghc-options: -Wall
|
ghc-options: -Wall
|
||||||
build-depends:
|
build-depends:
|
||||||
base ^>=4.15.0.0,
|
base >=4.15.0.0,
|
||||||
bytestring ^>=0.11.0.0,
|
bytestring >=0.11.0.0,
|
||||||
containers ^>=0.6.4.1,
|
containers >=0.6.4.1,
|
||||||
mtl ^>=2.2.2,
|
mtl >=2.2.2,
|
||||||
transformers ^>=0.5.6.2,
|
transformers >=0.5.6.2,
|
||||||
hspec ==2.*
|
hspec ==2.*
|
||||||
other-modules:
|
other-modules:
|
||||||
VirtualMachineSpec
|
VirtualMachineSpec
|
||||||
|
|||||||
20
examples/example1.S
Normal file
20
examples/example1.S
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
; Evaluate 2*3+5
|
||||||
|
|
||||||
|
main: push 2
|
||||||
|
push 3
|
||||||
|
call &prd
|
||||||
|
clr 2
|
||||||
|
push 5
|
||||||
|
call &sum
|
||||||
|
clr 2
|
||||||
|
halt
|
||||||
|
|
||||||
|
sum: lda 0
|
||||||
|
lda 1
|
||||||
|
add
|
||||||
|
ret
|
||||||
|
|
||||||
|
prd: lda 0
|
||||||
|
lda 1
|
||||||
|
mul
|
||||||
|
ret
|
||||||
9
examples/example2.S
Normal file
9
examples/example2.S
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
; I/O example - simple echo
|
||||||
|
|
||||||
|
read: in
|
||||||
|
dup
|
||||||
|
out
|
||||||
|
push 0x0A
|
||||||
|
sub
|
||||||
|
jne &read ; loop until the input != new line (0x0A)
|
||||||
|
halt
|
||||||
30
examples/example3.S
Normal file
30
examples/example3.S
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
; Evaluate 2^10 - loop variant
|
||||||
|
|
||||||
|
push 2
|
||||||
|
push 10
|
||||||
|
call &pow
|
||||||
|
clr 2
|
||||||
|
halt
|
||||||
|
|
||||||
|
pow: lda 1 ; base
|
||||||
|
lda 0 ; exp
|
||||||
|
push 1 ; acc
|
||||||
|
|
||||||
|
; | Stack:
|
||||||
|
.loop: ldl 1 ; if exp == 0 | exp
|
||||||
|
je &.done ; then return | exp
|
||||||
|
pop ; |
|
||||||
|
; |
|
||||||
|
ldl 2 ; Evaluate | acc
|
||||||
|
ldl 0 ; next power | acc base
|
||||||
|
mul ; | acc*base
|
||||||
|
stl 2 ; |
|
||||||
|
; |
|
||||||
|
ldl 1 ; Decrement exp | exp
|
||||||
|
push 1 ; | exp 1
|
||||||
|
sub ; | exp-1
|
||||||
|
stl 1 ; |
|
||||||
|
jmp &.loop ; |
|
||||||
|
|
||||||
|
.done: ldl 2 ; | ... acc
|
||||||
|
ret ; | acc
|
||||||
28
examples/example4.S
Normal file
28
examples/example4.S
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
; Evaluate 2^10 - recursive variant
|
||||||
|
|
||||||
|
push 2 ; base
|
||||||
|
push 10 ; exp
|
||||||
|
call &pow
|
||||||
|
clr 2
|
||||||
|
halt
|
||||||
|
|
||||||
|
pow: lda 1 ; base
|
||||||
|
lda 0 ; exp
|
||||||
|
|
||||||
|
ldl 1 ; push exp to top
|
||||||
|
je &.edge ; the edge case: if exp == 0 then return 1
|
||||||
|
pop ; pop exp
|
||||||
|
|
||||||
|
; | Stack:
|
||||||
|
ldl 0 ; | base
|
||||||
|
ldl 1 ; | base exp
|
||||||
|
push 1 ; | base exp 1
|
||||||
|
sub ; | base exp-1
|
||||||
|
call &pow ; | base exp-1 base^(exp-1)]
|
||||||
|
clr 1 ; | base base^(exp-1)
|
||||||
|
mul ; | base*base^(exp-1)
|
||||||
|
ret ; | base*base^(exp-1)
|
||||||
|
|
||||||
|
.edge: pop
|
||||||
|
push 1 ; return 1
|
||||||
|
ret
|
||||||
33
examples/example5.S
Normal file
33
examples/example5.S
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
; The N-th element of Fibbonaci sequence - recursive variant
|
||||||
|
|
||||||
|
push 6
|
||||||
|
call &fibb
|
||||||
|
clr 1
|
||||||
|
halt
|
||||||
|
|
||||||
|
fibb: lda 0 ; n | Stack:
|
||||||
|
ldl 0 ; n == 0 -> return 1 | n
|
||||||
|
je &.done0 ; | n
|
||||||
|
pop ; |
|
||||||
|
ldl 0 ; n == 1 -> return 1 | n
|
||||||
|
push 1 ; | n 1
|
||||||
|
sub ; | n-1
|
||||||
|
je &.done1 ; | n-1
|
||||||
|
dup ; Evaluate fibb | n-1 n-1
|
||||||
|
push 1 ; | n-1 n-1 1
|
||||||
|
sub ; | n-1 n-2
|
||||||
|
call &fibb ; | n-1 n-2 f(n-2)
|
||||||
|
clr 1 ; | n-1 f(n-2)
|
||||||
|
over ; | n-1 f(n-2) n-1
|
||||||
|
call &fibb ; | n-1 f(n-2) n-1 f(n-1)
|
||||||
|
clr 1 ; | n-1 f(n-2) f(n-1)
|
||||||
|
add ; | n-1 f(n-2)+f(n-1)
|
||||||
|
ret
|
||||||
|
|
||||||
|
.done1: pop
|
||||||
|
push 1
|
||||||
|
ret
|
||||||
|
|
||||||
|
.done0: pop
|
||||||
|
push 1
|
||||||
|
ret
|
||||||
27
flake.lock
generated
Normal file
27
flake.lock
generated
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1702346276,
|
||||||
|
"narHash": "sha256-eAQgwIWApFQ40ipeOjVSoK4TEHVd6nbSd9fApiHIw5A=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "cf28ee258fd5f9a52de6b9865cdb93a1f96d09b7",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-23.11",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
18
flake.nix
Normal file
18
flake.nix
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
description = "MVM development";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = github:NixOS/nixpkgs/nixos-23.11;
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs }:
|
||||||
|
let
|
||||||
|
pkgs = import nixpkgs { inherit system; };
|
||||||
|
haskellPkgs = pkgs.haskellPackages;
|
||||||
|
system = "x86_64-linux";
|
||||||
|
in {
|
||||||
|
packages.${system}.default = pkgs.haskellPackages.developPackage {
|
||||||
|
root = ./.;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user