PDA

Просмотр полной версии : Пишу эмулятор БК0011М для FPGA MiST.



Saar
20.01.2016, 17:33
Всем привет.
Пишу эмулятор БК0011М для платы MiST: https://github.com/mist-devel/mist-board/wiki
При этом хочу сделать максимально близко к железу.
Использую модель процессора от Vslav: http://zx-pk.ru/showthread.php?t=23978

Есть тут владельцы данной платы ну или может кто-то решится купить? (недавно закончил писать эмулятор ZX Spectrum 128K для этой платы со 100% такт-совместимостью с реальным железом).

Мой эмулятор в общем-то готов. Но столкнулся с проблемами подгонки кода чтобы было в точности как на реальном железе. Поскольку последний раз держал БК в руках лет 20 назад, много уже позабылось.
Нужен кто-то, у кого еще остались знания о точной работе разных регистров чтобы проверить и найти ошибки.

В частности не могу понять что не так с клавиатурой. При удержании кнопки при старте, БК остается в мониторе и при этом печатается символ нажатой кнопки, хотя в оригинале не должен.
Есть подозрение что регистр палитр иногда переключается в ненужное время.

В общем, хотелось бы найти единомышленников, готовых помочь довести эмулятор до полной совместимости. Знания FPGA не требуются. Нужно лишь хорошо знать БК и желание тестировать в разных ситуациях.

CodeMaster
20.01.2016, 17:44
Пишу эмулятор БК0011М для платы MiST:

Там много ячеек используется, в Terasic DE1 поместится?

Saar
20.01.2016, 19:33
Да, у меня V1.3.
В ReVerSE и DEx будут сложности с портированием ввиду отсутствия MCU.
MCU используется для доступа к SD. Точнее, даже не к самой SD а к образу. Поэтому придется изобретать дополнительные модули, реализующие как минимум функцию доступа к образу жесткого диска.

По поводу ресурсов:


+----------------------------------------------------------------------------------+
; Fitter Summary ;
+------------------------------------+---------------------------------------------+
; Fitter Status ; Successful - Sat Jan 16 01:22:23 2016 ;
; Quartus II 64-Bit Version ; 13.1.4 Build 182 03/12/2014 SJ Full Version ;
; Revision Name ; bk0011m ;
; Top-level Entity Name ; bk0011m ;
; Family ; Cyclone III ;
; Device ; EP3C25E144C8 ;
; Timing Models ; Final ;
; Total logic elements ; 5,954 / 24,624 ( 24 % ) ;
; Total combinational functions ; 5,504 / 24,624 ( 22 % ) ;
; Dedicated logic registers ; 2,323 / 24,624 ( 9 % ) ;
; Total registers ; 2375 ;
; Total pins ; 71 / 83 ( 86 % ) ;
; Total virtual pins ; 0 ;
; Total memory bits ; 446,464 / 608,256 ( 73 % ) ;
; Embedded Multiplier 9-bit elements ; 0 / 132 ( 0 % ) ;
; Total PLLs ; 1 / 4 ( 25 % ) ;
+------------------------------------+---------------------------------------------+


Раз некий интерес к проекту имеется, то я тогда создам на github репозиторий. Предлагаю вести один репозиторий, но сделать разные top модули для разных конфигураций. Таким образом изменений будут получать все конфигурации сразу.

Vslav
20.01.2016, 19:36
По SoftCore К1801ВМ1 нужно Vslav спросить, ядро вроде около 2К LE's.

Там скромно все - примерно 1400LE само ядро, + VPIC + UART в стиле ВП1-065 - в сумме весь проект примерно 1600LE. Сейча пишу универсальный Wisbone хаб + SDRAM контроллер, можно будет дальше PDP-компы типа ДВК за пару вечеров штамповать. Ну если ВМ2/ВМ3 осилим отреверсить :). Разработку веду на DE0, но U16 у меня тоже есть, планирую порт на нее.

Saar
20.01.2016, 22:45
Немного поофтоплю:
В целом MiST меня устраивает, но есть одна серьезная проблема - это разъем VGA! У меня некуда его просто воткнуть. Тем более реально там идет телевизионная развертка. Поэтому использую конвертер SCART->HDMI. Но тут еще одна проблема: некоторые эмуляторы выводят не ТВ развертку, а VGA. А универсальных конвертеров, понимающих одновременно TV и VGA нет.
В общем, я параллельно ищу другой вариант FPGA платы, с HDMI. Есть несколько вариантов типа того же ReVerSe или Марсоход. Но я уже понял, что MCU просто необходим. Да и любимая моя Амига без MCU не запустится ;)
Ну или нужна плата с довольно большой FPGA чтобы свободно разместить SoftMCU рядом. А тут уже вышеозвученные платы отпадают.

Но вот буквально вчера я нешел практически Ultimate Solution. Это гибрид Zynq7000. Там шустрый MCU уровня RPi B+ и FPGA уровня Cyclone III.
Если конкретно, то заказал вот такую борду: http://www.myirtech.com/list.asp?id=502
Заказал версию на Zynq7020 чтобы уж наверняка перекрыть возможности MiST.

По сути, на такой плате можно иметь эмуляторы обоих "лагерей". Есть неплохие эмуляторы на Raspberry Pi. Тот же SNES или N64. Их просто нет на FPGA. В то же время на FPGA тоже есть неплохие эмуляторы.
Если бы набрать единомышленников, то можно было бы довольно быстро портировать оба типа эмуляторов в довольно короткие сроки. Ну как минимум те, что на FPGA.

----------------------------------------------------------

Репозиторий тут: https://github.com/sorgelig/BK0011M
Те, кто хочет непосредственно принять участие в разработке, откройте Issue - я добавлю.

Если есть замечания по поводу оформления лицензий и тому подобное - сообщите мне, я поправлю.

Небольшая вводная:
В папке SW находится утилита, которая позволяет создать/разобрать образ HDD из отдельных флоппи дисков. Этот образ и используется в эмуляторе. На MiST board его надо положить в корень SD карты. Если дать имя bk0011m.vhd, то он автоматически откроется (и БК загрузится с HDD) при старте ядра - это делает MCU.
Через OSD ядро позволяет открывать DSK - образ floppy, read-only. VHD - образ HDD read-write. DSK монтируется как Диск 0, а VHD как Диск 2+(то есть партиции начинаются с номера 2). В ПЗУ БК зашита автозагрузка сначала с диска 2, а при неудаче - с диска 0.
Ну то есть основной упор сделан на работу с HDD, а не с отдельными дискетами, поскольку количество софта для БК намного больше одной дискеты :)
Так же через OSD переключаются ЧБ/ЦТВ режимы экрана.

Если есть какие вопросы по работе - задавайте. Возможно будут вопросы по работе самой MIST board - тоже готов пояснить.

На мой взгляд, пока имеются две основных проблемы, которые я бы хотел решить:

1) Работа прерываний клавиатуры. Я не могу понять, почему при удержании клавиши при загрузки в конце вылазит символ нажатой клавиши. Получается, что запрос на прерывание не сбрасывается. Я вроде всё проверил, но не могу пофиксить. Доступа к реальной БК у меня нет. Может что-то в модуле клавиатуры, а может глюк в модуле прерываний. Впрочем и вся клава должна быть тщательно проверена, поскольку писалась без использования модели ВП1-014. Хорошо бы заиметь человеческий verilog 014 как это сделано для 037.

2) Времена обращения процессора к памяти довольно условны. Хотя я и использовал огрызок от 037, отвечающий за задержку, есть сомнения в его точности, поскольку он предназначен для шины Q-BUS, а не Wishbone. В целом времена я подобрал близкие и даже большинство моих старых демок для БК работают корректно, но, всё таки, не 100% как в реальной БК.

- - - Добавлено - - -

Еще есть сомнения на счет срабатывания регистра палитр, поскольку если я запускаю БК0010 игру в CSIDOS, то включается 15 палитра, а по идее должна быть 0. Надо как-то оттрассировать это в БК.
Вспоминать свой код 20 летней давности довольно сложно ;)

Вообще, наверное, надо добавить режим пульта. Это не сложно. Сложно найти дебаггер пультовый. Есть ли такой?

AlecV
24.01.2016, 12:48
Вот такой еще есть. Ядро проца - другое.
https://code.google.com/p/bk0010/

Saar
24.01.2016, 15:36
Вот такой еще есть. Ядро проца - другое.
ему сто лет в обед. Думаю, все кто хотел, его видели.

Saar
27.01.2016, 00:58
Ну и?
Я думал что хотя бы какие-то отзывы получить.
На какую-то помощь, я так понимаю, нет смысла рассчитывать?

CodeMaster
27.01.2016, 07:59
Я думал что хотя бы какие-то отзывы получить.

А в теме "засветился" хоть один владелец MiST?


На какую-то помощь, я так понимаю, нет смысла рассчитывать?

В русле эксклюзивных just for fun проектов - обычно да.

