Fix address assignment in subphase2

This commit is contained in:
I-Al-Istannen 2020-04-08 16:49:06 +02:00
parent 7f6e987c33
commit d35de03936

View file

@ -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)