From f7afa69f660df859cc116742b259f9150eb39509 Mon Sep 17 00:00:00 2001 From: Daniele Verducci Date: Wed, 26 Feb 2025 08:42:33 +0100 Subject: [PATCH] WIP 40x4 LCD: support in bios and emulator, minimal test rom, schematics --- .../os/drivers/TM404A_sn76489.asm | 102 + .../os/drivers/arduino_terminal.asm | 2 +- .../software/z80-assembly/os/main.asm | 20 +- .../software/z80-assembly/os/tests/TM404A.asm | 116 + pat80-emulator/main.c | 120 +- .../4004_lcd_display.kicad_pcb | 2 + .../4004_lcd_display.kicad_prl | 83 + .../4004_lcd_display.kicad_pro | 392 ++ .../4004_lcd_display.kicad_sch | 4136 +++++++++++++++++ 9 files changed, 4934 insertions(+), 39 deletions(-) create mode 100644 pat80-computer/software/z80-assembly/os/drivers/TM404A_sn76489.asm create mode 100644 pat80-computer/software/z80-assembly/os/tests/TM404A.asm create mode 100644 pat80-io-devices/4004 lcd display/hardware/4004_lcd_display/4004_lcd_display.kicad_pcb create mode 100644 pat80-io-devices/4004 lcd display/hardware/4004_lcd_display/4004_lcd_display.kicad_prl create mode 100644 pat80-io-devices/4004 lcd display/hardware/4004_lcd_display/4004_lcd_display.kicad_pro create mode 100644 pat80-io-devices/4004 lcd display/hardware/4004_lcd_display/4004_lcd_display.kicad_sch diff --git a/pat80-computer/software/z80-assembly/os/drivers/TM404A_sn76489.asm b/pat80-computer/software/z80-assembly/os/drivers/TM404A_sn76489.asm new file mode 100644 index 0000000..e5dcc28 --- /dev/null +++ b/pat80-computer/software/z80-assembly/os/drivers/TM404A_sn76489.asm @@ -0,0 +1,102 @@ +; TM404A 40x4 characters LCD display (based on SN76489 chip) driver +; @author Daniele Verducci +; @language: Z80 ASM +; +; +; This file is part of Pat80 Memory Monitor. +; +; Pat80 Memory Monitor 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 3 of the License, or +; (at your option) any later version. +; +; Pat80 Memory Monitor 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 Pat80 Memory Monitor. If not, see . +; + +; -------------------------------------------------------------------------- +; +; This is meant to be used with a 40x4 character display (containing a dual hd44780-compatible controller) like the TM404A. +; This kind of display uses two controllers to overcome the hd44780 controllers limitation of 80 addressable characters. +; It is seen as two separate displays, and thus have two EN pins. A finer implementation would apply some deconding logic to +; an address bit to use a single port, but here we will use two different IO ports to save an IC. +; +; LCD config (IO port 0) +LCD4004_TOP2LINES_PORT: EQU IO_2 +LCD4004_BOTTOM2LINES_PORT: EQU IO_3 + + +; PIN CONNECTIONS +; +; PIN DESCRIPTION TO PAT80 BUS PIN INFO +; --------------------------------------------------------------------------------------------------- +; 1‐8 DB7‐DB0 DATA BUS +; 9 E1 (chip en 1) IOEN on LCD_TOP2LINES_PORT Chip enable for top 2 lines +; 10 R/W IOWR +; 11 RS A4 0: Command, 1: Data +; 12 V0 - Power supply for contrast (approx. +0.5V) +; 13 Vss - Ground +; 14 VDD - Power Supply Supply voltage for logic (+5.0V) +; 15 E2 (chip en 2) IOEN on LCD_BOTTOM2LINES_PORT Chip enable for bottom 2 lines +; 16 NC ‐ No Connect +; + + +; The 40x4 LCD memory map is the following: +; +; LINE CHIP EN PIN START ADDR END ADDR +; ---------------------------------------------------- +; 1 9 0x00 (0) 0x27 (39) +; 2 9 0x40 (64) 0x67 (103) +; 3 15 0x00 (0) 0x27 (39) +; 4 15 0x40 (64) 0x67 (103) +; +; When we reach 0x40 on the first controller, we switch to the second. +; When we reach 0x40 on the second controller, we must shift +; all the lines up by one and position the cursor at 0x40. + +; variables +LCD4004_VAR_SPACE: EQU DRV_IO_2_VAR_SPACE +LCD4004_CURSOR_POSITION_CONTROLLER: EQU DRV_IO_2_VAR_SPACE ; In which LCD controller is the cursor (0 or 1) +LCD4004_CURSOR_POSITION_CONTROLLER_MEMORY: EQU DRV_IO_2_VAR_SPACE + 1 ; Memory position of the cursor inside the controller's memory + +; functions + +; Initializes the driver and the LCD screen +LCD4004_Initialize: + ; The following are documented as in the datasheet: RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 + ; Function set: 0 0 0 0 1 DL N F 0 0 (DL: 8-bit/4-bit, N: number of display lines 2/1, F: Font type 11dots/8dots) + ; 0000111000 (8 bit, 2 lines) + + ; Display ON/OFF Control: 0 0 0 0 0 0 1 D C B (D: display on/off, C: cursor on/off, B: blinking cursor on/off) + ; 0000001111 (display on, blinking cursor) + ; Clear display + ; 0000000001 + + +; Move cursor (set DDRAM address in address counter) +LCD4004_MoveCursor: + ; 0 0 1 AC6 AC5 AC4 AC3 AC2 AC1 AC0 (ACx: Address) + + +; Sends string +; @param BC Pointer to a null-terminated string first character +LCD4004_print: + ld a, (bc) ; bc is the pointer to passed string's first char + cp 0 ; compare A content with 0 (subtract 0 from value and set zero flag Z if result is 0) + ret z ; if prev compare is true (Z flag set), string is finished, return + out (TERM_DATA_REG),a ; output char + inc bc ; increment bc to move to next char + jp LCD4004_print + +; Writes a single character +; @param A Value of character to print +LCD4004_printc: + out (TERM_DATA_REG),a + ret + diff --git a/pat80-computer/software/z80-assembly/os/drivers/arduino_terminal.asm b/pat80-computer/software/z80-assembly/os/drivers/arduino_terminal.asm index c0f9d03..d0ccb1a 100644 --- a/pat80-computer/software/z80-assembly/os/drivers/arduino_terminal.asm +++ b/pat80-computer/software/z80-assembly/os/drivers/arduino_terminal.asm @@ -23,7 +23,7 @@ TERM_DATA_REG: EQU IO_0 TERM_DATA_AVAIL_REG: EQU IO_0 + 1 ; variables -TERM_VAR_SPACE: EQU DRV_VAR_SPACE + 128 +TERM_VAR_SPACE: EQU DRV_IO_0_VAR_SPACE incoming_string: EQU TERM_VAR_SPACE ; functions diff --git a/pat80-computer/software/z80-assembly/os/main.asm b/pat80-computer/software/z80-assembly/os/main.asm index 852226e..2e154e2 100644 --- a/pat80-computer/software/z80-assembly/os/main.asm +++ b/pat80-computer/software/z80-assembly/os/main.asm @@ -30,8 +30,8 @@ jp Sysinit ; Startup vector: DO NOT MOVE! Must be the first instruction ; I/O MAP ; I/O 0 (0x00 - 0x1F) Parallel terminal (uses addr 0x00 and 0x01) ; I/O 1 (0x20 - 0x3F) Sound card (uses addr 0x20 only) -; I/O 2 (0x40 - 0x5F) PS2 Keyboard (uses 0x40 and 0x41) -; I/O 3 (0x60 - 0x7F) +; I/O 2 (0x40 - 0x5F) 40x4 LCD, first controller (lines 1 and 2) +; I/O 3 (0x60 - 0x7F) 40x4 LCD, second controller (lines 3 and 4) ; I/O 4 (0x80 - 0x9F) ; I/O 5 (0xA0 - 0xBF) ; I/O 6 (0xC0 - 0xDF) @@ -89,12 +89,20 @@ Sys_Beep: ; MEMORY CONFIGURATION -SYS_VAR_SPACE: EQU 0x8000 -DRV_VAR_SPACE: EQU 0x9000 -APP_SPACE: EQU 0xA000 +SYS_VAR_SPACE: EQU 0x8000 ; OS may allocate here memory for its own use +DRV_VAR_SPACE: EQU 0x9000 ; IO devices drivers may allocate here memory, each has a chunk of 512 bytes +DRV_IO_0_VAR_SPACE: EQU DRV_VAR_SPACE +DRV_IO_1_VAR_SPACE: EQU DRV_IO_0_VAR_SPACE + 512 +DRV_IO_2_VAR_SPACE: EQU DRV_IO_1_VAR_SPACE + 512 +DRV_IO_3_VAR_SPACE: EQU DRV_IO_2_VAR_SPACE + 512 +DRV_IO_4_VAR_SPACE: EQU DRV_IO_3_VAR_SPACE + 512 +DRV_IO_5_VAR_SPACE: EQU DRV_IO_4_VAR_SPACE + 512 +DRV_IO_6_VAR_SPACE: EQU DRV_IO_5_VAR_SPACE + 512 +DRV_IO_7_VAR_SPACE: EQU DRV_IO_6_VAR_SPACE + 512 +APP_SPACE: EQU 0xA000 ; App may only allocate between there and MEM_END MEM_END: EQU 0xFFFF -; SYSTEM CONFIGURATION +; DEVICES ("cards" on the IO bus) I/O space IO_0: EQU 0x00 IO_1: EQU 0x20 IO_2: EQU 0x40 diff --git a/pat80-computer/software/z80-assembly/os/tests/TM404A.asm b/pat80-computer/software/z80-assembly/os/tests/TM404A.asm new file mode 100644 index 0000000..4debab6 --- /dev/null +++ b/pat80-computer/software/z80-assembly/os/tests/TM404A.asm @@ -0,0 +1,116 @@ +jp main ; Startup vector: DO NOT MOVE! Must be the first instruction + +; Tests TM404A, on ports 2 and 3 + +IO_2: EQU 0x40 +IO_3: EQU 0x60 + +LCD_TOP_INSTR_REG: EQU IO_2 +LCD_TOP_DATA_REG: EQU IO_2 + 1 +LCD_BOTTOM_INSTR_REG: EQU IO_3 +LCD_BOTTOM_DATA_REG: EQU IO_3 + 1 + + +; Inits the lcd display +LCD4004_init: + ; --- Init first controller --- + + ; The following are documented as in the datasheet: RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 + ; Function set: 0 0 0 0 1 DL N F 0 0 (DL: 8-bit/4-bit, N: number of display lines 2/1, F: Font type 11dots/8dots) + ; 0000111000 (8 bit, 2 lines) + ld a,0x38 + out (LCD_TOP_INSTR_REG),a + + call LCD4004_wait_busy_clear + + ; Display ON/OFF Control: 0 0 0 0 0 0 1 D C B (D: display on/off, C: cursor on/off, B: blinking cursor on/off) + ; 0000001111 (display on, blinking cursor) + ld a,0x0F + out (LCD_TOP_INSTR_REG),a + + call LCD4004_wait_busy_clear + + ; Clear display + ; 0000000001 + ld a,0x01 + out (LCD_TOP_INSTR_REG),a + + call LCD4004_wait_busy_clear + + ; --- Init second controller --- + + ; The following are documented as in the datasheet: RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 + ; Function set: 0 0 0 0 1 DL N F 0 0 (DL: 8-bit/4-bit, N: number of display lines 2/1, F: Font type 11dots/8dots) + ; 0000111000 (8 bit, 2 lines) + ld a,0x38 + out (LCD_BOTTOM_INSTR_REG),a + + call LCD4004_wait_busy_clear + + ; Display ON/OFF Control: 0 0 0 0 0 0 1 D C B (D: display on/off, C: cursor on/off, B: blinking cursor on/off) + ; 0000001111 (display on, blinking cursor) + ld a,0x0F + out (LCD_BOTTOM_INSTR_REG),a + + call LCD4004_wait_busy_clear + + ; Clear display + ; 0000000001 + ld a,0x01 + out (LCD_BOTTOM_INSTR_REG),a + + call LCD4004_wait_busy_clear + + ret + + +; Prints string +; @param BC Pointer to a null-terminated string first character +LCD4004_TOP_print: + ld a, (bc) ; bc is the pointer to passed string's first char + cp 0 ; compare A content with 0 (subtract 0 from value and set zero flag Z if result is 0) + ret z ; if prev compare is true (Z flag set), string is finished, return + out (LCD_TOP_DATA_REG),a ; output char + call LCD4004_wait_busy_clear ; wait for the lcd to execute (busy signal check) + inc bc ; increment bc to move to next char + jp LCD4004_TOP_print + +; Prints string +; @param BC Pointer to a null-terminated string first character +LCD4004_BOTTOM_print: + ld a, (bc) ; bc is the pointer to passed string's first char + cp 0 ; compare A content with 0 (subtract 0 from value and set zero flag Z if result is 0) + ret z ; if prev compare is true (Z flag set), string is finished, return + out (LCD_BOTTOM_DATA_REG),a ; output char + call LCD4004_wait_busy_clear ; wait for the lcd to execute (busy signal check) + inc bc ; increment bc to move to next char + jp LCD4004_BOTTOM_print + +; Waits for the busy flag to be clear, indicating the LCD controllers to have finished their work +LCD4004_wait_busy_clear: + ret + in a, (LCD_TOP_INSTR_REG) ; reads the status + rla ; busy flag is DB7, so we shift it into carry to check it + jp c, LCD4004_wait_busy_clear ; if carry is set, lcd is busy + in a, (LCD_BOTTOM_INSTR_REG) ; reads the status + rla ; busy flag is DB7, so we shift it into carry to check it + jp c, LCD4004_wait_busy_clear ; if carry is set, lcd is busy + ret + +; --- TEST CODE --- +main: + TEST_STR_80: DB "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam augue tortor sed.",0 ; null terminated string + TEST_STR_85: DB "2Lorem ipsum dolor sit amet, consectetur adipiscing elit praesent pellentesque nisi.",0 ; null terminated string + + ; Init display + call LCD4004_init + + ; Write string on first 2 lines + ld bc, TEST_STR_80 + call LCD4004_TOP_print + + ; Write long string on last 2 lines (to see how it wraps) + ld bc, TEST_STR_85 + call LCD4004_BOTTOM_print + + halt diff --git a/pat80-emulator/main.c b/pat80-emulator/main.c index 634bbeb..4511d1d 100644 --- a/pat80-emulator/main.c +++ b/pat80-emulator/main.c @@ -2,6 +2,7 @@ * PAT80 Emulator * * Emulates a PAT80. + * Based on https://github.com/redcode/Z80 */ #include /* Z_NULL */ @@ -29,7 +30,8 @@ typedef struct { Z80 cpu; WINDOW *terminal_win; WINDOW *status_win; - WINDOW *lcd_win; + WINDOW *lcd_top_win; // 40x4 LCD, top two lines + WINDOW *lcd_bottom_win; // 40x4 LCD, bottom two lines } Machine; @@ -50,8 +52,8 @@ static zuint8 machine_cpu_in(Machine *self, zuint16 port) { // so the 3 most significant IO addr bits in this case are A7, A6, A5. The bits // A4-A0 may be used by the single device, at its own discretion. zuint16 bitmask = 7; // 0000000000000111 - int decoded = port & bitmask; - if (decoded <= 0x1F) { + int ioDevice = port & bitmask; + if (ioDevice <= 0x1F) { // Port 0 (0x00 to 0x1F): terminal // Read char from stin char c = getch(); @@ -66,37 +68,45 @@ static zuint8 machine_cpu_in(Machine *self, zuint16 port) { return c; } } - if (decoded <= 0x3F) { + if (ioDevice <= 0x3F) { // Port 1 (0x20 to 0x3F): sound card (sn76489) wprintw(self->status_win, "sound_cmd[IN]: Not supported!\n"); return 0x00; } - if (decoded <= 0x5F) { - // Port 2 (0x40 to 0x5F) + if (ioDevice <= 0x5F) { + // Port 2 (0x40 to 0x5F): LCD top 2 lines + if (port == 0x40 || port == 0x60) { + // TODO: Simulate busy flag and cursor position + return 0x00; // Busy flag clear, for now + } wprintw(self->status_win, "IO_ERROR_IN: No device at port 2\n"); return 0x00; } - if (decoded <= 0x7F) { - // Port 3 (0x60 to 0x7F) + if (ioDevice <= 0x7F) { + // Port 3 (0x60 to 0x7F): LCD bottom 2 lines + if (port == 0x0) { + // TODO: Simulate busy flag and cursor position + return 0x00; + } wprintw(self->status_win, "IO_ERROR_IN: No device at port 3\n"); return 0x00; } - if (decoded <= 0x9F) { + if (ioDevice <= 0x9F) { // Port 4 (0x80 to 0x9F) wprintw(self->status_win, "IO_ERROR_IN: No device at port 4\n"); return 0x00; } - if (decoded <= 0x5F) { + if (ioDevice <= 0x5F) { // Port 5 (0xA0 to 0xBF) wprintw(self->status_win, "IO_ERROR_IN: No device at port 5\n"); return 0x00; } - if (decoded <= 0x5F) { + if (ioDevice <= 0x5F) { // Port 6 (0xC0 to 0xDF) wprintw(self->status_win, "IO_ERROR_IN: No device at port 6\n"); return 0x00; } - if (decoded <= 0x5F) { + if (ioDevice <= 0x5F) { // Port 7 (0xE0 to 0xFF) wprintw(self->status_win, "IO_ERROR_IN: No device at port 7\n"); } else { @@ -107,7 +117,8 @@ static zuint8 machine_cpu_in(Machine *self, zuint16 port) { refresh(); wrefresh(self->terminal_win); wrefresh(self->status_win); - wrefresh(self->lcd_win); + wrefresh(self->lcd_top_win); + wrefresh(self->lcd_bottom_win); } @@ -117,29 +128,56 @@ static void machine_cpu_out(Machine *self, zuint16 port, zuint8 value) { // so the 3 most significant IO addr bits in this case are A7, A6, A5. The bits // A4-A0 may be used by the single device, at its own discretion. zuint16 bitmask = 0xE0; // 0000000011100000 - int decoded = port & bitmask; - if (decoded <= 0x1F) { + int ioDevice = port & bitmask; + bitmask = 0x1F; // 0000000000011111 + int ioAddrInsideDevice = port & bitmask; + wprintw(self->status_win, "[%#06x]DECODED[%#04x] - ", port, ioDevice); + if (ioDevice <= 0x1F) { // Port 0 (0x00 to 0x1F): terminal wprintw(self->terminal_win, "%c", value); - } else if (decoded <= 0x3F) { + } else if (ioDevice <= 0x3F) { // Port 1 (0x20 to 0x3F): sound card (sn76489) wprintw(self->status_win, "sound_cmd[%#04x]\n", value); - } else if (decoded <= 0x5F) { - // Port 2 (0x40 to 0x5F): lcd display 40x4 (mod. TM404A, based on 2 KS0066 chips, each one controlling 2 rows) - wprintw(self->lcd_win, "%c", value); - } else if (decoded <= 0x7F) { - // Port 3 (0x60 to 0x7F) - wprintw(self->status_win, "IO_ERROR_OUT: No device at port 3\n"); - } else if (decoded <= 0x9F) { + } else if (ioDevice <= 0x5F) { + // Port 2 (0x40 to 0x5F) and Port 3 (0x60 to 0x7F): + // lcd display 40x4 (mod. TM404A, based on 2 KS0066 chips, each one controlling 2 rows, + // top controller at port 2 and bottom at port 3). + // Instruction register at each port first address, data register at second address + if (ioAddrInsideDevice == 0) { + // Port 2, A4 LOW = talking to LCD top 2 lines instruction register + wprintw(self->status_win, "lcd_top_cmd[%#04x]\n", value); + } else if (ioAddrInsideDevice == 1) { + // Port 2, A4 HIGH = talking to LCD top 2 lines data register (writing text to screen) + wprintw(self->status_win, "lcd_top_data[%#04x](%c)\n", value, value); + wprintw(self->lcd_top_win, "%c", value); + } else { + wprintw(self->status_win, "IO_ERROR_OUT: lcd (top controller) does not listen at addr %#04x\n", ioAddrInsideDevice); + } + } else if (ioDevice <= 0x7F) { + // Port 2 (0x40 to 0x5F) and Port 3 (0x60 to 0x7F): + // lcd display 40x4 (mod. TM404A, based on 2 KS0066 chips, each one controlling 2 rows, + // top controller at port 2 and bottom at port 3). + // Instruction register at each port first address, data register at second address + if (ioAddrInsideDevice == 0) { + // Port 3, A4 LOW = talking to LCD bottom 2 lines instruction register + wprintw(self->status_win, "lcd_bottom_cmd[%#04x]\n", value); + } else if (ioAddrInsideDevice == 1) { + // Port 3, A4 HIGH = talking to LCD bottom 2 lines data register (writing text to screen) + wprintw(self->status_win, "lcd_bottom_data[%#04x](%c)\n", value, value); + wprintw(self->lcd_bottom_win, "%c", value); + } else { + wprintw(self->status_win, "IO_ERROR_OUT: lcd (bottom controller) does not listen at addr %#04x\n", ioAddrInsideDevice); + } + } else if (ioDevice <= 0x9F) { // Port 4 (0x80 to 0x9F) wprintw(self->status_win, "IO_ERROR_OUT: No device at port 4\n"); - } else if (decoded <= 0x5F) { + } else if (ioDevice <= 0xBF) { // Port 5 (0xA0 to 0xBF) wprintw(self->status_win, "IO_ERROR_OUT: No device at port 5\n"); - } else if (decoded <= 0x5F) { + } else if (ioDevice <= 0xDF) { // Port 6 (0xC0 to 0xDF) wprintw(self->status_win, "IO_ERROR_OUT: No device at port 6\n"); - } else if (decoded <= 0x5F) { + } else if (ioDevice <= 0xFF) { // Port 7 (0xE0 to 0xFF) wprintw(self->status_win, "IO_ERROR_OUT: No device at port 7\n"); } else { @@ -150,7 +188,21 @@ static void machine_cpu_out(Machine *self, zuint16 port, zuint8 value) { refresh(); wrefresh(self->terminal_win); wrefresh(self->status_win); - wrefresh(self->lcd_win); + wrefresh(self->lcd_top_win); + wrefresh(self->lcd_bottom_win); +} + +static void machine_cpu_halt(Machine *self, unsigned char signal) { + wprintw(self->status_win, "HALTED (%d)\n", signal); + // Refresh all windows + refresh(); + wrefresh(self->terminal_win); + wrefresh(self->status_win); + wrefresh(self->lcd_top_win); + wrefresh(self->lcd_bottom_win); + // Wait an ESC before exiting + while (getch() != 27) {} + exit(0); } @@ -163,7 +215,7 @@ void machine_initialize(Machine *self) { self->cpu.write = (Z80Write)machine_cpu_write; self->cpu.in = (Z80Read )machine_cpu_in; self->cpu.out = (Z80Write)machine_cpu_out; - self->cpu.halt = Z_NULL; + self->cpu.halt = (Z80Halt)machine_cpu_halt; self->cpu.nmia = Z_NULL; self->cpu.inta = Z_NULL; self->cpu.int_fetch = Z_NULL; @@ -224,15 +276,18 @@ int main(int argc, char *argv[]) { /*Z80*/ .cpu = pat80Cpu, .terminal_win = newwin(TERMINAL_HEIGHT, TERMINAL_WIDTH, INSTRUCTION_WINDOW_HEIGHT, 0), .status_win = newwin(y, x - TERMINAL_WIDTH - SPACING_BETWEEN_WINDOWS, INSTRUCTION_WINDOW_HEIGHT, TERMINAL_WIDTH + SPACING_BETWEEN_WINDOWS), // To right of terminal window - .lcd_win = newwin(4, 40, INSTRUCTION_WINDOW_HEIGHT + TERMINAL_HEIGHT + SPACING_BETWEEN_WINDOWS, 0) // Below terminal window + .lcd_top_win = newwin(2, 40, INSTRUCTION_WINDOW_HEIGHT + TERMINAL_HEIGHT + SPACING_BETWEEN_WINDOWS, 0), // Below terminal window + .lcd_bottom_win = newwin(2, 40, INSTRUCTION_WINDOW_HEIGHT + TERMINAL_HEIGHT + SPACING_BETWEEN_WINDOWS + 2, 0) }; wbkgd(pat80.terminal_win, COLOR_PAIR(1)); // Ncurses: set terminal window color wbkgd(pat80.status_win, COLOR_PAIR(2)); - wbkgd(pat80.lcd_win, COLOR_PAIR(3)); + wbkgd(pat80.lcd_top_win, COLOR_PAIR(3)); + wbkgd(pat80.lcd_bottom_win, COLOR_PAIR(3)); scrollok(pat80.terminal_win, TRUE); // Ncurses: Allow scrolling when reached end of window scrollok(pat80.status_win, TRUE); - scrollok(pat80.lcd_win, FALSE); + scrollok(pat80.lcd_top_win, FALSE); + scrollok(pat80.lcd_bottom_win, FALSE); attron(A_BOLD); // Print instructions printw("Emulator commands\n"); attroff(A_BOLD); @@ -258,7 +313,8 @@ int main(int argc, char *argv[]) { // Stop ncurses delwin(pat80.terminal_win); delwin(pat80.status_win); - delwin(pat80.lcd_win); + delwin(pat80.lcd_top_win); + delwin(pat80.lcd_bottom_win); endwin(); return 0; } diff --git a/pat80-io-devices/4004 lcd display/hardware/4004_lcd_display/4004_lcd_display.kicad_pcb b/pat80-io-devices/4004 lcd display/hardware/4004_lcd_display/4004_lcd_display.kicad_pcb new file mode 100644 index 0000000..ef218ba --- /dev/null +++ b/pat80-io-devices/4004 lcd display/hardware/4004_lcd_display/4004_lcd_display.kicad_pcb @@ -0,0 +1,2 @@ +(kicad_pcb (version 20240108) (generator "pcbnew") (generator_version "8.0") +) \ No newline at end of file diff --git a/pat80-io-devices/4004 lcd display/hardware/4004_lcd_display/4004_lcd_display.kicad_prl b/pat80-io-devices/4004 lcd display/hardware/4004_lcd_display/4004_lcd_display.kicad_prl new file mode 100644 index 0000000..fab0801 --- /dev/null +++ b/pat80-io-devices/4004 lcd display/hardware/4004_lcd_display/4004_lcd_display.kicad_prl @@ -0,0 +1,83 @@ +{ + "board": { + "active_layer": 0, + "active_layer_preset": "", + "auto_track_width": true, + "hidden_netclasses": [], + "hidden_nets": [], + "high_contrast_mode": 0, + "net_color_mode": 1, + "opacity": { + "images": 0.6, + "pads": 1.0, + "tracks": 1.0, + "vias": 1.0, + "zones": 0.6 + }, + "selection_filter": { + "dimensions": true, + "footprints": true, + "graphics": true, + "keepouts": true, + "lockedItems": false, + "otherItems": true, + "pads": true, + "text": true, + "tracks": true, + "vias": true, + "zones": true + }, + "visible_items": [ + 0, + 1, + 2, + 3, + 4, + 5, + 8, + 9, + 10, + 11, + 12, + 13, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 32, + 33, + 34, + 35, + 36, + 39, + 40 + ], + "visible_layers": "fffffff_ffffffff", + "zone_display_mode": 0 + }, + "git": { + "repo_password": "", + "repo_type": "", + "repo_username": "", + "ssh_key": "" + }, + "meta": { + "filename": "4004_lcd_display.kicad_prl", + "version": 3 + }, + "project": { + "files": [] + } +} diff --git a/pat80-io-devices/4004 lcd display/hardware/4004_lcd_display/4004_lcd_display.kicad_pro b/pat80-io-devices/4004 lcd display/hardware/4004_lcd_display/4004_lcd_display.kicad_pro new file mode 100644 index 0000000..5c93636 --- /dev/null +++ b/pat80-io-devices/4004 lcd display/hardware/4004_lcd_display/4004_lcd_display.kicad_pro @@ -0,0 +1,392 @@ +{ + "board": { + "3dviewports": [], + "design_settings": { + "defaults": {}, + "diff_pair_dimensions": [], + "drc_exclusions": [], + "rules": {}, + "track_widths": [], + "via_dimensions": [] + }, + "ipc2581": { + "dist": "", + "distpn": "", + "internal_id": "", + "mfg": "", + "mpn": "" + }, + "layer_presets": [], + "viewports": [] + }, + "boards": [], + "cvpcb": { + "equivalence_files": [] + }, + "erc": { + "erc_exclusions": [], + "meta": { + "version": 0 + }, + "pin_map": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 2, + 0, + 1, + 0, + 0, + 1, + 0, + 2, + 2, + 2, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 2 + ], + [ + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 1, + 1, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ], + [ + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 2 + ], + [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 2, + 1, + 2, + 0, + 0, + 1, + 0, + 2, + 2, + 2, + 2 + ], + [ + 0, + 2, + 0, + 1, + 0, + 0, + 1, + 0, + 2, + 0, + 0, + 2 + ], + [ + 0, + 2, + 1, + 1, + 0, + 0, + 1, + 0, + 2, + 0, + 0, + 2 + ], + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ] + ], + "rule_severities": { + "bus_definition_conflict": "error", + "bus_entry_needed": "error", + "bus_to_bus_conflict": "error", + "bus_to_net_conflict": "error", + "conflicting_netclasses": "error", + "different_unit_footprint": "error", + "different_unit_net": "error", + "duplicate_reference": "error", + "duplicate_sheet_names": "error", + "endpoint_off_grid": "warning", + "extra_units": "error", + "global_label_dangling": "warning", + "hier_label_mismatch": "error", + "label_dangling": "error", + "lib_symbol_issues": "warning", + "missing_bidi_pin": "warning", + "missing_input_pin": "warning", + "missing_power_pin": "error", + "missing_unit": "warning", + "multiple_net_names": "warning", + "net_not_bus_member": "warning", + "no_connect_connected": "warning", + "no_connect_dangling": "warning", + "pin_not_connected": "error", + "pin_not_driven": "error", + "pin_to_pin": "warning", + "power_pin_not_driven": "error", + "similar_labels": "warning", + "simulation_model_issue": "ignore", + "unannotated": "error", + "unit_value_mismatch": "error", + "unresolved_variable": "error", + "wire_dangling": "error" + } + }, + "libraries": { + "pinned_footprint_libs": [], + "pinned_symbol_libs": [] + }, + "meta": { + "filename": "4004_lcd_display.kicad_pro", + "version": 1 + }, + "net_settings": { + "classes": [ + { + "bus_width": 12, + "clearance": 0.2, + "diff_pair_gap": 0.25, + "diff_pair_via_gap": 0.25, + "diff_pair_width": 0.2, + "line_style": 0, + "microvia_diameter": 0.3, + "microvia_drill": 0.1, + "name": "Default", + "pcb_color": "rgba(0, 0, 0, 0.000)", + "schematic_color": "rgba(0, 0, 0, 0.000)", + "track_width": 0.2, + "via_diameter": 0.6, + "via_drill": 0.3, + "wire_width": 6 + } + ], + "meta": { + "version": 3 + }, + "net_colors": null, + "netclass_assignments": null, + "netclass_patterns": [] + }, + "pcbnew": { + "last_paths": { + "gencad": "", + "idf": "", + "netlist": "", + "plot": "", + "pos_files": "", + "specctra_dsn": "", + "step": "", + "svg": "", + "vrml": "" + }, + "page_layout_descr_file": "" + }, + "schematic": { + "annotate_start_num": 0, + "bom_export_filename": "", + "bom_fmt_presets": [], + "bom_fmt_settings": { + "field_delimiter": ",", + "keep_line_breaks": false, + "keep_tabs": false, + "name": "CSV", + "ref_delimiter": ",", + "ref_range_delimiter": "", + "string_delimiter": "\"" + }, + "bom_presets": [], + "bom_settings": { + "exclude_dnp": false, + "fields_ordered": [ + { + "group_by": false, + "label": "Reference", + "name": "Reference", + "show": true + }, + { + "group_by": true, + "label": "Value", + "name": "Value", + "show": true + }, + { + "group_by": false, + "label": "Datasheet", + "name": "Datasheet", + "show": true + }, + { + "group_by": false, + "label": "Footprint", + "name": "Footprint", + "show": true + }, + { + "group_by": false, + "label": "Qty", + "name": "${QUANTITY}", + "show": true + }, + { + "group_by": true, + "label": "DNP", + "name": "${DNP}", + "show": true + } + ], + "filter_string": "", + "group_symbols": true, + "name": "Grouped By Value", + "sort_asc": true, + "sort_field": "Riferimento" + }, + "connection_grid_size": 50.0, + "drawing": { + "dashed_lines_dash_length_ratio": 12.0, + "dashed_lines_gap_length_ratio": 3.0, + "default_line_thickness": 6.0, + "default_text_size": 50.0, + "field_names": [], + "intersheets_ref_own_page": false, + "intersheets_ref_prefix": "", + "intersheets_ref_short": false, + "intersheets_ref_show": false, + "intersheets_ref_suffix": "", + "junction_size_choice": 3, + "label_size_ratio": 0.375, + "operating_point_overlay_i_precision": 3, + "operating_point_overlay_i_range": "~A", + "operating_point_overlay_v_precision": 3, + "operating_point_overlay_v_range": "~V", + "overbar_offset_ratio": 1.23, + "pin_symbol_size": 25.0, + "text_offset_ratio": 0.15 + }, + "legacy_lib_dir": "", + "legacy_lib_list": [], + "meta": { + "version": 1 + }, + "net_format_name": "", + "page_layout_descr_file": "", + "plot_directory": "", + "spice_current_sheet_as_root": false, + "spice_external_command": "spice \"%I\"", + "spice_model_current_sheet_as_root": true, + "spice_save_all_currents": false, + "spice_save_all_dissipations": false, + "spice_save_all_voltages": false, + "subpart_first_id": 65, + "subpart_id_separator": 0 + }, + "sheets": [ + [ + "b60673c4-5448-4b81-8c25-50d47b52f4a5", + "Root" + ] + ], + "text_variables": {} +} diff --git a/pat80-io-devices/4004 lcd display/hardware/4004_lcd_display/4004_lcd_display.kicad_sch b/pat80-io-devices/4004 lcd display/hardware/4004_lcd_display/4004_lcd_display.kicad_sch new file mode 100644 index 0000000..4e20818 --- /dev/null +++ b/pat80-io-devices/4004 lcd display/hardware/4004_lcd_display/4004_lcd_display.kicad_sch @@ -0,0 +1,4136 @@ +(kicad_sch + (version 20231120) + (generator "eeschema") + (generator_version "8.0") + (uuid "b60673c4-5448-4b81-8c25-50d47b52f4a5") + (paper "A4") + (lib_symbols + (symbol "PCM_SL_Devices:potentiometer_RK163" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "RV" + (at 0 -2.286 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "potentiometer_RK163" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Potentiometer_THT:Potentiometer_Alps_RK163_Single_Horizontal" + (at -0.254 -6.604 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "potentiometer_RK163" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "pot potentiometer RK163" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "potentiometer_RK163_0_1" + (rectangle + (start -2.286 0.889) + (end 2.286 -0.889) + (stroke + (width 0.24) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 1.016) (xy 0.762 1.778) (xy -0.762 1.778) (xy 0 1.016) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + ) + (symbol "potentiometer_RK163_1_1" + (pin passive line + (at -3.81 0 0) + (length 1.5) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1 1) + ) + ) + ) + ) + (pin passive line + (at 0 3.81 270) + (length 2) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1 1) + ) + ) + ) + ) + (pin passive line + (at 3.81 0 180) + (length 1.5) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1 1) + ) + ) + ) + ) + ) + ) + (symbol "PCM_SL_Pin_Headers:PINHD_1x16_Male" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "PINHD_1x16_Male" + (at 0 21.59 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x16_P2.54mm_Vertical" + (at -1.27 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 25.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Pin Header male with pin space 2.54mm. Pin Count -16" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "Pin Header" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "PinHeader_1x16_P2.54mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "PINHD_1x16_Male_0_1" + (rectangle + (start -1.27 20.32) + (end 1.27 -20.32) + (stroke + (width 0) + (type default) + ) + (fill + (type background) + ) + ) + (polyline + (pts + (xy -1.27 -19.05) (xy 0 -19.05) + ) + (stroke + (width 0.5) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -16.51) (xy 0 -16.51) + ) + (stroke + (width 0.5) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -13.97) (xy 0 -13.97) + ) + (stroke + (width 0.5) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -11.43) (xy 0 -11.43) + ) + (stroke + (width 0.5) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -8.89) (xy 0 -8.89) + ) + (stroke + (width 0.5) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -6.35) (xy 0 -6.35) + ) + (stroke + (width 0.5) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -3.81) (xy 0 -3.81) + ) + (stroke + (width 0.3) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -3.81) (xy 0 -3.81) + ) + (stroke + (width 0.5) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -1.27) (xy 0 -1.27) + ) + (stroke + (width 0.3) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -1.27) (xy 0 -1.27) + ) + (stroke + (width 0.5) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 1.27) (xy 0 1.27) + ) + (stroke + (width 0.3) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 1.27) (xy 0 1.27) + ) + (stroke + (width 0.5) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 3.81) (xy 0 3.81) + ) + (stroke + (width 0.3) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 3.81) (xy 0 3.81) + ) + (stroke + (width 0.5) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 6.35) (xy 0 6.35) + ) + (stroke + (width 0.3) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 6.35) (xy 0 6.35) + ) + (stroke + (width 0.5) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 8.89) (xy 0 8.89) + ) + (stroke + (width 0.3) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 8.89) (xy 0 8.89) + ) + (stroke + (width 0.5) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 11.43) (xy 0 11.43) + ) + (stroke + (width 0.3) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 11.43) (xy 0 11.43) + ) + (stroke + (width 0.5) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 13.97) (xy 0 13.97) + ) + (stroke + (width 0.3) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 13.97) (xy 0 13.97) + ) + (stroke + (width 0.5) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 16.51) (xy 0 16.51) + ) + (stroke + (width 0.3) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 16.51) (xy 0 16.51) + ) + (stroke + (width 0.5) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 19.05) (xy 0 19.05) + ) + (stroke + (width 0.5) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "PINHD_1x16_Male_1_1" + (pin passive line + (at -3.81 19.05 0) + (length 2.54) + (name "" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -3.81 -3.81 0) + (length 2.54) + (name "" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -3.81 -6.35 0) + (length 2.54) + (name "" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -3.81 -8.89 0) + (length 2.54) + (name "" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -3.81 -11.43 0) + (length 2.54) + (name "" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "13" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -3.81 -13.97 0) + (length 2.54) + (name "" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -3.81 -16.51 0) + (length 2.54) + (name "" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "15" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -3.81 -19.05 0) + (length 2.54) + (name "" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "16" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -3.81 16.51 0) + (length 2.54) + (name "" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -3.81 13.97 0) + (length 2.54) + (name "" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -3.81 11.43 0) + (length 2.54) + (name "" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -3.81 8.89 0) + (length 2.54) + (name "" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -3.81 6.35 0) + (length 2.54) + (name "" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -3.81 3.81 0) + (length 2.54) + (name "" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -3.81 1.27 0) + (length 2.54) + (name "" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -3.81 -1.27 0) + (length 2.54) + (name "" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "keyboard-rescue:Conn_01x19-Connector_Generic" + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0 25.4 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Connector_Generic_Conn_01x19" + (at 0 -25.4 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Connector*:*_1x??_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Conn_01x19-Connector_Generic_1_1" + (rectangle + (start -1.27 -22.733) + (end 0 -22.987) + (stroke + (width 0.1524) + (type solid) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 -20.193) + (end 0 -20.447) + (stroke + (width 0.1524) + (type solid) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 -17.653) + (end 0 -17.907) + (stroke + (width 0.1524) + (type solid) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 -15.113) + (end 0 -15.367) + (stroke + (width 0.1524) + (type solid) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 -12.573) + (end 0 -12.827) + (stroke + (width 0.1524) + (type solid) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 -10.033) + (end 0 -10.287) + (stroke + (width 0.1524) + (type solid) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 -7.493) + (end 0 -7.747) + (stroke + (width 0.1524) + (type solid) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 -4.953) + (end 0 -5.207) + (stroke + (width 0.1524) + (type solid) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 -2.413) + (end 0 -2.667) + (stroke + (width 0.1524) + (type solid) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 0.127) + (end 0 -0.127) + (stroke + (width 0.1524) + (type solid) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 2.667) + (end 0 2.413) + (stroke + (width 0.1524) + (type solid) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 5.207) + (end 0 4.953) + (stroke + (width 0.1524) + (type solid) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 7.747) + (end 0 7.493) + (stroke + (width 0.1524) + (type solid) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 10.287) + (end 0 10.033) + (stroke + (width 0.1524) + (type solid) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 12.827) + (end 0 12.573) + (stroke + (width 0.1524) + (type solid) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 15.367) + (end 0 15.113) + (stroke + (width 0.1524) + (type solid) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 17.907) + (end 0 17.653) + (stroke + (width 0.1524) + (type solid) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 20.447) + (end 0 20.193) + (stroke + (width 0.1524) + (type solid) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 22.987) + (end 0 22.733) + (stroke + (width 0.1524) + (type solid) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 24.13) + (end 1.27 -24.13) + (stroke + (width 0.254) + (type solid) + ) + (fill + (type background) + ) + ) + (pin passive line + (at -5.08 22.86 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -5.08 0) + (length 3.81) + (name "Pin_12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -7.62 0) + (length 3.81) + (name "Pin_13" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "13" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -10.16 0) + (length 3.81) + (name "Pin_14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -12.7 0) + (length 3.81) + (name "Pin_15" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "15" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -15.24 0) + (length 3.81) + (name "Pin_16" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "16" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -17.78 0) + (length 3.81) + (name "Pin_17" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "17" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -20.32 0) + (length 3.81) + (name "Pin_18" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "18" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -22.86 0) + (length 3.81) + (name "Pin_19" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "19" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 20.32 0) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 17.78 0) + (length 3.81) + (name "Pin_3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 15.24 0) + (length 3.81) + (name "Pin_4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 12.7 0) + (length 3.81) + (name "Pin_5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 10.16 0) + (length 3.81) + (name "Pin_6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 7.62 0) + (length 3.81) + (name "Pin_7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 5.08 0) + (length 3.81) + (name "Pin_8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 2.54 0) + (length 3.81) + (name "Pin_9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "keyboard-rescue:GND-power" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -6.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "power_GND" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "GND-power_0_1" + (polyline + (pts + (xy 0 0) (xy 0 -1.27) (xy 1.27 -1.27) (xy 0 -2.54) (xy -1.27 -1.27) (xy 0 -1.27) + ) + (stroke + (width 0) + (type solid) + ) + (fill + (type none) + ) + ) + ) + (symbol "GND-power_1_1" + (pin power_in line + (at 0 0 270) + (length 0) hide + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "keyboard-rescue:VCC-power" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "power_VCC" + (at 0 3.81 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "VCC-power_0_1" + (polyline + (pts + (xy 0 0) (xy 0 1.27) + ) + (stroke + (width 0) + (type solid) + ) + (fill + (type none) + ) + ) + (circle + (center 0 1.905) + (radius 0.635) + (stroke + (width 0) + (type solid) + ) + (fill + (type none) + ) + ) + ) + (symbol "VCC-power_1_1" + (pin power_in line + (at 0 0 90) + (length 0) hide + (name "VCC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + ) + (no_connect + (at 100.33 90.17) + (uuid "0edc1072-6752-4836-aa54-d295340df32c") + ) + (no_connect + (at 100.33 133.35) + (uuid "1b1b471e-be5b-461e-8e5f-0dc341b54154") + ) + (no_connect + (at 100.33 74.93) + (uuid "25264422-59db-4c4f-bd17-03c9144b6143") + ) + (no_connect + (at 100.33 135.89) + (uuid "2989d8c8-8844-431b-a17e-b04ba8354a97") + ) + (no_connect + (at 100.33 67.31) + (uuid "2b3ffd64-3906-4b0a-a6e7-57698943ec60") + ) + (no_connect + (at 100.33 77.47) + (uuid "38708bcb-8922-476c-a514-5da668446599") + ) + (no_connect + (at 100.33 72.39) + (uuid "41db4329-80b3-4bc5-a229-0bb4c37c77b7") + ) + (no_connect + (at 100.33 82.55) + (uuid "69194f64-fb00-4fc0-a6c8-98e7570a033c") + ) + (no_connect + (at 100.33 85.09) + (uuid "6e480040-4e23-4e66-b9d5-b49d34140bce") + ) + (no_connect + (at 100.33 138.43) + (uuid "7b4b899a-9d89-4719-b298-6a4323903715") + ) + (no_connect + (at 100.33 87.63) + (uuid "844dd422-3a63-40de-b59c-b4f50bac9e12") + ) + (no_connect + (at 139.7 125.73) + (uuid "9a58c1fa-bc03-4b3f-a995-1c27ca0d68bc") + ) + (no_connect + (at 100.33 64.77) + (uuid "9cc98eb7-e01f-407d-a49d-662cd5c687ea") + ) + (no_connect + (at 100.33 62.23) + (uuid "cc26563d-1b90-4f7d-919a-4e9c7550cf5b") + ) + (no_connect + (at 100.33 57.15) + (uuid "d1a55c27-38e5-4cc1-835e-dc2ed95624d8") + ) + (no_connect + (at 100.33 59.69) + (uuid "e6ab77ba-043c-479b-b16c-b2ed3049628f") + ) + (no_connect + (at 100.33 69.85) + (uuid "edfeb5bc-316e-4646-bc0e-35451dbc239c") + ) + (no_connect + (at 100.33 140.97) + (uuid "f6043924-4afc-4a9e-b65f-bc3f8b9f7f0d") + ) + (no_connect + (at 100.33 80.01) + (uuid "fbec23cc-0c84-4be7-9c52-2cc7ed494305") + ) + (wire + (pts + (xy 137.16 128.27) (xy 137.16 54.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0191cbdc-241a-47a4-a56b-2343fa3c62a4") + ) + (wire + (pts + (xy 127 118.11) (xy 130.81 118.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "05b71bd9-7fca-40e4-b4eb-71afd598f49f") + ) + (wire + (pts + (xy 120.65 143.51) (xy 143.51 143.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0624ad33-d89a-454b-be5c-89eed5b213bf") + ) + (wire + (pts + (xy 87.63 156.21) (xy 143.51 156.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "067a1dd5-f53c-41e1-b8f6-5c054121d366") + ) + (wire + (pts + (xy 143.51 135.89) (xy 123.19 135.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0a9500a0-9eb5-4fda-b2ba-3bade61881d5") + ) + (wire + (pts + (xy 87.63 85.09) (xy 100.33 85.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0aaeecc1-9e3d-474f-bc5d-ad4656c9d9ba") + ) + (wire + (pts + (xy 87.63 57.15) (xy 100.33 57.15) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1d647ac2-a671-47b2-ad44-5c494c73eff8") + ) + (wire + (pts + (xy 87.63 52.07) (xy 102.87 52.07) + ) + (stroke + (width 0) + (type default) + ) + (uuid "208fd434-b0f4-4742-8ffd-50f1eb534352") + ) + (wire + (pts + (xy 102.87 118.11) (xy 105.41 118.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "23f7c769-5bcf-4455-8983-1dfb5279ce3b") + ) + (wire + (pts + (xy 87.63 161.29) (xy 143.51 161.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "24e38d1a-8c0a-439d-8214-98df53bbd084") + ) + (wire + (pts + (xy 87.63 153.67) (xy 143.51 153.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "25698632-c2e1-4865-969a-5de22309dbd4") + ) + (wire + (pts + (xy 87.63 128.27) (xy 102.87 128.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "26adce3d-707b-465f-b309-1d9cef996f45") + ) + (wire + (pts + (xy 127 166.37) (xy 127 140.97) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2872e416-94d9-445e-a1a4-1038a2d2f304") + ) + (wire + (pts + (xy 123.19 135.89) (xy 123.19 121.92) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2b387ae0-45cb-4475-b3a3-f2d0212a1e18") + ) + (wire + (pts + (xy 87.63 80.01) (xy 100.33 80.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2e9ce8c7-6be0-49de-9b87-386ae4f20ae4") + ) + (wire + (pts + (xy 87.63 148.59) (xy 143.51 148.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "31df1735-432c-4abe-8703-d62de57eee95") + ) + (wire + (pts + (xy 87.63 72.39) (xy 100.33 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "34f64a7b-0713-4d35-be47-cb0867d85b9b") + ) + (wire + (pts + (xy 143.51 128.27) (xy 137.16 128.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "37f4498f-c552-41f3-abd6-06ea1f317563") + ) + (wire + (pts + (xy 87.63 77.47) (xy 100.33 77.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3aaa0b4d-0366-4ef3-89ad-5df8e6e84362") + ) + (wire + (pts + (xy 87.63 59.69) (xy 100.33 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3ffc9be7-eb75-4b3f-b490-78bb0037e066") + ) + (wire + (pts + (xy 127 127) (xy 130.81 127) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4585d571-0a31-460f-8cf7-15f887d21934") + ) + (wire + (pts + (xy 87.63 151.13) (xy 143.51 151.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4ac1749d-4c33-4c61-a753-ed4c88ae8b53") + ) + (wire + (pts + (xy 87.63 130.81) (xy 120.65 130.81) + ) + (stroke + (width 0) + (type default) + ) + (uuid "502abb08-e98d-4534-b41d-a62b69516aa4") + ) + (wire + (pts + (xy 143.51 130.81) (xy 134.62 130.81) + ) + (stroke + (width 0) + (type default) + ) + (uuid "50686ffa-532e-46fc-a0fa-5e00dfde9c7e") + ) + (wire + (pts + (xy 87.63 62.23) (xy 100.33 62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "530648cd-c704-4371-b3f4-d38404e16fcd") + ) + (wire + (pts + (xy 87.63 168.91) (xy 102.87 168.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "53729893-6fda-4b9e-b20d-741cbf84c9d6") + ) + (wire + (pts + (xy 102.87 168.91) (xy 102.87 173.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "55ca3fb3-24aa-4f08-82b6-885990ea550d") + ) + (wire + (pts + (xy 102.87 41.91) (xy 105.41 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "56c37eb4-253a-477b-96ec-777fed357d2b") + ) + (wire + (pts + (xy 87.63 92.71) (xy 102.87 92.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "589ef30f-34bf-479b-abab-25b8ae43425b") + ) + (wire + (pts + (xy 87.63 158.75) (xy 143.51 158.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5922674a-1724-4228-aaee-89986c72612e") + ) + (wire + (pts + (xy 100.33 49.53) (xy 100.33 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "664ecd21-ed8b-4df5-8f39-d90bffa67575") + ) + (wire + (pts + (xy 115.57 138.43) (xy 143.51 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6970ac23-0fb5-4421-bf57-e66439f055dd") + ) + (wire + (pts + (xy 87.63 67.31) (xy 100.33 67.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7069dd28-1049-4f41-9a74-4ee68ab60ba4") + ) + (wire + (pts + (xy 130.81 133.35) (xy 143.51 133.35) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7460a7f6-23b7-4c1c-bc41-78c1389dc2c6") + ) + (wire + (pts + (xy 120.65 130.81) (xy 120.65 143.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7574ea87-1250-4d92-abf4-2f96db5c79a2") + ) + (wire + (pts + (xy 87.63 146.05) (xy 143.51 146.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "778b9860-0bdf-4fca-bb76-11210fa9b77a") + ) + (wire + (pts + (xy 87.63 64.77) (xy 100.33 64.77) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7b99a5a4-036b-46e0-a0e1-6d021fe3f1e0") + ) + (wire + (pts + (xy 87.63 74.93) (xy 100.33 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7c83c78b-5256-4a77-8b64-9078992f766f") + ) + (wire + (pts + (xy 87.63 140.97) (xy 100.33 140.97) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7ca82a3e-fad1-44dc-9b40-03fb3f95f183") + ) + (wire + (pts + (xy 87.63 69.85) (xy 100.33 69.85) + ) + (stroke + (width 0) + (type default) + ) + (uuid "81ea2fa0-3d57-48d3-b577-8f90a5077bb2") + ) + (wire + (pts + (xy 87.63 95.25) (xy 100.33 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8a30b990-f15d-4287-ab74-afa93c5fd0e5") + ) + (wire + (pts + (xy 127 140.97) (xy 143.51 140.97) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8b870dc8-83fb-44e8-9221-0ac739b27b67") + ) + (wire + (pts + (xy 115.57 118.11) (xy 119.38 118.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8fa319b9-6b97-4e08-97cd-98d8e7c8e613") + ) + (wire + (pts + (xy 100.33 104.14) (xy 106.68 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "91bc9af6-ef28-447e-80c0-6ca8708d0b23") + ) + (wire + (pts + (xy 87.63 82.55) (xy 100.33 82.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "91f2cb0f-361f-4cd7-a9b2-6fc5bb4141f4") + ) + (wire + (pts + (xy 87.63 49.53) (xy 100.33 49.53) + ) + (stroke + (width 0) + (type default) + ) + (uuid "94e2f262-59f2-404a-85f1-2d917e3b3542") + ) + (wire + (pts + (xy 87.63 133.35) (xy 100.33 133.35) + ) + (stroke + (width 0) + (type default) + ) + (uuid "979e2112-f9c9-450d-b2d4-7a27d7696a21") + ) + (wire + (pts + (xy 100.33 180.34) (xy 106.68 180.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9ae1755b-a964-4141-92ac-0b9fa751a1b8") + ) + (wire + (pts + (xy 137.16 54.61) (xy 87.63 54.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9eaa570a-a4a9-4008-a732-c4c841dfd276") + ) + (wire + (pts + (xy 87.63 166.37) (xy 127 166.37) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9f188ed3-71c4-4b5a-b629-eb0ed5d1c067") + ) + (wire + (pts + (xy 87.63 90.17) (xy 100.33 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a3bd47d8-bcdd-4140-be59-3849a8427865") + ) + (wire + (pts + (xy 87.63 163.83) (xy 143.51 163.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a6afe55d-c368-4004-bf3a-51b026ae28cb") + ) + (wire + (pts + (xy 100.33 125.73) (xy 100.33 118.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a6ebe840-b470-4b49-869e-c7d78ff68f46") + ) + (wire + (pts + (xy 130.81 127) (xy 130.81 133.35) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b73343a0-35b2-4f6f-9500-15e6bfc5803d") + ) + (wire + (pts + (xy 139.7 125.73) (xy 143.51 125.73) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bc16cb97-175c-41d9-8c59-bb75fdd2e45b") + ) + (wire + (pts + (xy 87.63 171.45) (xy 100.33 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c3779158-1bee-49ea-9307-7675f8ee592d") + ) + (wire + (pts + (xy 102.87 52.07) (xy 102.87 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c5700732-25d4-40f2-8e66-675f79decc5e") + ) + (wire + (pts + (xy 87.63 143.51) (xy 115.57 143.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c6a43a56-50a4-4007-b86b-0c22b5a4285c") + ) + (wire + (pts + (xy 102.87 92.71) (xy 102.87 97.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ca904648-2f47-46f3-b8ea-9c0d6e0bcc81") + ) + (wire + (pts + (xy 102.87 128.27) (xy 102.87 118.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cb6fe24c-6c11-44a3-ab5f-847b26c40500") + ) + (wire + (pts + (xy 87.63 125.73) (xy 100.33 125.73) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d326ef27-318b-40b3-a36c-77867f512828") + ) + (wire + (pts + (xy 87.63 87.63) (xy 100.33 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d3937632-498d-4902-aad2-85d7203992e6") + ) + (wire + (pts + (xy 87.63 138.43) (xy 100.33 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ecdbb0ff-6ba3-4726-9b06-7c3545a62090") + ) + (wire + (pts + (xy 115.57 143.51) (xy 115.57 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f47ea801-37a6-4e37-a25f-5223f570a80b") + ) + (wire + (pts + (xy 87.63 135.89) (xy 100.33 135.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fd4f3816-c627-4996-95ef-3f7264809a52") + ) + (wire + (pts + (xy 100.33 95.25) (xy 100.33 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fef16528-e61d-4878-85dd-6a4b3e878549") + ) + (wire + (pts + (xy 100.33 171.45) (xy 100.33 180.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ff1534ee-f4ed-4913-9669-5f1ecf576ced") + ) + (text "Vcc" + (exclude_from_sim no) + (at 139.7 130.048 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "06d69c77-89ac-4672-8dc2-6637f2cb4c0e") + ) + (text "DB5" + (exclude_from_sim no) + (at 139.446 157.988 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "0c9d95bb-a309-4ede-a831-c517d8e5163b") + ) + (text "DB3" + (exclude_from_sim no) + (at 139.446 152.908 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "22804b4e-0e9e-4fc1-be86-dba95f153e28") + ) + (text "E2" + (exclude_from_sim no) + (at 140.462 127.508 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "232f2289-738a-44c6-ac3f-ec2dae7166f2") + ) + (text "DB7" + (exclude_from_sim no) + (at 139.446 163.068 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "2cf0bcd4-63db-4517-84e0-42a8cc098b3c") + ) + (text "E1" + (exclude_from_sim no) + (at 140.208 142.748 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "3161180f-7528-4c4f-82c1-ac4df4c97413") + ) + (text "40x4 LCD Board" + (exclude_from_sim no) + (at 195.072 170.434 0) + (effects + (font + (size 2.54 2.54) + ) + ) + (uuid "35c041b1-ba5b-4534-b042-0707053803ae") + ) + (text "DB6" + (exclude_from_sim no) + (at 139.446 160.528 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "48e01c66-391a-4e54-ac0d-378810c97962") + ) + (text "NC" + (exclude_from_sim no) + (at 140.462 124.968 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "563e7f30-74e2-4f2c-867a-856cbc2ee5bc") + ) + (text "R/~{W}" + (exclude_from_sim no) + (at 139.446 140.208 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "5d5d1182-99de-446b-a3d8-9acdd4556c98") + ) + (text "DB0" + (exclude_from_sim no) + (at 139.446 145.288 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "5dd67387-730d-4092-93d0-4e4efbecc95d") + ) + (text "Vee" + (exclude_from_sim no) + (at 139.7 135.128 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "64ea1c37-d203-4547-9411-426847ab24cc") + ) + (text "DB1" + (exclude_from_sim no) + (at 139.446 147.828 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "8b2b5c38-d084-4743-9549-829d95b5ff94") + ) + (text "RS" + (exclude_from_sim no) + (at 140.208 137.668 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "ae0d6661-bde9-4a82-8335-284cd6c2b6dc") + ) + (text "Vss" + (exclude_from_sim no) + (at 139.7 132.588 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "b588b363-6d32-4a91-bed3-1a255e4ecec8") + ) + (text "Allows to connect a 40x4 character display (containing a dual hd44780-compatible controller)\nto the PAT80. This is the least efficient implementation, as occupies two IO ports, but\nit uses the PAT80 IO decoding and saves an IC. The idea is having this integrated in the motherboard\ninstead of two expansion cards." + (exclude_from_sim no) + (at 179.324 176.53 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + (uuid "be4f7c90-5948-4a22-9569-fc7a3ef0f658") + ) + (text "DB2" + (exclude_from_sim no) + (at 139.446 150.368 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "c2b12072-18bd-4f8c-ac64-c9b68d101fd6") + ) + (text "DB4" + (exclude_from_sim no) + (at 139.446 155.448 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "fbf701c5-9fb2-492a-8069-606e8e287fc0") + ) + (label "IOADDR2" + (at 90.17 138.43 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "015efdf8-f5fc-4453-8ccb-a178dc52c8fd") + ) + (label "IOGND" + (at 90.17 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "05387a7f-437a-4874-9cc0-fcd1b566490d") + ) + (label "~{IOWR}" + (at 90.17 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "13872af0-e875-4678-b8ab-5e080229f8b2") + ) + (label "IOD2" + (at 90.17 74.93 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "150b8694-58b7-4c68-b095-cfa5ab86e0be") + ) + (label "IOD0" + (at 90.17 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "1de2c2b5-09cf-475c-92ce-45cb8195cb07") + ) + (label "IOVCC" + (at 90.17 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "1f2dd4e6-2b21-4985-8826-82dae6237da3") + ) + (label "IOADDR0" + (at 90.17 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "30990cc0-a602-4437-86d2-aa9b14515041") + ) + (label "IOVCC" + (at 90.17 171.45 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "32152fd6-1836-4401-8705-73cf3bea313d") + ) + (label "IOADDR1" + (at 90.17 135.89 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "3383429f-eea0-4b7b-9483-62598fd93aaf") + ) + (label "IOADDR4" + (at 90.17 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "380f2dc4-db62-4c99-8fda-63e3cd539e7e") + ) + (label "IOD6" + (at 90.17 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "38ad3117-8d47-47bb-b02d-d14734f2bc4d") + ) + (label "IOD4" + (at 90.17 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "3a24fd95-9ee0-4a67-9066-ce3f7b4d1559") + ) + (label "IOADDR2" + (at 90.17 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "41b6c8cb-0154-4cd0-9053-7e1969b0ff8b") + ) + (label "IOD1" + (at 90.17 148.59 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "50821e67-3e2d-426f-a2ad-ffa7fdf6bf73") + ) + (label "IOGND" + (at 90.17 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "5b5dcbab-b937-4ca3-acdb-abe64bfe21c0") + ) + (label "~{IOEN}" + (at 90.17 130.81 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "5df089e2-14ef-4fee-a942-c416c8b259d2") + ) + (label "IOADDR0" + (at 90.17 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "647df69b-cd38-41b5-96aa-904d2d95e3cf") + ) + (label "IOADDR4" + (at 90.17 143.51 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "6a4f0a0d-f08d-4d59-87bc-060134ae8948") + ) + (label "IOGND" + (at 90.17 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "6f6dd025-ebf3-490f-97f4-9e6c0deb4d3e") + ) + (label "IOD1" + (at 90.17 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "758e3d0f-332b-4fa3-8b9c-aa25517c2bd2") + ) + (label "IOD3" + (at 90.17 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "76879470-1946-413e-a63c-363a338d2f5a") + ) + (label "~{IOEN}" + (at 90.17 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "7b587150-9c31-423d-9aff-ad0a25c9f380") + ) + (label "IOVCC" + (at 90.17 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "7c0b9fe2-07a4-4870-9134-3859b880043f") + ) + (label "IOADDR3" + (at 90.17 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "8254dcef-dff3-467f-a401-cbdc9e92d05b") + ) + (label "IOD6" + (at 90.17 161.29 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "8439a032-084d-4664-847a-ee369c121c76") + ) + (label "IOVCC" + (at 90.17 125.73 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "916d42b2-5bbc-4963-82ba-ab1b8941b52d") + ) + (label "IOADDR1" + (at 90.17 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "9d7b1e2c-1ba5-4fa7-8b53-72c3a1c9ff9e") + ) + (label "IOD4" + (at 90.17 156.21 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "9e8afa7e-1c4a-4440-8ead-36a6f8899810") + ) + (label "IOD5" + (at 90.17 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "a672ff40-b963-4a4a-9ffe-55dc8b8b76c2") + ) + (label "IOD5" + (at 90.17 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "ba607599-0660-47fd-8258-a3c0728cc224") + ) + (label "IOD0" + (at 90.17 146.05 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "c355ebee-fe10-49b2-97ee-82fa79c5c9e7") + ) + (label "~{IOWR}" + (at 90.17 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "c89190e6-1229-486b-b6cd-4c8b3e0dd440") + ) + (label "IOGND" + (at 90.17 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "c8dc95c0-8ff5-4436-b2ef-8a71bf9c07c5") + ) + (label "IOD2" + (at 90.17 151.13 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "dbf220e6-cc26-4d46-bc8b-d5ba7eed47c9") + ) + (label "IOD3" + (at 90.17 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "dc0e98e2-c5cb-49ae-964d-6517c643e007") + ) + (label "IOD7" + (at 90.17 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "e7f89154-15d0-4c39-83af-d0cce5765d18") + ) + (label "IOD7" + (at 90.17 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "ebb7f884-875a-4b34-9dc4-6f660352559d") + ) + (label "IOADDR3" + (at 90.17 64.77 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "ed7cc6d8-e1f0-410d-a1d6-76efaac2b097") + ) + (symbol + (lib_id "keyboard-rescue:GND-power") + (at 102.87 173.99 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "0764d676-b150-4444-8365-018c8611c72c") + (property "Reference" "#PWR02" + (at 102.87 180.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 102.997 178.3842 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 102.87 173.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 102.87 173.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 102.87 173.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "11e8f1ea-5313-4b8a-9c80-b609485639ac") + ) + (instances + (project "4004_lcd_display" + (path "/b60673c4-5448-4b81-8c25-50d47b52f4a5" + (reference "#PWR02") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "keyboard-rescue:VCC-power") + (at 115.57 118.11 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "1f1915ef-c668-4f8f-b170-425ddaf9c5ea") + (property "Reference" "#PWR07" + (at 115.57 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "VCC" + (at 115.1382 122.5042 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 115.57 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 115.57 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 115.57 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "d5deea40-e07f-4f9c-a2e4-6fc82c14e707") + ) + (instances + (project "4004_lcd_display" + (path "/b60673c4-5448-4b81-8c25-50d47b52f4a5" + (reference "#PWR07") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "keyboard-rescue:VCC-power") + (at 134.62 130.81 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "27bce523-e93e-4685-91e5-da9b272c6aec") + (property "Reference" "#PWR05" + (at 134.62 134.62 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "VCC" + (at 135.0518 126.4158 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 134.62 130.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 134.62 130.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 134.62 130.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "2a3da6c6-ddb7-4d78-8e78-2b5048aa87a3") + ) + (instances + (project "4004_lcd_display" + (path "/b60673c4-5448-4b81-8c25-50d47b52f4a5" + (reference "#PWR05") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "PCM_SL_Pin_Headers:PINHD_1x16_Male") + (at 147.32 144.78 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "43bc390e-2f47-4191-b09d-3975a678435d") + (property "Reference" "LCD1" + (at 147.195 119.38 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "PINHD_1x16_Male" + (at 147.195 121.92 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x16_P2.54mm_Vertical" + (at 146.05 171.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 147.32 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Pin Header male with pin space 2.54mm. Pin Count -16" + (at 147.32 144.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c547739c-1483-4d6a-bbe7-7f8d4626fde0") + ) + (pin "5" + (uuid "c1386a45-bf94-40d0-85c8-52e5d0414ea0") + ) + (pin "1" + (uuid "9a6090fc-b99d-41a2-ad69-040e4c83e354") + ) + (pin "12" + (uuid "793671bf-4a83-415e-9cc2-5480f799ee66") + ) + (pin "16" + (uuid "cbf98600-dff3-4823-a789-20d38f2a1c89") + ) + (pin "7" + (uuid "a042627a-bd7a-4819-8085-ae6d4ee10854") + ) + (pin "3" + (uuid "7060171e-d091-4d7c-9dd3-ab7a5a22cc6a") + ) + (pin "8" + (uuid "326821eb-862c-4afa-831b-b4c4e9bd43e7") + ) + (pin "14" + (uuid "fc213652-17c6-48c9-887b-5bb8a9e74523") + ) + (pin "10" + (uuid "9a5cab58-d722-4245-890d-0aa6e27c336a") + ) + (pin "9" + (uuid "6999a9ad-1a92-49d5-ba82-dc9f1248e7fb") + ) + (pin "15" + (uuid "442351d0-c442-434e-bfde-8ff59ccd8aba") + ) + (pin "6" + (uuid "55754f3a-376a-4bee-822e-4e62f3d4e0e3") + ) + (pin "4" + (uuid "1fa3051b-a3d9-43df-9581-f875e0cde55d") + ) + (pin "13" + (uuid "988f95d4-5dda-47b9-abb2-cf0b57efaf04") + ) + (pin "11" + (uuid "3f88c2b3-4b58-4b2d-806b-2e8bbe294654") + ) + (instances + (project "" + (path "/b60673c4-5448-4b81-8c25-50d47b52f4a5" + (reference "LCD1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "keyboard-rescue:VCC-power") + (at 100.33 118.11 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4ce59fe1-3bfe-404f-8701-b05ca8e9eb04") + (property "Reference" "#PWR01" + (at 100.33 121.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "VCC" + (at 100.7618 113.7158 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 100.33 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 100.33 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 100.33 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "a03a9dac-9833-4c39-9013-29ea7ac4b37c") + ) + (instances + (project "4004_lcd_display" + (path "/b60673c4-5448-4b81-8c25-50d47b52f4a5" + (reference "#PWR01") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "PCM_SL_Devices:potentiometer_RK163") + (at 123.19 118.11 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "50ab8890-498b-4d36-9f97-4f35f01f31d6") + (property "Reference" "RV1" + (at 123.19 111.76 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "potentiometer_RK163" + (at 123.19 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Potentiometer_THT:Potentiometer_Alps_RK163_Single_Horizontal" + (at 123.444 111.506 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 123.19 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "potentiometer_RK163" + (at 123.19 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "72aff68f-689d-4216-be29-8cd9aeeb584d") + ) + (pin "3" + (uuid "022b60e5-4ed9-4001-b3a0-6d056cc3ebc4") + ) + (pin "1" + (uuid "99c4559c-ff48-4e53-928a-d65b38ee0c51") + ) + (instances + (project "" + (path "/b60673c4-5448-4b81-8c25-50d47b52f4a5" + (reference "RV1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "keyboard-rescue:VCC-power") + (at 106.68 104.14 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "5c0fb22b-b0ad-46e9-952e-b634b408285d") + (property "Reference" "#PWR012" + (at 106.68 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "VCC" + (at 107.1118 99.7458 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 106.68 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 106.68 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 106.68 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "eee7e6e3-aa4c-4a72-9653-9360e6922363") + ) + (instances + (project "4004_lcd_display" + (path "/b60673c4-5448-4b81-8c25-50d47b52f4a5" + (reference "#PWR012") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "keyboard-rescue:GND-power") + (at 102.87 97.79 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6eb95a3c-e25b-4f9c-8664-bd04b3285e39") + (property "Reference" "#PWR010" + (at 102.87 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 102.997 102.1842 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 102.87 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 102.87 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 102.87 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b2d238e0-e6c5-4d66-b189-8e01bd950bc0") + ) + (instances + (project "4004_lcd_display" + (path "/b60673c4-5448-4b81-8c25-50d47b52f4a5" + (reference "#PWR010") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "keyboard-rescue:VCC-power") + (at 106.68 180.34 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7b816d82-8658-48a7-a478-6f803b2763d1") + (property "Reference" "#PWR04" + (at 106.68 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "VCC" + (at 107.1118 175.9458 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 106.68 180.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 106.68 180.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 106.68 180.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "6d7feaf8-15bd-4e5b-9ea0-7e3815f99dde") + ) + (instances + (project "4004_lcd_display" + (path "/b60673c4-5448-4b81-8c25-50d47b52f4a5" + (reference "#PWR04") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "keyboard-rescue:VCC-power") + (at 100.33 41.91 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "804467e2-840d-4112-a94f-52bad327c664") + (property "Reference" "#PWR09" + (at 100.33 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "VCC" + (at 100.7618 37.5158 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 100.33 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 100.33 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 100.33 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "f7bf90d2-0eeb-4cf0-ab01-c1b472e784df") + ) + (instances + (project "4004_lcd_display" + (path "/b60673c4-5448-4b81-8c25-50d47b52f4a5" + (reference "#PWR09") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "keyboard-rescue:GND-power") + (at 105.41 118.11 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a4d899b8-2061-4733-bb51-1dac441ee63c") + (property "Reference" "#PWR03" + (at 105.41 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 105.537 122.5042 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 105.41 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 105.41 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 105.41 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "fe619767-59a6-41b7-a717-d64057f26b8c") + ) + (instances + (project "4004_lcd_display" + (path "/b60673c4-5448-4b81-8c25-50d47b52f4a5" + (reference "#PWR03") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "keyboard-rescue:Conn_01x19-Connector_Generic") + (at 82.55 148.59 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a7c0479e-7902-4606-96fb-afe559981e70") + (property "Reference" "IOBUS1" + (at 84.6328 120.2182 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "IO_Bus_conn" + (at 84.6328 122.5296 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x19_P2.54mm_Horizontal" + (at 82.55 148.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 82.55 148.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 82.55 148.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "13" + (uuid "129c9a01-bd2f-4966-ae03-c38b4afe238b") + ) + (pin "16" + (uuid "0744e494-6dc4-4469-9155-82aa4eb2528b") + ) + (pin "17" + (uuid "c4dd758d-d907-4931-9862-e73886c3e9c5") + ) + (pin "18" + (uuid "21a34e29-f817-462f-8239-3519f3d31ddb") + ) + (pin "19" + (uuid "aeee5721-e535-46bd-bb47-85182e69e8d5") + ) + (pin "2" + (uuid "f1b0247f-ec33-4e6c-b017-e7b0d3960667") + ) + (pin "3" + (uuid "1a2b706c-5df0-4651-a830-2dcbf2127e80") + ) + (pin "4" + (uuid "5492b6c1-9998-432c-8494-24077ca94afd") + ) + (pin "5" + (uuid "9fd21aa5-989f-4491-b0a3-b5246c346b6d") + ) + (pin "6" + (uuid "51b70870-a95e-4c07-93e6-5ef5cff6c082") + ) + (pin "14" + (uuid "0c180f4e-1940-4761-8373-e49a7baa46f3") + ) + (pin "12" + (uuid "472d78f2-9ff8-4985-9977-007b22d4bd1d") + ) + (pin "1" + (uuid "1ec3691c-233f-4a67-9604-731b9267f1d3") + ) + (pin "10" + (uuid "6486769e-0589-47be-a100-9598aaecb717") + ) + (pin "11" + (uuid "61bb7271-e981-4b86-8052-9d9f233d0d41") + ) + (pin "15" + (uuid "e4df43c2-8692-4ccb-a82e-5a669f57c423") + ) + (pin "7" + (uuid "8eae461a-ee1b-45bb-8d1e-6b19422c0d3e") + ) + (pin "8" + (uuid "94e83d39-40e1-476a-9209-b90d00eb3b37") + ) + (pin "9" + (uuid "e56c6d27-6bcd-4ec4-81da-8282ad3e12cd") + ) + (instances + (project "4004_lcd_display" + (path "/b60673c4-5448-4b81-8c25-50d47b52f4a5" + (reference "IOBUS1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "keyboard-rescue:Conn_01x19-Connector_Generic") + (at 82.55 72.39 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b91f214e-98cd-4792-8876-a5bf054fb392") + (property "Reference" "IOBUS2" + (at 84.6328 44.0182 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "IO_Bus_conn" + (at 84.6328 46.3296 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x19_P2.54mm_Horizontal" + (at 82.55 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 82.55 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 82.55 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "13" + (uuid "328ba782-ef89-495a-9b71-8d6493143951") + ) + (pin "16" + (uuid "c39df8be-ae63-43d6-90df-b18497fbafad") + ) + (pin "17" + (uuid "8b861fa8-37ec-4272-9557-a08d91113930") + ) + (pin "18" + (uuid "9e0d4a2d-101b-4bea-b8de-c0a7ba19b0e4") + ) + (pin "19" + (uuid "55afc2dd-0e12-4a0e-bb77-910e66970f13") + ) + (pin "2" + (uuid "fed5f7d7-e66f-45b5-bc4d-257ab3a04d35") + ) + (pin "3" + (uuid "f109cb2b-4961-4a55-8373-5f201ac9ab25") + ) + (pin "4" + (uuid "f43d0355-9100-4c85-b87c-035d29fc2829") + ) + (pin "5" + (uuid "4cf65ca1-144b-4985-9b35-769ae918d364") + ) + (pin "6" + (uuid "0870f713-5ed9-4e7d-9a5d-abe3bad143a6") + ) + (pin "14" + (uuid "d42b61d3-8215-499c-b538-3b33f2926da0") + ) + (pin "12" + (uuid "1642b16f-5e9f-4782-996f-4896aae8e851") + ) + (pin "1" + (uuid "982ad79a-9892-4f20-bc0d-71df5a216759") + ) + (pin "10" + (uuid "ddf94a9f-64e7-4205-8e4b-56c756589e89") + ) + (pin "11" + (uuid "6835a1fd-80f4-46d0-a595-6a5c6ae1fd4d") + ) + (pin "15" + (uuid "935fd8fb-e683-402f-b425-ae323bc68182") + ) + (pin "7" + (uuid "bd0537e7-d7ad-4c7d-9bd6-5ba3381b28c1") + ) + (pin "8" + (uuid "6f2cfb96-fa81-4611-93cf-2fb60f7c74a8") + ) + (pin "9" + (uuid "5c5e6e66-d13a-4426-91a5-d2e834410522") + ) + (instances + (project "4004_lcd_display" + (path "/b60673c4-5448-4b81-8c25-50d47b52f4a5" + (reference "IOBUS2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "keyboard-rescue:GND-power") + (at 105.41 41.91 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "bcf3a04d-f66b-4271-8b80-c92f4f62e730") + (property "Reference" "#PWR011" + (at 105.41 48.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 105.537 46.3042 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 105.41 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 105.41 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 105.41 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "a7b15941-11d5-4c7d-bd92-de683112a6b6") + ) + (instances + (project "4004_lcd_display" + (path "/b60673c4-5448-4b81-8c25-50d47b52f4a5" + (reference "#PWR011") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "keyboard-rescue:GND-power") + (at 127 127 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d678e6bf-d937-47e7-8e0f-811a5b1bd9f1") + (property "Reference" "#PWR06" + (at 127 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 127.127 131.3942 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 127 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 127 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 127 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "4b9bd240-4f56-4b2a-b731-a36f5ee315f3") + ) + (instances + (project "4004_lcd_display" + (path "/b60673c4-5448-4b81-8c25-50d47b52f4a5" + (reference "#PWR06") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "keyboard-rescue:GND-power") + (at 130.81 118.11 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "dffb20c1-538b-4949-8612-e32bd91d8941") + (property "Reference" "#PWR08" + (at 130.81 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 130.937 122.5042 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 130.81 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 130.81 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 130.81 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "09adf8e7-77cd-4443-82c4-ae40f640cea1") + ) + (instances + (project "4004_lcd_display" + (path "/b60673c4-5448-4b81-8c25-50d47b52f4a5" + (reference "#PWR08") + (unit 1) + ) + ) + ) + ) + (sheet_instances + (path "/" + (page "1") + ) + ) +)