/** * createentry - create a single directory entry in buf * @dent : directory entry to be added * @buf : buffer to be used * @format: entry format * * This function creates a directory entry for dent in the selected format * in the given buffer. */ static void createentry(cbmdirent_t *dent, buffer_t *buf, dirformat_t format) { uint8_t i; uint8_t *data = buf->data; if(format == DIR_FMT_CMD_LONG) i=63; else if(format == DIR_FMT_CMD_SHORT) i=41; else i=31; buf->lastused = i; /* Clear the line */ memset(data, ' ', i); /* Line end marker */ data[i] = 0; /* Next line pointer, 1571-compatible =) */ if (dent->remainder != 0xff) /* store remainder in low byte of link pointer */ /* +2 so it is never 0 (end-marker) or 1 (normal value) */ *data++ = dent->remainder+2; else *data++ = 1; *data++ = 1; *data++ = dent->blocksize & 0xff; *data++ = dent->blocksize >> 8; /* Filler before file name */ data++; if (dent->blocksize < 100) data++; if (dent->blocksize < 10) data++; *data++ = '"'; /* copy and adjust the filename - C783 */ memcpy(data, dent->name, CBM_NAME_LENGTH); for (i=0;i<=CBM_NAME_LENGTH;i++) if (dent->name[i] == 0x22 || dent->name[i] == 0 || i == 16) { data[i] = '"'; while (i<=CBM_NAME_LENGTH) { if (data[i] == 0) data[i] = ' '; else data[i] &= 0x7f; i++; } } /* Skip name and final quote */ data += CBM_NAME_LENGTH+1; if (dent->typeflags & FLAG_SPLAT) *data = '*'; /* File type */ memcpy_P(data+1, filetypes + TYPE_LENGTH * (dent->typeflags & EXT_TYPE_MASK), (format & DIR_FMT_CMD_SHORT) ? 1 : TYPE_LENGTH); /* RO marker */ if (dent->typeflags & FLAG_RO) data[4] = '<'; if(format & DIR_FMT_CMD_LONG) { data += 7; data = appendnumber(data,dent->date.month); *data++ = '/'; data = appendnumber(data,dent->date.day); *data++ = '/'; data = appendnumber(data,dent->date.year % 100) + 3; data = appendnumber(data,(dent->date.hour>12?dent->date.hour-12:dent->date.hour)); *data++ = '.'; data = appendnumber(data,dent->date.minute) + 1; *data++ = (dent->date.hour>11?'P':'A'); *data++ = 'M'; while (*data) *data++ = 1; } else if(format == DIR_FMT_CMD_SHORT) { /* Add date/time stamp */ data+=3; data = appendnumber(data,dent->date.month); *data++ = '/'; data = appendnumber(data,dent->date.day) + 1; data = appendnumber(data,(dent->date.hour>12?dent->date.hour-12:dent->date.hour)); *data++ = '.'; data = appendnumber(data,dent->date.minute) + 1; *data++ = (dent->date.hour>11?'P':'A'); while(*data) *data++ = 1; } else { /* Extension: Hidden marker */ if (dent->typeflags & FLAG_HIDDEN) data[5] = 'H'; } }
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); }