Author Topic: Restoration and Customization of a Tnady TRS80  (Read 1190 times)

0 Members and 1 Guest are viewing this topic.

Offline Alectardy98

  • Thread Starter
  • Posts: 17
  • Location: United States
  • Pre Dental
Restoration and Customization of a Tnady TRS80
« on: Sun, 07 February 2021, 10:20:54 »
Here is the second big project that I have finished from start to finish and I am ready to share it with you guys. I am always looking for weird keyboards to fix up and add to the collection. When I see a sad boy who is a fixer-upper then I usually go for it. It also helps that when they are in bad condition that they are cheaper too! Anyways, while scrolling through eBay I found this keeb listed for 88.88$ and 13$ shipping.




Naturally, the first thing I did was offer the seller half that, and though most of the time I get an angry seller, this time I got sent a private offer for 48$ excluding shipping. Considering the fact that these boards have been sold for over 150$ on eBay I was happy with the price and got it sent to me. But boy oh boy, those pictures do not do it justice. It looked way worse in person, but thankfully because it's Fujitsu Leaf Spring, the switches still felt good.

The first thing I did was retro bright it, and let me tell you, that plastic is made out of some super special abs that did not like to get yellow out. For reference here is a picture of the retro bight station I have set up.



Yeah, your eyes are right, that is a 250W ceramic heating bulb inside an insulated cooler and with UV light strips. My AEK took 3 hours to completely whiten inside there with a mix of 3 percent hydrogen peroxide and a heavy poor of sodium percarbonate. This tandy took over 2 weeks, and Just for the bottom piece. but once it came out it looked soo good.



So I kept going, I threw the top piece and the keycaps in, and yes I had to wait for another 2 weeks. A watched pot never boils but you know that I had to check it like every 6 hours. But It ended up being worth it in the end, here take a look.



You might have noticed that the badge looks different from the original photo. That is because after 2 weeks in the retro-bright tank, the logo got all cloudy and weird, so I decided to stip it down to the bare metal and use Brasso to polish it up. I think it came out pretty good, and I might even like it better this way



Well now that it looked good, I had to start the conversion process. Normaly I would just add an aviator plug where the cabled came out, but the cable cam out of the bottom of the keyboard, so I was going to have to get creative to make it look good.


I decided to use a larger female aviator plug then i would normaly do and mount it sideways to be flush with the bottom of the case, After a lot of love from Mr. Dremmel, I think it cam out pretty clean,





The last thing to do now was convert it. Origionaly I thought I was going to have to bypass the controller compleatly and hand wire the thing, but after some googleing found a guy who has made an amazing collection of converters for weird protocolls in QMK. Mike McMahon, and his fork or the QMK source code can be found here https://github.com/MMcM/qmk_firmware.git

With this I had some help from NeonKnight, figuring out various things about compiling in qmk, as I am used to working with TMK, and the resulting keymap.c looks like this


Code: [Select]
#include QMK_KEYBOARD_H
#define TAP_HOLD_CAPS_DELAY 300

#define AC_FN0 M(0)                          //Test
#define AC_FN1 M(1)                          //Desktop Right
#define AC_FN2 M(2)                          //Desktop Left
#define AC_FN3 M(3)                          //New Explorer On Windows
#define AC_FN4 M(4)                          //Snip Tool Windows
#define AC_FN5 M(5)                          //V-Desktop Up
#define AC_FN6 M(6)                          //Min All
#define AC_FN7 M(7)                          //Paste
#define AC_FN8 M(8)                          //Copy All
#define AC_FN9 M(9)                          //Task Manager
#define AC_FN10 M(10)                        //Double Zero
#define AC_FN11 M(11)                        //F1


