Так - народ! я уже часть оффтопа и флуда - снес в соотв ветку. Давайте холиварить не тут!
В конце концов - демо пишут как раз вопреки...
Может и этот проект таки до релиза дойдет...
Так - народ! я уже часть оффтопа и флуда - снес в соотв ветку. Давайте холиварить не тут!
В конце концов - демо пишут как раз вопреки...
Может и этот проект таки до релиза дойдет...
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
Специалист (пока готовлюсь к восстановлению).
Это все мое!
Родное!
Все люблю на свете я! Это родина моя!
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
Не уверен, что обращение к еепром будет быстрее чем к флеш. Так что придется все-равно налету делать или что-то изобретать, временный файл здесь мне видится наиболее подходящим вариантом с подгрузкой нужной части 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.
Было бы более полезно, если бы вы открыли свои тогдашние наработки, а не вынуждали людей изобретать трехколесные велосипеды, приговаривая "у вас всё неправильно, а я знаю как делать, но вам не скажу".
Понятное дело, деньги всем нужны - но вы или умные, или красивые, либо вы честно барыжите закрытым продуктом - либо открываете его для всех желающих, без вот этой вот клоунады.
Со всем уважением к вашим бесспорным заслугам.
Насчет кодирования данных, сейчас я себе это вижу так.
Есть буфер на 256 байт, загружаем в него 256 байт сектора.
После того как индекс ушел за середину буфера, подгружаем в его начало следующие 128 байт.
Когда индекс перескочил в первую половину, подгружаем следующие 128 байт.
После того как индекс стал = 0 переключаемся на другой буфер, где находится CRC и закодированные пробелы и синхробайты в формате БАЙТ,КОЛИЧЕСТВО.
Как-то так.
Не помешает сделать еще один буфер на 256 для второй стороны, но не знаю, на сколько это необходимо.
И так, XOR не дает правильный сигнал, импульсы идут как по фронту, так и по спаду.
Получил корректный MFM с помощью инвертора и RC цепочки.
Вот, снял на лог анализаторе, на картинке, верхний - выход с МК, нижний - MFM
Для получения такого сигнала, инвертировал выходной сигнал, передал его через конденсатор 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.
так и должно, на запись идет манчестероподобный сигнал, который меняет полярность магнитного поля головки дисковода, а при чтении, магнитная головка вырабатывает импульс в момент смены полярности на диске
- - - Добавлено - - -
хотя про запись точно не помню, в дисководе триггер стоит который по сигналу меняет полярность или от контроллера дисковода идет сигнал в управляющий полярностью, но это пока не важно
- - - Добавлено - - -
тут поидее в ISR будет регистры портить, для расчета адреса
- - - Добавлено - - -
вот отличнейшая статья чтение/запись на дисководы
Поправил регистры, пришлось дизассемблировать, чтобы понять что там и как
Вот код ISR в таком виде, как выше.
Итого имеем вроде как 50 циклов в худшем случае. 50*62.5 = 3.1мкс, байт у нас отправляется за 16мкс (байт данных за 32мкс), остается ~13мкс (~26мкс на байт) на основной код. Итого, нагрузка ISR составляет не более 9%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
Правда надо еще учитывать, что ардуина использует свой жуткий таймерный код, хотя там всего-то идет увеличение переменной типа long на единицу каждую мкс, для работы функций delay_ms и delay_us, так что, думаю общая нагрузка периодических прерываний не должна превышать 20%
Насчет сигнала, я же снимал анализатором с реального дисковода и он там был именно таким как сейчас генерируется через RC.
Последний раз редактировалось EvgenRU; 26.03.2016 в 19:23.
по всей видимости ты формируешь не смену сигнала а фронты, RC + инвертор ты их просто подрезаешь, ну такой вариант тоже можно, просто эти импульсы что шли с дисковода это момент смены сигнала
- - - Добавлено - - -
вот картинка
1. строка MFM сигнал (на байт 16 возможных изменений сигнала)
2. то что выдает дисковод
Итого что бы в 2х байтах SPI выдать нужно количество импульсов, надо слать или 32 бита и укорачивать фронт или выдавать импульс по изменению сигнала и тогда хватит 16 бит
- - - Добавлено - - -
ну или как вариант, подмешивать сигнал синхронизации SPI по логическому И тогда бит 1 это импульс, 0 пропуск
- - - Добавлено - - -
байт 0xFF в mfm будет 16 импульсов, для формирования 16 импульсов нужно 32бит либо 16 смен уровня
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)