breakwater_parser/
assembler.rs

1use std::{arch::asm, sync::Arc};
2
3use crate::{FrameBuffer, Parser};
4
5const PARSER_LOOKAHEAD: usize = "PX 1234 1234 rrggbbaa\n".len(); // Longest possible command
6
7pub struct AssemblerParser<FB: FrameBuffer> {
8    _fb: Arc<FB>,
9}
10
11impl<FB: FrameBuffer> AssemblerParser<FB> {
12    pub fn new(_fb: Arc<FB>) -> Self {
13        Self { _fb }
14    }
15}
16
17impl<FB: FrameBuffer> Parser for AssemblerParser<FB> {
18    fn parse(&mut self, buffer: &[u8], _response: &mut Vec<u8>) -> usize {
19        let mut last_byte_parsed = 0;
20
21        // This loop does nothing and should be seen as a placeholder
22        unsafe {
23            asm!(
24                "mov {i}, {buffer_start}",
25                "2:",
26                "inc {last_byte_parsed}",
27                "inc {i}",
28                "cmp {i}, {buffer_end}",
29                "jl 2b",
30                buffer_start = in(reg) buffer.as_ptr(),
31                buffer_end = in(reg) buffer.as_ptr().add(buffer.len()),
32                last_byte_parsed = inout(reg) last_byte_parsed,
33                i = out(reg) _,
34            )
35        }
36
37        last_byte_parsed
38    }
39
40    fn parser_lookahead(&self) -> usize {
41        PARSER_LOOKAHEAD
42    }
43}