PDA

Просмотр полной версии : Контроллер псевдо КМД+дисковод для УКНЦ (на SD карте)



Страницы : [1] 2

ZPilot
29.03.2020, 12:25
Вообще конечно, жизнь странная штука, я немного понимаю как физически работает УКНЦ, но понятия не имею, как из режима отладки например записать в порт 177130, а мне надо.. Очень!

hobot
29.03.2020, 12:45
177130

а мне надо.. Очень!
из отладки ПП получиться,
идём так > клавиша УСТ в меню установок жмём УПР+@ , затем 177130 и клавишу "стрелка вправо", там должно быть что-то, но если не
открывается ячейка тогда беда !!!! Пишем значение и вверх или вниз или "ввод" запишет его туда, в случае стрелок перещаемся по чётным ячейкам вверх вниз

ZPilot
30.03.2020, 20:22
из отладки ПП получиться,
У меня вывелось 177130/000000 Но при попытке записать, например, 1 просто перешло по адресу: 000001/000207.
Разобрался, Enter не работает, только вверх или вниз.
Спасибо!

ZPilot
05.04.2020, 14:15
Уважаемые коллеги, друзья. Хочу опять попросить у вас помощи.
Получилось мне сделать вот такое: https://ibb.co/4K7sjWK
Но дальше полный ступор, вижу, что при выборе дисковода УКНЦ отправляет в порт 177130 команду 2023, те включить мотор и выбор накопителя, почему-то отправляет ее 2 раза и обращается к 177132.
я на команду отвечаю первым словом с 0 сектора 0x4E4E, а статус ставлю о140201. Все это крутится по кругу (нулевой сектор) до бесконечности, не перемещая головки или не выбирая сторону.

nzeemin
05.04.2020, 14:38
Уважаемые коллеги, друзья. Хочу опять попросить у вас помощи.
Получилось мне сделать вот такое: https://ibb.co/4K7sjWK
Но дальше полный ступор, вижу, что при выборе дисковода УКНЦ отправляет в порт 177130 команду 2023, те включить мотор и выбор накопителя, почему-то отправляет ее 2 раза и обращается к 177132.
я на команду отвечаю первым словом с 0 сектора 0x4E4E, а статус ставлю о140201. Все это крутится по кругу (нулевой сектор) до бесконечности, не перемещая головки или не выбирая сторону.

Если я правильно понял, то вы вручную (на микроконтроллере) эмулируете дисковод? Но тогда нужно эмулировать и структуру дорожки, и маркеры.
https://github.com/nzeemin/ukncbtl/blob/master/emubase/Floppy.cpp -- см. тут EncodeTrackData().

http://www.emuverse.ru/wiki/%D0%A3%D0%9A%D0%9D%D0%A6_%D0%A3%D1%81%D1%82%D1%80% D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE_%D0%9A%D0%9C%D 0%94_%D0%A3%D0%9A
https://github.com/nzeemin/ukncbtl-doc/wiki/Floppy-ru

ZPilot
05.04.2020, 15:13
Если я правильно понял, то вы вручную (на микроконтроллере) эмулируете дисковод? Но тогда нужно эмулировать и структуру дорожки, и маркеры.
Да, вы правы, я взял за основу код для формирования полного трека из Вашего эмулятора.
Честно говоря, я вообще по началу переделал ваш эмулятор флопа на СИ и попытался использовать его, но эмулятор и реальная железка все-таки разные вещи. Например, CFCGetData() вызывается в момент обращения УКНЦ к порту, но у меня есть только флаги, что УКНЦ забрал или положил в ячейку: статус/команду, данные. Если попытаться использовать в прерывании даже CFCGetData, то не попадешь в тайминги.
nzeemin, если не трудно, подскажите суть обмена УКНЦ с контроллером: Например, УКНЦ дает команду, читает статус, читает/пишет данные.. или команда, статус, данные, статус, данны и тд
А еще, первые шаги, что должен писать и что должен получить в ответ. Я понимаю, что в статусе 6 бит, но что-то не пойму цепочку.. вдруг я что-то упускаю или пропускаю.
Спасибо!
Да и еще один момент, я пишу данные сразу как только сброшен бит TR или надо выжидать время характерное для реального дисковода?
И еще один.. маркеры.. поиск маркера это перейти на 0xA1A1A1?

nzeemin
05.04.2020, 15:34
ZPilot, по сигналам я не подскажу, спросите Alex_K - он мне всё очень подробно объяснял про дисковод когда я делал реализацию записи на диск в эмуляторе.
Маркер это не про поиск нужных байт. Это про поиск "неправильного" перехода в кодировании MFM. То есть в самом кодировании сигнала "зашиваются" метки.
Посмотрите вот тут: https://en.wikipedia.org/wiki/Modified_frequency_modulation - см. термин Sync Mark.

ZPilot
05.04.2020, 16:50
Это про поиск "неправильного" перехода в кодировании MFM
Этот переход мне весь мозг сделал когда я писал свой эмулятор флопа, я все ни как не мог понять, как это так, ведь сдвоенного нулевого интервала в MFM кодировании не бывает, оказывается бывает!
Но я имел в виду немного другое, технически, для УКНЦ это что? Подал команду на поиск и получил в РД 0xA1A1?
У меня еще один вопрос, бит 14 статуса (CRC) выставляется когда? после того как считан заголовок трека/данных или сразу же, а снимается только тогда когда обнаружена ошибка CRC?
Мне кажется, что он снят от начала трека до момента когда контроллер считает CRC с диска, и только тогда устанавливает 14 бит. Снимает его еще раз при нахождении 0xA1A1 перед блоком данных и ставит опять, после того, как считал данные и сам CRC с диска. Так?

Меня смущает вот это место: Если за это время регистр не был прочитан, то контроллер сравнивает рассчитанную при чтении CRC прочитанных данных со значением непрочитанного слова. При совпадении устанавливается бит CRC в РС 177130.

nzeemin
05.04.2020, 17:48
Но я имел в виду немного другое, технически, для УКНЦ это что? Подал команду на поиск и получил в РД 0xA1A1?

Вот код из обработчика канала 2 УКНЦ -- http://www.emuverse.ru/wiki/%D0%A3%D0%9A%D0%9D%D0%A6_ROM_disasm_4


MOV #177130,R4 ; R4 = адрес РСУ накопителя
...
132740$:SOB R1,132730$
BIS #400,R3 ; Установить в УС бит поиска заголовка
MOV R3,@R4 ; Начать поиск
BIC #400,R3 ; Сбросить в УС бит поиска заголовка
MOV #226,R0 ; Время ожидания поиска
MOV R3,@R4
132762$:TSTB @R4 ; Маркер заголовка обнаружен ?
BMI 133034$ ; Да
SOB R0,132762$
BR 132630$ ; Заголовок сектора необнаружен
...
133034$:TST @R5 ; Сбросить готовность контроллера дисковода
133036$:TSTB @R4 ; Следующее слово прочитано ?
BPL 133036$ ; Нет
CMP #120776,@R5 ; Это адресный маркер заголовка сектора?
BEQ 133212$ ; Да

То есть получается что после того как словили маркер ожидаем что следующее прочитанное слово это 0xA1FE из заголовка сектора.
Если заголовок сектора уже прочитали то логично ожидать сразу после маркера слово 0xA1FB как признак начала данных.


CALL 134132$ ; Поиск пропуска синхроимпульсов
BEQ 133476$ ; Не найдено
133370$:TSTB @R4 ; Очередное слово сформировано ?
BPL 133370$ ; Нет
CMP #120773,@R5 ; Это маркер данных ?


- - - Updated - - -



У меня еще один вопрос, бит 14 статуса (CRC) выставляется когда? после того как считан заголовок трека/данных или сразу же, а снимается только тогда когда обнаружена ошибка CRC?
Мне кажется, что он снят от начала трека до момента когда контроллер считает CRC с диска, и только тогда устанавливает 14 бит. Снимает его еще раз при нахождении 0xA1A1 перед блоком данных и ставит опять, после того, как считал данные и сам CRC с диска. Так?

По моему коду так: флаг CHECKSUMOK сбрасывается при чтении по команде поиска маркера, при записи по команде записи маркера.
Устанавливается при чтении после чтения и сравнения с контрольной CRC, при записи после записи CRC.

- - - Updated - - -

ZPilot, кстати, микросхема 1801ВП1-128 полностью отреверсена, по идее, все нюансы работы там - https://github.com/1801BM1/k1801/tree/master/128

ZPilot
05.04.2020, 17:51
после того как словили маркер ожидаем что следующее прочитанное слово это 0xA1FE
Вся проблема в том, окажется ли маркер 0xA1A1 в регистре данных, как вообще УКНЦ понимает, что маркер пойман, тут: TSTB @R4? Тогда, что будет лежать в R4?

nzeemin
05.04.2020, 18:19
Вся проблема в том, окажется ли маркер 0xA1A1 в регистре данных, как вообще УКНЦ понимает, что маркер пойман, тут: TSTB @R4? Тогда, что будет лежать в R4?

Как я понимаю - драйвер выставляет дисководу команду "ищем маркер" (выставив бит 8 в 177130 -- SEARCHSYNC), дальше драйвер периодически смотрит 177130 бит 7 (MOREDATA) - если он выставлен то маркер найден, драйвер переходит к чтению слов.

- - - Updated - - -



А еще, первые шаги, что должен писать и что должен получить в ответ. Я понимаю, что в статусе 6 бит, но что-то не пойму цепочку.. вдруг я что-то упускаю или пропускаю.

Судя по дизасму ПЗУ, первые шаги это:
1. Включить мотор и подождать пока дискета раскрутится
2. Цикл - пока мы не на нулевой дорожке - команда ШАГ с ожиданием.
3. Чтение сектора

ZPilot
05.04.2020, 19:04
2. Цикл - пока мы не на нулевой дорожке - команда ШАГ с ожиданием.
Хорошая идея проверить, все ли у меня в порядке с получением/ответом.. а то кроме о2023 и о2423 я других команд не видел.


драйвер переходит к чтению слов
с 0xA1A1 или с 0xA1FE?

nzeemin
05.04.2020, 21:45
с 0xA1A1 или с 0xA1FE?

ZPilot, тут мои знания заканчиваются, к сожалению.
Теоретически, можно ещё раскомментировать трейсинг в коде эмулятора и получить трассу обращения к регистрам и что оттуда приходит - я так делал когда отлаживал работу с диском.

ZPilot
05.04.2020, 22:08
Теоретически, можно ещё раскомментировать трейсинг в коде эмулятора и получить трассу обращения к регистрам и что оттуда приходит - я так делал когда отлаживал работу с диском.
Спасибо огромное, помощь просто неоценимая. Хотя сейчас у меня постоянно меняются 2 команды о2023 и о2423. Почему УКНЦ постоянно включает поиск метки и что с этим делать - я не знаю, перепробовал уже все варианты. Может я просто не успеваю ответить вовремя.. может отвечаю не так как надо.. не знаю..

ZPilot
06.04.2020, 14:38
Народ, подскажите, вот эта надпись https://ibb.co/tm6c9wz означает, что нулевой трек был прочитан?

nzeemin
06.04.2020, 14:44
Народ, подскажите, вот эта надпись https://ibb.co/tm6c9wz означает, что нулевой трек был прочитан?

Мне думается что прочитан и запущен на исполнение бут-сектор, потому что ПЗУ УКНЦ не выдаёт сообщений в таком формате.
Как вариант ещё подсунь дискету без системы - должен увидеть "?BOOT-U-No boot on volume".

ZPilot
06.04.2020, 15:04
дискету без системы
А в вашем эмуляторе ее можно сделать?
Представляете, УКНЦ не читал нормально сектор, потому что мешал отладочный вывод в уарт. Запихнул вывод в уарт через дма и.. появилась эта надпись.
Пока не могу понять почему нет выбора поверхности.. из-за этого, при чтении диска, УКНЦ или подвисает, либо вываливается с ошибкой.
И треки шагают не до конца, а до 0х3Е.

nzeemin
06.04.2020, 15:06
А в вашем эмуляторе ее можно сделать?
Можно конечно. File > Create Disk, потом поставить в MZ1:, в MZ0: поставить загрузочный диск, загрузиться и сделать INIT MZ1:
Либо вот готовый незагрузочный диск - https://github.com/nzeemin/ukncbtl-testbench/blob/master/data/various.dsk?raw=true

ZPilot
06.04.2020, 15:18
"?BOOT-U-No boot on volume" - именно эту надпись и увидел когда использовал ваш готовый незагрузочный диск.

ZPilot
06.04.2020, 21:06
nzeemin, хотел у вас уточнить один момент. У меня УКНЦ почему-то делает так: читает 0 трек, затем переходит на 1, читает на нем 56 байт и переходит на 0 трек обратно.. так и остается на нем висеть. Не может это быть связано с контрольной суммой?
Бит что КС верна я выставил.

nzeemin
06.04.2020, 21:27
nzeemin, хотел у вас уточнить один момент. У меня УКНЦ почему-то делает так: читает 0 трек, затем переходит на 1, читает на нем 56 байт и переходит на 0 трек обратно.. так и остается на нем висеть. Не может это быть связано с контрольной суммой?
Бит что КС верна я выставил.

Вряд ли это КС, потому что у себя я тоже не считаю КС и просто ставлю бит что она верна.

ZPilot
06.04.2020, 21:38
Вряд ли это КС, потому что у себя я тоже не считаю КС и просто ставлю бит что она верна.
Вот и в листинге дебага я не нашел проверки на КС. Эх.. опять затык.. Я уже подумывал, что не успеваю считать 512 байт с СДшки при Степе, но нет.. 56 байт после шага УКНЦ же считывает.
Я не мог перепутать: Dir=1 это от 0 дорожки к 79, а 0 от 79 до 0?
Хотя я пробовал и так и так..

nzeemin
06.04.2020, 21:51
Может это вам поможет?
Сделал трассу событий на контроллере дисковода при загрузке диска fodostm1.dsk до надписи
ФOДOC Ф B03.00
Диск можно взять тут: https://github.com/nzeemin/ukncbtl-testbench/blob/master/data/fodostm1.dsk?raw=true
Чему соответствуют события можно посмотреть по исходнику тут (часть строк я раскомментировал чтобы получить подробную трассу): https://github.com/nzeemin/ukncbtl/blob/master/emubase/Floppy.cpp

- - - Updated - - -



Я не мог перепутать: Dir=1 это от 0 дорожки к 79, а 0 от 79 до 0?
Хотя я пробовал и так и так..

Со стороны кода так -- шаг ближе к нулевой дорожке это 0:


BIC #100,23204 ; Установить в УС перемещение от центра

ZPilot
06.04.2020, 22:23
Может это вам поможет?
Спасибо огромнейшее за лог!! Сделаю у себя и проверю!

ZPilot
12.04.2020, 23:17
Друзья, хочу поделиться своей большой радостью:
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 подключенного образа имя которого прошито в код СТМки :) Вот только-только заработало.
Пока так.

Alex_K
12.04.2020, 23:45
Что работает на данный момент, только чтение из 1 подключенного образа имя которого прошито в код СТМки Вот только-только заработало.
Пока так.
Судя по загрузке образ мой. Там есть TESTMZ.SAV. Можно запустить и сделать последовательное чтение и чтение случайных секторов. Посмотреть, будут ли ошибки. Как я понимаю, MFM-потока нет, уже подбрасываются двоичные данные. Будет интересно глянуть на результаты теста.

ZPilot
12.04.2020, 23:52
Судя по загрузке образ мой. Там есть TESTMZ.SAV
Это был образ диска с бейсиком и он запускается автоматически.

Как я понимаю, MFM-потока нет, уже подбрасываются двоичные данные
Да, зачем эмулировать, то что не нужно? Единственное, я ни как не мог заставить работать Petit FatFs с хардверным SPI, пришлось софтовый использовать, боюсь, что скорость пока не на уровне.
Есть еще много вопросов, например, я начинаю грузить данные с флешки когда УКНЦ добралось до маркера данных.. почему-то только в этот момент УКНЦ согласна подождать.

Alex_K
13.04.2020, 00:31
Есть еще много вопросов, например, я начинаю грузить данные с флешки когда УКНЦ добралось до маркера данных.. почему-то только в этот момент УКНЦ согласна подождать.
В каком смысле подождать?

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


Это был образ диска с бейсиком и он запускается автоматически.
Если это Бейсик-Вильнюс, то выход в систему по команде SYS. Каталог исполнимых файлов можно посмотреть командой DIR *.SAV.

nzeemin
13.04.2020, 09:03
Есть еще много вопросов, например, я начинаю грузить данные с флешки когда УКНЦ добралось до маркера данных.. почему-то только в этот момент УКНЦ согласна подождать.

https://www.hermannseib.com/documents/floppy.pdf

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.
То есть, при переходе между дорожками у вас есть от 3+15 до 8+25 мс для: декодирования и сохранения трека в образ, плюс чтения соседнего трека из образа и подготовки его в памяти.

Конкретно для НГМД-6022: https://drive.google.com/file/d/1Xb76KawFXm1xbBD7KSSq5uI_9-K7izwE/view
2.8. Время перемещения головок на соседнюю дорожку - не более 12 мс.
2.9. Время опускания головки - не более 50 мс.

ZPilot
13.04.2020, 12:42
У меня по скоростям расклад такой: чтение от 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, то УКНЦ думает, что контроллер ищет маркер.. а я , как подлец, этим пользуюсь :)

nzeemin
13.04.2020, 13:09
У меня по скоростям расклад такой: чтение от 0 байта до метки A1 A1 A1 FB со скоростью около 350 килобит, в момент метки A1 A1 A1 FB , те время чтения самой этой метки 0.03 секунды или 30 миллисекунды (из-за того что в этом месте я читаю данные дорожки из файла на СД-карте, те 5168 байт читаются за 30 миллисекунды), после этого все последующие данные читаются со скоростью 350 килобит. Переход между дорогами не занимает ни чего, тк я не генерирую буфер дорожки, а просто отвечаю данными в зависимости от номера считанного байта:


Так вы замедляете чтение с диска: тогда, когда машина уже готова вовсю читать, вы искуственно задерживаете её на эти 30 мс.
В работе с диском есть куча времени когда можно работать с картой без задержек: раскрутка мотора, переход между дорожками - в это время машина всё равно будет ждать контроллер, не требуя с него данных.

ZPilot
13.04.2020, 13:26
Так вы замедляете чтение с диска:
По идее 1 раз на трек.


