aboutsummaryrefslogtreecommitdiff
path: root/layouts/community/ergodox
diff options
context:
space:
mode:
authorIvan Smirnov <isgsmirnov@gmail.com>2019-11-08 19:17:21 -0800
committerJames Young <18669334+noroadsleft@users.noreply.github.com>2019-11-08 19:17:21 -0800
commit2b30776dd0f6dc6571fb741113bc71cea578b971 (patch)
tree9ad71df7d21d7bc75c42ad85d9bcbff136ec06b5 /layouts/community/ergodox
parent5414ff709f2ab6f47b722a70aa2c4d18bed7c458 (diff)
downloadqmk_firmware-2b30776dd0f6dc6571fb741113bc71cea578b971.tar.gz
qmk_firmware-2b30776dd0f6dc6571fb741113bc71cea578b971.zip
[Keymap] Add issmirnov {user, ergodox, levinson} files. (#7239)
* Add issmirnov {user, ergodox, levinson} files. There are enough interesting QMK tricks in these layouts that it seems worth it to share with the broader community. Big thanks to Drashna for inspiration, as well as all the wonderful creators of QMK documentation. Some highlights: - Common layout shared between levinson and ergodox_ez - TAP_TOG macro for fast layer switching - Autogenerated keymaps ascii art with git hooks I will do my best to do periodic rolls here, but the source of truth will always be https://github.com/issmirnov/qmk-keebs * Incorporate review feedback. - Remove CLEAR_EEPROM in favor of built in EEP_RST - Remove custom handlers for audio on bootup and shutdown - Remove plethora of unneeded includes - Remove deprecated and dupliated config options HUGE thanks to drashna for the review! * Apply suggestions from code review Huge thanks to drashna@ for a very thorough review and the very useful suggestions. Co-Authored-By: Drashna Jaelre <drashna@live.com> * Remove unclear optimization This was an artifact from some other keymap I saw.
Diffstat (limited to 'layouts/community/ergodox')
-rw-r--r--layouts/community/ergodox/issmirnov/README.md49
-rw-r--r--layouts/community/ergodox/issmirnov/asci-keymap.txt95
-rwxr-xr-xlayouts/community/ergodox/issmirnov/build.sh2
-rw-r--r--layouts/community/ergodox/issmirnov/config.h3
-rw-r--r--layouts/community/ergodox/issmirnov/keymap.c250
-rwxr-xr-xlayouts/community/ergodox/issmirnov/push.sh2
-rw-r--r--layouts/community/ergodox/issmirnov/template.txt17
7 files changed, 418 insertions, 0 deletions
diff --git a/layouts/community/ergodox/issmirnov/README.md b/layouts/community/ergodox/issmirnov/README.md
new file mode 100644
index 000000000..564edfe31
--- /dev/null
+++ b/layouts/community/ergodox/issmirnov/README.md
@@ -0,0 +1,49 @@
1# Ivan's Ergodox Config
2
3
4## Details about the layout
5
6- Shift and Cmd are One Shot Modifiers, so tapping them once will apply them to the next key. When tapped twice they will lock, until tapped again to clear.
7- When switching to other layers, any stuck modifiers are cleared in order to avoid unintended key combos
8- There are a few leader key combinations. Right now, `KC_LEAD` + `s` will open my wiki homepage.
9- All transparent keys have been replaced with noops to avoid layer bleeding.
10
11## Initial Setup
12
13### QMK
14
15```
16brew tap osx-cross/avr
17brew tap PX4/homebrew-px4
18brew update
19brew install avr-gcc
20brew install dfu-programmer
21brew install gcc-arm-none-eabi
22brew install avrdude
23
24git clone https://github.com/qmk/qmk_firmware.git
25git clone https://github.com/issmirnov/ergodox-layout.git \
26 layouts/community/ergodox/ismirnov
27```
28
29### Teensy utils
30
31Download and add both of these to $PATH
32
33- [hid_listen](https://www.pjrc.com/teensy/hid_listen.html)
34- [teensy loader cli](https://www.pjrc.com/teensy/loader_cli.html)
35
36## Flashing
37
38```
39make ergodox_ez:ismirnov
40teensy_loader_cli -mmcu=atmega32u4 -w -v ergodox_ez_ismirnov.hex
41
42# or just
43make ergodox_ez:ismirnov:flash
44```
45
46## Gotchas
47
48- If you get error: `dyld: Library not loaded: /usr/local/opt/isl/lib/libisl.15.dylib` then do `brew reinstall avr-gcc`
49- If `hid_listen` just prints out a ton of dots, update makefile with `CONSOLE_ENABLE = yes`
diff --git a/layouts/community/ergodox/issmirnov/asci-keymap.txt b/layouts/community/ergodox/issmirnov/asci-keymap.txt
new file mode 100644
index 000000000..9b023f664
--- /dev/null
+++ b/layouts/community/ergodox/issmirnov/asci-keymap.txt
@@ -0,0 +1,95 @@
1 Qwerty
2,--------------------------------------------. ,--------------------------------------------.
3| Escape | 1 | 2 | 3 | 4 | 5 | ! | | = | 6 | 7 | 8 | 9 | 0 | Escape |
4|--------+-----+-----+-----+-----+-----+-----| |-----+-----+-----+-----+-----+-----+--------|
5|Lctl(Spa| Q | W | E | R | T | * | | + | Y | U | I | O | P |Lgui(Spa|
6|--------+-----+-----+-----+-----+-----| | | |-----+-----+-----+-----+-----+--------|
7| Tab | A | S | D | F | G |-----| |-----| H | J | K | L |TapTo|Mo(Navi)|
8|--------+-----+-----+-----+-----+-----| / | | - |-----+-----+-----+-----+-----+--------|
9|Osm(ModL| Z | X | C | V | B | | | | N | M | . |Comma|Tg(Nu| ' |
10`--------+-----+-----+-----+-----+-----------' `-----------+-----+-----+-----+-----+--------'
11 |Ctrl |Lsft(|Lsft(| Alt | Mod | |Escap| : | % | |Lgui(|
12 `-----------------------------' ,-----------. ,-----------. `-----------------------------'
13 | | | | ← | → |
14 ,-----|-----|-----| |-----+-----+-----.
15 | | | | | ↑ | | |
16 | ⎵ | ⌫ |-----| |-----| Tab |Enter|
17 | | | Del | | ↓ | | |
18 `-----------------' `-----------------'
19
20 Symb
21,--------------------------------------------. ,--------------------------------------------.
22| Escape | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | |
23|--------+-----+-----+-----+-----+-----+-----| |-----+-----+-----+-----+-----+-----+--------|
24| | - | @ | { | } | ` | * | | + | * | ! | | | % | + |Mo(Navi)|
25|--------+-----+-----+-----+-----+-----| | | |-----+-----+-----+-----+-----+--------|
26| Tab | ^ | _ | ( | ) | $ |-----| |-----| # | = | : | ; |TapTo| Dquo |
27|--------+-----+-----+-----+-----+-----| / | | - |-----+-----+-----+-----+-----+--------|
28| Lshift | < | > | [ | ] | ~ | | | | & | ? | / | \ |Tg(Nu| ' |
29`--------+-----+-----+-----+-----+-----------' `-----------+-----+-----+-----+-----+--------'
30 |Ctrl |Lsft(|Lsft(| Alt |WkspL| |Escap| : | % | | |
31 `-----------------------------' ,-----------. ,-----------. `-----------------------------'
32 | | | | ← | → |
33 ,-----|-----|-----| |-----+-----+-----.
34 | | | | | ↑ | | |
35 |WkspR| ⌫ |-----| |-----| Tab |Enter|
36 | | | Del | | ↓ | | |
37 `-----------------' `-----------------'
38
39 Nump
40,--------------------------------------------. ,--------------------------------------------.
41| | | | | | | | | = | | | | | | Reset |
42|--------+-----+-----+-----+-----+-----+-----| |-----+-----+-----+-----+-----+-----+--------|
43| | No | No |Lgui(| | | * | | + | , | 7 | 8 | 9 | | |
44|--------+-----+-----+-----+-----+-----| | | |-----+-----+-----+-----+-----+--------|
45| Tab | |Lgui(|Lgui(|Lgui(| |-----| |-----| 0 | 4 | 5 | 6 |To(Sy| |
46|--------+-----+-----+-----+-----+-----| / | | - |-----+-----+-----+-----+-----+--------|
47| | | | |Audio|Audio| | | | . | 1 | 2 | 3 |To(Qw| |
48`--------+-----+-----+-----+-----+-----------' `-----------+-----+-----+-----+-----+--------'
49 |To(0)| | | | | | 0 | | |To(3)| |
50 `-----------------------------' ,-----------. ,-----------. `-----------------------------'
51 | | | | ← | → |
52 ,-----|-----|-----| |-----+-----+-----.
53 | | | | | ↑ | | |
54 | ⎵ | ⌫ |-----| |-----| Alt |Shift|
55 | | | Del | | ↓ | | |
56 `-----------------' `-----------------'
57
58 Overwatch
59,--------------------------------------------. ,--------------------------------------------.
60| Escape | 1 | 2 | 3 | 4 | 5 |To(0)| | | | | | | | |
61|--------+-----+-----+-----+-----+-----+-----| |-----+-----+-----+-----+-----+-----+--------|
62| Tab | Q | W | E | R | T | | | | | | | | | |
63|--------+-----+-----+-----+-----+-----| | | |-----+-----+-----+-----+-----+--------|
64| Ctrl | A | S | D | F | P |-----| |-----| | | | | | |
65|--------+-----+-----+-----+-----+-----| | | |-----+-----+-----+-----+-----+--------|
66| Lshift | Z | X | C | V |Grave| | | | | | | | | |
67`--------+-----+-----+-----+-----+-----------' `-----------+-----+-----+-----+-----+--------'
68 |Ctrl | F9 |Pscre| H | R | | | | | | |
69 `-----------------------------' ,-----------. ,-----------. `-----------------------------'
70 | | | | | |
71 ,-----|-----|-----| |-----+-----+-----.
72 | | | | | | | |
73 | ⎵ | |-----| |-----| | |
74 | | | | | | | |
75 `-----------------' `-----------------'
76
77 Navi
78,--------------------------------------------. ,--------------------------------------------.
79| Escape | 1 | 2 | 3 | 4 | 5 | 6 | | | | | | | | |
80|--------+-----+-----+-----+-----+-----+-----| |-----+-----+-----+-----+-----+-----+--------|
81| | | | ↑ | | | | | | | | | | | |
82|--------+-----+-----+-----+-----+-----| | | |-----+-----+-----+-----+-----+--------|
83| | | ← | ↓ | → | |-----| |-----| |Ctrl | | | | |
84|--------+-----+-----+-----+-----+-----| | | |-----+-----+-----+-----+-----+--------|
85| | | | | | | | | | | | | | | |
86`--------+-----+-----+-----+-----+-----------' `-----------+-----+-----+-----+-----+--------'
87 | | | | |WkspL| | ⌘⇧ | | | | |
88 `-----------------------------' ,-----------. ,-----------. `-----------------------------'
89 | | | | | |
90 ,-----|-----|-----| |-----+-----+-----.
91 | | | | | | | |
92 |WkspR| |-----| |-----| | Mod |
93 | | | | | | | |
94 `-----------------' `-----------------'
95
diff --git a/layouts/community/ergodox/issmirnov/build.sh b/layouts/community/ergodox/issmirnov/build.sh
new file mode 100755
index 000000000..7bb694d8a
--- /dev/null
+++ b/layouts/community/ergodox/issmirnov/build.sh
@@ -0,0 +1,2 @@
1#!/bin/bash
2make ergodox_ez:issmirnov
diff --git a/layouts/community/ergodox/issmirnov/config.h b/layouts/community/ergodox/issmirnov/config.h
new file mode 100644
index 000000000..fe62a7d1d
--- /dev/null
+++ b/layouts/community/ergodox/issmirnov/config.h
@@ -0,0 +1,3 @@
1// Reference: https://beta.docs.qmk.fm/reference/config-options
2// and https://github.com/qmk/qmk_firmware/blob/master/docs/config_options.md
3#include QMK_KEYBOARD_CONFIG_H
diff --git a/layouts/community/ergodox/issmirnov/keymap.c b/layouts/community/ergodox/issmirnov/keymap.c
new file mode 100644
index 000000000..ce853f3d3
--- /dev/null
+++ b/layouts/community/ergodox/issmirnov/keymap.c
@@ -0,0 +1,250 @@
1#include QMK_KEYBOARD_H
2
3// Custom user includes
4#include "issmirnov.h"
5#include "tap_tog.h"
6
7const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
8[_QWERTY] = LAYOUT_ergodox_wrapper(
9KC_ESCAPE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_EXLM,
10LCTL(KC_SPACE), _________________QWERTY_L1_________________, KC_ASTR,
11KC_TAB, _________________QWERTY_L2_________________,
12OSM(MOD_LSFT), _________________QWERTY_L3_________________, KC_SLASH,
13KC_LCTL, LSFT(KC_LGUI), LSFT(KC_LALT), KC_LALT, KC_LGUI,
14 XXXXXXX, XXXXXXX,
15 XXXXXXX,
16 KC_SPACE, KC_BSPACE, KC_DEL,
17
18KC_EQL , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_ESCAPE ,
19KC_PLUS , _________________QWERTY_R1_________________ , LGUI(KC_SPACE) ,
20 _________________QWERTY_R2_________________ , MO(_NAVI) ,
21KC_MINS , _________________QWERTY_R3_________________ , KC_QUOTE ,
22KC_ESCAPE , KC_COLN , KC_PERC , XXXXXXX , LGUI(KC_L) ,
23
24KC_LEFT, KC_RGHT,
25KC_UP,
26KC_DOWN, KC_TAB, KC_ENTER
27),
28
29 // layer 1
30[_SYMB] = LAYOUT_ergodox_wrapper(
31KC_ESCAPE , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 ,
32XXXXXXX , _________________SYMB_L1___________________ ,KC_ASTR ,
33KC_TAB , _________________SYMB_L2___________________,
34KC_LSHIFT , _________________SYMB_L3___________________, KC_SLASH ,
35KC_LCTL , LSFT(KC_LGUI) , LSFT(KC_LALT) , KC_LALT , WKSP_LEFT ,
36
37 XXXXXXX, XXXXXXX,
38 XXXXXXX,
39 WKSP_RIGHT, KC_BSPACE, KC_DEL,
40
41KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , XXXXXXX ,
42KC_PLUS , _________________SYMB_R1___________________ , MO(_NAVI) ,
43 _________________SYMB_R2___________________ , KC_DQUO ,
44KC_MINS , _________________SYMB_R3___________________ , KC_QUOTE ,
45KC_ESCAPE , KC_COLN , KC_PERC , XXXXXXX , XXXXXXX ,
46
47KC_LEFT, KC_RGHT,
48KC_UP,
49KC_DOWN, KC_TAB, KC_ENTER
50),
51
52 // layer 2
53[_NUMP] = LAYOUT_ergodox_wrapper(
54XXXXXXX , ___________________XXXXX___________________, XXXXXXX ,
55XXXXXXX , _________________NUMP_L1___________________ , KC_ASTR ,
56KC_TAB , _________________NUMP_L2___________________ ,
57XXXXXXX , _________________NUMP_L3___________________ , KC_SLASH ,
58TO(0) , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
59
60 XXXXXXX , XXXXXXX ,
61 XXXXXXX ,
62 KC_SPACE , KC_BSPACE , KC_DEL ,
63
64KC_EQL , ___________________XXXXX___________________ , RESET ,
65KC_PLUS , _________________NUMP_R1___________________ , XXXXXXX ,
66 _________________NUMP_R2___________________ , XXXXXXX ,
67KC_MINS , _________________NUMP_R3___________________ , XXXXXXX ,
68 KC_0 , XXXXXXX , XXXXXXX , TO(3) , XXXXXXX ,
69
70KC_LEFT, KC_RGHT,
71KC_UP,
72KC_DOWN, KC_LALT, KC_LSFT
73),
74
75 // layer 3
76[_OVERWATCH] = LAYOUT_ergodox_wrapper(
77KC_ESCAPE, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , TO(0) ,
78______________OVERWATCH_L1_________________ , XXXXXXX ,
79______________OVERWATCH_L2_________________ ,
80______________OVERWATCH_L3_________________ , XXXXXXX ,
81______________OVERWATCH_L4_________________ ,
82
83XXXXXXX , XXXXXXX ,
84XXXXXXX ,
85KC_SPACE , XXXXXXX , XXXXXXX ,
86
87
88_______, _______, _______, _______, _______, _______, _______,
89_______, _______, _______, _______, _______, _______, _______,
90 _______, _______, _______, _______, _______, _______,
91_______, _______, _______, _______, _______, _______, _______,
92_______, _______, _______, _______, _______,
93
94_______, _______,
95_______,
96_______, _______, _______
97
98),
99// layer 4
100[_NAVI] = LAYOUT_ergodox_wrapper(
101KC_ESCAPE, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 ,
102XXXXXXX, _________________NAVI_L1___________________ , XXXXXXX ,
103XXXXXXX, _________________NAVI_L2___________________ ,
104XXXXXXX, _________________NAVI_L3___________________ , XXXXXXX ,
105XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, WKSP_LEFT,
106
107XXXXXXX , XXXXXXX ,
108XXXXXXX ,
109WKSP_RIGHT , XXXXXXX , XXXXXXX ,
110
111
112_______, _______, _______, _______, _______, _______, _______,
113_______, _________________NAVI_R1___________________, _______,
114 _________________NAVI_R2___________________, _______,
115_______, _________________NAVI_R3___________________, _______,
116MODSFT, _______, _______, _______, _______,
117
118_______, _______,
119_______,
120_______, _______, KC_LGUI
121
122),
123};
124
125
126// called by QMK during key processing before the actual key event is handled. Useful for macros.
127bool process_record_user(uint16_t keycode, keyrecord_t *record) {
128 uint8_t layer = biton32(layer_state);
129 switch (keycode) {
130 case TAP_TOG_LAYER:
131 process_tap_tog(_SYMB,record);
132 return false;
133 break;
134
135 case WKSP_LEFT:
136 // Only if TAP_TOG_LAYER is being held right now do we want to do actions.
137 if (record->event.pressed && (!tap_tog_layer_toggled_on || layer == _NAVI)) {
138 tap_code16(LGUI(LSFT(KC_Z)));
139 tap_tog_layer_other_key_pressed = true; // Add flag so layer resets
140 }
141 break;
142 case WKSP_RIGHT:
143 // Only if TAP_TOG_LAYER is being held right now do we want to do actions.
144 if (record->event.pressed && (!tap_tog_layer_toggled_on || layer == _NAVI)) {
145 tap_code16(LGUI(LSFT(KC_X)));
146 tap_tog_layer_other_key_pressed = true; // Add flag so layer resets
147 }
148 break;
149 default:
150 tap_tog_count = 0; // reset counter.
151 tap_tog_layer_other_key_pressed = true; // always set this to true, TAP_TOG_LAYER handlers will handle interpreting this
152 break;
153 }
154 return true;
155}
156
157// Runs constantly in the background, in a loop every 100ms or so.
158// Best used for LED status output triggered when user isn't actively typing.
159void matrix_scan_user(void) {
160 uint8_t layer = biton32(layer_state);
161 if (layer == 0) {
162 // Set up LED indicators for stuck modifier keys.
163 // https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/report.h#L118
164 switch (keyboard_report->mods) {
165 case MOD_BIT(KC_LSFT): // LSHIFT
166 ergodox_right_led_1_set (LED_BRIGHTNESS_LO);
167 ergodox_right_led_1_on ();
168 ergodox_right_led_2_set (LED_BRIGHTNESS_LO);
169 ergodox_right_led_2_on ();
170 ergodox_right_led_3_set (LED_BRIGHTNESS_HI);
171 ergodox_right_led_3_off ();
172 break;
173
174 case MOD_BIT(KC_LGUI): // LGUI
175 ergodox_right_led_1_set (LED_BRIGHTNESS_HI);
176 ergodox_right_led_1_off ();
177 ergodox_right_led_2_set (LED_BRIGHTNESS_LO);
178 ergodox_right_led_2_on ();
179 ergodox_right_led_3_set (LED_BRIGHTNESS_LO);
180 ergodox_right_led_3_on ();
181 break;
182
183 case MOD_BIT(KC_LSFT) ^ MOD_BIT(KC_LGUI):
184 ergodox_right_led_1_set (70);
185 ergodox_right_led_1_on ();
186 ergodox_right_led_2_set (70);
187 ergodox_right_led_2_on ();
188 ergodox_right_led_3_set (70);
189 ergodox_right_led_3_on ();
190 break;
191
192 default: // reset leds
193 ergodox_right_led_1_set (LED_BRIGHTNESS_HI);
194 ergodox_right_led_1_off ();
195 ergodox_right_led_2_set (LED_BRIGHTNESS_HI);
196 ergodox_right_led_2_off ();
197 ergodox_right_led_3_set (LED_BRIGHTNESS_HI);
198 ergodox_right_led_3_off ();
199 }
200 }
201}
202
203// only runs when when the layer is changed, good for updating LED's and clearing sticky state
204uint32_t layer_state_set_user(uint32_t state) {
205 uint8_t layer = biton32(state);
206
207 ergodox_board_led_off();
208 ergodox_right_led_1_off();
209 ergodox_right_led_2_off();
210 ergodox_right_led_3_off();
211
212 combo_enable(); // by default, enable combos.
213 switch (layer) {
214 case 0:
215 break;
216 case 1:
217 clear_mods();
218 ergodox_right_led_1_on();
219 break;
220 case 2:
221 clear_mods();
222 ergodox_right_led_2_on();
223 break;
224 case _OVERWATCH:
225 clear_mods();
226 combo_disable(); // We don't want combos in overwatch
227 ergodox_right_led_3_on();
228 break;
229 case 4:
230 ergodox_right_led_1_on();
231 ergodox_right_led_2_on();
232 break;
233 case 5:
234 ergodox_right_led_1_on();
235 ergodox_right_led_3_on();
236 break;
237 case 6:
238 ergodox_right_led_2_on();
239 ergodox_right_led_3_on();
240 break;
241 case 7:
242 ergodox_right_led_1_on();
243 ergodox_right_led_2_on();
244 ergodox_right_led_3_on();
245 break;
246 default:
247 break;
248 }
249 return state;
250};
diff --git a/layouts/community/ergodox/issmirnov/push.sh b/layouts/community/ergodox/issmirnov/push.sh
new file mode 100755
index 000000000..1a6c7c447
--- /dev/null
+++ b/layouts/community/ergodox/issmirnov/push.sh
@@ -0,0 +1,2 @@
1#!/bin/bash
2make ergodox_ez:issmirnov:teensy
diff --git a/layouts/community/ergodox/issmirnov/template.txt b/layouts/community/ergodox/issmirnov/template.txt
new file mode 100644
index 000000000..35c7920a1
--- /dev/null
+++ b/layouts/community/ergodox/issmirnov/template.txt
@@ -0,0 +1,17 @@
1,--------------------------------------------. ,--------------------------------------------.
2| 0 | 1 | 2 | 3 | 4 | 5 | 6 | | 38 | 39 | 40 | 41 | 42 | 43 | 44 |
3|--------+-----+-----+-----+-----+-----+-----| |-----+-----+-----+-----+-----+-----+--------|
4| 7 | 8 | 9 | 10 | 11 | 12 | 13 | | 45 | 46 | 47 | 48 | 49 | 50 | 51 |
5|--------+-----+-----+-----+-----+-----| | | |-----+-----+-----+-----+-----+--------|
6| 14 | 15 | 16 | 17 | 18 | 19 |-----| |-----| 52 | 53 | 54 | 55 | 56 | 57 |
7|--------+-----+-----+-----+-----+-----| 26 | | 58 |-----+-----+-----+-----+-----+--------|
8| 20 | 21 | 22 | 23 | 24 | 25 | | | | 59 | 60 | 61 | 62 | 63 | 64 |
9`--------+-----+-----+-----+-----+-----------' `-----------+-----+-----+-----+-----+--------'
10 | 27 | 28 | 29 | 30 | 31 | | 65 | 66 | 67 | 68 | 69 |
11 `-----------------------------' ,-----------. ,-----------. `-----------------------------'
12 | 32 | 33 | | 70 | 71 |
13 ,-----|-----|-----| |-----+-----+-----.
14 | | | 34 | | 72 | | |
15 | 35 | 36 |-----| |-----| 74 | 75 |
16 | | | 37 | | 73 | | |
17 `-----------------' `-----------------'