Ивановский doom в dss

Компьютер "Спринтер" http://sprinter.nedopc.org

Moderator: Shaos

Sayman
Maniac
Posts: 223
Joined: 05 Oct 2009 19:44
Location: 212.164.105.5

Ивановский doom в dss

Post by Sayman »

Поставил себе очень мутную задачку - перекинуть Ивановского дума (вроде исходники есть, не ясно насколько рабочие) из режима трдос в нормальный режим, чтобы запускать можно было из под доса. Натскнулся, конечно же, на костыль в виде загрузки пользовательской конфы. Сижу штудирую инфу и нашёл несколько странных и не понятных моментов. Иван писал, что для запуска его дума была отдельная конфа, которая в операциях Акселя имела масштабирование (как говорил Иван - растягивание пикселя). Не понятно - это было дополнение к уже существующим операциям Акселя или это была их замена (полная или частичная)?
Второй момент - загрузка конфы пользователя. Дословно в доке сказано:
Для изменения схемы надо загрузить в последнюю страницу КЭШ-памяти
блок данных конфигурации со смещения #100 и выставить флаг, которым является
текстовая строка "FLEX_10K_LOADING", записанная по смещению #80 в этой же
странице КЭШ-а. По смещению #90 надо записать двухбайтовый
идентификационный номер прошивки. После этого надо произвести полный сброс,
который осуществляется программно записью в специальную страницу памяти
RESET_PAGE. Программа в ПЗУ, запускаемая по сбросу находит флаг
FLEX_10K_LOADING и начинает загрузку данных в ППЛМ... и т.д.
Что я сделал. Я взял какой-то экспериментальный образ Ивана где уже сидел код дума, но не было других данных. Т.е. там только boot и загрузчик flc.c. Так вот, через winhex вижу по смещению 5200h начало куска прошивки. Согласно доки, по смещению 100h метка, но до неё 128 байт FF, как и после неё. потом идёт некий кодовый блок. Если считать от 5200h и до конца файла, получается всего 16кб (т.е. включая метку и все начальные FF).
Далее: исходя из того, что оригинальный файл прошивки альтеры весит 59кб, то файл пользовательской прошивки весит всего 16кб и это, в том числе, исходит из выше процитированной доки - последняя страница кэша. т.е. всего 16.кб. Вопрос: почему оригинальная прошивка альтеры занимает 59кб, а пользовательская только 16кб? А куда тогда при перепрошивке альтеры деваются работы (схема) с клавой, мышкой, турбой, звуком. винтом и другими частями тела машины? или эти 16кб только частично перекраивают Альтеру (например, затрагивают некий функционал по графике и звуку, остальное не трогается, т.к. лежит за пределами этих 16кб)?
может кто разбирался или с Иваном общался на эту тему или доки какие то пояснительные есть? извините за многобукоф....
Sayman
Maniac
Posts: 223
Joined: 05 Oct 2009 19:44
Location: 212.164.105.5

Re: Ивановский doom в dss

Post by Sayman »

Doom doomом, а вот конфиг для Альтеры было бы хорошо узнать как применять. Кто-нибудь разбирался с этой темой? как, блин, не из режима спектрума применять эти конфиги альтеры? заколупался я что-то с этой темой. так бы можно было бы Тюндера бомбануть, так ведь в эмуляторе он не пашет. зависает на обработке одного из портов, которых нет в эмуле.
В биосе есть функция 0xF3, которая якобы для приминения конфига. Пробую согласно мануала - загружаю конфиг от дума в страницу ниже 127 (включая 0), делаю вызов, делаю как в исходнике дума изменения в dcp для порта масштабирования. фига - артефакты прут при попытке применить масштабы.т ощущение, что прошивка не загрузилась (не применилась).
DimkaM
Maniac
Posts: 261
Joined: 22 Jun 2005 04:35
Location: МО Россия

Re: Ивановский doom в dss

Post by DimkaM »

Sayman wrote:. Согласно доки, по смещению 100h метка, но до неё 128 байт FF, .
Согласно доке метка по смещению 0x80. До нее 128 штук 0xff.
Помоему ты запутался в хексах и деках. И кладешь прошивку не с того адреса.

Походу бинарь который ты выдрал, нада класть с адреса0x0000, а ты его кладеш с адреса 0x0080.
Плюс нада номер конфы ещё, но там наверно он уже есть.