Patron
27.01.2016, 15:33
Я думал что хотя бы какие-то отзывы получить.Возможно, есть смысл создать тему на форуме БК (http://bk0010.org/forum/).

maxstudios
27.01.2016, 15:59
Ну и?
Я думал что хотя бы какие-то отзывы получить.
На какую-то помощь, я так понимаю, нет смысла рассчитывать?

Очень редко сюда захожу, сейчас перешел по ссылке с форума сайта bk0010.org.
Вы просто ищете людей немного не там, советую писать сразу на несколько форумов на сайтах:
pk-fpga.ru bk0010.org phantom.sannata.ru
Железные БК есть ещё у многих, и помочь многие бы смогли.

Saar
27.01.2016, 19:59
Мда.. попробовал на bk0010.org написать.. Как в дерьмо вляпался. Там, любой аноним непонятно откуда может писать всякую фигню.
Ну его нафиг. Мало того что там дизайн - вырви глаз, там и содержание соответствующее.

Saar
27.01.2016, 21:55
MVV,
У вас нет желания сделать плату на основе Cyclone V SX/ST (та версия что с ARM)? Ну очень хочется поиметь такую платку.
Я пока жду JTAG для своего Zynq7020. Чип интересный, но софт у Xilinx просто ппц какой неудобный и неочевидный. Хочется то же, но на Altera. Я уже так привык к Квартусу. Я считаю что за гибридными чипами будущее. Да и вообще, очень интересное решение буквально на одном чипе. По сути ваш ReVerSE-U16 на Cyclone V SX в корне меняет ситуацию.

Вопрос ко всем: Не могу найти точную инфу по работе ВП1-014. Интересует вот что: если было запрещено прерывание (по MTPS) и после нажатия кнопки программа прочитает из 177662 а потом разрешит прерывание, наступит прерывание от клавиатуры или нет? Мне кажется что в этом кроется глюк клавы.

P.S: Пофиксил наконец-таки прерывание от клавы!

alex904
28.01.2016, 01:19
Так в чем помощь конкретно сейчас требуется? В прогонке проекта на MiST'е? Я пока его не купил, но собирался. То, что проект выложен на github - это огромный плюс. Вот, что не хватает, так это подробного описания, как это потом загружать, как отлаживать, какой инструментарий использовать и.т.д. Беды многих открытых проектов. Надо понимать, что людей с мозгами и желанием полно, а вот набор скиллов у всех разный. Иногда надо помочь и первые детские шажки сделать.

Saar
28.01.2016, 01:53
Желательно, конечно иметь плату MiST. Если у вас она появится - это будет великолепно! Буду тогда не одинок :) Но и владельцы других плат приветствуются - только понадобится опыт чтобы портировать.

Я обновил репозиторий. Там теперь есть бинарник чтобы можно было запустить без компиляций.
Если хотите присоединиться к разработке, то тоже ничего сложного. Для Altera Cyclone III всего одна среда разработки - Quartus II 2013. Так что не заблудитесь ;)
В общем-то я сам на FPGA программирую чуть больше пары месяцев. Более-менее освоился уже.

Из помощи нужно в первую очередь проверить тонкости в реализации. То есть запустить в эмуляторе разные самописные куски для проверки, например, клавиатуры в разных режимах, проверить насколько разнится скорость выполнения с реальной БК. Всякие там прерывания и т.д. В общем, нужно иметь под боком реальную БК0011М и знания в ее железе и программировании.

Но и помощь в развитии самого проекта тоже приветствуется. Кое что еще не реализовано. Например, загрузка отдельных файлов. Можно даже сделать загрузку через магнитофонный вход. Сделать полноценный режим БК0010 (потому, нужна загрузка отдельных файлов, и надо придумать формат или взять какой-то уже известный). Я не совсем знаком с поздними разработками для БК0010. Там вроде тоже были КНГМД. Просто я как-то быстро перешел на БК0011М и все разработки делал на ней.

- - - Добавлено - - -

Еще не пойму почему при загрузке игр для БК0010 в CSIDOS включается 17 палитра вместо 0. То ли у меня имидж винта остался от моей доработки БК0011М с 16 цветами. То ли это глюк моего эмулятора.
Но мне интересна еще идея переключения в БК0010 с отключением всего что добавили в БК0011М. В общем идей достаточно, но в одиночку я могу просто остановиться на каком-то моменте, если не будет команды.

DenSam
28.01.2016, 09:20
Смогу прояснить некоторые вопросы, но небыстро (работа, семья) и не очень скоро (сейчас вообще не дома) - под рукой живой БК-шки нет и нет моих талмудов дизасма ее монитора (хотя это решаемо). В общем не ранее, чем через неделю смогу выдать что-то полезное.

gid
28.01.2016, 10:01
если было запрещено прерывание (по MTPS) и после нажатия кнопки программа прочитает из 177662 а потом разрешит прерывание, наступит прерывание от клавиатуры или нет?
Если вопрос всё ещё актуален, то ответ: нет не наступит. При чтении регистра 177662 сбрасывается бит готовности в регистре 177660 и требование прерывания снимается, пока оно было запрещено.

Кстати, есть код верилога ВП1-014, который похож на человеческий, но не знаю, насколько он практически применим. Я тренировался на нём конвертировать автосгенерированные Vslavом верилоги. В результате понял, что мне это дело не осилить. Всё равно не получается сделать правильный человеческий верилог, не хватает ни знаний, ни опыта. Данный код работает аналогично vp_014.v, без учёта времянок.