раскрутка мотора, переход между дорожками - в это время машина всё равно будет ждать контроллер
Вот можно по точнее этот момент? Как должен ответить контроллер: Подожди, я занят? Плюс, как выяснилось, читать с СД-карты в момент перехода между дорогами - очень плохая идея! Почему, да потому что после чтения 0 сектора укнц посылает команды на перемещения головы не читая потом трек, просто добирается до нужной дорожки. Во-первых, читаем в этот момент напрасно, а во-вторых, укнц шагает так быстро, что просто начинается пропуск команд.
Раскрутка мотора тоже не подходит, тк нельзя считать весь образ целиком, нет столько памяти.
А еще.. у меня не запустился ваш диск с ФОДОСОМ :( Считал заголовок, написал, что стартует Фодос, но вывалился с какой-то ошибкой. Кстати, в эмуляторе тоже.


Там есть TESTMZ.SAV.
Алекс, я загрузил бейсик, вышел в "дос" но там нет такого файла, не подскажите, где его взять?

ZPilot
13.04.2020, 18:21
Набросал схемку: https://ibb.co/YpN0cdq
Сильно не ругайтесь, делал по памяти, мог что-то упустить не особо важное.
Да, DMR, DMG и SACK не используются.

Так выглядит макетка без Нуклии: https://ibb.co/k69qnkM

AFZ
13.04.2020, 19:06
Собран на 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 штуки.Ух ты! Круто! Для УКНЦ это КМД, да? Т.е. 1801ВП1-128 на шине ПП ?

Да, кстати, можно попробовать поставить в качестве драйверов 74LVS245, они 3-вольтовые, но толерантные к 5В, всякие согласователи у китайцев, по типу "прицепить SD-карточку к Ардуине (5В)" сделаны, обычно, на 74LVS.

А вообще, нашего полку прибыло! Не я один сочиняю псевдодиски для ДВК/УКНЦ. Ура!


Единственное, я ни как не мог заставить работать Petit FatFs с хардверным SPI, пришлось софтовый использовать, боюсь, что скорость пока не на уровне.У L476, по-идее, на борту должен быть аппаратный SDIO, почему бы не сделать через него? Хоть сразу 4-битный. Я, кстати, пользую в AZ полную FATFS, не петит, причем, по-простому собрал из кубиков (STM32 CubeMX). Оно, конечно, кушает оперативку, так, что в пилюлю не влезет...


например, я начинаю грузить данные с флешки когда УКНЦ добралось до маркера данных.. почему-то только в этот момент УКНЦ согласна подождать. На тему "подождать". Не знаю, как это сделано в УКНЦ, но я когда-то разбирал программу MY - не помню, кажется, 091 или 093, поглядывая заодно в те материалы по 128-му или его предшественнику (уже и номер забыл), которые удалось найти и в книжку по MY, я почти во всем разобрался, и помнится мне, что в процессе просмотра дорожки в некоторых случаях ждут просто заданное время, где-то - бита в регистре, причем "до упора", а где-то бита в регистре с таймаутом. ИМХО, там, где ждут бита в регистре, можно и "притормозить". В общем, советую запастись всеми материалами по 128-мы, взять дизасм программы обслуживания дисководов и поразбирать внимательно. Кстати, nzeemin давал ссылку на его реализацию эмулятора ВП1-128.

И еще, как мне кажется, нужен аппаратный регистр состояния, а может и регистр данных. Чтобы можно было заняться своими делами, а аппаратный регистр состояния будет сигналить программе в ПП "мы еще не готовы". Нечто, вроде состояния "Думаю, прошу не мешать" в моём AZ.

hobot
13.04.2020, 19:27
Набросал схемку

Так выглядит макетка

Ух ты! Круто! Для УКНЦ это
если мне кто нибудь объяснит что это вообще такое, где втыкать в УК-НЦ и откуда инфа хранится???

я бы то же порадовался,
и может даже сильно )))

ZPilot
13.04.2020, 21:28
Для УКНЦ это КМД, да? Т.е. 1801ВП1-128 на шине ПП ?
Да и дисковод(ы) в придачу.

драйверов 74LVS245
Если их использовать, то должно хватить и stm32f103cb (которая в блюпил стоит).

У L476, по-идее, на борту должен быть аппаратный SDIO
Потому что он сидит на GPIOC, а там у меня ШДА, остальные не имеют всех пинов толерантных к 5В.

Я, кстати, пользую в AZ полную FATFS, не петит, причем, по-простому собрал из кубиков
Я не использовал полную FATFS из Куба тк он хочет HAL, а у меня половину на LL, а половину чистый асм.

И еще, как мне кажется, нужен аппаратный регистр состояния, а может и регистр данных.
Я думал об этом, но как мне кажется, толку от него 0. Тк данные в регистре данных должны стираться сразу после обращения к ним, а регистр статуса/команд нужно писать/читать по мере готовности. Да, у меня почти аппаратные регистры, тк они обрабатываются в прерывании.. те на работу основной программы почти не влияют.

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


если мне кто нибудь объяснит что это вообще такое, где втыкать в УК-НЦ и откуда инфа храниться???
Втыкается это в разъем XS1 или XS2 которые на УКНЦ выведены на верхнюю панель, на "схеме" это левый коннектор, образы DSK хранятся на сд-карте, которая на схеме не представлена в виду того, что устройство подает признаки жизни, но до готовности его еще дорабатывать и дорабатывать. Все что в середине схемы это только вариант реализации, можно выкинуть ПЗУ в которой используется всего 2 байта и заменить на 4 микросхемы логики: 2 155ла2 и 2 155лн1, ва87 тоже можно выкинуть от слова совсем.. при желании..
В общем, вариантов решения аппаратной части море. Вся соль в ПО.

Очень хотелось устройство стоимостью изготовления рублей в 300..

hobot
13.04.2020, 21:41
ZPilot, а сколько "приводов" эмулируется 0 и 1 или с 0 по 3
А дырочка на дискетах эмулируется ? )))

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

грубо говоря = это КМД УК-НЦ + готек(и) в одном флаконе? Мощно! Так держать! )))

ZPilot
13.04.2020, 21:46
приводов" эмулируется 0 и 1 или с 0 по 3
Сейчас пока только нулевой, но выбор остальных пока просто закрыт.
И индексная метка эмулируется.. правда "наглаз" ну те с 0 байта по маркер заголовка.

готек(и) в одном флаконе
Не.. Готек это круто, в моей железке он просто не нужен, тк данные на СД сразу к контроллеру прикручены.

hobot
13.04.2020, 21:53
тк данные на СД сразу к контроллеру прикручены.
просто помечтаем :
как планируется организовать привязку образов по приводам и возможность вынул\вставил дискету в привод такой-то ???
реальная полезная железяка у вас намечается )))

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

да и кстати говоря (на всякий случай) обрвзы стандартные .DSK кушаеть будет прибор?

ZPilot
13.04.2020, 21:59
как планируется организовать привязку образов по приводам и возможность вынул\вставил дискету в привод такой-то ???
Прикрутить дисплей и выбирать на нем.. но это в идеале..


DSK кушаеть будет прибор
Сейчас он кушает DSK 80 дорожек 2 стороны.. по идее можно добавить любой формат, главное знать как хранятся данные.. ну и конечно сжатые образы - не получится сделать.. просто не успеет на лету распаковать.

hobot
13.04.2020, 22:10
Сейчас он кушает DSK 80 дорожек 2 стороны

Прикрутить дисплей и выбирать на нем.. но это в идеале..


https://youtu.be/DuxHVjz-OaU

ZPilot
13.04.2020, 22:18
hobot, боюсь, что отвечу как Зеленый.. :)

ZPilot
14.04.2020, 23:12
https://ibb.co/87Cw2rF

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

Вот как перейти на MZ1?

Alex_K
14.04.2020, 23:14
Вот как перейти на MZ1?
ASS MZ1 DK

ZPilot
14.04.2020, 23:19
ASS MZ1 DK
А запустить программу с другого диска: run MZ1:basic.sav ?

Alex_K
14.04.2020, 23:27
А запустить программу с другого диска: run MZ1:basic.sav ?
Да. Но иногда запускаемой программе надо, чтобы диск, где она находится был текущим. Поэтому иногда надо.
ASS MZ1 DK
RUN BASIC

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

Расширение SAV при запуске указывать не надо. Соответственно RUN MZ1:BASIC.

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


Алекс, я загрузил бейсик, вышел в "дос" но там нет такого файла, не подскажите, где его взять?
TESTMZ.SAV есть в образе sysimage.dsk.

ZPilot
14.04.2020, 23:29
Alex_K, у меня есть видео загрузки образа RT11QFIX.DSK, могу выложить, чтобы оценить скорость загрузки..

Alex_K
14.04.2020, 23:33
Alex_K, у меня есть видео загрузки образа RT11QFIX.DSK, могу выложить, чтобы оценить скорость загрузки..
Интересно, за какое время выполнится команда DIR/BAD/FIL. Она сканирует диск на плохие блоки. Если дискета читается нормально без ошибок, то обычно она проходит за 50-60 сек.
Да и результат TESTMZ узнать бы.

ZPilot
14.04.2020, 23:47
Да и результат TESTMZ узнать бы.
А что там нужно выбрать?
У меня пока только чтение реализовано.
DIR/BAD/FIL - 5 секунд по времени УКНЦ, нет бед блоков.
TESTMZ - по чтению: ошибок нет.

Alex_K
14.04.2020, 23:53
А что там нужно выбрать?
У меня пока только чтение реализовано.
Так я ранее про чтение и писал. Последовательное чтение секторов и чтение случайных секторов. Интересен результат - будут ошибки или нет.

ZPilot
15.04.2020, 00:00
чтение случайных секторов
Должено само закончится или останавить как-то надо, а то я смотрю в отладке, оно уже по нескольку раз пробежалось по всему диску.

Alex_K
15.04.2020, 00:07
Должено само закончится или останавить как-то надо, а то я смотрю в отладке, оно уже по нескольку раз пробежалось по всему диску.
Да, оно работает бесконечно. Прервать УПР+C(це).

ZPilot
15.04.2020, 00:12
Да, оно работает бесконечно. Прервать УПР+C(це).
Прервал, показал что есть ошибки на 977 проходов, но сколько сказать не могу.. левый край уехал за видимую область.. Если подскажите как вывести таблицу или карту на терминал.. то возможно скажу сколько ошибок.

Alex_K
15.04.2020, 00:16
Если подскажите как вывести таблицу или карту на терминал.. то возможно скажу сколько ошибок.
Так там после прерывания выводит помощь:
К - карта на терминал
Т - таблица на теминал
Д - содержимое дорожки на экран
М - выход в меню

ZPilot
15.04.2020, 00:20
Так там после прерывания выводит помощь:
Ее не видно по той же причине.

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

9 ошибок,код ошибки 102, видимо не успевал вовремя ответить из-за чтения с флешки.. а может еще чего..

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

Ошибки есть только в чтение случайных секторов, остальные завершились без сбоев.

hobot
15.04.2020, 00:23
ZPilot, а там настройки в тестмз не под 6022 - ли по умолчанию???

ZPilot
15.04.2020, 00:26
а там настройки в тестмз не под 6022 - ли по умолчанию???
Где это можно посмотреть? В стандартных менюшках нет выбора типа устройства.
Да.. я тут подумал, что для висящих на соплях узлах, это еще очень маленький процент ошибок.

Alex_K
15.04.2020, 00:29
код ошибки 102
Не удалось обнаружить сектор с заданным номером.

ZPilot
15.04.2020, 00:33
Не удалось обнаружить сектор с заданным номером.
Значит точно не успел в заданное время ответить. У меня плата мало того что сыпет данные в УАРТ, но это не должно влиять тк УАРТом ДМА занят, хотя, по идее тоже может. У ДМА все-таки тоже включены прерывания хоть я их и не использую, но наложиться могли.. Так еще она и в режиме отладки висит, хардфаулты ловлю.

hobot
15.04.2020, 00:33
В стандартных менюшках нет выбора типа устройства.
там по умолчанию ЕМНИП на 40 дор. дисковод настройка

ZPilot
15.04.2020, 00:37
там по умолчанию ЕМНИП на 40 дор. дисковод настройка
Вроде в логах были все 80 дорожек.Точно 80, я ж выбирал.

Alex_K
15.04.2020, 00:39
.. а может еще чего..
Скорее всего ещё что-то. Надо соблюдать временные параметры, скорость 250 кбит/сек. Всё дело в том, что драйвер дисковода в УКНЦ работает по прерываниям программируемого таймера. Не тот номер сектора, то таймер программируется на время прохождения головки до следующего сектора. Драйвер выходит из обработки, а по истечении заданного времени головка дисковода оказывается перед началом следующего сектора. Происходит прерывание, вход в драйвер дисковода, ну и соответственно поиск маркера заголовка.

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


там по умолчанию ЕМНИП на 40 дор. дисковод настройка
В моём образе sysimage.dsk, который поставляется с эмулятором, уже давно переделано на 80 дорожек.

ZPilot
15.04.2020, 00:45
Alex_K, да я бы с удовольствием.. но на это нужно другое железо. Я пытаюсь ответить как только придет команда или считаются данные из регистра данных. Я думаю, по этому то и тест на DIR/BAD и занял 5 секунд вместо 50-60.. Но STMка не ПЛМ, у нее нет жестких временных рамок.
В эмуляторах дисководов, тот же Готек, точность потока получается за счет использования SPI.

ZPilot
15.04.2020, 12:27
Alex_K, я тут подумал, что основная задача контроллера - вовремя ответить на запрос от УКНЦ. Я так и закладывал логику работы, те УКНЦ прислал 2023, контроллер тут же выставил соответствующие биты в регистре статуса и тут же положил данные в регистр данных, чтобы при последующем обращении к ним УКНЦ получил правильные данные. Те основная задача контроллера выставить при обращении УКНЦ правильные данные/статусы. Временными рамками пусть занимается УКНЦ. Да, если бы у меня стояла задача эмулировать вп1-128, да так чтобы к эмулятору подключался настоящий FDD-привод, тогда да, без временных рамок не обойтись, но в моем случае: нужно просто успеть ответить.

hobot
15.04.2020, 15:19
ZPilot, https://zx-pk.ru/threads/16861-poisk-fajlov-dlya-uknts-dvk.html?p=497018&viewfull=1#post497018

там есть несколько альтернативных старенькой TESTMZ утилит, написанных под "современные" дисководы и контроллеры ,
с более красочным интерфейсом.

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


УКНЦ прислал
а я вот понимая правильность аббревиатуры, всё равно сваливаюсь на женский род, типа моя УК-НЦ, школьница (РМУ) ))) И т.п.

ZPilot
15.04.2020, 17:07
всё равно сваливаюсь на женский род
Ну.. для меня комп и комп.. :)

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

Вот уперся я в косяк с выбором приводов: 0 и 1 работают, 2 и 3 ни в какую.. почему-то в командах нет бита включения мотора.. Случайно, при сбросе или включении, УКНЦ не проверяет наличие не только контроллера, но и устройств?

hobot
15.04.2020, 17:18
Случайно, при сбросе или включении, УКНЦ не проверяет наличие не только контроллера, но и устройств?
там тонкость ИМХО: может быть только в КМД УК-НЦ !!! Alex_K наверное может как спец. объяснить техническими терминами.
Я знаю из практики, что классический заводской, с перемычкой КМД УК по теории подерживал 0-3 приводов, но на практике в комплекте,
всегда был шлейф на два устройства или спец. шлейф для кожуха, в любом варианте кожуха = 2 кармана, подключение двух кожухов к одному контроллеру
ни разу не видел, т.о. на практике ни разе не видел 4-ре кармана на 1-м КМД УК-НЦ, только пара.

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

другой момент, что и каким образом реализовано в UKNCBTL - это авторы эмулятора расскажут ! )))

ZPilot
15.04.2020, 17:41
там тонкость ИМХО
Ясно. Хотя конечно в эмуляторах вроде больше 2х приводов.
Кстати, посмотрел ваши диски. Тест скорости привода не заработал, из-за того, что у меня индексная метка генерируется когда УКНЦ пытается читать данные с дисковода, а не просто включил(а) мотор и слушает метку. :)
А есть на УКНЦ аналог Нортона?

SuperMax
15.04.2020, 17:52
там тонкость ИМХО: может быть только в КМД УК-НЦ !!! Alex_K наверное может как спец. объяснить техническими терминами.
Я знаю из практики, что классический заводской, с перемычкой КМД УК по теории подерживал 0-3 приводов, но на практике в комплекте,


теоретически 128ая может адресовать 16 устройств если прицепить дешифратор
https://pic.maxiol.com/thumbs2/1586962019.3232235619.capture.png (https://pic.maxiol.com/?v=1586962019.3232235619.capture.png&dp=2)
реально идет прямой выбор и работает 4ре устройства

на шлейфе - 4ре устройства
https://pic.maxiol.com/thumbs2/1586962048.3232235619.samsungsfd321bpins.png (https://pic.maxiol.com/?v=1586962048.3232235619.samsungsfd321bpins.png&dp=2)

hobot
15.04.2020, 18:11
А есть на УКНЦ аналог Нортона?
да! PafCommander (http://hobot.pdp-11.ru/ukdwk_archive/ukncbtlwebcomplekt/ishPAFCOM/) - работает с устройствами драйвера которых загружены в память

ZPilot
15.04.2020, 19:07
реально идет прямой выбор и работает 4ре устройства
На вашей схеме 38,39 выводы висят в воздухе. Читаем первый даташит:

0 (DS0) – запись "1" приводит к выбору накопителя 0;
1 (DS1) – запись "1" приводит к выбору накопителя 1;
2 (DS2) – запись "1" приводит к выбору накопителя 2;
3 (DS3) – запись "1" приводит к выбору накопителя 3;

второй:

Запись "1" в 0-й разряд РСН <DS0> вызывает выбор 0-го привода накопителя.
Запись "1" в 1-й разряд РСН <DS1> вызывает выбор 1-го привода накопителя.
Запись "1" одновременно в 0-й и 1-й разряды вызывает выбор 2-го привода накопителя.
Запись "0" во 2-й и 3-й разряды РСН <DS2, DS3> вызывает включение нулевых задержек..

А по факту и то и то не верно. тк в реальности 0 привод это 0011, 1 привод 0010, 2 привод 0001.

nzeemin
15.04.2020, 21:46
А по факту и то и то не верно. тк в реальности 0 привод это 0011, 1 привод 0010, 2 привод 0001.

В эмуляторе так - инвертированные первые два бита. А "не так" наверное опять из-за инверсии на шине.


uint16_t newdrive = (cmd & 3) ^ 3;

ZPilot
15.04.2020, 22:06
В эмуляторе так
Благодаря вашему эмулятору я и отлавливаю ошибки и неточности в описаниях. Насчет инверсии, у меня шина и так инвертирована на ВА87, а биты все равно приходят инверсные.
С 3-м приводом разобрался, я оказывается, мало того что пишу с ашипками, так еще и считаю так же :)
А 3-й привод действительно сидит на 10 бите?

Titus
15.04.2020, 22:37
Вот работа с FDD из моего эмулятора УКНЦ EmuStudio. Написано еще в 2006, и с тех пор не менялось. Не смотря на то, что эмуляция не побитная, ни одной программы, не работающей с ним пока что не встречалось.









static UINT16 PPU_FDD_STATE; // Регистр состояния Floppy-диска

static struct { // Определить структуру, описывающую дисководы
UINT8 Track, // Номер трека (00..79, при over-позицировании > 79)
Side, // Сторона (0 - нижняя головка, 1 - верхняя головка)
Motor, // Мотор (00 - выключен, иначе включен)
PrevMotor, // Предыдущее состояние мотора (для иконок дискет)
Mode, // Режим (00 - нет чтения/записи, 01 - чтение, 02 - запись)
Ready; // Готовность данных (00 - нет данных, иначе есть данные)
UINT8 PosType, // Текущее положение на треке (00 - межсекторное пространство, иначе сектор)
Sector; // Текущий сектор (0..9)
UINT32 MotTimer; // Таймер остановки мотора (если 0, то мотор остановлен)
UINT32 CurrPos; // Текущая позиция в словах внутри сектора (0..511) либо внутри межсекторного пространства (0..nnnn)
UINT8 *ImagePTR; // Указатель на образ диска (образ 819200 байт)
UINT16 ControlSp[50];// Массив для размещения текущей межсекторной служебной информации
} Floppy[4];

static const MaxTrack = 79; // Максимальный разрешенный номер трека




for (i=3; i!=-1; i--) { // Для всех дисков

Floppy[i].Motor = 0; // Двигатель выключен
Floppy[i].Mode = 0; // Режим 'бездействие' (для цветовой индикации)
Floppy[i].Track = 0; // Трек 0
Floppy[i].Ready = 1; // Данные готовы
Floppy[i].MotTimer = 0; // Таймер мотора сброшен, мотор выключен
memset(Floppy[i].ControlSp,0,sizeof(Floppy[i].ControlSp)); // Заполнить пробелы

Floppy[i].ControlSp[0] = 0x1234; // Терминатор псевдо-пробела (если сектор заполнен нулями)
Floppy[i].ControlSp[1] = 0x1234; //

Floppy[i].ControlSp[20] = 0xA1A1; // Синхропоследовательность перед заголовком сектора
Floppy[i].ControlSp[21] = 0xA1FE; // (не менять положение, завязано с фунцией чтения)

Floppy[i].ControlSp[40] = 0xA1A1; // Синхропоследовательность перед сектором
Floppy[i].ControlSp[41] = 0xA1FB; //

}






