From 4ebd27002a344b017276dc70796435a8e718f46a Mon Sep 17 00:00:00 2001
From: listofoptions <39714365+listofoptions@users.noreply.github.com>
Date: Mon, 26 Nov 2018 12:53:49 -0500
Subject: [PATCH] Keyboard: 5291 firmware to replace the existing soarers
 controller firmware (#4483)

* compiles but is not working

* still testing 5291

* compiles but is not working

* still testing 5291

* fixed a but in the layout (reversed key order in row)

* compiles but is not working

* still testing 5291

* fixed a but in the layout (reversed key order in row)

* fixed some issues

* doumentation needed

* doumentation needed

* documentation needed

* documentation needed

* Update readme.md

documentation

* Update readme.md

i dislike markdown <_>

* merge preperation
---
 keyboards/converter/ibm_5291/config.h         |  42 +++
 keyboards/converter/ibm_5291/ibm_5291.c       |   3 +
 keyboards/converter/ibm_5291/ibm_5291.h       |  69 +++++
 keyboards/converter/ibm_5291/info.json        |   6 +
 .../ibm_5291/keymaps/default/keymap.c         | 233 ++++++++++++++
 .../keymaps/kbdbabel_doc_ibm5291_kbd.pdf      | Bin 0 -> 13054 bytes
 keyboards/converter/ibm_5291/matrix.c         | 284 ++++++++++++++++++
 keyboards/converter/ibm_5291/matrix.csv       |  96 ++++++
 keyboards/converter/ibm_5291/readme.md        |  70 +++++
 keyboards/converter/ibm_5291/rules.mk         |  72 +++++
 10 files changed, 875 insertions(+)
 create mode 100644 keyboards/converter/ibm_5291/config.h
 create mode 100644 keyboards/converter/ibm_5291/ibm_5291.c
 create mode 100644 keyboards/converter/ibm_5291/ibm_5291.h
 create mode 100644 keyboards/converter/ibm_5291/info.json
 create mode 100644 keyboards/converter/ibm_5291/keymaps/default/keymap.c
 create mode 100644 keyboards/converter/ibm_5291/keymaps/kbdbabel_doc_ibm5291_kbd.pdf
 create mode 100644 keyboards/converter/ibm_5291/matrix.c
 create mode 100644 keyboards/converter/ibm_5291/matrix.csv
 create mode 100644 keyboards/converter/ibm_5291/readme.md
 create mode 100644 keyboards/converter/ibm_5291/rules.mk

diff --git a/keyboards/converter/ibm_5291/config.h b/keyboards/converter/ibm_5291/config.h
new file mode 100644
index 0000000000..5c9ca1e4a9
--- /dev/null
+++ b/keyboards/converter/ibm_5291/config.h
@@ -0,0 +1,42 @@
+/*
+Copyright 2018 listofoptions <listofoptions@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+#define VENDOR_ID           0xFEED
+#define PRODUCT_ID          0x6060
+#define DEVICE_VER          1
+#define MANUFACTURER        QMK
+#define PRODUCT             5291 keyboard converter
+#define DESCRIPTION         5291 keyboard converter
+
+#define MATRIX_ROWS         24
+#define MATRIX_COLS         4
+
+#define MATRIX_ROW_PINS   {B2, B3, B4, B5, B6}
+#define MATRIX_COL_PINS   {B0, B1}
+#define MATRIX_DATA_PIN   D0
+#define MATRIX_STROBE_PIN D1
+#define LED_PIN           D6
+
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCING_DELAY    0
+
+
diff --git a/keyboards/converter/ibm_5291/ibm_5291.c b/keyboards/converter/ibm_5291/ibm_5291.c
new file mode 100644
index 0000000000..9b937a545a
--- /dev/null
+++ b/keyboards/converter/ibm_5291/ibm_5291.c
@@ -0,0 +1,3 @@
+#include "ibm_5291.h"
+#include <avr/io.h>
+#include "quantum.h"
\ No newline at end of file
diff --git a/keyboards/converter/ibm_5291/ibm_5291.h b/keyboards/converter/ibm_5291/ibm_5291.h
new file mode 100644
index 0000000000..aa1b403242
--- /dev/null
+++ b/keyboards/converter/ibm_5291/ibm_5291.h
@@ -0,0 +1,69 @@
+/*
+Copyright 2018 listofoptions <listofoptions@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#include "quantum.h"
+
+/*
+ * ,-------.  ,--------------------------------------------------------------------------.
+ * | F1| F2|  |Esc|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|  BS  |NumLck |ScrLck |
+ * |-------|  |--------------------------------------------------------------------------|
+ * | F3| F4|  | Tab |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ] |   |  7|  8|  9|  -|
+ * |-------|  |------------------------------------------------------|Ent|---------------|
+ * | F5| F6|  | Ctrl |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|  `|   |  4|  5|  6|   |
+ * |-------|  |----------------------------------------------------------------------|   |
+ * | F7| F8|  |Shif|  \|  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|Shift|PrS|  1|  2|  3|  +|
+ * |-------|  |----------------------------------------------------------------------|   |
+ * | F9|F10|  |  Alt  |               Space                  |CapsLck|   0   |   .   |   |
+ * `-------'  `--------------------------------------------------------------------------'
+*/
+
+#define LAYOUT_5291( \
+    KEY_F1,KEY_F2,  KEY_ESC, KEY_1,   KEY_2,KEY_3,KEY_4,KEY_5,KEY_6,KEY_7,KEY_8,KEY_9,   KEY_0,   KEY_MIN, KEY_EQU,  KEY_BACK,         KEY_NLOCK,         KEY_SLOCK, \
+    KEY_F3,KEY_F4,  KEY_TAB, KEY_Q,   KEY_W,KEY_E,KEY_R,KEY_T,KEY_Y,KEY_U,KEY_I,KEY_O,   KEY_P,   KEY_LBRC,KEY_RBRC,          KEY_PAD7,KEY_PAD8, KEY_PAD9,KEY_PMIN,  \
+    KEY_F5,KEY_F6,  KEY_LCTR,KEY_A,   KEY_S,KEY_D,KEY_F,KEY_G,KEY_H,KEY_J,KEY_K,KEY_L,   KEY_SEMI,KEY_QUOT,KEY_TICK, KEY_ENTR,KEY_PAD4,KEY_PAD5, KEY_PAD6,           \
+    KEY_F7,KEY_F8,  KEY_LSFS,KEY_BSLS,KEY_Z,KEY_X,KEY_C,KEY_V,KEY_B,KEY_N,KEY_M,KEY_COMM,KEY_DOT, KEY_SLS,KEY_RSFS, KEY_PAST,KEY_PAD1,KEY_PAD2, KEY_PAD3,KEY_PPLS,  \
+    KEY_F9,KEY_F10, KEY_LALT,                              KEY_SPACE,                                     KEY_CLOCK,         KEY_PAD0,          KEY_PDOT            \
+) \
+{ {KEY_Z,     KEY_S,   KEY_W,   KEY_3     }\
+, {KEY_X,     KEY_D,   KEY_E,   KEY_4     }\
+, {KEY_C,     KEY_F,   KEY_R,   KEY_5     }\
+, {KEY_V,     KEY_G,   KEY_T,   KEY_6     }\
+, {KEY_B,     KEY_H,   KEY_Y,   KEY_7     }\
+, {KEY_N,     KEY_J,   KEY_U,   KEY_8     }\
+, {KEY_PAD2,  KEY_PAD5,KEY_PAD8,KEY_NLOCK }\
+, {KEY_M,     KEY_K,   KEY_I,   KEY_9     }\
+, {KEY_COMM,  KEY_L,   KEY_O,   KEY_0     }\
+, {KEY_DOT,   KEY_SEMI,KEY_P,   KEY_MIN   }\
+, {KEY_SLS,   KEY_QUOT,KEY_LBRC,KEY_EQU   }\
+, {KEY_SPACE, KEY_RSFS,KEY_TICK,KEY_RBRC  }\
+, {KEY_CLOCK, KEY_PAST,KEY_ENTR,KEY_BACK  }\
+, {KEY_PAD0,  KEY_PAD1,KEY_PAD4,KEY_PAD7  }\
+, {KEY_PPLS,  KC_NO,   KEY_PMIN,KEY_SLOCK }\
+, {KEY_PDOT,  KEY_PAD3,KEY_PAD6,KEY_PAD9  }\
+, {KEY_BSLS,  KEY_A,   KEY_Q,   KEY_2     }\
+, {KEY_LALT,  KC_NO,   KC_NO,   KEY_1     }\
+, {KEY_F7,    KEY_F5,  KEY_F3,  KEY_F1    }\
+, {KEY_F8,    KEY_F6,  KEY_F4,  KEY_F2    }\
+, {KC_F10,    KC_NO,   KC_NO,   KC_NO     }\
+, {KC_F9,     KC_NO,   KC_NO,   KC_NO     }\
+, {KEY_LSFS,  KEY_LCTR,KEY_TAB, KEY_ESC   }\
+, {KC_NO,     KC_NO,   KC_NO,   KC_NO     }\
+}
+
+#define LAYOUT LAYOUT_5291
\ No newline at end of file
diff --git a/keyboards/converter/ibm_5291/info.json b/keyboards/converter/ibm_5291/info.json
new file mode 100644
index 0000000000..080a16336e
--- /dev/null
+++ b/keyboards/converter/ibm_5291/info.json
@@ -0,0 +1,6 @@
+{
+  "keyboard_name": "IBM 5291",
+  "keyboard_folder": "converter/5291",
+  "url": "https://deskthority.net/wiki/IBM_Model_F#IBM_5291_Keyboard",
+  "maintainer": "listofoptions",
+}
diff --git a/keyboards/converter/ibm_5291/keymaps/default/keymap.c b/keyboards/converter/ibm_5291/keymaps/default/keymap.c
new file mode 100644
index 0000000000..9b286c887d
--- /dev/null
+++ b/keyboards/converter/ibm_5291/keymaps/default/keymap.c
@@ -0,0 +1,233 @@
+/*
+Copyright 2018 listofoptions <listofoptions@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include QMK_KEYBOARD_H
+/*
+enum xt_keycodes
+    { XT_PAST = SAFE_RANGE // XT pad asterisk / print screen
+    , XT_SLCK              // XT scroll lock / break
+    , XT_F6                // F6 / app key
+    , XT_F5                // F5 / gui
+    , XT_F9                // F9 / F11
+    , XT_F10               // F10 / F12
+    } ;
+    
+static bool shift_pressed   = false ,
+            alt_pressed     = false ,
+            ctrl_pressed    = false ,
+            xt_pscr_pressed = false ,
+            xt_brk_pressed  = false ,
+            xt_app_pressed  = false ,
+            xt_gui_pressed  = false ,
+            xt_lout_pressed = false ,
+            xt_f11_pressed  = false ,
+            xt_f12_pressed  = false ;
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+  switch (keycode) {
+    case KC_LSFT:
+    case KC_RSFT:
+        if (record->event.pressed) {
+            shift_pressed = true ;
+        } else {
+            shift_pressed = false ;
+        }
+        return true;
+        break;
+        
+    case KC_LALT:
+        if (record->event.pressed) {
+            alt_pressed = true ;
+        } else {
+            alt_pressed = false ;
+        }
+        return true;
+        break;
+        
+    case KC_LCTL:
+        if (record->event.pressed) {
+            ctrl_pressed = true ;
+        } else {
+            ctrl_pressed = false ;
+        }
+        return true;
+        break;
+    
+    case XT_PAST:
+        if (record->event.pressed) {
+            if (shift_pressed) {
+                xt_pscr_pressed = true ;
+                register_code(KC_PSCR);
+            } else {
+                register_code(KC_PAST);
+            }
+        } else {
+            if (xt_pscr_pressed) {
+                xt_pscr_pressed = false ;
+                unregister_code(KC_PSCR);
+            } else {
+                unregister_code(KC_PAST);
+            }
+        }
+        return false;
+        break;
+      
+    case XT_SLCK:
+        if (record->event.pressed) {
+            if (ctrl_pressed) {
+                xt_brk_pressed  = true ;
+                register_code(KC_BRK);
+            } else {
+                register_code(KC_SLCK);
+            }
+        } else {
+            if (xt_brk_pressed) {
+                xt_brk_pressed  = false ;
+                unregister_code(KC_BRK);
+            } else {
+                unregister_code(KC_SLCK);
+            }
+        }
+        return false;
+        break;
+    
+    case XT_F6:
+        if (record->event.pressed) {
+            if (shift_pressed) {
+                xt_app_pressed = true ;
+                register_code(KC_APP);
+            } else {
+                register_code(KC_F6);
+            }
+        } else {
+            if (xt_app_pressed) {
+                xt_app_pressed = false ;
+                unregister_code(KC_APP);
+            } else {
+                unregister_code(KC_F6);
+            }
+        }
+        return false;
+        break;
+    
+    case XT_F5:
+        if (record->event.pressed) {
+            if (shift_pressed) {
+                xt_gui_pressed = true ;
+                register_code(KC_LGUI);
+            } else if (ctrl_pressed) {
+                xt_lout_pressed = true ;
+                register_code (KC_LGUI) ;
+                register_code (KC_L)    ;
+            } else {
+                register_code(KC_F5);
+            }
+        } else {
+            if (xt_gui_pressed) {
+                xt_gui_pressed = false ;
+                unregister_code(KC_LGUI);
+            } else if (xt_lout_pressed) {
+                xt_lout_pressed = false ;
+                unregister_code (KC_LGUI) ;
+                unregister_code (KC_L)    ;
+            } else {
+                unregister_code(KC_F5);
+            }
+        }
+        return false;
+        break;
+    
+    case XT_F9:
+        if (record->event.pressed) {
+            if (shift_pressed) {
+                xt_f11_pressed = true ;
+                register_code(KC_F11);
+            } else {
+                register_code(KC_F9);
+            }
+        } else {
+            if (xt_f11_pressed) {
+                xt_f11_pressed = false ;
+                unregister_code(KC_F11);
+            } else {
+                unregister_code(KC_F9);
+            }
+        }
+        return false;
+        break;
+    
+    case XT_F10:
+        if (record->event.pressed) {
+            if (shift_pressed) {
+                xt_f12_pressed = true ;
+                register_code(KC_F12);
+            } else {
+                register_code(KC_F10);
+            }
+        } else {
+            if (xt_f12_pressed) {
+                xt_f12_pressed = false ;
+                unregister_code(KC_F12);
+            } else {
+                unregister_code(KC_F10);
+            }
+        }
+        return false;
+        break;
+    
+    default:
+        return true;
+        break;
+  }
+  
+  return true;
+}
+*/
+    
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+// default layout is the standard XT layout
+/*
+ * ,-------.  ,--------------------------------------------------------------------------.
+ * | F1| F2|  |Esc|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|  BS  |NumLck |ScrLck |
+ * |-------|  |--------------------------------------------------------------------------|
+ * | F3| F4|  | Tab |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ] |   |  7|  8|  9|  -|
+ * |-------|  |------------------------------------------------------|Ent|---------------|
+ * | F5| F6|  | Ctrl |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|  `|   |  4|  5|  6|   |
+ * |-------|  |----------------------------------------------------------------------|   |
+ * | F7| F8|  |Shif|  \|  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|Shift|  *|  1|  2|  3|  +|
+ * |-------|  |----------------------------------------------------------------------|   |
+ * | F9|F10|  |  Alt  |               Space                  |CapsLck|   0   |   .   |   |
+ * `-------'  `--------------------------------------------------------------------------'
+*/
+/*
+    [0] = LAYOUT (
+        KC_F1,KC_F2, KC_ESC, KC_1,   KC_2,KC_3,KC_4,KC_5,KC_6,KC_7,KC_8,KC_9,   KC_0,   KC_MINS,KC_EQL, KC_BSPC,      KC_NLCK,       XT_SLCK,
+        KC_F3,KC_F4, KC_TAB, KC_Q,   KC_W,KC_E,KC_R,KC_T,KC_Y,KC_U,KC_I,KC_O,   KC_P,   KC_LBRC,KC_RBRC,        KC_P7,KC_P8,  KC_P9, KC_PMNS, 
+        XT_F5,XT_F6, KC_LCTL,KC_A,   KC_S,KC_D,KC_F,KC_G,KC_H,KC_J,KC_K,KC_L,   KC_SCLN,KC_QUOT,KC_GRV, KC_ENT, KC_P4,KC_P5,  KC_P6,           
+        KC_F7,KC_F8, KC_LSFT,KC_BSLS,KC_Z,KC_X,KC_C,KC_V,KC_B,KC_N,KC_M,KC_COMM,KC_DOT, KC_SLSH,KC_RSFT,XT_PAST,KC_P1,KC_P2,  KC_P3, KC_PPLS, 
+        XT_F9,XT_F10,KC_LALT,                              KC_SPACE,                                    KC_CAPS,      KC_P0,  KC_PDOT           
+    )
+*/
+    [0] = LAYOUT (
+        KC_F1,KC_F2, KC_ESC, KC_1,   KC_2,KC_3,KC_4,KC_5,KC_6,KC_7,KC_8,KC_9,   KC_0,   KC_MINS,KC_EQL, KC_BSPC,      KC_NLCK,       KC_SLCK,
+        KC_F3,KC_F4, KC_TAB, KC_Q,   KC_W,KC_E,KC_R,KC_T,KC_Y,KC_U,KC_I,KC_O,   KC_P,   KC_LBRC,KC_RBRC,        KC_P7,KC_P8,  KC_P9, KC_PMNS, 
+        KC_F5,KC_F6, KC_LCTL,KC_A,   KC_S,KC_D,KC_F,KC_G,KC_H,KC_J,KC_K,KC_L,   KC_SCLN,KC_QUOT,KC_GRV, KC_ENT, KC_P4,KC_P5,  KC_P6,           
+        KC_F7,KC_F8, KC_LSFT,KC_BSLS,KC_Z,KC_X,KC_C,KC_V,KC_B,KC_N,KC_M,KC_COMM,KC_DOT, KC_SLSH,KC_RSFT,KC_PAST,KC_P1,KC_P2,  KC_P3, KC_PPLS, 
+        KC_F9,KC_F10,KC_LALT,                              KC_SPACE,                                    KC_CAPS,      KC_P0,  KC_PDOT           
+    )
+} ;
+
diff --git a/keyboards/converter/ibm_5291/keymaps/kbdbabel_doc_ibm5291_kbd.pdf b/keyboards/converter/ibm_5291/keymaps/kbdbabel_doc_ibm5291_kbd.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..3560598f02b8bacc12ef9426875a5b7076e32eab
GIT binary patch
literal 13054
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

