Вот и в листинге дебага я не нашел проверки на КС. Эх.. опять затык.. Я уже подумывал, что не успеваю считать 512 байт с СДшки при Степе, но нет.. 56 байт после шага УКНЦ же считывает.
Я не мог перепутать: Dir=1 это от 0 дорожки к 79, а 0 от 79 до 0?
Хотя я пробовал и так и так..
Может это вам поможет?
Сделал трассу событий на контроллере дисковода при загрузке диска fodostm1.dsk до надписи
ФOДOC Ф B03.00
Диск можно взять тут: https://github.com/nzeemin/ukncbtl-t...1.dsk?raw=true
Чему соответствуют события можно посмотреть по исходнику тут (часть строк я раскомментировал чтобы получить подробную трассу): https://github.com/nzeemin/ukncbtl/b...ase/Floppy.cpp
- - - Updated - - -
Со стороны кода так -- шаг ближе к нулевой дорожке это 0:
Код:BIC #100,23204 ; Установить в УС перемещение от центра
Последний раз редактировалось nzeemin; 06.04.2020 в 21:43.
Друзья, хочу поделиться своей большой радостью:
https://ibb.co/7QWMbPL
https://ibb.co/C5hg4Nv
Что на фото - эмулятор КГМД с дисководом на флешке.
Собран на 2-х 580ва87, 1-й 155ла3,ПЗУ 27с512 и STM32 (по сути любой у которой есть 16 свободных пинов на 1 порту толерантных к 5В, у меня это STM32L476)
Если заменить 580ва87 на преобразователи уровней, подойдет даже блюпил. ПЗУ работает как дешифратор адреса, там 2 байта используются, остальные FF.
ПЗУ можно заменить в случае ва87 2 155ла2 и 1 155лн1, если без инверсии то 155лн надо будет 2 штуки.
Что работает на данный момент, только чтение из 1 подключенного образа имя которого прошито в код СТМкиВот только-только заработало.
Пока так.
Последний раз редактировалось Arseny; 29.07.2020 в 18:41. Причина: тема разбита
Это был образ диска с бейсиком и он запускается автоматически.
Да, зачем эмулировать, то что не нужно? Единственное, я ни как не мог заставить работать Petit FatFs с хардверным SPI, пришлось софтовый использовать, боюсь, что скорость пока не на уровне.
Есть еще много вопросов, например, я начинаю грузить данные с флешки когда УКНЦ добралось до маркера данных.. почему-то только в этот момент УКНЦ согласна подождать.
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.
У меня по скоростям расклад такой: чтение от 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.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)