Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Поиск (http://zx-pk.ru/forumdisplay.php?f=78)
-   -   ПК Поиск - Эмуляция (http://zx-pk.ru/showthread.php?t=7491)

vinxru 26th March 2013 02:09

Quote:

Originally Posted by Tronix (Post 586435)
Вроде ж по умолчанию там if (a % 255) bla-bla это то же с что я сравниваю результат с нулем, верно? Привык к асму и паскалю етить его в кочерыжку

Пиши если тебе понятнее так. Компилятор все равно подставляет != 0

if(a%255 != 0)

shattered 29th March 2013 01:33

Quote:

Originally Posted by Tronix (Post 586435)
Много всего не так. Вы хотя-бы скажите, я в си коде ничего не путаю в условиях?

Да, случилась путаница -- должно быть ровно наоборот :-)

"if (что-то)" будет верно, если "что-то" не равно нулю.

shattered 29th March 2013 21:46

Немного о SovietPC

Есть три сайта

http://sovietpc.narod.ru/ -- 4 странички и архив с эмулятором затертой версии (1688576 06-04-2007 21:07 SovietPC.exe). Ссылки ведут на...

http://soviet-pc.narod.ru/ -- здесь какая-то жизнь и свежие релизы (март 2013)

http://wayback.archive.org/web/20080....old-games.ru/ -- блог 2007 года

Tronix 30th March 2013 13:34

Это да, но сорцов то нет ((

shattered 31st March 2013 11:56

Можно пригласить автора сюда и поговорить :-)

Очень скоро понадобится схема клавиатуры. Хотя ее можно восстановить по исходникам BIOS...

alt-x 1st May 2013 01:16

Quote:

Originally Posted by shattered (Post 586062)
NMI не вызываются -- похоже, что BIOS отключает их, когда сам рисует текст

Не выключает, а просто не дёргает. Поиск-1 - редкий пример машины, на которой вывод текста через BIOS - гораздо быстрее, чем запись в видеопамять/порты.

---------- Post added at 00:16 ---------- Previous post was at 00:14 ----------

Quote:

Originally Posted by shattered (Post 584481)
Оказалось, что и исходники BIOS [1] не вполне стыкуются с имеющимся дампом [2] :v2_dizzy_facepalm:

[1] PoiskComp/bios_p.7z
[2] PoiskComp/p1_rom.7z/rompoisk/POISKROM/POISK.BIN

В mess несоколько дампов. Самый старый более-менее подходит.

anasana 10th May 2013 01:50

1 Attachment(s)
До кучи, прошивка БИОС из моего Поиска, материнка - Ревизия Б.

shattered 11th May 2013 02:31

Ревизия Б -- это какой год?

DrPass 11th May 2013 13:55

1991

shattered 12th May 2013 02:39

work in progress: научился хоть как-то показывать картинку. Клавиатуры еще нет, симулировал ее в отладчике.

http://img-fotki.yandex.ru/get/5631/...95bd5d1_XL.png

---------- Post added at 01:39 ---------- Previous post was at 01:33 ----------

Quote:

Originally Posted by anasana (Post 599819)
До кучи, прошивка БИОС из моего Поиска, материнка - Ревизия Б.

Это есть в MESS под именем 'v91'.

shattered 17th May 2013 02:26

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

BYTEMAN 17th May 2013 04:39

вот жеж... полгода назад писал такую лабу под дос :) По прерываниям выводит скан-коды клавиш... Ща найти уже не могу, видимо осталось на съёмном винте :(

alt-x 21st May 2013 23:10

Quote:

Originally Posted by shattered (Post 600190)
work in progress: научился хоть как-то показывать картинку. Клавиатуры еще нет, симулировал ее в отладчике.

Это уже с видеоадаптером Поиска? Крут!

shattered 22nd May 2013 00:12

Да, с ним

На чем он собран, пока не разобрался.[COLOR="Silver"]

---------- Post added at 23:12 ---------- Previous post was at 22:37 ----------

А вот и косяк в документации? Код делает следующее:
Code:

PORT_3D9:
        XCHG    AL,AH            ;Сохранить первоначальные данные
        IN      AL,SCR_MODE      ;ввести байт текущего режима
        AND    AX,37C8H          ;Маска D7,D6 и D3
                                  ;Выбор D4,D5 и D2..D0
        OR      AL,AH            ;Составить новый байт
        OUT    SCR_MODE,AL      ;Задать новый режим экрана
        JMP    AX_NMI

Если сравнить это с описанием CGA, то видно, что биты 5-4.2-0 порта 3D9H транслируются 1:1 в порт 68H. 5 -- это выбор палитры, 4 - "intense colors in graphics". poiskto.txt описывает их ровно наоборот. Назначение бит 2-0 тоже другое -- в оригинале R, G, B, в ТО -- B, G, R.

shattered 23rd May 2013 00:08

Некоторый прогресс

http://img-fotki.yandex.ru/get/9154/...5f784d6_XL.png
«poisk1 WIP: p1_t_ram.rf4»

http://img-fotki.yandex.ru/get/9228/...f865d65_XL.png
«poisk1 WIP: p1_t_i_o.rf4»

shattered 14th September 2013 22:45

Кстати -- что такое ПБИС?

DrPass 14th September 2013 23:24

Вероятно, "периферийные БИС". Чё он там тестирует после процессора? Таймер и контроллер прерываний, кажется.

shattered 14th September 2013 23:41

На этом месте тест зависает. Любопытно узнать, что должно быть дальше...

DrPass 15th September 2013 01:03

Quote:

Originally Posted by shattered (Post 626977)
На этом месте тест зависает. Любопытно узнать, что должно быть дальше...

А что по этому поводу говорит дизассемблер теста?

Tronix 15th September 2013 01:30

Врот им ногу дизасмить эти макросы. Я на тесте памяти голову сломал, а этот даже смотреть не хочу (((

shattered 15th September 2013 12:43

Тяжела и неказиста жизнь советского артиста (c) Для начала сделать бы клавиатуру и видео...

shattered 17th September 2013 10:13

Описание матрицы нашлось в исходниках BIOS -- TBL_KBDP.ASM и SCANINT2.ASM, опрос делается по таймеру (канал 1 заведен на IRQ6). Разумеется, у Поиска-91 матрица немного другая.

http://img-fotki.yandex.ru/get/9150/...428e358_XL.png

shattered 18th September 2013 10:51

В комментарии к исходникам упоминается нечто по имени ИНТЕК. Что это?
Code:

; --  таблица клавиш для ИНТЕК ( по новому  ГОСТу )
;            бит 7 - признак необходимости инвертирования SHIFT
;----------------------------------------------------------------------------
; ------------нет спецсимволов--- SHIFT1 ----SHIFT2-----позиция в матрице--
;                                                      ИНТЕК              ПОИСК
LN_KEY1 DB        80H+09H,          04H,  80H+29H    ; 1/12      1      4/7


Tronix 29th October 2013 15:52

На досуге ковырялся с PCem... Хочется все-таки сделать эмулятор с соблюдением тактов 8088, чтоб по скорости было максимально похоже на Поиск. Ну и чтоб работал "честно", то есть рисовал все символы программно, как это делает реал.

Пытался впилить в него обработку NMI. BTW, обработки NMI практически ни у кого нет, ни у fake86, ни у PCE. Вообще, хорошо если TRAP (int 1) обрабатывают, некоторые и на него забивают. Ввел несколько переменных и флагов:

Code:

// POISK variables
uint16_t p28h; // port 28 value
uint8_t nmi_enabled; // NMI enabled ?
uint8_t nmi_int_now=0; // force NMI
uint8_t in_nmi=0; // in NMI?
uint8_t p6Ah,p68h; // port 6Ah and port 68h

Дальше vid_cga.c. Откуда-то скопипастил такую процедуру установки графического режима в CGA через порты. В качестве аргумента (mode) - 0x1E это по идее 640x400, 0x2E - это 320x200.

Code:

static int mode_graph[] = {0x38, 0x28, 0x2D, 0x0A, 0x7F, 0x06,
                          0x64, 0x70, 2, 1, 6, 7,0, 0, 0, 0};

void set_poisk_mode(uint8_t mode)
        #define MODE_REG 0x3d8
        #define VID_DISABLE 0
        #define ADDRESS_REG 0x3d4
        #define REGISTER_PORT 0x3d5
{
int loop_count = 0;
        cga_out(MODE_REG,VID_DISABLE); /*disable video signal */
                for( ; loop_count < 0x0e; ++loop_count) {
                        cga_out( ADDRESS_REG, loop_count ); /* set up CRT register */
                        cga_out( REGISTER_PORT, mode_graph[loop_count]); /* write to reg */
                }
                cga_out( MODE_REG, mode); /* switch in mode now */;
}

Процедура обработки порта 68. Смотрит, не сменился ли режим, если сменился - устанавливает новый. Также устанавливает флаг разрешения или запрещения NMI.
Code:

void poisk_out(uint16_t addr, uint8_t val)
{
    uint8_t b;
    uint8_t tmp_b;
    switch (addr)
    {
        case 0x68:
            p68h = val;
            b = 0x2e; //320x200
            if (val & 0x80) b = 0x1e; //hires
            if (poisk_mode != b)
              {
                poisk_mode = b;
                set_poisk_mode(b);
                pclog("POISK set mode %02X: \n",b);
              }
            if (!(val & 8))
              {
                nmi_enabled = 1;
                pclog("[poisk] NMI enable\n");
              }
            else
              {
                nmi_enabled = 0;
                pclog("[poisk] NMI disable\n");
              }
            pclog("POISK 68h value: %02X cgamode: %02X cgacol: %02X\n",val,tmp_b,b);

            return;
        case 0x6A:
            p6Ah = val;
            val = p68h;
// TO DO:
            return;
    }
}

uint8_t poisk_in(uint16_t addr)
{
    switch (addr)
    {
        case 0x68:
            return p68h;
        case 0x6A:
            return p6Ah;
    }
    return 0xFF;
}

При возникновении NMI в порт 28 должно находится смещение, куда произошла запись:

Code:

uint16_t p28h_in(uint16_t addr)
{
    switch (addr)
    {
        case 0x28:
              {
              pclog("[poisk] IN 0x28h = %04X\n",(p28h) & 0xFF);
              return ((p28h) & 0xFF);
              }
        case 0x29:
              {
              pclog("[poisk] IN 0x29h = %04X\n",(p28h>>8) & 0xFF);
              return ((p28h>>8) & 0xFF);
              }
    }
}

Дальше, установил новые хендлеры для портов:
Code:

        io_sethandler(0x0068, 0x0002, poisk_in,  NULL, NULL, poisk_out,  NULL, NULL);       
        io_sethandler(0x006A, 0x0002, poisk_in,  NULL, NULL, poisk_out,  NULL, NULL);       

        io_sethandler(0x0028, 0x0002, p28h_in,  NULL, NULL, NULL,  NULL, NULL);

Если что-то пишет в видео-память, проверить разрешены ли NMI, если разрешены - запомнить смещение куда произошла запись (для обработки 28 порта) и установить флаг вызова NMI.
Code:

void cga_write(uint32_t addr, uint8_t val)
{
//        pclog("CGA_WRITE %04X %02X\n", addr, val);
        vram[addr&0x3FFF]=val;
        charbuffer[ ((int)(((dispontime - vidtime) * 2) / CGACONST)) & 0xfc] = val;
        charbuffer[(((int)(((dispontime - vidtime) * 2) / CGACONST)) & 0xfc) | 1] = val;
        cycles -= 4;

        p28h = addr&0x3FFF;

        if (nmi_enabled == 1)
        {
          flags&=~I_FLAG;
          nmi_int_now = 1;
        }
}

Дальше в x86.c обработку NMI сделал по аналогии обработки IRQ с PIC, вставил такой текст:
Code:

                if (nmi_int_now && !in_nmi && !ssegs && !noint)  // NMI interrupt
                {
                  pclog("NMI INT NOW\n");
                        //if (ssegs) ss=oldss;
                        //        if (inhlt) pc++;
                        writememw(ss,((SP-2)&0xFFFF),flags|0xF000);
                        writememw(ss,((SP-4)&0xFFFF),CS);
                        writememw(ss,((SP-6)&0xFFFF),pc);
                        SP-=6;
                        addr=2<<2;
                        flags&=~I_FLAG;
                        flags&=~T_FLAG;
                        pc=readmemw(0,addr);
                        loadcs(readmemw(0,addr+2));
                        FETCHCLEAR();
                        inint=1;
                        nmi_int_now=0;
                        in_nmi=1;
                        cycles-=72;
                }

Пока результата никакого.

alt-x 31st October 2013 00:53

Quote:

Originally Posted by Tronix (Post 639372)
На досуге ковырялся с PCem... Хочется все-таки сделать эмулятор с соблюдением тактов 8088, чтоб по скорости было максимально похоже на Поиск. Ну и чтоб работал "честно", то есть рисовал все символы программно, как это делает реал.

Наверно, ближе всего к железу MESS (с патчами от shattered, см. выше). Правда, не знаю, умеет ли MESS всякие V20. Но, на крайняк, можно подсунуть 286 и посмотреть, что получится.

anasana 12th November 2013 18:04

Tronix, огромное Вам спасибо за habrapost!

shattered 13th November 2013 00:12

Предлагаю не распылять усилия и пилить таки MESS, в нем заметно больше готовых запчастей.

Пока что безуспешно борюсь с эмуляцией клавиатуры -- алфавитные клавиши работают нормально, но прочие посылают весьма странные сканкоды.

b2m 23rd November 2013 00:25

2 Attachment(s)
Кто-нибудь помнит, как выглядел 4-тый нортон на Поиске? С цветами не совсем понятно. У меня в эмуляторе получилось вот так:

Sonic_Blast 24th November 2013 14:23

Привет!

Вместо Зелёного берюзовый!!!

Tronix 25th November 2013 01:20

Да, если смотреть на палитру 1 в графическом режиме это цвет cyan (0x01), или light cyan

b2m 25th November 2013 12:21

Quote:

Originally Posted by Tronix (Post 646656)
Да, если смотреть на палитру 1 в графическом режиме это цвет cyan (0x01), или light cyan

Это текстовый режим, палитра номер ноль, судя по дампу ПЗУ используются цвета 0,7,2. Даже с учётом того, что биты адреса палитры и биты RGB в другом порядке всё равно останется 0,7,2, т.к. эти трёхбитовые числа симметричные.

Tronix 25th November 2013 12:43

Quote:

Originally Posted by b2m (Post 646711)
Это текстовый режим, палитра номер ноль, судя по дампу ПЗУ используются цвета 0,7,2. Даже с учётом того, что биты адреса палитры и биты RGB в другом порядке всё равно останется 0,7,2, т.к. эти трёхбитовые числа симметричные.

У Поиска нет текстового режима. И видимый 80x25 это есть графический 640x200 1bpp. Как получается еще один цвет, кроме белого, я если честно не очень понял. Вот что пишет ТО по этому поводу:

Code:

  В графическом режиме 640 х 200 точек отображение произво-
дится в формате 1 бит на точку. Каждая точка может иметь два
цвета из 16 возможных.
  В символьном режиме 80 символов х  25  строк  отображение
производится  также в формате 1 бит на точку, но каждый байт
содержит неиспользуемый для формирования знака бит D7, кото-
рый может нести информацию о цвете символа.

Code:

  4.5.8. В конце каждого  элементарного  цикла  регенерации
оперативной  памяти происходит загрузка содержимого видеопа-
мяти в сдвиговые регистры, выполненные на  элементах  D72  и
D77.  Загрузка данных осуществляется выходным сигналом "S/L"
контроллера ОЗУ (потенциал низкого  уровня).  Текущий  адрес
определяется  содержимым основного счетчика (микросхемы D23,

                              - 37 -
D24 и D25), состоянием выходного сигнала триггера D12.1:9  и
состоянием сигнала управления порта 68Н (бит 6).
  Данные в сдвиговые регистры загружаются так, как показано
в таблице 4.12.
 
                                      Т а б л и ц а  4.12
                -----------T-------------------------------
                          ¦        Р а з р я д
                          +---T---T---T---T---T---T---T---
                          ¦  7¦ 6 ¦ 5 ¦ 4 ¦ 3 ¦ 2 ¦ 1 ¦ 0
                          +---+---+---+---+---+---+---+---
                          ¦  Четный банк ¦Нечетный банк
                -----------+---T---T---T---+---T---T---T---
                регистр 1  ¦D7L¦D5L¦D3L¦D1L¦D7H¦D5H¦D3H¦D1H
                -----------+---+---+---+---+---+---+---+---
                регистр 2  ¦D6L¦D4L¦D2L¦D0L¦D6H¦D4H¦D2H¦D0Н

 
 
  Четные  биты  видеопамяти загружаются в один регистр, не-
четные - в другой.
  Выходные сигналы сдвиговых регистров D72 и D77  поступают
на  мультиплексор данных (микросхема D48). Сюда же поступает
сигнал с выхода схемы управления цветом,  выполненненной  на
элементах  D4.2, D46 и D4.3. Данная схема позволяет по-
чить  в  символьном режиме 80 символов х 25 строк и дополни-
тельно цвет символа
, в отличие от графического  640х200  то-
чек.

Короче какая-то магия с портами 0x6A, 0x6B и каким-то 7-мым битом где-то.

b2m 25th November 2013 14:11

Quote:

Originally Posted by Tronix (Post 646719)
Вот что пишет ТО по этому поводу

Думаешь, я ТО не читал, прежде чем делать эмуляцию? И схему не смотрел? :)
Про бит D7 проще из схемы узнать - это как бы альтернативный цвет засвеченных точек (из остальных семи). Я так понял, первая точка будет всегда незасвеченная, отсюда и полоски на инверсных символах. В принципе, при определённых настройках портов она может и не обнуляться, но тогда появятся вертикальные линии у символов с альтернативным цветом. Можно поиграться портами в отладчике.

esl 25th November 2013 14:48

Quote:

Originally Posted by b2m (Post 646309)
Кто-нибудь помнит, как выглядел 4-тый нортон на Поиске? С цветами не совсем понятно. У меня в эмуляторе получилось вот так:

мне тоже помнится что должен быть голубой,
блин, давно это было

Tronix 25th November 2013 16:46

Вообще, круто! Скорость очень похожа на настоящую. Только что-то checkit v3 не запускается в эмуле. И цвет все-таки надо поправить.

b2m 25th November 2013 17:03

Quote:

Originally Posted by Tronix (Post 646772)
И цвет все-таки надо поправить.

А мне всё-таки кажется, что я сделал правильно. Нортон вообще не устанавливает регистр палитры, он остался такой, какой был при установке режима, т.е. палитра номер ноль. Более того, в конфигурации Нортона установлен ч/б режим, т.е. реально использованы цвета 0,7,15, чёрный, серый и белый. А биос Поиска в псевдотектовом режиме 80х25 преобразовывает их в цвет фона, нормальный цвет и альтернативный цвет. А в палитре номер ноль это как раз чёрный, серый и зелёный (точнее, основная палитра с нулевым цветом фона).

Tronix 25th November 2013 17:24

Ну зачем спорить, если уже много человек сказало, что не было в текстовом режиме зеленого. Было только 3 цвета - черный, белый и бирюзовый. При переключении на русский цвет фона менялся на синий, остальные цвета оставались как есть.

b2m 25th November 2013 17:47

Возможно была другая прошивка ПЗУ палитры. Другого объяснения у меня нет.

Tronix 25th November 2013 18:40

А что по поводу checkit? Вообще, побольше бы деталей.. Вижу, что x86 в виде отдельного плагина. С нуля писалось или где-то позаимствовано? Исходников нам не видать конечно?

b2m 25th November 2013 19:03

Quote:

Originally Posted by Tronix (Post 646798)
А что по поводу checkit? Вообще, побольше бы деталей..

Не смотрел ещё.

Quote:

Originally Posted by Tronix (Post 646798)
Вижу, что x86 в виде отдельного плагина. С нуля писалось или где-то позаимствовано? Исходников нам не видать конечно?

Писал с нуля, поэтому не уверен в 100% точности эмуляции процессора. Исходников не будет. :) Я уже где-то писал, что единственный заимствованный код в эмуляторе - процессор Z80, потому что мне до сих пор лень писать свою реализацию. Даже несмотря на неприлично большой размер имеющейся z80.dll


All times are GMT +4. The time now is 04:56.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.