PDA

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



Jukov
21.01.2006, 00:09
Вот настала пора расширить память моего Кворума-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

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

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

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

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

А вот парочка цитат с http://atmturbo.nedopc.com/atmhist.htm

Было еще одно неудобство: выбор экранных режимов и отключение ПЗУ были повешены на адресные линии A7-A5 (путем их обнуления) порта бордюра #FE. Казалось бы, все нормально, ну кто будет использовать только часть итак восьмиразрядного порта? Оказалось, что использовать стали и часто, а это приводило или к включению нестандартных экранов или к отключению ПЗУ и пятой страницы, что, естественно, приводило к зависанию во всех случаях.

недостаток. Не связанный с ошибками: в ATM не был реализован Кемпстон-джойстик, о чем авторы честно всех предупреждали, ссылаясь, на экономию места на плате (чего там экономить?). Видимо, чем-то не любили они его, раз не реализовали его и в АТМ-2(+). И пользователям приходилось паять его вторым этажом.

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

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

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

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

вот только порт 31 мне не нравиться. надо будет другой сделать.
и обязательно с полной адресацией, пора привыкать уже ;)

Jukov
21.01.2006, 16:38
Да, с АТМ полная жопа выходит. Хотя я не представляю, что это были за программы, которые обращались к порту с 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.

captain cobalt
21.01.2006, 23:43
Нет. Такой автоконфигуратор не годится. Необходима поддержка существующих клонов.

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

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

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

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