ARCHM XCOMP Z80A
2 CONSTS $0238 COM_DRV_ADDR $3000 DEST_ADDR
0 VALUE L4
\ We process the $20 exception by pre-putting a mask in the
\ (HL) we're going to write to. If it wasn't a $20, we put a
\ $ff mask. If it was a $20, we put a $7f mask.
: @GET,
 A $03 LDri, ( @GET )
 DE COM_DRV_ADDR LDdi,
 $28 RST, FJR JRNZ, [TO] L2 ( maybeerror )
 A ORr,
 CZ RETc, ( Sending a straight NULL ends the comm. ) ;
: @PUT, ( @PUT that char back )
 C A LDrr,
 A $04 LDri, ( @PUT )
 $28 RST, FJR JRNZ, [TO] L3 ( error )
 A C LDrr, ;
0 XSTART
HL DEST_ADDR LDdi,
BEGIN,
 A $ff LDri, (HL) A LDrr, ( default mask )
 LSET L1 ( loop2 ) @GET, @PUT,
 $20 CPi, FJR JRZ, TO L4 ( escapechar )
 ( not an escape char, just apply the mask and write )
 (HL) ANDr, (HL) A LDrr,
 HL INCd,
BR JR,
L4 FMARK ( escapechar, adjust by setting (hl) to $7f )
7 (HL) RES, L1 BR JR, ( loop2 )
L2 FMARK ( maybeerror, was it an error? )
A ORr, L1 BR JRZ, ( loop2, not an error )
L3 FMARK ( error )
C A LDrr, ( error code from @GET/@PUT )
A $1a LDri, ( @ERROR ) $28 RST, RET,