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
|
page 255
.z80
global msg_fifo
global msginit
global msg.out,msg.sout,msg.co
extrn buf.init
include config.inc
include z180reg.inc
;--------------------------------------------------------------
dseg
mkbuf msg_fifo, 0
;--------------------------------------------------------------
cseg
;
; Init buffer
;
msginit:
ld ix,msg_fifo
ld a,msg_fb_len-1
jp buf.init
;--------------------------------------------------------------
msg.sts:
push ix
ld ix,msg_fifo ;
ld a,(ix+o.in_idx) ;
inc a
and (ix+o.mask)
sub (ix+o.out_idx) ;
pop ix
ret z
or 0ffh
ret
;--------------------------------------------------------------
msg.out:
push ix
ld ix,msg_fifo ;
push bc
ld b,a ;save char
ld a,(ix+o.in_idx) ;
inc a
and (ix+o.mask)
bp.wait:
cp (ix+o.out_idx) ;
jr z,bp.wait
ld c,a
ld a,b
out (PMSG),a
ld (ix+o.in_idx),c
pop bc
pop ix
ret
;--------------------------------------------------------------
;
; (hl): data
msg.sout:
push ix
ld ix,msg_fifo ;
push bc
ld b,(hl) ;count
inc hl
obs_1:
ld a,(ix+o.out_idx) ;
sub (ix+o.in_idx) ;
dec a
and (ix+o.mask)
cp b
jr c,obs_1
ld c,(hl) ;port address
inc hl
ld a,b
otir
add (ix+o.in_idx)
and (ix+o.mask)
ld (ix+o.in_idx),a
pop bc
pop ix
ret
;----------------------------------------------------------------------
msg.co:
push af
push hl
ld (buf_char),a
ld hl,buf
call msg.sout
pop hl
pop af
ret
buf:
db buf_end - $ - 2 ;output string length
db PMSG ;output port
db 081h ; message start token
db buf_end - $ - 1 ; message length
db 1 ; command
db 1 ; subcommand
buf_char:
db 0 ; pay load
buf_end:
;----------------------------------------------------------------------
end
|