From d35de039366bd7fe8ca2bc9d5f98c0966282174e Mon Sep 17 00:00:00 2001 From: I-Al-Istannen Date: Wed, 8 Apr 2020 16:49:06 +0200 Subject: [PATCH] Fix address assignment in subphase2 --- src/Mima/Asm/Phase2/Subphase2.hs | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/Mima/Asm/Phase2/Subphase2.hs b/src/Mima/Asm/Phase2/Subphase2.hs index 0d399ca..2b24974 100644 --- a/src/Mima/Asm/Phase2/Subphase2.hs +++ b/src/Mima/Asm/Phase2/Subphase2.hs @@ -36,11 +36,20 @@ setAddress s newAddress = do when (newAddress /= oldAddress) $ modify $ \s2' -> s2'{s2AddressFilled = False} -nextAddress :: s -> WeedS2 s Vm.MimaAddress -nextAddress s = do +unfilledAddress :: s -> WeedS2 s Vm.MimaAddress +unfilledAddress s = do s2 <- get when (s2AddressFilled s2) $ addAddress s 1 - pure $ s2CurrentAddress s2 + s2CurrentAddress <$> get + +filledAddress :: s -> WeedS2 s Vm.MimaAddress +filledAddress s = do + addr <- unfilledAddress s + modify $ \s2' -> s2'{s2AddressFilled = True} + pure addr + +currentAddress :: WeedS2 s Vm.MimaAddress +currentAddress = s2CurrentAddress <$> get convertP2Token :: AsmToken 'S1 s -> WeedS2 s (Maybe (AsmToken 'S2 s)) convertP2Token (TokenOrg _ (OrgAddrAbsolute s address)) @@ -49,19 +58,22 @@ convertP2Token (TokenOrg _ (OrgAddrRelative s address)) | address < 0 = Nothing <$ setAddress s (maxBound + fromIntegral address) | otherwise = Nothing <$ addAddress s (fromIntegral address) convertP2Token (TokenLabel s _ name) = do - address <- s2CurrentAddress <$> get + address <- unfilledAddress s pure $ Just $ TokenLabel s address name +convertP2Token (TokenMeta s _ meta@(MetaStop _ _)) = do + address <- currentAddress + pure $ Just $ TokenMeta s address meta convertP2Token (TokenMeta s _ meta) = do - address <- s2CurrentAddress <$> get + address <- unfilledAddress s pure $ Just $ TokenMeta s address meta convertP2Token (TokenLit s _ word) = do - address <- nextAddress s + address <- filledAddress s pure $ Just $ TokenLit s address $ idWord word convertP2Token (TokenInstr s _ instr) = do - address <- nextAddress s + address <- filledAddress s pure $ Just $ TokenInstr s address $ idInstruction instr convertP2Token (TokenReg s _ reg) = do - address <- s2CurrentAddress <$> get + address <- currentAddress pure $ Just $ TokenReg s address $ idRegDir reg subphase2 :: Phase2 'S1 s -> Weed (WeedError s) (Phase2 'S2 s)