Мда.. попробовал на bk0010.org написать.. Как в дерьмо вляпался. Там, любой аноним непонятно откуда может писать всякую фигню.
Ну его нафиг. Мало того что там дизайн - вырви глаз, там и содержание соответствующее.
MVV,
У вас нет желания сделать плату на основе Cyclone V SX/ST (та версия что с ARM)? Ну очень хочется поиметь такую платку.
Я пока жду JTAG для своего Zynq7020. Чип интересный, но софт у Xilinx просто ппц какой неудобный и неочевидный. Хочется то же, но на Altera. Я уже так привык к Квартусу. Я считаю что за гибридными чипами будущее. Да и вообще, очень интересное решение буквально на одном чипе. По сути ваш ReVerSE-U16 на Cyclone V SX в корне меняет ситуацию.
Вопрос ко всем: Не могу найти точную инфу по работе ВП1-014. Интересует вот что: если было запрещено прерывание (по MTPS) и после нажатия кнопки программа прочитает из 177662 а потом разрешит прерывание, наступит прерывание от клавиатуры или нет? Мне кажется что в этом кроется глюк клавы.
P.S: Пофиксил наконец-таки прерывание от клавы!
Последний раз редактировалось Saar; 27.01.2016 в 22:18.
Так в чем помощь конкретно сейчас требуется? В прогонке проекта на MiST'е? Я пока его не купил, но собирался. То, что проект выложен на github - это огромный плюс. Вот, что не хватает, так это подробного описания, как это потом загружать, как отлаживать, какой инструментарий использовать и.т.д. Беды многих открытых проектов. Надо понимать, что людей с мозгами и желанием полно, а вот набор скиллов у всех разный. Иногда надо помочь и первые детские шажки сделать.
Желательно, конечно иметь плату MiST. Если у вас она появится - это будет великолепно! Буду тогда не одинок Но и владельцы других плат приветствуются - только понадобится опыт чтобы портировать.
Я обновил репозиторий. Там теперь есть бинарник чтобы можно было запустить без компиляций.
Если хотите присоединиться к разработке, то тоже ничего сложного. Для Altera Cyclone III всего одна среда разработки - Quartus II 2013. Так что не заблудитесь
В общем-то я сам на FPGA программирую чуть больше пары месяцев. Более-менее освоился уже.
Из помощи нужно в первую очередь проверить тонкости в реализации. То есть запустить в эмуляторе разные самописные куски для проверки, например, клавиатуры в разных режимах, проверить насколько разнится скорость выполнения с реальной БК. Всякие там прерывания и т.д. В общем, нужно иметь под боком реальную БК0011М и знания в ее железе и программировании.
Но и помощь в развитии самого проекта тоже приветствуется. Кое что еще не реализовано. Например, загрузка отдельных файлов. Можно даже сделать загрузку через магнитофонный вход. Сделать полноценный режим БК0010 (потому, нужна загрузка отдельных файлов, и надо придумать формат или взять какой-то уже известный). Я не совсем знаком с поздними разработками для БК0010. Там вроде тоже были КНГМД. Просто я как-то быстро перешел на БК0011М и все разработки делал на ней.
- - - Добавлено - - -
Еще не пойму почему при загрузке игр для БК0010 в CSIDOS включается 17 палитра вместо 0. То ли у меня имидж винта остался от моей доработки БК0011М с 16 цветами. То ли это глюк моего эмулятора.
Но мне интересна еще идея переключения в БК0010 с отключением всего что добавили в БК0011М. В общем идей достаточно, но в одиночку я могу просто остановиться на каком-то моменте, если не будет команды.
Последний раз редактировалось Saar; 28.01.2016 в 01:44.
Смогу прояснить некоторые вопросы, но небыстро (работа, семья) и не очень скоро (сейчас вообще не дома) - под рукой живой БК-шки нет и нет моих талмудов дизасма ее монитора (хотя это решаемо). В общем не ранее, чем через неделю смогу выдать что-то полезное.
- БК-0011М, БК-0011М-01, БК-0010-01
- Электроника-85, УКНЦ, ДВК
- ЕС-1841, ЕС-1845, Искра-1030М, Искра-1031, Поиск, МС1502
- Корвет, Радио-86РК-SRAM, Львов ПК-01, Вектор-06Ц, Апогей БК01Ц
- Агат-7, Агат-9
- Leningrad 2012, ZX Evo rev.C + NeoGS, Дельта, ZX Spectrum 48K original
- Yamaha YIS 503III, Atari 65XE, Amiga 1200, SparcStation 10
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Если вопрос всё ещё актуален, то ответ: нет не наступит. При чтении регистра 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 //______________________________________________________________________________ //[свернуть]
gid,
Ну почему же. У вас очень даже человеческий Verilog получился.
С клавой я уже разобрался. Именно этот момент я не учитывал - поэтому и печатался символ при удержании клавиши при старте.
Как вы думаете, ваша переделанная модель работает идентично оригинальной ВП1-014 в части определения нажатия нескольких клавиш?
Там вроде команду RESET надо было подавать перед опросом.
Saar, формально говоря, моя переделанная модель есть прямой функциональный аналог модели, полученной в результате реверсинга чипа. Если Vslav нигде не ошибся, а я уверен, что нет, то модель и должна работать почти так, как оригинальный ВП1-014. Я же писал, что переделал без учёта времянок, главное было, чтобы вывод тестбенча в модельсиме примерно совпадал с оригинальной асинхронной сгенерированной моделью. Поскольку это совершенно не моя область деятельности, я не предполагал практического использования модели и даже не знаю, будет ли она работать правильно. Или возникнут какие-либо казусы, связанные с рассихроном времянок. Модель-то нифига не синхронная.
Когда на БК впервые заговорили об обработке одновременного нажатия нескольких клавиш, я, почитав, в чём там суть, для себя сразу отказался от этого метода. Поскольку складывание по OR сканкодов нескольких нажатых клавиш даёт слишком мало простора для деятельности.
Ну да, не все варианты кнопок можно так опросить, но в те времена это уже было достижением и новым функционалом.
Я даже прикидывал на клаве, вполне рабочие варианты можно было найти. Там же на надо одновременное нажатие вверх и вниз, или влево и вправо. А надо вверх, например и вправо. Ну или вправо + стрелять. Всё равно это был бесплатный метод.
А заговорил про это я, поскольку хочется сделать функционал как можно ближе.
От ВП1-014 синхронности, в общем-то и не надо. Она же вообще - комбинаторная логика без клока.
Вот такой еще вопрос, теперь по БК0010: При записи в 177662 происходит прерывание по 4 вектору или нет?
- - - Добавлено - - -
Еще вопрос по БК0011М:
Заметил интересную особенность старта. Если в страницах ПЗУ 12 и 13 что-то есть, то бэйсик не стартует. Поидее, признак запускаемого ПЗУ это команда NOP в первом адресе. А тут, монитор почему-то пытается запустить ПЗУ из 12 и 13 страниц без этого признака.
Даже если принудительно выставить 11;1C и запустить 100000G, бэйсик не запустится.
Просто хотел отладчик положить в 12 страницу, но запускать его только вручную когда нужно.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)