module Nes.CPU.Instructions.Noop (noop, kil) where

import Control.Monad
import Nes.CPU.Instructions.Addressing (AddressingMode (..), getOperandAddr)
import Nes.CPU.Monad
import Nes.Memory (MemoryInterface (readByte))

-- | No-op
--
-- https://www.nesdev.org/obelisk-6502-guide/reference.html#NOP
noop :: AddressingMode -> CPU r ()
noop :: forall r. AddressingMode -> CPU r ()
noop = \case
    AddressingMode
None -> () -> CPU r ()
forall a. a -> CPU r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    AddressingMode
Accumulator -> () -> CPU r ()
forall a. a -> CPU r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    AddressingMode
mode -> do
        Addr
addr <- AddressingMode -> CPU r Addr
forall r. AddressingMode -> CPU r Addr
getOperandAddr AddressingMode
mode
        CPU r Byte -> CPU r ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (CPU r Byte -> CPU r ()) -> CPU r Byte -> CPU r ()
forall a b. (a -> b) -> a -> b
$ Addr -> () -> CPU r Byte
forall a (m :: * -> *). MemoryInterface a m => Addr -> a -> m Byte
readByte Addr
addr ()

-- | AKA Jam
kil :: CPU r ()
kil :: forall r. CPU r ()
kil = () -> CPU r ()
forall a. a -> CPU r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()