Т.е. С 0x0000 идет128 штук фф, потом метка(с 0x0080), потом до 0x00ff хз чего, нули наверно или фф, потом с 0x0100 уже бинарь конфы
оригинальный файл прошивки альтеры весит 59кб, то файл пользовательской прошивки весит всего 16кб
16к вполне достаточно чтоп забить флекс10к под завязку. 59кб это небось какой нить sof в котором не бинарь, а нечто типа интел-хекса.
Sayman
Maniac
Posts: 223
Joined: 05 Oct 2009 19:44
Location: 212.164.105.5

Re: Ивановский doom в dss

Post by Sayman »

Походу бинарь который ты выдрал, нада класть с адреса0x0000, а ты его кладеш с адреса 0x0080.
как это сделано в думе:

Code: Select all

	IN A,(PAGE3)
	LD C,0F3h
	CALL 3D13H
        ...
	IN A,(PAGE3)
	EX AF,AF'
	LD A,40H
	OUT (PAGE3),A
	LD A,0C7H

	LD (0C400H),A	; открыть порт масштабирования
	LD (0C410H),A	; открыть порт масштабирования
	LD (0C480H),A	; открыть порт масштабирования
	LD (0C490H),A	; открыть порт масштабирования
	LD (0C500H),A	; открыть порт масштабирования
	LD (0C510H),A	; открыть порт масштабирования
	LD (0C580H),A	; открыть порт масштабирования
	LD (0C590H),A	; открыть порт масштабирования

	EX AF,AF'
	OUT (PAGE3),A
	EXX
	LD BC,100H	; масштаб 1:1
	LD D,0
	OUT (C),D
	EXX
таким образом на момент образщения к биосу к функции 0xF3 в 0й странице (я проверил отладчиком demon) уже лежит прошивка.
Как делаю я:

Code: Select all

		di
		ld a,0			;страница куда погрузим прошивку
		out (cpu_w3),a
		push af
		ld hl,flex_cfg_file
		ld (rd_err.err_file+1),hl
		call open
		ld (flex_hndl),a
		ld hl,0xc000			;куда
		ld de,16384			;сколько = размер файла прошивки
		push af
		call read
		pop af
		call close

;Прошивка загружена. Пробуем её применить.
		pop af
		ld c,0f3h			;код операции "применить пользовательскую прошивку"
		rst 8
		jp c,cfg_err
                ...
		ld a,40h
		out (cpu_w3),a
		ld a,0c7h
		ld (0c400h),a			; открыть порт масштабирования
		ld (0c410h),a			; открыть порт масштабирования
		ld (0c480h),a			; открыть порт масштабирования
		ld (0c490h),a			; открыть порт масштабирования
		ld (0c500h),a			; открыть порт масштабирования
		ld (0c510h),a			; открыть порт масштабирования
		ld (0c580h),a			; открыть порт масштабирования
		ld (0c590h),a			; открыть порт масштабирования
		ld bc,100h	; масштаб 1:1
		ld d,0
		out (c),d
но делаю это всё уже из под доса (т.е. в режиме спринтера). После этого в процессе кидания линий на экран выставляю наугад масштаб, к примеру:

Code: Select all

                ld bc,0x100
                ld d,2
                out (c),d
кидаю линию на экран, а получаю либо пустоту либо артефакты. При этом читать в аксель нужно с масштабом 1:1 (например читаем 128 байт), а кидать из акселя на экран уже в растянутом виде 1:2, т.е. 256 байт должно быть. Получаю артефакты в виде мусора или пустоту. Сделал эксперимент - вырубил загрузку прошивки, но оставил приминение в странице dcp для порта масштабирования. Результат тот же. Таким образом я понимаю, что прошивка нифига не применяется.
Сделал другой эксперимент. Поскольку после загрузки любых данных в верхние страницы после ресета не затираются, я делал так - запустил режим спектрума, загрузил дум, сделал ресет, запустил ранее написанную програмулинку и выгрузил 0ю страницу целиком на диск. Потом пробовал эту прошивку грузить. Результат тот же.
Соответственнл, прошивку кидаю на смещение 0, а не 0x80.
DimkaM
Maniac
Posts: 261
Joined: 22 Jun 2005 04:35
Location: МО Россия

