123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- .define _read,_write,_ioctl,_getpid,_open,_close,_exit,_errno
- _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
- .data
- _errno:
- .word 0
- ! output routine in monitor
- CRT = 0x013B
- ! output a charcter
- ! entry: ascii character in a
- .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: .byte 0x0D,0x00
- ! .byte 0x1B,0x1E
- ! .byte 0x08,0x1D
- ! .byte 0x0A,0x1F
- ! .byte 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
|