aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Auvolat <alex@adnab.me>2015-03-11 19:18:59 +0100
committerAlex Auvolat <alex@adnab.me>2015-03-11 19:18:59 +0100
commit50b5427a8edbb8d59215334f5a250e7f8d6d7ca7 (patch)
tree7263505b2a6145256ce1f494108a4ceb853c4de0
parent0b76aff59b586d87ee0449bc7deda878f4633515 (diff)
downloadkogata-50b5427a8edbb8d59215334f5a250e7f8d6d7ca7.tar.gz
kogata-50b5427a8edbb8d59215334f5a250e7f8d6d7ca7.zip
Add keyboard handling code. New font thanks to Muazzam from OSDev!
-rw-r--r--.gitignore2
-rw-r--r--Makefile2
-rwxr-xr-xmake_cdrom.sh8
-rw-r--r--res/fonts/Makefile10
-rw-r--r--res/fonts/muazzam.s2006
-rw-r--r--res/fonts/pcvga.c (renamed from res/fonts/default.c)11
-rw-r--r--res/keymaps/Makefile10
-rw-r--r--res/keymaps/fr.c68
-rw-r--r--src/common/include/proto/keyboard.h20
-rw-r--r--src/kernel/core/idt.c2
-rw-r--r--src/lib/include/keyboard.h37
-rw-r--r--src/lib/include/proto/keymap_file.h16
-rw-r--r--src/lib/libkogata/Makefile2
-rw-r--r--src/lib/libkogata/draw.c2
-rw-r--r--src/lib/libkogata/keyboard.c148
-rw-r--r--src/lib/libkogata/mainloop.c8
-rw-r--r--src/sysbin/login/main.c8
17 files changed, 2338 insertions, 22 deletions
diff --git a/.gitignore b/.gitignore
index 29a8f1e..6c14d1a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,7 +8,9 @@ tags
*.lib
*.map
*.log
+
*.bf
+*.km
*.iso
cdrom/
diff --git a/Makefile b/Makefile
index 5020490..2863d35 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
DIRS = src/common/libkogata src/common/libc src/common/libalgo \
src/kernel src/lib/libkogata \
src/sysbin/init src/sysbin/giosrv src/sysbin/login \
- res/fonts
+ res/fonts res/keymaps
all:
for dir in $(DIRS); do \
diff --git a/make_cdrom.sh b/make_cdrom.sh
index e15e9bc..1e32b32 100755
--- a/make_cdrom.sh
+++ b/make_cdrom.sh
@@ -15,11 +15,15 @@ cp src/sysbin/init/init.bin cdrom/boot; strip cdrom/boot/init.bin
mkdir -p cdrom/sys/bin
cp src/sysbin/giosrv/giosrv.bin cdrom/sys/bin
cp src/sysbin/login/login.bin cdrom/sys/bin
-
for BIN in cdrom/sys/bin/*.bin; do strip $BIN; done
mkdir -p cdrom/sys/fonts
cp res/fonts/*.bf cdrom/sys/fonts
+cp res/fonts/muazzam.bf cdrom/sys/fonts/default.bf
+
+mkdir -p cdrom/sys/keymaps
+cp res/keymaps/*.km cdrom/sys/keymaps
+cp res/keymaps/fr.km cdrom/sys/keymaps/default.km
cp README.md cdrom
@@ -38,7 +42,7 @@ kernel /boot/kernel.bin root=io:/disk/atapi0 root_opts=l init=root:/boot/init.b
module /boot/kernel.map
EOF
-# Generate CDROm image
+# Generate CDROM image
genisoimage -R -b boot/grub/stage2_eltorito -no-emul-boot \
-boot-load-size 4 -boot-info-table -input-charset ascii \
diff --git a/res/fonts/Makefile b/res/fonts/Makefile
index c4de63d..8b50213 100644
--- a/res/fonts/Makefile
+++ b/res/fonts/Makefile
@@ -1,10 +1,18 @@
CC=gcc
CFLAGS=-I../../src/lib/include -std=c11
+AS=nasm
+ASFLAGS=-fbin
%.bf: %.c
$(CC) $(CFLAGS) -o $<.bin $<
./$<.bin > $@
rm $<.bin
-all: default.bf
+%.bf: %.s
+ $(AS) $(ASFLAGS) -o $@ $<
+
+all: pcvga.bf muazzam.bf
+
+clean:
+ rm *.bf || exit 0
diff --git a/res/fonts/muazzam.s b/res/fonts/muazzam.s
new file mode 100644
index 0000000..43c74a8
--- /dev/null
+++ b/res/fonts/muazzam.s
@@ -0,0 +1,2006 @@
+;---------------------------------------------------------;
+; Written by: Muazzam Ali Kazmi ;
+; Public domain ;
+;---------------------------------------------------------;
+
+magic:
+ dd 0xD184C274
+glyph_geom:
+ dw 8, 16
+nchars:
+ dd 127
+
+times 512 db 0
+
+.space: ;[space]
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+.exclamation: ;!
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00000000b
+ db 00010000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+.quotation: ;"
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 01101100b
+ db 01001000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.hash: ;#
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00100010b
+ db 00100010b
+ db 01111111b
+ db 00100010b
+ db 01000100b
+ db 01000100b
+ db 11111111b
+ db 01000100b
+ db 01000100b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.dollor: ;$
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00010000b
+
+ db 00111100b
+ db 01010010b
+ db 01010000b
+ db 01010000b
+ db 00111100b
+ db 00010010b
+ db 00010010b
+ db 01010010b
+ db 00111100b
+
+ db 00010000b
+ db 00000000b
+ db 00000000b
+
+
+.percent: ;%
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000010b
+ db 00100010b
+ db 01010100b
+ db 00100100b
+ db 00001000b
+ db 00001010b
+ db 00010101b
+ db 00010010b
+ db 00100000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.ampersand: ;&
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00110000b
+ db 01001000b
+ db 00110000b
+ db 00110100b
+ db 01001000b
+ db 01000101b
+ db 00111110b
+ db 00000001b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.apostrophe: ;'
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00011000b
+ db 00010000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.parenthesis.left: ;(
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00011000b
+ db 00100000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 00100000b
+ db 00011000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.parenthesis.right: ;)
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00011000b
+ db 00000100b
+ db 00000010b
+ db 00000010b
+ db 00000010b
+ db 00000010b
+ db 00000010b
+ db 00000100b
+ db 00011000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.astrisk: ;*
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00101010b
+ db 00011100b
+ db 00011100b
+ db 00101010b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.plus: ;+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00001000b
+ db 00001000b
+ db 00001000b
+ db 01111111b
+ db 00001000b
+ db 00001000b
+ db 00001000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.comma: ;,
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00011000b
+ db 00011000b
+
+ db 00001000b
+ db 00010000b
+ db 00000000b
+
+
+.minus: ;-
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 01111110b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.fullStop: ;.
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00011000b
+ db 00011000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.slash: ;/
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000010b
+ db 00000010b
+ db 00000100b
+ db 00000100b
+ db 00001000b
+ db 00001000b
+ db 00010000b
+ db 00010000b
+ db 00100000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+;Numbers
+;
+
+.zero: ;0
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00011000b
+ db 00100100b
+ db 01000010b
+ db 01000010b
+ db 01011010b
+ db 01000010b
+ db 01000010b
+ db 00100100b
+ db 00011000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.one: ;1
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00010000b
+ db 00110000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00111000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+.two: ;2
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00111100b
+ db 01000010b
+ db 00000010b
+ db 00000100b
+ db 00001000b
+ db 00010000b
+ db 00100000b
+ db 01000000b
+ db 01111110b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+.three: ;3
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00111100b
+ db 01000010b
+ db 00000010b
+ db 00000100b
+ db 00111000b
+ db 00000100b
+ db 00000010b
+ db 01000010b
+ db 00111100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+.four: ;4
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00001100b
+ db 00010100b
+ db 00100100b
+ db 01000100b
+ db 01000100b
+ db 01111110b
+ db 00000100b
+ db 00000100b
+ db 00000100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+.five: ;5
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01111110b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01111100b
+ db 00000010b
+ db 00000010b
+ db 00000010b
+ db 01111100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+.six: ;6
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00111100b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01111100b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 00111100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+.seven: ;7
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01111110b
+ db 00000010b
+ db 00000100b
+ db 00001000b
+ db 00001000b
+ db 00010000b
+ db 00010000b
+ db 00100000b
+ db 00100000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+.eight: ;8
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00111100b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 00111100b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 00111100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+.nine: ;9
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00111100b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 00111110b
+ db 00000010b
+ db 00000010b
+ db 00000100b
+ db 00011000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+.colon: ;:
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00011000b
+ db 00011000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00011000b
+ db 00011000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+.semicolon: ;;
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00011000b
+ db 00011000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00011000b
+ db 00011000b
+ db 00001000b
+ db 00010000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+.less: ;<
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000100b
+ db 00001000b
+ db 00010000b
+ db 00100000b
+ db 01000000b
+ db 00100000b
+ db 00010000b
+ db 00001000b
+ db 00000100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+.equal: ;=
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 01111110b
+ db 00000000b
+ db 01111110b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.greater: ;>
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00100000b
+ db 00010000b
+ db 00001000b
+ db 00000100b
+ db 00000010b
+ db 00000100b
+ db 00001000b
+ db 00010000b
+ db 00100000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.question: ;?
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00111100b
+ db 01000010b
+ db 00000010b
+ db 00000100b
+ db 00001000b
+ db 00010000b
+ db 00010000b
+ db 00000000b
+ db 00010000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.at: ;@
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00111100b
+ db 01000010b
+ db 01000010b
+ db 01001110b
+ db 01010010b
+ db 01001110b
+ db 01000000b
+ db 01000000b
+ db 00111100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+;Upper case
+;
+
+.A:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00011000b
+ db 00100100b
+ db 01000010b
+ db 01000010b
+ db 01111110b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.B:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01111100b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01111100b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01111100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.C:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00111110b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 00111110b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.D:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01111000b
+ db 01000100b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000100b
+ db 01111000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.E:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01111110b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01111110b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01111110b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.F:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01111110b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01111110b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.G:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00111100b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01001110b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 00111100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.H:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01111110b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.I:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00111000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00111000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.J:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00001110b
+ db 00000100b
+ db 00000100b
+ db 00000100b
+ db 00000100b
+ db 00000100b
+ db 01000100b
+ db 01000100b
+ db 00111000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.K:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01000010b
+ db 01000100b
+ db 01001000b
+ db 01010000b
+ db 01100000b
+ db 01010000b
+ db 01001000b
+ db 01000100b
+ db 01000010b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.L:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01111111b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.M:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01100110b
+ db 01100110b
+ db 01100110b
+ db 01011010b
+ db 01011010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.N:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01100010b
+ db 01100010b
+ db 01100010b
+ db 01010010b
+ db 01010010b
+ db 01001010b
+ db 01001010b
+ db 01000110b
+ db 01000110b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.O:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00111100b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 00111100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.P:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01111100b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01111100b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.Q:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00111100b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01001010b
+ db 01000110b
+ db 00111110b
+
+ db 00000001b
+ db 00000000b
+ db 00000000b
+
+
+.R:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01111100b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01111100b
+ db 01100000b
+ db 01010000b
+ db 01001000b
+ db 01000100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+.S:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00111100b
+ db 01000010b
+ db 01000000b
+ db 01000000b
+ db 00111100b
+ db 00000010b
+ db 00000010b
+ db 01000010b
+ db 00111100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.T:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01111111b
+ db 00001000b
+ db 00001000b
+ db 00001000b
+ db 00001000b
+ db 00001000b
+ db 00001000b
+ db 00001000b
+ db 00001000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.U:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 00111100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.V:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 00100100b
+ db 00100100b
+ db 00011000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.W:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01011010b
+ db 01011010b
+ db 01100110b
+ db 01100110b
+ db 01100110b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.X:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01000100b
+ db 01000100b
+ db 00101000b
+ db 00101000b
+ db 00010000b
+ db 00010000b
+ db 00101000b
+ db 01000100b
+ db 01000100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.Y:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01000100b
+ db 01000100b
+ db 00101000b
+ db 00101000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.Z:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01111110b
+ db 00000100b
+ db 00001000b
+ db 00001000b
+ db 00010000b
+ db 00010000b
+ db 00100000b
+ db 01000000b
+ db 01111110b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.squreBracket.left: ;[
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01111000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01111000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+.backSlash: ; back slash
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01000000b
+ db 01000000b
+ db 00100000b
+ db 00100000b
+ db 00010000b
+ db 00010000b
+ db 00001000b
+ db 00001000b
+ db 00000100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+
+.squreBracket.right: ;]
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00011110b
+ db 00000010b
+ db 00000010b
+ db 00000010b
+ db 00000010b
+ db 00000010b
+ db 00000010b
+ db 00000010b
+ db 00011110b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.caret: ;^
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00001000b
+ db 00010100b
+ db 00100010b
+ db 01000001b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.underScore: ;_
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 11111111b
+ db 00000000b
+ db 00000000b
+
+
+.graveAccent: ;`
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00011000b
+ db 00001000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+
+
+;Lower case
+;
+.a:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 01111100b
+ db 00000010b
+ db 00000010b
+ db 00111110b
+ db 01000010b
+ db 01000010b
+ db 00111101b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.b:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01000000b
+ db 01000000b
+ db 01111100b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01111100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.c:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 00111100b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 00111100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.d:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000100b
+ db 00000100b
+ db 00111100b
+ db 01000100b
+ db 01000100b
+ db 01000100b
+ db 01000100b
+ db 01000100b
+ db 00111100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.e:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 00111100b
+ db 01000010b
+ db 01000010b
+ db 01111110b
+ db 01000000b
+ db 01000000b
+ db 00111100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.f:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00011100b
+ db 00100000b
+ db 00100000b
+ db 01111100b
+ db 00100000b
+ db 00100000b
+ db 00100000b
+ db 00100000b
+ db 00100000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.g:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 00111110b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 00111110b
+ db 00000010b
+ db 00000010b
+
+ db 01111100b
+ db 00000000b
+ db 00000000b
+
+
+.h:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01000000b
+ db 01000000b
+ db 01111100b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.i:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00001000b
+ db 00000000b
+ db 00001000b
+ db 00001000b
+ db 00001000b
+ db 00001000b
+ db 00001000b
+ db 00001000b
+ db 00001000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.j:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00001000b
+ db 00000000b
+ db 00011100b
+ db 00000100b
+ db 00000100b
+ db 00000100b
+ db 00000100b
+ db 00000100b
+ db 00000100b
+
+ db 00111000b
+ db 00000000b
+ db 00000000b
+
+
+.k:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 01000000b
+ db 01000000b
+ db 01000000b
+ db 01001000b
+ db 01010000b
+ db 01100000b
+ db 01010000b
+ db 01001000b
+ db 01000100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.l:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00111000b
+ db 00001000b
+ db 00001000b
+ db 00001000b
+ db 00001000b
+ db 00001000b
+ db 00001000b
+ db 00001000b
+ db 00000110b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.m:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 11110110b
+ db 00101010b
+ db 00101010b
+ db 00101010b
+ db 00101010b
+ db 00101010b
+ db 00101010b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.n:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 01111100b
+ db 00100010b
+ db 00100010b
+ db 00100010b
+ db 00100010b
+ db 00100010b
+ db 00100010b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.o:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 00111100b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 00111100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.p:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 01111100b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01111100b
+ db 01000000b
+ db 01000000b
+
+ db 01000000b
+ db 00000000b
+ db 00000000b
+
+
+.q:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 00111110b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 00111110b
+ db 00000010b
+ db 00000010b
+
+ db 00000010b
+ db 00000000b
+ db 00000000b
+
+
+.r:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 00101111b
+ db 00110000b
+ db 00100000b
+ db 00100000b
+ db 00100000b
+ db 00100000b
+ db 00100000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.s:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 00111100b
+ db 01000000b
+ db 01000000b
+ db 00111100b
+ db 00000010b
+ db 00000010b
+ db 00111100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.t:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00010000b
+ db 00010000b
+ db 01111100b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00001110b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.u:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 00111110b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.v:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 00100100b
+ db 00100100b
+ db 00011000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.w:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 01011010b
+ db 01011010b
+ db 01100110b
+ db 01100110b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.x:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 01000100b
+ db 01000100b
+ db 00101000b
+ db 00010000b
+ db 00101000b
+ db 01000100b
+ db 01000100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.y:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 01000010b
+ db 01000010b
+ db 01000010b
+ db 00100100b
+ db 00011000b
+ db 00001000b
+ db 00010000b
+
+ db 01100000b
+ db 00000000b
+ db 00000000b
+
+
+.z:
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00000000b
+ db 00000000b
+ db 01111110b
+ db 00000100b
+ db 00001000b
+ db 00010000b
+ db 00100000b
+ db 01000000b
+ db 01111110b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.curlyBracket.left: ;{
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00001100b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 01100000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00001100b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.verticalBar: ;|
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+ db 00010000b
+
+ db 00010000b
+ db 00000000b
+ db 00000000b
+
+
+.curlyBracket.right: ;}
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+ db 00110000b
+ db 00001000b
+ db 00001000b
+ db 00001000b
+ db 00000110b
+ db 00001000b
+ db 00001000b
+ db 00001000b
+ db 00110000b
+
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
+.tilde: ;~
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00110010b
+ db 01001100b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+ db 00000000b
+
+
diff --git a/res/fonts/default.c b/res/fonts/pcvga.c
index 43fddce..b646eb8 100644
--- a/res/fonts/default.c
+++ b/res/fonts/pcvga.c
@@ -1,4 +1,3 @@
-#include <stdlib.h>
#include <stdio.h>
#include <proto/font_file.h>
@@ -270,14 +269,8 @@ ascii_bitmap_font_header h = {
};
int main() {
- FILE *f = fopen("default.bf", "wb");
- if (f == 0) {
- fprintf(stderr, "Could not open default.bf\n");
- exit(1);
- }
-
- fwrite(&h, 1, sizeof(h), f);
- fwrite(font_data, 256, 16, f);
+ fwrite(&h, 1, sizeof(h), stdout);
+ fwrite(font_data, 256, 16, stdout);
return 0;
}
diff --git a/res/keymaps/Makefile b/res/keymaps/Makefile
new file mode 100644
index 0000000..394685e
--- /dev/null
+++ b/res/keymaps/Makefile
@@ -0,0 +1,10 @@
+CC=gcc
+CFLAGS=-I../../src/lib/include -std=c11
+
+%.km: %.c
+ $(CC) $(CFLAGS) -o $<.bin $<
+ ./$<.bin > $@
+ rm $<.bin
+
+all: fr.km
+
diff --git a/res/keymaps/fr.c b/res/keymaps/fr.c
new file mode 100644
index 0000000..f039142
--- /dev/null
+++ b/res/keymaps/fr.c
@@ -0,0 +1,68 @@
+#include <stdio.h>
+
+#include <proto/keymap_file.h>
+
+keymap_t fr_keymap = {
+ { // normal
+ /* 0x00 */ 0, 0, '&', L'é', '"', '\'', '(', '-', L'è', '_', L'ç', L'à', ')', '=', 0, 0,
+ /* 0x10 */ 'a', 'z', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '^', '$', 0, 0, 'q', 's',
+ /* 0x20 */ 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', L'ù', L'²', 0, '*', 'w', 'x', 'c', 'v',
+ /* 0x30 */ 'b', 'n', ',', ';', ':', '!', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0,
+ /* 0x40 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '-', 0, 0, 0, '+', 0,
+ /* 0x50 */ 0, 0, 0, 0, 0, 0, '<', 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x60 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x70 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { // shift
+ /* 0x00 */ 0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', L'°', '+', 0, 0,
+ /* 0x10 */ 'A', 'Z', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', L'¨', L'£', 0, 0, 'Q', 'S',
+ /* 0x20 */ 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', '%', '~', 0, L'µ', 'W', 'X', 'C', 'V',
+ /* 0x30 */ 'B', 'N', '?', '.', '/', L'§', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0,
+ /* 0x40 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '-', 0, 0, 0, '+', 0,
+ /* 0x50 */ 0, 0, 0, 0, 0, 0, '>', 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x60 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x70 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { // caps
+ /* 0x00 */ 0, 0, '&', L'É', '"', '\'', '(', '-', L'È', '_', L'Ç', L'À', ')', '=', 0, 0,
+ /* 0x10 */ 'A', 'Z', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', L'¨', '$', 0, 0, 'Q', 'S',
+ /* 0x20 */ 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', L'Ù', L'²', 0, '*', 'W', 'X', 'C', 'V',
+ /* 0x30 */ 'B', 'N', ',', ';', ':', '!', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0,
+ /* 0x40 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '-', 0, 0, 0, '+', 0,
+ /* 0x50 */ 0, 0, 0, 0, 0, 0, '>', 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x60 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x70 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ { // alt gr
+ /* 0x00 */ 0, 0, L'¹', '~', '#', '{', '[', '|', '`', '\\', '^', '@', ']', '}', 0, 0,
+ /* 0x10 */ L'æ', L'«', L'€', L'¶', L'ŧ', L'←', L'↓', L'→',
+ L'ø', L'þ', L'¨', L'¤', 0, 0, '@', L'ß',
+ /* 0x20 */ L'ð', L'đ', L'ŋ', L'ħ', 'j', L'ĸ', L'ł', L'µ',
+ '^', L'¬', 0, '`', L'ł', L'»', L'¢', L'“',
+ /* 0x30 */ L'”', 'n', L'´', ';', L'·', '!', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0,
+ /* 0x40 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '-', 0, 0, 0, '+', 0,
+ /* 0x50 */ 0, 0, 0, 0, 0, 0, '|', 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x60 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x70 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ },
+ { // shift + alt gr
+ /* 0x00 */ 0, 0, L'¡', L'⅛', L'£', '$', L'⅜', L'⅝', L'⅞', L'™', L'±', L'°', L'¿', L'˛', 0, 0,
+ /* 0x10 */ L'Æ', '<', L'¢', L'®', L'Ŧ', L'¥', L'↑', L'ı', L'Ø', L'Þ', L'°', L'¯', 0, 0, L'Ω', L'§',
+ /* 0x20 */ L'Ð', L'ª', L'Ŋ', L'Ħ', 'J', '&', L'Ł', L'º', L'ˇ', L'¬', 0, L'˘', L'Ł', '>', L'©', L'‘',
+ /* 0x30 */ L'’', 'N', L'˝', L'×', L'÷', L'˙', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0,
+ /* 0x40 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '-', 0, 0, 0, '+', 0,
+ /* 0x50 */ 0, 0, 0, 0, 0, 0, L'¦', 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x60 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x70 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ },
+ true,
+};
+
+
+int main() {
+ fwrite(&fr_keymap, 1, sizeof(fr_keymap), stdout);
+
+ return 0;
+}
+
+/* vim: set ts=4 sw=4 tw=0 noet :*/
diff --git a/src/common/include/proto/keyboard.h b/src/common/include/proto/keyboard.h
index 8d9543f..c7a2ef8 100644
--- a/src/common/include/proto/keyboard.h
+++ b/src/common/include/proto/keyboard.h
@@ -36,7 +36,8 @@ typedef struct {
#define KBD_CODE_RCTRL 157
#define KBD_CODE_LALT 56
#define KBD_CODE_RALT 184
-#define KBD_CODE_SUPER 219
+#define KBD_CODE_LSUPER 219
+#define KBD_CODE_RSUPER 220
#define KBD_CODE_MENU 221
#define KBD_CODE_TAB 15
#define KBD_CODE_INS 210
@@ -55,4 +56,21 @@ typedef struct {
#define KBD_CODE_F11 87
#define KBD_CODE_F12 88
+#define KBD_CODE_NUMLOCK 69
+#define KBD_CODE_SCRLLOCK 70
+#define KBD_CODE_PRTSCN 183
+#define KBD_CODE_SYSREQ 84
+
+#define KBD_CODE_KPHOME 71
+#define KBD_CODE_KPUP 72
+#define KBD_CODE_KPPGUP 73
+#define KBD_CODE_KPLEFT 75
+#define KBD_CODE_KP5 76
+#define KBD_CODE_KPRIGHT 77
+#define KBD_CODE_KPEND 79
+#define KBD_CODE_KPDOWN 80
+#define KBD_CODE_KPPGDOWN 81
+#define KBD_CODE_KPINS 82
+#define KBD_CODE_KPDEL 83
+
/* vim: set ts=4 sw=4 tw=0 noet :*/
diff --git a/src/kernel/core/idt.c b/src/kernel/core/idt.c
index 457e5ae..e2c4bf0 100644
--- a/src/kernel/core/idt.c
+++ b/src/kernel/core/idt.c
@@ -116,7 +116,7 @@ void idt_ex_handler(registers_t *regs) {
void idt_irq_handler(registers_t *regs) {
int st = enter_critical(CL_EXCL); // if someone tries to yield(), an assert will fail
- if (regs->err_code != 0) dbg_printf("irq%d.", regs->err_code);
+ /*if (regs->err_code != 0) dbg_printf("irq%d.", regs->err_code);*/
if (regs->err_code > 7) {
outb(0xA0, 0x20);
diff --git a/src/lib/include/keyboard.h b/src/lib/include/keyboard.h
new file mode 100644
index 0000000..2842936
--- /dev/null
+++ b/src/lib/include/keyboard.h
@@ -0,0 +1,37 @@
+#pragma once
+
+#include <proto/keymap_file.h>
+
+
+#define KBD_CHAR 0x01
+#define KBD_ALT 0x02
+#define KBD_CTRL 0x04
+#define KBD_SUPER 0x08
+#define KBD_SHIFT 0x10
+#define KBD_CAPS 0x20
+#define KBD_MOD 0x40
+
+typedef struct {
+ union {
+ int chr; // if flags & KBD_CHAR, chr is a character number
+ int key; // if !(flags & KBD_CHAR), key is one of KBD_CODE_* defined in <proto/keyboard.h>
+ };
+ uint32_t flags; // one of kbd_*
+} key_t;
+
+typedef struct {
+ keymap_t km;
+ uint32_t status; // mask of alt/ctrl/super
+} keyboard_t;
+
+keyboard_t *init_keyboard();
+void free_keyboard(keyboard_t *t);
+
+bool load_keymap(keyboard_t *kb, const char* kmname);
+
+key_t keyboard_press(keyboard_t *t, int scancode); // what key is pressed?
+key_t keyboard_release(keyboard_t *t, int scancode); // what key is released?
+
+
+
+/* vim: set ts=4 sw=4 tw=0 noet :*/
diff --git a/src/lib/include/proto/keymap_file.h b/src/lib/include/proto/keymap_file.h
new file mode 100644
index 0000000..53ffeb7
--- /dev/null
+++ b/src/lib/include/proto/keymap_file.h
@@ -0,0 +1,16 @@
+#pragma once
+
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+
+typedef struct {
+ int normal[128];
+ int shift[128];
+ int caps[128];
+ int mod[128];
+ int shiftmod[128];
+ bool ralt_is_mod; // true: right alt = alt-gr
+} keymap_t;
+
+/* vim: set ts=4 sw=4 tw=0 noet :*/
diff --git a/src/lib/libkogata/Makefile b/src/lib/libkogata/Makefile
index a8df419..a02a862 100644
--- a/src/lib/libkogata/Makefile
+++ b/src/lib/libkogata/Makefile
@@ -1,5 +1,5 @@
OBJ = start.o malloc.o debug.o syscall.o user_region.o \
- mainloop.o gip.o draw.o
+ mainloop.o gip.o draw.o keyboard.o
LIB = ../../common/libkogata/libkogata.lib ../../common/libalgo/libalgo.lib ../../common/libc/libc.lib
diff --git a/src/lib/libkogata/draw.c b/src/lib/libkogata/draw.c
index 911fe0d..b9ef9bc 100644
--- a/src/lib/libkogata/draw.c
+++ b/src/lib/libkogata/draw.c
@@ -239,13 +239,11 @@ font_t *g_load_ascii_bitmap_font(fd_t f) {
if (font == 0) goto error;
memset(font, 0, sizeof(font_t));
-
font->type = FONT_ASCII_BITMAP;
font->ascii_bitmap.cw = h.cw;
font->ascii_bitmap.ch = h.ch;
font->ascii_bitmap.nchars = h.nchars;
-
font->ascii_bitmap.data = (uint8_t*)malloc(h.ch * h.nchars);
if (font->ascii_bitmap.data == 0) goto error;
diff --git a/src/lib/libkogata/keyboard.c b/src/lib/libkogata/keyboard.c
new file mode 100644
index 0000000..7e3c376
--- /dev/null
+++ b/src/lib/libkogata/keyboard.c
@@ -0,0 +1,148 @@
+#include <malloc.h>
+#include <string.h>
+#include <printf.h>
+
+#include <syscall.h>
+
+#include <proto/keyboard.h>
+#include <keyboard.h>
+
+// ---- Control keys that are not KBD_CHAR-able
+
+int ctrlkeys[] = {
+/* 0x00 */ 0, KBD_CODE_ESC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KBD_CODE_BKSP, KBD_CODE_TAB,
+/* 0x10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KBD_CODE_RETURN, KBD_CODE_LCTRL, 0, 0,
+/* 0x20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KBD_CODE_LSHIFT, 0, 0, 0, 0, 0,
+/* 0x30 */ 0, 0, 0, 0, 0, 0, KBD_CODE_RSHIFT, 0, KBD_CODE_LALT, 0,
+ KBD_CODE_CAPSLOCK, KBD_CODE_F1, KBD_CODE_F2, KBD_CODE_F3, KBD_CODE_F4, KBD_CODE_F5,
+/* 0x40 */ KBD_CODE_F6, KBD_CODE_F7, KBD_CODE_F8, KBD_CODE_F9, KBD_CODE_F10, KBD_CODE_NUMLOCK,
+ KBD_CODE_SCRLLOCK, KBD_CODE_KPHOME, KBD_CODE_KPUP, KBD_CODE_KPPGUP, 0, KBD_CODE_KPLEFT,
+ KBD_CODE_KP5, KBD_CODE_KPRIGHT, 0, KBD_CODE_KPEND,
+/* 0x50 */ KBD_CODE_KPDOWN, KBD_CODE_KPPGDOWN, KBD_CODE_KPINS, KBD_CODE_KPDEL,
+ KBD_CODE_SYSREQ, 0, 0, KBD_CODE_F11, KBD_CODE_F12, 0, 0, 0, 0, 0, 0, 0,
+/* 0x60 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+/* 0x70 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+/* 0x80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+/* 0x90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KBD_CODE_RETURN, KBD_CODE_RCTRL, 0, 0,
+/* 0xA0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+/* 0xB0 */ 0, 0, 0, 0, 0, 0, 0, KBD_CODE_PRTSCN, KBD_CODE_RALT, 0, 0, 0, 0, 0, 0, 0,
+/* 0xC0 */ 0, 0, 0, 0, 0, 0, 0, KBD_CODE_HOME, KBD_CODE_UP, KBD_CODE_PGUP, 0,
+ KBD_CODE_LEFT, 0, KBD_CODE_RIGHT, 0, KBD_CODE_END,
+/* 0xD0 */ KBD_CODE_DOWN, KBD_CODE_PGDOWN, KBD_CODE_INS, KBD_CODE_DEL, 0, 0, 0, 0, 0,
+ 0, 0, KBD_CODE_LSUPER, KBD_CODE_RSUPER, KBD_CODE_MENU, 0, 0,
+/* 0xE0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+/* 0xF0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+// ---- The code
+
+keyboard_t *init_keyboard() {
+ keyboard_t *kb = (keyboard_t*)malloc(sizeof(keyboard_t));
+ if (kb == 0) return 0;
+
+ if (!load_keymap(kb, "default")) {
+ free(kb);
+ return 0;
+ }
+
+ return kb;
+}
+
+void free_keyboard(keyboard_t *t) {
+ free(t);
+}
+
+bool load_keymap(keyboard_t *kb, const char* kmname) {
+ char buf[128];
+ snprintf(buf, 128, "sys:/keymaps/%s.km", kmname);
+
+ fd_t f = open(buf, FM_READ);
+ if (f == 0) {
+ dbg_printf("Failed to open keymap %s\n", buf);
+ return false;
+ }
+
+ keymap_t km;
+ size_t rd = read(f, 0, sizeof(keymap_t), (char*)&km);
+
+ bool ok = (rd == sizeof(keymap_t));
+
+ if (ok) {
+ memcpy(&kb->km, &km, sizeof(keymap_t));
+ kb->status = 0;
+ }
+
+ close(f);
+
+ return ok;
+}
+
+int key_chr(keyboard_t *kb, int k) {
+ if (kb->status & KBD_MOD) {
+ if ((kb->status & KBD_SHIFT) | (kb->status & KBD_CAPS)) {
+ return kb->km.shiftmod[k];
+ } else {
+ return kb->km.mod[k];
+ }
+ } else if ((kb->status & KBD_CAPS) && (kb->status & KBD_SHIFT)) {
+ return kb->km.normal[k];
+ } else if (kb->status & KBD_SHIFT) {
+ return kb->km.shift[k];
+ } else if (kb->status & KBD_CAPS) {
+ return kb->km.caps[k];
+ } else {
+ return kb->km.normal[k];
+ }
+}
+
+key_t make_key(keyboard_t *kb, int k) {
+ key_t x;
+ x.flags = kb->status;
+
+ x.key = 0;
+ if (k >= 128) return x;
+
+ x.key = ctrlkeys[k];
+ if (x.key != 0) return x;
+
+ x.flags |= KBD_CHAR;
+ x.chr = key_chr(kb, k);
+ return x;
+
+}
+
+key_t keyboard_press(keyboard_t *kb, int k) {
+ if (k == KBD_CODE_LSHIFT || k == KBD_CODE_RSHIFT) {
+ kb->status |= KBD_SHIFT;
+ } else if (k == KBD_CODE_LCTRL || k == KBD_CODE_RCTRL) {
+ kb->status |= KBD_CTRL;
+ } else if (k == KBD_CODE_LSUPER || k == KBD_CODE_RSUPER) {
+ kb->status |= KBD_SUPER;
+ } else if (k == KBD_CODE_LALT || (!kb->km.ralt_is_mod && k == KBD_CODE_RALT)) {
+ kb->status |= KBD_ALT;
+ } else if (kb->km.ralt_is_mod && k == KBD_CODE_RALT) {
+ kb->status |= KBD_MOD;
+ } else if (kb->km.ralt_is_mod && k == KBD_CODE_CAPSLOCK) {
+ kb->status ^= KBD_CAPS;
+ }
+
+ return make_key(kb, k);
+}
+
+key_t keyboard_release(keyboard_t *kb, int k) {
+ if (k == KBD_CODE_LSHIFT || k == KBD_CODE_RSHIFT) {
+ kb->status &= ~KBD_SHIFT;
+ } else if (k == KBD_CODE_LCTRL || k == KBD_CODE_RCTRL) {
+ kb->status &= ~KBD_CTRL;
+ } else if (k == KBD_CODE_LSUPER || k == KBD_CODE_RSUPER) {
+ kb->status &= ~KBD_SUPER;
+ } else if (k == KBD_CODE_LALT || (!kb->km.ralt_is_mod && k == KBD_CODE_RALT)) {
+ kb->status &= ~KBD_ALT;
+ } else if (kb->km.ralt_is_mod && k == KBD_CODE_RALT) {
+ kb->status &= ~KBD_MOD;
+ }
+
+ return make_key(kb, k);
+}
+
+/* vim: set ts=4 sw=4 tw=0 noet :*/
diff --git a/src/lib/libkogata/mainloop.c b/src/lib/libkogata/mainloop.c
index e7fdfa4..ece7672 100644
--- a/src/lib/libkogata/mainloop.c
+++ b/src/lib/libkogata/mainloop.c
@@ -88,14 +88,14 @@ void mainloop_run() {
}
// ---- Do the select
- dbg_printf("(mainloop) begin select\n");
+ /*dbg_printf("(mainloop) begin select\n");*/
bool ok = select(sel_arg, nfds, -1);
if (!ok) {
dbg_printf("(mainloop) Failed to select.\n");
free(sel_arg);
return;
}
- dbg_printf("(mainloop) end select\n");
+ /*dbg_printf("(mainloop) end select\n");*/
{ // Parse result
int i = 0;
@@ -107,7 +107,7 @@ void mainloop_run() {
fd->rd_buf_filled +=
read(fd->fd, 0, fd->rd_buf_expect_size - fd->rd_buf_filled, fd->rd_buf + fd->rd_buf_filled);
if (fd->rd_buf_filled == fd->rd_buf_expect_size) {
- dbg_printf("(mainloop) finish read %d\n", fd->rd_buf_expect_size);
+ /*dbg_printf("(mainloop) finish read %d\n", fd->rd_buf_expect_size);*/
fd->rd_buf_filled = 0;
ASSERT(fd->rd_on_full != 0);
fd->rd_on_full(fd);
@@ -119,7 +119,7 @@ void mainloop_run() {
fd->wr_bufs[0].written += write(fd->fd, 0, remain_size, write_ptr);
if (fd->wr_bufs[0].written == fd->wr_bufs[0].size) {
- dbg_printf("(mainloop) finish write %d\n", fd->wr_bufs[0].size);
+ /*dbg_printf("(mainloop) finish write %d\n", fd->wr_bufs[0].size);*/
if (fd->wr_bufs[0].must_free) free(fd->wr_bufs[0].buf);
for (int i = 1; i < MAINLOOP_MAX_WR_BUFS; i++) {
fd->wr_bufs[i-1] = fd->wr_bufs[i];
diff --git a/src/sysbin/login/main.c b/src/sysbin/login/main.c
index e6e5290..3c02a4b 100644
--- a/src/sysbin/login/main.c
+++ b/src/sysbin/login/main.c
@@ -5,6 +5,7 @@
#include <gip.h>
#include <draw.h>
+#include <keyboard.h>
typedef struct {
fb_info_t mode;
@@ -40,9 +41,13 @@ gip_handler_callbacks_t loginc_cb = {
.fd_error = c_fd_error,
};
+keyboard_t *kb;
+
int main(int argc, char **argv) {
dbg_print("[login] Starting up.\n");
+ kb = init_keyboard();
+
loginc_t loginc;
memset(&loginc, 0, sizeof(loginc));
@@ -103,9 +108,12 @@ void c_buffer_info(gip_handler_t *s, gip_msg_header *p, gip_buffer_info_msg *m)
}
void c_key_down(gip_handler_t *s, gip_msg_header *p) {
+ keyboard_press(kb, p->arg);
}
void c_key_up(gip_handler_t *s, gip_msg_header *p) {
+ key_t k = keyboard_release(kb, p->arg);
+ if (k.chr) dbg_printf("%c", k.chr);
}
void c_unknown_msg(gip_handler_t *s, gip_msg_header *p) {