From 958fe091c9969f61836a4f8011de614507c7743b Mon Sep 17 00:00:00 2001 From: Aleksey Veresov Date: Fri, 2 Apr 2021 16:20:22 +0300 Subject: SP size correct processing is added. --- src/Machine.hs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/Machine.hs b/src/Machine.hs index 5962469..e17f468 100644 --- a/src/Machine.hs +++ b/src/Machine.hs @@ -105,8 +105,12 @@ readA 6 s = with ars $ \rs -> do (_,_,_,_,_,_,r) <- readIORef rs return $ convertLong r s readA 7 s = isSupervisor >>= \sup -> if sup - then with ssp $ \sp -> readIORef sp - else with usp $ \sp -> readIORef sp + then with ssp $ \sp -> do + v <- readIORef sp + return $ convertLong v s + else with usp $ \sp -> do + v <- readIORef sp + return $ convertLong v s readA _ _ = return $ error "Incorrect Address register read" @@ -160,8 +164,12 @@ writeA 6 s r = with ars $ \rs -> do (r0,r1,r2,r3,r4,r5,r6) <- readIORef rs writeIORef rs (r0,r1,r2,r3,r4,r5,combineLong r r6 s) writeA 7 s r = isSupervisor >>= \sup -> if sup - then with ssp $ \sp -> writeIORef sp r - else with usp $ \sp -> writeIORef sp r + then with ssp $ \sp -> do + v <- readIORef sp + writeIORef sp $ combineLong r v s + else with usp $ \sp -> do + v <- readIORef sp + writeIORef sp $ combineLong r v s writeA _ _ _ = return $ error "Incorrect Address register write" -- cgit v1.2.3