Cluster,
supremacy имел в виду детектор сброса, который обычно собирается на RCD цепочке. Его действие основано том факте, что ядро 6502 в нормальной работе генерирует стабильную частоту на ноге F2. И пропадание этой частоты определяется как нажатие на сброс (потому что оно реально пропадает, если активен сигнал сброса, точнее вывод уходит в Z). И многоигровки, использующие это как сброс сдампить этим программатором нельзя.
Но самая засада в том, что этот самый F2 управляет состоянием шины. Когда он = 0 шина пассивна, когда он = 1 - активна. Т.е., картридж обязан отключаться, если F2 = 0. Так же, процессор стабилизирует остальные управляющие сигналы именно когда F2 = 0: речь об адресах и сигнале направления данных R/W. И как только F2 = 1 все эти сигналы должны быть стабильны.
В моем дампере стоит STM32F4, вот он на 168МГц ядра успевает подстроиться под F2, который генерируется таймером и полностью соответствует по скважности и частоте сигналу оригинального ядра 6502. И код при этом очень тугой в плане таймингов + отключены прерывания (код проверен на соответствие таймингов логическим анализатором):
// Чтение данных PRG в буфер
__attribute__ ((naked)) void Read_PRG( uint8_t *PBuf, uint32_t Start, uint32_t Size )
{ // Начинаем
__asm volatile
( "PUSH {R0-R8}\n"
// R0 = PBuf
// R1 = Start
// R2 = Size
// R3 = GPIOA_IDR (Для чтения F2)
"MOVW R3, #0x0010\n"
"MOVT R3, #0x4002\n"
// R4 = GPIOE_ODR (Для вывода адреса)
"MOVW R4, #0x1014\n"
"MOVT R4, #0x4002\n"
// R5 = GPIOD_IDR (Для ввода данных)
"MOVW R5, #0x0C10\n"
"MOVT R5, #0x4002\n"
// R6 = Маска $0000FFFF
"MOVW R6, #0xFFFF\n"
"MOVT R6, #0x0000\n"
// Выделим
"AND R1, R1, R6, LSL #0\n"
"AND R2, R2, R6, LSL #0\n"
// Синхронизируемся
"CPSID f\n"
"Read_PRG_Syn0:\n"
"LDR R7, [R3, #0]\n"
"ANDS R7, R7, #1\n"
"IT EQ\n"
"BEQ Read_PRG_Syn0\n"
"Read_PRG_Syn1:\n"
"LDR R7, [R3, #0]\n"
"ANDS R7, R7, #1\n"
"IT NE\n"
"BNE Read_PRG_Syn1\n"
// Цикл чтения
"Read_PRG_Loop:\n"
// Выставляем адрес
"STR R1, [R4, #0]\n"
// Ждем F2 = 1
"Read_PRG_LWt0:\n"
"LDR R7, [R3, #0]\n"
"ANDS R7, R7, #1\n"
"IT EQ\n"
"BEQ Read_PRG_LWt0\n"
// Увеличиваем адрес чтения
"ADD R1, R1, #1\n"
// Ждем F2 = 0
"Read_PRG_LWt1:\n"
"LDR R8, [R5, #0]\n"
"LDR R7, [R3, #0]\n"
"ANDS R7, R7, #1\n"
"IT NE\n"
"BNE Read_PRG_LWt1\n"
// Сохраняем данные
"AND R8, R8, #0x00FF\n"
"STRB R8, [R0, #0]\n"
// Следующий байт
"ADDS R0, R0, #1\n"
// Счетчик байт
"SUB R2, R2, #1\n"
"ANDS R2, R2, R6, LSL #0\n"
"IT NE\n"
"BNE Read_PRG_Loop\n"
"CPSIE f\n"
// Обнулим адрес
"MOVW R6, #0x0000\n"
"STR R6, [R4, #0]\n"
"POP {R0-R8}\n"
"BX LR\n"
);
}
А вот AVR, скорее всего, не успеет программно это сделать. Причем, проблема будет острее для режима записи. Хотя, конечно, попробовать можно реализовать. Я подумаю на будущее.