diff --git a/crates/common/src/data.rs b/crates/common/src/data.rs
index d9af7690e1fd76874e0372dc25e11306a5e61aff..bfbca4bc0daa427cc585b8b9b75dcb7a0fc52b02 100644
--- a/crates/common/src/data.rs
+++ b/crates/common/src/data.rs
@@ -1,10 +1,28 @@
 use std::{
-    io::{Cursor, Read},
+    io::{Cursor, Read, Write},
     mem::size_of,
 };
 
 use crate::error::Error;
 
+#[inline(always)]
+pub fn write_u8(data: &mut Cursor<Vec<u8>>, value: u8) -> Result<(), Error> {
+    data.write_all(&value.to_le_bytes())?;
+    Ok(())
+}
+
+#[inline(always)]
+pub fn write_u16(data: &mut Cursor<Vec<u8>>, value: u16) -> Result<(), Error> {
+    data.write_all(&value.to_le_bytes())?;
+    Ok(())
+}
+
+#[inline(always)]
+pub fn write_u32(data: &mut Cursor<Vec<u8>>, value: u32) -> Result<(), Error> {
+    data.write_all(&value.to_le_bytes())?;
+    Ok(())
+}
+
 #[inline(always)]
 pub fn read_u8(data: &mut Cursor<&[u8]>) -> Result<u8, Error> {
     let mut buffer = [0x00; size_of::<u8>()];
diff --git a/src/timer.rs b/src/timer.rs
index e902ea850b618d346b1fca35f259ca015c038604..be393cd6045436f7955c5ef016a856ff4e720b8a 100644
--- a/src/timer.rs
+++ b/src/timer.rs
@@ -1,9 +1,9 @@
 //! Timer functions and structures.
 
-use std::io::{Cursor, Write};
+use std::io::Cursor;
 
 use boytacean_common::{
-    data::{read_u16, read_u8},
+    data::{read_u16, read_u8, write_u16, write_u8},
     error::Error,
 };
 
@@ -173,15 +173,15 @@ impl BusComponent for Timer {
 impl StateComponent for Timer {
     fn state(&self) -> Result<Vec<u8>, Error> {
         let mut cursor = Cursor::new(vec![]);
-        cursor.write(&self.div.to_le_bytes())?;
-        cursor.write(&self.tima.to_le_bytes())?;
-        cursor.write(&self.tma.to_le_bytes())?;
-        cursor.write(&self.tac.to_le_bytes())?;
-        cursor.write(&self.div_clock.to_le_bytes())?;
-        cursor.write(&self.tima_clock.to_le_bytes())?;
-        cursor.write(&(self.tima_enabled as u8).to_le_bytes())?;
-        cursor.write(&self.tima_ratio.to_le_bytes())?;
-        cursor.write(&(self.int_tima as u8).to_le_bytes())?;
+        write_u8(&mut cursor, self.div)?;
+        write_u8(&mut cursor, self.tima)?;
+        write_u8(&mut cursor, self.tma)?;
+        write_u8(&mut cursor, self.tac)?;
+        write_u16(&mut cursor, self.div_clock)?;
+        write_u16(&mut cursor, self.tima_clock)?;
+        write_u8(&mut cursor, self.tima_enabled as u8)?;
+        write_u16(&mut cursor, self.tima_ratio)?;
+        write_u8(&mut cursor, self.int_tima as u8)?;
         Ok(cursor.into_inner())
     }