summaryrefslogtreecommitdiff
path: root/z180/conbuf-a.180
blob: 8534f7300441c0af2d99e4cac4bac3447c31d9cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
	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