RP2350 поймал цикл Z80, но ROM требует ответа за 250 нс
На настоящем Amstrad CPC 464 команда PRINT INP(&FBEE) вернула 128. За этим одним байтом стоит момент, в котором Z80 выставляет адрес, активирует I/O-чтение и ждёт, пока внешняя плата положит данные на восьмибитную шину. LambdaSpeak 4 успела: RP2350B принял цикл через PIO и отдал ответ. Но следующий замысел той же платы — притвориться системной ROM — упирается в гораздо более жёсткий такт: автор оценивает доступное окно примерно в 250 нс, тогда как один проход основного цикла прошивки занимает 4.43 мкс.
Один байт как проверка всей шины
Именно этот разрыв делает проект интереснее обычной истории о ретрокомпьютерной периферии. В прежней LambdaSpeak синтез речи, проигрывание сэмплов, UART, часы и логика сопряжения распределялись между ATmega644P, CPLD XC9572, специализированными речевыми микросхемами и EEPROM. Новая плата пытается собрать значительную часть цифровой стороны в RP2350B. Его PIO-машина умеет синхронно наблюдать GPIO, сдвигать поля сигналов и работать с FIFO без участия инструкций Cortex-M33 или Hazard3 на каждом фронте.
Первый живой обмен оказался совсем не похож на аккуратную демонстрацию одной удачной идеи. Направление DIR у 74LVC245 оказалось истолковано наоборот, поэтому двунаправленный буфер смотрел в неверную сторону. Инструкция PIO in pins, 16 при выбранном направлении сдвига складывала адрес в старшую половину ISR, хотя код ожидал его в младшей. Четыре критических сигнала — /IORQ, /RD, /WR и /ROMEN — физически остались неподпаянными; это выдали слабые внутренние подтяжки GPIO. После исправлений чтение по FBEE заработало, а серия OUT в тот же порт заставила плату произнести «hello».
Почему плата заговорила только после серии мелких поломок
Шина быстро нашла следующую ловушку. Машина PIO посылала в RX FIFO события от каждой записи в память, хотя синтезатору нужны лишь обращения к своему порту. FIFO заполнялась посторонними циклами, и байты аллофонов терялись. Сигнал ROMDIS столкнулся с выходом DDI-3, поскольку оба драйвера работали push-pull; дорожку пришлось перерезать и добавить диод Шоттки 1N5817. Даже громкость оказалась аппаратно-прошивочным дефектом: неверное масштабирование уровня DECtalk дало примерно на 15 dB более тихий звук.
Для I/O-регистра PIO уже выполняет работу, ради которой на прежней плате требовалась программируемая логика: распознаёт 16-битный адрес и форму цикла чтения или записи с детерминированной задержкой. ROM-responder устроен строже. Ему недостаточно сообщить ядру о событии и дождаться обработчика: адресный отбор и формирование ответа должны жить внутри PIO либо в другой логике, способной выставить байт в пределах окна Z80. Здесь микроконтроллер перестаёт быть «быстрым вообще»; ценность определяет конкретный путь сигнала от /RD до данных на шине.
Граница между PIO и ответом ROM
Полной заменой старой архитектуры LambdaSpeak 4 пока не стала. Продемонстрирован I/O-тракт, ROM emulation ещё диагностируется и не реализована, LambdaDrum также не готов. Зато уже получен важный инженерный результат: PIO в RP2350 способен занять место CPLD там, где протокол укладывается в его state machine и FIFO. Там, где внешняя шина требует ответа за сотни наносекунд, архитектуру приходится строить вокруг фронтов, сдвиговых регистров и разрешения драйверов, а не вокруг скорости main loop.