static uint8_t *appendmsg(uint8_t *msg, const uint8_t *table, const uint8_t entry) { uint8_t i,tmp; i = 0; do { tmp = pgm_read_byte(table+i++); if (tmp == EC(entry) || tmp == EC(127)) break; } while (1); if (tmp == EC(127)) { /* Unknown error */ *msg++ = '?'; } else { /* Skip over remaining error numbers */ while (pgm_read_byte(table+i) >= EC(0)) i++; /* Copy error string to buffer */ do { tmp = pgm_read_byte(table+i++); if (tmp < 32) { /* Abbreviation found, handle by recursion */ msg = appendmsg(msg,abbrevs,tmp); continue; } if (tmp < EC(0)) /* Don't copy error numbers */ *msg++ = tmp; } while (tmp < EC(0)); } return msg; }
void set_error_ts(uint8_t errornum, uint8_t track, uint8_t sector) { uint8_t *msg = error_buffer; uint8_t i = 0; current_error = errornum; buffers[ERRORBUFFER_IDX].data = error_buffer; buffers[ERRORBUFFER_IDX].lastused = 0; buffers[ERRORBUFFER_IDX].position = 0; memset(error_buffer,0,sizeof(error_buffer)); msg = appendnumber(msg,errornum); *msg++ = ','; if (errornum == ERROR_STATUS) { switch(sector) { case 0: default: *msg++ = 'E'; msg = appendnumber(msg, file_extension_mode); msg = appendbool(msg, 0, globalflags & EXTENSION_HIDING); msg = appendbool(msg, '*', globalflags & POSTMATCH); *msg++ = 'I'; msg = appendnumber(msg, image_as_dir); *msg++ = ':'; *msg++ = 'R'; ustrcpy(msg, rom_filename); msg += ustrlen(rom_filename); break; case 1: // Drive Config *msg++ = 'D'; while(i < 8) { if(map_drive(i) != 0x0f) { *msg++ = ':'; msg = appendnumber(msg,i); *msg++ = '='; msg = appendnumber(msg,map_drive(i)); } i++; } break; } } else if (errornum == ERROR_LONGVERSION || errornum == ERROR_DOSVERSION) { /* Start with the name and version number */ while ((*msg++ = pgm_read_byte(versionstr+i++))) ; /* Append the long version if requested */ if (errornum == ERROR_LONGVERSION) { i = 0; msg--; while ((*msg++ = toupper((int)pgm_read_byte(longverstr+i++)))) ; } msg--; } else { msg = appendmsg(msg,messages,errornum); } *msg++ = ','; msg = appendnumber(msg,track); *msg++ = ','; msg = appendnumber(msg,sector); *msg = 13; buffers[ERRORBUFFER_IDX].lastused = msg - error_buffer; }
void set_error_ts(uint8_t errornum, uint8_t track, uint8_t sector) { uint8_t *msg = error_buffer; uint8_t i = 0; current_error = errornum; buffers[ERRORBUFFER_IDX].data = error_buffer; buffers[ERRORBUFFER_IDX].lastused = 0; buffers[ERRORBUFFER_IDX].position = 0; memset(error_buffer,0,sizeof(error_buffer)); msg = appendnumber(msg,errornum); *msg++ = ','; if (errornum == ERROR_STATUS) { switch(sector) { case 0: default: *msg++ = 'E'; msg = appendnumber(msg, file_extension_mode); msg = appendbool(msg, 0, globalflags & EXTENSION_HIDING); msg = appendbool(msg, '*', globalflags & POSTMATCH); *msg++ = 'I'; msg = appendnumber(msg, image_as_dir); *msg++ = ':'; *msg++ = 'R'; ustrcpy(msg, rom_filename); msg += ustrlen(rom_filename); break; case 1: // Drive Config *msg++ = 'D'; while(i < 8) { if(map_drive(i) != 0x0f) { *msg++ = ':'; msg = appendnumber(msg,i); *msg++ = '='; msg = appendnumber(msg,map_drive(i)); } i++; } break; } } else if (errornum == ERROR_LONGVERSION || errornum == ERROR_DOSVERSION) { /* Start with the name and version number */ while ((*msg++ = pgm_read_byte(versionstr+i++))) ; /* Append the long version if requested */ if (errornum == ERROR_LONGVERSION) { i = 0; msg--; while ((*msg++ = toupper((int)pgm_read_byte(longverstr+i++)))) ; } msg--; } else { msg = appendmsg(msg,messages,errornum); } *msg++ = ','; msg = appendnumber(msg,track); *msg++ = ','; msg = appendnumber(msg,sector); *msg = 13; if (errornum >= 20 && errornum != ERROR_DOSVERSION) { // FIXME: Compare to E648 // NOTE: 1571 doesn't write the BAM and closes some buffers if an error occured led_state |= LED_ERROR; } else { led_state &= (uint8_t)~LED_ERROR; set_error_led(0); } buffers[ERRORBUFFER_IDX].lastused = msg - error_buffer; /* Send message without the final 0x0d */ display_errorchannel(msg - error_buffer, error_buffer); }