diff --git a/Makefile b/Makefile index 097bfaf..a68c054 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,8 @@ FONT_OBJS = 01.us.une.cf 02.clintonv1.cf 03.reactive.cf 04.danpaymar.cf \ 15.frenchenh.cf 16.frenchune.cf 17.hebrewenh.cf 18.hebrewune.cf \ 19.plus.enh.cf 1a.plus.une.cf 1b.katakana.cf 1c.cyrillic.cf \ 1d.greek.cf 1e.esperanto.cf 1f.videx.cf 20.plus.une.cf \ - 21.us.enh.cf 22.us.enh.cf 23.cyrillic.cf 24.pcbold.cf + 21.us.enh.cf 22.us.enh.cf 23.cyrillic.cf 24.pcbold.cf \ + 25.aniron.cf SYSTEM_TARGETS = menu BASE_TARGETS = menu config fontmgr @@ -77,6 +78,12 @@ disks: $(addprefix $(OBJDIR)/,$(addsuffix .po,$(DISK_TARGETS))) $(OBJDIR)/%.xf: fonts/00.us.enh.pf fonts/%.pf tools/xorfont US.ENH....00.PF $^ $@ +$(OBJDIR)/1a.plus.une.xf: fonts/19.plus.enh.pf fonts/1a.plus.une.pf + tools/xorfont PLUS.ENH..19.PF $^ $@ + +$(OBJDIR)/20.plus.une.xf: fonts/19.plus.enh.pf fonts/20.plus.une.pf + tools/xorfont PLUS.ENH..19.PF $^ $@ + $(OBJDIR)/%.cf: $(OBJDIR)/%.xf tools/rlefont $< $@ @@ -124,7 +131,7 @@ $(OBJDIR)/disk525b.po: $(addprefix $(OBJDIR)/,$(addsuffix .base,$(DISK525B_OBJS) java -jar $(AC) -p $@ VDRIVE/VSDRIVE SYS 0x2000 > 16) & 1] = SERIAL_LOOP; break; @@ -405,11 +408,11 @@ int parse_config() { break; case CFGTOKEN_WIFI_SSID: memset(wifi_ssid, 0, sizeof(wifi_ssid)); - strncpy(wifi_ssid, (char*)(ptr+1), (ptr[i] >> 24)); + strncpy(wifi_ssid, (char*)(&ptr[i+1]), (ptr[i] >> 24)); break; case CFGTOKEN_WIFI_PSK: memset(wifi_psk, 0, sizeof(wifi_psk)); - strncpy(wifi_psk, (char*)(ptr+1), (ptr[i] >> 24)); + strncpy(wifi_psk, (char*)(&ptr[i+1]), (ptr[i] >> 24)); break; case CFGTOKEN_WIFI_IP: wifi_address = ptr[i+1]; @@ -419,11 +422,25 @@ int parse_config() { break; case CFGTOKEN_JD_HOST: memset(jd_host, 0, sizeof(jd_host)); - strncpy(jd_host, (char*)(ptr+1), (ptr[i] >> 24)); + strncpy(jd_host, (char*)(&ptr[i+1]), (ptr[i] >> 24)); break; case CFGTOKEN_JD_PORT: jd_port = ptr[i+1]; break; + case CFGTOKEN_FONT_00: + default_font = (ptr[i] >> 16) & 0x2F; + break; + case CFGTOKEN_MONO_00: + mono_palette = (ptr[i] >> 20) & 0xF; + if(mono_palette) mono_palette = (mono_palette & 0x7) + 1; + break; + case CFGTOKEN_TBCOLOR: + terminal_fgcolor = (ptr[i] >> 20) & 0xF; + terminal_bgcolor = (ptr[i] >> 16) & 0xF; + break; + case CFGTOKEN_BORDER: + terminal_border = (ptr[i] >> 16) & 0xF; + break; } // Advance by the number of dwords for this token @@ -437,11 +454,17 @@ int build_config(uint32_t rev) { int i = 0; uint32_t *ptr = (uint32_t*)blockbuffer; - memset(blockbuffer, 0, sizeof(blockbuffer)); + memset(blockbuffer, 0xFF, sizeof(blockbuffer)); ptr[i++] = NEWCONFIG_MAGIC; ptr[i++] = CFGTOKEN_REVISION | ((rev & 0xff) << 16); - ptr[i++] = CFGTOKEN_MONO_00 | ((((uint32_t)mono_palette) & 0xF) << 20); + + ptr[i++] = CFGTOKEN_FONT_00 | ((((uint32_t)default_font) & 0x2F) << 20); + if(mono_palette) { + ptr[i++] = CFGTOKEN_MONO_80 | ((((uint32_t)mono_palette-1) & 0xF) << 20); + } else { + ptr[i++] = CFGTOKEN_MONO_00; + } ptr[i++] = CFGTOKEN_TBCOLOR | ((((uint32_t)terminal_fgcolor) & 0xF) << 20) | ((((uint32_t)terminal_bgcolor) & 0xF) << 16); ptr[i++] = CFGTOKEN_BORDER | ((((uint32_t)terminal_border) & 0xF) << 16); @@ -529,11 +552,11 @@ int build_config(uint32_t rev) { } ptr[i++] = CFGTOKEN_WIFI_SSID | (((uint32_t)strlen(wifi_ssid)+1) << 24); - strncpy((char*)ptr, wifi_ssid, 31); + strncpy((char*)(&ptr[i]), wifi_ssid, longmin(strlen(wifi_ssid)+1,31)); i += (strlen(wifi_ssid)+4) >> 2; ptr[i++] = CFGTOKEN_WIFI_PSK | (((uint32_t)strlen(wifi_psk)+1) << 24); - strncpy((char*)ptr, wifi_psk, 31); + strncpy((char*)(&ptr[i]), wifi_psk, longmin(strlen(wifi_psk)+1,31)); i += (strlen(wifi_psk)+4) >> 2; ptr[i++] = CFGTOKEN_WIFI_IP; @@ -543,12 +566,14 @@ int build_config(uint32_t rev) { ptr[i++] = wifi_netmask; ptr[i++] = CFGTOKEN_JD_HOST | (((uint32_t)strlen(jd_host)+1) << 24); - strncpy((char*)ptr, jd_host, 31); + strncpy((char*)(&ptr[i]), jd_host, longmin(strlen(jd_host)+1,31)); ptr += (strlen(jd_host)+4) >> 2; ptr[i++] = CFGTOKEN_JD_PORT; ptr[i++] = jd_port; + ptr[i++] = NEWCONFIG_EOF_MARKER; + return i*4; } @@ -604,7 +629,7 @@ void cfgfile_upload(char *pdfile, uint16_t block) { CF_PTRL = 0; CF_PTRH = 0; for(i = 0; i < sizeof(blockbuffer); i++) { - CF_DATA = blockbuffer[i]; + CF_DATW = blockbuffer[i]; } if(cfg_cmd1("fw", block)) { @@ -664,7 +689,7 @@ void cfgfile_download(char *pdfile, uint16_t block) { CF_PTRL = 0; CF_PTRH = 0; for(i = 0; i < sizeof(blockbuffer); i++) { - blockbuffer[i] = CF_DATA; + blockbuffer[i] = CF_DATR; } byteswritten = fwrite(blockbuffer, 1, sizeof(blockbuffer), f); @@ -688,7 +713,7 @@ cleanup: } void restore_config() { - uint16_t next; + uint16_t last, next; // Get current config blocks if(cfg_cmd0("fc")) { @@ -699,11 +724,25 @@ void restore_config() { ok_button(); return; } - + next = RPY_BUFFER[5]; next <<= 8; next |= RPY_BUFFER[4]; + last = RPY_BUFFER[3]; + last <<= 8; + last |= RPY_BUFFER[2]; + + if(cfg_cmd1("fe", last)) { + backdrop(PROGNAME); + window(" Error ", 28, 7, 1); + gotoy(11); gotox(7); + cprintf("Unable to erase block $%4X", block); + ok_button(); + + goto cleanup; + } + cfgfile_upload("CONFIG.BACKUP", next); } @@ -732,7 +771,7 @@ cleanup: void read_config() { int i; - uint16_t last; + uint16_t next, last; backdrop(PROGNAME); window(" Please Wait ", 26, 6, 1); @@ -768,7 +807,7 @@ void read_config() { CF_PTRL = 0; CF_PTRH = 0; for(i = 0; i < sizeof(blockbuffer); i++) { - blockbuffer[i] = CF_DATA; + blockbuffer[i] = CF_DATR; } parse_config(); @@ -817,7 +856,7 @@ int write_config() { CF_PTRL = 0; CF_PTRH = 0; for(i = 0; i < sizeof(blockbuffer); i++) { - CF_DATA = blockbuffer[i]; + CF_DATW = blockbuffer[i]; } if(cfg_cmd1("fw", next)) { @@ -876,12 +915,14 @@ int format_card(void) { goto cleanup; } - last = RPY_BUFFER[3]; - last <<= 8; - last |= RPY_BUFFER[2]; next = RPY_BUFFER[5]; next <<= 8; next |= RPY_BUFFER[4]; + + last = RPY_BUFFER[3]; + last <<= 8; + last |= RPY_BUFFER[2]; + if(last != next) { if(cfg_cmd1("fe", last)) { backdrop(PROGNAME); @@ -1636,12 +1677,9 @@ void main (void) { int selected_item = 0; int y = 12 - 6; -#if 0 if(!prompt_slot(PROGNAME)) { - exec("MENU.SYSTEM", ""); - return; + goto cleanup; } -#endif switch(get_ostype() & 0xF0) { default: @@ -1656,7 +1694,6 @@ void main (void) { break; } -#if 0 backdrop(PROGNAME); window(" Please Wait ", 26, 6, 1); gotoy(11); gotox(9); @@ -1665,13 +1702,12 @@ void main (void) { cputs("your screen may flicker."); read_config(); -#endif while(paint_menu >= 0) { if(paint_menu == 2) { backdrop(PROGNAME); - window(" Main Menu ", 24, 15, 0); + window(" Main Menu ", 26, 15, 0); gotoy(y+5); gotox(8); repeatchar(CHAR_BORDER_BOTTOM, 24); gotoy(y+10); gotox(8); @@ -1762,5 +1798,11 @@ void main (void) { break; } } + +cleanup: + backdrop(PROGNAME); + gotoy(12); gotox(13); + cputs("Launching Menu"); + exec("MENU.SYSTEM", ""); } diff --git a/src/fontmgr.c b/src/fontmgr.c index 4d05587..7863c98 100644 --- a/src/fontmgr.c +++ b/src/fontmgr.c @@ -18,12 +18,12 @@ volatile uint16_t cardslot = 3; #define RIGHT_ARROW 0xD5 #define DOWN_ARROW 0xCA #else -#define UP_ARROW '^' +#define UP_ARROW ('+' | 0x80) #define RIGHT_ARROW ('>' | 0x80) -#define DOWN_ARROW 'v' +#define DOWN_ARROW ('+' | 0x80) #endif -#define FONT_MAX 18 +#define FONT_MAX 15 int selected_entry = 0; int top_entry = 0; @@ -40,6 +40,32 @@ char prefix[FILENAME_MAX]; char pathname[FILENAME_MAX]; char fontname[FILENAME_MAX]; +typedef struct fontentry_s { + char pathname[FILENAME_MAX]; + char fontname[FILENAME_MAX]; +} fontentry_t; + +fontentry_t fontlist[FONT_MAX]; + +void print_menu_select(char *str, int width, int highlighted, int selected) { + revers(highlighted); + if(selected) { + cputs(" ["); + } else { + cputs(" "); + } + printlimited(str, width - 4); + if(selected) { + cputs("] "); + } else { + cputs(" "); + } + width -= longmin(width, strlen(str) + 4); + if(width > 0) + repeatchar(' ', width); + revers(0); +} + void print_menu_item(char *str, int highlighted) { revers(highlighted); cputs(str); @@ -47,6 +73,8 @@ void print_menu_item(char *str, int highlighted) { } void remove_font(uint16_t block) { + char dummy; + backdrop(PROGNAME); window(" Please Wait ", 26, 6, 1); gotoy(11); gotox(13); @@ -54,17 +82,23 @@ void remove_font(uint16_t block) { gotoy(12); gotox(8); cputs("your screen may flicker."); - if(cfg_cmd1("fe", block)) { + if(cfg_cmd1("Ce", block)) { backdrop(PROGNAME); message(" Error ", "Unable to erase block."); - return; + goto cleanup; } backdrop(PROGNAME); message(" Success ", "Block erased."); + +cleanup: + dummy = *(volatile char*)0xCFFF; } void upload_font(uint8_t *buffer) { + char dummy; + uint16_t i; + backdrop(PROGNAME); window(" Please Wait ", 26, 6, 1); gotoy(11); gotox(13); @@ -72,14 +106,23 @@ void upload_font(uint8_t *buffer) { gotoy(12); gotox(8); cputs("your screen may flicker."); - if(cfg_cmd1("CT", (uint16_t)buffer)) { + CF_PTRL = 0; + CF_PTRH = 0; + for(i = 0; i < 4096; i++) { + CF_DATW = buffer[i]; + } + + if(cfg_cmd0("CT")) { backdrop(PROGNAME); message(" Error ", "Communication Error"); - return; + goto cleanup; } backdrop(PROGNAME); message(" Success ", "Font uploaded."); + +cleanup: + dummy = *(volatile char*)0xCFFF; } int write_font(uint8_t *buffer, uint16_t block) { @@ -90,16 +133,29 @@ int write_font(uint8_t *buffer, uint16_t block) { backdrop(PROGNAME); window(" Please Wait ", 26, 6, 1); gotoy(11); gotox(13); - cputs("Flashing font,"); + cputs("Erasing flash,"); gotoy(12); gotox(8); cputs("your screen may flicker."); - dummy = *(volatile char*)0xCFFF; - - for(i = 0; i < 4096; i++) { - CF_DATA = buffer[i]; + if(cfg_cmd1("Ce", block)) { + backdrop(PROGNAME); + message(" Error ", "Unable to erase block."); + goto cleanup; } - if(cfg_cmd1("fw", block)) { + + backdrop(PROGNAME); + window(" Please Wait ", 26, 6, 1); + gotoy(11); gotox(13); + cputs("Writing flash,"); + gotoy(12); gotox(8); + cputs("your screen may flicker."); + + CF_PTRL = 0; + CF_PTRH = 0; + for(i = 0; i < 4096; i++) { + CF_DATW = buffer[i]; + } + if(cfg_cmd1("Cw", block)) { backdrop(PROGNAME); message(" Error ", "Unable to write block."); goto cleanup; @@ -126,15 +182,16 @@ int read_font(uint8_t *buffer, uint16_t block) { gotoy(12); gotox(8); cputs("your screen may flicker."); - dummy = *(volatile char*)0xCFFF; - - if(cfg_cmd1("fr", block)) { + if(cfg_cmd1("Cr", block)) { backdrop(PROGNAME); message(" Error ", "Unable to read block."); goto cleanup; } + + CF_PTRL = 0; + CF_PTRH = 0; for(i = 0; i < 4096; i++) { - buffer[i] = CF_DATA; + buffer[i] = CF_DATR; } backdrop(PROGNAME); @@ -153,48 +210,48 @@ typedef struct font_slot_s { } font_slot_t; font_slot_t font_slot[] = { - { " 00 US (Enh) ", 0x00 }, - { " 01 US (UnEnh) ", 0x01 }, - { " 02 Clinton Turner V1 ", 0x02 }, - { " 03 ReActiveMicro (Enh) ", 0x03 }, - { " 04 Dan Paymar (Enh) ", 0x04 }, - { " 05 Blippo Black (Enh) ", 0x05 }, - { " 06 Byte (Enh) ", 0x06 }, - { " 07 Colossal (Enh) ", 0x07 }, - { " 08 Count (Enh) ", 0x08 }, - { " 09 Flow (Enh) ", 0x09 }, - { " 0A Gothic (Enh) ", 0x0a }, - { " 0B Outline (Enh) ", 0x0b }, - { " 0C PigFont (Enh) ", 0x0c }, - { " 0D Pinocchio (Enh) ", 0x0d }, - { " 0E Slant (Enh) ", 0x0e }, - { " 0F Stop (Enh) ", 0x0f }, + { "00 US Enh", 0x00 }, + { "01 US UnEnh", 0x01 }, + { "02 Clinton Turner V1", 0x02 }, + { "03 ReActiveMicro Enh", 0x03 }, + { "04 Dan Paymar Enh", 0x04 }, + { "05 Blippo Black Enh", 0x05 }, + { "06 Byte Enh", 0x06 }, + { "07 Colossal Enh", 0x07 }, + { "08 Count Enh", 0x08 }, + { "09 Flow Enh", 0x09 }, + { "0A Gothic Enh", 0x0a }, + { "0B Outline Enh", 0x0b }, + { "0C PigFont Enh", 0x0c }, + { "0D Pinocchio Enh", 0x0d }, + { "0E Slant Enh", 0x0e }, + { "0F Stop Enh", 0x0f }, - { " 10 Euro (UnEnh) ", 0x10 }, - { " 11 Euro (Enh) ", 0x11 }, - { " 12 Clinton Turner V2 ", 0x12 }, - { " 13 German (Enh) ", 0x13 }, - { " 14 German (UnEnh) ", 0x14 }, - { " 15 French (Enh) ", 0x15 }, - { " 16 French (UnEnh) ", 0x16 }, - { " 17 Hebrew (Enh) ", 0x17 }, - { " 18 Hebrew (UnEnh) ", 0x18 }, - { " 19 Apple II+ (Enh) ", 0x19 }, - { " 1A Apple II+ (UnEnh) ", 0x1a }, - { " 1B Katakana (Enh) ", 0x1b }, - { " 1C Cyrillic (Enh) ", 0x1c }, - { " 1D Greek (Enh) ", 0x1d }, - { " 1E Esperanto (Enh) ", 0x1e }, - { " 1F Videx (Enh) ", 0x1f }, + { "10 Euro UnEnh", 0x10 }, + { "11 Euro Enh", 0x11 }, + { "12 Clinton Turner V2", 0x12 }, + { "13 German Enh", 0x13 }, + { "14 German UnEnh", 0x14 }, + { "15 French Enh", 0x15 }, + { "16 French UnEnh", 0x16 }, + { "17 Hebrew Enh", 0x17 }, + { "18 Hebrew UnEnh", 0x18 }, + { "19 Apple II+ Enh", 0x19 }, + { "1A Apple II+ UnEnh", 0x1a }, + { "1B Katakana Enh", 0x1b }, + { "1C Cyrillic Enh", 0x1c }, + { "1D Greek Enh", 0x1d }, + { "1E Esperanto Enh", 0x1e }, + { "1F Videx Enh", 0x1f }, - { " 20 Apple II/II+ ", 0x20 }, - { " 21 Apple IIe ", 0x21 }, - { " 22 Apple IIgs ", 0x22 }, - { " 23 Pravetz ", 0x23 }, - { " 24 Custom ", 0x24 }, - { " 25 Custom ", 0x25 }, - { " 26 Custom ", 0x26 }, - { " 27 Custom ", 0x27 }, + { "20 Apple II/II+", 0x20 }, + { "21 Apple IIe", 0x21 }, + { "22 Apple IIgs", 0x22 }, + { "23 Pravetz", 0x23 }, + { "24 Custom", 0x24 }, + { "25 Custom", 0x25 }, + { "26 Custom", 0x26 }, + { "27 Custom", 0x27 }, }; uint8_t parsehex8(char *str) { @@ -227,62 +284,95 @@ uint8_t parsehex8(char *str) { } int slot_menu() { - int paint_menu = 2; + int paint_menu = 0x7; int selected_slot = 0; int top = 0; int y, i; uint8_t block = parsehex8(fontname); + int total_slots = (sizeof(font_slot)/sizeof(font_slot_t)); #if 0 // Try to find a matching slot from our table for(i = 0; i < (sizeof(font_slot)/sizeof(font_slot_t)); i++) { if(block == font_slot[i].block) { selected_slot = i; - top = (selected_slot / 15) * 15; + top = (selected_slot / FONT_MAX) * FONT_MAX; break; } } #endif - while(paint_menu >= 0) { - if(paint_menu == 2) { + while(paint_menu != -1) { + if(paint_menu & 0x4) { backdrop(PROGNAME); - window(" Font Slot? ", 24, 17, 0); - paint_menu = 1; + window(" Font Slot? ", 28, FONT_MAX+2, 0); } - if(paint_menu > 0) { + if(paint_menu & 0x2) { + y=5; + if((top > 0) || (total_slots >= (FONT_MAX+top))) { + for(i = 1; i < FONT_MAX-1; i++) { + gotoy(y+i); gotox(31); + cputc(CHAR_SCROLLBAR_LEFT); + if(((i < (FONT_MAX / 3)) && (top < (total_slots / 3))) || + ((i >= (FONT_MAX / 3)) && (i < ((FONT_MAX * 2) / 3)) && (top >= (total_slots / 3)) && (top < (total_slots * 2) / 3)) || + ((i >= ((FONT_MAX * 2) / 3)) && (top >= ((total_slots * 2) / 3)))) { + cputc(CHAR_SCROLLBAR_FULL); + } else { + cputc(CHAR_SCROLLBAR_EMPTY); + } + cputc(CHAR_SCROLLBAR_RIGHT); + } + gotoy(y-1); gotox(32); + cputc(CHAR_SCROLLBAR_TOP); + gotoy(y+0); gotox(31); + cputc(CHAR_SCROLLBAR_LEFT); + cputc(UP_ARROW); + cputc(CHAR_SCROLLBAR_RIGHT); + gotoy(y+FONT_MAX-1); gotox(31); + cputc(CHAR_SCROLLBAR_LEFT); + cputc(DOWN_ARROW); + cputc(CHAR_SCROLLBAR_RIGHT); + gotoy(y+FONT_MAX); gotox(32); + cputc(CHAR_SCROLLBAR_BOTTOM); + } + } + if(paint_menu & 0x1) { for(y = 0; y < 15; y++) { i = y+top; if(i < (sizeof(font_slot)/sizeof(font_slot_t))) { - gotoy(5+y); gotox(9); - print_menu_item(font_slot[i].entry, (selected_slot == i)); + gotoy(5+y); gotox(7); + print_menu_select(font_slot[i].entry, 24, (selected_slot == i), 0); } else { - gotoy(5+y); gotox(9); - repeatchar(' ', 22); + gotoy(5+y); gotox(7); + repeatchar(' ', 24); } } - paint_menu = 0; } + paint_menu = 0; switch(cgetc()) { case 0x08: case 0x0B: if(selected_slot > 0) { selected_slot--; - if(selected_slot < top) + paint_menu |= 1; + if(selected_slot < top) { top = (selected_slot / 15) * 15; + paint_menu |= 2; + } } - paint_menu = 1; break; case 0x0A: case 0x15: if(selected_slot < ((sizeof(font_slot)/sizeof(font_slot_t))-1)) { selected_slot++; - if(selected_slot > top + 14) + paint_menu |= 1; + if(selected_slot > top + 14) { top = (selected_slot / 15) * 15; + paint_menu |= 2; + } } - paint_menu = 1; break; case 0x1B: return -1; @@ -379,6 +469,12 @@ int open_fontdir(void) { ext = strrchr (ent->d_name, '.'); if (!ext || (strcasecmp (ext, ".pf") && strcasecmp (ext, ".cf"))) continue; + + if (total_fonts < (sizeof(fontlist)/sizeof(fontentry_t))) { + strcpy(fontlist[total_fonts].pathname, prefix); + strcat(fontlist[total_fonts].pathname, ent->d_name); + strcpy(fontlist[total_fonts].fontname, ent->d_name); + } total_fonts++; } @@ -481,7 +577,8 @@ int load_font(void) { i = 0; while(i < 2048) { - fontbuffer[i++] ^= filebuffer[i++]; + fontbuffer[i] ^= filebuffer[i]; + i++; } fclose(f); } @@ -524,12 +621,7 @@ void index_fonts(void) { rewinddir(fontdir); - backdrop(PROGNAME); line_count = 0; - if(top_entry > 0) { - gotoy(2); gotox(1); - cputc(UP_ARROW); - } while (ent = readdir(fontdir)) { ext = strrchr (ent->d_name, '.'); if (!ext || (strcasecmp (ext, ".pf") && strcasecmp (ext, ".cf"))) @@ -542,25 +634,14 @@ void index_fonts(void) { } if(line_count < FONT_MAX) { - gotoy(3+line_count); - if(current_entry == selected_entry) { - gotox(1); - cputc(RIGHT_ARROW); - arrow_line = 3+line_count; - } - gotox(3); - printlimited(ent->d_name, 32); - cputs("\r\n"); + strcpy(fontlist[line_count].pathname, prefix); + strcat(fontlist[line_count].pathname, ent->d_name); + strcpy(fontlist[line_count].fontname, ent->d_name); + current_entry++; line_count++; } } - - more_fonts = (total_fonts > current_entry); - if(more_fonts) { - gotoy(21); gotox(1); - cputc(DOWN_ARROW); - } } int select_font(void) { @@ -571,13 +652,13 @@ int select_font(void) { if(load_font()) { action_menu(); } - return 1; + return 0xB; case 'T': case 't': if(load_font()) { upload_font(fontbuffer); } - return 1; + return 0xB; case 'I': case 'i': if(load_font()) { @@ -586,7 +667,7 @@ int select_font(void) { write_font(fontbuffer, font_slot[selected_slot].block); } } - return 1; + return 0xB; case 0x08: case 0x0B: // Left (UP) @@ -599,19 +680,12 @@ int select_font(void) { // Entry is on the same page, don't re-read the disk directory if((selected_entry >= top_entry) && (selected_entry < (top_entry + line_count))) { - gotoy(arrow_line); gotox(1); - cputc(' '); - - arrow_line = 3+(selected_entry - top_entry); - gotoy(arrow_line); gotox(1); - cputc(RIGHT_ARROW); - break; + return 0x1; } else { // Entry is on another page, re-read the disk directory - top_entry = (selected_entry / FONT_MAX) * FONT_MAX; - return 1; + return 0x7; } - return 1; + return 0; case 0x0A: case 0x15: // Right (DOWN) @@ -624,36 +698,89 @@ int select_font(void) { // Entry is on the same page, don't re-read the disk directory if((selected_entry >= top_entry) && (selected_entry < (top_entry + line_count))) { - gotoy(arrow_line); gotox(1); - cputc(' '); - - arrow_line = 3+(selected_entry - top_entry); - gotoy(arrow_line); gotox(1); - cputc(RIGHT_ARROW); - break; + return 0x1; } else { // Entry is on another page, re-read the disk directory - top_entry = (selected_entry / FONT_MAX) * FONT_MAX; - return 1; + return 0x7; } - return 1; + return 0; case 0x1B: // Abort - return 0; + return -1; } } } void browse_fonts(void) { + int paint_menu = 0xF; + int i; + int y = 12 - 7; + if(!open_fontdir()) { backdrop(PROGNAME); message(" Error ", "Unable to open font folder."); return; } - do { - index_fonts(); - } while(select_font()); + while(paint_menu >= 0) { + if(paint_menu & 0x8) { + backdrop(PROGNAME); + window(" Font Browser ", 26, 17, 0); + } + if(paint_menu & 0x4) { + top_entry = (selected_entry / FONT_MAX) * FONT_MAX; + index_fonts(); + } + if(paint_menu & 0x2) { + more_fonts = (total_fonts >= (FONT_MAX+top_entry)); + if((top_entry > 0) || (more_fonts)) { + for(i = 1; i < FONT_MAX-1; i++) { + gotoy(y+i); gotox(30); + cputc(CHAR_SCROLLBAR_LEFT); + if(i < (FONT_MAX / 3)) { + if(top_entry > (total_fonts / 3)) { + cputc(CHAR_SCROLLBAR_EMPTY); + } else { + cputc(CHAR_SCROLLBAR_FULL); + } + } else if(i < ((FONT_MAX * 2) / 3)) { + cputc(CHAR_SCROLLBAR_FULL); + } else { + if(top_entry < (total_fonts / 3)) { + cputc(CHAR_SCROLLBAR_EMPTY); + } else { + cputc(CHAR_SCROLLBAR_FULL); + } + } + cputc(CHAR_SCROLLBAR_RIGHT); + } + gotoy(y-1); gotox(31); + cputc(CHAR_SCROLLBAR_TOP); + gotoy(y+0); gotox(30); + cputc(CHAR_SCROLLBAR_LEFT); + cputc(UP_ARROW); + cputc(CHAR_SCROLLBAR_RIGHT); + gotoy(y+FONT_MAX-1); gotox(30); + cputc(CHAR_SCROLLBAR_LEFT); + cputc(DOWN_ARROW); + cputc(CHAR_SCROLLBAR_RIGHT); + gotoy(y+FONT_MAX); gotox(31); + cputc(CHAR_SCROLLBAR_BOTTOM); + } + } + if(paint_menu & 0x1) { + for(i = 0; i < longmin((total_fonts-top_entry), FONT_MAX); i++) { + gotoy(y+i); gotox(8); + print_menu_select(fontlist[i].fontname, 22, (selected_entry == i+top_entry), 0); + } + while(i < FONT_MAX) { + gotoy(y+i); gotox(8); + repeatchar(' ', 22); + i++; + } + } + paint_menu = select_font(); + }; closedir(fontdir); } @@ -679,6 +806,12 @@ int main_menu_action(int action) { remove_font(font_slot[selected_slot].block); } return 2; + case 3: + selected_slot = slot_menu(); + if(selected_slot >= 0) { + CARD_REGISTER(0x0B) = selected_slot; + } + return 2; } return 1; } @@ -690,21 +823,21 @@ void main_menu(void) { for(;;) { if(paint_menu == 2) { backdrop(PROGNAME); - window(" Main Menu ", 24, 7, 0); + window(" Main Menu ", 26, 9, 0); paint_menu = 1; } if(paint_menu > 0) { - gotoy(10); gotox(9); - revers(selected_action == 0); - cputs(" Browse fonts "); + gotoy(9); gotox(8); + print_menu_select("Browse fonts", 24, (selected_action == 0), 0); - gotoy(12); gotox(9); - revers(selected_action == 1); - cputs(" Download stored font "); + gotoy(11); gotox(8); + print_menu_select("Download stored font", 24, (selected_action == 1), 0); - gotoy(14); gotox(9); - revers(selected_action == 2); - cputs(" Remove stored font "); + gotoy(13); gotox(8); + print_menu_select("Remove stored font", 24, (selected_action == 2), 0); + + gotoy(15); gotox(8); + print_menu_select("Select current font", 24, (selected_action == 3), 0); revers(0); paint_menu = 0; @@ -723,6 +856,10 @@ void main_menu(void) { case 'r': paint_menu = main_menu_action(selected_action = 2); break; + case 'S': + case 's': + paint_menu = main_menu_action(selected_action = 3); + break; case 0x08: case 0x0B: if(selected_action > 0) @@ -731,11 +868,12 @@ void main_menu(void) { break; case 0x0A: case 0x15: - if(selected_action < 2) + if(selected_action < 3) selected_action++; paint_menu = 1; break; case 0x1B: + backdrop(PROGNAME); if(confirm(" Are you sure? ", "Quit the Font Manager?")) return; @@ -751,8 +889,7 @@ void main_menu(void) { void main (void) { if(!prompt_slot(PROGNAME)) { - exec("MENU.SYSTEM", ""); - return; + goto cleanup; } backdrop(PROGNAME); @@ -760,6 +897,11 @@ void main (void) { cputs("Indexing Fonts"); main_menu(); - clrscr(); + +cleanup: + backdrop(PROGNAME); + gotoy(12); gotox(13); + cputs("Launching Menu"); + exec("MENU.SYSTEM", ""); } diff --git a/src/menu.c b/src/menu.c index 59a9e1b..9bf7118 100644 --- a/src/menu.c +++ b/src/menu.c @@ -45,8 +45,8 @@ menu_t launcher[] = { { 0, MENU_LAUNCH_NOCHECKARGS, " Font Manager ", "FONTMGR.ENH", "FONTMGR.BASE", "" }, { 0, MENU_SEPARATOR, NULL, NULL, NULL, NULL }, { 0, MENU_LAUNCH_NOCHECKARGS, " Applesoft Basic ", "BASIC.SYSTEM", "BASIC.SYSTEM", "" }, - { 0, MENU_LAUNCH_NOCHECKARGS, " ADTPRO ", "ADTPRO/ADTPRO", "ADTPRO/ADTPRO", "" }, - { 0, MENU_LAUNCH_NOCHECKARGS, " VSDRIVE ", "VDRIVE/VSDRIVE", "VDRIVE/VSDRIVE", "" }, + { 0, MENU_LAUNCH_NOCHECKARGS, " ADTPro Serial ", "ADTPRO/ADTPRO", "ADTPRO/ADTPRO", "" }, + { 0, MENU_LAUNCH_NOCHECKARGS, " Virtual Serial Drive ", "VDRIVE/VSDRIVE", "VDRIVE/VSDRIVE", "" }, { 0, MENU_SEPARATOR, NULL, NULL, NULL, NULL }, { 1, MENU_EXIT, " Exit ", NULL, NULL, NULL }, { 0, MENU_TERMINATOR, NULL, NULL, NULL, NULL }, @@ -72,12 +72,22 @@ int main_menu_action(int action) { f = fopen(launcher[action].filename_enhanced, "rb"); if(f != NULL) { fclose(f); + + backdrop(PROGNAME); + gotoy(12); gotox(9); + cputs("Launching Application"); + exec(launcher[action].filename_enhanced, launcher[action].arguments); } #endif f = fopen(launcher[action].filename_base, "rb"); if(f != NULL) { fclose(f); + + backdrop(PROGNAME); + gotoy(12); gotox(9); + cputs("Launching Application"); + exec(launcher[action].filename_base, launcher[action].arguments); } diff --git a/src/menu.h b/src/menu.h index 09a9caa..fff99fc 100644 --- a/src/menu.h +++ b/src/menu.h @@ -12,6 +12,12 @@ #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 @@ -25,6 +31,12 @@ #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 diff --git a/src/v2analog.h b/src/v2analog.h index f6a3445..67a4210 100644 --- a/src/v2analog.h +++ b/src/v2analog.h @@ -7,9 +7,10 @@ #define VGA_TBCOLOR CARD_REGISTER(0x2) #define VGA_BORDER CARD_REGISTER(0x3) -#define CF_PTRL *((volatile unsigned char *)(0xC0ED | (cardslot << 8))) -#define CF_PTRH *((volatile unsigned char *)(0xC0EE | (cardslot << 8))) -#define CF_DATA *((volatile unsigned char *)(0xC0EF | (cardslot << 8))) +#define CF_PTRL *((volatile unsigned char *)(0xC0EC | (cardslot << 8))) +#define CF_PTRH *((volatile unsigned char *)(0xC0ED | (cardslot << 8))) +#define CF_DATR *((volatile unsigned char *)(0xC0EE | (cardslot << 8))) +#define CF_DATW *((volatile unsigned char *)(0xC0EF | (cardslot << 8))) #define CMD_BUFFER ((volatile unsigned char *)(0xC0F0 | (cardslot << 8))) #define RPY_BUFFER ((volatile unsigned char *)(0xC0F8 | (cardslot << 8))) @@ -71,10 +72,12 @@ void hexprint(volatile uint8_t *buf, int size) { int cfg_cmd3(char *cmd, uint16_t param0, uint16_t param1, uint16_t param2) { uint16_t timeout = 0x1fff; +#if 0 gotoy(16); gotox(8); cputc(cmd[0]); cputc(cmd[1]); cprintf(" $%04X $%04X $%04X", param0, param1, param2); +#endif RPY_BUFFER[7] = 0xFF; CMD_BUFFER[7] = (param2 >> 8) & 0xFF; @@ -103,8 +106,10 @@ int cfg_cmd3(char *cmd, uint16_t param0, uint16_t param1, uint16_t param2) { if(timeout > 0) timeout--; } +#if 0 gotoy(18); gotox(8); hexprint(RPY_BUFFER, 8); +#endif return (timeout == 0) || (RPY_BUFFER[0] != REPLY_OK); }