Do not headbang at every restart of writing

This commit is contained in:
hkz 2025-09-01 21:45:04 +02:00
commit abe1c60261
2 changed files with 108 additions and 84 deletions

View file

@ -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

View file

@ -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;
}