Krolyxon
Commit 3120783

Branches

Tags

Refs →

orion-rf.piolibdepsesp32-s3-n16r8U8g2examplesgamesSpaceTrashSpaceTrash.ino

1857 lines · 79.2 KB

1/*
2
3 SpaceTrash.ino
4
5 Universal 8bit Graphics Library (https://github.com/olikraus/u8g2/)
6
7 Copyright (c) 2016, olikraus@gmail.com
8 All rights reserved.
9
10 Redistribution and use in source and binary forms, with or without modification,
11 are permitted provided that the following conditions are met:
12
13 * Redistributions of source code must retain the above copyright notice, this list
14 of conditions and the following disclaimer.
15
16 * Redistributions in binary form must reproduce the above copyright notice, this
17 list of conditions and the following disclaimer in the documentation and/or other
18 materials provided with the distribution.
19
20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
21 CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
22 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
25 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
30 STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
32 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33
34*/
35
36#include <Arduino.h>
37#include <U8g2lib.h>
38
39#ifdef U8X8_HAVE_HW_SPI
40#include <SPI.h>
41#endif
42#ifdef U8X8_HAVE_HW_I2C
43#include <Wire.h>
44#endif
45
46// Please UNCOMMENT one of the contructor lines below
47// U8g2 Contructor List (Picture Loop Page Buffer)
48// The complete list is available here: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp
49// Please update the pin numbers according to your setup. Use U8X8_PIN_NONE if the reset pin is not connected
50//U8G2_NULL u8g2(U8G2_R0); // null device, a 8x8 pixel display which does nothing
51//U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
52//U8G2_SSD1306_128X64_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 12, /* dc=*/ 4, /* reset=*/ 6); // Arduboy (Production, Kickstarter Edition)
53//U8G2_SSD1306_128X64_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
54//U8G2_SSD1306_128X64_NONAME_1_3W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* reset=*/ 8);
55//U8G2_SSD1306_128X64_NONAME_1_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 8);
56//U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
57//U8G2_SSD1306_128X64_ALT0_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // same as the NONAME variant, but may solve the "every 2nd line skipped" problem
58//U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* reset=*/ 8);
59//U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // All Boards without Reset of the Display
60//U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ 16, /* data=*/ 17, /* reset=*/ U8X8_PIN_NONE); // ESP32 Thing, pure SW emulated I2C
61//U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 16, /* data=*/ 17); // ESP32 Thing, HW I2C with pin remapping
62//U8G2_SSD1306_128X64_NONAME_1_6800 u8g2(U8G2_R0, 13, 11, 2, 3, 4, 5, 6, A4, /*enable=*/ 7, /*cs=*/ 10, /*dc=*/ 9, /*reset=*/ 8);
63//U8G2_SSD1306_128X64_NONAME_1_8080 u8g2(U8G2_R0, 13, 11, 2, 3, 4, 5, 6, A4, /*enable=*/ 7, /*cs=*/ 10, /*dc=*/ 9, /*reset=*/ 8);
64//U8G2_SSD1306_128X64_VCOMH0_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // same as the NONAME variant, but maximizes setContrast() range
65//U8G2_SSD1306_128X64_ALT0_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // same as the NONAME variant, but may solve the "every 2nd line skipped" problem
66//U8G2_SSD1306_102X64_EA_OLEDS102_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // same as the NONAME variant, but may solve the "every 2nd line skipped" problem
67//U8G2_SSD1312_128X64_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
68//U8G2_SSD1312_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ 8);
69//U8G2_SSD1312_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ 8);
70//U8G2_SSD1312_120X28_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
71//U8G2_SSD1312_120X28_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ 8);
72//U8G2_SSD1312_120X28_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ 8);
73//U8G2_SH1106_128X64_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
74//U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
75//U8G2_SH1106_128X64_VCOMH0_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // same as the NONAME variant, but maximizes setContrast() range
76//U8G2_SH1106_128X64_WINSTAR_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // same as the NONAME variant, but uses updated SH1106 init sequence
77//U8G2_SH1106_128X32_VISIONOX_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
78//U8G2_SH1106_128X32_VISIONOX_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
79//U8G2_SH1106_72X40_WISE_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
80//U8G2_SH1107_64X128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
81//U8G2_SH1107_128X128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
82//U8G2_SH1107_128X128_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ 8);
83//U8G2_SH1107_128X80_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ 8);
84//U8G2_SH1107_PIMORONI_128X128_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ 8);
85//U8G2_SH1107_SEEED_128X128_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);
86//U8G2_SH1107_SEEED_128X128_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
87//U8G2_SH1107_SEEED_96X96_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
88//U8G2_SH1107_HJR_OEL1M0201_96X96_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
89//U8G2_SH1107_TK078F288_80X128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
90//U8G2_SH1108_128X160_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
91//U8G2_CH1120_128X160_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
92//U8G2_SH1108_160X160_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
93//U8G2_SH1122_256X64_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Enable U8G2_16BIT in u8g2.h
94//U8G2_SH1122_256X64_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Enable U8G2_16BIT in u8g2.h
95//U8G2_SSD1306_128X32_UNIVISION_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ 21, /* data=*/ 20, /* reset=*/ U8X8_PIN_NONE); // Adafruit Feather M0 Basic Proto + FeatherWing OLED
96//U8G2_SSD1306_128X32_UNIVISION_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // Adafruit Feather ESP8266/32u4 Boards + FeatherWing OLED
97//U8G2_SSD1306_128X32_UNIVISION_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // Adafruit ESP8266/32u4/ARM Boards + FeatherWing OLED
98//U8G2_SSD1306_128X32_UNIVISION_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ SCL, /* data=*/ SDA); // pin remapping with ESP8266 HW I2C
99//U8G2_SSD1306_128X32_WINSTAR_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ SCL, /* data=*/ SDA); // pin remapping with ESP8266 HW I2C
100//U8G2_SSD1306_64X48_ER_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // EastRising 0.66" OLED breakout board, Uno: A4=SDA, A5=SCL, 5V powered
101//U8G2_SSD1306_48X64_WINSTAR_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
102//U8G2_SSD1306_64X32_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
103//U8G2_SSD1306_64X32_1F_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
104//U8G2_SSD1306_96X16_ER_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // EastRising 0.69" OLED
105//U8G2_SSD1306_72X40_ER_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // EastRising 0.42" OLED
106//U8G2_SSD1306_96X40_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
107//U8G2_SSD1306_96X39_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
108//U8G2_SSD1322_240X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
109//U8G2_SSD1322_TOPWIN_240X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
110//U8G2_SSD1322_NHD_256X64_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Enable U8G2_16BIT in u8g2.h
111//U8G2_SSD1322_NHD_256X64_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Enable U8G2_16BIT in u8g2.h
112//U8G2_SSD1322_ZJY_256X64_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Enable U8G2_16BIT in u8g2.h
113//U8G2_SSD1322_ZJY_256X64_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Enable U8G2_16BIT in u8g2.h
114//U8G2_SSD1362_256X64_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Enable U8G2_16BIT in u8g2.h
115//U8G2_SSD1362_256X64_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Enable U8G2_16BIT in u8g2.h
116//U8G2_SSD1362_206X36_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
117//U8G2_SSD1362_206X36_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
118//U8G2_SSD1363_256X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Enable U8G2_16BIT in u8g2.h
119//U8G2_SSD1363_256X128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Enable U8G2_16BIT in u8g2.h
120//U8G2_SSD1322_NHD_128X64_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
121//U8G2_SSD1322_NHD_128X64_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
122//U8G2_SSD1325_NHD_128X64_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
123//U8G2_SSD1325_NHD_128X64_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
124//U8G2_SSD0323_OS128064_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
125//U8G2_SSD0323_OS128064_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
126//U8G2_SSD1326_ER_256X32_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // experimental driver for ER-OLED018-1
127//U8G2_SSD1327_SEEED_96X96_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // Seeedstudio Grove OLED 96x96
128//U8G2_SSD1327_SEEED_96X96_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // Seeedstudio Grove OLED 96x96
129//U8G2_SSD1327_EA_W128128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
130//U8G2_SSD1327_EA_W128128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
131//U8G2_SSD1327_EA_W128128_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ 5, /* data=*/ 4, /* reset=*/ U8X8_PIN_NONE);
132//U8G2_SSD1327_EA_W128128_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); /* Uno: A4=SDA, A5=SCL, add "u8g2.setBusClock(400000);" into setup() for speedup if possible */
133//U8G2_SSD1327_MIDAS_128X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
134//U8G2_SSD1327_MIDAS_128X128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
135//U8G2_SSD1327_MIDAS_128X128_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); /* Uno: A4=SDA, A5=SCL, add "u8g2.setBusClock(400000);" into setup() for speedup if possible */
136//U8G2_SSD1327_ZJY_128X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
137//U8G2_SSD1327_ZJY_128X128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
138//U8G2_SSD1327_ZJY_128X128_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); /* Uno: A4=SDA, A5=SCL, add "u8g2.setBusClock(400000);" into setup() for speedup if possible */
139//U8G2_SSD1327_WS_128X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
140//U8G2_SSD1327_WS_128X128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
141//U8G2_SSD1327_VISIONOX_128X96_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
142//U8G2_SSD1327_VISIONOX_128X96_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
143//U8G2_SSD1329_128X96_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
144//U8G2_SSD1329_128X96_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
145//U8G2_SSD1329_96X96_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
146//U8G2_SSD1329_96X96_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
147//U8G2_SSD1329_96X96_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ A4, /* dc=*/ A2, /* reset=*/ U8X8_PIN_NONE); // Adafruit Feather 32u4 Basic Proto
148//U8G2_SSD1305_128X32_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
149//U8G2_SSD1305_128X32_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
150//U8G2_SSD1305_128X32_ADAFRUIT_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
151//U8G2_SSD1305_128X32_ADAFRUIT_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
152//U8G2_SSD1305_128X64_ADAFRUIT_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
153//U8G2_SSD1305_128X64_ADAFRUIT_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
154//U8G2_SSD1305_128X64_RAYSTAR_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
155//U8G2_SSD1305_128X64_RAYSTAR_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
156//U8G2_SSD1309_128X64_NONAME0_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
157//U8G2_SSD1309_128X64_NONAME0_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
158//U8G2_SSD1309_128X128_NONAME0_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
159//U8G2_SSD1309_128X128_NONAME0_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
160//U8G2_SSD1309_128X64_NONAME2_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
161//U8G2_SSD1309_128X64_NONAME2_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
162//U8G2_SSD1316_128X32_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
163//U8G2_SSD1316_128X32_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
164//U8G2_SSD1316_96X32_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
165//U8G2_SSD1316_96X32_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
166//U8G2_SSD1317_96X96_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // not tested, not confirmed
167//U8G2_SSD1317_96X96_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // not tested, not confirmed
168//U8G2_SSD1318_128X96_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
169//U8G2_SSD1318_128X96_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
170//U8G2_SSD1320_160X132_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
171//U8G2_SSD1320_160X132_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
172//U8G2_SSD1320_160X80_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
173//U8G2_SSD1320_160X80_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
174//U8G2_SSD1320_128X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
175//U8G2_SSD1320_128X72_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
176//U8G2_LD7032_60X32_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 11, /* data=*/ 12, /* cs=*/ 9, /* dc=*/ 10, /* reset=*/ 8); // SW SPI Nano Board
177//U8G2_LD7032_60X32_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ 11, /* data=*/ 12, /* reset=*/ U8X8_PIN_NONE); // NOT TESTED!
178//U8G2_LD7032_60X32_ALT_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 11, /* data=*/ 12, /* cs=*/ 9, /* dc=*/ 10, /* reset=*/ 8); // SW SPI Nano Board
179//U8G2_LD7032_60X32_ALT_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ 11, /* data=*/ 12, /* reset=*/ U8X8_PIN_NONE); // NOT TESTED!
180//U8G2_LD7032_128X36_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 11, /* data=*/ 12, /* cs=*/ 9, /* dc=*/ 10, /* reset=*/ 8); // SW SPI Nano Board
181//U8G2_LD7032_128X36_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ 11, /* data=*/ 12, /* reset=*/ U8X8_PIN_NONE); // NOT TESTED!
182//U8G2_UC1701_EA_DOGS102_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
183//U8G2_UC1701_EA_DOGS102_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
184//U8G2_PCD8544_84X48_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Nokia 5110 Display
185//U8G2_PCD8544_84X48_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Nokia 5110 Display
186//U8G2_PCF8812_96X65_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Could be also PCF8814
187//U8G2_PCF8812_96X65_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Could be also PCF8814
188//U8G2_PCF8812_101X64_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Could be also PCF8814
189//U8G2_PCF8812_101X64_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Could be also PCF8814
190//U8G2_HX1230_96X68_1_3W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* reset=*/ 8);
191//U8G2_HX1230_96X68_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
192//U8G2_KS0108_128X64_1 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*dc=*/ 17, /*cs0=*/ 14, /*cs1=*/ 15, /*cs2=*/ U8X8_PIN_NONE, /* reset=*/ U8X8_PIN_NONE); // Set R/W to low!
193//U8G2_KS0108_ERM19264_1 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*dc=*/ 17, /*cs0=*/ 14, /*cs1=*/ 15, /*cs2=*/ 16, /* reset=*/ U8X8_PIN_NONE); // Set R/W to low!
194//U8G2_HD44102_100X64_1 u8g2(U8G2_R0, 4, 5, 6, 7, 8, 9, 10, 11, /*enable=*/ 2, /*dc=*/ 3, /*cs0=*/ A0, /*cs1=*/ A1, /*cs2=*/ A2, /* reset=*/ U8X8_PIN_NONE); // Set R/W to low!
195//U8G2_T7932_150X32_1 u8g2(U8G2_R0, 4, 5, 6, 7, 8, 9, 10, 11, /*enable=*/ 2, /*dc=*/ 3, /*cs0=*/ A0, /*cs1=*/ A1, /*cs2=*/ A2, /* reset=*/ U8X8_PIN_NONE); // Set R/W to low!
196//U8G2_ST7920_256X32_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*cs=*/ U8X8_PIN_NONE, /*dc=*/ 17, /*reset=*/ U8X8_PIN_NONE);
197//U8G2_ST7920_256X32_1_SW_SPI u8g2(U8G2_R0, /* clock=*/ 18 /* A4 */ , /* data=*/ 16 /* A2 */, /* CS=*/ 17 /* A3 */, /* reset=*/ U8X8_PIN_NONE);
198//U8G2_ST7920_192X32_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*cs=*/ U8X8_PIN_NONE, /*dc=*/ 17, /*reset=*/ U8X8_PIN_NONE);
199//U8G2_ST7920_192X32_1_SW_SPI u8g2(U8G2_R0, /* clock=*/ 18 /* A4 */ , /* data=*/ 16 /* A2 */, /* CS=*/ 17 /* A3 */, /* reset=*/ U8X8_PIN_NONE);
200//U8G2_ST7920_128X32_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*cs=*/ U8X8_PIN_NONE, /*dc=*/ 17, /*reset=*/ U8X8_PIN_NONE);
201//U8G2_ST7920_128X32_1_SW_SPI u8g2(U8G2_R0, /* clock=*/ 18 /* A4 */ , /* data=*/ 16 /* A2 */, /* CS=*/ 17 /* A3 */, /* reset=*/ U8X8_PIN_NONE);
202//U8G2_ST7920_144X32_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*cs=*/ U8X8_PIN_NONE, /*dc=*/ 17, /*reset=*/ U8X8_PIN_NONE);
203//U8G2_ST7920_144X32_1_SW_SPI u8g2(U8G2_R0, /* clock=*/ 18 /* A4 */ , /* data=*/ 16 /* A2 */, /* CS=*/ 17 /* A3 */, /* reset=*/ U8X8_PIN_NONE);
204//U8G2_ST7920_160X32_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*cs=*/ U8X8_PIN_NONE, /*dc=*/ 17, /*reset=*/ U8X8_PIN_NONE);
205//U8G2_ST7920_160X32_1_SW_SPI u8g2(U8G2_R0, /* clock=*/ 18 /* A4 */ , /* data=*/ 16 /* A2 */, /* CS=*/ 17 /* A3 */, /* reset=*/ U8X8_PIN_NONE);
206//U8G2_ST7920_128X64_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18 /* A4 */, /*cs=*/ U8X8_PIN_NONE, /*dc/rs=*/ 17 /* A3 */, /*reset=*/ 15 /* A1 */); // Remember to set R/W to 0
207//U8G2_ST7920_128X64_1_SW_SPI u8g2(U8G2_R0, /* clock=*/ 18 /* A4 */ , /* data=*/ 16 /* A2 */, /* CS=*/ 17 /* A3 */, /* reset=*/ U8X8_PIN_NONE);
208//U8G2_ST7920_128X64_1_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* CS=*/ 10, /* reset=*/ 8);
209//U8G2_ST7920_128X64_1_SW_SPI u8g2(U8G2_R0, /* clock=*/ 14, /* data=*/ 13, /* CS=*/ 15, /* reset=*/ 16); // Feather HUZZAH ESP8266, E=clock=14, RW=data=13, RS=CS
210//U8G2_ST7920_128X64_1_HW_SPI u8g2(U8G2_R0, /* CS=*/ 10, /* reset=*/ 8);
211//U8G2_ST7920_128X64_1_HW_SPI u8g2(U8G2_R0, /* CS=*/ 15, /* reset=*/ 16); // Feather HUZZAH ESP8266, E=clock=14, RW=data=13, RS=CS
212//U8G2_ST7528_ERC16064_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
213//U8G2_ST7528_ERC16064_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
214//U8G2_ST7539_192X64_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
215//U8G2_ST7539_192X64_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
216//U8G2_ST7565_EA_DOGM128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
217//U8G2_ST7565_EA_DOGM128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
218//U8G2_ST7565_64128N_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
219//U8G2_ST7565_64128N_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
220//U8G2_ST7565_EA_DOGM132_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ U8X8_PIN_NONE); // DOGM132 Shield
221//U8G2_ST7565_EA_DOGM132_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ U8X8_PIN_NONE); // DOGM132 Shield
222//U8G2_ST7565_ZOLEN_128X64_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
223//U8G2_ST7565_ZOLEN_128X64_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
224//U8G2_ST7565_LM6059_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Adafruit ST7565 GLCD
225//U8G2_ST7565_LM6059_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Adafruit ST7565 GLCD
226//U8G2_ST7565_KS0713_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // KS0713 controller
227//U8G2_ST7565_KS0713_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // KS0713 controller
228//U8G2_ST7565_LX12864_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
229//U8G2_ST7565_LX12864_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
230//U8G2_ST7565_ERC12864_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
231//U8G2_ST7565_ERC12864_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
232//U8G2_ST7565_ERC12864_ALT_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // contrast improved version for ERC12864
233//U8G2_ST7565_ERC12864_ALT_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // contrast improved version for ERC12864
234//U8G2_ST7565_NHD_C12832_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
235//U8G2_ST7565_NHD_C12832_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
236//U8G2_ST7565_NHD_C12864_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
237//U8G2_ST7565_NHD_C12864_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
238//U8G2_ST7565_JLX12864_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
239//U8G2_ST7565_JLX12864_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
240//U8G2_ST7567_PI_132X64_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 7, /* dc=*/ 9, /* reset=*/ 8); // Pax Instruments Shield, LCD_BL=6
241//U8G2_ST7567_PI_132X64_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 7, /* dc=*/ 9, /* reset=*/ 8); // Pax Instruments Shield, LCD_BL=6
242//U8G2_ST7567_JLX12864_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 7, /* dc=*/ 9, /* reset=*/ 8);
243//U8G2_ST7567_JLX12864_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 7, /* dc=*/ 9, /* reset=*/ 8);
244//U8G2_ST7567_122X32_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 7, /* dc=*/ 9, /* reset=*/ 8);
245//U8G2_ST7567_122X32_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 7, /* dc=*/ 9, /* reset=*/ 8);
246//U8G2_ST7567_OS12864_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 7, /* dc=*/ 9, /* reset=*/ 8);
247//U8G2_ST7567_OS12864_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 7, /* dc=*/ 9, /* reset=*/ 8);
248//U8G2_ST7567_ENH_DG128064_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
249//U8G2_ST7567_ENH_DG128064_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
250//U8G2_ST7567_ENH_DG128064I_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
251//U8G2_ST7567_ENH_DG128064I_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
252//U8G2_ST7567_64X32_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
253//U8G2_ST7567_HEM6432_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
254//U8G2_ST7567_ERC13232_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
255//U8G2_ST7567_ERC13232_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
256//U8G2_ST7567_96X65_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
257//U8G2_ST7567_96X65_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
258//U8G2_ST7571_128X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
259//U8G2_ST7571_128X128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
260//U8G2_ST7571_128X96_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
261//U8G2_ST7571_128X96_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
262//U8G2_ST7571_G12896_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
263//U8G2_ST7571_G12896_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
264//U8G2_ST7302_122X250_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
265//U8G2_ST7305_122X250_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
266//U8G2_ST7305_200X200_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
267//U8G2_ST7305_168X384_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
268//U8G2_ST7305_300X400_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
269//U8G2_ST7586S_JLX384160_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Uno: Enable U8g2 16 bit mode for this display
270//U8G2_ST7586S_ERC240160_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
271//U8G2_ST7586S_YMC240160_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
272//U8G2_ST7586S_JLX320160_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Uno: Enable U8g2 16 bit mode for this display
273//U8G2_ST75160_JM16096_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
274//U8G2_ST75160_JM16096_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
275//U8G2_ST75161_JLX160160_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
276//U8G2_ST75161_JLX160160_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
277//U8G2_ST75256_JLX172104_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
278//U8G2_ST75256_JLX172104_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
279//U8G2_ST75256_JLX19296_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
280//U8G2_ST75256_JLX19296_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
281//U8G2_ST75256_JLX16080_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
282//U8G2_ST75256_JLX16080_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
283//U8G2_ST75256_JLX256128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Uno, Enable U8g2 16 bit mode for this display
284//U8G2_ST75256_JLX256128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Uno, Enable U8g2 16 bit mode for this display
285//U8G2_ST75256_128X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Uno, Enable U8g2 16 bit mode for this display
286//U8G2_ST75256_128X128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Uno, Enable U8g2 16 bit mode for this display
287//U8G2_ST75256_WO256X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Uno, Enable U8g2 16 bit mode for this display
288//U8G2_ST75256_WO256X128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Uno, Enable U8g2 16 bit mode for this display
289//U8G2_ST75256_JLX256128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 9, /* data=*/ 8, /* cs=*/ 7, /* dc=*/ 6, /* reset=*/ 5); // MKR Zero, Enable U8g2 16 bit mode for this display
290//U8G2_ST75256_JLX256128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 7, /* dc=*/ 6, /* reset=*/ 5); // MKR Zero, Enable U8g2 16 bit mode for this display
291//U8G2_ST75256_JLX256160_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Uno, Enable U8g2 16 bit mode for this display
292//U8G2_ST75256_JLX256160_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Uno, Enable U8g2 16 bit mode for this display
293//U8G2_ST75256_JLX256160M_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Uno, Enable U8g2 16 bit mode for this display
294//U8G2_ST75256_JLX256160M_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Uno, Enable U8g2 16 bit mode for this display
295//U8G2_ST75256_JLX256160_ALT_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Uno, Enable U8g2 16 bit mode for this display
296//U8G2_ST75256_JLX256160_ALT_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Uno, Enable U8g2 16 bit mode for this display
297//U8G2_ST75256_JLX240160_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
298//U8G2_ST75256_JLX240160_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
299//U8G2_ST75256_JLX25664_1_2ND_HW_I2C u8g2(U8G2_R0, /* reset=*/ 8); // Due, 2nd I2C, enable U8g2 16 bit mode for this display
300//U8G2_ST75320_JLX320240_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Uno, Enable U8g2 16 bit mode for this display
301//U8G2_ST75320_JLX320240_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Uno, Enable U8g2 16 bit mode for this display
302//U8G2_NT7534_TG12864R_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
303//U8G2_NT7534_TG12864R_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
304//U8G2_ST7588_JLX12864_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ 5);
305//U8G2_ST7588_JLX12864_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ 5);
306//U8G2_IST3020_ERC19264_1_6800 u8g2(U8G2_R0, 44, 43, 42, 41, 40, 39, 38, 37, /*enable=*/ 28, /*cs=*/ 32, /*dc=*/ 30, /*reset=*/ 31); // Connect WR pin with GND
307//U8G2_IST3020_ERC19264_1_8080 u8g2(U8G2_R0, 44, 43, 42, 41, 40, 39, 38, 37, /*enable=*/ 29, /*cs=*/ 32, /*dc=*/ 30, /*reset=*/ 31); // Connect RD pin with 3.3V
308//U8G2_IST3020_ERC19264_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
309//U8G2_IST3088_320X240_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
310//U8G2_IST3088_320X240_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
311//U8G2_IST7920_128X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Round display
312//U8G2_IST7920_128X128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Round display
313//U8G2_LC7981_160X80_1_6800 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect RW with GND
314//U8G2_LC7981_160X160_1_6800 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect RW with GND
315//U8G2_LC7981_240X128_1_6800 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect RW with GND
316//U8G2_LC7981_240X64_1_6800 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect RW with GND
317//U8G2_LC7981_128X128_1_6800 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect RW with GND
318//U8G2_SED1520_122X32_1 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*dc=*/ A0, /*e1=*/ A3, /*e2=*/ A2, /* reset=*/ A4); // Set R/W to low!
319//U8G2_T6963_240X128_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable/wr=*/ 17, /*cs/ce=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect RD with +5V, FS0 and FS1 with GND
320//U8G2_T6963_256X64_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable/wr=*/ 17, /*cs/ce=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect RD with +5V, FS0 and FS1 with GND
321//U8G2_T6963_160X80_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable/wr=*/ 17, /*cs/ce=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect RD with +5V, FS0 and FS1 with GND
322//U8G2_T6963_128X64_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable/wr=*/ 17, /*cs/ce=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect RD with +5V, FS0 and FS1 with GND
323//U8G2_T6963_128X64_ALT_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable/wr=*/ 17, /*cs/ce=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect RD with +5V, FS0 and FS1 with GND
324//U8G2_T6963_128X160_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable/wr=*/ 17, /*cs/ce=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect RD with +5V, FS0 and FS1 with GND
325//U8G2_SED1330_240X64_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 17, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect /RD = E with +5V, enable is /WR = RW, FG with GND, 14=Uno Pin A0
326//U8G2_SED1330_240X128_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 17, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect /RD = E with +5V, enable is /WR = RW, FG with GND, 14=Uno Pin A0
327//U8G2_SED1330_240X128_1_6800 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 17, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // A0 is dc pin, /WR = RW = GND, enable is /RD = E
328//U8G2_SED1330_256X128_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 17, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect /RD = E with +5V, enable is /WR = RW, FG with GND, 14=Uno Pin A0, enable U8g2 16Bit Mode
329//U8G2_SED1330_256X128_1_6800 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 17, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // A0 is dc pin, /WR = RW = GND, enable is /RD = E, enable U8g2 16Bit Mode
330//U8G2_SED1330_320X200_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 17, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect /RD = E with +5V, enable is /WR = RW, FG with GND, 14=Uno Pin A0, enable U8g2 16Bit Mode
331//U8G2_SED1330_320X200_1_6800 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 17, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // A0 is dc pin, /WR = RW = GND, enable is /RD = E, enable U8g2 16Bit Mode
332//U8G2_RA8835_NHD_240X128_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 17, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect /RD = E with +5V, enable is /WR = RW, FG with GND, 14=Uno Pin A0
333//U8G2_RA8835_NHD_240X128_1_6800 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 17, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // A0 is dc pin, /WR = RW = GND, enable is /RD = E
334//U8G2_UC1601_128X32_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
335//U8G2_UC1601_128X32_1_3W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* reset=*/ 8);
336//U8G2_UC1601_128X64_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
337//U8G2_UC1604_JLX19264_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
338//U8G2_UC1604_JLX19264_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
339//U8G2_UC1609_SLG19264_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
340//U8G2_UC1609_SLG19264_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
341//U8G2_UC1608_ERC24064_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // SW SPI, Due ERC24064-1 Test Setup
342//U8G2_UC1608_DEM240064_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // SW SPI, Due ERC24064-1 Test Setup
343//U8G2_UC1608_ERC240120_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
344//U8G2_UC1608_240X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // SW SPI, Due ERC24064-1 Test Setup
345//U8G2_UC1610_EA_DOGXL160_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ U8X8_PIN_NONE);
346//U8G2_UC1610_EA_DOGXL160_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ U8X8_PIN_NONE);
347//U8G2_UC1611_EA_DOGM240_1_2ND_HW_I2C u8g2(U8G2_R0, /* reset=*/ 8); // Due, 2nd I2C, DOGM240 Test Board
348//U8G2_UC1611_EA_DOGM240_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // SW SPI, Due DOGXL240 Test Board
349//U8G2_UC1611_EA_DOGXL240_1_2ND_HW_I2C u8g2(U8G2_R0, /* reset=*/ 8); // Due, 2nd I2C, DOGXL240 Test Board
350//U8G2_UC1611_EA_DOGXL240_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // SW SPI, Due DOGXL240 Test Board
351//U8G2_UC1611_EW50850_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*cs=*/ 3, /*dc=*/ 16, /*reset=*/ 17); // 240x160, Connect RD/WR1 pin with 3.3V, CS is aktive high
352//U8G2_UC1611_CG160160_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*cs=*/ 3, /*dc=*/ 16, /*reset=*/ 17); // Connect WR1 and CD1 pin with 3.3V, connect CS0 with cs, WR0 with enable, CD with dc
353//U8G2_UC1611_IDS4073_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Enable U8g2 16Bit Mode
354//U8G2_UC1611_IDS4073_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Enable U8g2 16Bit Mode
355//U8G2_UC1617_JLX128128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
356//U8G2_UC1617_JLX128128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
357//U8G2_UC1628_128X64_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*cs=*/ 3, /*dc=*/ 16, /*reset=*/ 17); // UC1628 pin names: enable: /WR, dc: CD
358//U8G2_UC1628_128X64_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
359//U8G2_UC1628_128X64_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
360//U8G2_UC1628_256X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
361//U8G2_UC1628_256X128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
362//U8G2_UC1628_256X32_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
363//U8G2_UC1628_256X32_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
364//U8G2_UC1638_192X96_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
365//U8G2_UC1638_192X96_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
366//U8G2_UC1638_192X96_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* reset=*/ 8); // u8g2 test board: I2C clock/data is same as SPI, I2C default address is 0x78
367//U8G2_UC1638_240X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
368//U8G2_UC1638_240X128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
369//U8G2_UC1638_240X128_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* reset=*/ 8); // u8g2 test board: I2C clock/data is same as SPI, I2C default address is 0x78
370//U8G2_UC1698_160X160_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
371//U8G2_UC1698_160X160_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
372//U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // eInk/ePaper Display
373//U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // eInk/ePaper Display, original LUT from embedded artists
374//U8G2_SSD1607_GD_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Good Display
375//U8G2_SSD1607_WS_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Waveshare
376//U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
377//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
378//U8G2_LS013B7DH03_128X128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ U8X8_PIN_NONE, /* reset=*/ 8); // there is no DC line for this display
379//U8G2_LS027B7DH01_400X240_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ U8X8_PIN_NONE, /* reset=*/ 8); // there is no DC line for this display, SPI Mode 2
380//U8G2_LS027B7DH01_M0_400X240_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ U8X8_PIN_NONE, /* reset=*/ 8); // there is no DC line for this display, SPI Mode 0
381//U8G2_LS013B7DH05_144X168_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ U8X8_PIN_NONE, /* reset=*/ 8); // there is no DC line for this display
382//U8G2_ST7511_AVD_320X240_1_8080 u8g2(U8G2_R0, 13, 11, 2, 3, 4, 5, 6, A4, /*enable/WR=*/ 7, /*cs=*/ 10, /*dc=*/ 9, /*reset=*/ 8); // Enable U8g2 16Bit Mode and connect RD pin with 3.3V/5V
383//U8G2_ST7511_640X320_1_8080 u8g2(U8G2_R0, 13, 11, 2, 3, 4, 5, 6, A4, /*enable/WR=*/ 7, /*cs=*/ 10, /*dc=*/ 9, /*reset=*/ 8); // Enable U8g2 16Bit Mode and connect RD pin with 3.3V/5V
384//U8G2_S1D15300_LM6023_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
385//U8G2_S1D15300_LM6023_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
386//U8G2_S1D15300_100X32_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
387//U8G2_S1D15300_100X32_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
388//U8G2_S1D15300_100X32I_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
389//U8G2_S1D15300_100X32I_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
390//U8G2_S1D15721_240X64_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
391//U8G2_S1D15721_240X64_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
392//U8G2_GU800_128X64_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
393//U8G2_GU800_128X64_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
394//U8G2_GU800_160X16_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
395//U8G2_GU800_160X16_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
396//U8G2_GP1294AI_256X48_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/10, /* dc=*/U8X8_PIN_NONE, /* reset=*/8);
397
398
399
400
401// End of constructor list
402
403
404
405/* button setup for Arduboy Production */
406uint8_t pin_up = A0;
407uint8_t pin_down = A3;
408uint8_t pin_fire = 7;
409
410
411
412
413#define ST_FP 4
414
415/* object types */
416struct _st_ot_struct
417{
418 /*
419 missle and hit:
420 bit 0: player missle and trash
421 bit 1: trash, which might hit the player
422 */
423
424 uint8_t missle_mask; /* this object is a missle: it might destroy something if the target is_hit_fn says so */
425 uint8_t hit_mask; /* if missle_mask & hit_mask is != 0 then the object can be destroyed */
426 uint8_t points;
427 uint8_t draw_fn;
428 uint8_t move_fn;
429 /* ST_MOVE_FN_NONE, ST_MOVE_FN_X_SLOW */
430 uint8_t destroy_fn; /* object can be destroyed by a missle (e.g. a missle from the space ship) */
431 /* ST_DESTROY_FN_NONE, ST_DESTROY_FN_SPLIT */
432 uint8_t is_hit_fn; /* is hit procedure */
433 /* ST_IS_HIT_FN_NONE, ST_IS_HIT_BBOX */
434 uint8_t fire_fn;
435 /* ST_FIRE_FN_NONE, ST_FIRE_FN_X_LEFT */
436
437};
438typedef struct _st_ot_struct st_ot;
439
440/*
441 objects, which are visible at the play area
442*/
443struct _st_obj_struct
444{
445 uint8_t ot; /* object type: zero means, object is not used */
446 int8_t tmp; /* generic value, used by ST_MOVE_IMPLODE */
447 /* absolute position */
448 /* LCD pixel position is x>>ST_FP and y>>ST_FP */
449 int16_t x, y;
450 int8_t x0,y0,x1,y1; /* object outline in pixel, reference point is at 0,0 */
451};
452typedef struct _st_obj_struct st_obj;
453
454#define ST_DRAW_NONE 0
455#define ST_DRAW_BBOX 1
456#define ST_DRAW_TRASH1 2
457#define ST_DRAW_PLAYER1 3
458#define ST_DRAW_TRASH2 4
459#define ST_DRAW_PLAYER2 5
460#define ST_DRAW_PLAYER3 6
461#define ST_DRAW_GADGET 7
462#define ST_DRAW_BACKSLASH 8
463#define ST_DRAW_SLASH 9
464#define ST_DRAW_BIG_TRASH 10
465
466#define ST_MOVE_NONE 0
467#define ST_MOVE_X_SLOW 1
468#define ST_MOVE_PX_NORMAL 2
469#define ST_MOVE_PX_FAST 3
470#define ST_MOVE_PLAYER 4
471#define ST_MOVE_PY 5
472#define ST_MOVE_NY 6
473#define ST_MOVE_IMPLODE 7
474#define ST_MOVE_X_FAST 8
475#define ST_MOVE_WALL 9
476#define ST_MOVE_NXPY 10
477#define ST_MOVE_NXNY 11
478
479#define ST_IS_HIT_NONE 0
480#define ST_IS_HIT_BBOX 1
481#define ST_IS_HIT_WALL 2
482
483#define ST_DESTROY_NONE 0
484#define ST_DESTROY_DISAPPEAR 1
485#define ST_DESTROY_TO_DUST 2
486#define ST_DESTROY_GADGET 3
487#define ST_DESTROY_PLAYER 4
488#define ST_DESTROY_PLAYER_GADGETS 5
489#define ST_DESTROY_BIG_TRASH 6
490
491#define ST_FIRE_NONE 0
492#define ST_FIRE_PLAYER1 1
493#define ST_FIRE_PLAYER2 2
494#define ST_FIRE_PLAYER3 3
495
496#define ST_OT_WALL_SOLID 1
497#define ST_OT_BIG_TRASH 2
498#define ST_OT_MISSLE 3
499#define ST_OT_TRASH1 4
500#define ST_OT_PLAYER 5
501#define ST_OT_DUST_PY 6
502#define ST_OT_DUST_NY 7
503#define ST_OT_TRASH_IMPLODE 8
504#define ST_OT_TRASH2 9
505#define ST_OT_PLAYER2 10
506#define ST_OT_PLAYER3 11
507#define ST_OT_GADGET 12
508#define ST_OT_GADGET_IMPLODE 13
509#define ST_OT_DUST_NXPY 14
510#define ST_OT_DUST_NXNY 15
511
512
513/*================================================================*/
514/* graphics object */
515/*================================================================*/
516
517u8g2_t *st_u8g2;
518
519u8g2_uint_t u8g_height_minus_one;
520
521
522#define ST_AREA_HEIGHT (st_u8g2->height - 8)
523#define ST_AREA_WIDTH (st_u8g2->width)
524
525
526/*================================================================*/
527/* object types */
528/*================================================================*/
529
530
531const st_ot st_object_types[] U8X8_PROGMEM =
532{
533 /* 0: empty object type */
534 { 0, 0, 0, ST_DRAW_NONE, ST_MOVE_NONE, ST_DESTROY_DISAPPEAR, ST_IS_HIT_NONE, ST_FIRE_NONE },
535 /* 1: wall, player will be destroyed */
536 { 2, 1, 30, ST_DRAW_BBOX, ST_MOVE_WALL, ST_DESTROY_DISAPPEAR, ST_IS_HIT_WALL, ST_FIRE_NONE },
537 /* ST_OT_BIG_TRASH (2) */
538 { 2, 1, 0, ST_DRAW_BIG_TRASH, ST_MOVE_X_SLOW, ST_DESTROY_BIG_TRASH, ST_IS_HIT_BBOX, ST_FIRE_NONE },
539 /* 3: simple space ship (player) missle */
540 { 1, 0, 0, ST_DRAW_BBOX, ST_MOVE_PX_FAST, ST_DESTROY_DISAPPEAR, ST_IS_HIT_NONE, ST_FIRE_NONE },
541 /* ST_OT_TRASH1 (4): trash */
542 { 2, 1, 0, ST_DRAW_TRASH1, ST_MOVE_X_SLOW, ST_DESTROY_TO_DUST, ST_IS_HIT_BBOX, ST_FIRE_NONE },
543 /* ST_OT_PLAYER (5): player space ship */
544 { 0, 2, 0, ST_DRAW_PLAYER1, ST_MOVE_PLAYER, ST_DESTROY_PLAYER, ST_IS_HIT_BBOX, ST_FIRE_PLAYER1 },
545 /* ST_OT_DUST_PY (6): Last part of trash */
546 { 0, 0, 0, ST_DRAW_BBOX, ST_MOVE_PY, ST_DESTROY_NONE, ST_IS_HIT_NONE, ST_FIRE_NONE },
547 /* ST_OT_DUST_NY (7): Last part of trash */
548 { 0, 0, 0, ST_DRAW_BBOX, ST_MOVE_NY, ST_DESTROY_NONE, ST_IS_HIT_NONE, ST_FIRE_NONE },
549 /* ST_OT_TRASH_IMPLODE (8): trash was hit */
550 { 0, 0, 5, ST_DRAW_TRASH1, ST_MOVE_IMPLODE, ST_DESTROY_NONE, ST_IS_HIT_NONE, ST_FIRE_NONE },
551 /* ST_OT_TRASH2 (9): trash */
552 { 2, 1, 0, ST_DRAW_TRASH2, ST_MOVE_X_SLOW, ST_DESTROY_TO_DUST, ST_IS_HIT_BBOX, ST_FIRE_NONE },
553 /* ST_OT_PLAYER2 (10): player space ship+1x enhancement */
554 { 0, 2, 0, ST_DRAW_PLAYER2, ST_MOVE_PLAYER, ST_DESTROY_PLAYER_GADGETS, ST_IS_HIT_BBOX, ST_FIRE_PLAYER2 },
555 /* ST_OT_PLAYER3 (11): player space ship+2x enhancement */
556 { 0, 2, 0, ST_DRAW_PLAYER3, ST_MOVE_PLAYER, ST_DESTROY_PLAYER_GADGETS, ST_IS_HIT_BBOX, ST_FIRE_PLAYER3 },
557 /* ST_OT_GADGET (12): adds enhancements */
558 { 0, 1, 0, ST_DRAW_GADGET, ST_MOVE_X_FAST, ST_DESTROY_GADGET, ST_IS_HIT_BBOX, ST_FIRE_NONE },
559 /* ST_OT_GADGET_IMPLODE (13) */
560 { 0, 0, 20, ST_DRAW_GADGET, ST_MOVE_IMPLODE, ST_DESTROY_NONE, ST_IS_HIT_NONE, ST_FIRE_NONE },
561 /* ST_OT_DUST_NXPY (14): Last part of trash */
562 { 0, 0, 0, ST_DRAW_BACKSLASH, ST_MOVE_NXPY, ST_DESTROY_NONE, ST_IS_HIT_NONE, ST_FIRE_NONE },
563 /* ST_OT_DUST_NXNY (15): Last part of trash */
564 { 0, 0, 0, ST_DRAW_SLASH, ST_MOVE_NXNY, ST_DESTROY_NONE, ST_IS_HIT_NONE, ST_FIRE_NONE },
565
566};
567
568/*================================================================*/
569/* list of all objects on the screen */
570/*================================================================*/
571
572/* use AVR RAMEND constant to derive the number of allowed objects */
573
574#if RAMEND < 0x300
575#define ST_OBJ_CNT 25
576#else
577//#define ST_OBJ_CNT 45
578#define ST_OBJ_CNT 60
579#endif
580
581st_obj st_objects[ST_OBJ_CNT];
582
583/*================================================================*/
584/* about players space ship*/
585/*================================================================*/
586
587/* player position */
588uint8_t st_player_pos;
589
590/* points */
591#define ST_POINTS_PER_LEVEL 25
592uint16_t st_player_points;
593uint16_t st_player_points_delayed;
594uint16_t st_highscore = 0;
595
596/*================================================================*/
597/* overall game state */
598/*================================================================*/
599
600#define ST_STATE_PREPARE 0
601#define ST_STATE_IPREPARE 1
602#define ST_STATE_GAME 2
603#define ST_STATE_END 3
604#define ST_STATE_IEND 4
605
606uint8_t st_state = ST_STATE_PREPARE;
607
608/*================================================================*/
609/* game difficulty */
610/*================================================================*/
611uint8_t st_difficulty = 1;
612#define ST_DIFF_VIS_LEN 30
613#define ST_DIFF_FP 5
614uint16_t st_to_diff_cnt = 0;
615
616/*================================================================*/
617/* bitmaps */
618/*================================================================*/
619
620const uint8_t st_bitmap_player1[] =
621{
622 /* 01100000 */ 0x060,
623 /* 11111000 */ 0x0f8,
624 /* 01111110 */ 0x07e,
625 /* 11111000 */ 0x0f8,
626 /* 01100000 */ 0x060
627};
628
629const uint8_t st_bitmap_player2[] =
630{
631 /* 01100000 */ 0x060,
632 /* 01111100 */ 0x078,
633 /* 01100000 */ 0x060,
634 /* 11100000 */ 0x0e0,
635 /* 11111000 */ 0x0f8,
636 /* 01111110 */ 0x07e,
637 /* 11111000 */ 0x0f8,
638 /* 01100000 */ 0x060
639};
640
641const uint8_t st_bitmap_player3[] =
642{
643 /* 01100000 */ 0x060,
644 /* 01111100 */ 0x078,
645 /* 01100000 */ 0x060,
646 /* 11100000 */ 0x0e0,
647 /* 11111000 */ 0x0f8,
648 /* 01111110 */ 0x07e,
649 /* 11111000 */ 0x0f8,
650 /* 11100000 */ 0x0e0,
651 /* 01100000 */ 0x060,
652 /* 01111100 */ 0x078,
653 /* 01100000 */ 0x060
654 };
655
656const uint8_t st_bitmap_trash_5x5_1[] =
657{
658 /* 01110000 */ 0x070,
659 /* 11110000 */ 0x0f0,
660 /* 11111000 */ 0x0f8,
661 /* 01111000 */ 0x078,
662 /* 00110000 */ 0x030,
663};
664
665const uint8_t st_bitmap_trash_5x5_2[] =
666{
667 /* 00110000 */ 0x030,
668 /* 11111000 */ 0x0f8,
669 /* 11111000 */ 0x0f8,
670 /* 11110000 */ 0x0f0,
671 /* 01110000 */ 0x070,
672};
673
674const uint8_t st_bitmap_trash_7x7[] =
675{
676 /* 00111000 */ 0x038,
677 /* 01111100 */ 0x07c,
678 /* 11111100 */ 0x0fc,
679 /* 11111110 */ 0x0fe,
680 /* 11111110 */ 0x0fe,
681 /* 01111110 */ 0x07e,
682 /* 01111000 */ 0x078,
683};
684
685const uint8_t st_bitmap_gadget[] =
686{
687 /* 01110000 */ 0x070,
688 /* 11011000 */ 0x0d8,
689 /* 10001000 */ 0x088,
690 /* 11011000 */ 0x0d8,
691 /* 01110000 */ 0x070,
692};
693
694/*================================================================*/
695/* forward definitions */
696/*================================================================*/
697uint8_t st_rnd(void) U8X8_NOINLINE;
698static st_obj *st_GetObj(uint8_t objnr) U8X8_NOINLINE;
699uint8_t st_GetMissleMask(uint8_t objnr);
700uint8_t st_GetHitMask(uint8_t objnr);
701int8_t st_FindObj(uint8_t ot) U8X8_NOINLINE;
702void st_ClrObjs(void) U8X8_NOINLINE;
703int8_t st_NewObj(void) U8X8_NOINLINE;
704uint8_t st_CntObj(uint8_t ot);
705uint8_t st_CalcXY(st_obj *o) U8X8_NOINLINE;
706void st_SetXY(st_obj *o, uint8_t x, uint8_t y) U8X8_NOINLINE;
707
708void st_FireStep(uint8_t is_auto_fire, uint8_t is_fire) U8X8_NOINLINE;
709
710void st_InitTrash(uint8_t x, uint8_t y, int8_t dir);
711void st_NewGadget(uint8_t x, uint8_t y);
712void st_NewPlayerMissle(uint8_t x, uint8_t y) ;
713void st_NewTrashDust(uint8_t x, uint8_t y, int ot);
714void st_NewTrashDustAreaArgs(int16_t x, int16_t y, int ot);
715void st_SetupPlayer(uint8_t objnr, uint8_t ot);
716
717
718/*================================================================*/
719/* utility functions */
720/*================================================================*/
721
722char st_itoa_buf[12];
723char *st_itoa(unsigned long v)
724{
725 volatile unsigned char i = 11;
726 st_itoa_buf[11] = '\0';
727 while( i > 0)
728 {
729 i--;
730 st_itoa_buf[i] = (v % 10)+'0';
731 v /= 10;
732 if ( v == 0 )
733 break;
734 }
735 return st_itoa_buf+i;
736}
737
738
739uint8_t st_rnd(void)
740{
741 return rand();
742}
743
744/*
745 for the specified index number, return the object
746*/
747static st_obj *st_GetObj(uint8_t objnr)
748{
749 return st_objects+objnr;
750}
751
752
753/*
754 check, if this is a missle-like object (that is, can this object destroy something else)
755*/
756uint8_t st_GetMissleMask(uint8_t objnr)
757{
758 st_obj *o = st_GetObj(objnr);
759 return u8x8_pgm_read(&(st_object_types[o->ot].missle_mask));
760}
761
762/*
763 check, if this is a missle-like object (that is, can this object destroy something else)
764*/
765uint8_t st_GetHitMask(uint8_t objnr)
766{
767 st_obj *o = st_GetObj(objnr);
768 return u8x8_pgm_read(&(st_object_types[o->ot].hit_mask));
769}
770
771/*
772 search an empty object
773*/
774int8_t st_FindObj(uint8_t ot)
775{
776 int8_t i;
777 for( i = 0; i < ST_OBJ_CNT; i++ )
778 {
779 if ( st_objects[i].ot == ot )
780 return i;
781 }
782 return -1;
783}
784
785/*
786 delete all objects
787*/
788
789void st_ClrObjs(void)
790{
791 int8_t i;
792 for( i = 0; i < ST_OBJ_CNT; i++ )
793 st_objects[i].ot = 0;
794}
795
796/*
797 search an empty object
798*/
799int8_t st_NewObj(void)
800{
801 int8_t i;
802 for( i = 0; i < ST_OBJ_CNT; i++ )
803 {
804 if ( st_objects[i].ot == 0 )
805 return i;
806 }
807 return -1;
808}
809
810/*
811 count number of objectes of the provided type
812 st_CntObj(0) will return the number of empty objects, that means if
813 st_CntObj(0) > 0 then st_NewObj() will return a valid index
814*/
815uint8_t st_CntObj(uint8_t ot)
816{
817 uint8_t i;
818 uint8_t cnt = 0;
819 for( i = 0; i < ST_OBJ_CNT; i++ )
820 {
821 if ( st_objects[i].ot == ot )
822 cnt++;
823 }
824 return cnt;
825}
826
827/*
828 calculate the pixel coordinates of the reference point of an object
829 return rhe x value
830*/
831uint8_t st_px_x, st_px_y; /* pixel within area */
832uint8_t st_CalcXY(st_obj *o)
833{
834 //st_obj *o = st_GetObj(objnr);
835 st_px_y = o->y>>ST_FP;
836 st_px_x = o->x>>ST_FP;
837 return st_px_x;
838}
839
840void st_SetXY(st_obj *o, uint8_t x, uint8_t y)
841{
842 o->x = ((int16_t)x) << ST_FP;
843 o->y = ((int16_t)y) << ST_FP;
844}
845
846/*
847 calculate the object bounding box and place it into some global variables
848*/
849int16_t st_bbox_x0, st_bbox_y0, st_bbox_x1, st_bbox_y1;
850
851void st_CalcBBOX(uint8_t objnr)
852{
853 st_obj *o = st_GetObj(objnr);
854
855 st_bbox_x0 = (uint16_t)(o->x>>ST_FP);
856 st_bbox_x1 = st_bbox_x0;
857 st_bbox_x0 += o->x0;
858 st_bbox_x1 += o->x1;
859
860 st_bbox_y0 = (uint16_t)(o->y>>ST_FP);
861 st_bbox_y1 = st_bbox_y0;
862 st_bbox_y0 += o->y0;
863 st_bbox_y1 += o->y1;
864}
865
866/*
867 clip bbox with the view window. requires a call to st_CalcBBOX
868 return 0, if the bbox is totally outside the window
869*/
870uint8_t st_cbbox_x0, st_cbbox_y0, st_cbbox_x1, st_cbbox_y1;
871uint8_t st_ClipBBOX(void)
872{
873 if ( st_bbox_x0 >= ST_AREA_WIDTH )
874 return 0;
875 if ( st_bbox_x0 >= 0 )
876 st_cbbox_x0 = (uint16_t)st_bbox_x0;
877 else
878 st_cbbox_x0 = 0;
879
880 if ( st_bbox_x1 < 0 )
881 return 0;
882 if ( st_bbox_x1 < ST_AREA_WIDTH )
883 st_cbbox_x1 = (uint16_t)st_bbox_x1;
884 else
885 st_cbbox_x1 = ST_AREA_WIDTH-1;
886
887 if ( st_bbox_y0 >= ST_AREA_HEIGHT )
888 return 0;
889 if ( st_bbox_y0 >= 0 )
890 st_cbbox_y0 = (uint16_t)st_bbox_y0;
891 else
892 st_cbbox_y0 = 0;
893
894 if ( st_bbox_y1 < 0 )
895 return 0;
896 if ( st_bbox_y1 < ST_AREA_HEIGHT )
897 st_cbbox_y1 = (uint16_t)st_bbox_y1;
898 else
899 st_cbbox_y1 = ST_AREA_HEIGHT-1;
900
901 return 1;
902}
903
904
905/*================================================================*/
906/* universal member functions */
907/*================================================================*/
908
909
910uint8_t st_IsOut(uint8_t objnr)
911{
912 st_CalcBBOX(objnr);
913 if ( st_bbox_x0 >= ST_AREA_WIDTH )
914 return 1;
915 if ( st_bbox_x1 < 0 )
916 return 1;
917 if ( st_bbox_y0 >= ST_AREA_HEIGHT )
918 return 1;
919 if ( st_bbox_y1 < 0 )
920 return 1;
921 return 0;
922}
923
924void st_Disappear(uint8_t objnr)
925{
926 st_obj *o = st_GetObj(objnr);
927 st_player_points += u8x8_pgm_read(&(st_object_types[o->ot].points));
928 o->ot = 0;
929}
930
931/*================================================================*/
932/* type dependent member functions */
933/*================================================================*/
934
935void st_Move(uint8_t objnr)
936{
937 st_obj *o = st_GetObj(objnr);
938 switch(u8x8_pgm_read(&(st_object_types[o->ot].move_fn)))
939 {
940 case ST_MOVE_NONE:
941 break;
942 case ST_MOVE_X_SLOW:
943 o->x -= (1<<ST_FP)/8;
944 o->x -= st_difficulty;
945 o->y += (int16_t)o->tmp;
946 if ( o->y >= ((ST_AREA_HEIGHT-1) << ST_FP) || o->y <= 0 )
947 o->tmp = - o->tmp;
948 break;
949 case ST_MOVE_X_FAST:
950 o->x -= (1<<ST_FP)/2;
951 o->y += (int16_t)o->tmp;
952 if ( o->y >= ((ST_AREA_HEIGHT-1) << ST_FP) || o->y <= 0 )
953 o->tmp = - o->tmp;
954 break;
955 case ST_MOVE_PX_NORMAL:
956 o->x += (1<<ST_FP)/4;
957 break;
958 case ST_MOVE_PX_FAST:
959 o->x += (1<<ST_FP);
960 break;
961 case ST_MOVE_PLAYER:
962 o->y = st_player_pos<<ST_FP;
963 break;
964 case ST_MOVE_PY:
965 o->y += 3*ST_FP;
966 break;
967 case ST_MOVE_NY:
968 o->y -= 3*ST_FP;
969 break;
970 case ST_MOVE_NXPY:
971 o->y += 3*ST_FP;
972 o->x -= 3*ST_FP;
973 break;
974 case ST_MOVE_NXNY:
975 o->y -= 3*ST_FP;
976 o->x -= 3*ST_FP;
977 break;
978 case ST_MOVE_IMPLODE:
979 o->tmp++;
980 if ( (o->tmp & 0x03) == 0 )
981 {
982 if ( o->x0 != o->x1 )
983 o->x0++;
984 else
985 st_Disappear(objnr);
986 }
987 break;
988 case ST_MOVE_WALL:
989 o->x -= 1;
990 o->x -= (st_difficulty>>1);
991 break;
992 }
993}
994
995void st_DrawBBOX(uint8_t objnr)
996{
997 uint8_t y0, y1;
998 /*st_obj *o = st_GetObj(objnr);*/
999 st_CalcBBOX(objnr);
1000 if ( st_ClipBBOX() == 0 )
1001 return;
1002 /* st_cbbox_x0, st_cbbox_y0, st_cbbox_x1, st_cbbox_y1; */
1003
1004
1005 // w = st_cbbox_x1-st_cbbox_x0;
1006 // w++;
1007 // h = st_cbbox_y1-st_cbbox_y0;
1008 // h++;
1009
1010
1011 //dog_SetVLine(st_cbbox_x0, st_cbbox_y0, st_cbbox_y1);
1012 //dog_SetVLine(st_cbbox_x1, st_cbbox_y0, st_cbbox_y1);
1013 //dog_SetHLine(st_cbbox_x0, st_cbbox_x1, st_cbbox_y0);
1014 //dog_SetHLine(st_cbbox_x0, st_cbbox_x1, st_cbbox_y1);
1015
1016 u8g2_SetDrawColor(st_u8g2, 1);
1017 y0 = u8g_height_minus_one - st_cbbox_y0;
1018 y1 = u8g_height_minus_one - st_cbbox_y1;
1019
1020 u8g2_DrawFrame(st_u8g2, st_cbbox_x0, y1, st_cbbox_x1-st_cbbox_x0+1, y0-y1+1);
1021
1022 //dog_SetBox(st_cbbox_x0, st_cbbox_y0, st_cbbox_x1, st_cbbox_y1);
1023
1024 /*
1025 if ( o->ot == ST_OT_PLAYER )
1026 {
1027 dog_DrawStr(0, 26, font_4x6, st_itoa(st_cbbox_y0));
1028 dog_DrawStr(10, 26, font_4x6, st_itoa(st_cbbox_y1));
1029 }
1030 */
1031}
1032
1033#ifdef FN_IS_NOT_IN_USE
1034void st_DrawFilledBox(uint8_t objnr)
1035{
1036 st_CalcBBOX(objnr);
1037 if ( st_ClipBBOX() == 0 )
1038 return;
1039 /* st_cbbox_x0, st_cbbox_y0, st_cbbox_x1, st_cbbox_y1; */
1040 dog_SetBox(st_cbbox_x0, st_cbbox_y0, st_cbbox_x1, st_cbbox_y1);
1041}
1042#endif
1043
1044void st_DrawBitmap(uint8_t objnr, const uint8_t * bm, uint8_t w, uint8_t h)
1045{
1046 /* st_obj *o = st_GetObj(objnr); */
1047 st_CalcBBOX(objnr);
1048 /* result is here: int16_t st_bbox_x0, st_bbox_y0, st_bbox_x1, st_bbox_y1 */
1049 //dog_SetBitmapP(st_bbox_x0,st_bbox_y1,bm,w,h);
1050
1051 u8g2_DrawBitmap(st_u8g2, st_bbox_x0, u8g_height_minus_one - st_bbox_y1, (w+7)/8, h, bm);
1052
1053 }
1054
1055void st_DrawObj(uint8_t objnr)
1056{
1057 st_obj *o = st_GetObj(objnr);
1058 switch(u8x8_pgm_read(&(st_object_types[o->ot].draw_fn)))
1059 {
1060 case ST_DRAW_NONE:
1061 break;
1062 case ST_DRAW_BBOX:
1063 st_DrawBBOX(objnr);
1064 break;
1065 case ST_DRAW_TRASH1:
1066 st_DrawBitmap(objnr, st_bitmap_trash_5x5_1,o->x1-o->x0+1, 5);
1067 break;
1068 case ST_DRAW_TRASH2:
1069 st_DrawBitmap(objnr, st_bitmap_trash_5x5_2,o->x1-o->x0+1, 5);
1070 break;
1071 case ST_DRAW_BIG_TRASH:
1072 st_DrawBitmap(objnr, st_bitmap_trash_7x7,o->x1-o->x0+1, 7);
1073 break;
1074 case ST_DRAW_PLAYER1:
1075 st_DrawBitmap(objnr, st_bitmap_player1,7,5);
1076 break;
1077 case ST_DRAW_PLAYER2:
1078 st_DrawBitmap(objnr, st_bitmap_player2,7,8);
1079 break;
1080 case ST_DRAW_PLAYER3:
1081 st_DrawBitmap(objnr, st_bitmap_player3,7,11);
1082 break;
1083 case ST_DRAW_GADGET:
1084 /* could use this proc, but... */
1085 /* st_DrawBitmap(objnr, st_bitmap_gadget,o->x1-o->x0+1, 5); */
1086 /* ... this one looks also funny. */
1087 st_DrawBitmap(objnr, st_bitmap_gadget,5,5);
1088 break;
1089 case ST_DRAW_BACKSLASH:
1090 {
1091 uint8_t x;
1092 uint8_t y;
1093 x = st_CalcXY(o);
1094 y = st_px_y;
1095
1096
1097 // dog_SetPixel(x,y);
1098 // x++; y--;
1099 // dog_SetPixel(x,y);
1100 // x++; y--;
1101 // dog_SetPixel(x,y);
1102
1103 u8g2_SetDrawColor(st_u8g2, 1);
1104 u8g2_DrawPixel(st_u8g2, x, u8g_height_minus_one - y);
1105 x++; y--;
1106 u8g2_DrawPixel(st_u8g2, x, u8g_height_minus_one - y);
1107 x++; y--;
1108 u8g2_DrawPixel(st_u8g2, x, u8g_height_minus_one - y);
1109 }
1110 break;
1111 case ST_DRAW_SLASH:
1112 {
1113 uint8_t x;
1114 uint8_t y;
1115 x = st_CalcXY(o);
1116 y = st_px_y;
1117
1118 // dog_SetPixel(x,y);
1119 // x++; y++;
1120 // dog_SetPixel(x,y);
1121 // x++; y++;
1122 // dog_SetPixel(x,y);
1123
1124 u8g2_SetDrawColor(st_u8g2, 1);
1125 u8g2_DrawPixel(st_u8g2, x, u8g_height_minus_one - y);
1126 x++; y++;
1127 u8g2_DrawPixel(st_u8g2, x, u8g_height_minus_one - y);
1128 x++; y++;
1129 u8g2_DrawPixel(st_u8g2, x, u8g_height_minus_one - y);
1130 }
1131 break;
1132 }
1133}
1134
1135uint8_t st_IsHitBBOX(uint8_t objnr, uint8_t x, uint8_t y)
1136{
1137 st_CalcBBOX(objnr);
1138 if ( st_ClipBBOX() == 0 )
1139 return 0; /* obj is outside (not visible) */
1140 if ( x < st_cbbox_x0 )
1141 return 0;
1142 if ( x > st_cbbox_x1 )
1143 return 0;
1144 if ( y < st_cbbox_y0 )
1145 return 0;
1146 if ( y > st_cbbox_y1 )
1147 return 0;
1148 return 1;
1149}
1150
1151void st_Destroy(uint8_t objnr)
1152{
1153 int8_t nr;
1154 st_obj *o = st_GetObj(objnr);
1155 switch(u8x8_pgm_read(&(st_object_types[o->ot].destroy_fn)))
1156 {
1157 case ST_DESTROY_NONE: /* only usefull for missels or walls which stay alife */
1158 break;
1159 case ST_DESTROY_DISAPPEAR: /* this should be the default operation */
1160 st_Disappear(objnr);
1161 break;
1162 case ST_DESTROY_GADGET:
1163 nr = st_FindObj(ST_OT_PLAYER2);
1164 if ( nr >= 0 )
1165 st_SetupPlayer(nr, ST_OT_PLAYER3);
1166 else
1167 {
1168 nr = st_FindObj(ST_OT_PLAYER);
1169 if ( nr >= 0 )
1170 st_SetupPlayer(nr, ST_OT_PLAYER2);
1171 }
1172 st_NewTrashDustAreaArgs(o->x, o->y, ST_OT_DUST_PY);
1173 st_NewTrashDustAreaArgs(o->x, o->y, ST_OT_DUST_NY);
1174 o->ot = ST_OT_GADGET_IMPLODE;
1175 o->tmp = 0;
1176 break;
1177 case ST_DESTROY_TO_DUST:
1178 st_NewTrashDustAreaArgs(o->x, o->y, ST_OT_DUST_PY);
1179 st_NewTrashDustAreaArgs(o->x, o->y, ST_OT_DUST_NY);
1180 o->ot = ST_OT_TRASH_IMPLODE;
1181 o->tmp = 0;
1182 break;
1183 case ST_DESTROY_BIG_TRASH:
1184 st_NewTrashDustAreaArgs(o->x, o->y, ST_OT_DUST_PY);
1185 st_NewTrashDustAreaArgs(o->x, o->y, ST_OT_DUST_NY);
1186 st_InitTrash((o->x>>ST_FP)-1, (o->y>>ST_FP)+3, 2+(st_rnd()&3));
1187 st_InitTrash((o->x>>ST_FP)-2, (o->y>>ST_FP)-3, -2-(st_rnd()&3));
1188 st_Disappear(objnr);
1189 break;
1190 case ST_DESTROY_PLAYER:
1191 st_Disappear(objnr);
1192 st_state = ST_STATE_END;
1193 o->tmp = 0;
1194 break;
1195 case ST_DESTROY_PLAYER_GADGETS:
1196 /* o->ot = ST_OT_PLAYER; */
1197 st_SetupPlayer(objnr, ST_OT_PLAYER);
1198 break;
1199 }
1200}
1201
1202/*
1203 check if the target (objnr) has been hit.
1204 st_IsHit() must also destroy the target.
1205 return value:
1206 0: do not destroy the missle
1207 1: destroy the missle
1208*/
1209uint8_t st_IsHit(uint8_t objnr, uint8_t x, uint8_t y, uint8_t missle_mask)
1210{
1211 uint8_t hit_mask = st_GetHitMask(objnr);
1212 st_obj *o;
1213
1214 if ( (hit_mask & missle_mask) == 0 )
1215 return 0;
1216
1217 o = st_GetObj(objnr);
1218
1219 switch(u8x8_pgm_read(&(st_object_types[o->ot].is_hit_fn)))
1220 {
1221 case ST_IS_HIT_NONE:
1222 break;
1223 case ST_IS_HIT_BBOX:
1224 if ( st_IsHitBBOX(objnr, x, y) != 0 )
1225 {
1226 st_Destroy(objnr);
1227 return 1;
1228 }
1229 break;
1230 case ST_IS_HIT_WALL:
1231 if ( st_IsHitBBOX(objnr, x, y) != 0 )
1232 {
1233 o->x0++;
1234 if ( o->x0 < o->x1 )
1235 {
1236 st_NewTrashDust(x, y, ST_OT_DUST_NXPY);
1237 st_NewTrashDust(x, y, ST_OT_DUST_NXNY);
1238 }
1239 else
1240 {
1241 st_Destroy(objnr);
1242 st_NewTrashDust(x, y, ST_OT_DUST_NXPY);
1243 st_NewTrashDust(x, y, ST_OT_DUST_NXNY);
1244 st_NewTrashDust(x, y, ST_OT_DUST_NY);
1245 st_NewTrashDust(x, y, ST_OT_DUST_PY);
1246 }
1247 return 1;
1248 }
1249 break;
1250 }
1251 return 0;
1252}
1253
1254
1255
1256/* update all fire counters */
1257uint8_t st_fire_player = 0;
1258uint8_t st_fire_period = 51;
1259uint8_t st_manual_fire_delay = 20;
1260uint8_t st_is_fire_last_value = 0;
1261
1262/*
1263 is_auto_fire == 1
1264 is_fire will be ignored, autofire enabled
1265 is_auto_fire == 0
1266 a transition from 1 to 0 on the is_fire variable will issue a missle
1267*/
1268void st_FireStep(uint8_t is_auto_fire, uint8_t is_fire)
1269{
1270 if ( is_auto_fire != 0 )
1271 {
1272 st_fire_player++;
1273 if ( st_fire_player >= st_fire_period )
1274 st_fire_player = 0;
1275 }
1276 else
1277 {
1278 if ( st_fire_player < st_manual_fire_delay )
1279 {
1280 st_fire_player++;
1281 }
1282 else
1283 {
1284 if ( st_is_fire_last_value == 0 )
1285 if ( is_fire != 0 )
1286 st_fire_player = 0;
1287 }
1288 st_is_fire_last_value = is_fire;
1289 }
1290}
1291
1292void st_Fire(uint8_t objnr)
1293{
1294 st_obj *o = st_GetObj(objnr);
1295 uint8_t x;
1296 uint8_t y;
1297
1298 switch(u8x8_pgm_read(&(st_object_types[o->ot].fire_fn)))
1299 {
1300 case ST_FIRE_NONE:
1301 break;
1302 case ST_FIRE_PLAYER1:
1303 if ( st_fire_player == 0 )
1304 {
1305 /* create missle at st_px_x and st_px_y */
1306 x = st_CalcXY(o);
1307 y = st_px_y;
1308 st_NewPlayerMissle(x , y );
1309 }
1310 break;
1311 case ST_FIRE_PLAYER2:
1312 if ( st_fire_player == 0 )
1313 {
1314 /* create missle at st_px_x and st_px_y */
1315 x = st_CalcXY(o);
1316 y = st_px_y;
1317 st_NewPlayerMissle(x , y );
1318 st_NewPlayerMissle(x , y+4 );
1319 }
1320 break;
1321 case ST_FIRE_PLAYER3:
1322 if ( st_fire_player == 0 )
1323 {
1324 /* create missle at st_px_x and st_px_y */
1325 x = st_CalcXY(o);
1326 y = st_px_y;
1327 st_NewPlayerMissle(x , y );
1328 st_NewPlayerMissle(x , y+4 );
1329 st_NewPlayerMissle(x , y-4 );
1330 }
1331 break;
1332 }
1333}
1334
1335/*================================================================*/
1336/* object init functions */
1337/*================================================================*/
1338
1339/*
1340 x,y are pixel coordinats within the play arey
1341*/
1342void st_NewGadget(uint8_t x, uint8_t y)
1343{
1344 st_obj *o;
1345 int8_t objnr = st_NewObj();
1346 if ( objnr < 0 )
1347 return;
1348 o = st_GetObj(objnr);
1349 st_SetXY(o, x, y);
1350 o->ot = ST_OT_GADGET;
1351 o->tmp = 8;
1352 //o->x = (x)<<ST_FP;
1353 //o->y = (y)<<ST_FP;
1354 o->x0 = -3;
1355 o->x1 = 1;
1356 o->y0 = -2;
1357 o->y1 = 2;
1358}
1359
1360/*
1361 x,y are pixel coordinats within the play arey
1362 dir: direction
1363 0: random
1364 != 0 --> assigned
1365*/
1366void st_InitTrash(uint8_t x, uint8_t y, int8_t dir)
1367{
1368 st_obj *o;
1369 int8_t objnr = st_NewObj();
1370 if ( objnr < 0 )
1371 return;
1372 o = st_GetObj(objnr);
1373 if ( (st_rnd() & 1) == 0 )
1374 o->ot = ST_OT_TRASH1;
1375 else
1376 o->ot = ST_OT_TRASH2;
1377 if ( dir == 0 )
1378 {
1379 o->tmp = 0;
1380 if ( st_rnd() & 1 )
1381 {
1382 if ( st_rnd() & 1 )
1383 o->tmp++;
1384 else
1385 o->tmp--;
1386 }
1387 }
1388 else
1389 {
1390 o->tmp = dir;
1391 }
1392 st_SetXY(o, x, y);
1393 //o->x = (x)<<ST_FP;
1394 //o->y = (y)<<ST_FP;
1395 o->x0 = -3;
1396 o->x1 = 1;
1397 o->y0 = -2;
1398 o->y1 = 2;
1399 if ( st_difficulty >= 5 )
1400 {
1401 if ( (st_rnd() & 3) == 0 )
1402 {
1403 o->ot = ST_OT_BIG_TRASH;
1404 o->y0--;
1405 o->y1++;
1406 o->x0--;
1407 o->x1++;
1408 }
1409 }
1410}
1411
1412/*
1413 x,y are pixel coordinats within the play arey
1414*/
1415void st_NewTrashDust(uint8_t x, uint8_t y, int ot)
1416{
1417 st_obj *o;
1418 int8_t objnr = st_NewObj();
1419 if ( objnr < 0 )
1420 return;
1421 o = st_GetObj(objnr);
1422 o->ot = ot;
1423 st_SetXY(o, x, y);
1424 //o->x = (x)<<ST_FP;
1425 //o->y = (y)<<ST_FP;
1426 o->x0 = 0;
1427 o->x1 = 0;
1428 o->y0 = -2;
1429 o->y1 = 2;
1430}
1431
1432void st_NewTrashDustAreaArgs(int16_t x, int16_t y, int ot)
1433{
1434 st_NewTrashDust(x>>ST_FP, y>>ST_FP, ot);
1435}
1436
1437
1438void st_NewWall(void)
1439{
1440 st_obj *o;
1441 int8_t objnr = st_NewObj();
1442 int8_t h;
1443 if ( objnr < 0 )
1444 return;
1445 o = st_GetObj(objnr);
1446 o->ot = ST_OT_WALL_SOLID;
1447 h = st_rnd();
1448 h &= 63;
1449 h = (int8_t)(((int16_t)h*(int16_t)(ST_AREA_HEIGHT/4))>>6);
1450 h += ST_AREA_HEIGHT/6;
1451
1452 o->x0 = 0;
1453 o->x1 = 5;
1454 o->x = (ST_AREA_WIDTH-1)<<ST_FP;
1455
1456 if ( (st_rnd() & 1) == 0 )
1457 {
1458 o->y = (ST_AREA_HEIGHT-1)<<ST_FP;
1459
1460 o->y0 = -h;
1461 o->y1 = 0;
1462 }
1463 else
1464 {
1465 o->y = (0)<<ST_FP;
1466 o->y0 = 0;
1467 o->y1 = h;
1468 }
1469}
1470
1471void st_NewPlayerMissle(uint8_t x, uint8_t y)
1472{
1473 st_obj *o;
1474 int8_t objnr = st_NewObj();
1475 if ( objnr < 0 )
1476 return;
1477 o = st_GetObj(objnr);
1478 o->ot = ST_OT_MISSLE;
1479 st_SetXY(o, x, y);
1480 //o->x = x<<ST_FP;
1481 //o->y = y<<ST_FP;
1482 o->x0 = -4;
1483 o->x1 = 1;
1484 o->y0 = 0;
1485 o->y1 = 0;
1486}
1487
1488void st_SetupPlayer(uint8_t objnr, uint8_t ot)
1489{
1490 st_obj *o = st_GetObj(objnr);
1491 switch(ot)
1492 {
1493 case ST_OT_PLAYER:
1494 o->ot = ot;
1495 o->y0 = -2;
1496 o->y1 = 2;
1497 break;
1498 case ST_OT_PLAYER2:
1499 o->ot = ot;
1500 o->y0 = -2;
1501 o->y1 = 5;
1502 break;
1503 case ST_OT_PLAYER3:
1504 o->ot = ot;
1505 o->y0 = -5;
1506 o->y1 = 5;
1507 break;
1508 }
1509}
1510
1511void st_NewPlayer(void)
1512{
1513 st_obj *o;
1514 int8_t objnr = st_NewObj();
1515 if ( objnr < 0 )
1516 return;
1517 o = st_GetObj(objnr);
1518 o->x = 6<<ST_FP;
1519 o->y = (ST_AREA_HEIGHT/2)<<ST_FP;
1520 o->x0 = -6;
1521 o->x1 = 0;
1522 st_SetupPlayer(objnr, ST_OT_PLAYER);
1523}
1524
1525/*================================================================*/
1526/* trash creation */
1527/*================================================================*/
1528
1529void st_InitDeltaWall(void)
1530{
1531 uint8_t i;
1532 uint8_t cnt = 0;
1533 uint8_t max_x = 0;
1534 uint8_t max_l;
1535
1536 uint8_t min_dist_for_new = 40;
1537 uint8_t my_difficulty = st_difficulty;
1538
1539 if ( st_difficulty >= 2 )
1540 {
1541
1542 max_l = ST_AREA_WIDTH;
1543 max_l -= min_dist_for_new;
1544
1545 if ( my_difficulty > 30 )
1546 my_difficulty = 30;
1547 min_dist_for_new -= my_difficulty;
1548
1549 for( i = 0; i < ST_OBJ_CNT; i++ )
1550 {
1551 if ( st_objects[i].ot == ST_OT_WALL_SOLID )
1552 {
1553 cnt++;
1554 if ( max_x < (st_objects[i].x>>ST_FP) )
1555 max_x = (st_objects[i].x>>ST_FP);
1556 }
1557 }
1558 /* if ( cnt < upper_trash_limit ) */
1559 if ( max_x < max_l )
1560 {
1561 st_NewWall();
1562 }
1563 }
1564}
1565
1566
1567void st_InitDeltaTrash(void)
1568{
1569 uint8_t i;
1570 uint8_t cnt = 0;
1571 uint8_t max_x = 0;
1572 uint8_t max_l;
1573
1574 uint8_t upper_trash_limit = ST_OBJ_CNT-7;
1575 uint8_t min_dist_for_new = 20;
1576 uint8_t my_difficulty = st_difficulty;
1577
1578 if ( my_difficulty > 14 )
1579 my_difficulty = 14;
1580 min_dist_for_new -= my_difficulty;
1581
1582 for( i = 0; i < ST_OBJ_CNT; i++ )
1583 {
1584 if ( st_objects[i].ot == ST_OT_TRASH1 || st_objects[i].ot == ST_OT_TRASH2 || st_objects[i].ot == ST_OT_GADGET || st_objects[i].ot == ST_OT_BIG_TRASH )
1585 {
1586 cnt++;
1587 if ( max_x < (st_objects[i].x>>ST_FP) )
1588 max_x = (st_objects[i].x>>ST_FP);
1589 }
1590 }
1591
1592 max_l = ST_AREA_WIDTH;
1593 max_l -= min_dist_for_new;
1594
1595 if ( cnt < upper_trash_limit )
1596 if ( max_x < max_l )
1597 {
1598 if ( (st_difficulty >= 3) && ((st_rnd() & 7) == 0) )
1599 st_NewGadget(ST_AREA_WIDTH-1, rand() & (ST_AREA_HEIGHT-1));
1600 else
1601 st_InitTrash(ST_AREA_WIDTH-1, rand() & (ST_AREA_HEIGHT-1),0 );
1602 }
1603}
1604
1605void st_InitDelta(void)
1606{
1607 st_InitDeltaTrash();
1608 st_InitDeltaWall();
1609 /*
1610
1611 uint8_t cnt;
1612 cnt = st_CntObj(2);
1613 if ( cnt == 0 )
1614 st_InitBrick1();
1615 */
1616}
1617
1618/*================================================================*/
1619/* API: game draw procedure */
1620/*================================================================*/
1621
1622void st_DrawInGame(uint8_t fps)
1623{
1624 uint8_t i;
1625 /* draw all objects */
1626 for( i = 0; i < ST_OBJ_CNT; i++ )
1627 st_DrawObj(i);
1628
1629 //dog_ClrBox(0, ST_AREA_HEIGHT, st_u8g2->width-1, ST_AREA_HEIGHT+3);
1630
1631 u8g2_SetDrawColor(st_u8g2, 0);
1632 u8g2_DrawBox(st_u8g2, 0, u8g_height_minus_one - ST_AREA_HEIGHT-3, st_u8g2->width, 4);
1633
1634 u8g2_SetDrawColor(st_u8g2, 1);
1635 u8g2_DrawHLine(st_u8g2, 0, u8g_height_minus_one - ST_AREA_HEIGHT+1, ST_AREA_WIDTH);
1636 u8g2_DrawHLine(st_u8g2, 0, u8g_height_minus_one, ST_AREA_WIDTH);
1637 u8g2_SetFont(st_u8g2, u8g_font_4x6r);
1638 u8g2_DrawStr(st_u8g2, 0, u8g_height_minus_one - ST_AREA_HEIGHT, st_itoa(st_difficulty));
1639 u8g2_DrawHLine(st_u8g2, 10, u8g_height_minus_one - ST_AREA_HEIGHT-3, (st_to_diff_cnt>>ST_DIFF_FP)+1);
1640 u8g2_DrawVLine(st_u8g2, 10, u8g_height_minus_one - ST_AREA_HEIGHT-4, 3);
1641 u8g2_DrawVLine(st_u8g2, 10+ST_DIFF_VIS_LEN, u8g_height_minus_one - ST_AREA_HEIGHT-4, 3);
1642
1643
1644 /* player points */
1645 u8g2_DrawStr(st_u8g2, ST_AREA_WIDTH-5*4-2, u8g_height_minus_one - ST_AREA_HEIGHT, st_itoa(st_player_points_delayed));
1646
1647
1648 /* FPS output */
1649 if ( fps > 0 )
1650 {
1651 //i = dog_DrawStr(ST_AREA_WIDTH-5*4-2-7*4, ST_AREA_HEIGHT, font_4x6, "FPS:");
1652 i = u8g2_DrawStr(st_u8g2, ST_AREA_WIDTH-5*4-2-7*4, u8g_height_minus_one - ST_AREA_HEIGHT, "FPS:");
1653
1654 //dog_DrawStr(ST_AREA_WIDTH-5*4-2-7*4+i, ST_AREA_HEIGHT, font_4x6, st_itoa(fps));
1655 u8g2_DrawStr(st_u8g2, ST_AREA_WIDTH-5*4-2-7*4+i, u8g_height_minus_one - ST_AREA_HEIGHT, st_itoa(fps));
1656 }
1657 /*dog_DrawStr(60+i, ST_AREA_HEIGHT, font_4x6, st_itoa(st_CntObj(0)));*/
1658}
1659
1660void st_Draw(uint8_t fps)
1661{
1662 switch(st_state)
1663 {
1664 case ST_STATE_PREPARE:
1665 case ST_STATE_IPREPARE:
1666 //dog_DrawStr(0, (st_u8g2->height-6)/2, font_4x6, "SpaceTrash");
1667 u8g2_SetFont(st_u8g2, u8g_font_4x6r);
1668 u8g2_SetDrawColor(st_u8g2, 1);
1669 //dog_DrawStrP(0, (st_u8g2->height-6)/2, font_4x6, DOG_PSTR("SpaceTrash"));
1670 u8g2_DrawStr(st_u8g2, 0, u8g_height_minus_one - (st_u8g2->height-6)/2, "SpaceTrash");
1671 //dog_SetHLine(st_u8g2->width-st_to_diff_cnt-10, st_u8g2->width-st_to_diff_cnt, (st_u8g2->height-6)/2-1);
1672 u8g2_DrawHLine(st_u8g2, st_u8g2->width-st_to_diff_cnt-10, u8g_height_minus_one - (st_u8g2->height-6)/2+1, 11);
1673 break;
1674 case ST_STATE_GAME:
1675 st_DrawInGame(fps);
1676 break;
1677 case ST_STATE_END:
1678 case ST_STATE_IEND:
1679 u8g2_SetFont(st_u8g2, u8g_font_4x6r);
1680 u8g2_SetDrawColor(st_u8g2, 1);
1681 //dog_DrawStr(0, (st_u8g2->height-6)/2, font_4x6, "Game Over");
1682 //dog_DrawStrP(0, (st_u8g2->height-6)/2, font_4x6, DOG_PSTR("Game Over"));
1683 u8g2_DrawStr(st_u8g2, 0, u8g_height_minus_one - (st_u8g2->height-6)/2, "Game Over");
1684 //dog_DrawStr(50, (st_u8g2->height-6)/2, font_4x6, st_itoa(st_player_points));
1685 u8g2_DrawStr(st_u8g2, 50, u8g_height_minus_one - (st_u8g2->height-6)/2, st_itoa(st_player_points));
1686 //dog_DrawStr(75, (st_u8g2->height-6)/2, font_4x6, st_itoa(st_highscore));
1687 u8g2_DrawStr(st_u8g2, 75, u8g_height_minus_one - (st_u8g2->height-6)/2, st_itoa(st_highscore));
1688 //dog_SetHLine(st_to_diff_cnt, st_to_diff_cnt+10, (st_u8g2->height-6)/2-1);
1689 u8g2_DrawHLine(st_u8g2, st_to_diff_cnt, u8g_height_minus_one - (st_u8g2->height-6)/2+1, 11);
1690 break;
1691 }
1692}
1693
1694void st_SetupInGame(void)
1695{
1696 st_player_points = 0;
1697 st_player_points_delayed = 0;
1698 st_difficulty = 1;
1699 st_to_diff_cnt = 0;
1700 st_ClrObjs();
1701 st_NewPlayer();
1702 /* st_InitBrick1(); */
1703}
1704
1705
1706/*================================================================*/
1707/* API: game setup */
1708/*================================================================*/
1709
1710void st_Setup(u8g2_t *u8g)
1711{
1712 st_u8g2 = u8g;
1713 u8g2_SetBitmapMode(u8g, 1);
1714 u8g_height_minus_one = u8g->height;
1715 u8g_height_minus_one--;
1716}
1717
1718/*================================================================*/
1719/* API: game step execution */
1720/*================================================================*/
1721
1722/*
1723 player_pos: 0..255
1724*/
1725void st_StepInGame(uint8_t player_pos, uint8_t is_auto_fire, uint8_t is_fire)
1726{
1727 uint8_t i, j;
1728 uint8_t missle_mask;
1729
1730 /* rescale player pos */
1731 //st_player_pos = ((uint16_t)player_pos * (uint16_t)ST_AREA_HEIGHT)/256;
1732 if ( player_pos < 64 )
1733 st_player_pos = 0;
1734 else if ( player_pos >= 192 )
1735 st_player_pos = ST_AREA_HEIGHT-2-1;
1736 else
1737 st_player_pos = ((uint16_t)((player_pos-64)) * (uint16_t)(ST_AREA_HEIGHT-2))/128;
1738 st_player_pos+=1;
1739 /* move all objects */
1740 for( i = 0; i < ST_OBJ_CNT; i++ )
1741 st_Move(i);
1742
1743 /* check for objects which left the play area */
1744 for( i = 0; i < ST_OBJ_CNT; i++ )
1745 if ( st_objects[i].ot != 0 )
1746 if ( st_IsOut(i) != 0 )
1747 st_Disappear(i);
1748
1749 /* missle and destruction handling */
1750 for( i = 0; i < ST_OBJ_CNT; i++ )
1751 {
1752 missle_mask = st_GetMissleMask(i);
1753 if ( missle_mask != 0 ) /* should we apply missle handling? */
1754 if ( st_CalcXY(st_objects+i) != 0 ) /* yes: calculate pixel reference point (st_px_x, st_px_y) */
1755 for( j = 0; j < ST_OBJ_CNT; j++ ) /* has any other object been hit? */
1756 if ( i != j ) /* except missle itself... */
1757 if ( st_IsHit(j, st_px_x, st_px_y, missle_mask) != 0 ) /* let the member function decide */
1758 { /* let the member function destroy the object if required */
1759 st_Destroy(i);
1760 }
1761 }
1762
1763 /* handle fire counter */
1764 st_FireStep(is_auto_fire, is_fire);
1765
1766 /* fire */
1767 for( i = 0; i < ST_OBJ_CNT; i++ )
1768 st_Fire(i);
1769
1770 /* create new objects */
1771 st_InitDelta();
1772
1773 /* increase difficulty */
1774
1775 st_to_diff_cnt++;
1776 if ( st_to_diff_cnt == (ST_DIFF_VIS_LEN<<ST_DIFF_FP) )
1777 {
1778 st_to_diff_cnt = 0;
1779 st_difficulty++;
1780 st_player_points += ST_POINTS_PER_LEVEL;
1781 }
1782
1783 /* update visible player points */
1784 if ( st_player_points_delayed < st_player_points )
1785 st_player_points_delayed++;
1786}
1787
1788void st_Step(uint8_t player_pos, uint8_t is_auto_fire, uint8_t is_fire)
1789{
1790 switch(st_state)
1791 {
1792 case ST_STATE_PREPARE:
1793 st_to_diff_cnt = st_u8g2->width-10; /* reuse st_to_diff_cnt */
1794 st_state = ST_STATE_IPREPARE;
1795 break;
1796 case ST_STATE_IPREPARE:
1797 st_to_diff_cnt--;
1798 if ( st_to_diff_cnt == 0 )
1799 {
1800 st_state = ST_STATE_GAME;
1801 st_SetupInGame();
1802 }
1803 break;
1804 case ST_STATE_GAME:
1805 st_StepInGame(player_pos, is_auto_fire, is_fire);
1806 break;
1807 case ST_STATE_END:
1808 st_to_diff_cnt = st_u8g2->width-10; /* reuse st_to_diff_cnt */
1809 if ( st_highscore < st_player_points)
1810 st_highscore = st_player_points;
1811 st_state = ST_STATE_IEND;
1812 break;
1813 case ST_STATE_IEND:
1814 st_to_diff_cnt--;
1815 if ( st_to_diff_cnt == 0 )
1816 st_state = ST_STATE_PREPARE;
1817 break;
1818 }
1819}
1820
1821
1822
1823void setup(void) {
1824 u8g2.begin();
1825}
1826
1827uint8_t a;
1828uint8_t b;
1829uint8_t y = 128;
1830
1831void loop(void) {
1832
1833 u8g2.setFont(u8g2_font_6x10_tr);
1834 u8g2.setFontDirection(0);
1835 u8g2.setFontRefHeightAll();
1836
1837 st_Setup(u8g2.getU8g2());
1838 for(;;)
1839 {
1840 st_Step(y, /* is_auto_fire */ 0, /* is_fire */ digitalRead(pin_fire));
1841 u8g2.firstPage();
1842 do
1843 {
1844 st_Draw(0);
1845 } while( u8g2.nextPage() );
1846
1847 if ( digitalRead(pin_down) ) {
1848 y++;
1849 }
1850
1851 if ( digitalRead(pin_up) ) {
1852 y--;
1853 }
1854 }
1855}
1856
1857