]> cloudbase.mooo.com Git - avrcpm.git/blob - avr/virt_ports.asm
460f30cdd70630552c8de340980a5bba37fe0d13
[avrcpm.git] / avr / virt_ports.asm
1 ; Virtual Ports for the BIOS Interaction
2 ;
3 ; Copyright (C) 2010 Leo C.
4 ;
5 ; This file is part of avrcpm.
6 ;
7 ; avrcpm is free software: you can redistribute it and/or modify it
8 ; under the terms of the GNU General Public License as published by
9 ; the Free Software Foundation, either version 3 of the License, or
10 ; (at your option) any later version.
11 ;
12 ; avrcpm is distributed in the hope that it will be useful,
13 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 ; GNU General Public License for more details.
16 ;
17 ; You should have received a copy of the GNU General Public License
18 ; along with avrcpm. If not, see <http://www.gnu.org/licenses/>.
19 ;
20 ; $Id$
21 ;
22
23
24 ;
25 ; Port Direction Function
26 ;hex dez
27 ;-------------------------------------------------------------------------
28 ;00 0 in - Con status.
29 ; Returns 0xFF if the UART has a byte, 0 otherwise.
30 ;01 1 in/out - Console input, aka UDR. / Console Output
31 ;02 2 out - Console Output (deprecated)
32 ;03 3 in - "UART" status: bit 0 = rx, bit 1 = tx
33 ;04 4 in - "UART" data register, no wait
34 ;
35 ;0D,0E 13,14 in/out - Set address of Bios Controll Block
36 ;0F 15 in/out - Disk select
37 ;10,11 16,17 in/out - Track select
38 ;12,13 18,19 in/out - Sector select
39 ;14,15 20,21 in/out - Write addr
40 ;
41 ;16 22 out - Trigger disk i/o operations
42 ; Bit 7 = 1: Read sector
43 ; Bit 6 = 1: Write sector
44 ; Bit 5 = 1: BIOS WBOOT
45 ; Bit 4 = 1: BIOS Home
46 ; Only one of bits 4..7 may be set.
47 ; If Write function (bit 6=1):
48 ; Bits 0..2: 0 - write to allocated
49 ; 1 - write to directory
50 ; 2 - write unallocated
51 ; 3 - write to directory
52 ;
53 ;16 22 in - Result of last read/write operation.
54 ; 0x00 = ok, 0xff = error (--> Bad Sector)
55 ;
56 ;40 64-71 in/out - Timer/Clock control.
57 ;46
58
59
60 ; ---------------------------------------------- Start of Code Segment
61 .cseg
62 vport_tbl:
63 .db 00,1 ;Port 0, length 1
64 .dw conStatus ; in
65 .dw dbgOut ; out
66 .db 01,1
67 .dw uartgetc
68 .dw uartputc
69 .db 02,1 ;Port 2 (old console output)
70 .dw uartgetc ; filler
71 .dw uartputc ; deprecated
72 .db 03,1
73 .dw uartstat
74 .dw vport_out_dummy
75 .db 04,1
76 .dw uartin
77 .dw uartout
78
79 .db 13,9 ; Port 13-21, (lenth 9)
80 .dw dsk_param_get
81 .dw dsk_param_set
82 .db 22,1
83 .dw dskErrorRet
84 .dw dskDoIt
85
86 .db TIMERPORT,7
87 .dw clockget
88 .dw clockput
89
90 .db DEBUGPORT,1
91 .dw dbg_stat
92 .dw dbg_ctrl
93 .db 0,0 ; Stop mark
94
95 ;---------------------------------------------------------------------
96
97 ;Called with port in temp2 and value in temp.
98 portWrite:
99 set
100 rjmp vprw_start
101
102 ;Called with port in temp2. Should return value in temp.
103 portRead:
104 clt
105
106 vprw_start:
107 .if PORT_DEBUG > 1
108 tst temp2
109 brne dvp_1 ;don't debug console status
110 brts dvp_1
111 rjmp conStatus
112 dvp_1:
113 printnewline
114 brts dvp_11
115 printstring "Port In: "
116 rjmp dvp_12
117 dvp_11:
118 printstring "Port Out: "
119 dvp_12:
120 push temp
121 mov temp,temp2
122 rcall printhex
123 pop temp
124 .endif
125 ldiw z,vport_tbl*2
126
127 vprw_loop:
128 lpm _tmp0,z+
129 lpm temp4,z+ ;length
130 cpi temp4,0
131 breq vprw_exit ;no more ports
132
133 mov temp3,temp2
134 sub temp3,_tmp0 ;base port
135 brcs vprw_next ;port # too high
136 cp temp3,temp4 ;may be in range
137 brcs vprw_found ;
138 vprw_next: ;port # not in range, test next block.
139 adiw z,4
140 rjmp vprw_loop
141 vprw_found:
142 brtc PC+2
143 adiw z,2
144 lpm _tmp0,z+
145 lpm _tmp1,z+
146 movw z,_tmp0
147
148 .if PORT_DEBUG > 1
149 push temp2
150 push temp
151 printstring ", exec: "
152 movw temp,z
153 rcall printhexw
154 printstring ", rel port: "
155 mov temp,temp3
156 rcall printhex
157 pop temp
158 pop temp2
159 printstring ", val: "
160 brts dvp_2
161 icall
162 rcall printhex
163 printstring " "
164 ret
165 dvp_2:
166 rcall printhex
167 printstring " "
168 ijmp ; relative port # in temp3
169 .else
170 ijmp
171 .endif
172
173 vprw_exit:
174 ; trap for nonexistent port?
175 .if PORT_DEBUG > 1
176 printstring ", not found!"
177 .endif
178 vport_in_dummy:
179 ldi temp,0xff
180 vport_out_dummy:
181 ret
182
183
184 uartstat:
185 clr temp
186 lds temp2,rxcount
187 cpse temp2,_0
188 sbr temp,0x01
189 lds temp2,txcount
190 cpi temp2,TXBUFSIZE
191 breq uartst_1
192 sbr temp,0x02
193 uartst_1:
194 ret
195
196 uartin:
197 clr temp
198 lds temp2,rxcount
199 cpse temp2,_0
200 rjmp uartgetc
201 ret
202
203 uartout:
204 lds temp2,txcount
205 cpi temp2,TXBUFSIZE
206 breq uartout_1
207 rjmp uartputc
208 uartout_1:
209 ret
210
211
212 conStatus:
213 lds temp,rxcount
214 cpse temp,_0
215 ldi temp,0xff
216 ret
217
218
219 dbgOut:
220 printnewline
221 printstring "Debug: "
222 rcall printhex
223 ret
224
225
226 dbg_stat:
227 ldi temp,0
228 ret
229
230 dbg_ctrl:
231 bmov intstat,i_trace, temp,0
232 ret
233
234
235
236 ;---------------------------------------------------------------------
237 ; vim:set ts=8 noet nowrap
238