Сообщение от
kapitan-u
Я уже выяснил почему пару програм не идут: не полностью реализована ВВ55
Я тоже поленился это сделать...
Я вижу, что некоторые программы управляют переключением видепамяти через регистр управления ВВ55 0хС3 меняя режим нижней части порта С
Видимо перевод его в вежим ввода дает 1, а режим вывода - то что там прописано в порт С. Идеальный вариант для всех поделок: либо найти полную реализацию ВВ55, либо самому написать.
Полная реализация полезна и хороша, но для "Львова" (если только старый софт смотреть) отлично подойдет компромиссный вариант с частичной эмуляцией самого необходимого:
Код:
IO.prototype.input = function(port) {
port &= 0xFF;
//В ПК-01 "Львов" реализована неполная дешифрация портов ввода-вывода
//[http://lvovpc.ho.ua/forum/viewtopic.php?p=2219#p2219]
port = 0xC0 + (port & this.decoding_mask);
if (port === 0xD1) {
this.ports[port] = this.keyboard.get(this.ports[0xD0], 0xD0);
}
else if (port === 0xD2) {
this.ports[port] = this.keyboard.get(this.ports[0xD2], 0xD2);
}
else if ((port & 0x03) === 3) {
//Согласно документу i8255A/i8255A-5 datasheet мы имеем,
//что Control Word Register доступен только для записи:
//"The Control Word Register can Only be written into.
//No Read operation of the Control Word Register is allowed."
//[http://www.classiccmp.org/rtellason/chipdata/8255.pdf]
//Такие дела, котаны. Берегите себя, читайте мануалы.
return 0;
}
return this.ports[port];
};
IO.prototype.output = function(port, w8) {
port &= 0xFF;
//В ПК-01 "Львов" реализована неполная дешифрация портов ввода-вывода
//[http://lvovpc.ho.ua/forum/viewtopic.php?p=2219#p2219]
port = 0xC0 + (port & this.decoding_mask);
if ((port & 0x03) === 3 && (w8 & 0x80) === 0) {
var mask = 0x01 << ((w8 & 0x0E) >> 1),
target = port - 1;
if (w8 & 0x01) {
this.output(target, this.input(target) | mask);
}
else {
this.output(target, this.input(target) & ~mask);
}
}
if (port === this.MEDIA_PORT) {
if ((this.ports[this.PALETTE_PORT] & this.BEEPER_MODE_BIT) || this.ignore_ctrl_bit) {
this.beeper.process(w8 & this.BEEPER_BIT);
}
}
this.ports[port] = w8;
};
И
Код:
//port 0xC0
//[http://lvovpc.cu.cc/article.shtml?id=2]
//[http://lvovpc.cu.cc/article.shtml?id=5]
this.PRINTER_PORT = 0xC0;
//port 0xC1 (b)
this.PALETTE_PORT = 0xC1;
this.BEEPER_MODE_BIT = 0x80; // 1 - вывод звука на бипер разрешен
//port 0xC2 (c)
this.MEDIA_PORT = 0xC2;
this.BEEPER_BIT = 0x1; //1 - on, 0 - off
this.VRAM_STATUS_BIT = 0x2; //0 - видеоОЗУ подключено
this.PRINTER_SC_STROBE_BIT = 0x4;
this.TAPE_READ_BIT = 0x10;
this.PRINTER_AC_BUSY_BIT = 0x40;