PDA

Просмотр полной версии : Как проги определяют 128к?



BYTEMAN
02.08.2006, 15:47
В ближайшем времени буду ставить 128к на байт. Многие игрушки во время загрузки определяют какой у тебя комп.(48 или 128) Они определяют прошивку или объём памяти? Придётся ли мне ставить ещё одну прошивку (переключаемую) или не надо?

jtn
02.08.2006, 19:09
байт (я так понял у тебя он) это вообще тяжелый случай.. но 99% программ используют только обычную 48ю прошивку, так что всё будет нормально

spensor
03.08.2006, 10:09
Компьютер из 48K в 128K (и более) можно превратить даже не имея в наличии прошивки BASIC128, важен лишь порт переключения страниц и экранов (7ffd). Проги, по крайней мере подавляющее большинство, в этом случае прекрасно понимают что они работают на Spectrum128. Кроме того интересно и то, что имея только 48К и порт 7ffd сам BASIC128 прекрасно запускается и считает что компьютер Spectrum128 (но кажется также понимает что верхняя память "повреждена").
Детект факта 128К проги осуществляют как правило занесением инфы по #C000-#FFFF и переключением банков памяти с последующим сравнением занесенного и считанного значения.

goodboy
03.08.2006, 10:42
есть несколько прог которые определяют размер памяти по ячейки ПЗУ или переменной 23388, но таких очень мало

BYTEMAN
05.08.2006, 20:16
Всё понятно. А то думаю как CHASE HQ определяет. На Spectrum128 грузится дольше и заставка другая и АУ работает...

Grand
06.08.2006, 02:32
В своих программах я определяю 128К такой максимально оптимизированной процедурой:
DI
LD HL,#D110
LD BC,#7FFD
OUT (C),L
LD (HL),B
OUT (C),H
LD (HL),C
OUT (C),L
LD A,(HL)
CP B
LD A,L
LD (23388),A
EI
;на выходе, если Z=1, то 128K

jtn
06.08.2006, 13:14
LD HL,#D110
OUT (C),Hужас!! никогда так больше не делай. и вообще попорченные ячейки надо восстанавливать.

Jukov
06.08.2006, 17:44
Из всех программ, что мне встречались 128-е ПЗУ (не для определения количества памяти) для нормальной работы нужно было лишь для игры TERMINTOR 128K и для нескольких русских журналов.

Grand
08.08.2006, 02:34
LD HL,#D110
OUT (C),Hужас!! никогда так больше не делай.:v2_wink2:
В 1990-х Сергей Зонов, - один из уважаемых мной разработчиков Spectrum-совместиных компьютеров, - настоятельно не рекомендавал задействование битов 7 и 6 порта #7FFD (как впрочем и #1FFD).



LD HL,#D110
OUT (C),Hи вообще попорченные ячейки надо восстанавливать.Иногда я делаю такую "поблажку" :v2_smile: : так, например, в командере TR-DOS Navigator V0.68b используется изменённая процедура:
LD HL,#D110
LD BC,#7FFD
OUT (C),H
LD E,(HL)
LD (HL),C
OUT (C),L
LD (HL),B
OUT (C),H
LD A,(HL)
CP C
LD (HL),E
OUT (C),L
;на выходе - если Z=1, то 128K

Spectre
08.08.2006, 14:39
:v2_wink2:
В 1990-х Сергей Зонов, - один из уважаемых мной разработчиков Spectrum-совместиных компьютеров, - настоятельно не рекомендавал задействование битов 7 и 6 порта #7FFD (как впрочем и #1FFD).

Это даже не смешно. Сергей Зонов дает советы как распоряжаться портами памяти которые растут еще с фирменного спектрума. А потом сам же получается в Scorpion 1024 и нарушил свои советы?


Иногда я делаю такую "поблажку" :v2_smile: : так, например, в командере TR-DOS Navigator V0.68b используется изменённая процедура:
LD HL,#D110
LD BC,#7FFD
OUT (C),H
LD E,(HL)
LD (HL),C
OUT (C),L
LD (HL),B
OUT (C),H
LD A,(HL)
CP C
LD (HL),E
OUT (C),L
;на выходе - если Z=1, то 128K

И что? В #10-ой странице все равно 1 ячейку испортил. Это не критично, но если уж гордится тем что определялка не портит память (как например в Quick Commander :) ) то лучше написать так:


LD HL,#C010
LD E,#11
LD BC,#7FFD
OUT (C),L
LD A,(HL)
INC (HL)
OUT (C),E
DEC (HL)
OUT (C),L
CP (HL)
JR Z,48K
DEC (HL)
OUT (C),E
INC (HL)
OUT (C),L
;128K

