max7456/
character_memory.rs1use super::registers::{CharacterMemoryMode, Registers};
2
3pub const CHAR_DATA_SIZE: usize = 64;
4pub const STORE_CHAR_BUFFER_SIZE: usize = 2 + CHAR_DATA_SIZE * 4 + 2;
5
6pub type CharData = [u8; CHAR_DATA_SIZE];
7
8pub fn build_store_char_operation(data: &CharData, index: u8, output: &mut [u8]) -> bool {
9 if output.len() < STORE_CHAR_BUFFER_SIZE {
10 return false;
11 }
12 output[0] = Registers::CharacterMemoryAddressHigh as u8;
13 output[1] = index;
14 let mut chunks = output[2..].chunks_mut(4);
15 for (i, &ch) in data.iter().enumerate() {
16 let chunk = chunks.next().unwrap();
17 chunk[0] = Registers::CharacterMemoryAddressLow as u8;
18 chunk[1] = i as u8;
19 chunk[2] = Registers::CharacterMemoryDataIn as u8;
20 chunk[3] = ch;
21 }
22 output[2 + CHAR_DATA_SIZE * 4] = Registers::CharacterMemoryMode as u8;
23 output[2 + CHAR_DATA_SIZE * 4 + 1] = CharacterMemoryMode::WriteToNVM as u8;
24 return true;
25}
26
27mod test {
28 #[test]
29 fn test_write_store_char_operation() {
30 use super::{CharData, CHAR_DATA_SIZE, STORE_CHAR_BUFFER_SIZE};
31 use crate::registers::{CharacterMemoryMode, Registers};
32
33 let data: CharData = [0x55u8; CHAR_DATA_SIZE];
34 let mut output = [0u8; STORE_CHAR_BUFFER_SIZE];
35 assert_eq!(super::build_store_char_operation(&data, 10, &mut output), true);
36 assert_eq!(output[0], Registers::CharacterMemoryAddressHigh as u8);
37 assert_eq!(output[2], Registers::CharacterMemoryAddressLow as u8);
38 assert_eq!(output[2 + CHAR_DATA_SIZE * 4 - 4], Registers::CharacterMemoryAddressLow as u8);
39 assert_eq!(output[2 + CHAR_DATA_SIZE * 4], Registers::CharacterMemoryMode as u8);
40 assert_eq!(output[2 + CHAR_DATA_SIZE * 4 + 1], CharacterMemoryMode::WriteToNVM as u8);
41 }
42}