UINT16 FASTC PPU_RdW_FDD_STATE(void) { // Регистр состояния Floppy-диска

UINT16 State = 0;
UINT8 Numb = 3 - (PPU_FDD_STATE & 0x3); // Numb - номер дисковода (0..3)

if (Floppy[Numb].Track == 0) // Если трек = 0, то
State |= 0x0001; // устанавливаем бит TR0

State |= 0x0002; // Дисковод готов к работе (всегда)

// State |= 0x0004; // [T] Запись на диск запрещена

if (Floppy[Numb].Ready) // Если есть готовность данных
State |= 0x0080;
else
{ // Иначе, если нет готовности данных, то синхронизация
if (Floppy[Numb].PosType) // Если находимся на секторе, то автоматом
{ // перепозицируемся на следующую за сектором
// первую синхропоследовательность $A1A1
// (синхро заголовка сектора)
Floppy[Numb].CurrPos = 20; // Позицируемся на первую $A1A1
Floppy[Numb].PosType = 0; // межсекторного пространства
if ((Floppy[Numb].Sector +=1) > 9) // Перейти к следующему сектору
Floppy[Numb].Sector = 0; // Если достигли сектора 10, то переход к сектору 0
Floppy[Numb].ControlSp[22] = (Floppy[Numb].Track << 8) | // Прописываем в служебное поле
Floppy[Numb].Side; // номер трека / головки
Floppy[Numb].ControlSp[23] = ((Floppy[Numb].Sector + 1) << 8) | // номер сектора / длина
2; //

// printf("Spaces found inside sector, jump to next marker\n");
}
else // Если находимся на межсекторном пространстве
{
// Доделать индекс для программы TS.SAV
//if ((Floppy[Numb].CurrPos == 20) && // Если находимся в самом начале межсекторного
// (Floppy[Numb].Sector == 1)) // пространства перед сектором 0, то
//{
// State |= 0x8000; // установить флаг INDEX
// printf("Index Marker\n");
//}

if (Floppy[Numb].ControlSp[Floppy[Numb].CurrPos] == 0xA1A1) // Если достигли синхропоследовательности
{
Floppy[Numb].Ready = 1; // то устанавливаем готовность данных
State |= 0x0080;
}
else
{
if ((Floppy[Numb].CurrPos += 1) > 41) // Если достигли конца служебной области
{
Floppy[Numb].CurrPos = 0; // Позицируемся на начало
Floppy[Numb].PosType = 1; // сектора

// printf("Marker not found, found data\n");
}
}
}
}

State |= 0x4000; // [T] Контрольная сумма всегда правильная

return(State);

}



UINT16 FASTC PPU_RdW_FDD_DATA(void) { // Регистр данных Floppy-диска

UINT16 Value;
UINT8 Numb = 3 - (PPU_FDD_STATE & 0x3); // Numb - номер дисковода (0..3)

if (Floppy[Numb].PosType) { // Если находимся на секторе (сектор 512 байт)

Value = *(UINT16*)(Floppy[Numb].ImagePTR + // Слово данных
((Floppy[Numb].Track << 1) + Floppy[Numb].Side) * 5120 +
(Floppy[Numb].CurrPos << 1) +
Floppy[Numb].Sector * 512);

Value = (Value >> 8) | ((Value & 0x00FF) << 8); // Обмен байтов в слове

Floppy[Numb].Mode = 1; // Режим 'чтение' (для цветовой индикации)

if ((Floppy[Numb].CurrPos += 1) > 255) // Если достигли конца сектора
{
// printf("Track: %d, Side %d, Sector %d\n",
// Floppy[Numb].Track, Floppy[Numb].Side, Floppy[Numb].Sector);

Floppy[Numb].CurrPos = 0; // Позицируемся на начало
Floppy[Numb].PosType = 0; // межсекторного пространства
if ((Floppy[Numb].Sector +=1) > 9) // Перейти к следующему сектору
Floppy[Numb].Sector = 0; // Если достигли сектора 10, то переход к сектору 0
Floppy[Numb].ControlSp[22] = (Floppy[Numb].Track << 8) | // Прописываем в служебное поле
Floppy[Numb].Side; // номер трека / головки
Floppy[Numb].ControlSp[23] = ((Floppy[Numb].Sector + 1) << 8) | // номер сектора / длина
2; //
Floppy[Numb].Mode = 0; // Режим 'бездействие' (для цветовой индикации)

}

}
else { // Иначе находимся на межсекторном пространстве

Value = Floppy[Numb].ControlSp[Floppy[Numb].CurrPos]; // Слово данных

if ((Floppy[Numb].CurrPos += 1) > 41) { // Если достигли конца служебной области
Floppy[Numb].CurrPos = 0; // Позицируемся на начало
Floppy[Numb].PosType = 1; // сектора
}

}


return(Value);

}



void FASTC PPU_WrW_FDD_STATE(UINT16 Data) { // Регистр состояния Floppy-диска

UINT8 Numb;

if (Data & 0x400) { // Если активен бит выбора дисковода (REZ)

Numb = 3 - (Data & 0x3); // Numb - номер дисковода (0..3)

if ((!(PPU_FDD_STATE & 0x200)) && (Data & 0x200)) { // Если смена бита WM 0->1,
Floppy[Numb].Mode = 2; // то включаем режим записи
Floppy[Numb].CurrPos = -1; // Текущая позиция в секторе -1 (для пропуска
// первого синхрослова $FBA1
}

PPU_FDD_STATE = Data;

if (PPU_FDD_STATE & 0x10) // Если включен двигатель дисковода
{
Floppy[Numb].Motor = 1; // то Motor = 1, иначе Motor = 0

Floppy[Numb].MotTimer = 200; // Таймер остановки мотора (только для GUI)
}
else
Floppy[Numb].Motor = 0; // Не используется? Мотор выключается сам
// через некоторое время?

Floppy[Numb].Side = (PPU_FDD_STATE & 0x20) >> 5; // Выбор номера головки

if (PPU_FDD_STATE & 0x80) // Если установлен бит шага (ST), то
{
PPU_FDD_STATE &= 0xFF7F; // Сбросить бит шага
Floppy[Numb].Mode = 0; // Режим 'перемещение' (для цветовой индикации)
if (PPU_FDD_STATE & 0x40) // Если направление шага к центру, то
{
if (Floppy[Numb].Track < MaxTrack)
Floppy[Numb].Track += 1;
else
printf("Wrong Track: %d\n", Floppy[Numb].Track + 1);

// printf("Step to -> %d\n", Floppy[Numb].Track);
}
else // Иначе направление от центра
{
if (Floppy[Numb].Track > 0)
Floppy[Numb].Track -= 1;

// printf("Step to -> %d\n", Floppy[Numb].Track);
}
}

Floppy[Numb].ControlSp[22] = (Floppy[Numb].Track << 8) | // Прописываем в служебное поле
Floppy[Numb].Side; // номер трека / головки
Floppy[Numb].ControlSp[23] = ((Floppy[Numb].Sector + 1) << 8) | // номер сектора / длина
2; // (необходимо после шага или смены стороны)

if (PPU_FDD_STATE & 0x100) { // Если установлен бит инициализации (GOR)
Floppy[Numb].Ready = 0; // Сбросить бит готовности данных
}

}

return;

}




void FASTC PPU_WrW_FDD_DATA(UINT16 Data) { // Регистр данных Floppy-диска

UINT8 Numb = 3 - (PPU_FDD_STATE & 0x3); // Numb - номер дисковода (0..3)

if (Floppy[Numb].Mode == 2) { // Если активен режим записи

if ((SINT32)Floppy[Numb].CurrPos >= 0) { // Если позиция внутри сектора >= 0

*(UINT16*)(Floppy[Numb].ImagePTR // Записать слово на образ
+ ((Floppy[Numb].Track << 1) + Floppy[Numb].Side) * 5120
+ (Floppy[Numb].CurrPos << 1)
+ Floppy[Numb].Sector * 512) = Data;

}

if ((Floppy[Numb].CurrPos += 1) > 255) { // Если достигли конца сектора
Floppy[Numb].CurrPos = 0; // Позицируемся на начало
Floppy[Numb].PosType = 0; // межсекторного пространства
if ((Floppy[Numb].Sector +=1) > 9) // Перейти к следующему сектору
Floppy[Numb].Sector = 0; // Если достигли сектора 10, то переход к сектору 0
Floppy[Numb].ControlSp[22] = (Floppy[Numb].Track << 8) | // Прописываем в служебное поле
Floppy[Numb].Side; // номер трека / головки
Floppy[Numb].ControlSp[23] = ((Floppy[Numb].Sector + 1) << 8) | // номер сектора / длина
2; //
Floppy[Numb].Mode = 0; // Режим 'бездействие'
}

}

return;

}

ZPilot
16.04.2020, 00:23
Вот работа с FDD из моего эмулятора УКНЦ
Смотрю на эту роскошь и радуюсь, не то что у меня.
Вот генерация трека:

.macro NEXTPOS
add r9, r6, r4, lsl #9 //sec*len_sect+(pos)//sec<<9+pos
add r9,#1
ldrh r3,=FLOPPY_RAWTRACKSIZE
cmp r9,r3
it hs
andhs r9,#0
strh r9,[r1]
.endm
//----------------------------------------
//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
it lo
ldrblo r0,=2

//CRC header
cmp r6,#GAP1_POS
itttt lo
ldrblo 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


А вот это работа с регистрами статуса/команды и данных

//---------------------------------------
.macro ENDIRQSTATUS
ldrb r7,[r6,SET_OPERM]
orr r7,r8
strb r7,[r6,SET_OPERM]