spensor
08.08.2006, 15:08
Это даже не смешно. Сергей Зонов дает советы как распоряжаться портами памяти которые растут еще с фирменного спектрума. А потом сам же получается в Scorpion 1024 и нарушил свои советы?
Заблуждаешься! Насчет советов и фирменности битов не знаю, с последним так вообще очень сомневаюсь. А то что Scorpion 1024 это самопальная доработка так это точно - любители дорабатывали и биты выбирали. Следующей машиной после Scorpion256 был Scorpion2000 (или что то почти же самое но в overdrive исполнении - GMX). У Зонова биты D6/D7 портов #1FFD/#7FFD никогда не были заюзаны. Не путать с KAY1024, машины разные!

demon_zx
09.08.2006, 10:14
Еще ПЗУ128 нужно по моему в игре "48 утюгов"

SMT
09.08.2006, 21:12
Еще ПЗУ128 нужно по моему в игре "48 утюгов"точно нет, я его адаптировал под ленту и 48k. мелодии приходилось слушать перед запуском уровня

Grand
25.08.2007, 03:33
И что? В #10-ой странице все равно 1 ячейку испортил. Это не критично /.../Разумеется, ячейки не нужно восстанавливать, если, скажем, в них будет загружен код.



Для программ, завершающих свою работу возвратом в систему ZX Spectrum (не кнопкой Reset, естественно) подойдет процедура очищающая электронный диск попутно с проверкой памяти.
;Проверка наличия памяти 128K и очистка
;электронного диска BASIC 128.
;(C) GRAND, 12.11.2006.
LD BC,#7FFD
LD DE,#1017
OUT (C),D
LD HL,#EBEC
LD (HL),D
OUT (C),E
LD E,19
LD (HL),0
INC HL
DEC E
JR NZ,$-4
LD L,#F7
LD (HL),#C0
OUT (C),D
LD L,#EC
LD A,(HL)
OR A
LD (23388),A;BANKM
LD (23427),HL;SFNEXT
LD H,#2B
LD A,1
LD (23429),HL;SFSPACE
LD (23431),A;
;на выходе флаг Z=0 - означает наличие 128K.
;При работе процедуры прерывания должны быть
;запрещены, а ее код НЕ должен распологаться
;в диапазоне, где устанавливаются банки
;памяти, т.е. #C000...#FFFF. Процедура оперирует
:только с системными переменными BASIC 128,
:расположенными как в бывшем буфере принтера,
;так и в банке 7, поэтому никакое изменение
;ячеек, установленных после ее работы, недопустимо!



Что касается вопроса о якобы некорректной работе порта #7FFD на всех остальных компьютерах, кроме Pentagon'а, при обращении к нему, скажем, LD A,#10 \ OUT (#FD),A, то после того, как кодеры правильных компьютеров стали исправлять этот бред на LD A,%01010000 \ OUT (#FD),A, проблема бумерангом вернулась на тот клон (Pentagon), где она была порождена, и это вполне справедливо.

GriV
27.08.2007, 10:41
Вопрос был - КАК?

ответ
1) Через ПЗУ, проверяются какие то ячейки, причём адрес ячейки как правило выбирается наобум, не очень понятно как такие программы реагируют на изменённые версии ПЗУ.
Типовой код проверки:
________LD A,(ADDR) ; ADDR - откуда то из ПЗУ
________CP #XX ; ячейка которая должна соответствовать якобы ПЗУ-48
________JR Z,ROM48
________CP #YY ; для ПЗУ-128
________JR Z,ROM128
________RET

может быть другой вариант:
________LD A,(ADDR) ; ADDR - откуда то из ПЗУ
________CP #XX ; ячейка которая должна соответствовать якобы ПЗУ-48
________JR (N)Z,ROM48 ; проверка на (не)совпадение
________JR ROM128
Причём, очевидно, что глюков и та и другая процедура имеет немерянно.

2) Проверять системные переменные
Это более предпочитительный (по сравнению с первым вариантом) способ. Тут его уже комментировали

3) Проверять реагирует ли хоть что-то при выводе разных значений в порт #7ffd. Опять же типовой код был приведён несколькими постами выше.
Я считаю этот способ самым правильным, однако необходимо в любом случае восстанавливать ячейки памяти, которые, возможно, были похерены. Работа программы-загрузчика может завершиться неудачно, а там могут оказаться какие-то данные, необходимые для SOS-48 или SOS-128.
И ещё, приведённые программы страдают недостатком - при переключении страничек рекомендуется либо ждать начала прерывания (команда HALT) либо на время работы процедуры определения отрубать прерывания. Это связано с тем, что SOS-128 восстаналивает страницы при каждом прерывании, кроме того, прерывание может криво отработаться, если была активна не та страничка, что прописана в системных переменных.