Важная информация
RSS лента

vinxru

Анаконда / Специалист с контроллером дисководов

Оценить эту запись
Я сначала подумал, что тут стоит компьютер Пентагон. Самодельных (мелкосерийных) компьютеров с дисководом очень мало. Корпус сделан очень добротно. Что то склеено, что то отлито. Пластмассы не жалели, стенки толстые. Странно только то, что использована белая пластмасса и покрашена в черный цвет.

[IMG]http://cs624024.vk.me/v624024349/1a602/F11-WdP3J5M.jpg[/IMG]

[IMG]http://cs624024.vk.me/v624024349/1a5da/XwLeWdQJoa4.jpg[/IMG]

У меня есть Специалист собранный[URL="http://vk.com/album-41468278_190532403"] в такой же клавиатуре[/URL]. Т.е. на одной плате и кнопки и микросхемы. Тут же клавиатура - это просто клавиатура и внутри нет ни одной микросхемы. Поэтому широкий шлейф проводов напрямую от клавиш идет к системному блоку.

[IMG]http://cs624024.vk.me/v624024349/1a60c/ikKFNYODiN4.jpg[/IMG]

Никто бы не стал делать плату для своего компьютера, что бы её потом надо было переделывать. Резать дорожки и паять сверху провода. То есть перед нами родная плата этой клавиатуры. Вы видите на этой плате микросхемы? Я тоже нет. Значит и в оригинале от клавиатуры к системному блоку шла куча проводов. И это странно. Я бы мультиплексор поставил.

Клавиатура герконовая. То есть собранная на герконах. Геркон - это деталь реагирующая на магнитное поле. Герконы закреплены на плате, а к клавише приклеен магнит. Нажимаем на клавишу, магнит приближается к геркону, геркон передает сигнал в компьютер.

Но главное не это. Главное надежность. С герконами никогда нет проблем. Клавиатура спустя 26 лет идеально работает. Ну а обычные клавиатуры того времени плохо нажимались с первых дней жизни.

[IMG]http://cs624024.vk.me/v624024349/1a616/GlpJgY_6L1M.jpg[/IMG]

[IMG]http://cs624024.vk.me/v624024349/1a648/BR_lEXhmeT8.jpg[/IMG]

Мы видим две платы соединенных разъемом. Можно предположить, что нижняя плата - это полноценный компьютер содержащий: процессор КР580ВМ80А (8080A), ОЗУ 64 Кб, ПЗУ 2 Кб, черно-белый видеоадаптер, порт клавиатуры и магнитофона и последовательный порт (КР580ВВ51А, RS232). На нижней плате 1989 год. Верхняя плата - это контроллер дисковода и порт принтера. На верхней плате 1990 год.

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

Корпус странный. Возможно, что сделан был не под эту плату. А просто первый попавшийся корпус использовали для своего компьютера. Видите прямоугольнички, на которые крепится плата, приклеены на вентиляционые отверстия? Так бы никто делать не стал.

Эта плата очень похожа на вторичный блок питания, который вырабатывает напряжения -5В и +12В для процессора и контроллера дисковода. В компьютер входит всего одно напряжение, а микросхемам надо 3 напряжения.

Вариант, что плата вырабатывает все 3 напряжения (например из 42 Вольт) отпадает, потому что к плате идет всего 4 провода.

Провода от трансформатора (черного кольца) оторваны. Вообще в компьютере много чего оторвано. Но ни одна драгоценная деталь не была выкушена. Например, оранжевые конденсаторы.

[IMG]http://cs624024.vk.me/v624024349/1a65c/V_vE_pKmTUs.jpg[/IMG]

Я не могу поднять, зачем дисковод подняли над корпусом. Под дисководом неиспользуемое место! Корпус буквой Г выглядит крайне странно.

Первым делом я решил вытащить ПЗУ (К573РФ5) этого компьютера и прочитать его на программаторе. По содержимому ПЗУ можно очень многое сказать о компьютере. Иногда даже написать полноценный эмулятор не имея схемы и описания. Но микросхема оказалась мертвой. Как бы я не вставлял микросхему в программатор, как бы не настраивал программатор, из микросхемы все время читался байт 0FEh. Другие же РФ5 читаются нормально.

Но я не первый человек которому попала в руки Анаконда. На сайте [url]http://www.spetsialist-mx.ru[/url] выложено ПЗУ этого компьютера, а так же конфигурация для эмулятора b2m.

Нет, ну точно это Специалист. Столько знаков свыше. Но я всё же загрузил в дизассемблер (IDA) содержимое ПЗУ этого компьютера.

