115 lines
2.4 KiB
ArmAsm
115 lines
2.4 KiB
ArmAsm
;
|
|
; Oliver Schmidt, 12.01.2005
|
|
; Robert Justice, 2026
|
|
;
|
|
; int __fastcall__ read (int fd, void* buf, unsigned count);
|
|
;
|
|
|
|
.export _read
|
|
.import rwprolog, rwcommon
|
|
.import getchar, putcdirect
|
|
.import setstdioscr, consscrflg
|
|
|
|
.include "zeropage.inc"
|
|
.include "errno.inc"
|
|
.include "fcntl.inc"
|
|
.include "sos.inc"
|
|
.include "filedes.inc"
|
|
.include "apple3.inc"
|
|
|
|
|
|
_read:
|
|
; Get parameters
|
|
jsr rwprolog
|
|
bcs errno
|
|
tax ; Save fd
|
|
|
|
; Check for read access
|
|
lda fdtab + FD::FLAGS,y
|
|
and #O_RDONLY
|
|
beq einval
|
|
|
|
; Check for device
|
|
txa ; Restore fd
|
|
cmp #$80
|
|
beq device
|
|
|
|
; Do read
|
|
ldy #READ_CALL
|
|
jmp rwcommon
|
|
|
|
; Device succeeds always
|
|
device: lda #$00
|
|
sta ___oserror
|
|
|
|
; Set counter to zero
|
|
sta ptr3
|
|
sta ptr3+1
|
|
|
|
; Check for zero count
|
|
lda ptr2
|
|
ora ptr2+1
|
|
beq check
|
|
|
|
; Turn cursor on
|
|
lda #CONSOLE_CURSOR_ON
|
|
jsr putcdirect
|
|
|
|
; Read from device
|
|
next: jsr getchar
|
|
|
|
; Check scroll mode
|
|
bit consscrflg ; check if scroll is on
|
|
bne :+
|
|
pha
|
|
jsr setstdioscr
|
|
pla
|
|
:
|
|
; We'll need Y=0 in both branches below
|
|
ldy #$00
|
|
|
|
; Check for '\r'
|
|
cmp #$0D
|
|
bne :+
|
|
jsr putcdirect ; echo \r
|
|
|
|
ldy #$00
|
|
; Replace with '\n' and set count to zero
|
|
lda #$0A
|
|
sty ptr2
|
|
sty ptr2+1
|
|
|
|
; Put char into buf
|
|
: sta (ptr1),y
|
|
|
|
pha ; echo here after cr->lf conversion
|
|
jsr putcdirect
|
|
pla
|
|
|
|
; Increment pointer
|
|
inc ptr1
|
|
bne :+
|
|
inc ptr1+1
|
|
|
|
; Increment counter
|
|
: inc ptr3
|
|
bne check
|
|
inc ptr3+1
|
|
|
|
; Check for counter less than count
|
|
check: lda ptr3
|
|
cmp ptr2
|
|
bcc next
|
|
ldx ptr3+1
|
|
cpx ptr2+1
|
|
bcc next
|
|
|
|
; Return success, AX already set
|
|
rts
|
|
|
|
; Load errno code
|
|
einval: lda #EINVAL
|
|
|
|
; Set __errno
|
|
errno: jmp ___directerrno
|