Важная информация

User Tag List

Страница 9 из 54 ПерваяПервая ... 5678910111213 ... ПоследняяПоследняя
Показано с 81 по 90 из 538

Тема: Планирую сделать FDD эмулятор на Atmega8

  1. #81

    Регистрация
    25.11.2007
    Адрес
    Симферополь
    Сообщений
    2,164
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Так - народ! я уже часть оффтопа и флуда - снес в соотв ветку. Давайте холиварить не тут!
    В конце концов - демо пишут как раз вопреки...
    Может и этот проект таки до релиза дойдет...
    Amiga 1200+Blizzard 1260 72 Mb+Mtek 68030,Compozit 128, Leningrad 2,
    Atari STE 1040,ZX Spectrum +2,Pentagon 48, Speccy2007 - 2 , ATAS 256k.
    ZX Evo 4Mb- в строю.
    Speccy2010 v1
    Специалист (пока готовлюсь к восстановлению).
    Это все мое!
    Родное!
    Все люблю на свете я! Это родина моя!

  2. #82

    Регистрация
    19.06.2014
    Адрес
    г. Харьков, Украина
    Сообщений
    731
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    15 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от EvgenRU Посмотреть сообщение
    но все не войдут в память при монтировании, получается 2.5кб данных.
    есть еще кило eeprom

  3. #83

    Регистрация
    29.03.2005
    Адрес
    Ярославль
    Сообщений
    1,102
    Спасибо Благодарностей отдано 
    14
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    del
    Последний раз редактировалось dosikus; 25.03.2016 в 08:20.
    ZXM-Phoenix 1024+PROF ROM+SMUC+VGA
    Profi 1024+CF+CPM+VGA
    ATARI 800XL+SIO2PC+SIO2SD
    RK86@Maximite

  4. #84

    Регистрация
    20.01.2016
    Адрес
    п. Власиха, Московская обл.
    Сообщений
    594
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    41
    Поблагодарили
    22 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от s_kosorev Посмотреть сообщение
    есть еще кило eeprom
    Не уверен, что обращение к еепром будет быстрее чем к флеш. Так что придется все-равно налету делать или что-то изобретать, временный файл здесь мне видится наиболее подходящим вариантом с подгрузкой нужной части CRC при переходе с дорожки на дорожку.

    PS: последний раз про STM, если вам нужно на STM то вот здесь http://zx-pk.ru/showthread.php?t=126...l=1#post825463 есть всё готовое, отправляйтесь туда

    Ну и шутка дня: Core-i7, LPT порт, 32GB, 8TB HDD покроют всю возможную нехватку ресурсов атмеги и программировать будет удобнее :-D
    Последний раз редактировалось EvgenRU; 25.03.2016 в 10:41.

  5. #85

    Регистрация
    18.06.2011
    Адрес
    г. Самара
    Сообщений
    109
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от tnt23 Посмотреть сообщение
    Я не проповедник ARM, и лезу не в каждую ветку, а конкретно думал, что мой опыт реализации эмулятора дисковода на AVR кому-то может быть полезен.
    Было бы более полезно, если бы вы открыли свои тогдашние наработки, а не вынуждали людей изобретать трехколесные велосипеды, приговаривая "у вас всё неправильно, а я знаю как делать, но вам не скажу".
    Понятное дело, деньги всем нужны - но вы или умные, или красивые, либо вы честно барыжите закрытым продуктом - либо открываете его для всех желающих, без вот этой вот клоунады.

    Со всем уважением к вашим бесспорным заслугам.

  6. #86

    Регистрация
    20.01.2016
    Адрес
    п. Власиха, Московская обл.
    Сообщений
    594
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    41
    Поблагодарили
    22 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Насчет кодирования данных, сейчас я себе это вижу так.

    Есть буфер на 256 байт, загружаем в него 256 байт сектора.
    После того как индекс ушел за середину буфера, подгружаем в его начало следующие 128 байт.
    Когда индекс перескочил в первую половину, подгружаем следующие 128 байт.

    После того как индекс стал = 0 переключаемся на другой буфер, где находится CRC и закодированные пробелы и синхробайты в формате БАЙТ,КОЛИЧЕСТВО.

    Как-то так.

    Не помешает сделать еще один буфер на 256 для второй стороны, но не знаю, на сколько это необходимо.


    И так, XOR не дает правильный сигнал, импульсы идут как по фронту, так и по спаду.

    Получил корректный MFM с помощью инвертора и RC цепочки.
    Вот, снял на лог анализаторе, на картинке, верхний - выход с МК, нижний - MFM
    Нажмите на изображение для увеличения. 

