summaryrefslogtreecommitdiff
path: root/z180/fifoio.180
blob: cbcece9152635a5d309ac41dda8fff3783861c5f (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
	page	255
	.z80

;
; FIFO channels for communication with stm32
;
	global	f.init,f.in,f.out,f.i.st

	extrn	buf.init

	include config.inc
	include	z180reg.inc


;--------------------------------------------------------------

	dseg


	mkbuf	ci.fifo_id, rx.buf,rx.buf_len
	mkbuf	co.fifo_id, tx.buf,tx.buf_len


;--------------------------------------------------------------

	cseg

; Init Serial I/O for console input and output
;

f.init:
	ld	ix,rx.buf
	ld	a,rx.buf.mask
	call	buf.init
	ld	ix,tx.buf
	ld	a,tx.buf.mask
	jp	buf.init


f.i.st:
	push	ix
	ld	ix,rx.buf		;

buf.empty:
	ld	a,(ix+o.in_idx)		;
	sub	(ix+o.out_idx)		;
	pop	ix
	ret	z
	or	0ffh
	ret


f.in:
	push	ix
	ld	ix,rx.buf		;

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


f.o.st:
	push	ix
	ld	ix,tx.buf		;

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


f.out:
	push	ix
	ld	ix,tx.buf		;

buf.put:
	push	hl			;
	push	bc
	push	ix
	pop	hl
	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

	ld	a,b
	pop	bc
	pop	hl
	pop	ix
	ret

	end