Re: Ивановский doom в dss

Post by DimkaM »

Code: Select all

      ld a,0         ;страница куда погрузим прошивку
      out (cpu_w3),a
Сразу предупреждаю, спринтер ни разы в глаза не видел.

Вопрос: "out (cpu_w3),a" имеет какое нибудь отношение к КЕШ-памяти? или только к основному озу?
DimkaM
Maniac
Posts: 261
Joined: 22 Jun 2005 04:35
Location: МО Россия

Re: Ивановский doom в dss

Post by DimkaM »

ага, понял, биос сам в кеш перекидывает.

тогда ещё вопросик.
загрузил дум, сделал ресет
судя по доке при ресете конфа слетает, грузится заново из пзу или кеша.
По этому дум, при загрузке своей конфы, просто обязан убрать прошивку из кеша, чтоп юзер мог ресетнутся в ДОС


Как вариант и ради проверки, не надо щелкать пагами, а грузить в текущее адресное пространство.
далее прочитать из порта текущую пагу и передать её в f3, также как делает doom.
может в режиме спринтера залочена возможность напрямую щёлкать пагами, тока через биос
DimkaM
Maniac
Posts: 261
Joined: 22 Jun 2005 04:35
Location: МО Россия

Re: Ивановский doom в dss

Post by DimkaM »

Code: Select all

Файл прошивки для ПЛМ FLEX10 (ACEX30K) помещается в страницу (страницы) ОЗУ, откуда и перегружается функцией BIOS в ПЛМ. 
хм, это получается разные чипы сиавили, FLEX10 или ACEX30K. т.е. есть вероятность что ты пихаешь конфу не от того чипа?!
для ACEX30K конфа(если под завязку) явно больше 16килобайт
Sayman
Maniac
Posts: 223
Joined: 05 Oct 2009 19:44
Location: 212.164.105.5

Re: Ивановский doom в dss

Post by Sayman »

Вопрос: "out (cpu_w3),a" имеет какое нибудь отношение к КЕШ-памяти? или только к основному озу?
Объяснительная :mrgreen:

Code: Select all

cpu_w0		equ 82h		;cpu window 0 = addr 0000h
cpu_w1		equ 0a2h	;... 1 = 4000h
cpu_w2		equ 0c2h	;... 2 = 8000h
cpu_w3		equ 0e2h	;... 3 = 0c000h
т.е. это порты через которые подключаются страницы в разные окна проца.
судя по доке при ресете конфа слетает, грузится заново из пзу или кеша.
при ресете да, пользовательская конфа должна быть затёрта. Где, это вопрос. В озу она прекрасно сохраняется. Это показал эксперимент с демкой дума - после ресета в 0й странице сидит конфиг. Я выследил это путём запуска отладчика и вручную начал щёлкать страницами просматривая дамп. Щёлкнув 0 в последнее окно увидел знакомые надписи в виде FLEX_10K_LOADING. Значит, это и есть страница с пользовательской конфой для дума.
Чисот физически, нет в исходнике (и в дизасме) дума кода, который бы помещал прошивку в кэш до выхова 0xf3. Более того, я просто включил режим спектрума. В трдосе накидал каманды:
/hdd
/load e doom.trd
/rmd e
load "boot"
return
в бейсике проверил что там грузится. А грузится там файло с винта (текстуры, спрайты и прочее), генерируется таблица масштабов и переход на 32768. А это есть org самого дума. а там почти сразу in a,(cpu_w3) : ld c,0xf3 : call 0x3d13. В данном случае, биос Спринтера из режима спектрума вызывается через 3d13. По сути это обычный rst 8 в досе (режим Спринтера).
т.е. есть вероятность что ты пихаешь конфу не от того чипа?!
это врятли, т.к. в самом конфиге в качестве флага (типа, своеобразный magic) применяется фраза FLEX_10K_LOADING. Именно она и есть в думе. Для Спринтера 97 применялась другая фраза, как я помню это было ACEX чего-то там. Да и конфиги для 97го и 2000 как я знаю различаются. Я же выдернул конфиг именно для 2000 (дважды - через winhex и потом уже на реале через самописную программку, но после предварительного запуска дума и потом ресета, прям со страницы конфига).
Есть подозрение, что протокол приминения конфига для режима спектрума и спринтера между собой различаются.

