aboutsummaryrefslogtreecommitdiff
path: root/src/Instructions.hs
diff options
context:
space:
mode:
authorNikita Orlov <nikitf-97@mail.ru>2021-04-03 01:06:22 +0300
committerNikita Orlov <nikitf-97@mail.ru>2021-04-03 01:06:22 +0300
commit7955eabdbea706519f000a85531c152fa07e6700 (patch)
tree90809b0e1d35fe2f5145cac127f503776a8ee9f0 /src/Instructions.hs
parent1ab01adc8644f572d584332c07b2ce75f9aac657 (diff)
downloadsuem-7955eabdbea706519f000a85531c152fa07e6700.tar
suem-7955eabdbea706519f000a85531c152fa07e6700.tar.xz
suem-7955eabdbea706519f000a85531c152fa07e6700.zip
MOVE and BRA added
Diffstat (limited to 'src/Instructions.hs')
-rw-r--r--src/Instructions.hs20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/Instructions.hs b/src/Instructions.hs
index cff8d9b..fb9695b 100644
--- a/src/Instructions.hs
+++ b/src/Instructions.hs
@@ -62,10 +62,10 @@ doMOVEA :: Int -> Int -> Int -> Int -> Emulator ()
doMOVEA _ _ _ _ = error "MOVEA"
doMOVE :: Int -> Int -> Int -> Int -> Int -> Emulator ()
-doMOVE 1 dst_reg dst_mode src_mode src_reg = do
+doMOVE size dst_reg dst_mode src_mode src_reg = do
incPC
- (src_get, src_set) <- getOp src_mode src_reg 1
- (dst_get, dst_set) <- getOp dst_mode dst_reg 1
+ (src_get, src_set) <- getOp src_mode src_reg (getMoveSize size)
+ (dst_get, dst_set) <- getOp dst_mode dst_reg (getMoveSize size)
src_val <- src_get
dst_set src_val
@@ -120,13 +120,13 @@ doLINK a = do
addr <- readA a 4
sp <- readA 7 4
writeA 7 4 (sp - 4)
- setLong (sp - 4) addr
+ setMemory (sp - 4) 4 addr
doUNLK :: Int -> Emulator ()
doUNLK a = do
incPC
addr <- readA a 4
- val <- getLong addr
+ val <- getMemory addr 4
writeA a 4 val
writeA 7 4 (addr + 4)
@@ -183,7 +183,15 @@ doSUBQ :: Int -> Int -> Int -> Int -> Emulator ()
doSUBQ _ _ _ _ = error "SUBQ"
doBRA :: Int -> Emulator ()
-doBRA _ = error "BRA"
+doBRA 0 = do
+ incPC
+ pc <- readPC
+ disp <- getMemory pc 2
+ writePC (pc + disp)
+doBRA disp = do
+ incPC
+ pc <- readPC
+ writePC (pc + (fromIntegral disp))
doBSR :: Int -> Emulator ()
doBSR _ = error "BSR"