ldr r7,=EXTI_ADM
EXTICLEARFLAG r7,r8,EXTI_LINE_6
pop {r5-r8,lr}
bx lr
.endm
//----------------------------------------------
// EXTI9_5_IRQHandler //RSN o177130
//----------------------------------------------
.section .text.EXTI9_5_IRQHandler
.global EXTI9_5_IRQHandler
.type EXTI9_5_IRQHandler, %function
EXTI9_5_IRQHandler:
push {r5-r8,lr}
ldr r5,=PORT_ADM
ldr r6,=VAR_ADM
ldrh r8,[r6,#RSN_RDM]
irq5_start:
READPORT_R5 r7,PRT_B read from port B
tst r7,#(SYNC|DIN)
beq irq5_rsn_din
tst r7,#(SYNC|DOUT)
beq irq5_rsn_dout
tst r7,#(SYNC)
beq irq5_start
//--------------------------------------------
irq5_rsn_din:
RESETGPIO_R5 r7,PRT_B,#(VA87DIR)
SETPORT_R5 r7,PRT_C,MODER,moder_c_o
SETODRPORT_R5 r8,PRT_C
RESETGPIO_R5 r7,PRT_B,#(RPLY)
irq5_din_rsn_h_wait:
READPORT_R5 r7,PRT_B
tst r7,#(DIN)
beq irq5_din_rsn_h_wait

ldrb r8,=0
SETPORT_R5 r7,PRT_C,MODER,moder_c_i
SETGPIO_R5 r7,PRT_B,#(RPLY|VA87DIR)
ENDIRQSTATUS
//--------------------------------------------
irq5_rsn_dout:
RESETGPIO_R5 r7,PRT_B,#(RPLY)
SETPORT_R5 r7,PRT_C,MODER,moder_c_i
irq5_rsn_dout_h_wait:
READPORT_R5 r7,PRT_C
READPORT_R5 r8,PRT_B
tst r8,#(DOUT)
beq irq5_rsn_dout_h_wait

strh r7,[r6,#RSN_WRM]
tst r7,#0x100 //GOR?
ite eq
ldrbeq r8,=1 //cmd
ldrbne r8,=2 //synchro search
beq EXTI9_5_IRQHandler_end
ldrh r7,=0
strh r7,[r6,#RSN_RDM] //RSN_RD=0
strh r7,[r6,#RDN_RDM] //RDN_RD=0
EXTI9_5_IRQHandler_end:
SETGPIO_R5 r7,PRT_B,#(RPLY)
ENDIRQSTATUS
//--------------------------------------------

//--------------------------------------------
//--------------------------------------------
.macro ENDIRQDATA
ldrh r7,[r6,#RSN_RDM]
bic r7,#0x80 // 7 bit (TR)
strh r7,[r6]
//reset exti port
ldr r7,=EXTI_ADM
EXTICLEARFLAG r7,r8,EXTI_LINE_11
pop {r5-r8,lr}
bx lr
.endm
//----------------------------------------------
// EXTI15_10_IRQHandler // RDN o177132
//----------------------------------------------
.section .text.EXTI15_10_IRQHandler
.global EXTI15_10_IRQHandler
.type EXTI15_10_IRQHandler, %function
EXTI15_10_IRQHandler:
push {r5-r8,lr}
ldr r5,=PORT_ADM
ldr r6,=VAR_ADM
ldrh r8,[r6,#RDN_RDM] @load r8 DATA
irq10_start:
READPORT_R5 r7,PRT_B read from port B
tst r7,#(SYNC|DIN)
beq irq10_rdn_din
tst r7,#(SYNC|DOUT)
beq irq10_rdn_dout
tst r7,#(SYNC)
beq irq10_start

irq10_rdn_din:
RESETGPIO_R5 r7,PRT_B,#(VA87DIR)
SETPORT_R5 r7,PRT_C,MODER,moder_c_o
SETODRPORT_R5 r8, PRT_C
RESETGPIO_R5 r7,PRT_B,#(RPLY)
irq10_din_rdn_h_wait:
READPORT_R5 r7,PRT_B
tst r7,#(DIN)
beq irq10_din_rdn_h_wait

SETPORT_R5 r7,PRT_C,MODER,moder_c_i
SETGPIO_R5 r7,PRT_B,#(RPLY|VA87DIR)
ENDIRQDATA

irq10_rdn_dout:
RESETGPIO_R5 r7,PRT_B,#(RPLY)
SETPORT_R5 r7,PRT_C,MODER,moder_c_i
irq10_rdn_dout_h_wait:
READPORT_R5 r7,PRT_C
READPORT_R5 r8,PRT_B
tst r8,#(DOUT)
beq irq10_rdn_dout_h_wait

strh r7,[r6,#RDN_WRM]
SETGPIO_R5 r7,PRT_B,#(RPLY)
ENDIRQDATA


По сути - это весь мой эмулятор КГМД и флопов. Вернее даже не так, последний листинг, тот где описана работа с регистрами - это основа всего эмулятора, дальнейшее, можно делать как угодно. И этот кусок кода просто огромный гемморой, тк он должен выстрельнуть за время положенное на RPLY.

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


Терминатор псевдо-пробела
А что вот это значит?

Titus
16.04.2020, 00:32
А что вот это значит?
А вот этого уже не помню. Терминатор - это значит что-то завершающее. Возможно, это было сделано для отладки. Т.к 1234 - это отфонарное число, просто для того, чтобы отличаться от нуля.

nzeemin
16.04.2020, 01:43
Titus, а это о чём?

// Доделать индекс для программы TS.SAV

Titus
16.04.2020, 02:24
Titus, а это о чём?
Не помню уже) Возможно, есть какая-то программа на УКНЦ, которая использует сигнал от индексного отверстия, а у меня это не поддерживается.

hobot
16.04.2020, 05:04
!ts.sav - цепочка тестов
и насколько я знаю "индексное отверстие" как-то использует PAFCOM и ещё какие-то утилиты.

ZPilot
17.04.2020, 19:10
Уважаемые гуру, а не подскажите поведение УКНЦ если ВП1-128 выставляет в статусном регистре (о177130) ноль?

ZPilot
14.06.2020, 14:55
Добрый день друзья - коллеги.
Не подскажите утилиту работы с FDD, чтобы можно было считать отдельный трек и вывести его на экран.. да еще что-бы можно было ее загрузить с магнитофона или com-порта.
Может это как-то можно сделать встроенными возможностями самой УКНЦ?

MM
14.06.2020, 15:32
Не подскажите утилиту работы с FDD
DESS.SAV - в виде циферок/буковок, поблочно, для всех видов файловой системы флоппи-диска.
Если для графики - то только если делать специально что-то такое , по типу копирования фрагмента диска в видео-ОЗУ.
Программа выйдет совсем небольшая - порядка 1-2 блока, + 1 блок заголовка типа .SAV


Может это как-то можно сделать встроенными возможностями самой УКНЦ?
Вопрос пока в стадии изучения , особенно спроса.
Впрочем, при наличии финансирования ( спонсора ) НИОКР это можно организовать.

ZPilot
14.06.2020, 15:57
DESS.SAV - в виде циферок/буковок, поблочно, для всех видов файловой системы флоппи-диска.
Она работает без операционки? Ну те если ее загрузить с магнитофона?
Мне нужно отладить мой контроллер FDD. 0 сектор читает без проблем, а вот дальше я что-то упускаю.


Впрочем, при наличии финансирования ( спонсора ) НИОКР это можно организовать.
Я хочу сделать контроллер который эмулирует связку 128+fdd. Самый дешевый и легко повторяемый, сейчас это Блекпил на stm32f411, 27с512 и 155ла3. Выложить исходники сюда. Денег брать не хочу и не буду. Так что, можете безвозмездно помочь: Ю велкам! :)
Вот прототип: https://pic.maxiol.com/?v=1592139271.528788891.20200614155301.jpg&dp=2

MM
14.06.2020, 16:18
0 сектор читает без проблем, а вот дальше я что-то упускаю.
Посмотрите ТО ВП1-128 и Э3 блока контроллера. Вероятно, не проходит какой-то сигнал с ВП1-128 на дисковод ( Шаг ? Направление ? ).
Выяснить точнее можно, в пульте УКНЦ позаписывав разные числа в порт 177130, при этом дискета в дисководе может быть стерта вне зависимости от "защиты от записи". При записи в порт 177130 проконтролировать осциллографом прохождение сигнала до разъема дисковода.
http://www.emuverse.ru/wiki/%D0%9A1801%D0%92%D0%9F1-128

ZPilot
14.06.2020, 16:41
Выяснить точнее можно, в пульте УКНЦ позаписывав разные числа в порт 177130, при этом дискета в дисководе может быть стерта вне зависимости от "защиты от записи".
Да, я так и делаю. В том-то и дело, что если делать шагами, те в порт пишем 2023, 2423, 2423,2023 - получаем данные первого сектора 0 дороги, сделав 2 раза 2423, получим данные 2 сектора. Делаем 2223 перейдем на следующую дорогу. Повтрояю действия и вижу данные.. Блин.. они правильные! Если стартануть с образа несистемного диска, то получаю надпись на экране, что диск BOOT-U-No boot on volume. Но при попытке стартануть с системного диска, вижу что идет загрузка данных, но УКНЦ зависает. По этому и хотел какую-нибудь программу, которая тупо читает треки и выводит их на экран.

MM
14.06.2020, 16:44
Но при попытке стартануть с системного диска, вижу что идет загрузка данных, но УКНЦ зависает.
Пожалуйста, видео со звуком процесса загрузки. На видео - экран, и шум перемещения головки дисковода.

ZPilot
14.06.2020, 17:03
Пожалуйста, видео со звуком процесса загрузки. На видео - экран, и шум перемещения головки дисковода.
Ммм.. а вы фото прототипа не посмотрели?
У меня нет флопа.. образ..

AFZ
14.06.2020, 17:03
Я хочу сделать контроллер который эмулирует связку 128+fdd. Самый дешевый и легко повторяемый, сейчас это Блекпил на stm32f411, 27с512 и 155ла3Круто! Я бы, правда, вместо 580ВА87 поставил что-то похожее из серии 1533 (74ALS) Ту же 1533АП6 (74ALS245), а то эти 580 кипяченые. А что они неинвертирующие, легко обходится в программе.


Не подскажите утилиту работы с FDD, чтобы можно было считать отдельный трек и вывести его на экран.. да еще что-бы можно было ее загрузить с магнитофона или com-порта.
Может это как-то можно сделать встроенными возможностями самой УКНЦ?Нет такой программы. Придется пользоваться средствами пультовой программы УКНЦ. А для отладки можно заполнить файл-образ заранее заданным и легкоузнаваемым содержимым. По-простому, на писюке, программкой на любом языке. Первый вариант, который просится, это каждый блок заполнен кодом с его номером. Сразу прояснится, куда оно "шагает" и что оно "читает". Ну, и проверять эмуляцию ВП1-128 можно путем записи в него проверочных кодов через пультовую программу и просмотра действий внутри контроллера отладчиком STM32. Я отлаживал свой AZ примерно таким же образом.

MM
14.06.2020, 17:14
У меня нет флопа
Так позаимствуйте его в ближайшем ПК, для отладки.
Окно плотности на дискетах 1.44 замуровать. Дискеты записывать на ПК с встроенным контроллером FDD на материнской плате, программой UKDSK
Обязательно 2 шт. цикла записи дискеты подряд ( это особенность применения UKDSK )

AFZ
14.06.2020, 17:14
Вдогонку.


Мне нужно отладить мой контроллер FDD. 0 сектор читает без проблем, а вот дальше я что-то упускаю.Первые грабли, на которые я наступил при работе с FATFS - это было неправильное вычисление смещения внутри файла для доступа к нужному блоку эмулируемого диска. Оно там байтовое, а я что-то накуролесил, из-за чего все блоки, кроме нулевого читались неправильно.

ZPilot
14.06.2020, 17:15
Ту же 1533АП6 (74ALS245), а то эти 580 кипяченые. А что они неинвертирующие, легко обходится в программе.
Это целая команда на асме!! :) и так еле-еле успевает SYNC+DIN/DOUT поймать. а вообще.. их можно вообще выкинуть..


Ну, и проверять эмуляцию ВП1-128 можно путем записи в него проверочных кодов через пультовую программу и просмотра действий внутри контроллера отладчиком STM32.
Я выше уже писал, что пользуюсь отладчиком УКНЦ (УСТ + УПР+@). Данные проверяю сравнением с образом. А вот с "просмотра действий внутри контроллера отладчиком STM32" тут беда полная.. Дело в том, что STM32F411 имеет только порт А толерантным к 5В, а на нем висят пины отладки, так что либо ШДА либо отладка.


Первые грабли, на которые я наступил при работе с FATFS - это было неправильное вычисление смещения внутри файла для доступа к нужному блоку эмулируемого диска. Оно там байтовое, а я что-то накуролесил, из-за чего все блоки, кроме нулевого читались неправильно.
Я исключил пока ФатФС тем, что разместил 40ка дорожечный образ в РАМ память стмки.
Смещение вычисляю так: uint32_t foffset=((*TRACK<<1) + *HEAD) * 5120;

AFZ
14.06.2020, 17:15
Так позаимствуйте его в ближайшем ПК, для отладки.
Окно плотности на дискетах 1.44 замуровать.Так у него и ВП1-128 нет, он его эмулирует...

MM
14.06.2020, 17:21
Так у него и ВП1-128 нет, он его эмулирует...

Да, тогда сложнее...

Можно из образа загружаемого диска выкинуть все, кроме :
1. SWAP.SYS
2. Файл ОС
3. MZ.SYS

Т.е. на диске оставить только эти 3 шт. файла.

ZPilot
14.06.2020, 17:24
Можно из образа загружаемого диска выкинуть все, кроме :
1. SWAP.SYS
2. Файл ОС
3. MZ.SYS

Может кто помочь с таким образом?
Да еще бы желательно так, чтоб все, если такое возможно, уместилось в 0 дорогу, те в 5120 байт.

ПС: про порт А СТМки не правильно написал, толерантны там все порты, но только порт А полный, спасибо тебе СТМ за убитый 1 пин Б порта!

MM
14.06.2020, 17:33
Может кто помочь с таким образом?
Эмулятор ДВК господина Патрона в помощь !
Прицепляем образ как ( ненулевой ) образ ( несисьтемный ), и командой
DEL/Q/SYS удаляем усё лишнее :)


Да еще бы желательно так, чтоб все, если такое возможно, уместилось в 0 дорогу, те в 5120 байт.
Неа, Свап - он ~13 Кбайт, ОС - под 30, MZ - парочка Кбайт...

ZPilot
14.06.2020, 17:35
Эмулятор ДВК господина Патрона в помощь
Да я бы рад.. Винды нет.. :(

А кстати.. идея наверное плохая насчет 40 дорожечного образа? У меня 40/80 на земле сидит.


Неа, Свап - он ~13 Кбайт, ОС - под 30, MZ - парочка Кбайт...
Ну тогда в начале диска, чтоб в 400 кБ вместился, больше нет места во внутренней флешке СТМ.

Alex_K
14.06.2020, 17:52
Не подскажите утилиту работы с FDD, чтобы можно было считать отдельный трек и вывести его на экран.. да еще что-бы можно было ее загрузить с магнитофона или com-порта.
Если выводить трек со всеми межсекторными промежутками, то такой программы не знаю. А для чтения данных и вывода на экран есть классический TESTMZ, можно загрузить с магнитофона. В установке параметров можно выбрать конкретную дорожку и сторону. После последовательного чтения данных содержимое дорожки можно вывести на экран.

ZPilot
14.06.2020, 18:20
Если выводить трек со всеми межсекторными промежутками, то такой программы не знаю. А для чтения данных и вывода на экран есть классический TESTMZ, можно загрузить с магнитофона. В установке параметров можно выбрать конкретную дорожку и сторону. После последовательного чтения данных содержимое дорожки можно вывести на экран.
О!! Суппер, меня вполне устроит!!
Не подскажите, как ее правильно загрузить с магнитофонного порта? Ну или с ком порта..

Alex_K
14.06.2020, 18:33
Не подскажите, как ее правильно загрузить с магнитофонного порта?
UKNC_TESTMZ_22050_8.wav (https://drive.google.com/file/d/1rdqb3y6Oef6V25c1xJTVvghlmk8nSX22/view?usp=sharing). Для загрузки с магнитофона.

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

Только надо правильно уровень громкости подобрать. Сперва грузится загрузочный блок, должна вывестись надпись "Loading TESTMZ". Затем загрузится и запустится вся программа.

ZPilot
14.06.2020, 18:36
UKNC_TESTMZ_22050_8.wav. Для загрузки с магнитофона.
Спасибо!!
Ушел паять мегакоммуникации!! :)

AFZ
14.06.2020, 18:46
ПС: про порт А СТМки не правильно написал, толерантны там все порты, но только порт А полный, спасибо тебе СТМ за убитый 1 пин Б порта!Действительно, бред полный: GPIO B 11 выведен наружу только в кузове UFBGA100. Они что, рыбу ели? :(

ZPilot
14.06.2020, 19:51
Alex_K, а есть где-нибудь описание кодов ошибок которые выводит testmz? У меня единственная ошибка: Сектор Х ... код ошибки 102.
Х - случайный сектор. 10 раз тест делаешь 10 раз сектор разный.. может вообще не быть, а может быть несколько.


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

AFZ
14.06.2020, 19:57
Да, кстати. ИМХО, запаивать на свою плату Черную Пилюлю - не лучшее решение. Я бы, по-простому, запаял туда STM-ку с обвязкой, и не морочил голову. И выбрал бы STM-ку с полноценным GPIO B, а не это 411-е убожество. Хотя бы F407RET6.

Alex_K
14.06.2020, 20:24
Alex_K, а есть где-нибудь описание кодов ошибок которые выводит testmz?
Данные коды ошибок формирует драйвер дисковода в ПЗУ УКНЦ.
1 - ошибка контрольной суммы зоны данных
2 - ошибка контрольной суммы заголовка сектора
4 - не найден маркер данных
6 - дискета защищена от записи
7 - нулевая дорожка не обнаружена
10 - дорожка не обнаружена (её номер равен или больше 128)
11- ошибочный массив параметров
13 - неверный формат сектора при форматировании
14 - ошибка линии ИНДЕКС при форматировании
100 - ошибка поиска маркера, считываются одни нули
101 - ошибка поиска маркера, не найдена синхрозона
102 - не обнаружен адресный маркер заголовка сектора или не обнаружен сектор с заданным номером

AFZ
14.06.2020, 20:32
Это целая команда на асме!! и так еле-еле успевает SYNC+DIN/DOUT поймать.Я тоже сначала ловил SYNC программно, а потом плюнул и прицепил аппаратный распознаватель. Сначала это тоже была ПЗУха (я, правда, уложился в 2764), за ней регистр 1533ИР22, в нем, правда, была задействована всего пара-тройка битов, и что-то логическое на 1533ЛЛ1. Преимущества: полностью освобождаемся от необходимости следить за фронтом SYNC, а остальной обмен асинхронный - пока не ответишь RPLY, обращающийся процессор будет ждать, ну, если не дойдет дело до тайм-аута. Недостатки - разрастающийся огород. Потом я туда добавил еще кое-что, потом еще, и огород вырос настолько, что взял пару Галок (GAL16V8D), у одной не хватило ног, и прошил все это хозяйство в них. Это решение тоже имеет недостаток - Галки давно сняты с производства. На Али их, правда, вАлом, но все б/у, с разбора, и не все годные - попадаются как негодные сразу, так и, что самое плохое, теряющие прошивку через несколько месяцев или даже дней.

nzeemin
14.06.2020, 21:16
Может кто помочь с таким образом?
Да еще бы желательно так, чтоб все, если такое возможно, уместилось в 0 дорогу, те в 5120 байт.


В аттаче файл sysmin.dsk:


Filename Blocks Date Start Bytes
---------- ------ --------- ----- --------
RT11SJ.SYS 79 25-Feb-83 14 40448
SWAP .SYS 30 08-Jul-96 93 15360
TT .SYS 2 18-Mar-87 123 1024
MZ .SYS 4 15-Jan-90 125 2048
< UNUSED > 1471 129 753152
---------- ------ --------- ----- --------
4 files, 115 blocks
1471 free blocks

Загрузка в эмуляторе:


RT-11SJ (S) V05.02
?KMON-F-File not found DK:STARTS.COM

.

ZPilot
14.06.2020, 21:50
Да, кстати. ИМХО, запаивать на свою плату Черную Пилюлю - не лучшее решение. Я бы, по-простому, запаял туда STM-ку с обвязкой, и не морочил голову. И выбрал бы STM-ку с полноценным GPIO B, а не это 411-е убожество. Хотя бы F407RET6.
Все безобразие в том, что F407RET6 может с легкостью эмулировать всю УКНЦ :( Какой тогда смысл?
Черная пилюля стоит рублей 300, а самое главное, не нужно паять мелочевку. Я то ее припаяю, а кого-то просто нет такого оборудования. Разъем запаять проще и вставить в него блюпил.

Alex_K, AFZ, nzeemin и все кто мне помогает - спасибо вам огромное!!!

Что-то становится грустно когда пытаешься выявить косяк с 102 ошибкой.. Тк он случайный то: либо ловушка на связке 27с512+155ла3 пропускает запросы к портам 177130(2), либо STMка не успевает попасть в прерывание.
Я вот чего не понимаю, флопы к ВП1-128 подключаются разные, у них разные техданные, например, время перемещения головки. Как ВП1-128 говорит УКНЦ, что данные не готовы? Да я знаю есть 7 бит TR, но как его обрабатывает УКНЦ? Повторно шлет команду, или просто еще раз перечитывает?


Я тоже сначала ловил SYNC
У меня ПЗУ и ла3 ловят на ШДА обращения к портам 177130 и 177132, по ниспадающему SYNC, если это делать СТМкой, то некогда будет делать всю остальную работу.

Alex_K
14.06.2020, 22:00
Что-то становится грустно когда пытаешься выявить косяк с 102 ошибкой.. Тк он случайный то: либо ловушка на связке 27с512+155ла3 пропускает запросы к портам 177130(2), либо STMка не успевает попасть в прерывание.
Запросы к портам 0177130 и 0177132 ловятся прекрасно. Если бы не поймали, то на УКНЦ улетели бы в прерывание по 4-му вектору. Вот здесь бы точно ничего не работало.

ZPilot
14.06.2020, 22:04
а остальной обмен асинхронный - пока не ответишь RPLY,
Те пока не отпустишь?
Я просто стараюсь максимально быстро отпустить RPLY, если его можно задержать на по-дольше, то можно впихнуть разбор команды от УКНЦ и подготовку данных..
Это вообще допустимо?

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


Запросы к портам 0177130 и 0177132 ловятся прекрасно. Если бы не поймали, то на УКНЦ улетели бы в прерывание по 4-му вектору. Вот здесь бы точно ничего не работало.
Те я вовремя зажал RPLY? Если так, тогда прерывания успевают отработать ответы. Это радует! :)

Alex_K
14.06.2020, 22:05
А ошибка 102 свидетельствует о том, что за энное количество попыток (около 30) не удалось найти сектор с заданным номером. Т.е. попадался либо адресный маркер заголовка данных, либо сектор не с тем номером.

ZPilot
14.06.2020, 22:11
А ошибка 102 свидетельствует о том, что за энное количество попыток (около 30) не удалось найти сектор с заданным номером. Т.е. попадался либо адресный маркер заголовка данных, либо сектор не с тем номером.
А как такое возможно, да еще и в случайных местах-то?! Получается, что я где-то пропускаю команды, но чтоб 30 раз подряд.. Если брать реальный диск, то читаем сектор, считать не получилось, ждем пока диск сделает оборот или как?

Alex_K
14.06.2020, 22:42
А как такое возможно, да еще и в случайных местах-то?! Получается, что я где-то пропускаю команды, но чтоб 30 раз подряд.. Если брать реальный диск, то читаем сектор, считать не получилось, ждем пока диск сделает оборот или как?
Процедура поиска сектора довольно сложная. Почитайте мой труд "Контроллер дисковода УКНЦ", там расписано как работает драйвер дисковода в ПЗУ УКНЦ. Хотя, к сожалению, он у меня не дописан до конца.

Если найден адресный маркер заголовка данных, то драйвер УКНЦ программирует программируемый таймер на время прохождения головки над зоной данных плюс часть межсекторного промежутка. Через данное время произойдёт прерывание программируемого таймера, головка расположена уже за зоной данных, перед адресным маркером заголовка следующего сектора. Ищется синхрозона, это значит, что читаются нули. Поиск идёт не постоянно, а за заданное число прочитанных слов. Если нулевое слово не обнаружено, то поиск сначала. А если обнаружили, то даётся команда на поиск синхроимпульса.
Соответственно вопрос: через ваш эмулятор драйвер УКНЦ прочёл адресный маркер заголовка. В этом случае драйвер программирует таймер на время пропуска зоны данных. Какое слово в данном случае выдаст ваш эмулятор при следующем запросе - уже из зоны данных или дискета у вас всё-таки вращается?

ZPilot
14.06.2020, 23:13
Почитайте мой труд "Контроллер дисковода УКНЦ"
Вы не поверите, но это основной источник моих данных!


акое слово в данном случае выдаст ваш эмулятор при следующем запросе - уже из зоны данных или дискета у вас всё-таки вращается?
Весь вопрос какой запрос, если 2423 (для 0 дисковода), то выдаст: если был маркер сектора, то маркер данных, ну или если был маркер данных, то маркер заголовка следующего сектора.
Вращение я не делал. Хотя индексный импульс у меня эмулируется.

Вот картина testmz: https://pic.maxiol.com/?v=1592165831.528788891.20200614231610.jpg&dp=2
Ошибка всегда 102, других нет.

Alex_K
14.06.2020, 23:33
Весь вопрос какой запрос, если 2423 (для 0 дисковода), то выдаст: если был маркер сектора, то маркер данных, ну или если был маркер данных, то маркер заголовка следующего сектора.
Вращение я не делал. Хотя индексный импульс у меня эмулируется.
Вся соль ситуации состоит в том, что в ситуации по моему вопросу никакой записи в регистр 0177130 не делается. Регистр 0177130 анализируется только на предмет установки бита готовности, ну и читаются данные с регистра 0177132.
А раз вращения не делается, то следующими данными будут данные сектора. При таком раскладе синхрозоны не будет найдено, т.к. с большой долей вероятности будут читаться ненулевые данные. Ну а далее поиск сначала, с первого цикла. Есть ещё тонкий момент - при поиске в первом, втором и третьем циклах не анализируется бит готовности, а значит за примерно четыре чтения будет читаться одно и тоже слово, т.к. при реальном вращении дискеты новое слово ещё не успеет сформироваться. В вашем варианте скорее всего будут читаться новые слова, а значит легко проскочится синхрозона и по запросу поиска синхроимпульса весьма вероятно не будет найден маркер за этой синхрозоной, т.к. он мог быть прочитан простым чтением.
Да и регистр 0177130 не является регистром команд. Там дисковод управляется отдельными битами. Для поиска играет роль только бит 8. А так записываемые значения для нулевого привода могут быть не только 2423, но и 2463 для верхней стороны. Может остаться установлен бит направления шага, а это 2523 для низа, или 2563 для верха.

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


Хотя индексный импульс у меня эмулируется.
Индекс реально используется для форматирования. Для записи и чтения реально не применяется, он анализируется только при чтении секторов размером 1024 байта.

ZPilot
14.06.2020, 23:39
Да и регистр 0177130 не является регистром команд. Там дисковод управляется отдельными битами. Для поиска играет роль только бит 8. А так записываемые значения для нулевого привода могут быть не только 2423, но и 2463 для верхней стороны. Может остаться установлен бит направления шага, а это 2523 для низа, или 2563 для верха.
0177130 для записи - регистр команд (понятно, что команды там - биты), на чтение регистр - статуса, так?


то следующими данными будут данные сектора. При таком раскладе синхрозоны не будет найдено, т.к. с большой долей вероятности будут читаться ненулевые данные.
но реальный же дисковод ведет себя так же? Или ВП1-128 ведет себя как-то иначе?

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


при реальном вращении дискеты новое слово ещё не успеет сформироваться. В вашем варианте скорее всего будут читаться новые слова
Да, 100% будут, тк при обращении к 177132 снимется флаг готовности данных и контроллер сформирует новое слово, но если флаг не установлен, то формироваться слова не будут.
Я не понимаю, как тогда реальная вп1-128 такое обрабатывает? Те она всегда выставляет то слово, что у нее есть? УКНЦ сама переваривает что ей надо?

Alex_K
14.06.2020, 23:43
но реальный же дисковод ведет себя так же? Или ВП1-128 ведет себя как-то иначе?
Реальный дисковод является устройством реального времени и вращается, данные с него на контроллер поступают со скоростью 250 кБит/сек. Из этих данных контроллер аккуратно нарезает слова каждые 64 мкс. Если слово за этот промежуток прочитано не будет, то оно в контроллере замещается уже следующим прочитанным словом. А вот если с регистра 0177132 будут бесконечно читать, то в течении 64 мкс будет читаться одно и тоже слово, а в следующие 64 мкс уже другое.
Хотя реально чтение идёт байтами и каждые 32 мкс будут замещаться то младший, то старший байт.

ZPilot
14.06.2020, 23:51
А вот если с регистра 0177132 будут бесконечно читать, то в течении 64 мкс будет читаться одно и тоже слово, а в следующие 64 мкс уже другое.
Так зачем было делать чтение без проверки бита готовности?

В общем.. Мир мой рухнул, я не представляю как это можно эмулировать! Единственное привязать к таймеру и изменять значения в регистре 177132 только по истечении 64 микросекунд после чтения предыдущего, а за одно и бит готовности тогда же менять.

Остается только один вопрос, как обрабатывать команду GOR, у меня реакция на нее моментальная, сразу маркер.

Alex_K
14.06.2020, 23:58
0177130 для записи - регистр команд (понятно, что команды там - биты), на чтение регистр - статуса, так?
По записи 0177130 это не регистр команд. Это регистр управления отдельными линиями дисковода. К самому контроллеру по записи имеют отношения только бит 8 (GOR), и в некоторой степени бит шага ST, который контроллер автоматически сбрасывает через примерно одну мкс. Все остальные выводы являются параллельным портом и выводятся прямо на дисковод.
1801ВП1-128 не является интеллектуальным контроллером, в отличии от Intel 8271.

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


Так зачем было делать чтение без проверки бита готовности?
А потому что неизвестно в каком режиме находится контроллер - уже в режиме чтения или ещё в режиме поиска маркера. В режиме поиска маркера бит готовности не устанавливается до тех пор, пока не будут найден маркер. И если бы драйвер дисковода перед чтением регистра данных всё время анализировал бы бит готовности, то в некоторых ситуациях он мог подвиснуть в режиме опроса регистра состояния. А после нахождения маркера контроллер переходит в режим чтения и аккуратно, каждые 64 мкс, нарезает слова.

ZPilot
15.06.2020, 00:06
то в некоторых ситуациях он мог подвиснуть в режиме опроса регистра состояния. А после нахождения маркера
так он бы мог повиснуть и в режиме чтения из 177132, какая разница-то какой регистр анализировать?

AFZ
15.06.2020, 06:12
Я просто стараюсь максимально быстро отпустить RPLY, если его можно задержать на по-дольше, то можно впихнуть разбор команды от УКНЦ и подготовку данных..
Это вообще допустимо?Когда процессор посылает DIN или DOUT, одновременно он запускает счетчик тайм-аута и ждет низкого уровня на линии RPLY. Если тайм-аут (около 10 мкс) прошел, а RPLY не прибежал, процессор считает, что адресованного абонента на шине нет и возбуждает Trap to 4. Получив же RPLY, процессор выполняет требуемые действия с данными и шиной (в частности, снимает DIN/DOUT) и ждет окончания RPLY, то есть, высокого уровня на нем. Ждет бесконечно, тайм-аут здесь не предусмотрен, это реальный способ завесить МПИ намертво.

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

Естественно, все эти задержки - это тормоза для процессора.

В общем.. Мир мой рухнул, я не представляю как это можно эмулировать! Единственное привязать к таймеру и изменять значения в регистре 177132 только по истечении 64 микросекунд после чтения предыдущего, а за одно и бит готовности тогда же менять.Во-первых, Никита (nzeemin) предлагал посмотреть, как он реализовал это дело в своём эмуляторе УКНЦ. И, во-вторых, при таком раскладе действительно, надо будет во время "шагов" (минимум - 3 мс) вычитать дорожку в оперативку, а потом в фоне проигрывать ее через эмулируемые регистры, а на обмен с ПП УКНЦ отвлекаться по прерываниям (EXTI по DIN или DOUT), SYNC же придется ловить аппаратно. ИМХО. А жаль, я надеялся, что можно будет ускорить это дело. Тупая все-таки железка, этот ВП1-128...

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

То есть,вычитывать надо обе дорожки цилиндра, на котором стоит головка. 20 секторов по 0.5 К = 10К, вполне терпимо.

nzeemin
15.06.2020, 12:43
В эмуляции дисковода есть ещё одна небольшая проблема, на которую я лично просто забил.
После записи на дорожку, в любой из секторов, я только меняю данные в памяти и отмечаю себе что была запись.
Реальная запись всей дорожки происходит только при следующей смене стороны/дорожки, либо при отключении образа диска. Делается это для того чтобы не насиловать диск, записывая мелкими блоками по 512 байт. Это означает, что при неудачной записи изменений в образе на винчестер хоста, если вдруг произойдут ошибки - то внутри эмулятора мы этого не узнаем.
Т.е. обработка ошибок в этом месте не на высоте, к сожалению. И я тут как бы не понимаю как можно было бы в принципе сделать лучше.
Конечно, надёжность современных носителей такова что подобные проблемы это очень редкий случай.

AFZ
15.06.2020, 15:55
В эмуляции дисковода есть ещё одна небольшая проблема, на которую я лично просто забил.
После записи на дорожку, в любой из секторов, я только меняю данные в памяти и отмечаю себе что была запись.
Реальная запись всей дорожки происходит только при следующей смене стороны/дорожки, либо при отключении образа диска.Я предлагаю держать в памяти не дорожку, а цилиндр. Это на писюке запись быстрая. Писать, когда процессор - МК с ограниченными ресурсами, а носитель - микро-SD, это миллисекунды. УКНЦовина же будет ожидать (почти) мгновенного переключения стороны диска (головки).

И еще я бы в "железном" эмуляторе добавил сброс записанного материала после тайм-аута секунды в три - мы же не в состоянии отловить макрокоманду .CLOSE, отрабатываемую на ЦП. Закрыла программа выходной файл и успокоилась, а машинку возьмут, да и выключат. Да и светодиод красный приделать: мол, запись идет, пока не погаснет, не выключай! Ну в самом деле, не цеплять же туда еще и батарейку...


Т.е. обработка ошибок в этом месте не на высоте, к сожалению. И я тут как бы не понимаю как можно было бы в принципе сделать лучше.
Конечно, надёжность современных носителей такова что подобные проблемы это очень редкий случай. Ну да, тут, фактически, кэширование с отложенной записью. Причем для программы и ОС ничего об этом кэшировании не знающими. И ОС, и программа, давно получили уведомления, что все ОК и так же давно забыли, что вообще что-то писали, а тут, вдруг, вылезает такая радость. ИМХО, если что-то делать, то это надо делать на надсистемном уровне, т.е ругаться должна не эмулируемая программа или ОСь, а сам эмулятор. Неважно, программный он на писюке, или программно-аппаратный на МК.

ZPilot
15.07.2020, 07:59
Alex_K,
Вот до чего я докатился:

Случайное чтение секторов:
https://pic.maxiol.com/images2/1594789082.528788891.img20200715wa0004j.jpg
Последовательное чтение:
https://pic.maxiol.com/images2/1594789339.528788891.20200713221050.jpg
Данные дорожки:
https://pic.maxiol.com/images2/1594789386.528788891.20200715073452.jpg
Результат теста случайного чтения секторов:
https://pic.maxiol.com/images2/1594789436.528788891.img20200715wa0004j.jpg
Карта теста:
https://pic.maxiol.com/images2/1594789475.528788891.img20200715wa0002j.jpg
Видео работы:
https://cloud.mail.ru/public/C7Vn/KhbSw46xk

Но радости от это полный швах! :( Почему? а вот почему:

При загрузке с любого образа:
https://pic.maxiol.com/images2/1594789575.528788891.20200715075730.jpg
При загрузки с минимального образа который сделал уважаемый nzeemin:
https://pic.maxiol.com/images2/1594789656.528788891.20200715075251.jpg
При загрузке с чистого образа:
https://pic.maxiol.com/images2/1594789716.528788891.20200715075031.jpg

Может кто подскажет почему и что происходит?

Пока ждал ответов понял в чем проблема, а проблема эта в том, что.. Ох,проще показать чем написать:

if(*UPDATE && *POS>0x2E ) //91
{
GPIOC->BSRR|=LED_Pin<<16;
readfromsd();
//readfrommemdsk();
copytrk();
*UPDATE=0;
GPIOC->BSRR|=LED_Pin;
}

Это единственная функция, которая выполняется не в прерываниях. Те ее прерывают прерывания, извините за тавтологию, а там проиходит чтение из СД-карты, ну и из-за того, что ее прерывают чтение происходит с ошибками, когда заменил функцию readfromsd() на readfrommemdsk() которая читает из внутренней памяти STMки, все загрузилось.

https://pic.maxiol.com/images2/1594797835.528788891.20200715102344.jpg

Arseny
15.07.2020, 11:43
Это единственная функция, которая выполняется не в прерываниях. Те ее прерывают прерывания, извините за тавтологию, а там проиходит чтение из СД-карты, ну и из-за того, что ее прерывают чтение происходит с ошибками, когда заменил функцию readfromsd() на readfrommemdsk() которая читает из внутренней памяти STMки, все загрузилось.
А как идет синхронизация внутренней памяти STMки и образа? Не потеряется ли информация при случайном глюке?

ZPilot
15.07.2020, 15:39
А как идет синхронизация внутренней памяти STMки и образа? Не потеряется ли информация при случайном глюке?
А ни как не идет, информация во внутренней памяти это DSK-файл записанный во внутреннюю память СТМки, те я не читаю из СД-карты в этот момент, а читаю только из ПЗУ СТМ. В общем это говорит о том, что все работает кроме правильного чтения из СД.
Печально, что ДМА не помог..

Arseny
15.07.2020, 16:15
А ни как не идет, информация во внутренней памяти это DSK-файл записанный во внутреннюю память СТМки, те я не читаю из СД-карты в этот момент, а читаю только из ПЗУ СТМ. В общем это говорит о том, что все работает кроме правильного чтения из СД.
Печально, что ДМА не помог..
Тут есть как минимум 2 решения - разобраться чтением с SD (если это возможно) или работать дальше с образом в ОЗУ STM. Только добавить возможность скидывать образ из ОЗУ на SD при отключении питания (тот же ионистор прикрутить).

AFZ
15.07.2020, 17:20
Так читать SD надо во время "шагов" "головки" Поступила команда "Шаг вперед" (или назад), читаем в ОЗУ все 20 секторов этого цилиндра с файл-образа на SD-шке, а далее в цикле проигрываем их через регистры эмулируемой ВП1-128. Попросили записать, изменяем информацию в соответствующих местах буфера и ставим метку "была запись". Пришел новый "шаг", смотрим метку "была запись", если была, сбрасываем нужные места на файл-образ, затем читаем следующий цилиндр. Один шаг минимально составляет 3 мс, если за это время выйдет записать старый цилиндр и прочитать следующий, то все ОК. То есть, разделить во времени обмен с SD и обмен с УКНЦ. Тем более, что программа обслуживания дисков, считая, что она через 128-й работает с обычным дисководом, все равно будет тупо ждать 3хN мс, пока дисковод переместит головку на следу.щую дорожку. (N здесь - set-параметр STEP драйвера MZ, 1-6. Или 3-18, если у этого драйвера шаги задаются в мс, а не в условных единицах, есть и такие драйверы).

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

Да, и еще, поставив метку "была запись", следует взвести таймер секунды на три, если за это время не поступит сигнал "шаг", надо будет сбросить на SD-шку измененное состояние дорожек эмулируемого диска.

ZPilot
15.07.2020, 17:51
Так читать SD надо во время "шагов" "головки" Поступила команда "Шаг вперед" (или назад), читаем в ОЗУ все 20 секторов этого цилиндра с файл-образа на SD-шке, а далее в цикле проигрываем их через регистры эмулируемой ВП1-128.
Я почти так и делаю, только читаю 10 секторов одной стороны. Правда я не сразу при перемещении дороги читаю, тк иногда драйвер ФДД УКНЦ просто пробегает по дорожкам не читая их, по этому жду когда чтение на дороге перевалит 1й маркер и начинаю читать, корости СДшки вполне хватает прочитать 512 байт до начала чтения участка данных. Номера секторов всегда стандартны, я при перемещении головы в буфере только № дорожки меняю.

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


Тут есть как минимум 2 решения - разобраться чтением с SD (если это возможно) или работать дальше с образом в ОЗУ STM. Только добавить возможность скидывать образ из ОЗУ на SD при отключении питания (тот же ионистор прикрутить).
Увы, памяти (ОЗУ) всего 128кБ.

AFZ
15.07.2020, 19:27
читаю 10 секторов одной стороны.Так переключение стороны диска в оригинале, практически, мгновенное. В отличие от перемещения головки. Поэтому, если за время шага прочитать обе стороны дорожки, то потом, пока идет их передача в УКНЦ, ничего читать с СД-шки не надо. То есть, пока ПП ждет, когда дисковод сделает шаг, он не смотрит, что там поступает с головки - оттуда же, при ее (головки) перемещении, ничего внятного поступить не может. Потом же, когда ПП приступит к анализу читаемой дорожки, она уже целиком будет в ОЗУ МК, и, пока все эти 20 секторов не будут обработаны, информация с СД-шки понадобиться не может и все прерывания и прочие дела, связанные с СД-шкой можно просто отключить. А на время шага отключить всё, связанное с передачей данных в УКНЦ. То есть, пока читаем СД-шку, нам не будет мешать всё, связанное с эмуляцией ВП1-128, а когда эмулируем эту 128-ю, нам не будет мешать обмен с SD, и можно будет полностью исключить влияние этих процессов друг на друга.

Alex_K
15.07.2020, 20:58
Alex_K,
Вот до чего я докатился:
Молодец!!!
Так "диск" теперь вращается или так же передаются данные?

ZPilot
15.07.2020, 21:20
Так "диск" теперь вращается или так же передаются данные?
По сути да, выдавая данные каждые 64 микросекунды, ну кроме моментов перемещения головки, там чуть задержка есть на расчет дорожек, но я думаю это допустимо, тк реальный дисковод уж точно головой медленнее двигает.
Но теперь я не могу нормально считать данные с флешки.. прерывания..

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


А на время шага отключить всё, связанное с передачей данных в УКНЦ. То есть, пока читаем СД-шку, нам не будет мешать всё, связанное с эмуляцией ВП1-128, а когда эмулируем эту 128-ю, нам не будет мешать обмен с SD, и можно будет полностью исключить влияние этих процессов друг на друга.
Если не ответить на обращение к 177130(2) то УКНЦ выдаст ошибку шины, но я попробую считать обе стороны.

AFZ
16.07.2020, 06:22
Если не ответить на обращение к 177130(2) то УКНЦ выдаст ошибку шиныУКНЦовую программу чтения через -128 я не разбирал. А вот в MY - там по-простому: выдали импульс "Шаг", переслали в регистр заранее подготовленную константу и SOB по нему на себя самого. И никаких проверок по 177130/132...

ZPilot
16.07.2020, 17:27
выдали импульс "Шаг", переслали в регистр заранее подготовленную константу
Вот если вы не ответите на эту константу вовремя, получите трап4.

ZPilot
16.07.2020, 22:49
Всё страньше и страньше! Всё чудесатее и чудесатее! Всё любопытственнее и любопытственнее! Всё страннее и страннее! Всё чудесится и чудесится!@Алиса


Это минимальный образ системы от уважаемого nzeemin
https://pic.maxiol.com/images2/1594928390.528788891.img20200716wa0000j.jpg

А это загрузочный образ с бейсиком:
https://pic.maxiol.com/images2/1594928536.528788891.20200716222440.jpg


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

Судя по тексту 22 цилиндра прочитал.

hobot
16.07.2020, 23:49
А это загрузочный образ с бейсиком:
ну там надо копать на какой конкретно строке стартового файла вылет ?

AFZ
17.07.2020, 07:38
Вот если вы не ответите на эту константу вовремя, получите трап4.То есть?
BIS #200,2(R3) ; Установить бит шага в копии РСН
MOV 2(R3),@R4 ; Сделать шаг
MOV 24(R3),R0 ; R0 = время шага
BIC #200,2(R3) ; Сбросить бит шага в копии РСН
7566$: SOB R0,7566$ ; Цикл ожидания Вот, пересылаем в R0 константу (вернее не константу, а заранее рассчитанное число) и ждем командой SOB самой на себя. На что здесь отвечать?

Это из MY. В УКНЦ посложнее, там, кроме обслуживания ВП1-128 нужно заниматься еще кучкой оборудования, например, видеоконтроллером, поэтому у УКНЦ ожидание не такое тупое - они выходят по RTI, а ожидание делается, похоже, аппаратным таймером (не вникал). Но, по-любому, пока головка движется, принимать с нее информацию нет смысла, а сигналов, свидетельствующих об окончании движения головки в интерфейсе флопиков НЕТ! Поэтому, только ждать, смотреть в регистры 177130/132 бесполезно.


Всё страньше и страньше! Всё чудесатее и чудесатее!Мне это дело больше нравится в редакции Высоцкого: "Все чудесатее и страньше. Нет, чудестраньше. Ах, я заблуждаюсь!.." :)

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

Я вижу еще пару "подводных камней".

Во-первых, запись. При записи надо будет просто заменить информацию нужных секторов в буфере и пометить этот факт флажком, а при шаге на другую дорожку, перед считыванием нового цилиндра, сбросить по этому флажку измененный цилиндр (или измененные сектора цилиндра) на СД-шку. Вопрос, успеет ли пройти запись этого цилиндра и считывание нового за время одного шага?

И, во-вторых. КМД-УК может обслуживать 4 накопителя. Вопрос: будет ли время на считывание цилиндра при смене накопителей? Он же может стоять уже на нужной дорожке, так, что шаги не потребуются. Впрочем, буфер цилиндра всего 10К, а оперативки у МК 128К, да? Так, что, вероятно, можно выделить каждому накопителю свои 10К на индивидуальный буфер...

Да, кстати, напоминаю. Хоть у ВП1-128 сделаны 4 бита "выбор накопителя", по одному на каждый из доступных накопителей на интерфейсе Shugart, в КМД-УК на два (младших?) бита поставили дешифратор и передают номер накопителя двоичным числом в этих двух битах, а два других бита заняли управлением прекомпенсацией

ZPilot
17.07.2020, 11:18
Вот, пересылаем в R0 константу (вернее не константу, а заранее рассчитанное число) и ждем командой SOB самой на себя. На что здесь отвечать?
Когда УКНЦ пишет в порт 177130 значение, чтобы, например, передвинуть головку, она делает следующее: SYNC-DOUT и ждет RPLY, если RPLY не ответит, то трап4. А чтобы сделать RPLY СТМка должна прижать соответствующий пин к земле. Тк это обязательные по времени операции, то они сделаны в прерываниях с максимальным приоритетом. Для этого мне даже пришлось все системные приоритеты понизить.


И, во-вторых. КМД-УК может обслуживать 4 накопителя. Вопрос: будет ли время на считывание цилиндра при смене накопителей?
Ммм.. тут УКНЦ ведет себя так, при переключении на другой привод она заново читает нужную ей дорожку. Таким образом времени нужно столько же, сколько и просто на текущее считывание, а времени у СТМ на выбор из какого файла читать, нужно тактов 10.

бита поставили дешифратор и передают номер накопителя двоичным числом в этих двух битах,
С 3-мя накопителями именно так.. 4-й вроде, на 10 бите. Тк 3 у меня работали, а 4 нет.. но мне было не до него.

Сейчас у меня 1 большая проблема, которую я не знаю пока как решить:
https://pic.maxiol.com/images2/1594974451.528788891.img20200716wa0004j.jpg
Те УКНЦ думает, что считала 65 дорогу, а в реальности считалась 57, а может считаться и любая другая и не обязательно на 65 дорожке.
Это происходит после чтения некоторого кол-ва дорожек.

ZPilot
17.07.2020, 13:52
Извините, но я с читил:
https://cloud.mail.ru/public/4bfc/3E13W5Dg3

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

UP: Ускорил загрузку с диска, раз в 5. Для этого исключил чтение с СД-карты когда УКНЦ просто передвигает головки не читая цилиндр.

https://cloud.mail.ru/public/5uJa/2dogvt44G

AFZ
17.07.2020, 14:08
Когда УКНЦ пишет в порт 177130 значение, чтобы, например, передвинуть головку, она делает следующее: SYNC-DOUT и ждет RPLY, если RPLY не ответит, то трап4.Естественно. Но, выдав этот бит "Шаг" (вторая строчка в приведенном фрагменте, MOV 2(R3),@R4, в R4 в это время 177130), программа на 3 мс минимум забывает о существовании оборудования по адресу 177130/132. То есть, она считает, что ШД головки стартовал и до окончания его шага смотреть на ВП1-128 бесполезно. Вот, в течение этих 3 мс и можно делать все, что угодно - нового обращения не будет. То есть, увидев, что ПП УКНЦ записывает единичку по маске 0200 в CSR (130), можно спокойно забыть об отслеживании МПИ и вспоминать об этом только через 2.8 мс (0.2 мс оставим про запас).


Ммм.. тут УКНЦ ведет себя так, при переключении на другой привод она заново читает нужную ей дорожку. Таким образом времени нужно столько же, сколько и просто на текущее считывание, а времени у СТМ на выбор из какого файла читать, нужно тактов 10.Мы же, вроде-бы, договорились, что читать-писать SD-шку следует только во время шагов, когда ПП на 3 мс забывает о ВП1-128. А при переключении накопителей головка запросто может оказаться на нужной дорожке, и ПП сразу захочет ее читать, а ее еще нет в памяти...


С 3-мя накопителями именно так.. 4-й вроде, на 10 бите. Тк 3 у меня работали, а 4 нет.. но мне было не до него.Посмотрел схему, биты DS0 и DS1 (ноги 41 и 40 ВП1-128) идут прямо на А0 и А1 м/с 555ИД7. Ей же на А3 приходит сигнал REZ (30 нога 128-й). Вообще-то, этот REZ в MY используется для включения прекомпенсации, но в УКНЦ ее повесили прямо на ноги DS2 и DS3 - не помню, но у них там не то 2, не то 4 уровня прекомпенсации, сейчас вспоминать не хочу. А REZ, как свободный триггер, управляемый с ПП, здесь задействован, как сигнал "не выбран ни один накопитель".


Те УКНЦ думает, что считала 65 дорогу, а в реальности считалась 57Где-то кто-то сбился. И, может быть, из-за попыток читать карточку во время обмена с УКНЦ. Я бы, все-таки, читал СД-шку СТРОГО во время шагов.

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


UP: Ускорил загрузку с диска, раз в 5. Для этого исключил чтение с СД-карты когда УКНЦ просто передвигает головки не читая цилиндр.Что-то не так, шаг должен выполняться 3 мс, независимо от того, что там на дорожках. Или чтение идет слишком долго (может быть нужно читать сразу блоком в 20 секторов), или еще что-то некорректно работает.

ZPilot
17.07.2020, 14:44
, программа на 3 мс минимум забывает о существовании оборудования по адресу
Я всегда путаюсь в размерах, 3 мс это 3 микросекунды или мили?


Мы же, вроде-бы, договорились, что читать-писать SD-шку следует только во время шагов
Посмотрите мое предыдущее сообщение, особенно видео, и вы поймете в чем разница при чтении во время перемещения и когда УКНЦ реально начинает читать диск.


из-за попыток читать карточку во время обмена с УКНЦ.
Да, так и есть.. потому.. с читил.. :(

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

Даже за 3 миллисекунды я не успею считать 10240 байт, тк за это время надо вычислить номер цилиндра, высчитать смещение в файле, сделать f_lseek и выполнить чтение в буфер, а потом раскидать этот буфер в трек. Что самое обидное, так это то, что f_lseek выполняется почти с такой же скоростью, что и чтение.

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

Alex_K, ошибок в testmz нет ни при последовательном чтении, ни при случайном чтении секторов.

hobot
17.07.2020, 16:43
Это происходит после чтения некоторого кол-ва дорожек.
извините, что встреваю,
но мне сразу вспомнилась из программы UKDSKP
процедура выравнивания по нулевой или последней?
или это совсем совсем другое?

AFZ
17.07.2020, 16:55
Даже за 3 миллисекунды я не успею считать 10240 байтДа, мс - это миллисекунды, микросекунды - это мкс. Грустно.


тк за это время надо вычислить номер цилиндра, высчитать смещение в файле,Это ерунда, единицы мкс, если не меньше.


сделать f_lseek и выполнить чтение в буфер
Что самое обидное, так это то, что f_lseek выполняется почти с такой же скоростью, что и чтение. Вероятно, под ногами путается чтение FAT. В принципе, если залезть в FATFS, и учитывая, что размер дискеты - 1600 блоков, ФАТ для файла можно загрузить сразу весь - это максимум, 6400 байтов. А, скорее всего, гораздо меньше - кластер-то не в один сектор. Естественно, преобразовать в какой-то внутренний формат...

И вообще, если попробовать читать сразу 20 секторов одним вызовом, может быстрее будет?


а потом раскидать этот буфер в трекА на лету не выйдет?

ZPilot
17.07.2020, 19:10
или это совсем совсем другое?
Тут просто происходил какой косяк, пока контроллер читал данные с СДшки, УКНЦ прочитала нужную синхрометку (контроллер успевает отвечать нужными данными), получила номер дорожки, поняла, что ей нужна другая дорожка и послала команду переместить головку, а чтение с СД-карты еще продолжалось..

hobot
17.07.2020, 19:12
Тут просто происходил какой косяк, пока читалось с СДшки УКНЦ прочитала нужную синхрометку, получила номер дорожки, поняла, что ей нужно дальше, а чтение с СД-карты еще продолжалось..
очень слежу за вашей разработкой - считаю это самым полезным навесным железом последнего времени для УК-НЦ !!!

ZPilot
17.07.2020, 19:34
Это ерунда, единицы мкс, если не меньше.
Это да.

FAT. В принципе, если залезть в FATFS
Нет ни какого смысла кэшировать ФАТ, чтение все равно происходит блоками по 512 байт (так уж устроена СД), перед каждым.. ну почти каждым блоком, СД-карте нужно передать команды. Одна из долгих операций это f_lseek, тк она переключат последовательно блоки по 512 байт пока доберется до нужного.
Если взять другой контроллер, чтоб памяти хватило или ее можно было подключить дополнительно, чтоб имидж диска влезал целиком.. но тогда теряется весь смысл моей затеи.
В принципе, на данный момент, меня устраивает решение с задержкой RPLY на время считывания цилиндра с СД-карты, на скорость работы это почти не влияет, тк чтение происходит 1 раз на цилиндр.
Если у кого подключен реальный флопик или готек, засеките скорость загрузки для этого образа: RT11QQfix.dsk
Есть еще одна просьба. Есть у меня идея, да простят меня любители ДВК-подобных машин, притыренная с Корвета, как сделать выбор и монтирование образов с СД-карты. Ткните носом где можно почитать как на диске хранятся имена файлов и их тела, каталог.

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


очень слежу за вашей разработкой - считаю это самым полезным навесным железом последнего времени для УК-НЦ !!!
Спасибо.

hobot
17.07.2020, 20:06
Ткните носом где можно почитать как на диске хранятся имена файлов и их тела, каталог.
вопрос про СД или про файловую с. RT-11
https://l.wzm.me/_faq/etc/_etc/OS_theory/Glava%2011/Index7.htm

AFZ
17.07.2020, 20:40
Ткните носом где можно почитать как на диске хранятся имена файлов и их тела, каталог.У тов. Чана в его Application Interface (http://elm-chan.org/fsw/ff/00index_e.html)

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

Конкретно - вызовы f_opendir, f_closedir, f_readdir, f_stat

ZPilot
17.07.2020, 20:57
hobot, AFZ, я имел ввиду RT-11 и ее производные.

hobot
17.07.2020, 21:12
я имел ввиду RT-11 и ее производные.
см. ссылку мою последнюю выше (https://zx-pk.ru/threads/29614-uknts-otsutstvie-mikroskhemy.html?p=1072990&viewfull=1#post1072990) там как раз об этом вроде бы )))

ZPilot
17.07.2020, 21:42
там как раз об этом вроде бы
Я посмотрел, сравнил с DSK и не увидил соответствия. В описании каталог находится в самом начале диска, а в ДСК имидже я его не вижу..

Alex_K
17.07.2020, 22:00
см. ссылку мою последнюю выше (https://zx-pk.ru/threads/29614-uknts-otsutstvie-mikroskhemy.html?p=1072990&viewfull=1#post1072990) там как раз об этом вроде бы )))
Нету ничего полезного по данной ссылке. Так сказано пару слов, что мол существует такая файловая система, а описания формата нет.

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


Я посмотрел, сравнил с DSK и не увидил соответствия. В описании каталог находится в самом начале диска, а в ДСК имидже я его не вижу..
Про формат файловой системы RT-11 можно прочесть здесь (http://era-cg.su/grands/doc/dvk/blk_dev.htm). Самих имен файлов в каталоге вы не увидите, т.к. они закодированы в Radix-50, в двух байтах три символа.

hobot
17.07.2020, 22:11
Нету ничего полезного по данной ссылке.


Про формат файловой системы RT-11 можно прочесть здесь. (http://era-cg.su/grands/doc/dvk/blk_dev.htm) Самих имен файлов в каталоге вы не увидите, т.к. они закодированы в Radix-50, в двух байтах три символа.



Самих имен файлов в каталоге вы не увидите,
это смотря чем смотреть.
и ещё https://zx-pk.ru/threads/21137-fajlovaya-sistema-rt-11.html?p=593313&viewfull=1#post593313 в этом разделе почитать

Alex_K
17.07.2020, 22:16
это смотря чем смотреть.
В DESS-е я их увижу, когда переключу на просмотр в RADIX-50.

ZPilot
17.07.2020, 22:52
Спасибо за помощь!!
Я немного объясню, что я хочу сделать. У УКНЦ можно использовать 4 FDD, это очень много и наверное не надо. Поэтому, я хочу отдать 4 диск под виртуальный диск, который будет содержать список DSK образов с СД-карты и 1 файл с командой mount. Если запустить mount с параметрами: mount name.dsk 0, то в 0 привод смонтируется name.dsk. mount должен отослать 1 слово в порт 177130 (команду в которой задействованы неиспользуемые биты), а второе слово (в 177132) будет содержать порядковый номер name.dsk на СД-карте и номер привода, по идее можно указать 8191 образов.
Если кто поможет с написанием mount.sav, буду очень признателен!
Да, список образов будет выводится стандартной командой DIR, по этому я и разбираюсь со структурой файловой системы.

Hunta
17.07.2020, 23:26
Название MOUNT для программы весьма не подходит, так как в RT есть команда MOUNT

ZPilot
17.07.2020, 23:28
Название MOUNT для программы весьма не подходит
Пусть будет mntsdk.sav, я не против! :)

Alex_K
17.07.2020, 23:32
по идее можно указать 8191 образов.
....
Да, список образов будет выводится стандартной командой DIR, по этому я и разбираюсь со структурой файловой системы.
В одном сегменте каталога может быть максимум 72 записи о файлах. Максимальное число сегментов - 31. Итого 72 * 31 = 2232 имен файлов.
Тем более по каталогу файлы занимают место. Даже по одному блоку выходит 2232 блока плюс 62 блока на каталог, и ещё 6 локов в начале, всего 2300 блоков. А дискета УКНЦ всего 1600 блоков. Дискету можно сделать большой виртуальной, но дорожек может быть максимум 128, отсюда 128 дорожек * 2 стороны * 10 секторов = 2560 блоков.

hobot
18.07.2020, 00:30
ZPilot, то есть три кармана [0/1/2], а как с образами 400кб и 800кб - будут распознаны только 819200 размером???



Если кто поможет с написанием mount.sav, буду очень признателен!
Ярик писал что то такое http://y-salnikov.github.io/uknc_sd_fdd/
https://github.com/y-salnikov/uknc_sd_fdd/blob/master/PDP-11/rt-11/chdisk.mac

- его проект не прошёл тест на местах, тупо не заработал на 5-ти Зеленоградских машинках у меня и у соседа.
А надежд было миллион )

nzeemin
18.07.2020, 00:39
ZPilot, может вам мои исходники утилиты rt11dsk помогут?
https://github.com/nzeemin/ukncbtl-utils/blob/master/rt11dsk/diskimage.cpp

AFZ
18.07.2020, 17:14
Пусть будет mntsdk.sav, я не против!MZMNT. Я для своего AZ в дальних планах держу AZMNT.

ZPilot
18.07.2020, 21:02
. Максимальное число сегментов - 31. Итого 72 * 31 = 2232 имен файлов.
Я написал максимальное число которое можно передать в 1 слове (-3 бита на номер диска), те теоретически возможное. Есть вообще-то большая проблема с самими СД-картами, я пока не разобрался, но работают не все, да и объёмом пока до 4 гиг, так что предел 5 образов :) мало.. но я повторюсь, это на данный момент не главное.

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


а как с образами 400кб и 800кб
пока я сделал только 800 кБ, но если при монтировании файла получить его размер.. то можно было бы и 40 дрожечный эмулировать, вот только у УКНЦ есть железный пин 40/80. Как быть с ним?

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


может вам мои исходники утилиты rt11dsk помогут
Супер!!! Конечно помогут!

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

Спасибо всем за помощь и поддержку!

Alex_K
18.07.2020, 21:09
да и объёмом пока до 4 гиг, так что предел 5 образов мало..
Вообще-то если 4 гигабайта разделить на 800 килобайт, то получится 5242. ОЧЕНЬ МНОГО!!!

hobot
18.07.2020, 21:21
ZPilot, вообще то 40 дорожек и всё это наследие НГМД-6022 никчему!
Главное позже, если и когда всё будет летать и работать - чётко в описании указать - написать, ведь переделать 400кб в 800кб - это легко в любом эмуляторе (кроме эмулятора Титуса! ) ИМХО: ваша задумка с номером 3 - помоему вы усложняете себе жизнь, задачу - уверен есть гораздо проще вариант всё организовать.

ZPilot
18.07.2020, 21:28
Вообще-то если 4 гигабайта разделить на 800 килобайт, то получится 5242. ОЧЕНЬ МНОГО!!!
:) тяжелые трудовые будни и все такое.. игрушки в детстве были тоже бетонными.. вот в старости и сказывается.

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


с номером 3 - помоему вы усложняете себе жизнь,
Вы о монтировании через 4 виртуальный привод?

hobot
18.07.2020, 22:33
Вы о монтировании через 4 виртуальный привод?
да! с точки зрения пользователя 4 кармана удобнее и универсальней чем 3 !!!
предоставив пользователю все 4 кармана , вы позволите удобную раб. среду организовать,
простой пример : 0/1 - система / проект 2/3- игровые пакеты

ZPilot
18.07.2020, 22:43
да! с точки зрения пользователя 4 кармана удобнее и универсальней чем 3 !!!
Хорошо, а как бы сделали вы?
У меня, в принципе, все разведено под и2с дисплей и 3 кнопки, но это тоже мне не нравится, пользователь может захотеть перемонтировать файл во время обращения к контроллеру, а это очень плохо..

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

А СТМка уже не в состоянии переварить одновременно и обработку кнопок, экрана и обслуживание 177130(2) регистров.

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

Да и вообще с кнопками в этом слоте не удобно.. Качается же все.

hobot
18.07.2020, 22:50
а это очень плохо..
недопустимость смену образов во время чтения\записи - очевидна!!!
а как на железном готеке??? Я же листаю там образы и даже флешку вроде можно вынуть воткнуть без выключения устройств??? давненько не пользовался...
может быть индикатор busy ??? Я не знаю, на реальном готеке я вижу только номер на экранчике, что это это за образ конкретно - моя головная боль.


Да и вообще с кнопками в этом слоте не удобно.. Качается же все.
ндя - это так ... ну хорошо привод 3 это виртуальный образ , может быть работать там с текстовым файлом, а не с корневым каталогом?

ZPilot
18.07.2020, 23:03
а как на железном готеке??? Я же листаю там образы и даже флешку вроде можно вынуть воткнуть без выключения устройств???
Я не помню как ведет себя Готек, но Готек это не контроллер, представьте, что будет если вы из флопика на ходу вытащите диск? Ну максимум будет хана диску, ну совсем при не удачном стечении обстоятельств, вы повредите головки у флопика. А теперь представьте, что вместо диска вы вытащили на ходу контроллер ФДД, тот который со вп1-128, что будет? У меня конечно не так, но может получится так, что ВА87 останутся включенными на передачу данных, а входы будут, например, висеть в 1, получим низкий уровень на ШДА УКНЦ.

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


может быть работать там с текстовым файлом, а не с корневым каталогом?
Да тут, в принципе, без разницы. Что каталог делать, что файл записывать на виртуальный диск.

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

я, кстати, тоже думал сделать по принципу Готека, показать при старте кол-во файлов и потом просто перебирать их кнопкой, но, зараза, качается же плата в слоте.. корпрус надо делать, а он получится не простой.

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

Вот как выглядит контроллер:

https://pic.maxiol.com/images2/1595102537.528788891.20200718230250.jpg

hobot
18.07.2020, 23:11
я, кстати, тоже думал сделать по принципу Готека, показать при старте кол-во файлов и потом просто перебирать их кнопкой, но, зараза, качается же плата в слоте.. корпрус надо делать, а он получится не простой.
можете пока подробнее описать схему работы с вирт. диском и монтированием образов прямо из под системы? что то этот момент совсем не явный для меня,
у контроллеров Ярика был свой стартовый-настроечный экран (благополучно зависающий 9 раз из 10)

фото впечатляет.
хочется 4 кармана - жадный я да?

ZPilot
18.07.2020, 23:11
Для виртуального диска мне всего лишь надо создать DSK-файл где каталог будет содержать имена файлов с СД.
Кстати, может кто подключится к проекту, накидает на Си функцию принимающую на вход текстовую строку и запихиваюшую ее в каталог ДСК-файла?

hobot
18.07.2020, 23:15
DSK-файл где каталог будет содержать имена файлов с СД.
лучше динамический текстовый файл, максимальный размер 1586 блоков
имхо: больше инф. меньше места займёт

ZPilot
18.07.2020, 23:15
можете пока подробнее описать схему работы с вирт. диском и монтированием образов прямо из под системы? что то этот момент совсем не явный для меня,
Пока мысль такая: Контроллер при старте читает корень СД-карты и имена файлов записывает в каталог ДСК-имиджа, который будет примонтирован в 3 слот. Также я хочу сделать на этом же диске 1 настоящий файл - монтировщик, который можно запустить в УКНЦ, который передаст команду на монтирование в порт 177130 используя неиспользуемые биты, а в 177132 номер диска и номер файла. Как-то так.

Titus
18.07.2020, 23:18
Вот как выглядит контроллер:
Красивенько.
А без лишних буферов обойтись было нельзя? И зачем ЛА3?

nzeemin
18.07.2020, 23:22
Для виртуального диска мне всего лишь надо создать DSK-файл где каталог будет содержать имена файлов с СД.
Кстати, может кто подключится к проекту, накидает на Си функцию принимающую на вход текстовую строку и запихиваюшую ее в каталог ДСК-файла?

Там же в коде rt11dsk можно посмотреть логику добавления файла.
Если кратко, то:
1. Найти место на диске, где есть непрерывно лежащие N свободных блоков.
2. Найти блок каталога в который будет добавлена запись (обычно, когда вы добавляете файл в конец - это последний из открытых блоков).
3. Сформировать запись каталога, записать блок каталога.

- - - Updated - - -



потом просто перебирать их кнопкой, но, зараза, качается же плата в слоте.. корпрус надо делать, а он получится не простой.

Поставить сенсорные кнопки?

ZPilot
18.07.2020, 23:31
А без лишних буферов обойтись было нельзя? И зачем ЛА3?
ла3 + конденсатор на 200 пик - это формирователь "иглы" на основе SYNC для OE 27С512
Без буферов можно, но это не только буфер но и инвертор.. 1 ассемблеровскую команду заменяет :) но в очень проблемном месте. Но повторюсь, можно и без них.

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


27С512
дешифратор для 177130(2)

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


Там же в коде rt11dsk можно посмотреть логику добавления файла.
Да, сижу разбираюсь.. но вот это сразу поставило в тупик: nFirstCatalogBlock = pHomeSector[0724]; // Это должен быть блок номер 6
Почему 724? если должен быть 978, ну или 978-512

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


Поставить сенсорные кнопки?
Можно поставить развернутые на 90 градусов относительно платы, тогда усилия от нажатия будут направлены вниз.

Titus
18.07.2020, 23:34
дешифратор для 177130(2)
Дешифратор чего?

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


Без буферов можно, но это не только буфер но и инвертор.. 1 ассемблеровскую команду заменяет
Где-то один маленький перфекционист горько заплакал)

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

Не легче ли взять STM'ку помощнее, например, с двумя ядрами, и избавиться вообще от всего лишнего, а так же от недостатков быстродействия.

nzeemin
18.07.2020, 23:37
Да, сижу разбираюсь.. но вот это сразу поставило в тупик: nFirstCatalogBlock = pHomeSector[0724]; // Это должен быть блок номер 6
Почему 724? если должен быть 978, ну или 978-512

http://www.bitsavers.org/pdf/dec/pdp11/rt11/v5.6_Aug91/AA-PD6PA-TC_RT-11_Volume_and_File_Formats_Manual_Aug91.pdf
страница 1-3
g 724–7258 Block number of first directory segment 000006

ZPilot
18.07.2020, 23:49
Дешифратор чего?
О Боже, я тут самоучка.. 27с512 при получении на ШДА адресов 177130(2) выставляет 1 на D3(4).


Где-то один маленький перфекционист горько заплакал)
С буфером оно все лучше, СТМка могла и не продавить шину УКНЦ.

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


Не легче ли взять STM'ку помощнее.. и избавиться вообще от всего лишнего,
Да, а за одно и от УКНЦ, потому как я могу эмулировать саму УКНЦ даже на этой 32Ф411. Спектрум эмулировал.
А вообще, все упирается в цену. Хочу супер дешевый контроллер.

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


как я могу эмулировать саму УКНЦ даже на этой 32Ф411.
Хотя нет, не могу, памяти немного не хватит. Но быстродействия за глаза!

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


g 724–7258 Block number of first directory segment 000006
дошло.. спасибо! В моем описании: Назначение неизвестно, равны: 1, 0, 6, 0, 83, 142.

Titus
18.07.2020, 23:52
Да, а за одно и от УКНЦ, потому как я могу эмулировать саму УКНЦ даже на этой 32Ф411. Спектрум эмулировал.
А вообще, все упирается в цену. Хочу супер дешевый контроллер.
Эмуляция абы-как никому не нужна. А для точной эмуляции STM32 не хватит.

Важна не дешевизна, а работоспособность и удобство повторения.
Легче распаять плату с одним чипом, чем с несколькими. Ради этого я бы и лишние деньги заплатил, чем городить огород из дискретной логики.

ZPilot
19.07.2020, 00:03
Дешифратор чего?
ла3 включает выход 27с512 на очень короткое время при приходе SYNCи нужных адресов, только для того, чтоб на СТМке сработало прерывание EXTI.

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


Легче распаять плату с одним чипом, чем с несколькими. Ради этого я бы и лишние деньги заплатил, чем городить огород из дискретной логики.
Вы да, а другие? У меня используется готовая платка блекпил, стоимостью в 300 руб, плюс доступная элементная база. А первая мая плата сделана самостоятельно, на коленке.

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

Вот смотрите - это очень легко повторить:

https://pic.maxiol.com/images2/1595105996.528788891.20200505221328.jpg


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


Эмуляция абы-как никому не нужна. А для точной эмуляции STM32 не хватит.
Что вы называете точной? Тайминги? или то, что программы запускаться не будут? Будут и быстродействия хватит. Да, таминги не соблюсти, это все-таки микроконтроллер, а не ПЛМ.

nzeemin
19.07.2020, 00:12
ZPilot, так вам удалось добиться стабильной работы с образами дискет на SD-карте по чтению и записи?

ZPilot
19.07.2020, 00:16
так вам удалось добиться стабильной работы с образами дискет на SD-карте по чтению и записи?
Пока только чтение. Читает стабильно, testmz проходит полностью, последовательное и случайное чтение секторов.
Диски тоже переключает.

Titus
19.07.2020, 00:18
Что вы называете точной? Тайминги? или то, что программы запускаться не будут? Будут и быстродействия хватит. Да, таминги не соблюсти, это все-таки микроконтроллер, а не ПЛМ.
Точная эмуляция - это когда все работает потактово точно. Это дает гарантию, что любой ранее или позже написанный софт будет работать точно так же, как на реальной УКНЦ.
Любая остальная непотактовая эмуляция - это лишь до некоторой степени совместимая с УКНЦ машина, но не УКНЦ.

nzeemin
19.07.2020, 00:21
Пока только чтение. Читает стабильно, testmz проходит полностью, последовательное и случайное чтение секторов.
Диски тоже переключает.

Тогда это самое важное - чтобы и запись стабильно заработала. На мой взгляд, в этом основной смысл этого девайса - работа с образами.
Работа с файлами в папке как с диском - ещё не факт получится ли.
Вопрос эмуляции УКНЦ на этом чипе - вообще данного устройства не касается никак.

AFZ
19.07.2020, 00:22
mount должен отослать 1 слово в порт 177130 (команду в которой задействованы неиспользуемые биты), а второе слово (в 177132) будет содержать порядковый номер name.dsk на СД-карте и номер привода, по идее можно указать 8191 образов.А, вот этого-то я и не заметил. Я примерно помню, как сделано обращение к дискам с ЦП, быстро прикинул, как это реализовать и посочувствовал безнадежному занятию... Если же пихать что-то в 177130, то никто не мешает сделать полноценное управление, как запланировано у меня в AZ. То есть отдельный набор команд для манипуляции HFS. А именно - команды "Открыть оглавление HFS", "Прочитать запись оглавления HFS", "Монтировать диск", "Размонтировать диск", ну, и служебная "Получить таблицу назначений приводов".

Используем какой-либо бит 177130, в котором всегда ноль. Взводим туда единицу, в каких-то битах кодируем команду, в каких-то передаем что-то еще. допустим, номера монтируемого или демонтируемого дисков. А дальше все просто. Пересылаем строчку с path до нужного оглавления, читаем его записи, находим нужный файл, монтируем его, и вперед! Никто не запрещает сочинить программулю, по типу Командира Нортона, которая позволит пробежаться по оглавлениям до нужного файла и смонтировать его. На ДВК с этим хуже - не у всех есть нормальные терминалы, позволяющие нарисовать что-то в стиле NC. А на УКНЦ - запросто...


Если кто поможет с написанием mount.sav, буду очень признателен!Хе! У меня интерфейс этого дела в AZ предусмотрен и давно опубликован, но что-то никто не торопится. Будет время - сам займусь, но когда оно будет?..

ZPilot
19.07.2020, 00:33
Любая остальная непотактовая эмуляция - это лишь до некоторой степени совместимая с УКНЦ машина, но не УКНЦ.
Пару страниц назад кто-то мне писал, что был проект, который заглох потому, что программа заработала не на всех УКНЦ, так может сами УКНЦ это "лишь до некоторой степени совместимая с УКНЦ машина"?
Про RGB и BGR я вообще промолчу..
А вообще, я не хочу спорить, я пишу свой проект, только потому, что для меня это интересная инженерная задача, а еще потому, что Alex_K как-то сказал, что УКНЦ это дорого, вот я и хочу помочь всем, чтоб было доступно.

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


Тогда это самое важное - чтобы и запись стабильно заработала
Хорошо, забиваю пока на монтирование, все-таки оно пока второстепенное.

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


Хе! У меня интерфейс этого дела в AZ предусмотрен и давно опубликован, но что-то никто не торопится. Будет время - сам займусь, но когда оно будет?..
Надо С для УКНЦ раздобыть, быстрее дело пойдет. :)

ZPilot
19.07.2020, 11:45
Добрых суток, друзья!
Поймал сегодня странный глюк на своем контроллере связанный с переключением диска, вот ссылка на видео: https://cloud.mail.ru/public/5NWX/4pYDfXx6H
Я не могу понять, почему так происходит?

Hunta
19.07.2020, 12:06
Если глюк в том, что DKL запустилась только через RUN, то это не глюк - это штатное поведение системы. Программу можно запустить просто введя имя её файла только если её файл находится на устройстве загрузки, то есть на диске SY: С любых других дисков - только через RUN.

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

Вдогонку. В старых системах (вроде до 5.0, ЕМНИП) был первоначальный вариант такого (с SY:) запуска программ - сокращённым вариантом команды RUN - R
Работает и сейчас.

Alex_K
19.07.2020, 12:13
Добрых суток, друзья!
Поймал сегодня странный глюк на своем контроллере связанный с переключением диска, вот ссылка на видео: https://cloud.mail.ru/public/5NWX/4pYDfXx6H
Я не могу понять, почему так происходит?
А никакого глюка здесь нет. RT-11 надо изучать. В RT-11 существуют два логических устройства - SY: и DK:. Устройство SY: - это устройство с которого загрузили систему. В вашем случае это MZ0:. А устройство DK: - это диск по умолчанию. При загрузке ОС он сначала совпадает с SY:, потом его можно переназначать с помощью команды ASSIGN.
В RT-11 если набранная команда не является внутренней командой KMON (командного монитора), то на системном диске SY: ищется соответствующий файл и запускается. Если же файл запуска не находится на устройстве SY:, то он должен запускаться с помощью команды RUN. При этом, если файл расположен на устройстве DK:, то имя устройства указывать не надо. Т.е. сначала ASS MZ1 DK, потом RUN DKL.

ZPilot
19.07.2020, 12:29
Hunta, Alex_K, спасибо вы меня обрадовали, это не глюк, это всего лишь мое невежество :)

Hunta
19.07.2020, 12:44
невежество
Невежество и незнание - это разные вещи :) Тут всего лишь незнание :) Хотя теперь его нет :)

