breakwater_parser/
assembler.rs1use std::{arch::asm, sync::Arc};
2
3use crate::{FrameBuffer, Parser};
4
5const PARSER_LOOKAHEAD: usize = "PX 1234 1234 rrggbbaa\n".len(); pub 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 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}