Это оказался сильно модифицированный "Загрузчик 1" компьютера Специалист. Самая первая версия ПЗУ для Специалиста. Её авторам еще не пришла в голову мысль, что в начале ПЗУ надо сделать табличку с адресами функций (точек входа) содежащихся в ПЗУ. Точки входа были размазаны по всему ПЗУ. Более того, было непонятно, что считать точкой входа. В Загрузчике 2 это безобразие поправили.

ПЗУ Анаконды отличается от "Загрузчика 1". Оттуда пропали десятки функций, но нужны ли они какой нибудь программе, что является точкой входа, сказать сложно. Я бы провел испытания, но на "Загрузчике 1" запускается не так много программ, гораздо популярнее была вторая версия ПЗУ. А из за модификаций запускаться станет еще меньше программ.

Проще сказать что осталось. Сохранился шрифт (C500). Сохранились функции очистки экрана (C010), звукового сигнала (С170), загрузки и сохранения на магнитофон (C377, C3D0, C3F9, C422), копирования памяти (C42D), сравнения регистров (С472), вывода строки на экран (С438)... Переписаны функции вывода на экран и ввода с клавиатуры и их адреса отличаются.

В ПЗУ содержится неиспользуемая строка К-В "Рефа"

Ну и конечно, добавлена зарузка с дисковода. Вот на неё мне и интересно посмотреть.

[CODE]
C000 lxi sp, 8000h ; Инициализируем стек (у обычного Специалиста стек в другом месте)
C003 lxi b, 8FE7h ; Сюда будут скопированы сист. переменные (аналогично Специалисту)
C006 lxi h, 0E001h ; Возможно инициализация последовательного порта
C009 mvi m, 0FEh
C00B mvi m, 14h
C00D jmp reboot2

C33D reboot2:
C33D mvi a, 82h ; Инициализация клавиатуры, включение ОЗУ...
C33F sta 0FF03h
C342 sta 0F703h ; Инициализация порта принтера и возможно флопа
C345 lxi h, sysVars ; Инициализация системных переменных
C348 lxi d, sysVarsEnd
C34B call memcpy_bc_hl_de
C34E call printString ; Очистка экрана, вывод "MASTER:?"
C351 jmp reboot3

C443 reboot3:
C443 mvi a, 1 ; Инициализация дисковода
C445 sta 0ED00h
C448 sta 0ED02h ; Установка 1 ого сектора
C44B lxi h, 3000h ; Ждем готовности дисковода некоторое время
C44E reboot4:
C44E lda 0ED00h
C451 rlc
C452 jnc reboot5 ; Если дисковод готов, то выходим
C455 dcx h
C456 mov a, h
C457 ora l
C458 jnz reboot4
C45B lxi h, aFloppyNotReady ; Вывод ошибки на экран
C45E floppyNotReady:
C45E call printString
; Далее загрузка с магнитофона

C46B reboot5:
C46B lxi h, 00080h ; Адрес загрузки
C46E lxi d, 0EB00h ; Порт состояния дисковода
C471 lxi b, 0ED03h ; Порт данных дисковода
C474 mvi a, 10 ; Кол-во попыток
C476 sta v_retryCount
C479 reboot6:
C479 lda 0ED00h ; Ожидание готовности дисковода
C47C rrc
C47D jc reboot6
C480 mvi a, 80h ; Команда дисководу - чтение сектора
C482 sta 0ED00h
C485 jmp reboot7

C488 reboot8:
C488 ldax b ; Получаем байт с дисковода
C489 mov m, a ; и сохраняем его в память
C48A inx h
C48B reboot7:
C48B ldax d ; Еще данные есть? Если да, то переходим на reboot8
C48C rrc
C48D jnc reboot8
C490 lda 0ED00h ; Если загрузка без ошибок, стартуем с 80h адреса
C493 ani 09Ch
C495 jz 00080h
C498 lda v_retryCount ; Уменьшаем счетчик попыток
C49B dcr a
C49C sta v_retryCount
C49F jnz reboot6 ; Если попытки еще есть, повторяем загрузку. Бессмысленно.
; Так как в HL у нас лабуда.
C4A2 jmp floppyNotReady ; Выходим. И выводим лабуду на экран, так как
; HL у нас указывает на неинициализированную память
[/CODE]

Какую полезную информацию можно отсюда подчерпнуть?

1) Это Специалист. И из 64 Килобайт памяти присутствующих на плате компьютера и так нужных операционной системе, из за непродуманной карты памяти Специалиста программам доступно только 48Кб. Нет, даже еще меньше. Ведь 12Кб занято видеопамятью. Итого 34 Кб памяти под программы.

