С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
https://www.hermannseib.com/documents/floppy.pdf
То есть, при переходе между дорожками у вас есть от 3+15 до 8+25 мс для: декодирования и сохранения трека в образ, плюс чтения соседнего трека из образа и подготовки его в памяти.The step rate is the time between two steps when the head moves over the disk. The traditional value for PC drives is 8 ms. 51⁄4 HD drives usually work with 6 ms, and 31⁄2 drives are usually used with 3 ms.
...
After the head changes between tracks it must be given the head settle time before any further action. Older drives needed 25 ms, newer ones often only need 15 ms for head vibrations to disappear.
Конкретно для НГМД-6022: https://drive.google.com/file/d/1Xb7..._9-K7izwE/view
2.8. Время перемещения головок на соседнюю дорожку - не более 12 мс.
2.9. Время опускания головки - не более 50 мс.
Последний раз редактировалось nzeemin; 13.04.2020 в 09:23.
Ух ты! Круто! Для УКНЦ это КМД, да? Т.е. 1801ВП1-128 на шине ПП ?
Да, кстати, можно попробовать поставить в качестве драйверов 74LVS245, они 3-вольтовые, но толерантные к 5В, всякие согласователи у китайцев, по типу "прицепить SD-карточку к Ардуине (5В)" сделаны, обычно, на 74LVS.
А вообще, нашего полку прибыло! Не я один сочиняю псевдодиски для ДВК/УКНЦ. Ура!
У L476, по-идее, на борту должен быть аппаратный SDIO, почему бы не сделать через него? Хоть сразу 4-битный. Я, кстати, пользую в AZ полную FATFS, не петит, причем, по-простому собрал из кубиков (STM32 CubeMX). Оно, конечно, кушает оперативку, так, что в пилюлю не влезет...
На тему "подождать". Не знаю, как это сделано в УКНЦ, но я когда-то разбирал программу MY - не помню, кажется, 091 или 093, поглядывая заодно в те материалы по 128-му или его предшественнику (уже и номер забыл), которые удалось найти и в книжку по MY, я почти во всем разобрался, и помнится мне, что в процессе просмотра дорожки в некоторых случаях ждут просто заданное время, где-то - бита в регистре, причем "до упора", а где-то бита в регистре с таймаутом. ИМХО, там, где ждут бита в регистре, можно и "притормозить". В общем, советую запастись всеми материалами по 128-мы, взять дизасм программы обслуживания дисководов и поразбирать внимательно. Кстати, nzeemin давал ссылку на его реализацию эмулятора ВП1-128.
И еще, как мне кажется, нужен аппаратный регистр состояния, а может и регистр данных. Чтобы можно было заняться своими делами, а аппаратный регистр состояния будет сигналить программе в ПП "мы еще не готовы". Нечто, вроде состояния "Думаю, прошу не мешать" в моём AZ.
Последний раз редактировалось AFZ; 13.04.2020 в 19:11.
Кто мешает тебе выдумать порох непромокаемый? (К.Прутков, мысль № 133)
У меня по скоростям расклад такой: чтение от 0 байта до метки A1 A1 A1 FB со скоростью около 350 килобит, в момент метки A1 A1 A1 FB , те время чтения самой этой метки 0.03 секунды или 30 миллисекунды (из-за того что в этом месте я читаю данные дорожки из файла на СД-карте, те 5168 байт читаются за 30 миллисекунды), после этого все последующие данные читаются со скоростью 350 килобит. Переход между дорогами не занимает ни чего, тк я не генерирую буфер дорожки, а просто отвечаю данными в зависимости от номера считанного байта:
Скрытый текст
/----------------------------------------
//uint8_t fast_datatrack(void *data,void *pos, void *isSync);
//----------------------------------------
.section .text.fast_datatrack
.global fast_datatrack
.type fast_datatrack, %function
fast_datatrack:
push {r3-r9,lr}
ldrh r8,=VAR_ADM
ldrh r5,=SEC_LEN
ldrh r6,[r1] //pos
udiv r4,r6,r5 //number sector
mls r6,r4,r5,r6 //position in sector
//Sync?
ldrb r7,[r2]
tst r7,#1
beq fast_datatrack_loop
bic r7,#1
strb r7,[r2]
//pos=<marker0
cmp r6,MARKER0_POS
itt ls
ldrbls r6,=MARKER0_POS
bls fast_datatrack_loop
//marker0<pos=<marker1
cmp r6,MARKER1_POS
it ls
ldrbls r6,=MARKER1_POS
bls fast_datatrack_loop
//pos>marker1 to next sector marker 1
add r4,#1
cmp r4,#10
it hs
andhs r4,#0
ldrb r6,=MARKER0_POS
fast_datatrack_loop:
//GAP0
cmp r6,#SYNC0_POS
itttt lo
ldrblo r0,=0x4E
//set index bit
ldrhlo r3,[r8,#RSN_RDM]
orrlo r3,#0x8000
strhlo r3,[r8,#RSN_RDM]
blo fast_datatrack_end
////reset index bit
ldrh r3,[r8,#RSN_RDM]
bic r3,#0x8000
strh r3,[r8,#RSN_RDM]
//SYNC0
cmp r6,#MARKER0_POS
it lo
ldrblo r0,=0x00
blo fast_datatrack_end
//MARKER0
cmp r6,#FE_POS
itttt lo
ldrblo r0,=0xA1
//reset CRC bit
ldrhlo r3,[r8,#RSN_RDM]
biclo r3,#0x4000
strhlo r3,[r8,#RSN_RDM]
blo fast_datatrack_end
//FE
cmp r6,#CYL_POS
it lo
ldrblo r0,=0xFE
blo fast_datatrack_end
//CYL
cmp r6,#SIDE_POS
it lo
ldrblo r0,[r0,SZ_TRACK] //track no
blo fast_datatrack_end
//SIDE
cmp r6,#SEC_POS
it lo
ldrblo r0,[r0] //Side no #0
blo fast_datatrack_end
//Sector
cmp r6,#SECSZ_POS
it lo
//andlo r5,#0
addlo r0,r4,#1 //Sector match in r4
blo fast_datatrack_end
//Sector size
cmp r6,#CRC0_POS
itttt lo
//andlo r0,#0
//addlo r0,#2 //Sector size
ldrhlo r0,=2
//set CRC bit
ldrhlo r3,[r8,#RSN_RDM]
orrlo r3,#0x4000
strhlo r3,[r8,#RSN_RDM]
blo fast_datatrack_end
//CRC header
cmp r6,#GAP1_POS
it lo
ldrhlo r0,=12
//andlo r0,#0
//set CRC bit
/*ldrhlo r3,[r8,#RSN_RDM]
orrlo r3,#0x4000
strhlo r3,[r8,#RSN_RDM]*/
blo fast_datatrack_end
//GAP1
cmp r6,#SYNC1_POS
it lo
ldrblo r0,=0x4E
blo fast_datatrack_end
//SYNC1
cmp r6,#MARKER1_POS
it lo
ldrblo r0,=0x00
blo fast_datatrack_end
//MARKER1
cmp r6,#FB_POS
itttt lo
andlo r5,#0 //It's sey: load data
addlo r5,#0x02
strblo r5,[r2]
ldrblo r0,=0xA1
//reset CRC bit
ittt lo
ldrhlo r3,[r8,#RSN_RDM]
biclo r3,#0x4000
strhlo r3,[r8,#RSN_RDM]
blo fast_datatrack_end
//FB
cmp r6,#DATA_POS
it lo
ldrblo r0,=0xFB
blo fast_datatrack_end
//set CRC bit
ldrh r3,[r8,#RSN_RDM]
orr r3,#0x4000
strh r3,[r8,#RSN_RDM]
//DATA
cmp r6,#CRC1_POS
itttt lo
addlo r0,#SZ_TBUFF //set addr currenttrack
sublo r9,r6,#DATA_POS //pos_in_data=pos-data_pos
addlo r7, r9, r4, lsl #9 //sec*len_sect+(pos_in_data)
ldrblo r0,[r0,r7]
blo fast_datatrack_end
//CRC data
ldrh r7,=GAP2_POS
cmp r6,r7
it lo
ldrhlo r0,=18
//andlo r0,#0
/*//set CRC bit
ldrhlo r3,[r8,#RSN_RDM]
orrlo r3,#0x4000
strhlo r3,[r8,#RSN_RDM]*/
blo fast_datatrack_end
ldrb r0,=0x4E
fast_datatrack_end:
//set data ok bit
ldrh r3,[r8,#RSN_RDM]
orr r3,#0x80
strh r3,[r8,#RSN_RDM]
//NEXTPOS
ldr r5,=SEC_LEN
//add r9, r6, r4, lsl #9 //sec*len_sect+(pos)//sec<<9+pos
mla r9,r4,r5,r6 //sec*len_sec+pos_sec
add r9,#1
ldrh r3,=FLOPPY_RAWTRACKSIZE
cmp r9,r3
it hs
andhs r9,#0
strh r9,[r1]
pop {r3-r9,lr}
bx lr
[свернуть]
Судя по даташиту:
Скрытый текст
8 (GOR) – приведение контроллера в исходное состояние. При записи в этот бит "1" контроллер приводится в исходное состояние. При этом из регистров 177130 и 177132 считываются нули.
[свернуть]
Таким образом, если ответить 0, то УКНЦ думает, что контроллер ищет маркер.. а я , как подлец, этим пользуюсь![]()
Последний раз редактировалось ZPilot; 13.04.2020 в 12:47.
Так вы замедляете чтение с диска: тогда, когда машина уже готова вовсю читать, вы искуственно задерживаете её на эти 30 мс.
В работе с диском есть куча времени когда можно работать с картой без задержек: раскрутка мотора, переход между дорожками - в это время машина всё равно будет ждать контроллер, не требуя с него данных.
По идее 1 раз на трек.
Вот можно по точнее этот момент? Как должен ответить контроллер: Подожди, я занят? Плюс, как выяснилось, читать с СД-карты в момент перехода между дорогами - очень плохая идея! Почему, да потому что после чтения 0 сектора укнц посылает команды на перемещения головы не читая потом трек, просто добирается до нужной дорожки. Во-первых, читаем в этот момент напрасно, а во-вторых, укнц шагает так быстро, что просто начинается пропуск команд.
Раскрутка мотора тоже не подходит, тк нельзя считать весь образ целиком, нет столько памяти.
А еще.. у меня не запустился ваш диск с ФОДОСОМСчитал заголовок, написал, что стартует Фодос, но вывалился с какой-то ошибкой. Кстати, в эмуляторе тоже.
Алекс, я загрузил бейсик, вышел в "дос" но там нет такого файла, не подскажите, где его взять?
Последний раз редактировалось ZPilot; 13.04.2020 в 13:30.
Набросал схемку: https://ibb.co/YpN0cdq
Сильно не ругайтесь, делал по памяти, мог что-то упустить не особо важное.
Да, DMR, DMG и SACK не используются.
Так выглядит макетка без Нуклии: https://ibb.co/k69qnkM
Последний раз редактировалось ZPilot; 13.04.2020 в 18:38.
https://ibb.co/87Cw2rF
- - - Добавлено - - -
Вот как перейти на MZ1?
hobot(15.04.2020)
ZPilot(14.04.2020)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)