ПЗУ для z80 на ардуинке

doleynikov
Offline
Зарегистрирован: 30.01.2015

Добрый день.
Хочу восполнить пробел в образовании и потрогать z80 за пины. Нашел описания, проекты учебных простых вычислительных устройств. Но там нужно программатор ПЗУ для программы инициализации. Есть упоминания эмуляции такого ПЗУ на Ардуино. Я хочу разобраться, с двумя вещами: подключить старую simm планку как ОЗУ и на ардуино сделать устройство, которое по кнопке загружает код с нулевого адреса в ОЗУ.
Получается, я тупенький - не смог разобраться. Вроде должно быть просто, но прояснения не происходит! Растолкуйте, плизз!

doleynikov
Offline
Зарегистрирован: 30.01.2015

Как я понял, по кнопке ардуинка должна выставить ресет и запрос шины. Потом ждать пока проц разрешит (как?) А вставить адрес и данные и дёрнуть Запись. И так много раз. Потом снять запрос шины и ресет. Но подробности ещё в тумане

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А просто 27С512 не судьба поставить + Тошибовское статическое ОЗУ без регенерации?

Да и сам Z80 в CMOS версии можно за полтинник купить, набери на Али Z84C0020

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ну и книшку какую по Z80 почитай, их на русском полнО.  

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

doleynikov пишет:
Как я понял, по кнопке ардуинка должна выставить ресет и запрос шины. Потом ждать пока проц разрешит (как?) А вставить адрес и данные и дёрнуть Запись. И так много раз. Потом снять запрос шины и ресет. Но подробности ещё в тумане

В любой момент ты можешь перевести проц в состояние ожидания, подав 0 на вход /WAIT или вообще отлучить его от шины, подав опять же 0 на вход /BUSRQ, тогда он отключится совсем от шин адреса и данных и пришлёт тебе ответ /BUSAK.  И вот когда ты получил этот ответ, ты можешь срать ардуиной в адресную шину и данных (например, писАть в ОЗУ или ROM чо хочешь).  Помни, в режиме WAIT процессор от шин не отключается. 

smart_pic
Offline
Зарегистрирован: 17.04.2016

Даже с тумблеров все управлялось . Делался пошаговый режим работы процессора.

Схем и описаний на это полно. Сходи на форум синклеристов.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Патрогать z80 за пины... Ипать-капать, лучше лампу за цоколь пошатай, мошт и прибавицца шо из пробелов :))

doleynikov
Offline
Зарегистрирован: 30.01.2015

Хех, эт давно пройденный этап гвоздь вместо цоколя и лампа в руке. Лампа тогда лопнула. А по теме что-то можете предложить?

rkit
Offline
Зарегистрирован: 23.11.2016

Если ты думаешь, что тут сидит 10 экспертов по безнадежно устаревшему железу, которые только и ждут себе бестолкового ученика, то ты заблуждаешься.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

doleynikov пишет:
Получается, я тупенький - не смог разобраться. Вроде должно быть просто, но прояснения не происходит! Растолкуйте, плизз!

Начните с мигания светодиодами.

Для начала напишите скетч, который мигает тремя светодиодами с некратными частотами.

По поводу остального - пока "отложите в сторону": из Вашего сообщения видно, что Вы просто не знаете, чего хотите. Соберите пару-тройку простых проектов, глядишь, после этого удастся собраться с мыслями и сформулировать желаемое.

doleynikov
Offline
Зарегистрирован: 30.01.2015

Не, просто ардуинкой я мигал, делал плоттер из двух сд-ром, часики даже с прерываниями. Что касается программирования, смею предположить, у меня чуть-чуть получается.

Общие представления о работе процессора есть. Может быть смутные со времён института, но временные диаграммы для меня не сюрприз. Нужно что-то вспомнить, что-то снова узнать.

А по сути вопроса- хочу, Чтобы ардуина хранила бинарный файл , который будет переноситься в начало адресного пространства ОЗУ, Чтобы проц его начал выполнять при расчете. Можно конечно сделать чтобы ардуинка работала вместо ПЗУ: читала шину адреса и выдавала нужные данные. Может так и попробую сначала. Быстродействия ардуины должно хватить на минимальной тактовой частоте проца. Может даже тактовый импульс с ардуинки формировать?тогда вообще обвязки пока не нужно

Green
Offline
Зарегистрирован: 01.10.2015

rkit пишет:

Если ты думаешь, что тут сидит 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();
    }
  }
}  

 

doleynikov
Offline
Зарегистрирован: 30.01.2015

Во-во! Как то так!

rkit
Offline
Зарегистрирован: 23.11.2016

Green пишет:

Ну почему же.)

Ну раз так, то валяй. Учи.

DIVGENY
Offline
Зарегистрирован: 23.08.2016
Green
Offline
Зарегистрирован: 01.10.2015

Ну да, только это ж примитивщина. Эмулируется ТОЛЬКО ПЗУ и 1 разряд в/в. Да и то автор без доп. логики обойтись не смог, ужос! ТС же хочет иметь, как минимум, ещё и ОЗУ... И что, ещё добавлять рассыпуху?)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А шо, дешифраторы совсем отменили? 

-NMi-
Offline
Зарегистрирован: 20.08.2018

Сафсем. Санкции, панимашъ...

Green
Offline
Зарегистрирован: 01.10.2015

DetSimen пишет:

А шо, дешифраторы совсем отменили? 


А в чём тогда фишка? Найди параллельную флешь AM29F/AT29C/M29F/SST39SF или подобную, пиши загрузчик и ставь вместо 27-й серии. Ну и дешифраторы, логику, ввод/вывод и пр.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Green пишет:
Найди параллельную флешь AM29F/AT29C/M29F/SST39SF или подобную

Нет. Пусь ТС ищет, мне кот не разрешил. :) 

Green
Offline
Зарегистрирован: 01.10.2015

Просто с Ардуиной убивается сразу куча зайцев: тактирование, ввод/вывод (UART, I2C, АЦП), и никакой рассыпухи.

doleynikov
Offline
Зарегистрирован: 30.01.2015

Меня всегда пугала именно рассыпуха: чего-то не найдешь, что-то перепутаешь и проект уйдет в долгий ящик навсегда. Вот дождусь посылки от дядюшки Ляо и попробую.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

Просто с Ардуиной убивается сразу куча зайцев: тактирование, ввод/вывод (UART, I2C, АЦП), и никакой рассыпухи.

то-есть, можно прицепить последовательную ПЗУ, только у ардуино нано нету столько выводов для обработки полного адреса )))

doleynikov
Offline
Зарегистрирован: 30.01.2015

А зачем все адреса? Для начала достаточно и 8 пинов. Попробовать

Green
Offline
Зарегистрирован: 01.10.2015

ua6em пишет:

то-есть, можно прицепить последовательную ПЗУ, только у ардуино нано нету столько выводов для обработки полного адреса )))


Можно цеплять хоть Serial EEPROM, хоть Flash/SD. Касательно выводов для адреса - галиматня.)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

тогда три корпуса  61256, 29F010 и Z80 и готов девайс поиграться, я бы еще BB55 добавил

Green
Offline
Зарегистрирован: 01.10.2015

Надеюсь не будем вспоминать схемотехнику 90-х прошлого столетия?)
А то ещё придётся добавлять генератор и дешифрацию для чипов памяти.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

Надеюсь не будем вспоминать схемотехнику 90-х прошлого столетия?)
А то ещё придётся добавлять генератор и дешифрацию для чипов памяти.

4-8 мегагерц можно с ардуины взять, через таймер... у меня первый программатор был на тумблерах )))

doleynikov
Offline
Зарегистрирован: 30.01.2015

Пока едут мои игрушки (z80) Подскажите, может кто-то помнит такое? Где-то видел статейку, мужик какой-то мегой эмулировал видеопамять спектрума. Типа, контролер сидел на шине адреса и данных и работал как видео озу. Потом как-то по этой инфе формировал видеосигнал. кажется без цветности это было - развлекался просто JustForFun. сейчас не могу найти описание.

Помогите найти, я сам такое , наверное, не напишу.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

doleynikov пишет:

Пока едут мои игрушки (z80) Подскажите, может кто-то помнит такое? Где-то видел статейку, мужик какой-то мегой эмулировал видеопамять спектрума. Типа, контролер сидел на шине адреса и данных и работал как видео озу. Потом как-то по этой инфе формировал видеосигнал. кажется без цветности это было - развлекался просто JustForFun. сейчас не могу найти описание.

Помогите найти, я сам такое , наверное, не напишу.

Насчет Меги - не попадалось. Но, может, заинтересует: http://arduino.ru/forum/proekty/s-stm32f103-na-televizor-polnyi-tv-signal

Это заметно дешевле, чем Мега, и разрешение сигнала немного повыше.

Green
Offline
Зарегистрирован: 01.10.2015

doleynikov пишет:

Помогите найти, я сам такое , наверное, не напишу.

Arduino.ru - поиск: zx spectrum