2) Если не вставлена дискета, то можно загрузить компьютер с магнитофона. Если при этом нажать любую клавишу верхнего ряда клавиатуры, то компьютер заглючит. Происходит переход на вторую ПЗУ с Монитором, которой нет.

3) Если при чтении дискеты происходит ошибка (например, контрольная сумма не сходится), то производится ~10 попыток чтения. Но при этом, запускается программа некорректно загруженная во время первой попытки. Если за ~10 попыток загрузится не удалось, то на экран выводится мусор из неинициализированного ОЗУ.

4) Адрес контроллера дисковода 0ED00h - 0ED03h, на порт 0EB00h выведен сигнал IRQ.

5) В конфигурации эмулятора я подглядел, что порт выбора диска и стороны диска 0EE00h. В ПЗУ даже намека на это нет, ни одного обращения к этому порту. А ведь это критически важные настройки, без них система будет загружаться со случайной дискеты и случайной стороны. Надо спросить у авторов конфигурации, была ли у них родная дискета?

6) С дискеты с нулевой дорожки загружается первый сектор. Загружается по адресу 080h и запускается. Если не найдутся дискеты, буду писать загрузчик CP/M.

Ну и карта памяти:
[CODE]
0000-8FFF ОЗУ
9000-BFFF Видеопамять
С000-С7FF ПЗУ
E000-E001 Последовательный порт
EB00-EB03 Контроллер дисковода
ED00-ED00 Контроллер дисковода
F000-F003 Порт принтера...
F800-F803 Порт клавиатуры, магнитофона...
[/CODE]

В компьютере Специалист применяется неполная дешифрация адресов. Например, порт клавиатуры требующий всего 4 байта адресного простанства (F800-F803), в реальности занимает 2048 байт (F800-FFFF). Эти 4 байта повторяются 512 раз в адресном пространстве. Так же и с остальными портами - принтера, дисковода, последовательного порта.

[SIZE=4]CP/M[/SIZE]

Для запуска Анаконды нам нужна системная дискета. А её нет и вероятнее всего не будет. Придется делать её самому. На 8-битных компьютерах чаще всего использовалась операционная система CP/M. Под неё написано множетсво интересных программ, поэтому её мы и будем ставить. И я вам честно скажу, что ставлю её впервые.

Шаг первый. Скачиваем исходники CP/M версии 2.2, потому что это самая популярная версия. Исходники представляют собой один файл cpm22.asm. Мы его можем сразу же скомпилировать, но толку от этого никакого не будет. Сначала надо настроить систему, обьяснить системе как взаимодействовать с оборудованием: экран, клавиатура, дисковод, последовательный порт, принтер.

Шаг второй. Открываем файл cpm22.asm и в самой первой строке видим:

MEM EQU 62 ; for a 62k system (TS802 TEST - WORKS OK).


У нашего компьютера всего ~36 Килобайт памяти для программ. Но пока мы запишем сюда 32, а в будущем увеличим это значение. (4 Кб нам могут пригодистя под дисковый буфер, шрифт и драйверы.)

Далее смотрим в конец файла и видим там

[CODE]
;**************************************************************
;*
;* B I O S J U M P T A B L E
;*
;**************************************************************
;
BOOT JMP 0 ;NOTE WE USE FAKE DESTINATIONS
WBOOT JMP 0
CONST JMP 0
CONIN JMP 0
CONOUT JMP 0
LIST JMP 0
PUNCH JMP 0
READER JMP 0
HOME JMP 0
SELDSK JMP 0
SETTRK JMP 0
SETSEC JMP 0
SETDMA JMP 0
READ JMP 0
WRITE JMP 0
PRSTAT JMP 0
SECTRN JMP 0
[/CODE]

Это переходы на BIOS (ПЗУ) компьютера. И пока эти переходы не заполнены. Я не зря вчера дизассемблировал ПЗУ компьютера. Благодаря этому я знаю какие циферки туда вписать.

Очень хорошее описание этого раздела можно почитать тут.

Первые два адреса - это теплая и холодная перезагрузка. Сейчас мы их заполним одним адресом 0C000h. Для первой версии пойдет.

Далее CONST (Console State), это проверка, есть ли в буфере клавиатуры какие либо символы. В этом компьютере такого буфера нет, поэтому я подключу сюда функцию проверяющую, нажата ли какая нибудь клавиша. В ПЗУ есть такая функция, но её возвращаемое значение противоположно (инверсно) требуемому. Поэтому добавим маленькую функцию, которая перевернет результат:

[CODE]
_CONST: CALL 0C2C0h
STA _LASTKEY
XRI 0FFh
RZ
MVI A, 0FFh
RET
[/CODE]