ZPilot
19.07.2020, 12:58
Невежество и незнание - это разные вещи
Вы мне льстите. :)

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

Ребят, а не подскажите пару моментов по записи, первый момент: с какого момента начинается запись и как она связана с индексной меткой, второй момент: чтение и запись связаны между собой? Те читаем до определенного места дорожки, а потом переходим на запись? Меня интересует именно позиция на дорожке, а не поиск по файловой системе.

Hunta
19.07.2020, 12:58
Вы мне льстите
Это не лесть, это - факт :) Невежество - это когда - не знаю и не собираюсь знать :) Ну или типа того :)

AFZ
20.07.2020, 21:03
Ребят, а не подскажите пару моментов по записи, первый момент: с какого момента начинается запись и как она связана с индексной меткой, второй момент: чтение и запись связаны между собой? Те читаем до определенного места дорожки, а потом переходим на запись?Формат дорожки с точки зрения ВП1-128 неплохо описан в книжке от контроллера MY (http://www.tis.kz/docs/DVK/KMD-MY.rar) - рис. 12 и 13. Ну, и про запись сказано там же - п.7.2 на стр. 25: при записи сначала ищется и читается заголовок сектора, как будет найден нужный сектор после считывания зоны его заголовка и промежутка, помеченного в формате дорожки, как "Зона 2", переписывается фрагмент, помеченный, как "зона данных", начиная с её зоны синхронизации (12 байт), далее маркер данных (не помню, с пропущенным синхроимпульсом, или нет), 512 байт данных, CRC и какое-то количество байт из зоны 3. Или запись выключается сразу после записи CRC, точно уже не могу вспомнить...

ZPilot
20.07.2020, 23:40
Формат дорожки с точки зрения ВП1-128
Спасибо огромное. Правда я уже и сам разобрался, запись работает, вернее работает пока в отдельный файл, те читает с одного пишет в другой, и я увидел там все то, что вы мне описали. :)
Синхроимпульс я игнорирую, не нужен он для образов. УКНЦ вместо CRC записывает 2 байта 0х4Е, CRC, похоже, дописывает ВП1-128.
Вот получившийся файл, если кому интересно: https://cloud.mail.ru/public/4rDS/23taEqs94

