PDA

Просмотр полной версии : Некорректная эмуляция ВГ93 в UNREAL SPECCY?



CPLx
31.12.2007, 12:43
Заметил что SMASH COMMANDER не способен установить вращение диска в UNREAL SPECCY. (такая же картина и в EmulZWin, а в Spectaculator это работает нормально. На реале тоже работало).

Посмотрел код где всё это происходит.

Вот процедура из SMASH COMMANDER определяющая наличие диска в дисководе:

(с комментами)


Процедура вызова дос-подрограмм, она
будет использоваться:

#8dc5: push de
jp #3d2f


Процедура определения наличия диска
в дисководе.
(На выходе флаг Z - диска нет).

ld a,#08
di
ld de,#2fc3 ; адрес процедуры дос: out(1f),a:ret
call #8dc5 ; даем команду ВГ93 с кодом 8.
не помню что это, по-моему
это "восстановление"
(головка идет на нулевой трек).
ld de,#3dba ; адрес процедуры дос:
ld b,#ff in a,(1f): and 02: cp b: ret nz
call #8dc5 ; считываем 1-й бит порта #1F.
ld (#a293),a ;запоминаем его.
ld de,0
ld bc,#1770 устанавливаем счетчик цикла.
a25e: push de ; начало цикла
push bc
ld a,#08
ld de,#2fc3
call #8dc5 ; даём команду ВГ93 с кодом 8
ld de,#3dba
ld b,#ff
call #8dc5 ; считываем бит 1 из порта #1F.
and 02 ;дальше какие-то сравнения - это не важно
pop bc
pop de
ld h,a
ld a,(#a293)
xor h
and h
and #02
rra
ld l,a
ld a,h
ld (#a293),a
ld h,0
add hl,de
ex de,hl
ld a,d
or e ; если зафиксировали смену бита 1
jr nz,#a28f ; то выходим.
dec bc
ld a,b
or c
jr nz,#a25e ; иначе переходим на начало цикла
a28f: ld a,d
or e
ei
ret

Вот такая вот процедурка. Есть там много лишних команд, но самое главное - там в каждом цикле проверки бита 1 дается команда 8 в порт 1F ВГ93. Команда эта нафиг не нужна, но похоже именно из-за неё SMASH коммандер не может определить наличие диска в UNREAL SPECCY. На реале она не мешала, а в эмуляторе мешает. Если удалить эту команду (забить call нулями), то SMASH коммандер начинает обнаруживать диск и работает нормально (вроде. По крайней мере определение диска работает).
В общем, видимо посыл команды к ВГ93 влияет на эмулирование вращения диска в UNREAL SPECCY.

DZh
31.12.2007, 14:41
А где его скачать-то? (SmashCommander)

Alexandr Medvedev
31.12.2007, 14:57
Я у себя нашёл некий Smash Commander 2.0 и он нормально запускается (и сам запускает другие файлы) во всех указанных эмуляторах. Возможно только версия не та.
По поводу вращения диска (в UnrealSpeccy) надо отключить настройку Beta128->No delays.

CPLx
31.12.2007, 15:36
Я у себя нашёл некий Smash Commander 2.0 и он нормально запускается (и сам запускает другие файлы) во всех указанных эмуляторах. Возможно только версия не та.
По поводу вращения диска (в UnrealSpeccy) надо отключить настройку Beta128->No delays.
Я смотрел код SMASH COM 1.0.
Но и 2.0 дает такой же баг.
Он и должен запускаться нормально и файлы другие запускать. Речь идет о команде смены диска (select drive). Надо нажать "1" и выбрать текущий дисковод (откуда этот smash был загружен, например). У меня он в этом случае пишет "DRIVE NOT READY".
Если выключить галку Beta128->No delays, то он вообще начинает писать DISK ERROR (то есть вращение уже регистрирует, но глючит дальше при чтении). Лечится нажатием на Retry (с т.е. всё-таки читает, но через DISK ERROR'ы).
Версия Unreal у меня видимо 0.32b2.

CPLx
31.12.2007, 15:47
А где его скачать-то? (SmashCommander)

Где скачать не знаю. Идея там неплохая, но реализация имхо не идеальная.

Vladimir Kladov
24.02.2008, 13:08
Изучил я исходники unreal и поробвал "честно" передрать эмуляци ВГшки. Не получается. Выдаю лог обращений к портам и вижу странность непонятную мне. Итак, начальные условия: диска в лотке нет, выдаём команду CAT <Enter>. У меня:

outFF:3C PC=3DD7
out1F:08 PC=3D9C
in FF:00 PC=3DA8

(ЗС - после команды т.е. надо вычесть 2).
Ставлю бреки в unreal на эти адреса и вижу: out FF<-3C, out1F<-08, inFF->3F !!!

Не понимаю: почему 3F, ведь там читается просто rqs, точнее comp.wd.rqs, но в этот rqs вообще никак не может попасть ничего, кроме 0, INTRQ=0x80 или DRQ=0x40. Где я туплю, скажите, люди? (отлаживать сам unreal я не могу, по причине кривых рук и неумения настроить его компилируемость в MS VC).

molodcov_alex
24.02.2008, 13:24
Не понимаю: почему 3F, ведь там читается просто rqs, точнее comp.wd.rqs, но в этот rqs вообще никак не может попасть ничего, кроме 0, INTRQ=0x80 или DRQ=0x40. Где я туплю, скажите, люди? (отлаживать сам unreal я не могу, по причине кривых рук и неумения настроить его компилируемость в MS VC).

Так по коду прописано:

if (port & 0x80) return rqs | 0x3F;
Остальные линии наверно таким образом считаются подтянутыми к 1?

Vladimir Kladov
24.02.2008, 17:38
Странно, у меня нету | 0x3F; Вроде исходники одни из последних от SMT. Ну да ладно, 3F можно просто добавить, оно на результат, как оказалось, не влияет. Спасибо, что прояснили.