use std::ops::{Add, Sub}; pub trait Ram { fn as_ram_ptr<'a>(&'a self) -> RamPtr<'a>; } impl Ram for [u8; 65536] { fn as_ram_ptr<'a>(&'a self) -> RamPtr<'a> { RamPtr { ram: self, ptr: 0 } } } pub struct RamPtr<'a> { ram: &'a [u8; 65536], ptr: u16, } impl Add for RamPtr<'_> { type Output = Self; fn add(mut self, rhs: usize) -> Self::Output { self.ptr = self.ptr.wrapping_add(rhs as u16); self } } impl Sub for RamPtr<'_> { type Output = Self; fn sub(mut self, rhs: usize) -> Self::Output { self.ptr = self.ptr.wrapping_sub(rhs as u16); self } }