И в таблицу запишем её адрес. Далее функции получения символа с клавиатуры и вывода на экран. Они есть в ПЗУ, но не совсем нам подходят. Они работают с кодировкой КОИ7Р (вместо строчных латинских букв там заглавая кирилица), а операционная система работает с ASCII. То есть фразу "No file" мы будем видеть на экране как "NО ФИЛЕ". Пока нас это устроит, но потом придется написать свой драйвер экрана и клавиатуры. Или загрузить английский шрифт. Функция вывода текста в ПЗУ поддерживает использование альтернативных знакогенераторов из ОЗУ.

Ну и в функции CONIN надо учитывать _LASTKEY, что бы предотвратить зависание в играх. Игра сначала вызовет CONST, что бы убедится, что вызов CONIN её не подвесит, а потом уже вызывает CONIN. В нашем случае, если пользователь в промежутке между вызовами функций отжимает клавишу, то CONIN затормозит игру до следующего нажатия клавиши.

[CODE]
BOOT JMP 0C000h
WBOOT JMP 0C000h
CONST JMP _CONST
CONIN JMP 0C25Fh
CONOUT JMP 0C192h
[/CODE]

Далее переходы на принтер, последовательный порт и дисковод. Для первого запуска они нам не понадобятся, поэтому заменяем из на пустую функцию _NOTIMP. И дописываем в конец файла эту функцию.

[CODE]
_NOTIMP: RET
[/CODE]

И вот у нас есть запускающийся CP/M. Только программа в ПЗУ её загрузить не в состоянии. Она загружает только первый сектор (1024 байта) на нулевой дорожке в память и сразу же запускает его. Короче, нам еще придется написать загрузчик (бут сектор), который загрузит CP/M.

Шаг третий. Для первой версии я просто беру код загрузки из ПЗУ и слегка его модифицирую
[CODE]
org 80h ; По этому адресу будет загружен этот код

LOAD_ADDR = 6400h ; По этому адресу мы будем загружать CP/M. Подсмотрено в cpm22.lst
SIZE = 8 ; Размер ОС в секторах (8x1024 байта)
ERROR_PROC = 0C45Bh ; Вывод ошибки
BDOS_ENTRY = 6C06h ; Точка входа в CP/M. Подсмотрено в cpm22.lst

entry:
mvi a, 0C3h ; CP/M настолько ленивая, что инициализировать её переменные приходится нам.
sta 0
sta 5
lxi h, 0C000h
shld 1
lxi h, BDOS_ENTRY
shld 6
lxi sp, 200h
lxi h, LOAD_ADDR ; Адрес загрузки
lxi d, 0EB00h
lxi b, 0ED03h ; Данные и состояние флопа
mvi a, 1
sta v_sector
reboot6:
lda 0ED00h ; Ожидание готовности
rrc
jc reboot6
lda v_sector
inr a
cpi SIZE
jz go
sta v_sector
sta 0ED02h
mvi a, 80h ; Отправка команды флопу - чтение сектора
sta 0ED00h
jmp reboot7
reboot8:
ldax b ; Получение байта с флопа
mov m, a ; И запись его в память
inx h
reboot7:
ldax d ; Еще что то есть?
rrc
jnc reboot8
lda 0ED00h ; Если загрузка без ошибок, продолжаем
ani 9Ch
jnz ERROR_PROC
jmp reboot6
go: mvi c, 0
jmp LOAD_ADDR+3

v_sector db 0

org 1024+80h

insert_file "cpm22.bin"
[/CODE]

Опять же, загрузчик написан с недочетами. В первом секторе нулевой дорожки должна содержаться таблица с описанием формата диска. А так же загрузчик должен очистить экран и вывести строку "CP/M 2.2 Copyright 1979 (с) by Digital Researsh". Да, CP/M настолько ленивая, что не делает даже этого. Но я еще ленивее, для первого запуска это не нужно.

Кстати, при компиляции загрузчика у нас получается не просто загрузчик, а образ диска, который можно загрузить в эмулятор b2m (он кстати запускается под Linux-ом).

[IMG]http://cs622829.vk.me/v622829349/21eb8/gNhQVXWLRtw.jpg[/IMG]

[IMG]http://cs622830.vk.me/v622830349/24af3/Jinh-YVLWdQ.jpg[/IMG]

[IMG]http://cs622830.vk.me/v622830349/24b1d/zb5kJKwrJfE.jpg[/IMG]

На реале то же запустил самую вервию версию, но дальше забил. Не нашел ничего достойного внимания запускающееся на 36 Кб.

Обновлено 24.05.2016 в 19:57 vinxru

Метки: Нет Добавить / редактировать метки
Категории
Без категории

Комментарии