mirror of
https://codeberg.org/hkzlab/TK2000_floppicator.git
synced 2025-12-25 17:12:32 +11:00
Do not headbang at every restart of writing
This commit is contained in:
parent
cd8135241b
commit
abe1c60261
2 changed files with 108 additions and 84 deletions
188
src/main.c
188
src/main.c
|
|
@ -33,7 +33,7 @@ static uint8_t str_conv_buffer[SCREEN_CHAR_WIDTH];
|
|||
|
||||
static void init(void);
|
||||
static void draw_sector_map(void);
|
||||
static void reseat_floppy_heads(void);
|
||||
static void reseat_floppy_heads(uint8_t trk_1, uint8_t trk_2);
|
||||
|
||||
// Low level initialization
|
||||
static void init(void) {
|
||||
|
|
@ -69,18 +69,18 @@ static void draw_sector_map(void) {
|
|||
}
|
||||
}
|
||||
|
||||
static void reseat_floppy_heads(void) {
|
||||
static void reseat_floppy_heads(uint8_t trk_1, uint8_t trk_2) {
|
||||
dii_power_on(DEFAULT_DRIVE_CONTROLLER_OFFSET, 0);
|
||||
dii_head_reposition(DEFAULT_DRIVE_CONTROLLER_OFFSET, 96, 0);
|
||||
dii_head_reposition(DEFAULT_DRIVE_CONTROLLER_OFFSET, trk_1 << 1, 0);
|
||||
dii_power_off(DEFAULT_DRIVE_CONTROLLER_OFFSET);
|
||||
|
||||
dii_power_on(DEFAULT_DRIVE_CONTROLLER_OFFSET, 1);
|
||||
dii_head_reposition(DEFAULT_DRIVE_CONTROLLER_OFFSET, 96, 0);
|
||||
dii_head_reposition(DEFAULT_DRIVE_CONTROLLER_OFFSET, trk_2 << 1, 0);
|
||||
dii_power_off(DEFAULT_DRIVE_CONTROLLER_OFFSET);
|
||||
}
|
||||
|
||||
__task int main(void) {
|
||||
uint8_t trk_pos_1 = 0, trk_pos_2 = 0;
|
||||
uint8_t trk_pos_1 = 48, trk_pos_2 = 48; // The first run will headbang back to 0
|
||||
uint16_t errors = 0;
|
||||
uint8_t *temp_crc_buf;
|
||||
|
||||
|
|
@ -92,112 +92,136 @@ __task int main(void) {
|
|||
draw_chars(12, 32, 0, str_conv_buffer, str_len);
|
||||
|
||||
str_len = convert_string(str_conv_buffer, SCREEN_CHAR_WIDTH, "PRESS ANY KEY TO CONTINUE");
|
||||
draw_chars(7, 176, 1, str_conv_buffer, str_len);
|
||||
draw_chars(7, 160, 1, str_conv_buffer, str_len);
|
||||
|
||||
str_len = convert_string(str_conv_buffer, SCREEN_CHAR_WIDTH, "hkz@social.chinwag.org 2025");
|
||||
draw_chars(5, 176, 0, str_conv_buffer, str_len);
|
||||
|
||||
while(!read_any_key());
|
||||
snd_mod_button();
|
||||
|
||||
clear_display_buffer();
|
||||
|
||||
draw_sector_map();
|
||||
|
||||
str_len = convert_string(str_conv_buffer, SCREEN_CHAR_WIDTH, "ERRORS: 000");
|
||||
draw_chars(0, CHAR_HEIGHT * (MAP_TOP_OFFSET + 19), 0, str_conv_buffer, str_len);
|
||||
|
||||
reseat_floppy_heads();
|
||||
|
||||
temp_crc_buf = crc_buffer;
|
||||
for(uint8_t part = 0; part < TRACK_PARTS; part++) {
|
||||
uint8_t start_track = part * TRACKS_AT_ONCE;
|
||||
|
||||
|
||||
while(1) {
|
||||
reseat_floppy_heads(trk_pos_1, trk_pos_2);
|
||||
|
||||
dii_power_on(DEFAULT_DRIVE_CONTROLLER_OFFSET, 0);
|
||||
trk_pos_1 = 0;
|
||||
trk_pos_2 = 0;
|
||||
errors = 0;
|
||||
|
||||
for(uint8_t cur_trk = 0; cur_trk < TRACKS_AT_ONCE; cur_trk++) {
|
||||
SND_TAP();
|
||||
|
||||
dii_head_reposition(DEFAULT_DRIVE_CONTROLLER_OFFSET, trk_pos_1 << 1, (start_track + cur_trk) << 1);
|
||||
trk_pos_1 = (start_track + cur_trk);
|
||||
|
||||
for(uint8_t sec = 0; sec < SECTORS_PER_TRACK; sec++) {
|
||||
uint8_t read_res = dii_read_sector(DEFAULT_DRIVE_CONTROLLER_OFFSET, trk_pos_1, sec, track_buffer + (cur_trk * SECTORS_PER_TRACK * SECTOR_SIZE) + (sec * SECTOR_SIZE), 0);
|
||||
*(temp_crc_buf++) = calculate_crc8(track_buffer + (cur_trk * SECTORS_PER_TRACK * SECTOR_SIZE) + (sec * SECTOR_SIZE), SECTOR_SIZE);
|
||||
draw_char((start_track + cur_trk) + 1, CHAR_HEIGHT * (MAP_TOP_OFFSET + 2 + sec), read_res ? 0 : 1, read_res ? 18 : 24);
|
||||
|
||||
if(!read_res) {
|
||||
errors++;
|
||||
snd_mod_button();
|
||||
draw_number(errors, 3, 8, CHAR_HEIGHT * (MAP_TOP_OFFSET + 19));
|
||||
}
|
||||
}
|
||||
}
|
||||
draw_sector_map();
|
||||
|
||||
dii_power_off(DEFAULT_DRIVE_CONTROLLER_OFFSET);
|
||||
str_len = convert_string(str_conv_buffer, SCREEN_CHAR_WIDTH, "ERRORS: 000");
|
||||
draw_chars(0, CHAR_HEIGHT * (MAP_TOP_OFFSET + 20), 0, str_conv_buffer, str_len);
|
||||
|
||||
dii_power_on(DEFAULT_DRIVE_CONTROLLER_OFFSET, 1);
|
||||
str_len = convert_string(str_conv_buffer, SCREEN_CHAR_WIDTH, "R - READ | W - WRITTEN | V - VALIDATED");
|
||||
draw_chars(0, CHAR_HEIGHT * (MAP_TOP_OFFSET + 19), 0, str_conv_buffer, str_len);
|
||||
|
||||
for(uint8_t cur_trk = 0; cur_trk < TRACKS_AT_ONCE; cur_trk++) {
|
||||
SND_TAP();
|
||||
|
||||
dii_head_reposition(DEFAULT_DRIVE_CONTROLLER_OFFSET, trk_pos_2 << 1, (start_track + cur_trk) << 1);
|
||||
trk_pos_2 = (start_track + cur_trk);
|
||||
|
||||
for(uint8_t sec = 0; sec < SECTORS_PER_TRACK; sec++) {
|
||||
dii_encode_gcr62_data(track_buffer + (cur_trk * SECTORS_PER_TRACK * SECTOR_SIZE) + (sec * SECTOR_SIZE), (uint8_t*)WRITE_SIXES_BUFFER_DEFAULT_ADDRESS, (uint8_t*)WRITE_TWOS_BUFFER_DEFAULT_ADDRESS);
|
||||
uint8_t write_res = dii_write_sector(DEFAULT_DRIVE_CONTROLLER_OFFSET, trk_pos_2, sec);
|
||||
draw_char((start_track + cur_trk) + 1, CHAR_HEIGHT * (MAP_TOP_OFFSET + 2 + sec), write_res ? 1 : 0, write_res ? 24 : 23);
|
||||
|
||||
if(write_res) {
|
||||
errors++;
|
||||
snd_mod_button();
|
||||
draw_number(errors, 3, 8, CHAR_HEIGHT * (MAP_TOP_OFFSET + 19));
|
||||
}
|
||||
}
|
||||
}
|
||||
str_len = convert_string(str_conv_buffer, SCREEN_CHAR_WIDTH, "1.0");
|
||||
draw_chars(SCREEN_CHAR_WIDTH - 3, CHAR_HEIGHT * (MAP_TOP_OFFSET + 21), 0, str_conv_buffer, str_len);
|
||||
|
||||
dii_power_off(DEFAULT_DRIVE_CONTROLLER_OFFSET);
|
||||
}
|
||||
|
||||
|
||||
if(!errors) { // No errors up to now, check what we have written
|
||||
dii_power_on(DEFAULT_DRIVE_CONTROLLER_OFFSET, 1);
|
||||
str_len = convert_string(str_conv_buffer, SCREEN_CHAR_WIDTH, " ");
|
||||
draw_chars(0, CHAR_HEIGHT * (MAP_TOP_OFFSET + 21), 0, str_conv_buffer, str_len);
|
||||
|
||||
// Now, time to check that we wrote things that make sense...
|
||||
temp_crc_buf = crc_buffer;
|
||||
for(uint8_t cur_trk = 0; cur_trk < TOT_FLOPPY_TRACKS; cur_trk++) {
|
||||
for(uint8_t part = 0; part < TRACK_PARTS; part++) {
|
||||
uint8_t start_track = part * TRACKS_AT_ONCE;
|
||||
|
||||
dii_power_on(DEFAULT_DRIVE_CONTROLLER_OFFSET, 0);
|
||||
|
||||
for(uint8_t cur_trk = 0; cur_trk < TRACKS_AT_ONCE; cur_trk++) {
|
||||
SND_TAP();
|
||||
|
||||
dii_head_reposition(DEFAULT_DRIVE_CONTROLLER_OFFSET, trk_pos_2 << 1, cur_trk << 1);
|
||||
trk_pos_2 = cur_trk;
|
||||
dii_head_reposition(DEFAULT_DRIVE_CONTROLLER_OFFSET, trk_pos_1 << 1, (start_track + cur_trk) << 1);
|
||||
trk_pos_1 = (start_track + cur_trk);
|
||||
|
||||
for(uint8_t sec = 0; sec < SECTORS_PER_TRACK; sec++) {
|
||||
uint8_t read_res = dii_read_sector(DEFAULT_DRIVE_CONTROLLER_OFFSET, trk_pos_2, sec, track_buffer, 0);
|
||||
draw_char(cur_trk + 1, CHAR_HEIGHT * (MAP_TOP_OFFSET + 2 + sec), 0, read_res ? 102 : 24);
|
||||
uint8_t crc_check = (calculate_crc8(track_buffer, SECTOR_SIZE) == *(temp_crc_buf++));
|
||||
draw_char(cur_trk + 1, CHAR_HEIGHT * (MAP_TOP_OFFSET + 2 + sec), crc_check ? 0 : 1, crc_check ? 22 : 24);
|
||||
for(uint8_t sec = 0; sec < SECTORS_PER_TRACK; sec++) {
|
||||
uint8_t read_res = dii_read_sector(DEFAULT_DRIVE_CONTROLLER_OFFSET, trk_pos_1, sec, track_buffer + (cur_trk * SECTORS_PER_TRACK * SECTOR_SIZE) + (sec * SECTOR_SIZE), 0);
|
||||
*(temp_crc_buf++) = calculate_crc8(track_buffer + (cur_trk * SECTORS_PER_TRACK * SECTOR_SIZE) + (sec * SECTOR_SIZE), SECTOR_SIZE);
|
||||
draw_char((start_track + cur_trk) + 1, CHAR_HEIGHT * (MAP_TOP_OFFSET + 2 + sec), read_res ? 0 : 1, read_res ? 18 : 24);
|
||||
|
||||
if(!read_res) {
|
||||
errors++;
|
||||
snd_mod_button();
|
||||
draw_number(errors, 3, 8, CHAR_HEIGHT * (MAP_TOP_OFFSET + 19));
|
||||
draw_number(errors, 3, 8, CHAR_HEIGHT * (MAP_TOP_OFFSET + 20));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dii_power_off(DEFAULT_DRIVE_CONTROLLER_OFFSET);
|
||||
|
||||
dii_power_on(DEFAULT_DRIVE_CONTROLLER_OFFSET, 1);
|
||||
|
||||
for(uint8_t cur_trk = 0; cur_trk < TRACKS_AT_ONCE; cur_trk++) {
|
||||
SND_TAP();
|
||||
|
||||
dii_head_reposition(DEFAULT_DRIVE_CONTROLLER_OFFSET, trk_pos_2 << 1, (start_track + cur_trk) << 1);
|
||||
trk_pos_2 = (start_track + cur_trk);
|
||||
|
||||
for(uint8_t sec = 0; sec < SECTORS_PER_TRACK; sec++) {
|
||||
dii_encode_gcr62_data(track_buffer + (cur_trk * SECTORS_PER_TRACK * SECTOR_SIZE) + (sec * SECTOR_SIZE), (uint8_t*)WRITE_SIXES_BUFFER_DEFAULT_ADDRESS, (uint8_t*)WRITE_TWOS_BUFFER_DEFAULT_ADDRESS);
|
||||
uint8_t write_res = dii_write_sector(DEFAULT_DRIVE_CONTROLLER_OFFSET, trk_pos_2, sec);
|
||||
draw_char((start_track + cur_trk) + 1, CHAR_HEIGHT * (MAP_TOP_OFFSET + 2 + sec), write_res ? 1 : 0, write_res ? 24 : 23);
|
||||
|
||||
if(!crc_check) {
|
||||
if(write_res) {
|
||||
errors++;
|
||||
snd_mod_button();
|
||||
draw_number(errors, 3, 8, CHAR_HEIGHT * (MAP_TOP_OFFSET + 19));
|
||||
draw_number(errors, 3, 8, CHAR_HEIGHT * (MAP_TOP_OFFSET + 20));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dii_power_off(DEFAULT_DRIVE_CONTROLLER_OFFSET);
|
||||
}
|
||||
|
||||
|
||||
if(!errors) { // No errors up to now, check what we have written
|
||||
dii_power_on(DEFAULT_DRIVE_CONTROLLER_OFFSET, 1);
|
||||
|
||||
// Now, time to check that we wrote things that make sense...
|
||||
temp_crc_buf = crc_buffer;
|
||||
for(uint8_t cur_trk = 0; cur_trk < TOT_FLOPPY_TRACKS; cur_trk++) {
|
||||
SND_TAP();
|
||||
|
||||
dii_head_reposition(DEFAULT_DRIVE_CONTROLLER_OFFSET, trk_pos_2 << 1, cur_trk << 1);
|
||||
trk_pos_2 = cur_trk;
|
||||
|
||||
for(uint8_t sec = 0; sec < SECTORS_PER_TRACK; sec++) {
|
||||
uint8_t read_res = dii_read_sector(DEFAULT_DRIVE_CONTROLLER_OFFSET, trk_pos_2, sec, track_buffer, 0);
|
||||
draw_char(cur_trk + 1, CHAR_HEIGHT * (MAP_TOP_OFFSET + 2 + sec), 0, read_res ? 102 : 24);
|
||||
uint8_t crc_check = (calculate_crc8(track_buffer, SECTOR_SIZE) == *(temp_crc_buf++));
|
||||
draw_char(cur_trk + 1, CHAR_HEIGHT * (MAP_TOP_OFFSET + 2 + sec), crc_check ? 0 : 1, crc_check ? 22 : 24);
|
||||
|
||||
if(!read_res) {
|
||||
errors++;
|
||||
snd_mod_button();
|
||||
draw_number(errors, 3, 8, CHAR_HEIGHT * (MAP_TOP_OFFSET + 20));
|
||||
}
|
||||
|
||||
if(!crc_check) {
|
||||
errors++;
|
||||
snd_mod_button();
|
||||
draw_number(errors, 3, 8, CHAR_HEIGHT * (MAP_TOP_OFFSET + 20));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dii_power_off(DEFAULT_DRIVE_CONTROLLER_OFFSET);
|
||||
}
|
||||
|
||||
dii_power_off(DEFAULT_DRIVE_CONTROLLER_OFFSET);
|
||||
|
||||
if(errors) snd_sad_scale();
|
||||
else snd_festive();
|
||||
|
||||
str_len = convert_string(str_conv_buffer, SCREEN_CHAR_WIDTH, "PRESS ANY KEY TO RESTART");
|
||||
draw_chars(0, CHAR_HEIGHT * (MAP_TOP_OFFSET + 21), 1, str_conv_buffer, str_len);
|
||||
|
||||
while(!read_any_key());
|
||||
snd_mod_button();
|
||||
}
|
||||
|
||||
|
||||
__enable_interrupts();
|
||||
|
||||
if(errors) snd_sad_scale();
|
||||
else snd_festive();
|
||||
|
||||
while(1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue