Terminal program for MailStation devices
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

csi: fix putchar_attr args

+60 -54
+44 -41
csi.c
··· 111 111 112 112 uncursor(); 113 113 114 + #ifdef DEBUG 115 + sprintf(sb, "CSI:"); 116 + for (x = 0; x < csibuflen; x++) 117 + sprintf(sb, "%s%c", sb, csibuf[x]); 118 + sprintf(sb, "%s params:%d,%d", sb, param1, param2); 119 + update_statusbar(sb); 120 + #endif 121 + 114 122 switch (c) { 115 123 case 'A': /* CUU - cursor up */ 116 - for (x = 0; x < param1; x++) 117 - if (cursory > 0) 118 - cursory--; 124 + for (x = 0; x < param1 && cursory > 0; x++) 125 + cursory--; 119 126 break; 120 127 case 'B': /* CUD - cursor down */ 121 - for (x = 0; x < param1; x++) 122 - if (cursory < TEXT_ROWS - 1) 123 - cursory++; 128 + for (x = 0; x < param1 && cursory < TEXT_ROWS - 1; x++) 129 + cursory++; 124 130 break; 125 131 case 'C': /* CUF - cursor forward */ 126 - for (x = 0; x < param1; x++) 127 - if (cursorx < TEXT_COLS) 128 - cursorx++; 132 + for (x = 0; x < param1 && cursorx < TEXT_COLS; x++) 133 + cursorx++; 129 134 break; 130 135 case 'D': /* CUB - cursor back */ 131 - for (x = 0; x < param1; x++) 132 - if (cursorx > 0) 133 - cursorx--; 136 + for (x = 0; x < param1 && cursorx > 0; x++) 137 + cursorx--; 134 138 break; 135 139 case 'E': /* CNL - cursor next line */ 136 140 cursorx = 0; 137 - for (x = 0; x < param1; x++) 138 - if (cursory < TEXT_ROWS - 1) 139 - cursory++; 141 + for (x = 0; x < param1 && cursory < TEXT_ROWS - 1; x++) 142 + cursory++; 140 143 break; 141 144 case 'F': /* CPL - cursor previous line */ 142 145 cursorx = 0; 143 - for (x = 0; x < param1; x++) 144 - if (cursory > 0) 145 - cursory--; 146 + for (x = 0; x < param1 && cursory > 0; x++) 147 + cursory--; 146 148 break; 147 149 case 'G': /* CHA - cursor horizontal absolute */ 148 150 if (param1 > TEXT_COLS) ··· 164 166 cursorx = TEXT_COLS - 1; 165 167 else 166 168 cursorx = param2 - 1; 167 - 168 169 break; 169 170 case 'J': /* ED - erase in display */ 170 - if (param1 == 0) { 171 + switch (param1) { 172 + case 0: 171 173 /* clear from cursor to end of screen */ 172 174 for (y = cursory; y < TEXT_ROWS; y++) { 173 175 for (x = 0; x < TEXT_COLS; x++) { 174 176 if (y == cursory && x < cursorx) 175 177 continue; 176 178 177 - putchar_attr(x, y, ' ', 0); 179 + putchar_attr(y, x, ' ', 0); 178 180 } 179 181 } 180 - } else if (param1 == 1) { 182 + break; 183 + case 1: 181 184 /* clear from cursor to beginning of the screen */ 182 185 for (y = cursory; y >= 0; y--) { 183 186 for (x = TEXT_COLS; x >= 0; x--) { 184 187 if (y == cursory && x > cursorx) 185 188 continue; 186 189 187 - putchar_attr(x, y, ' ', 0); 190 + putchar_attr(y, x, ' ', 0); 188 191 } 189 192 } 190 - } else if (param1 == 2) { 193 + break; 194 + case 2: 191 195 /* clear entire screen */ 192 196 for (y = 0; y < TEXT_ROWS; y++) { 193 197 for (x = 0; x < TEXT_COLS; x++) 194 - putchar_attr(x, y, ' ', 0); 198 + putchar_attr(y, x, ' ', 0); 195 199 } 196 200 } 197 - 198 201 break; 199 202 case 'K': /* EL - erase in line */ 200 - if (param1 == 0) { 203 + switch (param1) { 204 + case 0: 201 205 /* clear from cursor to end of line */ 206 + if (cursorx >= TEXT_COLS) 207 + break; 202 208 for (x = cursorx; x < TEXT_COLS; x++) 203 - putchar_attr(x, cursory, ' ', 0); 204 - } else if (param1 == 1) { 209 + putchar_attr(cursory, x, ' ', 0); 210 + break; 211 + case 1: 205 212 /* clear from cursor to beginning of line */ 213 + if (cursorx == 0) 214 + break; 206 215 for (x = cursorx; x >= 0; x--) 207 - putchar_attr(x, cursory, ' ', 0); 208 - } else if (param1 == 2) { 216 + putchar_attr(cursory, x, ' ', 0); 217 + break; 218 + case 2: 209 219 /* clear entire line */ 210 220 for (x = 0; x < TEXT_COLS - 1; x++) 211 - putchar_attr(x, cursory, ' ', 0); 221 + putchar_attr(cursory, x, ' ', 0); 212 222 } 213 223 break; 214 224 case 'S': /* SU - scroll up */ ··· 276 286 } 277 287 278 288 putchar_sgr = param2; 279 - putchar_attr(cursorx, cursory, screenbuf[off], param2); 280 289 281 290 break; 282 291 case 'n': /* DSR - device status report */ 283 292 if (param1 == 5) { 284 293 /* ok */ 285 - obuf[obuf_pos++] = 27; 294 + obuf[obuf_pos++] = ESC; 286 295 obuf[obuf_pos++] = '['; 287 296 obuf[obuf_pos++] = '0'; 288 297 obuf[obuf_pos++] = 'n'; 289 298 } else if (param1 == 6) { 290 299 /* CPR - report cursor position */ 291 - obuf[obuf_pos++] = 27; 300 + obuf[obuf_pos++] = ESC; 292 301 obuf[obuf_pos++] = '['; 293 302 294 303 itoa(cursory + 1, parambuf, 10); ··· 321 330 322 331 if (serviced) { 323 332 recursor(); 324 - #ifdef DEBUG 325 - sprintf(sb, "CSI (%d,%d): ", param1, param2); 326 - for (x = 0; x < csibuflen; x++) 327 - sprintf(sb, "%s%c", sb, csibuf[x]); 328 - update_statusbar(sb); 329 - #endif 330 333 csibuflen = 0; 331 334 csibuf[0] = '\0'; 332 335 in_csi = 0;
+3 -1
mailstation.h
··· 96 96 (byte & 0x02 ? '1' : '0'), \ 97 97 (byte & 0x01 ? '1' : '0') 98 98 99 + #define ESC 0x1b // \e 100 + 99 101 100 102 /* for debugging access from asm */ 101 103 extern unsigned char debug0; ··· 162 164 /* mailstation.c */ 163 165 extern unsigned char *firmware_version; 164 166 extern void setup(void); 165 - extern void update_statusbar(char *status, ...); 166 167 167 168 168 169 /* modem.s */ ··· 183 184 /* msterm.c */ 184 185 extern volatile unsigned char __at(0xf500) obuf[]; 185 186 extern volatile unsigned char __at(0xf704) obuf_pos; 187 + extern void update_statusbar(char *status, ...); 186 188 187 189 188 190 /* settings.s */
+13 -12
msterm.c
··· 106 106 process_input(modem_buf[modem_buf_read_pos]); 107 107 modem_buf_read_pos++; 108 108 } 109 - } else if (source = SOURCE_LPT) { 109 + } else if (source == SOURCE_LPT) { 110 110 b = lptrecv(); 111 111 if (b <= 0xff) 112 112 process_input(b & 0xff); ··· 115 115 while (old_obuf_pos != obuf_pos) { 116 116 if (source == SOURCE_MODEM) { 117 117 b = modem_lsr(); 118 - if (b & (1 << 5)) { 118 + if (b & (1 << 5)) 119 119 /* Transmitter Holding Register Empty (THRE) */ 120 120 modem_write(obuf[old_obuf_pos]); 121 - } else 121 + else 122 122 continue; 123 123 } else if (source == SOURCE_LPT) { 124 124 lptsend(obuf[old_obuf_pos]); ··· 202 202 break; 203 203 case KEY_MAIN_MENU: 204 204 /* send escape */ 205 - obuf[obuf_pos++] = 27; 205 + obuf[obuf_pos++] = ESC; 206 206 break; 207 207 case KEY_PAGE_UP: 208 - obuf[obuf_pos++] = 27; 208 + obuf[obuf_pos++] = ESC; 209 209 obuf[obuf_pos++] = '['; 210 210 obuf[obuf_pos++] = '5'; 211 211 obuf[obuf_pos++] = '~'; 212 212 break; 213 213 case KEY_PAGE_DOWN: 214 - obuf[obuf_pos++] = 27; 214 + obuf[obuf_pos++] = ESC; 215 215 obuf[obuf_pos++] = '['; 216 216 obuf[obuf_pos++] = '6'; 217 217 obuf[obuf_pos++] = '~'; 218 218 break; 219 219 case KEY_UP: 220 - obuf[obuf_pos++] = 27; 220 + obuf[obuf_pos++] = ESC; 221 221 obuf[obuf_pos++] = '['; 222 222 obuf[obuf_pos++] = 'A'; 223 223 break; 224 224 case KEY_DOWN: 225 - obuf[obuf_pos++] = 27; 225 + obuf[obuf_pos++] = ESC; 226 226 obuf[obuf_pos++] = '['; 227 227 obuf[obuf_pos++] = 'B'; 228 228 break; 229 229 case KEY_LEFT: 230 - obuf[obuf_pos++] = 27; 230 + obuf[obuf_pos++] = ESC; 231 231 obuf[obuf_pos++] = '['; 232 232 obuf[obuf_pos++] = 'D'; 233 233 break; 234 234 case KEY_RIGHT: 235 - obuf[obuf_pos++] = 27; 235 + obuf[obuf_pos++] = ESC; 236 236 obuf[obuf_pos++] = '['; 237 237 obuf[obuf_pos++] = 'C'; 238 238 break; 239 239 case KEY_SIZE: 240 240 redraw_screen(); 241 + maybe_update_statusbar(1); 241 242 break; 242 243 default: 243 244 if (b >= META_KEY_BEGIN) ··· 263 264 csibuflen = 0; 264 265 } 265 266 266 - if (b == 27) { 267 + if (b == ESC) { 267 268 /* esc, maybe new csi, dump previous */ 268 269 parseCSI(); 269 270 in_csi = 0; ··· 291 292 break; 292 293 case 26: /* ^Z end of ansi */ 293 294 break; 294 - case 27: /* esc */ 295 + case ESC: /* esc */ 295 296 if (esc) 296 297 /* our previous esc is literal */ 297 298 putchar(b);