const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
            switch(id) {
            case 0:  {               //TEST
                if (record->event.pressed) {
                      return  MACRO( I(0), T(CAPS), END ) ;
}else{
                     }
            break;
        }
            case 1: {                 //Desktop Right
               if (record->event.pressed) {
                      return  MACRO( I(0), D(LGUI), D(LCTL), T(RGHT), U(LGUI), U(LCTL), END ) ;
  }else{
                     }
            break;
        }
            case 2:   {               //Desktop Left
                if (record->event.pressed) {
                      return   MACRO( I(0), D(LGUI), D(LCTL), T(LEFT), U(LGUI), U(LCTL), END ) ;
  }else{
                     }
            break;
        }
            case 3:   {               //New Explorer
                if (record->event.pressed) {
                      return  MACRO( I(0), D(LGUI), D(E), U(LGUI), U(E), END ) ;
  }else{
                    }
            break;
        }
            case 4:  {                //Snip Tool
                if (record->event.pressed) {
                      return  MACRO( I(0), D(LGUI), D(LSFT), T(S), U(LGUI), U(LSFT), END ) ;
  }else{
                     }
            break;
        }
            case 5:    {              //V-Desktop Up
               if (record->event.pressed) {
                      return  MACRO( I(0), D(LGUI), T(TAB), U(LGUI), END ) ;
  }else{
                     }
            break;
        }
            case 6:   {               //Min All
                if (record->event.pressed) {
                      return MACRO( I(0), D(LGUI), T(D), U(LGUI), END ) ;
  }else{
                    }
            break;
        }
            case 7:  {                // Paste All
                if (record->event.pressed) {
                      return MACRO( I(0), T(F2), D(LCTL), T(V), U(LCTL), END ) ;
  }else{
                    }
            break;
        }
            case 8:  {                //Copy All
                if (record->event.pressed) {
                      return  MACRO( I(0), T(F2), D(LCTL), T(A), T(C), U(LCTL), END ) ;
  }else{
                   }
            break;
        }
            case 9:  {                //Task Manager
                if (record->event.pressed) {
                      return  MACRO( I(0), D(LSFT), D(LCTL), T(ESC), U(LSFT), U(LCTL), END ) ;
  }else{
                    }
            break;
        }
            case 10:   {               //Double Zero
                if (record->event.pressed) {
                      return  MACRO( I(0), T(P0), T(P0), END ) ;
  }else{
                    }
            break;
        }
 
            case 11:   {               //F1
               if (record->event.pressed) {
                      return  MACRO( D(FN23), T(F1), U(FN23), END ) ;
  }else{
                    }
            break;
        }
}
        return MACRO_NONE;
    };



const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

   
   
  [0] = LAYOUT(
     KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, KC_PAUSE,
     KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQUAL, KC_BSPACE, KC_LALT, KC_PSCR, KC_BSLS, KC_GRV, KC_PGUP,
     KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRACKET, KC_RBRACKET, KC_HOME, TG(2), KC_NUBS, KC_KP_5, KC_KP_6,
     KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOTE, KC_ENTER, KC_RGUI, KC_UP, KC_END, KC_ZKHK, KC_PGDN,
     KC_SLCK, KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RSHIFT, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_0, KC_KP_ENTER,
     KC_SPACE
     ),
    [1] = LAYOUT(
      KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, KC_PAUSE,
      RESET, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQUAL, KC_BSPACE, KC_LALT, KC_PSCR, KC_KP_7, KC_VOLU, KC_KP_9,
      KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRACKET, KC_RBRACKET, KC_HOME, KC_NLCK, KC_MPRV, KC_MPLY, KC_MNXT,
      KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOTE, KC_ENTER, KC_RGUI, AC_FN5, KC_KP_1, KC_VOLD, KC_KP_3,
      KC_SLCK, KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RSHIFT, KC_TRNS, AC_FN2, AC_FN6, AC_FN1, KC_KP_0, KC_KP_ENTER,
      KC_SPACE
      ),
    [2] = LAYOUT(
      KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, KC_PAUSE,
      KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQUAL, KC_BSPACE, KC_LALT, KC_PSCR, KC_KP_7, KC_KP_8, KC_KP_9,
      KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRACKET, KC_RBRACKET, KC_HOME, TG(2), KC_KP_4, KC_KP_5, KC_KP_6,
      KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOTE, KC_ENTER, KC_RGUI, KC_UP, KC_KP_1, KC_KP_2, KC_KP_3,
      KC_SLCK, KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RSHIFT, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_0, KC_KP_ENTER,
      KC_SPACE
      ),
} ;

Overall I am very happy with it, and it looks and feels amazing, especially after the lube job!






Offline suicidal_orange

  • * Global Moderator
  • Posts: 4771
  • Location: England
Re: Restoration and Customization of a Tnady TRS80
« Reply #1 on: Sun, 07 February 2021, 11:26:58 »
Looks great, not sure about actually using it though - some very strange key positions in that layout...
120/100g linear Zealio R1  
GMK Hyperfuse
'Split everything' perfection  
MX Clear
SA Hack'd by Geeks     
EasyAVR mod