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
global f.init,f.in,f.out,f.i.st
extrn buf.init
include config.inc
include z180reg.inc
;--------------------------------------------------------------
dseg
mkbuf rx.buf,rx.buf_len
mkbuf tx.buf,tx.buf_len
;--------------------------------------------------------------
cseg
;
; FIFO channels for communication with stm32
;
; 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
|