collapseos/recipes/trs80/recv.asm

46 lines
930 B
NASM

.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