.define _read,_write,_ioctl,_getpid,_open,_close,_exit,_errno
.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text
_read:
	ld (savebc),bc
	push af
	pop bc
	ld (saveaf),bc	! save all registers in savereg
	ld (savede),de
	ld (savehl),hl
	ld (saveix),ix
	ex	(sp),hl	! return address in hl
	pop	bc	! skip return address
	pop	bc	! get fd
	ld	a,b	! check fd = 0
	or	c
	jr	nz,errrd
	pop	de	! get buffer
	pop	bc	! get count
	ld	ix,0	! reset counter
	push	bc
	push	de
	push	ix
	push	hl	! return address
	ex	de,hl	! buffer to hl
1:	ld	a,b
	or	c
	jr	z,done	! done if count = 0
	call	getchr
	ld	(hl),a
	inc	hl	! increment pointer
	inc	ix	! increment char counter
	dec	bc	! decrement count
	cp	0xA
	jr	nz,1b	! done if char = CR
done:
	ld bc,(saveaf)
	push bc
	pop af
	ld bc,(savebc)
	ld de,(savede)
	ld hl,(savehl)
	ld ix,(saveix)
	ret
errrd:	
	push	bc
	push	hl	! return address
	ld bc,(saveaf)
	push bc
	pop af
	ld bc,(savebc)
	ld de,(savede)
	ld hl,(savehl)
	ld ix,(saveix)
	ld	ix,-1
	ret

_write:
	ld (savebc),bc
	push af
	pop bc
	ld (saveaf),bc	! save all registers in savereg
	ld (savede),de
	ld (savehl),hl
	ld (saveix),ix
	ex	(sp),hl	! return address in hl
	pop	de	! skip return address
	pop	de	! get fd
	ld	a,e	! check for fd = 1
	cp	1
	jr	nz,errwr
	ld	a,d
	or	a
	jr	nz,errwr
	pop	de      ! buffer in de
	pop	bc	! count in bc
	push	bc
	push	de
	push	de
	push	hl
	ex	de,hl	! buffer in hl
	ld	e,c
	ld	d,b	! count also in de
1:	ld	a,b
	or	c
	jr	z,exit
	ld	a,(hl)
	call	putchr
	inc	hl
	dec	bc
	jr	1b
errwr:
	push	de
	push	hl
	ld bc,(saveaf)
	push bc
	pop af
	ld bc,(savebc)
	ld de,(savede)
	ld hl,(savehl)
	ld ix,(saveix)
	ld	ix,-1	! error in fd
	ret
exit:
	push	de	! count on stack
	ld bc,(saveaf)
	push bc
	pop af
	ld bc,(savebc)
	ld de,(savede)
	ld hl,(savehl)
	ld ix,(saveix)
	pop	ix	! return count to caller
	ret

_ioctl:
	ret
_getpid:
	ret

! open return a file descriptor (0,1,2)
! depending on 'mode'
! mode 2 doesn't work!!
_open:
	ld (savebc),bc
	push af
	pop bc
	ld (saveaf),bc	! save all registers in savereg
	ld (savede),de
	ld (savehl),hl
	ld (saveix),ix
	pop	bc	! return address
	pop	de	! name pointer
	pop	ix	! mode (0 for read,
			! 1 for write)
	push	ix
	push	de
	push	bc
	ld bc,(saveaf)
	push bc
	pop af
	ld bc,(savebc)
	ld de,(savede)
	ld hl,(savehl)
	ld ix,(saveix)
	ret		! return fd = 0 for read
			! fd = 1 for write

_close:
	ld	ix,0	! return succes
	ret
_exit:
jp 0x38
.sect .data
_errno:
	.data2	0
! output routine in monitor
CRT	= 0x013B
! output a charcter
! entry: ascii character in a
.sect .text
!putchr:
!	push	hl
!	push	bc
!	ld	hl,tab
!	ld	b,5
!1:	cp	(hl)
!	jr	z,fetch
!	inc	hl
!	inc	hl
!	djnz	1b
!2:	call	CRT
!	pop	bc
!	pop	hl
!	ret
!fetch:	inc	hl
!	ld	a,(hl)
!	jr	2b
!! conversion table for nascom characters
!tab:	.data1	0x0D,0x00
!	.data1	0x1B,0x1E
!	.data1	0x08,0x1D
!	.data1	0x0A,0x1F
!	.data1	0x7F,0x00

KBD	= 0x69
! get character from keyboard
getchr:
	call	KBD
	jr	nc,getchr
	cp	0x1F
	jr	z,CR
	cp	0x1D
	jr	z,BS
	ret
CR:	ld	a,0xA
	ret
BS:	ld	a,0x8
	ret