Нельзя заполнять ВСЮ память.
Образ ПЗУ, загруженный LDROM должен оставаться неизменным.
Память надо заполнять в диапазоне 0100000-0160000.
Код:Программка заполнения: Mov R0,(R1)+ SOB R2, .-2. Halt Выглядит в памяти так: 010021 077202 000000 ================= Программка сравнения: Cmp R0,(R1)+ BEq .-2. Halt Выглядит так: 020021 001776 000000
Заполняет всю память числом из R0,
начиная с адреса в R1
000000/010021 MOV R0,(R1)+
000002/077202 SOB R2, .-2.
000004/000000 HALT
R0/000777
R1/000006
Проверяет всю память, сравнивая с числом из R0,
начиная с адреса в R1, если находит не совпадение
останавливается на адресе 6, если не совпадений не найдено, останавливается по адресу 2,
в R1 содержится адрес -1 , по которому найдено не
совпадение.
000000/020021 CMP R0,(R1)+
000002/001776 BEQ .-2.
000004/000000 HALT
R0/000777
R1/000006
Заполнил всю память числом 111111, проверил, содержимое всей памяти,
соответствует 111111.
Выполнил команды:
176732/000066 7
@176730/000040
НМЛ Прочитал кусочек ленты, проверил память, как было во всех ячейках 111111
так и осталось.
176732/000066 33407
@176730/000040
НМЛ Прочитал кусочек ленты, проверил память, как было во всех ячейках 111111
так и осталось.
1. При заполнении памяти - в R2 нужно записывать число заполняемых слов ( или 0 - если нужно заполнять "до упора" ).
2. Старший байт команды может иметь смысл "вектора" по которому находится адрес буфера, поэтому область векторов ПЗУ я бы не затирал.
3. Процедура чтения ( команда ПЗУ GET/IST:TP ) состоит из последовательной подачи двух кодов.
3.1. Сначала подаётся код 033407 ( т.е. пишется код 033407 в регистр 176732 и 01 в регистр 176730 )
3.2. Затем ожидается появление 054 в регистре 176730
3.3. Затем проверяется установка бита 0200 в регистре 176732
3.4. Если пп 3.2 и 3.3 выполнены - подаётся код 02 ( т.е. пишется код 02 в регистр 176732 и 01 в регистр 176730 )
3.5. Ожидается появление 054 в регистре 176730
4. Не стоит располагать программу заполнения ( и/или сравнения ) памяти так, чтобы она рекурсивно вызывалась при попытке записи/чтения по несуществующему адресу ( команда HALT по адресу 04 воспринимается процессором как равный нулю адрес обработчика прерывания зависания ).
Последний раз редактировалось Patron; 23.03.2011 в 23:07.
ммм... интересно... Может попробуете сейчас это сделать?
---------- Post added at 02:18 ---------- Previous post was at 01:59 ----------
Интересно:
@176730/000054
176732/000066 033407
@176730/000040 1
@176730/000054
@176732/000202 02
@176730/000040 01
@
@176730/000014
@176730/000014
@176730/000014
176732/000333
176734/
BUS ERROR
@176730/000014
176732/000001
176734/
BUS ERROR
@176732/000101
@176732/000021
@176732/000372
@176732/000003
@176732/000341
@176732/000013
@176732/000300
@176732/000022
@176732/000146
@176732/000020
@176732/000301
@176732/000025
@176732/000000
@176732/000001
@176732/000367
@176730/000014
@176732/000011
@176732/000172
@
Может данные читаются из 176732 ?
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Попробую научить :)
1. Загрузить образ ПЗУ в память.
2. Проверить ( с помощью эмулятора пульта ) содержимое буфера по адресу 0140000 ( там все нули ).
3. Выполнить команду GET/IST:TP ( или SHW/IST:TP )
4. Проверить, изменилось ли содержимое буфера ( похоже, что ПЗУ читает именно туда ).
...
5. Добавить к коду ПЗУ в памяти парочку "наших" подпрограмм по адресам 0110 и 0130
6. Заполнить числом 0111111 адреса с 0100000 по 0160000 ( R0/111111 ; R1/100000 ; R2/0 )
7. Выполнить описанную выше последовательность подачи кодов команды GET/IST:TP
8. Сравнить содержимое слов в диапазоне с 0100000 по 0160000 со значением 0111111 ( R0/111111 ; R1/100000 ).
9. Доложить результат :)
---------- Post added at 23:33 ---------- Previous post was at 23:26 ----------
Только если по прерываниям.
Циклического опроса регистров ПЗУ не производит, а логика эмуляции прерываний этого контроллера мне пока не известна.
Кстати, бит 010 в регистре 176730 означает "есть новые данные". Контроллер устанавливает этот бит каждый раз, когда в регистре 176732 появляется что-то "новенькое" и сбрасывает его после каждого чтения регистра 176732 процессором.
Последний раз редактировалось Patron; 23.03.2011 в 23:45.
Заполняю адреса 100000 - 160000 числом 111111,
после запуска программы ПЗУ по 20536G, и выхода из
программы все в 100000 - 160000 стирается..
---------- Post added at 03:05 ---------- Previous post was at 02:46 ----------
Заполнил память с 100000 до 160000 значением 000000,
@20536G
...*REW/IST:TP
...GET/IST:TP
GET-/IST ist. =TP=
...
? wwedite komandu
... 055554
@R0/105124 000000
R1/111056 100000
R2/105110 0
@R0/000000
R1/100000
R2/000000
@130G 000136
@R1/100036
@100030/000000
100032/000000
100034/105124
100036/047416
100040/000000
@100034/105124 0
100036/047416 0
@130/020021
000132/001776
000134/000000
@R0/000000
R1/100036 100000
R2/000000
@130G 000136
@R1/102070
@102070/143334
102072/100046
102074/100452
102076/143354
102100/040260
102102/040354
102104/102626
102106/144600
102110/145000
102112/145200
102114/146566
102116/145400
102120/145600
102122/113174
102124/143760
102126/143762
102130/143764
102132/144000
102134/144400
102136/113174
102140/123234
102142/143766
102144/143770
102146/143772
102150/143774
102152/143776
102154/113172
102156/000000
102160/000000
102162/000000
102164/000000
102166/000000
@
Похоже, что я ошибся, говоря, что драйвер не опрашивает регистры.
На самом деле это я ему выдавал в регистре 176730 код 044, что "на языке контроллера" означает: "Команда завершена, нет данных для чтения, буфер команд свободен."
Теперь припоминаю, что когда я один раз выдал драйверу код 014, вместо 044 - драйвер как раз принялся циклически опрашивать регистр 176732 и копировать оттуда данные.
Так что с чтением данных мы разобрались.
Никаких прерываний и запросов ПДП не происходит.
Всё, что контроллер может прочитать с ленты - появляется в регистре 176732 и может быть оттуда скопировано.
И как организовать чтение/запись?
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)