Fix address assignment in subphase2
This commit is contained in:
parent
7f6e987c33
commit
d35de03936
1 changed files with 20 additions and 8 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue