Важная информация

User Tag List

Показано с 1 по 7 из 7

Тема: ZX Detector

  1. #1
    FishBone Crew Аватар для breeze
    Регистрация
    11.02.2005
    Адрес
    【RB】
    Сообщений
    3,586
    Благодарностей: 764
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Exclamation ZX Detector

    Для одного проекта требуется небольшой код, который бы обнюхал и выдал модель zx-spectrum:

    - pentagon
    - scorpion
    - atm
    - spectrum

    Нужно для последующей корректировки смещения на border. возможно необходима добавить ещё каких нибудь модели.

    Буду премного благодарен, если кто-то поможет. Сам пока занят написанием другой части…

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Activist
    Регистрация
    17.01.2005
    Адрес
    Belarus, Minsk
    Сообщений
    402
    Благодарностей: 36
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Можно выдрать такой код из подпрограмм, определяющих размер ОЗУ: http://zxdn.narod.ru/coding.htm#memoryd
    ATW4GS / BIN2SNA / SquareMania <ТИ-3> / Ужасм+
    ATM-Turbo 512 v4.50, Commodore 64G + TAC-2, Retro-Bit Super Retro TRIO

  4. #3
    FishBone Crew Аватар для breeze
    Регистрация
    11.02.2005
    Адрес
    【RB】
    Сообщений
    3,586
    Благодарностей: 764
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Aprisobal Посмотреть сообщение
    Можно выдрать такой код из подпрограмм, определяющих размер ОЗУ: http://zxdn.narod.ru/coding.htm#memoryd
    Спасибо, видимо придётся самому смотреть. Лишний раз подтверждение — «спасение утопающих, дело рук самих утопающих!»

  5. #4
    Member Аватар для Antipod
    Регистрация
    19.08.2008
    Адрес
    Украина, Львов
    Сообщений
    116
    Благодарностей: 10
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    безобразный оффтоп, конечно же... Но в BGE, в свое время, наткнулся на одну любопытную штуку - на моем АТМ-1 определяло 23 страницы вместо 32... Потом точно такой же результат встречал еще в нескольких прогах... Жить не особо мешало... Это к тому, что источник этой ошибки, видимо, один: кто-то поделился сорцами. И вообше практика показывает: автодетект самое большое зло, так как он может ошибаться. Одумайся! )

  6. #5
    Guru Аватар для Дмитрий
    Регистрация
    01.01.2009
    Адрес
    Донецк, Украина
    Сообщений
    3,234
    Благодарностей: 715
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Antipod, суть автодетекта в данном контексте не объем памяти, а растактовка компа для мультиколоров и бордюрных эфектов. тут имхо не зло... хотя ручной выбор не помешал бы

  7. #6
    FishBone Crew Аватар для breeze
    Регистрация
    11.02.2005
    Адрес
    【RB】
    Сообщений
    3,586
    Благодарностей: 764
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Дмитрий Посмотреть сообщение
    хотя ручной выбор не помешал бы
    ну скорее так будет проще всего и сделать

  8. #7
    Veteran Аватар для GriV
    Регистрация
    18.02.2005
    Адрес
    Набережные Челны
    Сообщений
    1,574
    Благодарностей: 104
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ручной выбор выбор всё равно придётся делать, так как есть клоны а-ля скорпион, с 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 ----------

    Вот же как он табуляторы испортил. Впрочем код всё равно готовый.
    Биты рулят лучше байтов, байты рулят шустрее!
    View, Звук, Цвет

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •