SD контроллер для Радио 86РК и Апогея в частности.

Советский компьютер Радио-86РК (1986) и его клоны

Moderator: Shaos

vinxru
Retired
Posts: 587
Joined: 27 Mar 2013 04:55
Location: 62.192.229.16

SD контроллер для Радио 86РК и Апогея в частности.

Post by vinxru »

Собственно, идея пока такая:

Image

Image

Микроконтроллер эмулирует ПЗУ на 256 байт, в котором будет начальный загрузчик. Загрузить и запустить программу из внешнего ПЗУ можно на любом потомке Радио 86РК с помощью команд R0,100 G.

(Хотя исключения есть, например в Партнере 01.01 нет встроенного параллельного порта. Его вынесли на отдельно продающийся модуль.)

Если в определенном порядке прочитать адреса ПЗУ, то вместо эмулятора ПЗУ включается уже обкатанный SD контроллер. После выполнения команды опять включается эмулятор ПЗУ.
Last edited by vinxru on 02 Nov 2013 01:00, edited 1 time in total.
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Re: SD контроллер для Радио 86РК и Апогея в частности.

Post by b2m »

vinxru wrote:После выполнения команды опять включается эмулятор ПЗУ.
Для гарантии, можно включать ПЗУ при любом несоблюдении протокола. Если случайно осталось выключенным ПЗУ команда R0,100 снова его включит.
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
vinxru
Retired
Posts: 587
Joined: 27 Mar 2013 04:55
Location: 62.192.229.16

Post by vinxru »

Ага, обязательно.

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

Image
vinxru
Retired
Posts: 587
Joined: 27 Mar 2013 04:55
Location: 62.192.229.16

Post by vinxru »

Забыл подключить сброс. Плата получилась деталями вниз, не подумал, что у Апогея плата закреплена деталями вниз.

Первый код. Эмуляция ПЗУ.

Code: Select all

  DDRD = 0;    // Шина адреса
  DDRC = 0x3F; // 0-5 Шина данных
  DDRB = 0xC1; // 6-7 - Шина данных, 0 - Светодиод
  PORTB.0 = 1; // Зажечь светодиод
  while(1) {    
    PORTC = data[(unsigned char)PIND];
    PORTB.6 = PORTC.6, PORTB.7 = PORTC.7;
  }
P.S. Нашел таки драйвера для программатора BM9010 под Win 7 64 бита, чему очень рад.
vinxru
Retired
Posts: 587
Joined: 27 Mar 2013 04:55
Location: 62.192.229.16

Post by vinxru »

Протокол будет таким

Сначала на шину адреса устанавливаем значения 19, 23, 87. Они отличаются одним битом, поэтому шума между ними быть не должно.

Далее, компьютер читает адреса 86,87,86,87,86,87... каждый байт 86 является тактовым импульсом, т.е. подтверждением приема/передачи байта.

Если синхронизация удалась, то МК выставляет на шину данных ERR_START, а после тактового импульса ERR_OK_WAIT. Код ERR_OK_WAIT может держаться неопределенное кол-во тактов. В это время происходит инициализация флешки.

Потом ERR_OK_WAIT меняется на ERR_OK_NEXT если все нормально. Или возвращается код ошибки.

Компьютер должен переключить порт на выход и передать команду. В примере ниже команда BOOT - единственный байт 0

На это МК отвечает ERR_OK_WAIT (много раз), ERR_OK_ADDR, адрес загрузки L, адрес загрузки H, ERR_OK_WAIT (много раз)

Потом выдает содержимое файла блоками: 0, длина L, длина H, данные (HL раз), ERR_OK_WAIT (много раз)

Если данных не осталось, выдает ERR_OK_READ

Code: Select all

     .org 0h

DATA_PORT       = 0EE00h
ADDR_PORT       = 0EE01h
CTL_PORT        = 0EE03h
SEND_MODE       = 10001011b ; Настройка: 1 0 0 A СH 0 B CL   1=ввод 0=вывод
RECV_MODE       = 10011011b