ZPilot
21.07.2020, 14:49
Alex_K, nzeemin, подскажите пожалуйста, куда все-таки записывается слово контрольной суммы (CRC), последним в 512 блоке данных или все-таки первым сразу после блока из 512 байт данных. Вопрос возник как-раз после разбора информации записанной в файле из предыдущего моего сообщения.

Hunta
21.07.2020, 14:56
Блок данных 512 байт, после него два байта CRC, потом зона 3

ZPilot
21.07.2020, 15:22
Я не понимаю откуда вылезли 2 байта 0х4Е последними в 512 блоке данных, файл был пустой, записывался он так, был загружен testmz, в нем выбран 0 дисковод, 0 трек, 2 стороны и запущен тест "последовательное чтение с перезаписью", если бы контроллер не дописывал по каким-то причинам блок данных, то все бы сместилось и там бы все равно не было 4Е.

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


Блок данных 512 байт, после него два байта CRC, потом зона 3
Я тоже так думаю, но происхождения этих 0х4Е не понимаю, неоткуда им там взяться. :(

https://pic.maxiol.com/images2/1595333029.528788891.screenshot.png

А здесь похоже на то, что УКНЦ отправляет эти байты.

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

Выполнил форматирование диска:

https://pic.maxiol.com/images2/1595334064.528788891.screenshot.png

Похоже, что CRC все-таки записывается последним словом в 512 блок данных. Не хрень какая-то..

Hunta
21.07.2020, 15:28
Ну это надо смотреть логику работы ПЗУ ПП.. Я в нём не сильно разбирался и насколько помню, код, отвечающих за работа с флопами - не смотрел.
А ссылку дали вообще на контроллер MY. То есть там описан внешний интерфейс (вроде он как малость другой) и формат дорожки (а это совпадает). В принципе, логика работа в плане чтения-записи дорожки не должна сильно отличаться от MZ, так что можно посмотреть листинг ПЗУ MY, по идее - в нём меньше лишнего "мусора"

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


Похоже, что CRC все-таки записывается последним словом в 512 блок данных.
Этого в принципе не может быть - размер блока - 512 байт данных
Да и на картинке - блок данных начинается по смещению 98, плюс 200 байт данных - 298, а 4E появляется по смещению 29E

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

Я бы сказал, что записывается лишних 6 байт 40, а потом уже идёт два байта 4E.

В общем - смотреть листинг ПЗУ ПП

ZPilot
21.07.2020, 15:33
Hunta, Похоже для записи надо переделывать код выдающий служебные метки: индексный маркер, КРК и GAP.

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


Я бы сказал, что записывается лишних 6 байт 40, а потом уже идёт два байта 4E.
Да, мне кажется я все-таки не вовремя выставляю нужные флаги.

Hunta
21.07.2020, 15:39
Да, мне кажется я все-таки не вовремя выставляю нужные флаги.
Ну, я бы просто полез в листинг, даже не в документацию, но это я - систему команд PDP-11 впитал с первой любовью к компам :) А учитывая опыт восстановления текстов ПЗУ - ещё бы и перепахал свои старые попытки :) Документация документацией, а написанный код не обманешь :)

