Skip to content

Commit 9358438

Browse files
committed
tried to make ps/2 mouse work in "remote mode" (polling), but it doesn't
work. For now only interrupt (stream mode) works. Also added ser_printf
1 parent 5e8cc93 commit 9358438

File tree

7 files changed

+177
-63
lines changed

7 files changed

+177
-63
lines changed

src/contty.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,6 @@ void con_clear(void);
2727
void con_putchar(int c);
2828

2929
void con_putchar_scr(int x, int y, int c);
30+
void con_printf(int x, int y, const char *fmt, ...);
3031

3132
#endif /* CONTTY_H_ */

src/kbregs.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
5555
#define KB_CCB_KB_XLAT 0x40
5656

5757
/* psaux commands (use with d4 prefix) */
58+
#define AUX_CMD_STREAM_MODE 0xea
59+
#define AUX_CMD_READ_MOUSE 0xeb
60+
#define AUX_CMD_REMOTE_MODE 0xf0
5861
#define AUX_CMD_ENABLE 0xf4
5962
#define AUX_CMD_DEFAULTS 0xf6
6063

src/keyb.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
2222
#include "asmops.h"
2323
#include "kbregs.h"
2424

25+
#define delay7us() \
26+
do { \
27+
iodelay(); iodelay(); iodelay(); iodelay(); \
28+
iodelay(); iodelay(); iodelay(); \
29+
} while(0)
2530

2631
/* table with rough translations from set 1 scancodes to ASCII-ish */
2732
static int scantbl[] = {
@@ -156,6 +161,7 @@ void kb_send_data(unsigned char data)
156161
unsigned char kb_read_data(void)
157162
{
158163
kb_wait_read();
164+
delay7us();
159165
return inb(KB_DATA_PORT);
160166
}
161167

src/libc/stdio.c

Lines changed: 61 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,19 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
1919
#include <string.h>
2020
#include <ctype.h>
2121
#include "contty.h"
22+
#include "serial.h"
23+
24+
enum {
25+
OUT_DEF,
26+
OUT_BUF,
27+
OUT_SCR,
28+
OUT_SER
29+
};
2230

2331
extern void pcboot_putchar(int c);
2432

25-
static void bwrite(char *buf, size_t buf_sz, char *str, int sz);
26-
static int intern_printf(char *buf, size_t sz, const char *fmt, va_list ap);
33+
static void bwrite(int out, char *buf, size_t buf_sz, char *str, int sz);
34+
static int intern_printf(int out, char *buf, size_t sz, const char *fmt, va_list ap);
2735

2836
int putchar(int c)
2937
{
@@ -52,14 +60,14 @@ int printf(const char *fmt, ...)
5260
va_list ap;
5361

5462
va_start(ap, fmt);
55-
res = intern_printf(0, 0, fmt, ap);
63+
res = intern_printf(OUT_DEF, 0, 0, fmt, ap);
5664
va_end(ap);
5765
return res;
5866
}
5967

6068
int vprintf(const char *fmt, va_list ap)
6169
{
62-
return intern_printf(0, 0, fmt, ap);
70+
return intern_printf(OUT_DEF, 0, 0, fmt, ap);
6371
}
6472

6573
int sprintf(char *buf, const char *fmt, ...)
@@ -68,14 +76,14 @@ int sprintf(char *buf, const char *fmt, ...)
6876
va_list ap;
6977

7078
va_start(ap, fmt);
71-
res = intern_printf(buf, 0, fmt, ap);
79+
res = intern_printf(OUT_BUF, buf, 0, fmt, ap);
7280
va_end(ap);
7381
return res;
7482
}
7583

7684
int vsprintf(char *buf, const char *fmt, va_list ap)
7785
{
78-
return intern_printf(buf, 0, fmt, ap);
86+
return intern_printf(OUT_BUF, buf, 0, fmt, ap);
7987
}
8088

8189
int snprintf(char *buf, size_t sz, const char *fmt, ...)
@@ -84,16 +92,31 @@ int snprintf(char *buf, size_t sz, const char *fmt, ...)
8492
va_list ap;
8593

8694
va_start(ap, fmt);
87-
res = intern_printf(buf, sz, fmt, ap);
95+
res = intern_printf(OUT_BUF, buf, sz, fmt, ap);
8896
va_end(ap);
8997
return res;
9098
}
9199

92100
int vsnprintf(char *buf, size_t sz, const char *fmt, va_list ap)
93101
{
94-
return intern_printf(buf, sz, fmt, ap);
102+
return intern_printf(OUT_BUF, buf, sz, fmt, ap);
95103
}
96104

105+
int ser_printf(const char *fmt, ...)
106+
{
107+
int res;
108+
va_list ap;
109+
110+
va_start(ap, fmt);
111+
res = intern_printf(OUT_SER, 0, 0, fmt, ap);
112+
va_end(ap);
113+
return res;
114+
}
115+
116+
int ser_vprintf(const char *fmt, va_list ap)
117+
{
118+
return intern_printf(OUT_SER, 0, 0, fmt, ap);
119+
}
97120

