page 255 .z80 ; ; FIFO channels for communication with avr ; global ff.init,ff.in,ff.out,ff.i.st,ff.o.st extrn buf.init include config.inc include z180reg.inc ;-------------------------------------------------------------- dseg mkbuf co.fifo,co.fifo_len mkbuf ci.fifo,ci.fifo_len ;-------------------------------------------------------------- cseg ; Init Serial I/O for console input and output ; ff.init: ld ix,ci.fifo ld a,ci.fifo.mask call buf.init ld ix,co.fifo ld a,co.fifo.mask jp buf.init ff.i.st: push ix ld ix,ci.fifo ; buf.empty: ld a,(ix+o.in_idx) ; sub (ix+o.out_idx) ; pop ix ret z or 0ffh ret ff.in: push ix ld ix,ci.fifo ; buf.get: ld a,(ix+o.out_idx) ; bg.wait: cp (ix+o.in_idx) ; jr z,bg.wait push hl ; push ix pop hl add a,l ld l,a jr nc,bg.nc inc h bg.nc: ld l,(hl) ld a,(ix+o.out_idx) ; inc a and (ix+o.mask) ld (ix+o.out_idx),a ld a,l pop hl pop ix ret ff.o.st: push ix ld ix,co.fifo ; buf.full: ld a,(ix+o.in_idx) ; inc a and (ix+o.mask) sub (ix+o.out_idx) ; pop ix ret z or 0ffh ret ff.out: push ix ld ix,co.fifo ; buf.put: push hl ; push bc push ix pop hl ld a,c ld c,(ix+o.in_idx) ; ld b,0 add hl,bc ld b,a ld a,c ; inc a and (ix+o.mask) bp.wait: cp (ix+o.out_idx) ; jr z,bp.wait ld (hl),b ld (ix+o.in_idx),a out (AVRINT6),a ld a,b pop bc pop hl pop ix ret end