ZPilot
21.07.2020, 17:10
А учитывая опыт восстановления текстов ПЗУ
Эх.. для меня это всегда тяжелый труд, всегда восхищался как люди легко переваривают кучи мегабайт данных.

Hunta
21.07.2020, 17:56
как люди легко переваривают кучи мегабайт данных
Ну, ну про мегабайты - это, конечно, не про меня :) Если же посмотреть на мой способ восстановления текстов, то в нём 3 этапа:

- Получения исходника, который после компиляции и линковки на выходе даёт идентичный двоичный файл. Благодаря формату файлов .SAV и парочке хаков - я этот этап делаю с использованием RT :) Поскольку у меня сейчас нет (или пока не нашёл) программы, которая даёт на выходе сразу что то компиляторно-пригодное и пригодное для последующего решения вопроса - код или данные, приходится использовать пару дизассемблеров и ручное редактирование. Ещё одна проблема здесь - число в очередной команде - это данные или адрес (или смещение) :) Вопрос часто сложно решить даже на более поздних этапах дизасма :)

- После того, как первый этап пройден, начинается анализ меток, что бы понять их характеристики - эта метка для данных или кода? - это метка процедуры? - это метка, на которую есть ссылка из нескольких или только одного места? - ну может ещё какие характеристики забыл. Если это метка из оператора условного перехода и на неё идёт ссылка только из одного места - идёт попытка замены кодового блока с её участием на структурные операторы типа IF WHILE REPEAT LOOP (спасибо пакету макросов структурного программирования :) ) Если это метка процедуры - идёт попытка определения её границ и оформления как процедуры (пакет структурного программирования!). Как показывает практика - в программе бывает много однократных меток, которые таким образом удалить и так же бывают хорошо выделяемые процедуры. Но бывают и исключения - пример - 377 ПЗУ для ДВК :)

- Когда начинается второй этап и достаточно много (или в нужных местах) кода таким образом обработано - уже можно начинать анализировать логику и писать комменты :) Но точного начала третьего этапа обычно нет - часто я и на втором этапе оставляю комменты. И вот тут благодаря структурным операторам очень хорошо начинает просматриваться логика :) Именно благодаря им текст 134-ого ПЗУ был довосстановлен недели за две (этой был первый опыт такого подхода), а ПЗУ для KDJ11-A (13 кб) дней за пять было восстановлено и модифицировано в части загрузчиков :) Правда, там по прежнему сидит одна ошибка и пока не разобрался со способом упаковки текстовых сообщений помощи, ну и второй этап не весь закончен :) Ну и прошерстил ПЗУ КЦГД, правда там ещё надо поработать - логика не вся описана :)

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

А откомментированный ПЗУ ПП есть в инете - правда, адрес с ходу не скажу, потряси Alex_K, вроде он знает

ZPilot
21.07.2020, 18:00
Все-таки УКНЦ пишет в порт 177132 во время записи CRC байты 0х4Е4Е (47116), вот кусок кода:

BIT #40000,@R4 ; Ожидаем начала записи CRC
BEQ 2$ ; Еще не началась
3$: MOV #47116,@R5 ; Передача слова в РДЗ и ожидание
4$: TSTB @R4 ; готовности контроллера для уверенности
BPL 4$ ; записи CRC на диск


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


А откомментированный ПЗУ ПП есть в инете - правда, адрес с ходу не скажу, потряси Alex_K, вроде он знает
Да, я находил, по моему здесь на форуме или на фантоме.

программы, которая даёт на выходе сразу что то компиляторно-пригодное
Таких, насколько я знаю, нет ни для чего, что связано с компиляцией в исполняемый код.

Hunta
21.07.2020, 18:05
Тут надо читать описание логики работы с ВП1-128, там есть какие то нюансы - типа - как заставить записать синхробайт (или как он там называется). Может и 4E чего то значит. Давно я с этим возился :)

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


Таких, насколько я знаю, нет ни для чего
Для PDP-11 были, надо только собраться и найти. Но. Оно всего лишь пройдёт компиляцию и даже есть шанс что на выходе даст идентичный результат. Но это будет далеко не пригодный для анализа логики текст. Просто мне сократит первый этап - сейчас он у меня много времени отнимает.

Ну и жужжит в голове идея написать прогу на PC, который бы много чего могла сделать за меня, но.... время.. :)

ZPilot
21.07.2020, 18:11
Ну и жужжит в голове идея написать прогу на PC, который бы много чего могла сделать за меня, но.... время..
Для таких вещей хорошо бы обучить хороший шаблон (о Боже, его же все ИИ называют), по идее должен помочь.

Hunta
21.07.2020, 18:17
его же все ИИ называют
Предпочитаю понимать, как моя программа работает :)

ZPilot
21.07.2020, 19:26
Вот, немного подправил флаги:

https://pic.maxiol.com/images2/1595348735.528788891.screenshot.png

Hunta
21.07.2020, 19:34
Нуууу.... а почему 4E начинается не с 260?..

nzeemin
21.07.2020, 19:41
Вот, немного подправил флаги:

https://pic.maxiol.com/images2/1595348735.528788891.screenshot.png


ZPilot, это от начала индекса? спрашиваю потому что GAP1 из байтов 4E тут длиной 36, у меня записано что должно быть 34: https://github.com/nzeemin/ukncbtl-doc/wiki/Floppy-ru
И вот эти два байта 40 40 по адресу 260 действительно подозрительные - место контрольной суммы?

- - - Updated - - -


Да, я находил, по моему здесь на форуме или на фантоме.


Ну всмысле находил, много раз уже давали ссылку - http://www.emuverse.ru/wiki/%D0%A3%D0%9A%D0%9D%D0%A6_ROM_disasm

ZPilot
21.07.2020, 19:46
Нуууу.... а почему 4E начинается не с 260?..
А потому что CRC там. Глюк на этой картинке в том, что нет контрольной суммы после номера трека, стороны, сектора и его типа, сразу 4Е начинались. Подправил еще, вроде ошибок нет, вот файл целиком: https://cloud.mail.ru/public/4Nub/zpns2dVFg

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


ZPilot, это от начала индекса?
Да.. и все тут вроде правильно, тк GAP1 должен быть всего длинной 38 байт, только он разбит на куска GAP1 и GAP3, вернее GAP3 состоит из 36 (34) байта GAP1 и 2(4) байта GAP3. Как то так..
Начало и конец сектора всегда 0х4Е, по этому сдвинуть можно.

Да, какой длинны должна быть индексная метка?

nzeemin
21.07.2020, 20:07
Как я вижу по коду из эмулятора - см. m_writemarker, m_shiftmarker, m_crccalculus, m_writing - https://github.com/nzeemin/ukncbtl/blob/master/emulator/emubase/Floppy.cpp
При записи адресного маркера данных, УКНЦ должна собственно записать маркер - она выставляет бит 9 в 177130. С этого момента начинается подсчёт контрольной суммы. После завершения записи сектора - конрольная сумма помещается в сдвиговый регистр, и соответственно записывается на диск - это два байта сразу после данных сектора.
Т.е. вам не нужно ждать что УКНЦ передаст контрольную сумму - её считает и записывает сам контроллер, т.е. в вашем случае - ваш контроллер.
Alex_K конечно лучше объяснит, я тут мимокрокодил.

- - - Updated - - -


Да, какой длинны должна быть индексная метка?

Думаю это не особенно важно, ловится же начало отверстия. У меня стоит константа в 150 байт:
#define FLOPPY_INDEXLENGTH 150 ///< Length of index hole, in bytes of raw track image

Hunta
21.07.2020, 20:18
её считает и записывает сам контроллер
Память подсказывает, что таки да и самое главное - это выглядит логичней

ZPilot
21.07.2020, 20:38
При записи адресного маркера данных, УКНЦ должна собственно записать маркер - она выставляет бит 9 в 177130. С этого момента начинается подсчёт контрольной суммы. После завершения записи сектора - конрольная сумма помещается в сдвиговый регистр, и соответственно записывается на диск
Тут вы не совсем правы, да она выставляет 9 бит, но УКНЦ четко отлавливает когда контроллер выставил бит CRC, те начало подсчета контрольной суммы. По записи УКНЦ ждет от контроллера 2 вещи, это бит индекса и бит начала подсчета контрольной суммы, они должны выставляться в правильное время, по ним УКНЦ синхронизирует вывод данных. Да, других бит, кроме бита готовности принять данные, контроллер во время записи выставлять не должен.

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