Название:	mfm_rc24mhz.jpg 
Просмотров:	307 
Размер:	24.0 Кб 
ID:	56592

    Для получения такого сигнала, инвертировал выходной сигнал, передал его через конденсатор 2.2нФ, после чего притянул его к +5в через 1кОм

    PS: наверное можно обойтись и без инвертора, инвертировав таблицу и исправив операцию замены последнего бита

    PS2: поставил последнюю версию ардуины, в ней alignas работает.

    Вот в таком виде отлично работает без инвертора.
    Код:
    // ZX-Spectrum FDD Emulator
    //
    //#include <petit_fatfs.h>
    
    #define DRIVE_SEL	PC0		// DRIVE SELECT CONNECT DS0-DS3 using jumper	  (INPUT)
    #define MOTOR_ON	PC1		// MOTOR ON									                    (INPUT)
    #define WRT_DATA	PC2		// WRITE DATA									                  (INPUT)
    #define WRT_GATE	PC3		// WRITE GATE									                  (INPUT)
    #define DIR_SEL   PC4		// DIRECTION SELECT								              (INPUT)
    #define SIDE_SEL	PC5		// SIDE SELECT									                (INPUT)
    
    uint8_t sector_data[256] = // 1 сектор
    {
    0x62,0x6F,0x6F,0x74,0x20,0x20,0x20,0x20,0x42,0xB4,0x00,0xB4,0x00,0x23,0x00,0x01,
    0x46,0x55,0x4C,0x4C,0x20,0x54,0x48,0x52,0x42,0x6D,0x00,0x6D,0x00,0x01,0x03,0x03,
    0x66,0x74,0x31,0x20,0x20,0x20,0x20,0x20,0x43,0x40,0x9C,0x00,0x12,0x12,0x04,0x03,
    0x66,0x74,0x32,0x20,0x20,0x20,0x20,0x20,0x43,0xB4,0x5F,0x0A,0x6E,0x6F,0x06,0x04,
    0x52,0x41,0x49,0x4E,0x42,0x4F,0x57,0x2B,0x42,0x08,0x01,0x08,0x01,0x02,0x05,0x0B,
    0x52,0x41,0x49,0x4E,0x42,0x2E,0x2B,0x24,0x43,0x00,0x40,0x00,0x1B,0x1B,0x07,0x0B,
    0x52,0x41,0x49,0x4E,0x42,0x2E,0x2B,0x63,0x43,0xA8,0x61,0x58,0x9E,0x9F,0x02,0x0D,
    0x52,0x41,0x49,0x4E,0x42,0x2E,0x2B,0x73,0x43,0x00,0x40,0x08,0x07,0x08,0x01,0x17,
    0x52,0x41,0x49,0x31,0x20,0x20,0x20,0x20,0x43,0x98,0x00,0x57,0x1A,0x1B,0x09,0x17,
    0x52,0x41,0x49,0x32,0x20,0x20,0x20,0x20,0x43,0x98,0x00,0x1A,0x1B,0x1C,0x04,0x19,
    0x52,0x41,0x49,0x33,0x20,0x20,0x20,0x20,0x43,0x98,0x00,0x13,0x1D,0x1E,0x00,0x1B,
    0x52,0x41,0x49,0x34,0x20,0x20,0x20,0x20,0x43,0x98,0x00,0x26,0x1D,0x1E,0x0E,0x1C,
    0x52,0x41,0x49,0x35,0x20,0x20,0x20,0x20,0x43,0x98,0x00,0x92,0x1C,0x1D,0x0C,0x1E,
    0x52,0x41,0x49,0x36,0x20,0x20,0x20,0x20,0x43,0x98,0x00,0x08,0x1E,0x1F,0x09,0x20,
    0x52,0x41,0x49,0x37,0x20,0x20,0x20,0x20,0x43,0x98,0x00,0x10,0x1C,0x1D,0x08,0x22,
    0x52,0x41,0x49,0x38,0x20,0x20,0x20,0x20,0x43,0x98,0x00,0xE3,0x1F,0x20,0x05,0x24,
    };//
    
    register volatile uint8_t sector_byte asm("r19");
    register volatile uint8_t tmp asm("r20");
    
    register volatile uint8_t XH_Save asm("r9");
    register volatile uint8_t XL_Save asm("r10");
    register volatile uint8_t ZH_Save asm("r11");
    register volatile uint8_t ZL_Save asm("r12");
    register volatile uint8_t b_index asm("r13");
    register volatile uint8_t SREGSave asm("r14");
    
    uint8_t MFM_tab_h[32] =
    {
      0x55,0x54,0x52,0x52,0x49,0x48,0x4A,0x4A,0x25,0x24,0x22,0x22,0x29,0x28,0x2A,0x2A,0x95,0x94,0x92,0x92,0x89,0x88,0x8A,0x8A,0xA5,0xA4,0xA2,0xA2,0xA9,0xA8,0xAA,0xAA
    };
    uint8_t MFM_tab_l[16] = //PROGMEM =
    {
      0x55,0x52,0x49,0x4A,0x25,0x22,0x29,0x2A,0x95,0x92,0x89,0x8A,0xA5,0xA2,0xA9,0xAA
    };
    
    
    ISR(USART_UDRE_vect, ISR_NAKED)
    {
      asm ("in r14,0x3F");    // save SREG
      asm ("mov r9,r24");    // save XH
      asm ("mov r10,r25");    // save XL
      asm ("mov r11,r30");    // save ZH
      asm ("mov r12,r31");    // save ZL
      if(!tmp) // it is ok, as MFM_tab doesn't have zero values
      { // Send first MFM byte    
        
        asm(
          "mov r20,r19\n" //tmp = sector_byte;
          "lsr r20\n"     //tmp >>= 3; -------------
          "lsr r20\n"
          "lsr r20" // -----------------------
        );
        tmp = MFM_tab_h[tmp]; // get first MFM byte from table
        
        UDR0 = ~tmp;  // put byte to send buffer
        tmp = sector_byte;
        tmp &= 0x0f;
        tmp = MFM_tab_l[tmp]; // get second MFM byte from table to "tmp"
      }
      else
      { // Send second MFM byte
        sector_byte = sector_data[b_index];   // pre-get new byte from buffer
        //if((tmp & 0x02) || (sector_byte & 0x80)) tmp &= 0xFE; else tmp |= 0x1; // change the last bit
        if(sector_byte & 0x80) tmp &= 0xFE; // ДАННЫЙ КОД ОПТИМАЛЬНЕЕ ПРЕДЫДУЩЕЙ СТРОКИ :-D
    
        UDR0 = ~tmp;  // put byte to send buffer
        tmp=0;
        b_index++;
      }
    
      asm ("mov r31,r12");    // restore ZL
      asm ("mov r30,r11");    // restore ZH
      asm ("mov r25,r10");    // restore XL
      asm ("mov r24,r9");    // restore XH
      asm ("out 0x3F,r14");	      // restore SREG
      reti();
    }
    
    int main() {
      // init();
    
      // Setup USART in MasterSPI mode 500000bps
      cli();
      //DDRD |= (1 << DDD4);
      UBRR0H = 0x00;
      UBRR0L = 0x0F;
      UCSR0C = 0xC0;
      UCSR0A = 0x00;
      UCSR0B = 0x28;
      tmp=0;
      
      b_index = 0;
      sector_byte=sector_data[b_index++];  
      
      sei();
    
      while(1)
      {
        // main loop
      }
    }
    Последний раз редактировалось EvgenRU; 26.03.2016 в 23:13.

  7. #87

    Регистрация
    28.03.2006
    Адрес
    Санкт-Петербург
    Сообщений
    2,777
    Спасибо Благодарностей отдано 
    555
    Спасибо Благодарностей получено 
    200
    Поблагодарили
    138 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от trader2k4 Посмотреть сообщение
    Было бы более полезно, если бы вы открыли свои тогдашние наработки, а не вынуждали людей изобретать трехколесные велосипеды, приговаривая "у вас всё неправильно, а я знаю как делать, но вам не скажу".
    Понятное дело, деньги всем нужны - но вы или умные, или красивые, либо вы честно барыжите закрытым продуктом - либо открываете его для всех желающих, без вот этой вот клоунады.

    Со всем уважением к вашим бесспорным заслугам.
    Фигассе наезд. Идите в удалено модератором
    Последний раз редактировалось balu_dark; 26.03.2016 в 18:03.

  8. #88

    Регистрация
    19.06.2014
    Адрес
    г. Харьков, Украина
    Сообщений
    731
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    15 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от EvgenRU Посмотреть сообщение
    И так, XOR не дает правильный сигнал, импульсы идут как по фронту, так и по спаду.
    так и должно, на запись идет манчестероподобный сигнал, который меняет полярность магнитного поля головки дисковода, а при чтении, магнитная головка вырабатывает импульс в момент смены полярности на диске

    - - - Добавлено - - -

    хотя про запись точно не помню, в дисководе триггер стоит который по сигналу меняет полярность или от контроллера дисковода идет сигнал в управляющий полярностью, но это пока не важно

    - - - Добавлено - - -

    Цитата Сообщение от EvgenRU Посмотреть сообщение
    tmp = MFM_tab_h[tmp];
    тут поидее в ISR будет регистры портить, для расчета адреса

    - - - Добавлено - - -

    вот отличнейшая статья чтение/запись на дисководы

  9. #89

    Регистрация
    20.01.2016
    Адрес
    п. Власиха, Московская обл.
    Сообщений
    594
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    41
    Поблагодарили
    22 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от s_kosorev Посмотреть сообщение
    так и должно, на запись идет манчестероподобный сигнал, который меняет полярность магнитного поля головки дисковода, а при чтении, магнитная головка вырабатывает импульс в момент смены полярности на диске

    хотя про запись точно не помню, в дисководе триггер стоит который по сигналу меняет полярность или от контроллера дисковода идет сигнал в управляющий полярностью, но это пока не важно

    тут поидее в ISR будет регистры портить, для расчета адреса

    вот отличнейшая статья чтение/запись на дисководы
    Поправил регистры, пришлось дизассемблировать, чтобы понять что там и как
    Вот код ISR в таком виде, как выше.
    L0053:
    ; 4 (ICALL)+2 (RJMP) + 1 = 7 циклов перед входом в прерывание
    ; вход в прерывание (7-8 циклов) ---------------------------------
    in r14,SREG
    mov r9,r24
    mov r10,r25
    mov r11,r30
    mov r12,r31
    cpse r19,r1
    rjmp L006F
    ;-----------------------------------------------------------------------
    ;
    ; // отправка первого байта (26 циклов) ---------------------------
    mov r20,r18
    lsr r20
    lsr r20
    lsr r20
    mov r30,r20
    ldi r31,0x00
    subi r30,0xE0
    sbci r31,0xFE
    ld r30,Z
    mov r20,r30
    mov r24,r30
    com r24
    sts D00C6,r24
    mov r20,r18
    andi r20,0x0F
    ldi r31,0x00
    subi r30,0x00
    sbci r31,0xFF
    ld r19,Z
    rjmp L0080
    ; ----------------------------------------------------------------------
    L006F:
    ; // отправка второго байта (20 циклов макс) ---------------------
    mov r30,r13
    ldi r31,0x00
    subi r30,0x00
    sbci r31,0xFE
    ld r24,Z
    mov r18,r24

    sbrc r24,7
    rjmp L0087

    sbrc r19,1
    rjmp L0087

    rjmp L0089
    ; ----------------------------------------------------------------------
    L007A:
    mov r24,r19
    com r24
    sts D00C6,r24
    clr r19
    inc r13
    ; ----------------------------------------------------------------------
    L0080:
    ; выход из прерывания (9 циклов)
    mov r31,r12
    mov r30,r11
    mov r25,r10
    mov r24,r9
    out SREG,r14
    reti
    ; ----------------------------------------------------------------------
    L0087:
    andi r19,0xFE
    rjmp L007A
    ; ----------------------------------------------------------------------
    L0089:
    ori r19,0x01
    rjmp L007A
    Итого имеем вроде как 50 циклов в худшем случае. 50*62.5 = 3.1мкс, байт у нас отправляется за 16мкс (байт данных за 32мкс), остается ~13мкс (~26мкс на байт) на основной код. Итого, нагрузка ISR составляет не более 9%
    Правда надо еще учитывать, что ардуина использует свой жуткий таймерный код, хотя там всего-то идет увеличение переменной типа long на единицу каждую мкс, для работы функций delay_ms и delay_us, так что, думаю общая нагрузка периодических прерываний не должна превышать 20%

    Насчет сигнала, я же снимал анализатором с реального дисковода и он там был именно таким как сейчас генерируется через RC.
    Последний раз редактировалось EvgenRU; 26.03.2016 в 19:23.

  10. #90

    Регистрация
    19.06.2014
    Адрес
    г. Харьков, Украина
    Сообщений
    731
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    15 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от EvgenRU Посмотреть сообщение
    Насчет сигнала, я же снимал анализатором с реального дисковода и он там был именно таким как сейчас генерируется через RC.
    по всей видимости ты формируешь не смену сигнала а фронты, RC + инвертор ты их просто подрезаешь, ну такой вариант тоже можно, просто эти импульсы что шли с дисковода это момент смены сигнала

    - - - Добавлено - - -

    вот картинка
    1. строка MFM сигнал (на байт 16 возможных изменений сигнала)
    2. то что выдает дисковод

    Итого что бы в 2х байтах SPI выдать нужно количество импульсов, надо слать или 32 бита и укорачивать фронт или выдавать импульс по изменению сигнала и тогда хватит 16 бит

    - - - Добавлено - - -

    ну или как вариант, подмешивать сигнал синхронизации SPI по логическому И тогда бит 1 это импульс, 0 пропуск

    - - - Добавлено - - -

    байт 0xFF в mfm будет 16 импульсов, для формирования 16 импульсов нужно 32бит либо 16 смен уровня

Страница 9 из 54 ПерваяПервая ... 5678910111213 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 24
    Последнее: 08.12.2012, 19:00
  2. Тестер транзисторов на ATmega8
    от ILoveSpeccy в разделе Творчество
    Ответов: 10
    Последнее: 19.05.2011, 15:03
  3. Ответов: 0
    Последнее: 31.01.2007, 18:18

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •