Skip to content

Commit 941e0df

Browse files
feat: Treat screencode bytes 0x5F and greater as literal bytes, and add a test to verify this behavior.
1 parent 20db7cb commit 941e0df

2 files changed

Lines changed: 37 additions & 0 deletions

File tree

src/disassembler.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,18 @@ impl Disassembler {
618618
}
619619

620620
let b = data[current_pc];
621+
622+
// User Request: bytes >= $5f should be treated as bytes. Not as screencodes.
623+
if b >= 0x5f {
624+
if !current_literal.is_empty() {
625+
fragments.push(TextFragment::Text(current_literal.clone()));
626+
current_literal.clear();
627+
}
628+
fragments.push(TextFragment::Byte(b));
629+
count += 1;
630+
continue;
631+
}
632+
621633
// Map Screen Code to ASCII
622634
// 0-31 (@..left arrow) -> 64..95
623635
// 32-63 (space..?) -> 32..63

src/disassembler/tests.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -775,4 +775,29 @@ mod tests {
775775
assert_eq!(lines_b[2].mnemonic, ".TEXT");
776776
assert_eq!(lines_b[2].operand, "\"0-9, hola como\"");
777777
}
778+
#[test]
779+
fn test_screencode_limit_0x5f() {
780+
let mut settings = DocumentSettings::default();
781+
settings.assembler = Assembler::Tass64;
782+
783+
let disassembler = Disassembler::new();
784+
let labels = HashMap::new();
785+
let origin = 0x1000;
786+
787+
// 0x5E (94) -> < 0x5f. Maps to '~' (126). Text.
788+
// 0x5F (95) -> >= 0x5f. Byte.
789+
// 0x60 (96) -> >= 0x5f. Byte.
790+
let code = vec![0x5E, 0x5F, 0x60];
791+
let block_types = vec![BlockType::Screencode; 3];
792+
793+
let lines = disassembler.disassemble(&code, &block_types, &labels, origin, &settings);
794+
795+
// Expected: .TEXT "~", $5F, $60
796+
// Tass wraps in .ENCODE ... .ENDENCODE
797+
let text_lines: Vec<&crate::disassembler::DisassemblyLine> =
798+
lines.iter().filter(|l| l.mnemonic == ".TEXT").collect();
799+
800+
assert_eq!(text_lines.len(), 1);
801+
assert_eq!(text_lines[0].operand, "\"~\", $5F, $60");
802+
}
778803
}

0 commit comments

Comments
 (0)