Ручной выбор выбор всё равно придётся делать, так как есть клоны а-ля скорпион, с 216,220,224,228 тактов в строке. Как такое отдетектить - не знаю. Теоретически через порт #FF, но я бы не стал так делать.
Что точно можно отследить - пентагон или скорпион (по количеству тактов в строке). Можно отследить АТМ по контрольным точкам ПЗУ или по модели памяти. Можно попробовать отследить оригинальный спектрум по торможению в экране.

Даю код:

int_cla equ #bdbd+1 ; переменная адреса +1 инструкции "JP ADDR"
; на обработчик прерываний

ld hl,#be00 ; начало таблицы перехода
ld a,h
ld de,#be01 ; начало+1
ld bc,256 ; 256 раз, итого 257 значений так как одно
ld (hl),#bd ; уже установлено, адрес перехода всегда будет #bdbd
ldir ; для любого младшего байта вектора прерываний, заполняем
ld i,a ; устанавливаем, адреса выше - запас для стека который #c000
ld a,#c3 ; код команды JP
ld (int_cla-1),a ; адрес перехода по прерыванию хранится в #7e00-#7f00

ld hl,bas_cn1 ; адрес отработчика прерываний
ld (int_cla),hl ; собрали команду JP bas_cn1
im 2 ; теперь на прерываниях работает только процедурка вывода
ld bc,0 ; устанавливеам BC
ld hl,bas_cnb ; устанавливаем HL
ei
halt ; если тут произойдёт прерывание, то будет ошибка
bas_cn1 pop de ; забираем со стека адрес возврата, он не нужен, сейчас прерывание только началось
ld (int_cla),hl ; собрали команду JP bas_cnb, потратили 26 тактов
ei

bas_cp inc bc ; 6 тактов
jr $-1 ; 12 тактов

; так как 1 цикл прокруты занимает 18 тактов то должны получаться следующие значения:
; - BC = 3982 (#F8E) - для пентагона
; - BC = 3882 (#F2A) - для скорпиона
; - BC > 4096 (#1000) - турба

bas_cnb di
im 1
pop de ; забрали ненужный адрес возврата

ld a,b
cp #0f
jp c,bas_ste

cp #10
jp nc,bas_ste

ld a,c
cp #24 ; если в диапазоне #F24-#F30
jp c,bas_ste ; значит скорпион
cp #30
jp c,bas_cns

cp #88 ; если в диапазоне #F88-#F94
jp c,bas_ste ; возможно пень, если нет торможения в экране
cp #94
jp nc,bas_ste

im 2

ld hl,bas_cn2 ; адрес отработчика прерываний
ld (int_cla),hl ; собрали команду JP bas_cn2

ld hl,(#5800) ; проверяем торможение в экране
push hl
ld a,(#5802)
push af
ld hl,(bas_cp) ; берём код для проверки
ld a,(bas_cp+2)
ld (#5800),hl ; записываем код
ld (#5802),a

ld bc,0 ; устанавливеам BC
ld hl,bas_cn3 ; устанавливаем HL
ei
halt ; если тут произойдёт прерывание, то будет ошибка
bas_cn2 pop de ; забираем со стека адрес возврата, он не нужен, сейчас прерывание только началось
ld (int_cla),hl ; собрали команду JP bas_cn3, потратили 26 тактов
ei
jp #5800 ; переходим на счёт

bas_cn3 di
im 1
pop de ; забрали ненужный адрес возврата
ei

ld a,b
cp #0f
jp c,bas_sts

cp #88 ; если в диапазоне #F88-#F94
jp c,bas_sts ; возможно пень, если нет торможения в экране
cp #94
jp nc,bas_ste ; видимо первое измерение глюкнуло, машина не пень-подобная и не спектрум с тормозами в экране

xor a
ret ; a=0, CY=0, машина - пентагон

bas_sts ld a,2
and a
ret ; a=2,CY=0, модель - спектрум 128 (с тормозами в экране)


bas_cns ld a,1
and a
ret ; a=1, CY=0, модель - медленная М1 машина (скорпион)






bas_ste scf
ret ; включаем CY и выходим - ошибка, не смогли определить, возможно включен турбо-режим

---------- Post added at 21:30 ---------- Previous post was at 21:29 ----------

Вот же как он табуляторы испортил. Впрочем код всё равно готовый.