Тема: Инициализация 6551 - проблема
Всем привет.
Сдавшись в борьбе с 580ВВ51, который я так и не смог заставить нормально передавать и принимать данные, я сделал плату с интерфейсом 6551, весьма популярным в 6502-компьютеростроении, во всяком случае - в буржундии. Микросхема и в самом деле привлекательная - она уже рассчитана на подключение к процессору 6502 или другому с аналогичной шиной. Использованная мной схема предельно проста, я, пока что, её рисовать не буду. На шине данных - буфер 74LS245, вход направления которого подключен к сигналу R/Wn, вход разрешения выхода - к сигналу I/O STROBEn. Входы адресов регистров RS0 и RS1 подключены к адресам А0 и А1, Вход CS1n подключен к I/O STROBEn, вход CS0 - к адресу A2. Микросхема 6551 требует тактовый сигнал F2 от процессора, но так как его на плате нет, я взял F1 и проинвертировал его микросхемой КР1533ЛН1. Плата установлена в слот 3, таким образом адресация регистров:
$C0B4 - data register (SIODATA)
$C0B5 - status register (SIOSTAT)
$C0B6 - command register (SIOCOM)
$C0B7 - control register (SIOCON)
Инициализация:
lda #$00
sta SIOSTAT - программный сброс (необязательно, на всякий случай)
lda #$09
sta SIOCOM - устанавливаем параметры протокола, режимы сигналов и включаем, собственно, приёмопередатчик
lda $1F
sta SIOCON - устанавливаем параметры протокола и скорость (в данном случае - 19200)
Инициализация простая, дубовая, в соответствии с даташитом и мало отличается в разных проектах. Собственно, после неё порт работает, НО!
Если приведённую выше программу инициализации я выполняю в составе своей программы (в данном случае - передача через xmodem), то значение $09 в регистр команд записывается, а значение $1F в регистр контроля - нет. После выполнения программы инициализации я проверяю содержимое регистров, из регистра команд считывается $09, из регистра контроля - $00. Само собой, никакой передачи-приёма не происходит.
Если же я инициализацию выполняю вручную через Монитор или Бейсик, процедура проходит нормально, микросхема инициализируется (из регистров считываются записанные значения) и, далее, обмен идёт нормально, я уже через xmodem погонял файлы. Я сперва предположил, что дело в задержке (хоть в других проектах никаких задержек нет и в даташите я по ним ничего не нашёл) и пробовал вставлять NOP между записью в регистры при инициализации - безрезультатно. Проблема с шиной? Но, тогда, почему после инициализации обмен идёт нормально? Через xmodem файлы передаются нормально, я загружал через терминал и запускал несколько игр.
Подумал, может быть, кто-нибудь использовал 6551 и сталкивался с подобным?
Даташиты, которые я использовал (принципиальной разницы нет, разные производители одного чипа):
https://disk.yandex.ru/d/7h0nn9uDZbjCMQ
https://disk.yandex.ru/i/tEz32u6cGveMkQ
https://disk.yandex.ru/i/IeSUe1GYxqODuQ
Сейчас работа сделана через костыль - бейсик-программа загружает в память программу xmodem, инициализирует 6551 (через poke) и потом запускает xmodem (через call).