.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, COM_DRV_ADDR rst 0x28 jr nz, maybeerror or a ret z ; Sending a straight NULL ends the comm. ; @PUT that char back ld c, a ld a, 0x04 ; @PUT rst 0x28 jr nz, error ld a, c cp 0x20 jr z, escapechar ; not an escape char, just apply the mask and write and (hl) ld (hl), a inc hl jr loop escapechar: ; adjust by setting (hl) to 0x7f res 7, (hl) jr loop2 maybeerror: ; was it an error? or a jr z, loop2 ; not an error, just loop ; error error: ld c, a ; Error code from @GET/@PUT ld a, 0x1a ; @ERROR rst 0x28 ret