--- /dev/null
+;
+; 2013-12-24, Greg King
+;
+; int read (int fd, void* buf, unsigned count);
+;
+; This function is a hack!  It lets us get text from the stdin console.
+;
+
+        .export         _read
+
+        .import         popax
+        .importzp       ptr1, ptr2, ptr3
+
+        .macpack        generic
+        .include        "atmos.inc"
+
+.proc   _read
+
+        sta     ptr3
+        stx     ptr3+1          ; save count as result
+        eor     #$FF
+        sta     ptr2
+        txa
+        eor     #$FF
+        sta     ptr2+1          ; Remember -count-1
+
+        jsr     popax           ; get buf
+        sta     ptr1
+        stx     ptr1+1
+        jsr     popax           ; get fd and discard
+
+L1:     inc     ptr2
+        bnz     L2
+        inc     ptr2+1
+        bze     L9              ; no more room in buf
+
+; If there are no more characters in BASIC's input buffer, then get a line from
+; the console into that buffer.
+
+L2:     ldx     text_count
+        bpl     L3
+        jsr     GETLINE
+        ldx     #<(0 - 1)
+
+L3:     inx
+        lda     BASIC_BUF,x
+        bnz     L4              ; (zero-terminated buffer)
+        ldx     #<-1
+        lda     #$0A            ; return newline char. at end of line
+L4:     stx     text_count
+        ldy     #0
+        sta     (ptr1),y
+        inc     ptr1
+        bnz     L1
+        inc     ptr1+1
+        bnz     L1              ; branch always
+
+; No error, return count.
+
+L9:     lda     ptr3
+        ldx     ptr3+1
+        rts
+
+.endproc
+
+.data
+
+text_count:
+        .byte   <-1
+