ПЗУ для z80 на ардуинке
- Войдите на сайт для отправки комментариев
Сб, 21/08/2021 - 10:06
Добрый день.
Хочу восполнить пробел в образовании и потрогать z80 за пины. Нашел описания, проекты учебных простых вычислительных устройств. Но там нужно программатор ПЗУ для программы инициализации. Есть упоминания эмуляции такого ПЗУ на Ардуино. Я хочу разобраться, с двумя вещами: подключить старую simm планку как ОЗУ и на ардуино сделать устройство, которое по кнопке загружает код с нулевого адреса в ОЗУ.
Получается, я тупенький - не смог разобраться. Вроде должно быть просто, но прояснения не происходит! Растолкуйте, плизз!
Как я понял, по кнопке ардуинка должна выставить ресет и запрос шины. Потом ждать пока проц разрешит (как?) А вставить адрес и данные и дёрнуть Запись. И так много раз. Потом снять запрос шины и ресет. Но подробности ещё в тумане
А просто 27С512 не судьба поставить + Тошибовское статическое ОЗУ без регенерации?
Да и сам Z80 в CMOS версии можно за полтинник купить, набери на Али Z84C0020
Ну и книшку какую по Z80 почитай, их на русском полнО.
В любой момент ты можешь перевести проц в состояние ожидания, подав 0 на вход /WAIT или вообще отлучить его от шины, подав опять же 0 на вход /BUSRQ, тогда он отключится совсем от шин адреса и данных и пришлёт тебе ответ /BUSAK. И вот когда ты получил этот ответ, ты можешь срать ардуиной в адресную шину и данных (например, писАть в ОЗУ или ROM чо хочешь). Помни, в режиме WAIT процессор от шин не отключается.
Даже с тумблеров все управлялось . Делался пошаговый режим работы процессора.
Схем и описаний на это полно. Сходи на форум синклеристов.
Патрогать z80 за пины... Ипать-капать, лучше лампу за цоколь пошатай, мошт и прибавицца шо из пробелов :))
Хех, эт давно пройденный этап гвоздь вместо цоколя и лампа в руке. Лампа тогда лопнула. А по теме что-то можете предложить?
Если ты думаешь, что тут сидит 10 экспертов по безнадежно устаревшему железу, которые только и ждут себе бестолкового ученика, то ты заблуждаешься.
Начните с мигания светодиодами.
Для начала напишите скетч, который мигает тремя светодиодами с некратными частотами.
По поводу остального - пока "отложите в сторону": из Вашего сообщения видно, что Вы просто не знаете, чего хотите. Соберите пару-тройку простых проектов, глядишь, после этого удастся собраться с мыслями и сформулировать желаемое.
Не, просто ардуинкой я мигал, делал плоттер из двух сд-ром, часики даже с прерываниями. Что касается программирования, смею предположить, у меня чуть-чуть получается.
Общие представления о работе процессора есть. Может быть смутные со времён института, но временные диаграммы для меня не сюрприз. Нужно что-то вспомнить, что-то снова узнать.
А по сути вопроса- хочу, Чтобы ардуина хранила бинарный файл , который будет переноситься в начало адресного пространства ОЗУ, Чтобы проц его начал выполнять при расчете. Можно конечно сделать чтобы ардуинка работала вместо ПЗУ: читала шину адреса и выдавала нужные данные. Может так и попробую сначала. Быстродействия ардуины должно хватить на минимальной тактовой частоте проца. Может даже тактовый импульс с ардуинки формировать?тогда вообще обвязки пока не нужно
Если ты думаешь, что тут сидит 10 экспертов по безнадежно устаревшему железу, которые только и ждут себе бестолкового ученика, то ты заблуждаешься.
Ну почему же.) Были когда то ностальгические порывы.
#include "io.h" #include "conio.h" #include "main.h" #include <SPI.h> #include <SD.h> File root; // PROGMEM #include "boot0/boot0.h" //boot0[] PROGMEM #include "bios/mbios.h" //mbios[] bool reset; bool cp; void setup() { con_begin(); con_println(); con_println(F(NAME " v." VERSION " " __DATE__ " " __TIME__)); /* Ардуино тактирует Z80 с помощью CP и формирует RESET, управляет ОЗУ при помощи RAM 1 - Z80 выполняет BOOT0, данные которого выставляет Ардуино отслеживая IORQ и RD 2 - Z80 выполняя BOOT0 записывает содержимое BOOT1 с 0-го адреса RAM 3 - Ардуино формирует RESET, после чего Z80 выполняет BOOT1 из ОЗУ 4 - Z80 ведёт обмен с Ардуино посредством IORQ RD A0 A1 A2 D0..D7 5 - Ардуино работает с SD, блокируя работу процессора (BUSRQ/SS) */ // вместо BUSRQ можно задействовать WAIT для ввода/вывода и при обмене с SD, тогда // от А0..А2 можно отказаться, передавая по D0..D7 2 байта А/D (один Ах для ID адреса) off(WAIT); out(WAIT); reset_low(); // by power on off(RAM); out(RAM); off(BUSRQ); out(BUSRQ); high(IORQ); high(RD); addr_off(); cp_init(); cp_set(CP_BOOT); reset_pulse(); //формируем reset относительно CP con_println("Load BOOT0..."); reset_pulse(); delay(1); // !RAM, RESET, по !IORQ && RD выставляем команды/данные - записывая BOOT1 с 0 // RAM, RESET, старт // грузим BOOT0 в ОЗУ Z80 /* 21 0000 ld hl,0 36 21 ld (hl),021h 23 inc hl 36 00 ld (hl),000h 23 inc hl 36 F8 ld (hl),0f8h 23 inc hl 36 01 ld (hl),001h 23 inc hl 36 00 ld (hl),000h 23 inc hl 36 1E ld (hl),01eh 23 inc hl 36 DB ld (hl),0dbh 23 inc hl 36 00 ld (hl),000h 23 inc hl 36 77 ld (hl),077h 23 inc hl 36 23 ld (hl),023h 23 inc hl 36 0B ld (hl),00bh 23 inc hl 36 78 ld (hl),078h 23 inc hl 36 B1 ld (hl),0b1h 23 inc hl 36 20 ld (hl),020h 23 inc hl 36 F7 ld (hl),0f7h 23 inc hl 36 C3 ld (hl),0c3h 23 inc hl 36 00 ld (hl),000h 23 inc hl 36 F8 ld (hl),0f8h 76 halt */ cli(); for (uint8_t i = 0; i < sizeof(boot0); i++) { wait(!pin(IORQ) && pin(RD)); //ожидаем MRQ && RD off(RAM); set_data(boot0[i]); //выставили данные DBG( display(); ) while (!pin(IORQ) && pin(RD)); //ожидаем снятия MRQ && RD data_off(); //сняли данные on(RAM); //теперь Z80 записывает данные BOOT1 в ОЗУ } sei(); con_println("Load MBIOS..."); delay(1000); reset_pulse(); // delay(1); /* такой код сейчас в RAM z80: 21 F800 boot1: ld hl,MonBase 01 1E00 ld bc,7680 loop equ $ DB 00 in a,(0) 77 ld (hl),a 23 inc hl 0B dec bc 78 ld a,b B1 or c 20 F7 jr nz,loop 76 halt ;временно! C3 F800 jp MonBase */ // грузим BIOS из flash в Z80 // по /iorq нужно выставлять данные mbios cli(); for (uint16_t i = 0; i < sizeof(mbios); i++) { uint8_t p = pgm_read_byte(&mbios[i]); wait(pin(IORQ) && pin(RD)); //ожидаем IORQ && RD set_data(p); //выставили данные while (pin(IORQ) && pin(RD)); //ожидаем снятия IORQ && RD data_off(); //сняли данные } sei(); // загрузили - эмулируем терминал #define rx_ready() (UCSR0A & 1<<RXC0) #define tx_ready() (UCSR0A & 1<<UDRE0) #define rx() UDR0 // #define tx(c) do { while (!tx_ready()); UDR0 = c; } while (0) #define tx(c) UDR0 = c //кто не успел...) on(BUSRQ); con_println("console echo..."); delay(10); off(BUSRQ); while (true) { if ((pin(IORQ) && !pin(RD))) { //conout // delayMicroseconds(4); //данные выставляются чуть позже /WR Serial.write(get_data()); while (pin(IORQ) && !pin(RD)); } if ((pin(IORQ) && pin(RD))) { //conin uint8_t d = 0; if (Serial.available()) d = Serial.read(); set_data(d); while (pin(IORQ) && pin(RD)); data_off(); } } }Во-во! Как то так!
Ну почему же.)
Ну раз так, то валяй. Учи.
все уже придумано до нас
Ну да, только это ж примитивщина. Эмулируется ТОЛЬКО ПЗУ и 1 разряд в/в. Да и то автор без доп. логики обойтись не смог, ужос! ТС же хочет иметь, как минимум, ещё и ОЗУ... И что, ещё добавлять рассыпуху?)
А шо, дешифраторы совсем отменили?
Сафсем. Санкции, панимашъ...
А шо, дешифраторы совсем отменили?
А в чём тогда фишка? Найди параллельную флешь AM29F/AT29C/M29F/SST39SF или подобную, пиши загрузчик и ставь вместо 27-й серии. Ну и дешифраторы, логику, ввод/вывод и пр.
Нет. Пусь ТС ищет, мне кот не разрешил. :)
Просто с Ардуиной убивается сразу куча зайцев: тактирование, ввод/вывод (UART, I2C, АЦП), и никакой рассыпухи.
Меня всегда пугала именно рассыпуха: чего-то не найдешь, что-то перепутаешь и проект уйдет в долгий ящик навсегда. Вот дождусь посылки от дядюшки Ляо и попробую.
Просто с Ардуиной убивается сразу куча зайцев: тактирование, ввод/вывод (UART, I2C, АЦП), и никакой рассыпухи.
то-есть, можно прицепить последовательную ПЗУ, только у ардуино нано нету столько выводов для обработки полного адреса )))
А зачем все адреса? Для начала достаточно и 8 пинов. Попробовать
то-есть, можно прицепить последовательную ПЗУ, только у ардуино нано нету столько выводов для обработки полного адреса )))
Можно цеплять хоть Serial EEPROM, хоть Flash/SD. Касательно выводов для адреса - галиматня.)
тогда три корпуса 61256, 29F010 и Z80 и готов девайс поиграться, я бы еще BB55 добавил
Надеюсь не будем вспоминать схемотехнику 90-х прошлого столетия?)
А то ещё придётся добавлять генератор и дешифрацию для чипов памяти.
Надеюсь не будем вспоминать схемотехнику 90-х прошлого столетия?)
А то ещё придётся добавлять генератор и дешифрацию для чипов памяти.
4-8 мегагерц можно с ардуины взять, через таймер... у меня первый программатор был на тумблерах )))
Пока едут мои игрушки (z80) Подскажите, может кто-то помнит такое? Где-то видел статейку, мужик какой-то мегой эмулировал видеопамять спектрума. Типа, контролер сидел на шине адреса и данных и работал как видео озу. Потом как-то по этой инфе формировал видеосигнал. кажется без цветности это было - развлекался просто JustForFun. сейчас не могу найти описание.
Помогите найти, я сам такое , наверное, не напишу.
Пока едут мои игрушки (z80) Подскажите, может кто-то помнит такое? Где-то видел статейку, мужик какой-то мегой эмулировал видеопамять спектрума. Типа, контролер сидел на шине адреса и данных и работал как видео озу. Потом как-то по этой инфе формировал видеосигнал. кажется без цветности это было - развлекался просто JustForFun. сейчас не могу найти описание.
Помогите найти, я сам такое , наверное, не напишу.
Насчет Меги - не попадалось. Но, может, заинтересует: http://arduino.ru/forum/proekty/s-stm32f103-na-televizor-polnyi-tv-signal
Это заметно дешевле, чем Мега, и разрешение сигнала немного повыше.
Помогите найти, я сам такое , наверное, не напишу.
Arduino.ru - поиск: zx spectrum