#ifndef __MENU_H #define __MENU_H #if defined(__APPLE2ENH__) #define CHAR_CURSOR 0x7F #define CHAR_SEPARATOR '_' #define CHAR_BAR_MIDDLE 0xD3 #define CHAR_BORDER_BOTTOM 0xCC #define CHAR_TITLEBAR_ENCLOSED 0xDC #define CHAR_BORDER_TOP '_' #define CHAR_BORDER_RIGHT 0xDA #define CHAR_BORDER_LEFT 0xDF #define CHAR_BORDER_TOP_LEFT 0xDA #define CHAR_BORDER_TOP_RIGHT 0xDF #define CHAR_TITLEBAR_FOLDER 0xD4 #define CHAR_SCROLLBAR_FULL 0xA0 #define CHAR_SCROLLBAR_EMPTY 0xD6 #define CHAR_SCROLLBAR_RIGHT 0xDF #define CHAR_SCROLLBAR_LEFT 0xDA #define CHAR_SCROLLBAR_TOP 0xDC #define CHAR_SCROLLBAR_BOTTOM 0xDC #define CHAR_BORDER_BOTTOM_LEFT ' ' #define CHAR_BORDER_BOTTOM_RIGHT ' ' #else #define CHAR_CURSOR (' '|0x80) #define CHAR_SEPARATOR '_' #define CHAR_BAR_MIDDLE '-' #define CHAR_BORDER_BOTTOM '-' #define CHAR_TITLEBAR_ENCLOSED '-' #define CHAR_BORDER_TOP '_' #define CHAR_BORDER_RIGHT '!' #define CHAR_BORDER_LEFT '!' #define CHAR_BORDER_TOP_LEFT '.' #define CHAR_BORDER_TOP_RIGHT '.' #define CHAR_TITLEBAR_FOLDER '_' #define CHAR_SCROLLBAR_FULL 0xA0 #define CHAR_SCROLLBAR_EMPTY ':' #define CHAR_SCROLLBAR_RIGHT ' ' #define CHAR_SCROLLBAR_LEFT ' ' #define CHAR_SCROLLBAR_TOP ' ' #define CHAR_SCROLLBAR_BOTTOM ' ' #define CHAR_BORDER_BOTTOM_LEFT '\'' #define CHAR_BORDER_BOTTOM_RIGHT '\'' #endif void repeatchar(char ch, int num) { while(num--) { cputc(ch); } } void hline() { repeatchar(CHAR_BAR_MIDDLE, 40); } void backdrop(char *str) { int w, i; w = strlen(str); if(w > 20) { w = 20; } clrscr(); gotoy(0); gotox(1); cputs("V2 Analog"); gotoy(0); gotox(39 - w); if((w >= 19) && str[19]) #if defined(__APPLE2ENH__) w = 19; #else w = 17; #endif for(i = 0; i < w; i++) { cputc(str[i]); } #if defined(__APPLE2ENH__) if((i == 19) && str[i]) cputc(0xC9); // Elipsis #else if((i == 17) && str[i]) cputs("..."); #endif gotoy(1); gotox(0); hline(); gotoy(22); gotox(0); hline(); gotoy(23); gotox(4); cputs("https://www.v2retrocomputing.com"); } void printlimited(char *str, int maxwidth) { int i; if(strlen(str) <= maxwidth) { cputs(str); } else { for(i = 0; i < (maxwidth-3); i++) { cputc(str[i]); } cputs("..."); } } void window(char *title, int width, int height, int type) { int w, x, y, a, b, c; if(width > 38) { width = 40; } if(height > 22) { height = 22; } y = 12 - ((height+2)/2); if(strlen(title) > (width-2)) { w = width-2; } else { w = strlen(title); } if(width < 40) { x = 20 - (width/2); } else { x = 0; } #if defined(__APPLE2ENH__) a = 0; #else a = (width < 38); #endif b = (width < 40); x -= a+b; #if defined(__APPLE2ENH__) if(y > 2) { gotoy(y-1); gotox(x); if(a) cputc(' '); if(b) cputc(' '); repeatchar(CHAR_BORDER_TOP, type ? width : w); if(!type && (w < width)) repeatchar(' ', width - w); if(b) cputc(' '); if(a) cputc(' '); } #else if(y > 2) { gotoy(y-1); gotox(x); repeatchar(' ', width+a+a+b+b); } #endif if(y+height < 22) { gotoy(y+height); gotox(x); repeatchar(' ', width+a+a+b+b); } gotoy(y); gotox(x); if(a) cputc(' '); if(b) cputc(CHAR_BORDER_TOP_LEFT); if(type) { c = (width - w) / 2; repeatchar(CHAR_TITLEBAR_ENCLOSED, c); } revers(1); printlimited(title, w); revers(0); #if defined(__APPLE2ENH__) if(!type) cputc(CHAR_TITLEBAR_FOLDER); #endif if(type) { repeatchar(CHAR_TITLEBAR_ENCLOSED, width - (w+c)); if(b) cputc(CHAR_BORDER_TOP_RIGHT); } else { #if defined(__APPLE2ENH__) repeatchar(CHAR_BORDER_TOP, width-(w+1)); if(b) cputc(' '); #else repeatchar(CHAR_BORDER_TOP, width-w); if(b) cputc(CHAR_BORDER_TOP_RIGHT); #endif } if(a) cputc(' '); y++; #if defined(__APPLE2ENH__) gotoy(y); gotox(x); if(a) cputc(' '); if(b) cputc(CHAR_BORDER_RIGHT); repeatchar(CHAR_BORDER_BOTTOM, width); if(b) cputc(CHAR_BORDER_LEFT); if(a) cputc(' '); for(c = 1; c < height-1; c++) { #else for(c = 0; c < height; c++) { #endif gotoy(y+c); gotox(x); if(a) cputc(' '); if(b) cputc(CHAR_BORDER_RIGHT); repeatchar(' ', width); if(b) cputc(CHAR_BORDER_LEFT); if(a) cputc(' '); } #if defined(__APPLE2ENH__) gotoy(y+c); gotox(x); if(a) cputc(' '); if(b) cputc(CHAR_BORDER_RIGHT); repeatchar(CHAR_BORDER_TOP, width); if(b) cputc(CHAR_BORDER_LEFT); if(a) cputc(' '); c++; #endif if((y+c) < 22) { gotoy(y+c); gotox(x); if(a) cputc(' '); if(b) cputc(CHAR_BORDER_BOTTOM_LEFT); repeatchar(CHAR_BORDER_BOTTOM, width); if(b) cputc(CHAR_BORDER_BOTTOM_RIGHT); if(a) cputc(' '); } } void message(char *title, char *str) { int w, x, c; if(strlen(str) > 34) { c = w = 34; } else { c = w = strlen(str); } if(strlen(title) > 34) { c = 34; } else if(strlen(title) > w) { c = strlen(title); } window(title, c+4, 7, 1); x = 20 - (w / 2); gotoy(11); gotox(x); printlimited(str, w); // for(c = 0; (c < w) && str[c]; c++) { // cputc(str[c]); // } x = 20 - 2; gotoy(13); gotox(x); revers(1); cputs(" OK "); revers(0); for(;;) { switch(cgetc()) { case 0x0A: case 0x0D: case 0x1B: case 'O': case 'o': return; } } } int confirm(char *title, char *str) { int w, x, c, sel = 1; if(strlen(str) > 34) { c = w = 34; } else { c = w = strlen(str); } if(strlen(title) > 34) { c = 34; } else if(strlen(title) > w) { c = strlen(title); } window(title, c+4, 7, 1); x = 20 - (w / 2); gotoy(11); gotox(x); printlimited(str, w); for(;;) { x = 20 - 5; gotoy(13); gotox(x); if(sel) { revers(1); cputs(" Yes "); revers(0); cputs(" [No]"); } else { cputs("[Yes] "); revers(1); cputs(" No "); revers(0); } switch(cgetc()) { case 0x08: case 0x0A: case 0x0B: case 0x15: sel = !sel; break; case 0x0D: return sel; case 'Y': case 'y': return 1; case 0x1B: case 'N': case 'n': return 0; } } } #ifdef __V2ANALOG_H int prompt_slot(char *progname) { int c; int done=0; // Attempt to find the lowest numbered V2 Analog Card for(c = 7; c > 0; c--) { if(!memcmp("V2A", (uint8_t *)(0xC0F8 + (c << 8)), 3)) { cardslot = c; } } backdrop(progname); window(" Slot Number? ", 38, 7, 1); gotoy(11); gotox(2); cputs("Which slot is the card installed in?"); while(!done) { #if defined(__APPLE2ENH__) gotoy(12); gotox(19); repeatchar(CHAR_BORDER_TOP, 3); #endif gotoy(13); gotox(19); revers(1); printf(" %i ", cardslot); revers(0); c = cgetc(); if((c >= '1') && (c <= '7')) { cardslot = c - '0'; return 1; } else switch(c) { case 0x08: case 0x0A: case 0x2D: if(cardslot > 0) cardslot--; break; case 0x0B: case 0x15: case 0x2B: if(cardslot < 7) cardslot++; break; case 0x0D: done = 1; return 1; case 0x1B: return 0; } } } #endif #endif /* __MENU_H */