Касательно кэша (а точнее fast ram) - общенародно в доступе есть только 16кб по методу пятногона, т.е. включить in a,(0xfb) и для выключить in a,(0x7b). Вставляются эти 16кб фаст рам в 0е окно, т.е. в адреса 0x0000 - 0x3fff. Как включить остальные страницы фаст рамы (а их там 256кб как бы) я не знаю. Это не документированно, хотя Иван говорил о том, что это можно сделать поменяв нужные байты в странице dcp (дешифратор). что за байты и по каким адресам надо пихать, я так же не знаю.
DimkaM
Maniac
Posts: 261
Joined: 22 Jun 2005 04:35
Location: МО Россия

Re: Ивановский doom в dss

Post by DimkaM »

В озу она прекрасно сохраняется. Это показал эксперимент с демкой дума - после ресета в 0й странице сидит конфиг.
хм. А ты пробывал после этого ресета сделать F3 с нулем в А?
Еще:
загрузил дум, сделал ресет, запустил ранее написанную програмулинку и выгрузил 0ю страницу целиком на диск.
почему только одну страницу сохранил? Ведь судя по доке прошивка может занимать несколько страниц идущих подряд, в твоем случае 0,1,2,3....n
Sayman
Maniac
Posts: 223
Joined: 05 Oct 2009 19:44
Location: 212.164.105.5

Re: Ивановский doom в dss

Post by Sayman »

Ведь судя по доке прошивка может занимать несколько страниц идущих подряд, в твоем случае 0,1,2,3....n
если честно. не уверен. а в какой доке говорится про подряд идущие страницы?
DimkaM
Maniac
Posts: 261
Joined: 22 Jun 2005 04:35
Location: МО Россия

Re: Ивановский doom в dss

Post by DimkaM »

Файл прошивки для ПЛМ FLEX10 (ACEX30K) помещается в страницу (страницы) ОЗУ, откуда и перегружается функцией BIOS в ПЛМ
архив sprinter.zip там гдето архов bios.zip в нём файл TBIOS.HTM
Sayman
Maniac
Posts: 223
Joined: 05 Oct 2009 19:44
Location: 212.164.105.5

Re: Ивановский doom в dss

Post by Sayman »

перепроверил размер прошивки взяв один из образцов демки дума (там есть 3 разных образа: sp_rulez.trd - там неуправляемая демка, doom.trd - управляемая демка - оба варианта без текстуры пола и неба, стены сделаны текстурами левыми, не думовскими. 3й образ - doomx.trd - самая полная демка - с думовскими текстурами, со спрайтами монстров, бочек, с текстурой неба. Проверил на образе doom.trd. Образ размером в 37кб. Закинул его в winhex, догнал до начала FLEX_10K_LOADING. адрес начала 0x5200 (это включая начало в 0x80 байт всякими ФФами). выдернул весь блок до конца образа. это получилось ровно 16384 байта. Таким образом конфиг дума занимает не больше 1 страницы.
Sayman
Maniac
Posts: 223
Joined: 05 Oct 2009 19:44
Location: 212.164.105.5

Re: Ивановский doom в dss

Post by Sayman »

Хм. запутался однако. На Спринтере стоит альтера 1К30. Значит, для Спринтера 2000 актуален магик ACEX_30K_LOADING вместо FLEX_10K_LOADING.
при попытке загрузки старой прошивки для FLEX10K, BIOS самостоятельно выбирает прошивку для ACEX30K, в соответствии с необходимой конфигурацией.
очень интересно. надо бы эксперимент провести - убрать из дума прошивку и попробовать запустить...чё будет интересно)))
...
проверил - артефакты с зависанием))))
DimkaM
Maniac
Posts: 261
Joined: 22 Jun 2005 04:35
Location: МО Россия

Re: Ивановский doom в dss

Post by DimkaM »

16килобайт маловато для асекс30к
если тока она там обрезанная вся
DimkaM
Maniac
Posts: 261
Joined: 22 Jun 2005 04:35
Location: МО Россия

Re: Ивановский doom в dss

Post by DimkaM »

я бы всё таки попробывал F3 после ресета дума
если поможет, то сохранять штук 8 страниц и их потом заливать в качестве прошивки