ERR_START  	    = 040h
ERR_WAIT   	    = 041h
ERR_OK_DISK     = 042h
ERR_OK          = 043h
ERR_OK_READ	    = 044h
ERR_OK_ENTRY	  = 045h
ERR_OK_WRITE	  = 046h
ERR_OK_ADDR    = 047h

Entry:
     ; Первым этапом происходит синхронизация с контроллером
     ; 256 попыток. Для этого в регистр C заносится 0

     ; А в стек заносится адрес перезагрузки 0C000h

     LXI	B, 0F800h
     PUSH	B     

     JMP	Boot

     NOP

;----------------------------------------------------------------------------
; Отправка и прием байта

Rst1:
     INX	H		; HL = ADDR_PORT
     MVI	M, 86
     MVI	M, 87
     DCX	H		; HL = DATA_PORT
     MOV	A, M
     RET

;----------------------------------------------------------------------------
; Ожидание готовности МК

Rst2:
WaitForReady:
     Rst	1
     CPI	ERR_WAIT
     JZ		WaitForReady
     RET

;----------------------------------------------------------------------------

RetrySync:
     ; Попытки
     DCR C
     RZ				; Ошибка синхронизации, перезагрузка

Boot:
     ; Режим передачи (освобождаем шину) и инициализируем HL
     MVI	A, RECV_MODE
     CALL SetMode

     ; Начало любой команды
     MVI	M, 19
     MVI	M, 23
     MVI	M, 87

     ; Если есть синхронизация, то контроллер ответит ERR_START
     Rst	1         
     CPI	ERR_START
     JNZ	RetrySync

     ; Дальше будет ERR_OK_WAIT, ERR_OK_NEXT
     ; Инициализация флешки
     Rst	2
     CPI	ERR_OK_ADDR
     JNZ	Rst1		; Ошибка, освобождаем шину и перезагрузка

     ; ERR_OK_NEXT высталенный МК будет висеть на шине до следующего RST, 
     ; только после него МК освободит шину и мы сможем включить режим передачи.
     Rst	1     

     ; Режим передачи     
     MVI	A, SEND_MODE
     CALL SetMode

     ; Код команды
		 XRA	A
     Rst	1

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

     ; Режим приема
     MVI	A, RECV_MODE
     CALL SetMode

     ; МК захватит шину во время тактового импульса (первого RST)

     ; Дальше будет ERR_OK_WAIT, ERR_OK_RKS
     Rst	2
     CPI	ERR_OK_RKS
     JNZ	Rst1		; Ошибка, освобождаем шину и перезагрузка
     
     ; Удаляем из стека 0F800h
     POP	B

     ; Адрес загрузки в BC
     Rst	1
     MOV	C, A
     Rst	1
     MOV	B, A

     ; Сохраняем в стек адрес запуска
     PUSH	B

     ; Подождать, пока МК прочитает очередной блок денных
RecvLoop:
     Rst	2
     CPI	ERR_OK_READ
     JZ		Rst1		; Всё загружено, освобождаем шину и запуск
     ORA	A
     JNZ	0F800h	; Ошибка, перезагрузка (не отпускаем контроллер)

     ; Принять очередной блок
     Rst	1
     MOV	E, A
     Rst	1
     MOV	D, A
RecvBlock:
     Rst	1
     STAX	B
     INX	B
     DCX	D
     MOV	A, E
     ORA	D
     JNZ	RecvBlock
     JMP	RecvLoop

		; Прием/передача
SetMode:
     LXI	H, CTL_PORT
     MOV	M, A
     DCX	H
     DCX	H		; HL = ADDR_PORT
     RET
.End
108 байт.
vinxru
Retired
Posts: 587
Joined: 27 Mar 2013 04:55
Location: 62.192.229.16

Post by vinxru »

У кого есть опыт заказа плат в Китае? Может изготовить несколько плат? Я думаю разойдутся.
User avatar
Случайность
Doomed
Posts: 493
Joined: 05 Apr 2011 12:45
Location: Великий Новгород