Думаю это не особенно важно, ловится же начало отверстия. У меня стоит константа в 150 байт:
У меня всего 10 байт.

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

Кстати, я переписал чтение под 36 байтный заголовок 4Е, читает нормально.

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

А еще, на моей УКНЦ почему-то зависает вот этот образ: mz80_UKNC_pafcom.dsk
Прямо на запуске аналога Нортон Коммандера, печально, а на эмуляторе ув. nzeemin, запускается, печаль :(

Alex_K
21.07.2020, 22:17
ZPilot, собственно я вижу, что вы приводили куски кода из моего труда о контроллере дисковода УКНЦ. Вроде там всё написано, как производится запись CRC. Во-первых сперва обратите на описание битов 7 и 14. Они разные для режимов чтения и записи. Т.е. существует два бита готовности и два бита CRC, одни для режима чтения, вторые для режима записи.
Обратите внимание, что существует регистр записи РДЗ (0177132) и сдвиговый регистр. Во время записи информация из РДЗ копируется в сдвиговый регистр, и собственно со сдвигового регистра она и уходит на линии DO для дисковода. Расчет CRC начинается с установки бита WM (9). При записи в РДЗ сбрасывается бит готовности TR (7). Как только сдвиговый регистр становится свободным, то в него копируется информация из РДЗ и снова устанавливается бит готовности для получения новых данных. Но информация с РДЗ копируется в сдвиговый только при сброшенном бите готовности. Если же в РДЗ ничего за 64 мкс не записали, т.е. бит готовности остался установленным, то тогда в сдвиговый регистр копируется не РДЗ, а рассчитанная CRC. После этого расчет CRC прекращается и контроллер устанавливает бит CRC (14), который говорит о том, что в данное время производится запись CRC. Но её прерывать нельзя. Для этого в РДЗ записывается 0x4E4E и ожидается установка бита готовности. Установленный бит готовности сообщает о том, что запись CRC закончилась и в сдвиговый регистр скопировался РДЗ. После этого можно перейти в режим чтения, прочитав регистр 0177132.

ZPilot
21.07.2020, 22:31
Но информация с РДЗ копируется в сдвиговый только при сброшенном бите готовности.
Я так понимаю, что сбрасывает бит готовности контроллер?

Для этого в РДЗ записывается 0x4E4E и ожидается установка бита готовности.
А это кто делает? Контроллер или УКНЦ?

Alex_K
21.07.2020, 22:34
Я так понимаю, что сбрасывает бит готовности контроллер?

А это кто делает? Контроллер или УКНЦ?
В режиме записи бит готовности сбрасывается при записи в регистр РДЗ 0177132, а устанавливается при копировании РДЗ в сдвиговый регистр.

ZPilot
21.07.2020, 22:35
Да, и я правильно понимаю, что записать CRC куда попало нельзя, она записывается точно в то место на диске/треке/секторе где должна быть?

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


устанавливается при копировании РДЗ в сдвиговый регистр.
Те когда контроллер считал данные из 177132?

Alex_K
21.07.2020, 22:37
Да, и я правильно понимаю, что записать CRC куда попало нельзя, оно записывается точно в то место на диске/треке/секторе где должна быть?
Да. CRC есть после заголовка сектора и после зоны данных.

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


Те когда контроллер считал данные из 177132?
Да.

ZPilot
21.07.2020, 22:43
И я вот думаю, смысла считать CRC нет, тк она в образ DSK не записывается, УКНЦ ее не отправляет контроллеру, а контроллеру после ее расчета сравнить ее правильность не с чем. Единственное место где она нужна, так это при чтнеии с диска, но у меня то образ.

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


Да. CRC есть после заголовка сектора и после зоны данных.
А значит, если я знаю где ее место, мне не важен бит WM (9). WM (9) не может быть установлен в середине сектора? Или может?

Alex_K
21.07.2020, 22:47
И я вот думаю, смысла считать CRC нет, тк она в образ DSK не записывается, УКНЦ ее не отправляет контроллеру, а контроллеру после ее расчета сравнить ее правильность не с чем. Единственное место где она нужна, так это при чтнеии с диска, но у меня то образ.
Но записать что-то надо. Предлагаю записать 0x1593, оно же 012623 в восьмеричной. Это "CRC" в RADIX-50.

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


А значит если я знаю где ее место, мне не важен бит WM (9).
Место указывает программа при записи, когда она не записывает данные в РДЗ за 64 мкс, из-за чего контроллер и начинает писать CRC.

ZPilot
21.07.2020, 23:08
012623
у меня там сейчас в системной области повторение текущего сектора и типа сектора, а в области данных 0х4040. Честно говоря, я взял ту 0 дорожку, что приаттачил в своем сообщении.

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

Как у меня сделаны чтение/запись. В RAM памяти СТМки лежит полностью 0 цилиндр (6250 байт), а в EPROM: массив (размером с цилиндр, 6250 байт) с синхрометками для чтения и второй массив, такой же длинны, с синхрометками для записи. Я понимаю, что не экономно, но "облагораживать" я буду потом, тем более, что в 32ф411 аж 512 КБ EPROMа, а задействовано около 9%.

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

Alex_K, Скажи пожалуйста, а вот бит WM выставляется всегда, если были изменения в секторе? до этого момента отправить головку на другой цилиндр УКНЦ не может?

Alex_K
21.07.2020, 23:22
Alex_K, Скажи пожалуйста, а вот бит WM выставляется всегда, если были изменения в секторе? до этого момента отправить головку на другой цилиндр УКНЦ не может?
Бит WM выставляет программа при записи маркера. На другой цилиндр отправить головку можно, но в драйвере дисковода в ПП естественно такого не делается. А так дисковод и контроллер абсолютно разные вещи.

ZPilot
21.07.2020, 23:29
но в драйвере дисковода в ПП естественно такого не делается
Ясно, спасибо. Мне не очень нравится как у меня на данный момент сделана запись, пишет на сд-карту каждый раз после записи сектора и пишет весь цилиндр целиком, понятно, что сд-карте все равно, она на переписывает одинаковые данные, но можно как-то определить, закончилась ли запись в этом цилиндре или нет, но как.. пока идей нет.

AFZ
22.07.2020, 06:12
Однозначным сигналом о том, что запись на этом цилиндре закончилась, будет команда "Шаг" на переход к другому цилиндру. До этого можно спокойно использовать дорожку в памяти МК в качестве кэша отложенной записи. Ну, и, чтобы не потерять информацию, если шага не потребовали, можно сделать тайм-аут, секунды на 3. Если в течении этих трех секунд обращение к диску не последовало, кэш надо сбросить принудительно. А писать каждый сектор - это, конечно, лишнее.

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


понятно, что сд-карте все равно, она на переписывает одинаковые данные В смысле НЕ переписывает? Так это не так. Запись на SD выполняется страницами, переписывая один сектор, мы, на самом деле, даем команду контроллеру SD-шки считать из флеш-памяти в своё внутреннее ОЗУ всю страницу, кроме записываемого сектора, стереть эту страницу и записать ее заново, с тем самым замененным сектором. Расходуя, заодно, ресурс записи на флешь. Наиболее правильной и быстрой записью на SD будет запись полными страницами.

Когда SD-шка форматируется специальной для них программой, это делают так, чтобы кластеры FAT ложились точно на эти самые страницы, при этом, если запись делать целыми кластерами, то достигается максимальная скорость записи и минимальный расход ресурса записи флеш-памяти. Именно поэтому не рекомендуют форматировать флешки виндой - она-то ничего не знает о страницах, границы кластеров FAT не будут совпадать с границами страниц и запись на SD-шку будет тормозить.

ZPilot
22.07.2020, 18:17
Однозначным сигналом о том, что запись на этом цилиндре закончилась, будет команда "Шаг" на переход к другому цилиндру.
Не согласен, я могу записать только 1 сектор на текущей дорожке.

До этого можно спокойно использовать дорожку в памяти МК
Тоже не пойдет, целиком дорожка может быть и не загружена в память вообще, я только пишу в нее пару секторов, но не читаю.

Ну, и, чтобы не потерять информацию, если шага не потребовали, можно сделать тайм-аут, секунды на 3. Если в течении этих трех секунд обращение к диску не последовало, кэш надо сбросить принудительно.
Получается, мне надо хранить не только содержимое секторов, но и № секторов которые были изменены. Теоретически это сделать не сложно, но дело в том, что по 1 сектору писать, что группой секторов, для СД-карты в реализации FatFs по барабану, она пишет блоками по 512 байт. По идее, и скорость-то не сильно увеличится, тк затраты на всю математику и вход в подпрограмму записи ничтожны по сравнению со временем самой записи 512-байтного блока.

В смысле НЕ переписывает?
То что вы пишите, верно только отчасти, сейчас контроллеры СД, ССД и других EPROMов очень поумнели, если блоки совпадают, блоки просто не переписываются.

Именно поэтому не рекомендуют форматировать флешки виндой
Вот тут я совсем не согласен. Размер блока при форматировании в Виндовс, да и любой другой системы (я не говорю о спецнастройках, я имею ввиду "по умолчанию") кратен 512 байтам.

У меня вопрос к гуру, запись вроде как работает, но как всегда есть один нюанс.. Если я пишу в уже созданный файл, то файлы пишутся, стираются и выполняются любые операции над ними, но если я отформатировал диск, то при попытке DIR выдается сообщение: DIR-F-Invalid-directory, а при попытке записи туда файла: PIP-F-В оглавлении MZ2: DISPL.SAV произошла ошибка ввода-вывода
Я что-то опять не знаю? :(

Alex_K
22.07.2020, 18:41
У меня вопрос к гуру, запись вроде как работает, но как всегда есть один нюанс.. Если я пишу в уже созданный файл, то файлы пишутся, стираются и выполняются любые операции над ними, но если я отформатировал диск, то при попытке DIR выдается сообщение: DIR-F-Invalid-directory, а при попытке записи туда файла: PIP-F-В оглавлении MZ2: DISPL.SAV произошла ошибка ввода-вывода
Я что-то опять не знаю?
В отличие от MS-DOS, где format не только форматировал диск, но и инициализировал его, в RT-11 форматирование только форматирует диск. Его ещё надо инициализировать командой INIT.

ZPilot
22.07.2020, 19:58
В отличие от MS-DOS,
Спасибо, сработало.
Могу сказать, что запись теперь работает тоже. Если нужен видеоотчет, напишите, выложу.

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

Запись на СД-карту выполняется по попаданию позиции "головки" в зону CRC и по секторно. Поэтому записываются только полезные данные. От записи цилиндра отказался.

nzeemin
22.07.2020, 19:59
Могу сказать, что запись теперь работает тоже. Если нужен видеоотчет, напишите, выложу.

ZPilot, попробуйте ещё тест копирования диска 1-к-1 посекторно:
COPY /DEVICE MZ0: MZ1:

ZPilot
22.07.2020, 20:03
попробуйте ещё тест копирования диска 1-к-1 посекторно:
Да, сейчас сделаю.

Hunta
22.07.2020, 20:07
Нет, не так, а вот так:
COPY/DEVICE/NOQUERY/VERIFY MZ0: MZ1:

ZPilot
22.07.2020, 20:15
diff -q -y -s diskb.dsk DISKC.DSK
Файлы diskb.dsk и DISKC.DSK идентичны

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


COPY/DEVICE/NOQUERY/VERIFY MZ0: MZ1:
А смысл? У меня всегда выставляется, что CRC правильный.

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

Но если надо, могу сделать и так.

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


Нет, не так, а вот так:
Сделал, тоже идентичны.

Hunta
22.07.2020, 20:17
У меня всегда выставляется, что CRC правильный.
Это не проверка CRC, это считывание записанного и сравнение с записываемым :) То есть сразу выполнение diff

ZPilot
22.07.2020, 20:35
Это не проверка CRC, это считывание записанного и сравнение с записываемым
А.. Понятно.. все равно нет смысла, сектор в кеше висит..

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

Кстати, я разобрался с нестабильной инициализацией СД-карт, теперь можно любого размера подключать, 4 гиговая SDHC работает без проблем. Правда на 25 МГц записывать отказалась, только читать, работает полностью только на 12.5 МГц Извиняюсь, тут соврал, сейчас глянул настройки, стоит 25 МГц, видимо когда поправил инициализацию, не заметил как Куб поправил частоту. :)

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

До релиза осталось 2 задачи, монтирование и перенос на stm32f401 чип. 401 стоит еще на 100 руб дешевле, он практически идентичен 411, чуть меньше памяти и частота 84 МГц, должно хватить.

Hunta
22.07.2020, 20:35
все равно нет смысла, сектор в кеше висит..
По умолчанию она читает-пишет не по одному сектору. Поскольку - зависит от от доступной памяти, но по наблюдениям - дорожки по 4-5 на дискетах

ZPilot
22.07.2020, 20:38
дорожки по 4-5 на дискетах
Кстати да! Я тоже это заметил по самому точному прибору на свете - неонке (светодиоду) :)

Hunta
22.07.2020, 20:41
Я по звуку перемещения головок на флоповоде :)

Так что, насколько я понимаю, кэш роли не играет :)

ZPilot
22.07.2020, 20:43
Так что, насколько я понимаю, кэш роли не играет
Весь вопрос как он проверяет, может же записать сектор, а потом его тут же считать..а только потом писать следующий, но считает в память штук 5.

Hunta
22.07.2020, 21:01
Считывает (много) секторов
Пишет все
Считываем все
Сравнивает между собой

Если не сравнилась, то в этом диапазоне начинает считывать, записывать, считывать и сравнивать по одному сектору. Если и тут обломс - выдаёт на экран номер не сравнившегося.
После завершения диапазоны возвращается на вариант - читаем-пишем много

Если сравнилась - переход к следующим (много) секторам

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


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

hobot
23.07.2020, 15:18
ZPilot, у меня не совсем своевременная просьба уточнение по вашему проекту :
допустим всё хорошо, всё летает работает и даже пакеты игровые от ИТО и другой не RT-11 дискетный софт,
какова может быть быть после вселх программно-железячных оптимизаций стоимость готового контроллера? всякие конструкторы-шматруктуры - это всё в сторону к людям-паяльникам. Интересует конечно стоимость в минимальном виде (без корпуса) и самый красочный в корпусе. Хотя бы навскиду (сравним с AZ и готеком???), спасибо.

ZPilot
23.07.2020, 17:11
hobot,
Я хотел бы пояснить пару моментов:
1. AZ это супер контроллер, он раздвигает рамки УКНЦ до современного мира, и этот проект действительно имеет коммерческую ценность, в него вложено много труда, да и денег, я так думаю.
2. Мой проект изначально не задумывался как коммерческий, не станет он коммерческим и сейчас (во всяком случае от меня). Вырос он из-за неисправной УКНЦ и неоценимой помощи людей с этого форума.
3. Контроллер который я делаю не имеет ни чего общего с Готеком. Готек - это эмулятор FDD и для его работы требуется контроллер FDD, но он тем и хорош, что подходит практически для любых машин. Например, я подключал свой Готек к УКНЦ, к Спектруму и к Корвету. Но все эти компьютеры имели свой контроллер FDD.
Ну и последнее, мой контроллер это практически программная эмуляция КГМД для УКНЦ (построенного на 1801ВП1-128) плюс 4 интегрированных FDD и он не меняет УКНЦ к лучшему или современному, он просто позволяет загружать образы дисков с СД-карт, почти как старый добрый КМГД от производителей УКНЦ.
Тк это не коммерческий проект, от слова совсем, то я не планирую его продавать или выпускать, я просто выложу на форуме все исходники: платы и схемы в KiCAD (и готовые герберы по которым я заказывал платы у pcbway), проект для STM32CubeIDE для платы blackpil STM32F411 (и бинарник для прошивки), возможно еще проект для STM32F401, если сделаю.
Теперь сколько это стоит:
Я заказывал 10 плат у pcbway, за 5 долларов + 7 долларов доставка обычной почтой.
Блекпилы заказывал на алиекспрессе, F411 - за 274 рубля, F401 - 192 рубля (магазин, не реклама, просто пример из жизни: https://aliexpress.ru/item/4000103610226.html?spm=a2g0s.9042311.0.0.5afc33ed5 QeHhL
Всю мелкую логику я купил в ближайшем радиомагазине, что-то около 70 рублей.
Вот и вся стоимость.
Насчет корпуса, если все элементы вставлять в панельки, получается достаточно толстый бутерброд. Места для корпуса почти не остается. Если все запаивать, то корпус возможен, но это уже сами :)

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


практически программная эмуляция КГМД для УКНЦ
Я бы даже сказал так, этот контроллер - демосцена для STM32. Как обычная демосцена для Спека. Мне самому было интересно выжать максимум из минимума :)

Arseny
23.07.2020, 21:53
Я заказывал 10 плат у pcbway, за 5 долларов + 7 долларов доставка обычной почтой.
Т.к. проект явно вышел на финишную прямую, хочу поинтересоваться - нельзя ли у тебя будет перекупить пару-тройку плат, для дальнейшей сборки "долгими зимними вечерами"?

ZPilot
23.07.2020, 22:24
нельзя ли у тебя будет перекупить пару-тройку плат,
Перекупить нельзя, я все-таки доделаю монтирование файлов, а потом.. просто вышлю всем желающим остатки плат (штук 6 наверное будет, остальные на опыты), но по 1й.

AFZ
23.07.2020, 23:53
ZPilot, кстати, все забывал заметить. Адрес внешнего устройства на шине МПИ опознают не по полным 16-18-22 разрядам адреса, а по А12-А00 + ВУ (BS7), то есть, всего 13 разрядов. Причем А00 тоже опознавать в большинстве случаев необязательно. В м/с ВП1-128 запись же всегда делается словами, да? Значит, А00 не нужен. То есть достаточно 12-разрядного распознавателя адреса. Если это делать на ПЗУ, то хватит м/с 2764. А распознавать полный адрес - это, в общем-то говоря, не совсем правильно. То есть, конечно, для УКНЦ это фиолетово, а вот тот факт, что об этом забыли разработчики MY, вызвал кучу геморроя с адресными перемычками этого самого MY.

ZPilot
24.07.2020, 14:05
все забывал заметить
Эх, месяца 1,5 бы назад сказали. :) Когда думал над схемой, читал про ВУ, но где-то вычитал, уже не помню, что внешние устройства его не используют.. Но я могу ошибаться.

на ПЗУ, то хватит м/с 2764.
Можно вообще обойтись без ПЗУ используя только логику или вообще диоды, но так было проще, да и цена, что у 2764, что у w27с512 почти одинаковая. Тут можно использовать 556РТ2 - но где ее искать, где прошивать? А программатор для 27с512 у меня есть.

Hunta
24.07.2020, 14:15
читал про ВУ, но где-то вычитал, уже не помню, что внешние устройства его не используют.. Но я могу ошибаться.
Интересно где - так как это единственно правильный способ - использовать сигнал BS7
И если проц его сам не генерирует, то на плате с процом должен стоять ручной генератор

ZPilot
24.07.2020, 22:21
Интересно где - так как это единственно правильный способ - использовать сигнал BS7
А почему единственно правильный?

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


Причем А00 тоже опознавать в большинстве случаев необязательно
Согласен.

randomizer
24.07.2020, 22:33
А почему единственно правильный?
Видимо потому что BS7 указывает на то, что идет побращение к странице внешних устройств.
7 в наименовании как раз номер страницы насколько я помню. Как раз последняя 8-ми килобайтная страница.

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

В УКНЦ ещё например, BS7 не вырабатывается при активном сигнале SEL

ZPilot
24.07.2020, 22:45
Видимо потому что BS7 указывает на то, что идет побращение к странице внешних устройств.
Тогда я вообще не понимаю как это работает, да еще без сбоев.
В схеме УКНЦ я вообще не вижу этого сигнала, есть K1BS (К1 ВУ), но он генерируется КА1515ХМ1-032, есть ВВ, но он либо на земле, либо на +5В сидит.

randomizer
24.07.2020, 22:53
есть K1BS (К1 ВУ), но он генерируется КА1515ХМ1-032
Это он и есть. Вырабатывается внешней логикой, а не самим процессором.