aboutsummaryrefslogtreecommitdiff
path: root/src/Instructions.hs
diff options
context:
space:
mode:
authorNikita Orlov <nikitf-97@mail.ru>2021-04-03 15:53:49 +0300
committerNikita Orlov <nikitf-97@mail.ru>2021-04-03 15:53:49 +0300
commit50570477dc1cffecc597dda663ab4738fe2660e9 (patch)
tree61775011d259e407f0987984666ed1e7da5c6a03 /src/Instructions.hs
parent7955eabdbea706519f000a85531c152fa07e6700 (diff)
downloadsuem-50570477dc1cffecc597dda663ab4738fe2660e9.tar
suem-50570477dc1cffecc597dda663ab4738fe2660e9.tar.xz
suem-50570477dc1cffecc597dda663ab4738fe2660e9.zip
Flags, Bcc added
Diffstat (limited to 'src/Instructions.hs')
-rw-r--r--src/Instructions.hs34
1 files changed, 33 insertions, 1 deletions
diff --git a/src/Instructions.hs b/src/Instructions.hs
index fb9695b..ccd12f6 100644
--- a/src/Instructions.hs
+++ b/src/Instructions.hs
@@ -68,6 +68,11 @@ doMOVE size dst_reg dst_mode src_mode src_reg = do
(dst_get, dst_set) <- getOp dst_mode dst_reg (getMoveSize size)
src_val <- src_get
dst_set src_val
+ sv <- isSupervisor
+ setNegative (checkNegative src_val (getMoveSize size))
+ setZero (checkZero src_val)
+ setOverflow False
+ setCarry False
doSRMOVE :: Int -> Int -> Emulator ()
doSRMOVE _ _ = error "SRMOVE"
@@ -197,7 +202,34 @@ doBSR :: Int -> Emulator ()
doBSR _ = error "BSR"
doBcc :: Int -> Int -> Emulator ()
-doBcc _ _ = error "Bcc"
+-- NE
+doBcc 6 0 = do
+ incPC
+ pc <- readPC
+ zf <- isZero
+ disp <- getMemory pc 2
+ let real_disp = if not zf then disp else 2
+ writePC (pc + (fromIntegral real_disp))
+doBcc 6 disp = do
+ incPC
+ pc <- readPC
+ zf <- isZero
+ let real_disp = if not zf then disp else 0
+ writePC (pc + (fromIntegral real_disp))
+-- EQ
+doBcc 7 0 = do
+ incPC
+ pc <- readPC
+ zf <- isZero
+ disp <- getMemory pc 2
+ let real_disp = if zf then disp else 2
+ writePC (pc + (fromIntegral real_disp))
+doBcc 7 disp = do
+ incPC
+ pc <- readPC
+ zf <- isZero
+ let real_disp = if zf then disp else 0
+ writePC (pc + (fromIntegral real_disp))
doMOVEQ :: Int -> Int -> Emulator ()
doMOVEQ _ _ = error "MOVEQ"