98121
/* intern_printf provides all the functionality needed by all the printf
99122
* variants.
@@ -108,7 +131,7 @@ int vsnprintf(char *buf, size_t sz, const char *fmt, va_list ap)
108131
#define BUF(x) ((x) ? (x) + cnum : (x))
109132
#define SZ(x) ((x) ? (x) - cnum : (x))
110133

111-
static int intern_printf(char *buf, size_t sz, const char *fmt, va_list ap)
134+
static int intern_printf(int out, char *buf, size_t sz, const char *fmt, va_list ap)
112135
{
113136
char conv_buf[32];
114137
char *str;
@@ -143,7 +166,7 @@ static int intern_printf(char *buf, size_t sz, const char *fmt, va_list ap)
143166
base = 16;
144167

145168
if(alt) {
146-
bwrite(BUF(buf), SZ(sz), "0x", 2);
169+
bwrite(out, BUF(buf), SZ(sz), "0x", 2);
147170
}
148171

149172
case 'u':
@@ -154,7 +177,7 @@ static int intern_printf(char *buf, size_t sz, const char *fmt, va_list ap)
154177
base = 8;
155178

156179
if(alt) {
157-
bwrite(BUF(buf), SZ(sz), "0", 1);
180+
bwrite(out, BUF(buf), SZ(sz), "0", 1);
158181
}
159182
}
160183

@@ -173,18 +196,18 @@ static int intern_printf(char *buf, size_t sz, const char *fmt, va_list ap)
173196

174197
slen = strlen(conv_buf);
175198
for(i=slen; i<fwidth; i++) {
176-
bwrite(BUF(buf), SZ(sz), (char*)&padc, 1);
199+
bwrite(out, BUF(buf), SZ(sz), (char*)&padc, 1);
177200
cnum++;
178201
}
179202

180-
bwrite(BUF(buf), SZ(sz), conv_buf, strlen(conv_buf));
203+
bwrite(out, BUF(buf), SZ(sz), conv_buf, strlen(conv_buf));
181204
cnum += slen;
182205
break;
183206

184207
case 'c':
185208
{
186209
char c = va_arg(ap, int);
187-
bwrite(BUF(buf), SZ(sz), &c, 1);
210+
bwrite(out, BUF(buf), SZ(sz), &c, 1);
188211
cnum++;
189212
}
190213
break;
@@ -194,10 +217,10 @@ static int intern_printf(char *buf, size_t sz, const char *fmt, va_list ap)
194217
slen = strlen(str);
195218

196219
for(i=slen; i<fwidth; i++) {
197-
bwrite(BUF(buf), SZ(sz), (char*)&padc, 1);
220+
bwrite(out, BUF(buf), SZ(sz), (char*)&padc, 1);
198221
cnum++;
199222
}
200-
bwrite(BUF(buf), SZ(sz), str, slen);
223+
bwrite(out, BUF(buf), SZ(sz), str, slen);
201224
cnum += slen;
202225
break;
203226

@@ -252,7 +275,7 @@ static int intern_printf(char *buf, size_t sz, const char *fmt, va_list ap)
252275
fmt++;
253276
}
254277
} else {
255-
bwrite(BUF(buf), SZ(sz), (char*)fmt++, 1);
278+
bwrite(out, BUF(buf), SZ(sz), (char*)fmt++, 1);
256279
cnum++;
257280
}
258281
}
@@ -262,19 +285,34 @@ static int intern_printf(char *buf, size_t sz, const char *fmt, va_list ap)
262285

263286

264287
/* bwrite is called by intern_printf to transparently handle writing into a
265-
* buffer (if buf is non-null) or to the terminal (if buf is null).
288+
* buffer or to the terminal
266289
*/
267-
static void bwrite(char *buf, size_t buf_sz, char *str, int sz)
290+
static void bwrite(int out, char *buf, size_t buf_sz, char *str, int sz)
268291
{
269-
if(buf) {
292+
int i;
293+
294+
if(out == OUT_BUF) {
270295
if(buf_sz && buf_sz <= sz) sz = buf_sz - 1;
271296
memcpy(buf, str, sz);
272297

273298
buf[sz] = 0;
274299
} else {
275-
int i;
276-
for(i=0; i<sz; i++) {
277-
putchar(*str++);
300+
switch(out) {
301+
case OUT_DEF:
302+
for(i=0; i<sz; i++) {
303+
putchar(*str++);
304+
}
305+
break;
306+
307+
case OUT_SER:
308+
for(i=0; i<sz; i++) {
309+
ser_putchar(*str++);
310+
}
311+
break;
312+
313+
default:
314+
/* TODO: OUT_SCR */
315+
break;
278316
}
279317
}
280318
}

src/libc/stdio.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,8 @@ int vsprintf(char *buf, const char *fmt, va_list ap);
3333
int snprintf(char *buf, size_t sz, const char *fmt, ...);
3434
int vsnprintf(char *buf, size_t sz, const char *fmt, va_list ap);
3535

36+
/* printf to the serial port */
37+
int ser_printf(const char *fmt, ...);
38+
int ser_vprintf(const char *fmt, va_list ap);
39+
3640
#endif /* STDIO_H_ */

0 commit comments

Comments
 (0)