//
//__________________________________________________ ____________________________
//
`timescale 1ns / 100ps

module va_014
(
inout[7:0] PIN_nAD, // Address/Data inverted bus
//
input PIN_nSYNC, //
input PIN_nDIN, //
input PIN_nDOUT, //
input PIN_nINIT, //
input PIN_nCS, // вход BS от ВП1-037, это выборка адресов 177660..177663
input PIN_nIAKI, // вход сигнала IAKO от ВМ1
output PIN_nIAKO, // выход, передача векторного прерывания дальше по цепочке
output PIN_nRPLY, //
output PIN_nIRQ, // выход, VIRQ
//
input[7:1] PIN_Y, //
output[7:1] PIN_Y_OC, //
input[9:0] PIN_X, //
output PIN_RP1_OC, //
output PIN_RP2_OC, //
input PIN_RP1, //
input PIN_RP2, //
//
input PIN_nCTRL, //
input PIN_nSHIFT, //
input PIN_nEC1, //
input PIN_EC2 //
);

//__________________________________________________ ____________________________
//
// Autogenerated netlist
//


wire din_in;
wire dout_in;
wire iaki_in;
wire sync_in;
wire init_in;
wire nShift_in;
wire nCtrl_in;
wire cs_in;
wire nAD1_in;
wire nAD6_in;
wire RP1_in;
wire RP2_in;
wire iako_out;
wire rply_ena;
wire irq_ena;

wire [9:0] X;
wire [7:1] Y;
wire [6:0] C;
wire [7:0] ad_out;

wire X5_4;
wire X9_6;
wire X3_0;
wire XANY;
wire V274;
wire V60;
wire VANY;

wire LOCK;
wire RELEASE;
wire WSTB;
wire DATRD;
wire IACK;
wire OE;
wire CSR;
wire DAT;
wire nEC2;
wire nEC1;
wire nIRQ;
wire CSRRD;
wire CSRWR;
wire rdy_stb0;
wire rdy_stb1;

wire NET00047;


reg [6:0] data;
reg [7:1] YIN;
reg reg_rc;
reg ad1_rc;
reg cs_rc;
reg irq_rc;
reg vect_rc;
reg IEN;
reg irq_fc;
reg READY, rdy_fc;
reg PRESS;
reg BUSY, rel_fc;



//__________________________________________________ ____________________________
//
// Autogenerated cell instantiations
//

//input pins

assign nAD1_in = PIN_nAD[1]; //tINPUT cell_PIN32
assign nAD6_in = PIN_nAD[6]; //tINPUT cell_PIN33

assign X[9:0] = ~PIN_X[9:0];
assign Y[7:1] = ~PIN_Y[7:1];

assign iaki_in = ~PIN_nIAKI; //tINPUT cell_PIN25
assign sync_in = ~PIN_nSYNC; //tINPUT cell_PIN29
assign dout_in = ~PIN_nDOUT; //tINPUT cell_PIN27
assign din_in = ~PIN_nDIN; //tINPUT cell_PIN26
assign init_in = ~PIN_nINIT; //tINPUT cell_PIN19
assign cs_in = ~PIN_nCS; //tINPUT cell_PIN30
assign nShift_in = PIN_nSHIFT; //tINPUT cell_PIN16
assign nCtrl_in = ~PIN_nCTRL; //tINPUT cell_PIN18
assign nEC1 = PIN_nEC1; //tINPUT cell_PIN17
assign nEC2 = ~PIN_EC2; //tINPUT cell_PIN31
assign RP1_in = PIN_RP1; //tINPUT cell_PIN20
assign RP2_in = PIN_RP2; //tINPUT cell_PIN22

//output pins

assign PIN_nAD[7:0] = ~OE ? 8'bzzzzzzzz : ad_out[7:0]; //tOUTPUT_OE cell_PINOU39

assign PIN_Y_OC[1] = ~YIN[1] ? 1'bz : 1'b0; //tOUTPUT_OC cell_PIN5_OC
assign PIN_Y_OC[2] = ~YIN[2] ? 1'bz : 1'b0; //tOUTPUT_OC cell_PIN4_OC
assign PIN_Y_OC[3] = ~YIN[3] ? 1'bz : 1'b0; //tOUTPUT_OC cell_PIN3_OC
assign PIN_Y_OC[4] = ~YIN[4] ? 1'bz : 1'b0; //tOUTPUT_OC cell_PIN2_OC
assign PIN_Y_OC[5] = ~YIN[5] ? 1'bz : 1'b0; //tOUTPUT_OC cell_PIN1_OC
assign PIN_Y_OC[6] = ~YIN[6] ? 1'bz : 1'b0; //tOUTPUT_OC cell_PIN41_OC
assign PIN_Y_OC[7] = ~YIN[7] ? 1'bz : 1'b0; //tOUTPUT_OC cell_PIN40_OC

assign PIN_nIAKO = ~iako_out; //tOUTPUT cell_PIN24
assign PIN_nIRQ = irq_ena ? 1'bz : 1'b0; //tOUTPUT_OC cell_PIN23_OC
assign PIN_nRPLY = rply_ena ? 1'bz : 1'b0; //tOUTPUT_OC cell_PIN28_OC
assign PIN_RP1_OC = XANY ? 1'bz : 1'b0; //tOUTPUT_OC cell_PIN20_OC
assign PIN_RP2_OC = ~XANY ? 1'bz : 1'b0; //tOUTPUT_OC cell_PIN22_OC


//__________________________________________________ ____________________________
//

assign CSR = ad1_rc & cs_rc; //t390 cell_C33
assign DAT = ~ad1_rc & cs_rc; //t390 cell_C33
assign CSRWR = sync_in & CSR & dout_in; //t384 cell_F33
assign CSRRD = sync_in & CSR & din_in; //t387 cell_C31
assign DATRD = sync_in & DAT & din_in; //t380 cell_D31
assign IACK = iaki_in & din_in & irq_rc; //t378 cell_C18
assign iako_out = iaki_in & din_in & ~irq_rc; //t380 cell_D21
assign V274 = vect_rc & IACK; //t391 cell_C15
assign V60 = ~vect_rc & IACK; //t391 cell_C15
assign VANY = V274 | V60; //t385 cell_C17
assign OE = DATRD | CSRRD | VANY; //t382 cell_C11
assign X9_6 = (X[9:6] != 4'h0); //t381 cell_I27
assign X5_4 = (X[5:4] != 2'h0); //t373 cell_I11
assign X3_0 = (X[3:0] != 4'h0); //t381 cell_F13
assign XANY = (X[9:0] != 10'h0); //t387 cell_L11
assign LOCK = (PRESS | XANY) & ~init_in; //t373 cell_F20
assign WSTB = PRESS & XANY; //t376 cell_D7
assign nIRQ = ~READY | irq_fc;
assign irq_ena = ~IEN | nIRQ; //t370 cell_C9
assign rply_ena = ~(CSRWR | OE); //t385 cell_G33
assign RELEASE = ~( rel_fc | PRESS);
assign rdy_stb0 = ~(~rdy_fc | DATRD);
assign rdy_stb1 = ~(BUSY | RELEASE);


assign C[0] = (YIN[6] | ((YIN[4] | (~YIN[3] & (~YIN[1] | YIN[2]))) & ~YIN[5])) & ~YIN[7]; //t381 cell_H21
assign C[1] = (YIN[5] | YIN[4] | (~YIN[2] & ~YIN[3])) & ~(YIN[7] | YIN[6]); //t381 cell_H19
assign C[2] = ~(YIN[7] | YIN[6] | YIN[5] | YIN[4]); //t381 cell_H18
assign C[3] = (X[8] | ((X[6] | ((X[4] | ~(X[3] | X[1])) & ~X[5])) & ~X[7]))& ~X[9]; //t381 cell_H17
assign NET00047 = (X[5] & (YIN[7] | YIN[6] | YIN[5] | YIN[4])); //t373 cell_L25
assign C[4] = ~(X[2] | X[3]) & ((X5_4 & ~(nShift_in ^ NET00047)) | (~(X[9] | X[8]) & (X[7] | X[6] | ~(X[5] | X[4])))); //t376 cell_H16
assign C[5] = ((~(nEC1 ^ reg_rc) | nCtrl_in) & ~X5_4) | ~(nShift_in | ~X9_6) | X3_0; //t380 cell_G23
assign C[6] = (~X9_6 | nCtrl_in); //t373 cell_G25

assign ad_out[0] = (data[0] | ~DATRD); //t374 cell_I25
assign ad_out[1] = (data[1] | ~DATRD); //t374 cell_I24
assign ad_out[2] = (data[2] | ~DATRD) & ~V274; //t376 cell_I21
assign ad_out[3] = (data[3] | ~DATRD) & ~V274; //t377 cell_D27
assign ad_out[4] = (data[4] | ~DATRD) & ~VANY; //t376 cell_C25
assign ad_out[5] = (data[5] | ~DATRD) & ~VANY; //t376 cell_C21
assign ad_out[6] = (data[6] | ~DATRD) & (IEN | ~CSRRD); //t376 cell_D16
assign ad_out[7] = (~CSRRD | ~READY) & ~V274; //t377 cell_C29

//__________________________________________________ ____________________________
//


/*
assign nYOC[1] = ~(LOCK & YIN[1]); //t390 cell_H31
assign YIN[1] = ~(nYOC[1] & Y[1]); //t390 cell_H31
assign nYOC[2] = ~(LOCK & YIN[2]); //t390 cell_M23
assign YIN[2] = ~(nYOC[2] & Y[2]); //t390 cell_M23
assign nYOC[3] = ~(LOCK & YIN[3]); //t390 cell_I30
assign YIN[3] = ~(nYOC[3] & Y[3]); //t390 cell_I30
assign nYOC[4] = ~(LOCK & YIN[4]); //t390 cell_M17
assign YIN[4] = ~(nYOC[4] & Y[4]); //t390 cell_M17
assign nYOC[5] = ~(LOCK & YIN[5]); //t390 cell_M19
assign YIN[5] = ~(nYOC[5] & Y[5]); //t390 cell_M19
assign nYOC[6] = ~(LOCK & YIN[6]); //t390 cell_M25
assign YIN[6] = ~(nYOC[6] & Y[6]); //t390 cell_M25
assign nYOC[7] = ~(LOCK & YIN[7]); //t390 cell_M27
assign YIN[7] = ~(nYOC[7] & Y[7]); //t390 cell_M27
*/
always @(*)
begin
if (~LOCK)
begin
YIN[7:1] <= 7'h0;
end
else begin
if (~Y[1])
YIN[1] <= 1'b1;
if (~Y[2])
YIN[2] <= 1'b1;
if (~Y[3])
YIN[3] <= 1'b1;
if (~Y[4])
YIN[4] <= 1'b1;
if (~Y[5])
YIN[5] <= 1'b1;
if (~Y[6])
YIN[6] <= 1'b1;
if (~Y[7])
YIN[7] <= 1'b1;
end
end

always @(*)
begin
if (LOCK) //t406 cell_L27(.c1(X[1]), .r2(LOCK), .q3(reg_rc), .r5(YIN[7]), .s10(YIN[6]));
reg_rc <= 1'b0;
else if (X[1])
begin
if (YIN[7])
reg_rc <= 1'b0;
else if (YIN[6])
reg_rc <= 1'b1;
end

if (~sync_in)
begin
cs_rc <= cs_in; //t416 cell_H33(.c1(~sync_in), .q4(cs_rc), .d5(cs_in));
ad1_rc <= nAD1_in; //t416 cell_D33(.c1(~sync_in), .q3(NET00204), .q4(ad1_rc), .d5(nAD1_in));
end

if (~din_in)
begin
irq_rc <= ~irq_ena; //t416 cell_C23(.c1(~din_in), .q3(NET00123), .q4(irq_rc), .d5(~irq_ena));
end

if (WSTB)
begin
vect_rc <= (nEC2 | (((YIN[1] & X[1]) | (X[2] & YIN[1]) | (YIN[3] & X[1]) | X[0]) & ~(X[0] & YIN[3]))); //t416 cell_F23(.c1(WSTB), .q3(vect_rc), .d5(NET00002));
data[6:0] <= C[6:0];
end

if (IACK)
irq_fc <= 1'b1;
else if (~READY)
irq_fc <= 1'b0;

if (READY | init_in)
BUSY <= 1'b1;
else if (RELEASE)
BUSY <= 1'b0;

if (~BUSY)
rel_fc <= 1'b1;
else if (PRESS)
rel_fc <= 1'b0;

if (init_in | rdy_stb1)
rdy_fc <= 1'b0;
else if (DATRD)
rdy_fc <= 1'b1;

if (init_in | rdy_stb0)
READY <= 1'b0;
else if (rdy_stb1)
READY <= 1'b1;
end

always @(posedge RP1_in or posedge RP2_in)
begin
if (RP2_in) //set
begin
PRESS <= 1'b1;
end
else //datastrobe
begin
PRESS <= RP2_in;
end
end

always @(posedge CSRWR or posedge init_in)
begin
if (init_in)
IEN <= 1'b0;
else
IEN <= nAD6_in;
end



endmodule
//__________________________________________________ ____________________________
//

Saar
28.01.2016, 12:07
gid,
Ну почему же. У вас очень даже человеческий Verilog получился.
С клавой я уже разобрался. Именно этот момент я не учитывал - поэтому и печатался символ при удержании клавиши при старте.
Как вы думаете, ваша переделанная модель работает идентично оригинальной ВП1-014 в части определения нажатия нескольких клавиш?
Там вроде команду RESET надо было подавать перед опросом.

gid
28.01.2016, 14:27
Saar, формально говоря, моя переделанная модель есть прямой функциональный аналог модели, полученной в результате реверсинга чипа. Если Vslav нигде не ошибся, а я уверен, что нет, то модель и должна работать почти так, как оригинальный ВП1-014. Я же писал, что переделал без учёта времянок, главное было, чтобы вывод тестбенча в модельсиме примерно совпадал с оригинальной асинхронной сгенерированной моделью. Поскольку это совершенно не моя область деятельности, я не предполагал практического использования модели и даже не знаю, будет ли она работать правильно. Или возникнут какие-либо казусы, связанные с рассихроном времянок. Модель-то нифига не синхронная.

Когда на БК впервые заговорили об обработке одновременного нажатия нескольких клавиш, я, почитав, в чём там суть, для себя сразу отказался от этого метода. Поскольку складывание по OR сканкодов нескольких нажатых клавиш даёт слишком мало простора для деятельности.

Saar
28.01.2016, 20:45
Ну да, не все варианты кнопок можно так опросить, но в те времена это уже было достижением и новым функционалом.
Я даже прикидывал на клаве, вполне рабочие варианты можно было найти. Там же на надо одновременное нажатие вверх и вниз, или влево и вправо. А надо вверх, например и вправо. Ну или вправо + стрелять. Всё равно это был бесплатный метод.
А заговорил про это я, поскольку хочется сделать функционал как можно ближе.
От ВП1-014 синхронности, в общем-то и не надо. Она же вообще - комбинаторная логика без клока.

Вот такой еще вопрос, теперь по БК0010: При записи в 177662 происходит прерывание по 4 вектору или нет?

- - - Добавлено - - -

Еще вопрос по БК0011М:
Заметил интересную особенность старта. Если в страницах ПЗУ 12 и 13 что-то есть, то бэйсик не стартует. Поидее, признак запускаемого ПЗУ это команда NOP в первом адресе. А тут, монитор почему-то пытается запустить ПЗУ из 12 и 13 страниц без этого признака.
Даже если принудительно выставить 11;1C и запустить 100000G, бэйсик не запустится.
Просто хотел отладчик положить в 12 страницу, но запускать его только вручную когда нужно.

gid
28.01.2016, 22:13
по БК0010: При записи в 177662 происходит прерывание по 4 вектору или нет?
Обязательно происходит. RPLY подавать некому, поскольку в ВП1-014 регистр 177662 реализован только по чтению.

Если в страницах ПЗУ 12 и 13 что-то есть, то бэйсик не стартует.
Правильно, потому что БОС БК11М опрашивает эти страницы, и если там что-то есть, т.е. отзывается по чтению, происходит вызов подпрограмм из этих страниц.
Причём сперва делается TST @#120000 и если там что-то есть делается вызов CALL @#120000, если там ничего нет, делается TST @#100000 и если там что-то есть, делается CALL @#100000. Для чего такие сложности, разработчики ПО БК унесли с собой в могилу, это не отражено ни в одном публично доступном документе, но это рушит весь процесс загрузки.
Во время попытки принудительно выставить 11;1C и запустить 100000G управление передаётся в БОС БК11М, где зачем-то подключается страница 12 вместо бейсиковской 11 и делается переход на адрес @#100002, что конкретно делается и почему, я подробно не проверял, просто в эмуляторе загрузил в стр.12 ПЗУ монитора БК10 и Фокал и погонял по быстрому, там надо долго и кропотливо пошагово в отладчике трассировать, чтобы разобраться.

Saar
28.01.2016, 22:34
Ага, я тоже только сейчас раскопал про 12 страницу. Там оказывается размещается контроллер сети, который использует Бэйсик.
Просто так совпало, что я туда совой дебаггер запихал :)
Перенес дебаггер в 13 страницу, и всё заработало как надо.

- - - Добавлено - - -

Хотя, Бэйсик при таком раскладе всё равно автоматом не стартует, поскольку имеет ниже приоритет, чем ПЗУ в 13 странице. Странно, но я думал, что если ПЗУ начинается не с NOP инструкции, то монитор не должен его запускать при старте.

Кстати, какая страница ПЗУ подключится на реальной БК0011М, если установить в 1 одновременно все или несколько бит ПЗУ в 177716?

DenSam
29.01.2016, 00:01
Кстати, какая страница ПЗУ подключится на реальной БК0011М, если установить в 1 одновременно все или несколько бит ПЗУ в 177716?

Не пробовал на самом деле, но взгляд в схему дает однозначный ответ, что откликаться будут все микросхемы, то есть если выставить все биты, то в области 120000(8)-137777(8) будет мешанина из Монитора(БОС) и Бейсика, а в области 100000(8)-117777(8) будут две ПЗУ Бейсика давать ответ.
Регистр страниц ПЗУ сделан на D36, которая по записи в 177716(8)(порт памяти) защелкивает данные с шины процессора как есть, без контроля установления не более одного бита (точнее установления не менее 3 бит, ведь шина инверсна) и тогда по линиям ПЗУ0-ПЗУ3 по всем будут "нули", что означает выборку микросхем. И с учетом совпадения чип-кодов в ПЗУ будут откликаться на шину процессора например две микрухи сразу.

Если не прав, пусть знатоки поправят мои мысли.

Saar
29.01.2016, 13:52
Добавил поддержку эмуляции БК0010. Имеется ввиду запуск именно БК0010, а не внутри БК0011М. Добавил туда же поддержку дисковода. По сути просто вставил прошивку дисковода от БК0011М + ОЗУ в адреса 120000-157777.
Вроде так это было в оригнальном КНГМД для БК0010? ANDOS 3.30 запустился.
Вопрос: насколько эмуляция разных кастомных расширителей для БК0010 имеет смысл? Там всякие A16M, SMK64/128/512?
Заметил в АНДОС бэйсик для A16M - наверное, нужная вещь и имеет смысл сделать эмуляцию А16М. Вот только где достать техническую документацию на него? Там, наверное, как-то ПЗУ оригинального бэйсику подключаются.

А что на счет SMK расширений? Я недавно наткнулся на описание как подключать страницы в SMK128(вроде). Пытался понять, прочитал раз 5. Мозги чуть не сломал. Под это извращение кто-то писал софт или нафиг не надо такое?

gid
29.01.2016, 21:54
эмуляция разных кастомных расширителей для БК0010 имеет смысл?
Принципиально - нет, но в своё удовольствие и для саморазвития - можно сделать.

Вот только где достать техническую документацию на него?
Технической документации нету, есть только справочный листок вот такого типа http://bk-files.perestoroniny.ru/bk-a16tech.html, даже схемы нету, точнее, я рисовал когда-то схему, но она с ошибками. По принципу функционирования схема сходна со схемой СМК, поэтому вполне достаточно схемы СМК и таблицы режимов А16М. Можно считать, что А16М - это почти СМК-16 без винчестера (различие только в логике распределения сегментов ОЗУ согласно таблицам).

Там, наверное, как-то ПЗУ оригинального бэйсику подключаются.
Да, в А16М есть такой спец режим только для БК10, кстати точно такой же режим есть и в СМК, и тоже только для БК10.
Т.е. из 8 режимов работы обоих контроллеров часть предназначена для работы на БК10, они не корректны для БК11М. Часть наоборот - для БК11М и некорректны для БК10, остальные - универсальны.

А что на счет SMK расширений?
Имеет смысл реализовать СМК-512 ради поддержки HDD на БК, остальные СМК есть подмножество СМК-512. Вообще говоря СМК как устройство - одно, а цифры обозначают просто количество памяти, припаянной к плате контроллера. Там изначально всё разведено было под максимально возможные 512кб. Ну и нюанс - количество набортной памяти прописано по определённому адресу ПЗУ СМК, чтобы программно знать, сколько памяти есть в наличии. Поэтому ПЗУ одной версии для СМК-64, -128, -256 и -512 различаются между собой одним байтом. Но это принципиально только для программ, корректно написанных под семейство СМК, для остальных - никакой разницы.

Под это извращение кто-то писал софт или нафиг не надо такое?
Писали, даже сваяли какую-то операционку OS A/WASP. Но к тому времени БК уже сдох, и ничего никому стало не нужно.

Ewgeny7
29.01.2016, 22:45
Saar, а ты делаешь видеовыход на VGA?
Если да, то используешь принцип скандаблера, или видеогенератор изначально заточен под фрейм VGA?
Я это к чему спрашиваю, помаленьку (но активно) собираю методом макеток, МГТФ и местами ЛУТа очередную борду, на этот раз на втором Циклоне. Память изначально заложил 16-битную, в расчете на Орион-128 и БК-0010.

http://savepic.net/7667565m.jpg (http://savepic.net/7667565.htm)
http://savepic.net/7615341m.jpg (http://savepic.net/7615341.htm)

Орион уже работает, чуть ранее запустил Радио-86РК и ЮТ-88. Аудио сделал на ЦАПе, привинчен USB-UART (Орион активно использует). SD-карта - само собой. Выведена гребенка I/O, куда можно прицеплять что-либо. Например, ПЗУ или микроконтроллер.
И вот уже подбираюсь к БК.
Машинка для меня практически неизведанная, изучаю ее с нуля. Форумчане активно помогают :) Архитектура вообще не знакомая, я всю жизнь с 8080/Z80 ковырялся, да с микроконтроллерами :)
Очень хотел бы перенести ваш проект на свою "доску", полностью или частично. Но - видеовыход у меня будет строго ТВ-фрейм. Поскольку VGA - слишком уж "резиновая женщина", ИМХО...

Saar
30.01.2016, 00:52
Пытаюсь разобраться с A16M расширением и не могу уловить как происходит перехват холодного старта.
Смотрю исходники эмулятора http://gid.pdp-11.ru/
Поидее контролер должен модифицировать адрес старта в 177716 чтобы стартовать с 170000(или 160000?), но не вижу где это делается. Впрочем, меня не исходник эмулятора интересует, а механизм запуска ПЗУ.
Я так понимаю, что ПЗУ А16М состоит из двух частей: ПЗУ контролера КНГМД с 160000 со стандартными точками входа. и ПЗУ обслуживания расширенной памяти с 170000. так?

P.S.: разобрался и с ПЗУ и с тем как получается стартовый адрес.

- - - Добавлено - - -

Ewgeny7,
У меня видеовыход изначально с RGBS ТВ разверткой. При включении опции scandoubler (по умолчанию) подключается дополнительный scandoubler для вывода в псевдо-VGA 50гц RGBHV.
Скандоблер легко убирается, если нужна только ТВ развертка. Лично я использую только ТВ развертку (и внешний SCART->HDMI конвертер). А scandoubler для унификации с другими эмуляторами на этой плате.
Цап, кстати, легко делается методом ШИМ на FPGA и RC цепочкой на выходе. Экономия на ЦАПе и выхдах FPGA. В моем проекте есть код для этого.

А почему не хочешь использовать какую-то готовую FPGA плату со всеми нужными разъемами? Лично мне Altera DEx платы разработок не нравятся ввиду их громоздкости, но для твоего проекта в самый раз. Там все порты, что я наблюдаю на картинке, присутствуют.
А есть сайт где можно почитать про твои разработки? Я не против портировать твои Р86 и Орион на MiST, если проекты открытые.

ivagor
30.01.2016, 09:01
Ewgeny7, а как будешь переделывать работу с sd в этом проекте? Подцепишь микроконтроллер на I/O пины?

Ewgeny7
30.01.2016, 13:41
Цап, кстати, легко делается методом ШИМ на FPGA и RC цепочкой на выходе. Экономия на ЦАПе и выхдах FPGA.
БесЦАПовый период я уже давно прошел. Недавно закупил на Али по дешевке TDA1543, вот и втыкаю их куда ни попадя. А раньше - да, ШИМами делал. На u10_Reverse звук выводил ШИМом, чтобы мозг не сломать встроенным кодеком :)
Код ШИМа у меня есть свой, где-то валяется в недрах ПЦ...


А почему не хочешь использовать какую-то готовую FPGA плату со всеми нужными разъемами?
А в чем профит готовых плат? Сделать на ней проект, а потом стереть его нафиг во имя нового? Это тоже неплохой вариант, но у меня подход немножко отличается. Это уже четвертая "борда" на МГТФ, на первой сделан намертво "Scorpion-ZS 512 FPGA" со СМУКом и прочими "винчестерами" на компакт-флеши, на второй плате - Радио-86РК с SD-интерфейсом, на третьей - "Орион-2010". Конечно, конфиги можно менять, но мне больше нравится законченное изделие.Платы вставлены в коробочки от свитчей D-Link, и смотрятся симпатично :)
Поэтому громоздкость и немалые цены на плату с ненужными для данного проекта железяками - нафиг.
Да и есть что-то неуловимо здОровское в самодельной борде.

- - - Добавлено - - -


Подцепишь микроконтроллер на I/O пины?
Думаю что да. Это предусмотрено по крайней мере :)

- - - Добавлено - - -


А есть сайт где можно почитать про твои разработки? Я не против портировать твои Р86 и Орион на MiST, если проекты открытые
Нет. Они "рассеяны" по форуму, половину я делал для проекта uX-Reverse. Для них я делал первые версии спектрума (потом делал только для своих самоделок), Орион, ЮТ, переносил с других девборд Башкирию-2М от b2m, Радио-86РК оттуда же (потом наваял свою версию), принял участие в "Специалисте". Другая часть не выкладывалась по причине вышеописанной самодельности плат.
Эти проекты уже неприменимы напрямую, только как примерные образцы. Если кому надо - высылаю электропочтой.

- - - Добавлено - - -


У меня видеовыход изначально с RGBS ТВ разверткой.
Вот, правильный подход! Скандаблер можно прилепить прицепом, при этом сохранится чуть больше аутентичности машинки.

П.С. Забавно бывает читать в интернетах, что ПЛИС на макетке не запустить. Про PLL - вообще жуть и ужас :)
Альтеровские ПЛИСы на самом деле очень "крепкие и надежные", всё у них работает даже в таком монтажном безобразии.
Орион работает на новой плате, установлен модуль ромдиска на разъемы GPIO -

http://savepic.net/7633551m.jpg (http://savepic.net/7633551.htm)

Этот конфиг практически завершен. Можно еще и PAL-кодер бы софтовый прикрутить... Но мне больше нравится ч/б и градации серого.

Saar
30.01.2016, 20:04
А в чем профит готовых плат? Сделать на ней проект, а потом стереть его нафиг во имя нового?
зачем стирать? Можно сделать выбор что загружать с SD карты. Но это уже каждому свое, да :)

----------------------------

Что-то я запутался в спеках A16M.. Смотрю в доке тут: http://vak.ru/doku.php/proj/bk/bk-a16tech
Там сказано что помимо маски режима 160, есть еще маска 10 для включения ПЗУ бэйсика в неиспользуемые окна, и 4 для отключение регистров по чтению.
А вот если смотреть на исходники вышеупомянутого эмулятора, то маски 10 и 4 не подходят..
У меня прошивка А16М вроде как стартует, но после количества ОЗУ выдает несколько Error. После этого Андос грузится без проблем и Бэйсик запускается. Но вот после выхода в монитор не могу загрузить ни один файл по "М" команде. Короче, не складывается что-то.

Ewgeny7
30.01.2016, 22:11
Да, ну... мало кому это удавалось, большинство так до-сих-пор на макетках...
В чем подвох-то, кроме с/з? :)
Я расписал, что ЦАПов мешок, почему бы не воткнуть?
Или мое мнение не имеет права на существование?


Такое впечатление, что эти коробочки на зарплату где-то выдают... к сожалению, мне пришлось для реверса такой сделать
Да ты не переживай, я уже видел твои стекляшки. Жуть... Денег на коробочку нету? Беда...
Честно говоря, корпус от Д-линка симпатичней, особенно когда он скрывает не заводскую плату.
Поэтому завидуй тише :)


Чем так возможность смены конфигураций не нравится то? Сложно? Просто не всем проще много разных функционально схожих устройств собирать.
Уже описал выше. Очень сложно перешить, офигеть как сложно! У тебя-то получается? :)
И я не планировал вообще-то заставлять весь колхоз паять платы вслед за мной. Я их для себя делал, потому и не выкладывал ничего. А ты сидишь как нищеброд с одной своей u16, тоска зеленая. Даже восьмибитные бординки позабыл уже...



Что за модуль такой?
Тупо ПЗУ на панельке. Проще некуда. Вместо нее на GPIO можно и другие платки фтыкать.

П.С. Жду твоего комментария о правописании слова фтыкать. А то непорядок прям какой-то...

Saar
30.01.2016, 23:40
Эй, вы чего? Хватит ссориться и тему мою засорять.
Лучше бы помогли объяснить кто-нить как этот A16M работает.
ПЗУ у него каким-то хакером написано - сплошной винегрет.

Saar
31.01.2016, 19:24
С А16М сам разобрался, все ошибки пофиксил.

DenSam
31.01.2016, 23:31
С А16М сам разобрался, все ошибки пофиксил.

Ну и? В силу того, что я сам туда еще не лазил - очень хочется результат интеллектуальной атаки увидать. :)

Saar
01.02.2016, 19:41
Дык, на github уже выложил.

- - - Добавлено - - -

А есть ли различия в организации памяти у например А64М и SMK64? Знаю что первый для FDD, а второй для HDD. Интересуют различия именно в управлении ОЗУ/ПЗУ.

gid
01.02.2016, 20:17
А есть ли различия в организации памяти у например А64М и SMK64?
Лучше считать, что нету. По слухам, в А64М была просто выкинута часть, отвечающая за работу с HDD, для удешевления изделия. Хотя вроде как и ни у кого нет вообще живых экземпляров А64М, говорили, что они существовали только на бумаге.

Saar
01.02.2016, 21:17
Смотрю я в эмуляторе код для SMK512. Общие черты с А16М имеются, но вот режим Бэйсика не совпадает. В принципе, на SMK512 тоже можно бэйсик сделать путем копирования его в ДОЗУ. Есть ли для SMK512 родной Бэйсик 0010?
Прикрутить-то SMK512 к БК0010 можно, но вопрос в том - А нужно ли? От БК0010 нужна аутентичность, что подразумевает и его родной Бэйсик, но с поддержкой дисков. В А16М это есть. А для SMK512?
Если просто нужна память, то есть БК0011М. Думаю, эмуляция SMK512 в БК0011 самое то - не надо изобретать новые метод работы с ДОЗУ. Хотя, есть сомнения что имеются проги реально использующие эти 512кб.

gid
02.02.2016, 10:08
В СМК принцип другой. В А16М всего 16Кб доп.ОЗУ, оно и мапится по-разному в разных режимах, а в СМК мапятся сразу страницы по 32Кб по-разному в разных режимах, поэтому в СМК на БК10 бейсик из ПЗУ включается немного извратным способом.
Идея следующая: подключить бейсик в режиме наложения ОЗУ на ПЗУ, но перед этим обнулить все сегменты ОЗУ, которые налагаются на ПЗУ.


mov #120000,R0
mov #20000,R1
mov #6,@#177130
mov #2060,@#177130 ;подключаем страницу 1, сегменты 2..5
1$: clr (R0)+ ;очищаем
sob R1,1$
mov #6,@#177130
mov #2160,@#177130 ;подключаем страницу 1, сегменты 6,7,0,1
mov #120000,R0
mov #10000,R1
2$: clr (R0)+
sob R1,2$ ;очищаем
;копируем монитор БК10 в сегменты 0,1, страницы 1.
mov #10000,R1
3$: mov -40000(R0),(R0)+
sob R1,3$
mov #6,@#177130
mov #2120,@#177130 ;включаем режим 120 (см. таблицу режимов)
mov #10,@#177130 ;подключаем ПЗУ бейсика
jmp @#100000 ;инициализация и запуск бейсика

Использовать можно любую страницу ОЗУ кроме 0, т.к. страница 0, сегмент 7 используется под хранение MBR HDD, какие-то другие сегменты - неким ROM BIOS.
Недостаток один - по адресам 100000..117777 вместо ПЗУ будет ОЗУ, доступное по записи и нужно следить, чтобы проги на бейске его не попортили.

Saar
02.02.2016, 12:01
Я, наверно, сделаю эмуляцию А16М для БК0010, а SMK512 для БК0011М. Ведь помимо включения режима Бэйсика, нужно еще чтобы был перехват обращения к магнитофону. Для А16М уже есть готовое решение в ANDOS.

- - - Добавлено - - -

gid,
в БК0011М нужно вызывать mov #10,@#177130 чтобы подключить страницу ПЗУ в 100000-137777? Или оно автоматом подключается, если в данных адресах отключено ОЗУ SMK?
И еще, не понял я по поводу рестарта в SMK: Там всегда рестарт перехватывается подменой в 177716 или только при долгом нажатии на ресет?

- - - Добавлено - - -

Кстати, разве у SMK в режиме #20 не подключается сегмент ОЗУ в 100000 в режиме "только чтение"? ОЗУ во всех окнах как и у #120, только в другой последовательности.

gid
02.02.2016, 13:05
в БК0011М нужно вызывать mov #10,@#177130
На БК11М эта команда бессмысленна, если не подключает какую-либо страницу.
В АльтПро есть два вида записи в 177130.
1) для переключения режимов работы и/или смены страницы ОЗУ.

mov #6,@#177130 ;взводим триггер приёма режима
mov #MEMCOD+MODE,@#177130 ;задаем режим, MEMCOD - код страницы памяти, MODE - режим работы
mov #0,@#177130 ;чистим мусор в регистре - остановка двигателя, отмена выбора привода и т.п.
2) для включения спец функций
код #10 - только на БК10, отключает блокировку ПЗУ бейсика, т.е. включает доступ к этим ПЗУ
код #4 - запрет доступа к регистрам 177130, 177132 по чтению.
Производится простой записью в регистр 177130 числа в любое время. Биты 2 и 3 - это выбор дисководов 3 и 4, которые в контроллерах АльтПро не используются.
Я совсем забыл. ПЗУ бейсика кончается на адресе 177577, т.е. порты 177130 и 177132 попадают на ПЗУ, поэтому их нужно отключать по чтению. Поэтому в предыдущем примере надо предпоследнюю команду записывать так

mov #14,@#177130 ;подключаем ПЗУ бейсика

У вас есть схема контроллера СМК (http://pdp-11.ru/mybk/Altpro/Altpro_SMK-64.zip) и файл "СМК. Режимы работы и распределение памяти..pdf (http://pdp-11.ru/mybk/Altpro/SMK64_replika_Voland/SMK.REzhimi_raboty_i_raspredelenie_pamati.pdf)"? В нём всё подробно расписано насчёт режимов, а глядя на схему становится ясно как он вообще работает.
ПЗУ в 100000-137777 на БК11М - это ведь страницы 010..013 в Окне1. Знаете как СМК отключает ОЗУ-ПЗУ в Окне1? Он просто подаёт 0 на ногу А22 разъёма МПИ. Это то же самое, что подключить страницу ПЗУ №013 через регистр 177716.

В СМК нет понятия длинный ресет. Я уже не помню почему, но подозреваю, что это как-то конфликтует с HDD. Адрес старта перехватывается всегда.

разве у SMK в режиме #20 не подключается сегмент ОЗУ в 100000 в режиме "только чтение"?
Нет, так делается в режиме #100. Вообще режим #100 был бы более подходящ для бейсика на БК10. но там в диапазоне 177600-177777 все ячейки подключаемого туда ОЗУ имеют доступ только по записи. Что не аутентично для чистой БК10.
А в режиме #20, наоборот, в диапазоне 177600-177777 все ячейки подключаемого туда ОЗУ имеют доступ только по чтению, что опять же не как на чистой БК10.

Saar
02.02.2016, 17:02
gid,
Altpro_SMK-64.zip есть, а вот той PDFки нет. К сожалению, тот сайт выдает мне "403 forbidden". Не могли бы вы куда-то в другое место их залить? Или прям сюда приаттачить.


Он просто подаёт 0 на ногу А22 разъёма МПИ. Это то же самое, что подключить страницу ПЗУ №013 через регистр 177716.
То есть SMK не будет работать, если имеется ПЗУ в странице 13?

Я режимы работы А16М и SMK512 изучаю по эмулятору http://gid.pdp-11.ru/
В А16М очень помог встроенный режим теста при запуске. Я отловил им все неправильные у меня режимы.
Жаль у SMK512 нет такого теста.
Есть ли загружаемые теста для SMK512? желательно ввиде готового образа дискеты.

- - - Добавлено - - -

Скачал PDF через Wayback Machine (очень выручает порой).
Вот, спасибо за PDF - теперь картина памяти понятна!

режимы #10 и #4 у меня уже реализованы в А16М. Тоже пришлось повозиться с этим ребусом пару дней назад. Нигде почему-то нет уточнения что эти биты заносятся без триггера #6.

- - - Добавлено - - -


Знаете как СМК отключает ОЗУ-ПЗУ в Окне1? Он просто подаёт 0 на ногу А22 разъёма МПИ. Это то же самое, что подключить страницу ПЗУ №013 через регистр 177716.
вопрос в том - как контролируется A22? Это происходит автоматически в зависимости от режима или нужно производить какие-то дополнительные действия как в случае с Бэйсиком 0010?

- - - Добавлено - - -


В СМК нет понятия длинный ресет.
вы хотели сказать, что каждый ресет на СМК - длинный(холодный запуск)? То есть при нажатии на ресет в 177716 всегда подменяется адрес запуска?

gid
02.02.2016, 21:29
выдает мне "403 forbidden"
Это потому что реферрер не совпадает с урлом, нужно либо довнлоад менеджером качать, либо тупо зайти туда http://pdp-11.ru/mybk/Altpro/SMK64_replika_Voland/ и вручную ткнуться в файл, тем более, если пошариться по сайту, можно найти много чего полезного.

То есть SMK не будет работать, если имеется ПЗУ в странице 13?
Да. Поскольку эта страница предполагает наличия внешнего подключаемого ПЗУ в неких мифических устройствах, о которых никто не знает, которые втыкаются в разъём МПИ, а разветвителей МПИ в те времена не предполагалось, поэтому простой рядовой пользователь в МПИ мог воткнуть только одно устройство. Либо СМК, либо ничего.

Я режимы работы А16М и SMK512 изучаю по эмулятору
Зря. Эмулятор довольно упрощенно моделирует эти устройства. Я там местами в комментариях это отмечал. Не все возможные реальные ситуации моделируются.

Есть ли загружаемые теста для SMK512?
Да, на сайте эмулятора, на странице тестов АльтПро, в самом низу ссылка на образ с тестами.

Нигде почему-то нет уточнения что эти биты заносятся без триггера #6.
Мгм. Я это хоть и знаю, но и меня периодически переклинивает и я начинаю путать их с кодами переключения режимов. А уточнение, довольно невнятное, я где-то видел. Вроде бы в описании А16М.

вопрос в том - как контролируется A22?
Можно посмотреть на схеме БК11М, это выход триггера D36 - бит 4 регистра памяти 177716. В контроллерах АльтПро много где соединяется выход микрухи с выходом, и кто кого переможет током.

каждый ресет на СМК - длинный
лучше считать, что длинный ресет - эксклюзивная фича А16М, а вообще все ресеты - обычные, так проще жить.

при нажатии на ресет в 177716 всегда подменяется адрес запуска
Да. Абсолютно. Пока СМК подключен к БК, при ресете адрес запуска берётся из ПЗУ СМК.

Saar
03.02.2016, 01:36
Я там местами в комментариях это отмечал. Не все возможные реальные ситуации моделируются.
Если имется ввиду возможность подключить ПЗУ бэйсика в любой момент с наложениями данных на ОЗУ, то не большая потеря. К тому же это имеет мало практического смысла. Так же это довольно сложно реализовать в моем эмуляторе, потому что и ПЗУ и ОЗУ находятся "физически" в одном чипе SDRAM. Поэтому, чтобы сделать такое наложение нужно прочитать два раза, а это сильно усложнит алгоритм (и не факт, что хватит быстродействия текущей модели памяти).
Проще выяснить в каких именно режимах нужно наложение ПЗУ, и просто считать его приоритетным если подключено.
Если еще есть какие-то замечания по эмуляции A16M/SMK512 в том эмуляторе, то расскажите - я это учту в своем эмуляторе.

- - - Добавлено - - -

Еще по поводу пульта в SMK512:
Я так понимаю, для этого нужно загрузить какой-то диспетчер в ОЗУ SMK? Ибо в этом режиме только ОЗУ и подключено.
Контроллер имеет регистры 0177676 и 0177674?

gid
03.02.2016, 09:52
Контроллер имеет регистры 0177676 и 0177674?
Это не регистры, это просто область памяти, доступная по записи. И желательно, но не обязательно по чтению.
При выполнении команды HALT PSW сохраняется по адресу 0177676, а PC - по адресу 0177674, потом происходит переход на адрес 0160002, а уж что там находится - зависит от пользователя. Ничего нормального, общераспространённого написано не было, поэтому кроме уже упоминавшейся ОС A/WASP, использующей возможности СМК я не знаю.

Saar
03.02.2016, 18:10
Это не регистры, это просто область памяти
Это монопенисуально, если честно. Эти две ячейки можно реализовать триггерами-защелками - и будут регистрами.
Я знаю как включается пульт. Кстати, помимо этих двух регистров, должно быть реализовано еще автоматическое переключение режима SMK в HALT по BIS #10, @#177716. Видимо, это реализовано, раз называется Halt11.
Вопрос был именно в том, где найти софт, который бы мог работать в Halt режиме.
Вроде, на форуме bk0010 встречал ссылку на исходник ПЗУ для Halt в ВМ1. Но вчера попытался найти - не смог :(

Patron
03.02.2016, 20:55
Вопрос был именно в том, где найти софт, который бы мог работать в Halt режиме.Любопытной особенностью режима HALT процессора ВМ1 является то, что этот режим устанавливается процессором не при возникновении HALT_TRAP, а только в том случае, если новое значение PSW, загружаемое из фиксированного смещения [ 0160000 + ROM_Vector_Offset + 2 ] содержит установленный BIT_10.

А поскольку ответственность за нахождение этого бита по фиксированному смещению лежит целиком на ПЗУ-софте, то получается, что в HALT-моде ВМ1 может работать любой софт, который сам этого хочет ( и поэтому имеет по фиксированному смещению установленный бит включения режима HALT ).

Если бита включения режима HALT по фиксированному смещению в ПЗУ нет - после выполнения HALT_TRAP процессор 1801ВМ1 останется в обычном программном режиме.

Saar
03.02.2016, 21:15
Patron,
Разъясните чем отличаются HALT и обычный режим пи переходе по HALT_TRAP . Я читал про это на bk0010, но там это было в процессе выяснения без четких финальных выводов и кучи оффтопа.
Вроде как в HALT режиме все прерывания запрещены и их нельзя включить ни по какой команде, включая RTI/RTT/MTPS. Так?

Patron
03.02.2016, 21:27
Вроде как в HALT режиме все прерывания запрещены и их нельзя включить ни по какой командеПри установленном бите 10 в PSW ( который можно установить или очистить вручную - командами START и STEP ) есть только два отличия в работе процессора от обычного программного режима:

1. Запрещены все внешние прерывания, включая IRQ1 ( HALT ).

2. Прерывание зависания ( BUS ERROR ) отрабатывается не как TrapTo_4, а как HALT_TrapTo_160002.

Saar
14.03.2016, 01:12
Подскажите кто-нибудь по клавиатуре.

Я знаю что регистрируется только одна нажатая кнопка. Но что произойдет в таком случае: нажать кнопку 1; не отпуская ее, нажать кнопку 2; удерживая кнопку 2, отпустить кнопку 1. Будет ли отработано нажатие кнопки 2 после отпускания кнопки 1?
Интересует оба признака нажатия 1) генерация прерывания 2) детекция нажатия в пассивном режиме посредством опроса регистров клавы.

- - - Добавлено - - -

Кстати, мой эмулятор находится тут:
https://github.com/sorgelig/BK0011M
если кому интересно.

Есть ли какая рабочая прошивка пульта, которую можно запустить на БК0011М/БК0010?

Patron
14.03.2016, 02:01
Есть ли какая рабочая прошивка пульта, которую можно запустить на БК0011М/БК0010?Есть такой вариант:

Пультовой режим для БК (http://forum.maxiol.com/index.php?showtopic=4113).

Saar
14.03.2016, 02:58
Patron,
я так понял, пультовой режим в том ПЗУ не имеет локальной консоли и требует UART.

Patron,
А по клавиатуре не подскажите?

Saar
15.03.2016, 01:14
Еще возник вопрос по поводу переключения отображаемой видео страницы. Возможно ли переключение в пределах одной строки или фиксация отображаемого буфера происходит только в начале строки?

gid
15.03.2016, 16:31
По клавиатуре:
Если нажали кнопку 1, ВП1-014 зафиксировал факт нажатия, и перешёл в режим ожидания отжатия, теперь что бы вы не нажимали из цифро-буквенных клавиш, последующие нажатия игнорируются, после того, как будут отжаты все клавиши, ВП1-014 зафиксирует факт отжатия и:
а) если предыдущий скан код был считан, зафиксирует в регистре клавиатуры скан-код первой нажатой кнопки;
б) если предыдущий скан код был считан, и если прерывания разрешены, выдаст запрос на векторное прерывание.
иначе - всё проигнорирует, т.е. с программной точки зрения ничего не произойдёт.

Я же вроде давал вам верилог-модель ВП1-014. У неё такая схемотехническая особенность - фактом отжатия считается "ни одна нажатая клавиша", т.е. на всех входах X высокий уровень.

2) детекция нажатия в пассивном режиме посредством опроса регистров клавы.
Когда прерывания запрещены, есть два метода.
1) Путём опроса бита готовности регистра клавиатуры, при этом не получается автоповтор, поскольку бит готовности появится снова только при отжатии и следующем нажатии клавиши


1$: tstb @#177660
bpl 1$
movb @#177662,r0

2) Путём опроса бита 6 регистра 177716, там фиксируется факт нажатия клавиши, пока что-то нажато - бит 6 == 0, когда ничего не нажато, бит 6 ==1, так что тут возможен автоповтор


1$: bit #100,@#177716
bne 1$
movb @#177662,r0



Возможно ли переключение в пределах одной строки или фиксация отображаемого буфера происходит только в начале строки?
Я тут не уверен, мне и самому интересно, как оно на самом деле, но думаю, что теоретически должно быть возможно.
Счётчик D28 по схеме БК11 в принципе повторяет функцию счётчика PC по тексту верилога ВП1-037, и они синхронизируются между собой сигналом WTI. По схеме БК11 получается, что сигнал с регистра буфера экрана начинает влиять на генерацию адреса экрана через 4 такта (6МГц) следующие 4 такта после импульса WTI, т.е. каждый цикл работы с экраном. А менять значение регистра буфера экрана можно в любое время.

Saar
16.03.2016, 15:37
Я же вроде давал вам верилог-модель ВП1-014
Хмм.. Не помню такого. вы перевели 014 в читабельный формат? Выложите ее тут, пожалуйста, если так.
Я пока остановился на версии когда нажатие следующей кнопки отменяет нажатие предыдущей. Да, это не так как в БК, но зато играть удобнее ;)

С 037 не все так гладко. Есть версия что при переделке vp_037.v в va_037.v закралась ошибка в формировании RPLY сигнала. По крайней мере они работают по-разному у меня в проекте. Но обе, кстати, работают иначе(этот момент надо перепроверить на реальной БК) чем в реальной БК. Речь идет про так называемые тайминги contendent memory.

- - - Добавлено - - -


Когда прерывания запрещены, есть два метода.
Как опрашивать клаву я знаю :) У меня просто нет реальной БК чтобы уточнить поведение. Но вы полностью ответили о поведении 014. Хотелось бы увидеть читабельную версию 014 в верилоге. Модель от Vslav у меня есть - она сгенерированная и не читабельная.

gid
16.03.2016, 16:33
вы перевели 014 в читабельный формат?
Да, вот тут и было дело http://zx-pk.ru/showthread.php?t=26080&p=854057&viewfull=1#post854057

Есть версия что при переделке vp_037.v в va_037.v закралась ошибка в формировании RPLY сигнала.
Да, и Vslav в курсе был, даже планировал когда-нибудь исправить. По моим наблюдениям, RPLY на полтакта раньше выдаётся в va_037.v, из-за чего модель в общем работала быстрее, чем vp_037.v

- - - Добавлено - - -

У меня кстати есть предположение, как поправить дело.
В оригинале в данном alwaysе


always @(*) if (RASEL) TRPLY = 1'b1; else if (PIN_nDIN & PIN_nDOUT) TRPLY = 1'b0;

вместо RASEL используется сигнал VASEL = ~(~RASEL), проходящий через 2 инвертора, вносящих задержку 4 (не знаю чего, то ли наносек., то ли ещё чего-то) каждый.
Поэтому можно попробовать переписать это так:


reg VASEL;
always @(*){
VASEL <= RASEL;
if (VASEL) TRPLY = 1'b1; else if (PIN_nDIN & PIN_nDOUT) TRPLY = 1'b0;
}

Но скорее всего не всё так просто.

Saar
16.03.2016, 20:36
Да, вот тут и было дело
видимо в запарке я потерял тот пост :)


VASEL <= RASEL;
думаю так не исправить дело. В комбинаторной логике врядли квартус что-то путное из этого синтезирует.
Там еще, кстати AMUXSEL сигнал в va версии сокращен. А он тоже через триггеры проходит и вносит задержку.

- - - Добавлено - - -

вот как различаются тайминги va и vp на тесте с первой картинки.
56476564735647456475
1) прога 2) vp_037_1 3) vp_037_2 4) va_037

Причем vp обеспечивает более быструю работу, если судить по картинкам. Еще vp выдает иногда другую картинку. Думаю, что ВП1-037 имеет разные тайминги в момент вывода информационной части и пустого места (гашение, развертка) - поэтому я получаю разные картинки. VA модель всегда одну картинку выдает.

подключал модели в таком виде:


wire nrply;
wire vp037_ack = ~nrply;
wire [15:0] nAD = bus_sync ? 16'o177777 : 16'hZZZZ;

vp_037 vp_037
(
.PIN_CLK(clk_037),
.PIN_R(0),
.PIN_C(0),

.PIN_nAD(nAD),
.PIN_nSYNC(~bus_sync),
.PIN_nDIN(1),
.PIN_nDOUT(~(legacy_ram & valid & bus_stb)),
.PIN_nWTBT(0),
.PIN_nRPLY(nrply)
);


CPU у меня QBUS версии, но немного с переделанными сигналами - а-ля WB: все сигналы позитивные. bus_stb = dout | din;

- - - Добавлено - - -

а вот тот же тест на реале.
56477

Я, честно не подгадывал тест, но получилось вот так красиво :)

- - - Добавлено - - -

немного рассуждений на тему: а вдруг у меня что-то не так помимо vp037.
сигнал bus_sync и bus_stb (см выше) идут напрямую из vm1_qbus - тут какие-то задержки с моей стороны исключены.
legacy_ram и valid формируются на момент перехода bus_sync в активное состояние и держатся на протяжении всего действия bus_sync.
Получается что в этой связке задействованы тайминги только vm1_qbus и vp_037.
Вчера c Vslav выяснили разрешение у vp037 - 384х320, что соответсвует тому что у меня. Может быть общий сдвиг изображения, но не его искажение.
В общем, я не вижу где бы я мог ошибиться. Всё сходится на проблемы в модели vp_037.

- - - Добавлено - - -

Кстати, хорошо бы если кто-то на другой БК0011М попробовал мой тест.
БК, на которой это тестировалось, чудом выжила среди остальных, над которыми поработали охотники за драгметаллами. Со слов владельца, на этой БК всё же успели выкусить некоторые конденсаторы. К сожалению, я не знаю что там повыкусывали. Не думаю, что при общей рабочести этой БК, это могло отразиться на ее скорости работы.

Saar
17.03.2016, 05:32
упростил схему 037, оставив только то, что имеет отношение к RPLY:
56485

- - - Добавлено - - -

есть подозрение что в схеме 037 элементы K14, K29, K21 должны инверсны относительно того что есть. По крайне мере в va модели именно так.

- - - Добавлено - - -

в БК0011М есть задержка сигнала DOUT сделанная на R13 C8.
Кто-нибудь может на реальной БК посмотреть на сколько задержан срез сигнала на 6 ноге D7 относительно 3 ноги D1?

- - - Добавлено - - -

рискну предположить, что я решил проблему.
Недостающая задержка нашлась как раз в этой цепочке R13 C8. Там по схеме у БК0011М 1К и 300пф(180пф у БК0010). По прикидкам у меня вышло около 2 тактов частоты CPU. В реальности получилось что надо на 3 такта задерживать DOUT чтобы мой тест совпал с картинкой на реальной БК0011М.

Прогнал так называемые реальные тесты-демки: Shock2 (мультиколорная часть), Lyra II (с танцующей девушкой), Insult(часть 19) - везде 100% попадание в развертку.
Если кто-то знает еще подобные проги, где точное попадание в развертку важно - готов проверить.

Весь этот разбор по тактам начался как раз из-за этих демок. В Shock2 я добился чтобы было правильно, а в Insult были лесенки. Если Insult выравнять, то в Shock получалось криво.
Теперь везде правильно отображается.

По поводу va_037 модели - получается, что она правильная. Я написал verilog со схемы что выше выложил - результат получился идентичный va_037 (код verilog несколько отличается, но не принципиально).
Почему vp_037 выдает другую картинку? Возможно потому что она не подходит для синтеза. Там много временных задержек, которые не синтезируются, а лишь моделируются в тестах для modelsim.

- - - Добавлено - - -

кстати, в перечне элементов для БК0011М написана какая-то ремарка у C8, но разобрать совершенно невозможно. Интересно было бы узнать что там написано. В инете скан этого листа, похоже с одного и того же ресурса - везде идентичные копии неразборчивого текста.

gid
17.03.2016, 09:38
ремарка у C8
Там написано "Доп. замена на КМ-6а-М47 - 300пФ±20%" Ничего интересного. У меня есть бумажная ксерокопия оригинального листа, там если напрячься, прочитать можно. Сканы в высоком разрешении выложены у меня на сайте эмулятора.

Я кстати предполагал, что надо было бы уточнить времянки DIN DOUT модели ВМ1, вдруг они тоже не совпадают с настоящим ВМ1, потому что, помню, что они у моделей QSync и ASync вроде бы незначительно различались. Для ДВК и других изделий это непринципиально, а для БК весьма важно.

А ещё, насколько оправданно совмещение моделей ВП1-037 и ВП1-014 в один модуль с точки зрения синтеза? Моя экспериментальная модель на С++ от этого значительно выиграла.

Saar
17.03.2016, 10:35
Я кстати предполагал, что надо было бы уточнить времянки DIN DOUT модели ВМ1, вдруг они тоже не совпадают с настоящим ВМ1, потому что, помню, что они у моделей QSync и ASync вроде бы незначительно различались. Для ДВК и других изделий это непринципиально, а для БК весьма важно.
хм.. Я как-то принял за аксиому, что модель QSync совпадает с оригиналом. Но, как мне показалось, что задержка DOUT на 3 такта решила проблему. Вот бы еще на реальной БК0011М посмотреть какая там задержка. Я считал по общей формуле T=R*C. Понятно, что это очень сильное упрощение, но пока другого варианта не нашел. Есть друг с БК и осциллографом, но не знаю когда он сможет посмотреть.


А ещё, насколько оправданно совмещение моделей ВП1-037 и ВП1-014 в один модуль с точки зрения синтеза?
Никак не оправдывается. Между ними ничего общего нет. Один сигнал лишь пробросить между ними - не вижу оптимизации в этом.
Я от 037 только формирование RPLY взял. Остальное написал по-своему, более понятно и удобно.


Моя экспериментальная модель на С++ от этого значительно выиграла.
В чем именно выиграла?

b_10101101
17.03.2016, 23:06
Возможно ли переключение в пределах одной строки или фиксация отображаемого буфера происходит только в начале строки?

Я тут не уверен, мне и самому интересно, как оно на самом деле, но думаю, что теоретически должно быть возможно.
Счётчик D28 по схеме БК11 в принципе повторяет функцию счётчика PC по тексту верилога ВП1-037, и они синхронизируются между собой сигналом WTI. По схеме БК11 получается, что сигнал с регистра буфера экрана начинает влиять на генерацию адреса экрана через 4 такта (6МГц) следующие 4 такта после импульса WTI, т.е. каждый цикл работы с экраном. А менять значение регистра буфера экрана можно в любое время.
Было время когда делалось так: видеостраница 5 окрашивалась предварительно в белый, видеостраница 6 была черной. Для оценки быстродействия выполнения какой-либо подпрограммы (в пределах одного тика системного таймера IRQ2 или 20 мс.) :
Настраиваем обработчик прерывания таймера:
1) при каждом вызове включать в окно отображения 5-ю страницу
2) делаем свои вычисления, например идущие подряд n команд ХХХ
3) включить в окно отображения 6-ю страницу
Включить системный таймер.
Далее можно было наблюдать частичное закрашивание белым цветом части экрана. Т.е. при наблюдении закрашивания 50% экрана делаем вывод о времени выполнения 10 мс. Делим время выполнения на количество команд n и вычисляем время исполнения одной команды ХХХ. Сбоку наносились штрихи для точного вычисления времени. Насколько помню полоски закрашивались не кратно длине строки, хотя могу ошибаться

Saar
18.03.2016, 08:31
b_10101101,
Ну если посмотрите чуть выше мои посты и картинку с программой, то увидите что именно так мой тест и делает: переключает 5 и 6 страницы. Учитывая то, что на реальной БК в результате получается прямоугольник, то логично сделать вывод что переключение буферов в пределах строки возможно. Вопрос об этом у меня возник до того как тест попробовали на реальной БК.

Кстати, судя по коду реверса 037 я с удивлением обнаружил что режим расширенной памяти (отображение 1/4 экрана) тоже можно переключать в любой момент времени (в отличие от рулонного сдвига, который фиксируется за 40 строк до начала отображения).

Saar
20.03.2016, 00:42
Возник еще один вопрос по клаве.
Что произойдет если нажать и ОТПУСТИТЬ кнопку, а программа ПОТОМ проверит состояние клавиатуры? Прерывания, от клавы запрещены и клавиатура никак не опрашивалась на момент нажатия. Опрос происходит уже потом, скажем через пару секунд после отпускания кнопки.
Что будет с флагами готовности в 177660 и кодом в 177662 на момент опроса?

Saar
21.03.2016, 07:19
Куку. Есть ли кто живой?
Еще вопрос по выводу звука: Нужно ли инвертировать состояние бит 6,5 и 2 у 177716 при выводе звука? Судя по схеме вроде нужно.

gid
21.03.2016, 11:48
Что произойдет если нажать и ОТПУСТИТЬ кнопку, а программа ПОТОМ проверит состояние клавиатуры?
Если вопрос ещё актуален, то ничего необычного не произойдёт. Всё будет функционировать по асинхронной схеме.
В регистре 177660 установится флаг готовности, в регистре 177662 - сканкод. И ничего не будет изменяться до момента чтения регистра 177662. Флаг готовности снимается самим фактом доступа по чтению 177662 (комбинация SYNC & DIN). А сканкод вообще никуда не исчезает, так и хранится, пока не заменится новым.

Нужно ли инвертировать состояние бит 6,5 и 2 у 177716 при выводе звука? Судя по схеме вроде нужно.
По схеме инвертируется потому что лог.1 - низкий уровень, а лог.0 - высокий, а там конденсатор, и чтобы формировать меандр, нужно чтобы лог.1 соответствовало +5В (грубо говоря). А если вы используете прямую логику от WB, то инвертировать ничего и не нужно. Хотя, если очень хочется, то можно, если при нулях в битах на выходе будет постоянно высокий уровень, аналоговая техника переживёт (за исключением некоторых сверхдешёвых китайских изделий), просто будет бумкать динамиками при подключении/отключении.

Saar
21.03.2016, 17:10
А если вы используете прямую логику от WB, то инвертировать ничего и не нужно.
Разве не наоборот при прямой логике надо инвертировать. Так же как я инвертирую на AY8910. Вот если бы была инверсная логика, то не надо.
По схеме с процессора эти сигналы проходят АП2 и ТМ9. У обоих прямые выходы. Получается что только в процессоре инверсия, которую и нужно сделать если я использую модуль процессора без инверсии.
Или я что-то упускаю?


Хотя, если очень хочется, то можно
если бы был 1 бит, то было бы всё равно. А тут 3 бита соединенных в ЦАП. Если неправильно вывести, то будет неправильно звучать.
Кстати, а есть ли какие проги, использующие этот 3-битный ЦАП?
В БК0010 получается что только 6 и 5 биты. А в БК0011 еще бит 2 добавляется.


просто будет бумкать динамиками при подключении/отключении
угу. Вот когда не инвертировал, то бумкал.
Сейчас поставил инверсию - не бумкает.

Saar
22.03.2016, 18:49
решил поизголяться с клавой :)
Сделал буфер с трэкингом 5ти нажатий. Теперь, если держать какую-то кнопку нажатой и одновременно нажать еще одну, то фокус сменится на новую кнопку. При ее отпускании фокус переключается обратно на предыдущую кнопку если она еще удерживается. И так до 5 вложений. Может 5 - это много, но принципиально реализация не меняется.
В общем, получилась некая эмуляция нескольких нажатий. Можно, например, бежать и параллельно жмакать на "огонь" (ну или прыгать).
В Captain Comic так вообще полный аналог джойстика получился.

xolod
03.05.2019, 03:10
А как конвертировать .HDI образ диска в .VHD ?
Как я понял у HDI первые 512 байт системный заголовок с byte swap а дальше сам образ но инвертированный.

gid
06.05.2019, 10:03
Кстати, а есть ли какие проги, использующие этот 3-битный ЦАП?
Нету. Это наверное вообще никем и никак не использовалось. Даже на БК-0010 двухбитный ЦАП редко использовался в биперной музыке. Потому что оказывается были разные схемы БК-0010, на одних на пищалку выводился только бит 6, а на других - оба бита, 6-й и 5-й и при использовании двухбитного ЦАПа музыка на пищалке звучала у разных людей по-разному. Одинаково было только если подключить магнитофон. Но видимо постоянно подключенный магнитофон к БКшке не было распространённым явлением. Поэтому обходились только одним 6-м битом, хоть в Клавесине, хоть в Маестро.

Как я понял у HDI первые 512 байт системный заголовок с byte swap
Нет, не byte swap. Первые 512 байт - это массив, который выдаётся по АТА команде IDENTIFY DEVICE (ECh). А почему там в текстовых строках байты переставлены, я не знаю, традиция наверное была такая.
Всё остальное после 512 байтов - это обычный посекторный дамп hdd.

А как конвертировать .HDI образ диска в .VHD ?
Нужно отрезать первые 512 байтов, получится *.img, а уже его можно сконвертировать в любой понравившийся формат.

Manwe
16.05.2020, 18:26
Saar, было бы круто добавить поддержку Covox!

Что касается точного времени исполнения команд, то я составил таблицу: https://zx-pk.ru/threads/25778-otechestvennye-kompyutery-bystrodejstvie.html?p=1057890&viewfull=1#post1057890 Буду её постепенно дополнять.

Saar
17.05.2020, 16:43
Да надо, наверное.
Будет время - добавлю.
Есть ссылка на схему и список программ поддерживающие это?

Manwe
23.05.2020, 13:21
Да надо, наверное.
Будет время - добавлю.
Есть ссылка на схему и список программ поддерживающие это?архив с БКшными программами под Covox: https://www.pouet.net/prod.php?which=82746
Схема простая: младший байт порта 177714 выводит 8-битный PCM-звук без всяких хитростей. Что записано в порт, то и шлётся на ЦАП (до тех пор пока значение в порту не изменится).
Это моно-Covox. Есть ещё вариант стерео: младший байт выводится в левое ухо, старший байт – в правое.