literal 0
HcmV?d00001

diff --git a/keyboards/converter/ibm_5291/matrix.c b/keyboards/converter/ibm_5291/matrix.c
new file mode 100644
index 0000000000..58f6e37b65
--- /dev/null
+++ b/keyboards/converter/ibm_5291/matrix.c
@@ -0,0 +1,284 @@
+/*
+Copyright 2018 listofoptions <listofoptions@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <string.h>
+#if defined(__AVR__)
+#include <avr/io.h>
+#endif
+#include <util/delay.h>
+
+#include "wait.h"
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+#include "matrix.h"
+#include "timer.h"
+
+#include "config.h"
+
+
+#ifndef DEBOUNCING_DELAY
+#   define DEBOUNCING_DELAY 5
+#endif
+
+#define print_matrix_header()      print("\nr/c 01234567\n")
+#define print_matrix_row(row)      print_bin_reverse8(matrix_get_row(row))
+#define matrix_bitpop(i)           bitpop(matrix[i])
+#define ROW_SHIFTER                ((uint8_t)1)
+#define check_bit(var,pos)         ((var) & (1<<(pos)))
+
+#define NUM_ROW_PINS 5
+#define NUM_COL_PINS 2
+
+static const uint8_t row_pins [NUM_ROW_PINS] = MATRIX_ROW_PINS ;
+static const uint8_t col_pins [NUM_ROW_PINS] = MATRIX_COL_PINS ;
+
+#if ( DEBOUNCING_DELAY > 0 )
+static uint16_t debouncing_time         ;
+static bool     debouncing      = false ;
+#endif
+
+static uint8_t matrix          [MATRIX_ROWS] = {0};
+
+#if ( DEBOUNCING_DELAY > 0 )
+static uint8_t matrix_debounce [MATRIX_ROWS] = {0};
+#endif 
+
+static
+inline
+void toggle_led(void) {
+    uint8_t pin = LED_PIN ;
+    _SFR_IO8((pin >> 4) + 2) ^= _BV(pin & 0xF);
+}
+
+static
+inline
+void init_led(void) {
+    uint8_t pin = LED_PIN ;
+    _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF);  // OUT
+    _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW
+}
+
+static
+inline
+void init_data(void) {
+    uint8_t pin = MATRIX_DATA_PIN ;
+    _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN
+    _SFR_IO8((pin >> 4) + 2) |=  _BV(pin & 0xF); // LO
+}
+
+static
+inline
+void init_strobe(void) {
+    uint8_t pin = MATRIX_STROBE_PIN ;
+    _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF);  // OUT
+    _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF);  // HI
+}
+
+static
+inline
+void init_rows(void) {
+    for ( uint8_t i = 0 ; i < NUM_ROW_PINS; ++i ) {
+        uint8_t pin = row_pins[i];
+        _SFR_IO8((pin >> 4) + 1) |=  _BV(pin & 0xF); // OUT
+        _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW
+    }
+}
+
+static
+inline
+void init_cols(void) {
+    for ( uint8_t i = 0 ; i < NUM_COL_PINS; ++i ) {
+        uint8_t pin = col_pins[i];
+        _SFR_IO8((pin >> 4) + 1) |=  _BV(pin & 0xF); // OUT
+        _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW
+    }
+}
+
+static
+inline
+void select_row(uint8_t current_row) {
+    for ( uint8_t i = 0 ; i < NUM_ROW_PINS; ++i ) {
+        uint8_t pin = row_pins[i] ;
+        if ( check_bit( current_row, i ) ) {
+            _SFR_IO8((pin >> 4) + 2) |=  _BV(pin & 0xF); // HI
+        } else {
+            _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW
+        }
+    }
+    wait_us(30) ;
+}
+
+static
+inline
+void select_col(uint8_t current_col) {
+    for ( uint8_t i = 0 ; i < NUM_COL_PINS; ++i ) {
+        uint8_t pin = col_pins[i] ;
+        if ( check_bit( current_col, i ) ) {
+            _SFR_IO8((pin >> 4) + 2) |=  _BV(pin & 0xF); // HI
+        } else {
+            _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW
+        }
+    }
+    wait_us(30) ;
+}
+
+static
+inline
+uint8_t matrix_strobe(uint8_t col_index) {
+    uint8_t strobe_pin = MATRIX_STROBE_PIN ;
+    uint8_t data_pin   = MATRIX_DATA_PIN   ;
+    
+    // set strobe pin low
+    _SFR_IO8((strobe_pin >> 4) + 2) &=  ~_BV(strobe_pin & 0xF);
+    
+    wait_us(30) ;
+    
+    // read data 
+    uint8_t data = (_SFR_IO8(data_pin >> 4) & _BV(data_pin & 0xF)) ;
+    
+    // set strobe pin hi
+    _SFR_IO8((strobe_pin >> 4) + 2) |= _BV(strobe_pin & 0xF);
+    
+    uint8_t out = data ? (1 << col_index) : 0 ;
+    return out ;
+}
+
+static
+bool matrix_read(uint8_t current_matrix[], uint8_t current_row) {
+    // Store last value of row prior to reading
+    uint8_t last_row_value = current_matrix[current_row];
+
+    // Clear data in matrix row
+    current_matrix[current_row] = 0;
+
+    select_row(current_row);
+
+    // For each col...
+    for(uint8_t col_index = 0; col_index < MATRIX_COLS; ++col_index) {
+
+        select_col(col_index) ;
+        
+        // strobe the matrix
+        // Populate the matrix row with the state of the data pin
+        current_matrix[current_row] |= matrix_strobe(col_index) ;
+    }
+
+    bool test = last_row_value != current_matrix[current_row] ;
+    return test ;
+}
+
+__attribute__ ((weak))
+void matrix_init_quantum(void) {
+    matrix_init_kb();
+}
+
+__attribute__ ((weak))
+void matrix_scan_quantum(void) {
+    matrix_scan_kb();
+}
+
+__attribute__ ((weak))
+void matrix_init_kb(void) {    
+    matrix_init_user();
+}
+
+__attribute__ ((weak))
+void matrix_scan_kb(void) {
+    matrix_scan_user();
+}
+
+__attribute__ ((weak))
+void matrix_init_user(void) {
+}
+
+__attribute__ ((weak))
+void matrix_scan_user(void) {
+}
+
+inline
+uint8_t matrix_rows(void) {
+    return MATRIX_ROWS;
+}
+
+inline
+uint8_t matrix_cols(void) {
+    return MATRIX_COLS;
+}
+
+inline
+uint8_t matrix_get_row(uint8_t row) {
+    return matrix[row];
+}
+
+void matrix_init(void) {
+    init_led()    ;   
+    init_rows()   ;
+    init_cols()   ;
+    init_data()   ;
+    init_strobe() ;
+    
+    // initialize matrix state: all keys off
+    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+        matrix[i]            = 0;
+#       if (DEBOUNCING_DELAY > 0)
+        matrix_debounce  [i] = 0;
+#       endif
+    }
+
+    matrix_init_quantum() ;
+}
+
+uint8_t matrix_scan(void) { 
+    for ( uint8_t current_row = 0; current_row < MATRIX_ROWS; ++current_row ) {
+#       if (DEBOUNCING_DELAY > 0)
+            bool matrix_changed = matrix_read(matrix_debounce, current_row);
+            
+            if (matrix_changed) {
+                debouncing      = true        ;
+                debouncing_time = timer_read();
+            }
+                        
+#       else
+            matrix_read(matrix, current_row);
+#       endif
+    }
+    
+#   if (DEBOUNCING_DELAY > 0)
+        if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) {
+            for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+                matrix[i] = matrix_debounce[i];
+            }
+            debouncing = false;
+        }
+#   endif
+
+    matrix_scan_quantum();
+    return 1;
+}
+
+void matrix_print(void) {
+    print_matrix_header();
+
+    for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+        phex(row); print(": ");
+        print_matrix_row(row);
+        print("\n");
+    }
+}
diff --git a/keyboards/converter/ibm_5291/matrix.csv b/keyboards/converter/ibm_5291/matrix.csv
new file mode 100644
index 0000000000..40462c2143
--- /dev/null
+++ b/keyboards/converter/ibm_5291/matrix.csv
@@ -0,0 +1,96 @@
+0,Z
+1,S
+2,W
+3,3
+4,X
+5,D
+6,E
+7,4
+8,C
+9,F
+10,R
+11,5
+12,V
+13,G
+14,T
+15,6
+16,B
+17,H
+18,Y
+19,7
+20,N
+21,J
+22,U
+23,8
+24,PAD_2
+25,PAD_5
+26,PAD_8
+27,NUM_LOCK
+28,M
+29,K
+30,I
+31,9
+32,COMMA
+33,L
+34,O
+35,0
+36,PERIOD
+37,SEMICOLON
+38,P
+39,MINUS
+40,SLASH
+41,QUOTE
+42,LEFT_BRACE
+43,EQUAL
+44,SPACE
+45,RSHIFT
+46,BACK_QUOTE
+47,RIGHT_BRACE
+48,CAPS_LOCK
+49,PAD_ASTERIX
+50,ENTER
+51,BACKSPACE
+52,PAD_0
+53,PAD_1
+54,PAD_4
+55,PAD_7
+56,PAD_PLUS
+57,UNASSIGNED
+58,PAD_MINUS
+59,SCROLL_LOCK
+60,PAD_PERIOD
+61,PAD_3
+62,PAD_6
+63,PAD_9
+64,BACKSLASH
+65,A
+66,Q
+67,2
+68,LALT
+69,UNASSIGNED
+70,UNASSIGNED
+71,1
+72,F7
+73,F5
+74,F3
+75,F1
+76,F8
+77,F6
+78,F4
+79,F2
+80,F10
+81,UNASSIGNED
+82,UNASSIGNED
+83,UNASSIGNED
+84,F9
+85,UNASSIGNED
+86,UNASSIGNED
+87,UNASSIGNED
+88,LSHIFT
+89,LCTRL
+90,TAB
+91,ESC
+92,UNASSIGNED
+93,UNASSIGNED
+94,UNASSIGNED
+95,UNASSIGNED
diff --git a/keyboards/converter/ibm_5291/readme.md b/keyboards/converter/ibm_5291/readme.md
new file mode 100644
index 0000000000..06ae2e994e
--- /dev/null
+++ b/keyboards/converter/ibm_5291/readme.md
@@ -0,0 +1,70 @@
+# IBM 5291 keyboard converter
+
+![5291](https://deskthority.net/wiki/IBM_Model_F#IBM_5291_Keyboard)
+
+A converter for the eponymous keyboard.
+
+Keyboard Maintainer: [Listofoptions](https://github.com/listofoptions)  
+Hardware Supported: IBM 5291, Teensy 2.0  
+
+Make example for this keyboard (after setting up your build environment):
+
+    make converter/ibm_5291:default
+    
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+
+the pinout is as follows:
+
+IBM−5291−Cable to Pinhead−14 
+
+| pin | description
+----|------------------------
+1 | GND   
+2 | NC    
+3 | GND   
+4 | GN)   
+5 | +5V   
+6 | D0    
+7 | D1    
+8 | D2    
+9 | D3    
+10| D4    
+11| D5    
+12| D6    
+13| Strobe
+14| Out   
+
+the pins on this connector are organized ![here](https://geekhack.org/index.php?action=dlattach;topic=48950.0;attach=36759;image)
+
+IBM−5291−2 Cable with DB15M connector
+
+| pin | description
+----|-------------
+|1,2,3 | GND
+|4     | +5V
+|5     | D0
+|6     | D1
+|7     | D2
+|8     | D3
+|9     | D4
+|10    | D5
+|11    | D6
+|12    | Strobe
+|13    | Out
+|14    | PE 
+|15    | NC
+
+the above connector is actually numbered so it should be easier to determine
+where the needed connections are.
+
+to connect to the teensy, the following are pins are needed (if you should choose not set your own):
+* PB0 -> PB6 are connected to D0 -> D6
+* +5V is connected to the corresponding teensy pin
+* gnd is as well, only one of the gnd pins needs to be connected though.
+* strobe is connected to pin PD1
+* data is connected to PD0
+* PE does not need to be connected to anything, but it could also be connected to gnd 
+
+sources:
+    http://www.retrocomputing.eu/documents/5291_MaintenanceLibrary.pdf
diff --git a/keyboards/converter/ibm_5291/rules.mk b/keyboards/converter/ibm_5291/rules.mk
new file mode 100644
index 0000000000..ca0c850c0b
--- /dev/null
+++ b/keyboards/converter/ibm_5291/rules.mk
@@ -0,0 +1,72 @@
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+# Bootloader
+#     This definition is optional, and if your keyboard supports multiple bootloaders of
+#     different sizes, comment this out, and the correct address will be loaded 
+#     automatically (+60). See bootloader.mk for all options.
+BOOTLOADER = halfkay
+
+# Build Options
+#   change to "no" to disable the options, or define them in the Makefile in
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = no        # Mouse keys(+4700)
+EXTRAKEY_ENABLE = no        # Audio control and System control(+450)
+CONSOLE_ENABLE = no         # Console for debug(+400)
+COMMAND_ENABLE = no         # Commands for debug and configuration
+NKRO_ENABLE = yes           # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
+MIDI_ENABLE = no            # MIDI controls
+AUDIO_ENABLE = no           # Audio output on port C6
+UNICODE_ENABLE = no         # Unicode
+BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.
+API_SYSEX_ENABLE = no
+SPLIT_KEYBOARD = no
+WAIT_FOR_USB = yes
+
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
+
+LAYOUTS_HAS_RGB = NO
+
+CUSTOM_MATRIX = yes
+SRC = matrix.c
\ No newline at end of file