Post by Случайность »

если будет заказ. то я одну платку возьму.
танцуй пока живешь под каплями огненного дождя...
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

Post by petrenko »

А я бы и две шт. не против.. А какова будет цена ?
vinxru
Retired
Posts: 587
Joined: 27 Mar 2013 04:55
Location: 62.192.229.16

Post by vinxru »

Печатная плата примерно такого размеру в Zorel стоит 6$.

Деталей там на 4$ (ATMega8, разъем SD, 7 резисторов, 2 диода, 1 светодиод, 4 конденсатора).

Итого 10$

Разъем из комплекта Апогея сами припаяете.

Это для самостоятельной сборки будет.

А что бы я захотел для вас их собрать, надо десяток заказов и 1000 рублей за готовое устройство. :) Это заказать детали с ибея, заказать платы, спаять всё, прошить, отмыть, проверить и отправить платы почтой.

Самое скучное тут - это тащиться на почту и стоять час в очереди.
User avatar
Случайность
Doomed
Posts: 493
Joined: 05 Apr 2011 12:45
Location: Великий Новгород

Post by Случайность »

а зачем паять кому то? когда интереснее это самому делать.
танцуй пока живешь под каплями огненного дождя...
vinxru
Retired
Posts: 587
Joined: 27 Mar 2013 04:55
Location: 62.192.229.16

Post by vinxru »

Помимо пальщиков, есть еще программисты, ностальгирующие и просто коллекционеры
Mifody
Novelist
Posts: 25
Joined: 13 Jun 2013 21:48
Location: г.Зерноград, Ростовская область

Post by Mifody »

Сабж работает? Где взять схему для самостоятельного изготовления?
ZX-Spectrum 128(краснодарский вариант)+YM+Covox+3,5" FDD+5,25" FDD+Nemo controller+HDD+CD-ROM+PS/2 Keyboard+PS/2 Mouse(остальное в проекте...) (Всё самодельное)
User avatar
Shaos
Admin
Posts: 24088
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Mifody wrote:Сабж работает? Где взять схему для самостоятельного изготовления?
Да схема же вроде в самом верху

Другой вопрос где взять прошивку?...

P.S. Оно? https://github.com/vinxru/VinxFs
Я тут за главного - если что шлите мыло на me собака shaos точка net
Mifody
Novelist
Posts: 25
Joined: 13 Jun 2013 21:48
Location: г.Зерноград, Ростовская область

Re: SD контроллер для Радио 86РК и Апогея в частности.

Post by Mifody »

vinxru wrote:Собственно, идея пока такая:
Ааа.. Я думал это пока только идея такая..
vinxru, а контроллер планируется адаптировать для Вектора,Партнёра,Львова,Башкирии? А то у них с загрузкой прог всё грустно. ((( На Башкирии вобще без танцев с бубном даже через мафон не загрузить, так как проги только в образах дисков..
ZX-Spectrum 128(краснодарский вариант)+YM+Covox+3,5" FDD+5,25" FDD+Nemo controller+HDD+CD-ROM+PS/2 Keyboard+PS/2 Mouse(остальное в проекте...) (Всё самодельное)
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Re: SD контроллер для Радио 86РК и Апогея в частности.

Post by b2m »

Mifody wrote:На Башкирии вобще без танцев с бубном даже через мафон не загрузить, так как проги только в образах дисков..
Надо будет подумать. Можно сделать прогу и тоже поместить на образ диска. Она будет выбирать файл и жужжать его через звуковую карту. Таким образом, запустив эмулятор и эту прогу можно будет выбрать файл и передать его на реальный компьютер.

Хотя, придётся писать процедуру вывода на магнитофон через динамик, может потом и не считаться. Проще, наверное, сделать специальный конфиг, в котором вывод на магнитофон будет не в файл, а прямо на биппер. Но можно и через файл.
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/