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

User Tag List

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

Тема: О быстром доступе к верхней памяти

  1. #1
    Activist Аватар для Jukov
    Регистрация
    03.12.2005
    Адрес
    Серов
    Сообщений
    491
    Спасибо Благодарностей отдано 
    13
    Спасибо Благодарностей получено 
    38
    Поблагодарили
    13 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию О быстром доступе к верхней памяти

    Вот настала пора расширить память моего Кворума-64 до 1 метра памяти, но вот вопрос, по какому стандарту? Что существует на сегодня для расширения до 1 метра:
    младшие 3 бита у всех машин по порту 7FFD, остальные:
    Profi 1024: D0-D2 порта DFFD
    ATM TURBO: D0-D2 порта FDFD
    KAY-1024: D7 порта 7FFD; D4,D7 порта 1FFD (ваще полный бардак)
    Pentagon 1024: D5-D7 порта 7FFD
    Если ошибаюсь, поправьте меня.

    А теперь о том, как это выглядит с точки зрения быстродействия драйвера, обслуживающего память. Пусть на входе в RG.A – номер банка, никакие регистры портить нельзя:
    Profi:
    PUSH AF
    PUSH BC
    PUSH DE
    LD BC,#7FFD
    LD E,A
    AND 7
    OR 16
    OUT (C),A
    LD A,E
    RRCA
    RRCA
    RRCA
    AND 7
    LD B,#DF
    OUT (C),A
    POP DE
    POP BC
    POP AF
    RET

    ATMTURBO: то же самое, только с портом FDFD.

    KAY:
    PUSH AF
    PUSH BC
    PUSH DE
    LD BC,#7FFD
    LD E,A
    AND 7
    BIT 3,E
    JR Z,M1
    OR 128
    M1 OR 16
    OUT (C),A
    LD B,#1F
    LD A,E
    BIT 5,A
    JR Z,M2
    OR 128
    M2 AND 144
    OUT (C),A
    POP DE
    POP BC
    POP AF
    RET

    Pentagon:
    PUSH AF
    PUSH BC
    PUSH DE
    LD BC,#7FFD
    LD E,A
    RLA
    RLA
    AND 224
    XOR E
    AND 224
    XOR E
    OUT (C),A
    POP DE
    POP BC
    POP AF
    RET

    А если использовать табличный метод, тогда:
    PUSH AF
    PUSH BC
    LD C,A
    LD B,TAB’
    LD A,(BC)
    LD BC,#7FFD
    OUT (C),A
    POP BC
    POP AF
    RET
    TAB 64 байта
    Плюс ко всему у Pentagon'a нельзя определить автоматически наличие верхней памяти из-за 5 бита порта 7FFD.

    Ну и как вам это нравится? Не один из способов расширения не обеспечивает главного – высокого быстродействия. А как следовало бы сделать по уму, чтобы обеспечить самое высокое быстродействие? Я думаю так:
    1) Первые три бита порта 7FFD должны дублироваться в дополнительном порту расширения (ДПР). Т.е. если мы даём команды LD BC,#7FFD, OUT (C),A, то изменяется и состояние первых трех битов ДПР. И наоборот, если даём команды LD BC,ДПР, OUT (C),A, то изменяется состояние битов порта 7FFD.
    2) Соответственно биты D3,D4,D5 ДПР отвечают за память свыше 128Кб. Биты D6 и D7 могут использоваться для расширения до 4 метров.
    3) Самый больной вопрос (уже слышу негативные оклики: “Опять новый стандарт выдумал!”, “У меня и так уже все адресные линии заняты!”, “Конфликтов со старыми портами не оберешься!”): По какому адресу цеплять ДПР?
    Чтобы избежать каких бы то ни было конфликтов с портом OUT(#FD),A и не ставить всякие кнопки ON/OFF можно ввести порт, который будет выбираться при A0=0 и, например, A5=0. Как правило, во всех мощных компах есть порт кемпстон джойстика. И обычно для определения порта используется мс ИД7, либо другая, у которой один из выходов и есть нужный нам порт. И заметьте – никаких конфликтов ни с внутренними устройствами, ни с внешними.

    А вот как будет выглядеть драйвер верхней памяти для данного расширения:

    OUT (222),A
    RET

    Чувствуете разницу?

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

  3. #2
    Activist Аватар для captain cobalt
    Регистрация
    13.03.2005
    Адрес
    Пермь
    Сообщений
    294
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    С теоретической точки зрения это действительно лучше. Используется меньше регистров и быстрее работает. (Осталось преодолеть два маленьких недостатка: нет софта и нет харда.)

    На практике же обычно можно избавиться от необходимости часто переключать страницы. alasm - быстрый ассемблер, бегающий на универсальных драйверах.

    Если же это необходимо, то можно несколько оптимизировать, храня #xxFD в альтернативном BC.

    А вот парочка цитат с http://atmturbo.nedopc.com/atmhist.htm
    Было еще одно неудобство: выбор экранных режимов и отключение ПЗУ были повешены на адресные линии A7-A5 (путем их обнуления) порта бордюра #FE. Казалось бы, все нормально, ну кто будет использовать только часть итак восьмиразрядного порта? Оказалось, что использовать стали и часто, а это приводило или к включению нестандартных экранов или к отключению ПЗУ и пятой страницы, что, естественно, приводило к зависанию во всех случаях.
    недостаток. Не связанный с ошибками: в ATM не был реализован Кемпстон-джойстик, о чем авторы честно всех предупреждали, ссылаясь, на экономию места на плате (чего там экономить?). Видимо, чем-то не любили они его, раз не реализовали его и в АТМ-2(+). И пользователям приходилось паять его вторым этажом.

  4. #3
    Activist Аватар для Jukov
    Регистрация
    03.12.2005
    Адрес
    Серов
    Сообщений
    491
    Спасибо Благодарностей отдано 
    13
    Спасибо Благодарностей получено 
    38
    Поблагодарили
    13 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Насчет нет софта. Софт на самом деле есть. Это все программы, которые используют внешний драйвер: Alasm, Sts, Страна Мифов и др. серьёзные проги. Причем Alasm, который при ассемблировании часто обращается к разным страницам, будет работать заметно быстрее. Написать драйвер дело 5 минут. Во-вторых, решением проблемы может стать совмещение в одной схеме двух типов расширений: моего и, например, profi, с возможностью програмного отключения последнего для совместимости с OUT(#FD),A.
    Насчет харда. Я тут проблемы большой не вижу. Реализовать этот порт проще пареной репы, особенно учитывая, что не нужно ставить дополнительных дешифраторов выборки порта. В ближайшее время займусь реализацией этого расширения для скорпа.

  5. #4
    Veteran Аватар для Sinus
    Регистрация
    29.01.2005
    Адрес
    Belarus, Grodno
    Сообщений
    1,279
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    вообще мне идея нравиться. надо будет только перекосоёжить немного порт #7FFD
    (сделать нижние три бита на отдельную ТМ-ку, дабы избежать лишних мультиплексоров).
    А по поводу совместимсти- все программы работающие с памятью свыше 128 кб делают это через драйвер (пару журналов не в счёт, ибо они и на 128к работают).

    да... МНЕ НРАВИТЬСЯ

    когда буду паять 16 колорз на кай изменю адресацию к верхней памяти.

    вот только порт 31 мне не нравиться. надо будет другой сделать.
    и обязательно с полной адресацией, пора привыкать уже
    [target] [zemu] [js8x] [pouet] KAY-1024, 5''FDD, 3''FDD, HDD

  6. #5
    Activist Аватар для Jukov
    Регистрация
    03.12.2005
    Адрес
    Серов
    Сообщений
    491
    Спасибо Благодарностей отдано 
    13
    Спасибо Благодарностей получено 
    38
    Поблагодарили
    13 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Да, с АТМ полная жопа выходит. Хотя я не представляю, что это были за программы, которые обращались к порту с A0=0. У меня на Кворуме-192 есть порт 126, который отвечает за теневое озу и память, но у меня никогда не висли программы из-за этого порта. Вот еще вариант (идея украдена у скорпионщиков): разместить этот порт в TR-DOS, и где-то среди адресов #3D00-#3DFF прошить команду записи в этот порт и RET.

    Проект стандарта:
    Если порт размещен в пространстве SOS, тогда по адресу #0013 прошиваем следующее:
    0013 D3XX OUT (#XX),A
    0015 C9 RET
    0016 YY ;Байт контрольной суммы
    где XX - адрес ДПР

    Если порт размещен в адресном пространстве TR-DOS, тогда прошиваем:

    3D5C CD925C CALL #5C92
    3D5F 00 NOP
    3D60 1805 JR #3D67
    3D62 00 NOP
    3D63 D3XX OUT (#XX),A
    3D65 C9 RET
    3D66 YY ;Байт контрольной суммы

    Точка входа #3D62, при этом не нужно пользоваться точкой входа 15663.

    Программа автоконфигурации работает следующим образом:
    1) Проверяется наличие байтов #D3 по адресу #0013 и #C9 по адресу #0015. Если они там есть, считывается контрольная сумма 3 байт с адреса #0013 и сверяется с #0016. Если всё сошлось используем для переключения банков команду CALL #0013
    2) Если пункт 1 не прошел копируем с помощью #3D13 3 байта из ПЗУ TR-DOS по адресам #3D62, #3D63 и #3D65. Сверяем ячейки с эталоном, проверяем контрольную сумму. Если всё сошлось используем для переключения банков команду CALL #3D62.
    Последний раз редактировалось Jukov; 21.01.2006 в 21:23.

  7. #6
    Activist Аватар для captain cobalt
    Регистрация
    13.03.2005
    Адрес
    Пермь
    Сообщений
    294
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Нет. Такой автоконфигуратор не годится. Необходима поддержка существующих клонов.

    Поэтому предлагается использовать резидент в ОЗУ.

    А именно. Программа определяет наличие резидента, проверяя байты по общеизвестному адресу в общеизвестной странице памяти (например, строку типа "MemDrv"). Если резидент обнаружен, то рядом указывается адрес процедуры переключения банка. Если адрес указывает в ПЗУ, его можно напрямую использовать по назначению. Если адрес указывает в ОЗУ, то он указывает на перемещаемый драйвер с указанием длины не более N байт. Тогда программа может скопировать себе этот драйвер в более удобное место. Возможно в несколько мест.

    Остаётся лишь встроить поддержку в коммандеры, чтобы запуская программу они оставляли резидент с драйвером памяти. В дальнейшем установку резидента можно встраивать в новые прошивки бейсиков/TR-DOS.

  8. #7
    Activist Аватар для Jukov
    Регистрация
    03.12.2005
    Адрес
    Серов
    Сообщений
    491
    Спасибо Благодарностей отдано 
    13
    Спасибо Благодарностей получено 
    38
    Поблагодарили
    13 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я не правильно выразился. Если пункты 1 и 2 автоконфигуратора не проходят, тогда память определяем стандартными средствами через out'ы в FDFD, DFFD, 1FFD. Тем самым сохраняется совместимость с существующими клонами. Или если компьютер вааще нестандартный, то вместо команд out(xx),a ret прошиваем JP DRIVER. Ессесно автоконфигуратор должен уметь расшифровывать этот вариант.
    Последний раз редактировалось Jukov; 22.01.2006 в 14:59.

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

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

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

Похожие темы

  1. Ответов: 6
    Последнее: 10.09.2013, 16:04
  2. Порты памяти - Scorpion и др.
    от ASMAN в разделе Программирование
    Ответов: 27
    Последнее: 18.06.2008, 12:20
  3. Расширение памяти
    от alexfreed в разделе Память
    Ответов: 7
    Последнее: 16.11.2005, 17:49
  4. Ответов: 76
    Последнее: 18.07.2005, 13:34
  5. Мег памяти на скорпе...
    от lvd в разделе Scorpion
    Ответов: 8
    Последнее: 04.06.2005, 12:06

Ваши права

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