From 049f2cf222b7240a6fd8096278c2cd603737f5cd Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sat, 22 Feb 2020 14:11:43 -0500 Subject: [PATCH] Reverse ttysafe escaping order Sending the escape after its target made things complicated for upcoming stuff I want to add. Although it makes `recv.asm` slightly larger, it's really worth it. --- recipes/trs80/recv.asm | 31 ++++++++++++++++++++----------- tools/ttysafe.c | 6 +++--- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/recipes/trs80/recv.asm b/recipes/trs80/recv.asm index 9711538..d9dbdea 100644 --- a/recipes/trs80/recv.asm +++ b/recipes/trs80/recv.asm @@ -1,7 +1,17 @@ - ld hl, 0x3000 ; memory address where to put contents. +.equ COM_DRV_ADDR 0x0238 ; replace with *CL's DCB addr +.equ DEST_ADDR 0x3000 ; memory address where to put contents. + +; We process the 0x20 exception by pre-putting a mask in the (HL) we're going +; to write to. If it wasn't a 0x20, we put a 0xff mask. If it was a 0x20, we +; put a 0x7f mask. + + ld hl, DEST_ADDR loop: + ld a, 0xff + ld (hl), a ; default mask +loop2: ld a, 0x03 ; @GET - ld de, 0xffff ; replace with *CL's DCB addr + ld de, COM_DRV_ADDR rst 0x28 jr nz, maybeerror or a @@ -9,25 +19,24 @@ loop: ; @PUT that char back ld c, a ld a, 0x04 ; @PUT - ld de, 0xffff ; replace with *CL's DCB addr rst 0x28 jr nz, error ld a, c cp 0x20 - jr z, adjust -write: + jr z, escapechar + ; not an escape char, just apply the mask and write + and (hl) ld (hl), a inc hl jr loop -adjust: - dec hl - ld a, (hl) - and 0x7f - jr write +escapechar: + ; adjust by setting (hl) to 0x7f + res 7, (hl) + jr loop2 maybeerror: ; was it an error? or a - jr z, loop ; not an error, just loop + jr z, loop2 ; not an error, just loop ; error error: ld c, a ; Error code from @GET/@PUT diff --git a/tools/ttysafe.c b/tools/ttysafe.c index e6ba4a0..2c9484f 100644 --- a/tools/ttysafe.c +++ b/tools/ttysafe.c @@ -4,8 +4,8 @@ /* Converts stdin to a content that is "tty safe", that is, that it doesn't * contain ASCII control characters that can mess up serial communication. * How it works is that it leaves any char > 0x20 intact, but any char <= 0x20 - * is replaced by two chars: char|0x80, 0x20. A 0x20 char always indicate "take - * the char you've just received and unset the 7th bit from it". + * is replaced by two chars: 0x20, then char|0x80. A 0x20 char always indicate + * "take the next char you'll receive and unset the 7th bit from it". */ int main(void) @@ -13,8 +13,8 @@ int main(void) int c = getchar(); while (c != EOF) { if (c <= 0x20) { - putchar(c|0x80); putchar(0x20); + putchar(c|0x80); } else { putchar(c&0xff); }