From abe1c60261441c83417a1bc5cde2da58426b32e4 Mon Sep 17 00:00:00 2001 From: hkz Date: Mon, 1 Sep 2025 21:45:04 +0200 Subject: [PATCH] Do not headbang at every restart of writing --- linker-files/linker.scm | 4 +- src/main.c | 188 ++++++++++++++++++++++------------------ 2 files changed, 108 insertions(+), 84 deletions(-) diff --git a/linker-files/linker.scm b/linker-files/linker.scm index 98c05d0..486d582 100644 --- a/linker-files/linker.scm +++ b/linker-files/linker.scm @@ -3,9 +3,9 @@ (section registers zpage zzpage)) (memory firstPage (address (#x100 . #x1ff)) (section stack)) (memory reserved (address (#x200 . #x7ff)) (type ram)) - (memory program (address (#x800 . #x188f)) (type ram) + (memory program (address (#x800 . #x199f)) (type ram) (section (programStart #x800) (dii_critical_wr_code #x803) (dii_critical_rd_code #x90b) startup code switch idata cdata data_init_table)) - (memory dataMem (address (#x1890 . #x1fff)) (type ram) (section cstack zdata data heap zpsave)) + (memory dataMem (address (#x19a0 . #x1fff)) (type ram) (section cstack zdata data heap zpsave)) (memory displayPage1 (address (#x2000 . #x3fff)) (type ram)) (memory upperMem (address (#x4000 . #xbbff)) (type ram)) (memory diskBuffer (address (#xbc00 . #xbeff)) (type ram)) ;;; This memory will be used by the disk II routines as buffer diff --git a/src/main.c b/src/main.c index bd462eb..f94b5e1 100644 --- a/src/main.c +++ b/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; }