Пиши если тебе понятнее так. Компилятор все равно подставляет != 0
if(a%255 != 0)
Вид для печати
Немного о 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 года
Это да, но сорцов то нет ((
Можно пригласить автора сюда и поговорить :-)
Очень скоро понадобится схема клавиатуры. Хотя ее можно восстановить по исходникам BIOS...
Не выключает, а просто не дёргает. Поиск-1 - редкий пример машины, на которой вывод текста через BIOS - гораздо быстрее, чем запись в видеопамять/порты.
---------- Post added at 00:16 ---------- Previous post was at 00:14 ----------
В mess несоколько дампов. Самый старый более-менее подходит.
До кучи, прошивка БИОС из моего Поиска, материнка - Ревизия Б.
Ревизия Б -- это какой год?
1991
work in progress: научился хоть как-то показывать картинку. Клавиатуры еще нет, симулировал ее в отладчике.
http://img-fotki.yandex.ru/get/5631/...95bd5d1_XL.png
---------- Post added at 01:39 ---------- Previous post was at 01:33 ----------
Это есть в MESS под именем 'v91'.
Нужно нечто под DOS, что бы выдавало скан-коды, поступающие с клавиатуры -- раз схемы нет, можно "прокликать" всю матрицу и посмотреть, как на это реагирует BIOS.
вот жеж... полгода назад писал такую лабу под дос :) По прерываниям выводит скан-коды клавиш... Ща найти уже не могу, видимо осталось на съёмном винте :(
Да, с ним
На чем он собран, пока не разобрался.[COLOR="Silver"]
---------- Post added at 23:12 ---------- Previous post was at 22:37 ----------
А вот и косяк в документации? Код делает следующее:
Если сравнить это с описанием 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.Код: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
Кстати -- что такое ПБИС?
Вероятно, "периферийные БИС". Чё он там тестирует после процессора? Таймер и контроллер прерываний, кажется.
На этом месте тест зависает. Любопытно узнать, что должно быть дальше...
Врот им ногу дизасмить эти макросы. Я на тесте памяти голову сломал, а этот даже смотреть не хочу (((
Тяжела и неказиста жизнь советского артиста (c) Для начала сделать бы клавиатуру и видео...
Описание матрицы нашлось в исходниках BIOS -- TBL_KBDP.ASM и SCANINT2.ASM, опрос делается по таймеру (канал 1 заведен на IRQ6). Разумеется, у Поиска-91 матрица немного другая.
http://img-fotki.yandex.ru/get/9150/...428e358_XL.png
В комментарии к исходникам упоминается нечто по имени ИНТЕК. Что это?
Код:; -- таблица клавиш для ИНТЕК ( по новому ГОСТу )
; бит 7 - признак необходимости инвертирования SHIFT
;----------------------------------------------------------------------------
; ------------нет спецсимволов--- SHIFT1 ----SHIFT2-----позиция в матрице--
; ИНТЕК ПОИСК
LN_KEY1 DB 80H+09H, 04H, 80H+29H ; 1/12 1 4/7
На досуге ковырялся с PCem... Хочется все-таки сделать эмулятор с соблюдением тактов 8088, чтоб по скорости было максимально похоже на Поиск. Ну и чтоб работал "честно", то есть рисовал все символы программно, как это делает реал.
Пытался впилить в него обработку NMI. BTW, обработки NMI практически ни у кого нет, ни у fake86, ни у PCE. Вообще, хорошо если TRAP (int 1) обрабатывают, некоторые и на него забивают. Ввел несколько переменных и флагов:
Дальше vid_cga.c. Откуда-то скопипастил такую процедуру установки графического режима в CGA через порты. В качестве аргумента (mode) - 0x1E это по идее 640x400, 0x2E - это 320x200.Код:// 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
Процедура обработки порта 68. Смотрит, не сменился ли режим, если сменился - устанавливает новый. Также устанавливает флаг разрешения или запрещения NMI.Код: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 */;
}
При возникновении NMI в порт 28 должно находится смещение, куда произошла запись:Код: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;
}
Дальше, установил новые хендлеры для портов:Код: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);
}
}
}
Если что-то пишет в видео-память, проверить разрешены ли NMI, если разрешены - запомнить смещение куда произошла запись (для обработки 28 порта) и установить флаг вызова NMI.Код: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);
Дальше в x86.c обработку NMI сделал по аналогии обработки IRQ с PIC, вставил такой текст:Код: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;
}
}
Пока результата никакого.Код: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;
}
Tronix, огромное Вам спасибо за habrapost!
Предлагаю не распылять усилия и пилить таки MESS, в нем заметно больше готовых запчастей.
Пока что безуспешно борюсь с эмуляцией клавиатуры -- алфавитные клавиши работают нормально, но прочие посылают весьма странные сканкоды.
Кто-нибудь помнит, как выглядел 4-тый нортон на Поиске? С цветами не совсем понятно. У меня в эмуляторе получилось вот так:
Привет!
Вместо Зелёного берюзовый!!!
Да, если смотреть на палитру 1 в графическом режиме это цвет cyan (0x01), или light cyan
У Поиска нет текстового режима. И видимый 80x25 это есть графический 640x200 1bpp. Как получается еще один цвет, кроме белого, я если честно не очень понял. Вот что пишет ТО по этому поводу:
Код:В графическом режиме 640 х 200 точек отображение произво-
дится в формате 1 бит на точку. Каждая точка может иметь два
цвета из 16 возможных.
В символьном режиме 80 символов х 25 строк отображение
производится также в формате 1 бит на точку, но каждый байт
содержит неиспользуемый для формирования знака бит D7, кото-
рый может нести информацию о цвете символа.
Короче какая-то магия с портами 0x6A, 0x6B и каким-то 7-мым битом где-то.Код: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 то-
чек.
Думаешь, я ТО не читал, прежде чем делать эмуляцию? И схему не смотрел? :)
Про бит D7 проще из схемы узнать - это как бы альтернативный цвет засвеченных точек (из остальных семи). Я так понял, первая точка будет всегда незасвеченная, отсюда и полоски на инверсных символах. В принципе, при определённых настройках портов она может и не обнуляться, но тогда появятся вертикальные линии у символов с альтернативным цветом. Можно поиграться портами в отладчике.
Вообще, круто! Скорость очень похожа на настоящую. Только что-то checkit v3 не запускается в эмуле. И цвет все-таки надо поправить.
А мне всё-таки кажется, что я сделал правильно. Нортон вообще не устанавливает регистр палитры, он остался такой, какой был при установке режима, т.е. палитра номер ноль. Более того, в конфигурации Нортона установлен ч/б режим, т.е. реально использованы цвета 0,7,15, чёрный, серый и белый. А биос Поиска в псевдотектовом режиме 80х25 преобразовывает их в цвет фона, нормальный цвет и альтернативный цвет. А в палитре номер ноль это как раз чёрный, серый и зелёный (точнее, основная палитра с нулевым цветом фона).
Ну зачем спорить, если уже много человек сказало, что не было в текстовом режиме зеленого. Было только 3 цвета - черный, белый и бирюзовый. При переключении на русский цвет фона менялся на синий, остальные цвета оставались как есть.
Возможно была другая прошивка ПЗУ палитры. Другого объяснения у меня нет.
А что по поводу checkit? Вообще, побольше бы деталей.. Вижу, что x86 в виде отдельного плагина. С нуля писалось или где-то позаимствовано? Исходников нам не видать конечно?
Не смотрел ещё.
Писал с нуля, поэтому не уверен в 100% точности эмуляции процессора. Исходников не будет. :) Я уже где-то писал, что единственный заимствованный код в эмуляторе - процессор Z80, потому что мне до сих пор лень писать свою реализацию. Даже несмотря на неприлично большой размер имеющейся z80.dll