Люди, кто-нибудь может подсказать процедуру наличия и определения расширенной памяти (больше 128K), корректно работающую не только на наших клонах но и на классике ?
Вид для печати
Люди, кто-нибудь может подсказать процедуру наличия и определения расширенной памяти (больше 128K), корректно работающую не только на наших клонах но и на классике ?
Насколько я знаю, на классике нет расширенной больше 128к памяти, по крайней мере, более-менее распространенных и стандартизованных вариантов.
А есть ли способ определить наличие страниц памяти хотя бы 128 Кб без переключения страниц? Или хотя бы с возвращением текущей активной страницы? Всё, что я видел, это запись в адреса >= #C000, переключение страницы и сверка записанного. Нельзя ли более изящно?
Зато на поздних моделях есть порты конфигурации конфликтующие с расширениями памяти наших клонов.
Вопрос не в том есть или нет доп память на классике, а в том чтобы процедура определения определила есть память (и какая) или нет а не скинула или повесила комп.
Кстати парк клонов ведь пополнился некстом, кто-нибудь знает как определять и переключать память там ?
Для общего случая без переключения страниц не обойтись. Возвращение текущей активной страницы для определялки врятли имеет смысл, но если очень надо, то колхозить с записью идентификаторов а потом проверять. )) Ну и да, если запуск из бейсика, то можно переменную проверить. Но тут не факт что запуск из 128-го бейсика будет.
определится спек48, там проверка хитрая через переменную (frames)
Нашел я эту процедуру. Насколько я понимаю, она ниасилит отличить режим 48к с залоченным портом #7FFD (48 BASIC из меню) и незалоченным (после USR0).
- - - Добавлено - - -Код:HE281_0 HALT
LD BC,H0000
LD HL,H0000
LD (H5C78),HL
LD (H5C79),HL
LD E,#00
LD A,#FF
LD HL,H5C78
HE295_0 INC E
JR NZ,HE299_0
INC BC
HE299_0 CP (HL)
JR NZ,HE295_0
LD A,B
CP #07
JR NZ,HE2BB_0
LD A,C
CP #5E
JR Z,HE2D5_0
CP #63
JR Z,HE2CE_0
JR HE2BB_0
Проверил в эмуле - да, ниасиливает. Она выдает в BC:
#075E - для 48к
#0759 - для 128к/+2 c включенным ПЗУ Basic 128 (при загрузке из меню или из бейсика 128)
#0763 - для 128к/+2/+2А/+3 с включенным ПЗУ Basic 48 (после USR0 или после выбора в меню 48 BASIC), независимо от залоченности порта #7FFD.
Я к тому, что поставленную задачу - выяснить, есть ли расширенная память, которой можно управлять, она решает с оговорками - режим USR0 она не определяет. Версию бейсика да, можно определить. Также можно определить тайминги для рисунка на бордюре с учетом модели и запущенного бейсика, для этого она в Sentinel и используется. Для определения таймингов растра она уже не подходит - 128/+2 от +2А/+3 не отличит.
М-даа, похоже самый простой вариант обезопасить комп от вылета - проверить наличие медленной памяти перед проверкой конфигурации и отключить проверку, если она есть. Насколько я понял у компов с раздельными полями памяти расширения над 128K если только у экзотики какой есть ))
Проще посмотреть раскладку битов порта 1FFD у +2А(B)/+3 и у Скорпиона, и написать код, различающий их.
Выбрать адрес ячейки по которому во всех банках ОЗУ. Далее щёлкаем страницами и сохраняем содержимое этой ячейки каждой страницы в буфере. Затем пишем в эту ячейку номер страницы, начиная с конца (идём от максимума возможного кол-ва банков), т.о. доходим до 0-ой. Далее цикл проверки: идём от начала и сверяем записанное значение с номером страницы, как получаем несовпадос, так у нас фактическое кол-во живых банков. После восстанавливаем содержимое ячеек из буфера.
Я лично со времен пришел к выводу что такой подход не нужен и не актуален
лучше и надежней сделать свою версию софтвари для каждой машины (благо их не много)
это раньше было нужно
когда интернетов не было
и софтом обменивались
и нужно было чтоб оно запустилось везде
щас все версии моментально скачаются одним архивом
выбрал нужную и закинул (и скорей всего в 99% случаев будет закидывание в резиновый эмулятор)
да и у каждой машины свои средства загрузки и запуска софта
каким образом буржуйский +3 загрузит наш трд? (ладно загрузит)
зачем буржуину грузить на +3 256к онли софт который не заработает в любом случае?
зачем пентагону пытаться грузить некст онли софтварь?
зачем пихать 15к драйверов памяти в софтварь и делать более медленное переключение страниц?
когда можно переключать страницы наиболее быстрым для машины способом
у одних все страницы на одном порте
у других на двух
у некоторых можно юзать не полную дешифрацию например
зачем тянуть и грузить ресурсы которые используются только на других машинах?
проще запилить все переключения памяти на макросах и условной компиляции
и собрать несколько 100% рабочих вариантов
для машин для которых софтварь предназначается
Да собственно сам спектрум уже давно и не нужен и не актуален, однако мы вот собрались на этом форуме, вспоминаем времена "когда интернетов не было" )). Так что это вопрос исключительно личных предпочтений, так мне например универсальный подход нравится больше чем куча одинаковых с лица прог на каждый клон. И даже по барабану что заводятся они все в эмуляторе с полпинка ))
просто нужно понять
что производительность у спектрума не та
чтобы разводить на нем всякие ОС и обращения ко всему через драйвера..
и пару десятков тактов лучше сэкономить
тем более когда не знаешь на каком железе эта твоя умная определялка только нагадит
как вариант можно делать ручное включение нужного типа памяти
перед началом автоопределения
делать опрос клавиатуры
повесить каждый режим на свою клавишу
или же запилить менюшку с выбором
в случае не правильной работы определялки
можно будет в ручную запустить с нужным\рабочим драйвером памяти
Собственно собрал определялку памяти (правда только до 1024 K ), точнее выдрал и переработал что была в BGE. Может кому пригодится.
Получилост конечно ацки как-то, но и фиг с ним. :v2_dizzy_gamer: Исходник под ужасм, тестовая прога завёрнута в trd.
Не сбрасывается (по крайней мере не должен) на +2A,+3 (если есть бетадиск с тырдосом или его эмулятор-заменитель типа divMMC/divIDE с esxdos)
Определяет pentgon 256-512, pentagon1024sl (старая версия 1.4x за KAY должна сойти), scorpion 256-1024, kay 256-1024, atm, atm2, profi. Эва определяется как пентагон 1024 (хотя думал что будет как atm2)) )
Конечно проверял на эмуляторах, так что х.з. мог и напортачить, хотя вроде не должен :rolleyes:
Ну да, определялка только 1024sl стандарт определяет. Я мельком видел вроде и другие варианты расширения памяти для пентагона, но нормальной инфы по таким машинам не нашёл.
Кстати я в демонстрашке забыл сообщение для 48 K сделать .... Зы забавно пишет: ATM TURBO 2+ rev 7... 16 kb memory found :D
Оставлю забавный ляпчик ))
Dart Alver, использовал сборку для создания пары адресов (для каждого порта) в таблице. Для Kay1024 не совпало, т.к. от Pent1024. Для остальных ещё не проверял. Хотел узнать, спецификация увеличения памяти для каждого клона учитывается, вообще? Например, у ОС, там же свои таблицы адресов. Если на них запускать программу, по идее может быть дан от ОС список свободных банок. Чтобы он совпал и свой драйвер щёлкал свободные (если, конечно, ОС отдаёт прерывание и управление программе полностью на время работы, этого не знаю) страницы в своё логическом пространстве?
П.С.:Есть ли желание поиск до 4МБ расширить. Драйвера сам попробую для новых найденных клонов дописать.
Не понял темы, что именно не совпало и с чем должно было совпасть ?
По найденному в интернете мануалу к KAY1024 для расширения памяти свыше 128K используются биты 4,7 порта #1FFD и бит 7 порта #7FFD.
Схема адресации банков памяти KAY1024
Опять не понял ? Что за спецификация увеличения памяти для каждого клона ?
Разумеется определение ведётся по реакции на запись в порты конфигурации различных клонов. При этом по возможности используется последовательность опроса не вызывающая конфликта дешифраторов портов.
Какая ОС имеется ввиду ? Определялка не портит содержимое в страницах (вроде бы), но она не подгонялась под какие либо ОС.
Честно влом. По сути это не так уж и сложно, но нужно буфера под нумерацию страниц больше давать.
Кстати я могу ошибаться (это проверить надо бы да не на чем), но вроде бы NEXT при текущей определялке должен определиться как PROFI 1024 ;)
--------------------
А, понял, имелось ввиду не PENTAGON 1024SL а старый вариант PENTAGON 1024 v1.4x ? Да этот вариант расширения пентагона вроде как и делали по стандарту кая. Но в массе не прижился. Были вроде бы и другие варианты расширения до 1024, но тоже типа не прижились.
Здесь показаны логические биты, которые должны стать физическими (фактическими) по задумке авторов и спецификации на KAY1024. В IS-DOS (например) это, согласно автору, соблюдено. На картинке тоже самое, согласно спецификации. В драйвере по другому используется эта таблица (старшинство логических битов изменено, походу). С эмулятором unreal не совпадает в половине случаев и с реальностью тоже. Драйвер для KAY1024 уже переписал, осталось всё проверить.Код:; #1FFD #7FFD
;Physical D7 D4 D7 D6 D5 D4 D3 D2 D1 D0
;Logical D4 D3 D5 D2 D1 D0
; 16 8 32 4 2 1
Что за спецификация увеличения памяти для каждого клона?
Ну как я понял, это какой бит по старшинству, по задумке авторов железа, идёт по очереди в банке для расширения памяти. Можно и в другой комбинации их использовать. Про соблюдение спецификации, здесь смысл такой. ОС (любая, наверно) работает с физическими банками, делает их логическими (в примитивной теории), согласно спецификациям. И, чтобы дешифрация совпадала у драйвера и ОС, нужно одинаковый алгоритм, при котором, у всех одна и та же логическая страница, одинаково дешифруется.
Вот так совпало, с спецификацией.
Поиск пары физических адресов, с вызовом вот такой:Код:rKAY1024 ; KAY 1024
ld e,a ; копия логической страницы
and %00011000 ; выделяем биты для порта #1FFD
sla a ;8 ; двигаем бит с D4 на D5, с D3 на D4
ld d,a ; копия
sla d ;8 ; двигаем бит с D5 на D6
sla d ;8 ; на D7
or d ; соединяем D7 и D4
and %10010000 ; оставляем D7 и D4, мусор убираем
ld h,a ; копия физ.адреса для порта #1FFD
ld bc,#1FFD ; порт страниц
out (c),a ; данные в порт
ld a,e ; логической страницы, оригинал
and %00100000 ; бит D5 логической страницы оставляем
ld d,a ; копия
sla d ;8 ; двигаем бит с D5
sla d ;8 ; на D7
ld a,e ; логической страницы, оригинал
and %00000111 ; оставляем D2, D1, D0
or d ; соединяем бит D7 и D2, D1, D0
or %00010000 ; + BASIC48 ;#10
ld l,a ; копия физ.адрес для порта #7FFD
ld b,#7F ; порт страниц
out (c),a ; данные в порт
;?nop
ret
lKAY1024 EQU $-rKAY1024
Код:;С - порядковый номер в массиве логических страниц (где они соответствуют физическим адресам)
;Проще, для нас страницы от 1 до 256 [0..255],
; в массиве свободные логические по спецификации клона, без исключённых
bKAY1024
;ld c,a ; можно в регистре С страницу передать
ld b,0
sla c ; умножение на два
ld hl,TBL_Physical_RAM ; находим в таблице начало
add hl,bc ; физической пары страниц
ld a,(hl) ;7
ld bc,#1FFD
out (c),a
inc hl ; inc h, если выровнено по сегментам в 256Б
ld d,(hl)
ld a,(vVideoBankD3)
or d
ld b,#7F
out (c),a
;?nop
ret
eKAY1024 EQU $-bKAY1024
Да точно есть такое. Моя ошибка, хотя для моих использований не критичная.
Вот ещё. )) Классике жанра - Tr-dos 5.03/04T глубоко начхать на банки памяти и на их порты. Версиями 6.xx не увлекался поэтому х.з. Но при работе с физ. носителя думаю тоже можно послать далеко и надолго и пользовать как сам хочешь. Для извращений типа IS-DOS и прочего надо под их формат подгонять но это на любителя.
В общем зацепило )) , тоже покумекал над дровом для кая, получилось так:
NOP после OUT может и не нужен х.з. осталась привычка ставить. Вроде даааавно читал что ставили дабы на некоторых тупых клонах страницы успевали перещёлкнуться ))Код:rKAY1024 ; KAY 1024
DISP RAM_DRV
rlca
ld d,a
ld e,a
rlca
rlca
rr d
and %10000000
xor e
and %11101111
xor e
ld bc,#1FFD
out (c),a
nop
ld b,#7F
ld a,d
and %10000111
or #10
out (c),a
nop
ret
ENT
lKAY1024 EQU $-rKAY1024
По поводу поиска пары "физических адресов" которые ни разу не адреса. Честно не понял нафига оно вам ? Для ускорения доступа ? Ну может быть, х.з. по обстоятельствам.
В общем успехов в доработках, надеюсь что-нибудь путное получится ))
Для Pentagon1024 (через #7ffd c bit 5) тоже не совпадают. Пишут, что задумано так:
0x7FFD бит 7 - 256 КБ
0x7FFD бит 6 - 512 КБ
0x7FFD бит 5 - 1024 КБ
Есть желание допилить до спецификации? D7 и D5 местами поменять, походу нужно.
Дрова для KAY забрал, -4 такта ещё получилось снять
Код:sla a ;8 ; двигаем бит с D4 на D5, с D3 на D4
ld e,a ;4 ; копия логической страницы со сдвигом влево
and %01110000 ;7 ; выделяем биты для порта логические D3,D4,D5
ld d,a ;4 ; копия
sla d ;8 ; двигаем бит D6 -> D7, D5 -> D6, D4 -> D5
rlc d ;8 ; D7 -> CY, D6 -> D7, D5 -> D6
rr e ;8 ; двигаем вправо, восстанавливаем логическую страницу + CY -> D7,
or d ;4 ; соединяем D7 и D4
and %10010000 ;7 ; оставляем D7 и D4, мусор убираем
ld bc,#1FFD ;10 ; порт страниц
out (c),a ;12 ; данные в порт
ld a,e ;4
and %10000111 ;7 ; выделяем биты
or %00010000 ;7 ; + BASIC48 ;#10
ld b,#7F ;7 ; порт страниц
out (c),a ;12 ; данные в порт
;?nop
ret ;10
Не знаю по какой спецификации вы смотрели Pentagon но в инструкции на сайте по Pentagon1024sl биты 5,6,7 следуют по порядку.
Да еще, вместо sla a лучше используйте add a,a (а в нашем случае пойдет и rla и rlca) 4 такта вместо 8 и 1байт вместо 2-х
- - - Добавлено - - -
Да насчет пентагона. Впринципе возможно вы правы. Вы подали идею - надо будет проверить как работает рамдиск в real commander. Pentagon 1024 она вроде не определяет, значит надо сделать чтоб рамдиск от 512 заводился на 1024. Хм...
Да нет в общем то не получилось, если посчитать удаление паразитных NOP. Ну тут бзик у меня такой ))
Но в общем снять ещё можно, если скажем не прокручивать регистры длинными инструкциями, а прокручивать аккумулятор короткими, типа так :
- - - Добавлено - - -Код:add a,a ; 4 сдвиг битов влево
ld d,a ; 4
and %01110000 ; 7 маска старших битов
ld e,a ; 4 сохранение для d4
add a,a ; 4 сдвиг битов влево
add a,a ; 4 сдвиг битов влево получение d7 для #1FFD , перенос в fC d7 для #7FFD
rr d ; 8 возврат позиций младьших битов и установка d7 для #7FFD в рег. D
or e ; 4 объединение битов d4 и d7 для #1FFD
and %10010000 ; 7 маска
ld bc,#1FFD ; 10
out (c),a ; 12
nop ; 4 на всякий х.з. случай. А может и не надо ))
ld a,d ; 4 биты для #7FFD
and %10000111 ; 7 маска
or #10 ; 7 установка rom1
ld b,#7F ; 7 порт
out (c),a ; 12
nop ; 4 опять фигня на всякий случай ))
ret ; 10 усё !
; Итог:
; 123 такта с паразитами, 115 без NOPов
; 29 байт с паразитами, 27 без nop
А -а ! Я вспомнил почему у меня были перепутаны биты для драйвера кая.
Это было сделано специально для совместимости с ram-диском Real Commander
Раньше использовался единый драйвер доп. памяти для кая и скорпиона и RC работает по формату этого драйвера. Хотя я считаю что не стоит пихать лишние биты по непонятному назначению, но ради совместимости спецификация идёт лесом ))
А вот для пентагона совместимость не выдержал, надо будет исправить ))
Опробовал по Pentagon 1024sl.
Классический вариант соответствия нумерации страниц с эмулями:
Для совместимости с ram-диском REAL COMMANDER , которая понимает только 512 k:Код:ld d,a
and %00011000
add a,a
add a,a
add a,a
xor d
and %11011000
xor d
or #10
ld bc,#7FFD
out (c),a
nop
ret
Код:ld d,a
and %00011000
add a,a
add a,a
add a,a
xor d
and %11011000
xor d
or #10
ld d,a
and %11000000
ld a,d
jr z,1F ; для совместимости с REAL COMMANDER ( определяет только 512 K )
xor %00100000 ; используем для ram-диска от pentagon-512
1 ld bc,#7FFD
out (c),a
nop
ret
На эмуляторе unreal в программе pentagon 256/512 определяется как rPen1024
Предыдущий драйвер не щёлкал страницы совсем на pentagon 256/512.
Код:ld hl,rPen1024
ld bc,lPen1024
bit 7,(ix+0)
ret nz
ld hl,rPen512
ld bc,lPen512
bit 6,(ix+0)
ret nz
Как я понял проверяется ram0 в cpu0 (D3). Это потому, что pentagon 256/512 в реале не умеет этого?
В эмуляторе ставишь pentagon 1024 и заглушку на D3 (#EFF7), то определяется как pentagon 512.
Как там логику поправить, чтобы корректно определял?
По ходу никак поправить нельзя. По крайней мере у меня идей нет.
В Xpeccy при выборе варианта пентагон 128/512 порт #EFF7 отсутствует. В последних Unreal с какого-то перепугу сделали порт #EFF7 доступным и существующим вообще для всех моделей спектрума и не только пентагона и ATM. Ну х.з. но я считаю что Unreal здесь неправ. Конечно, может этот порт и напаивали, но к схеме памяти он отношения не имел и думается в большинстве 512-х его всётаки нет, а вот в Pentagon 1024SL он как-бы встроен официально. Лучше бы конечно сделать опрос владельцев 512-х пентагонов и узнать точнее, но ...
Поэтому тут пока только два выбора или лочить вручную порт на эмуле или ограничиться определением только 512 K. поскольку способа определить 1024 K, не залочив 128-ю память кроме наличия порта #EFF7 (а разлочку в порте не предусмотрели к сожалению) я не вижу. Единственное считаю что правило хорошего тона в программировании под расширенную память толкует дополнительно дать возможность пользователю проги отказаться от автоопределялки и выбрать расширение памяти вручную для таких исключений из правил.
Вот да. Во многих эмуляторах, в частности в SpecEmu только модель Pentagon128, и соответственно детектится как Spectrum128.
Хотелось бы разделить эти модели. Или слишком сложно определить contended memory ? Только по тактам?
И хотелось бы увидеть все же последнюю сборку..
Разделять имеет смысл если программа использует разные решения в зависимости от типа и скорости памяти, типа мультиколор или чего-то подобного. Для расширения памяти (которого нет в данном случае) это не существенно. Исключение порт #1FFD для +2A, +3 чисто чтоб не спутался со скорпионом или каем.
А так, ну да наверно сравнивая скорость доступа до разных страниц можно определить наличие и нумерацию банков медленной памяти, если это действительно критично.
В итоге, в эмуляторe unreal при Pent512/256 на D5 защёлка (даже с #EFF7). Так, наверное, и в реале.
Осталось узнать. У Pentagon-1024SL v2.x в реале может быть ниже 1М, например 512кБ и 256кБ? Если нет, то драйвер отрабатывает "штатно".
В реале порт #EFF7 на пентагонах 256/512 далеко не факт что присутствует. Но если таки напаяли, то да защелка залочит память до сброса, и для 1024sl защелка тоже будет работать до сброса (по спецификации) если d2=1 в #EFF7 воткнуть.
Поэтому получается что автоматом безбоязненно можно определять только 256/512 K.
Подумав, есть только идея при определении наличия порта #EFF7, вызвать ручное подтверждение на наличие 1024 K. Или наоборот проверить наличие заглушки, и если память залочится, выдать предупреждение о необходимости сброса компьютера и : либо загрузки с опцией 512K, либо автоматически выставить конфиг на 512K.