PDA

Просмотр полной версии : Теневой монитор для "Орели БК-08"



Barmaley_m
03.01.2009, 01:33
Владельцам "Орели БК-08" и сочувствующим - новогодний подарок!

Monitor Z80 64K Version 2.0 (c) 1993 Michael Borisov & Arcadi Pushnikov

Теневой монитор-отладчик!

Загружается в теневые 16Кб ОЗУ "Орели БК-08" аналогично монитору MZ80, входящему в комплект поставки. Вызывается нажатием кнопки NMI, прерывая любую программу! По сравнению с прототипом имеет ряд решающих преимуществ:

- дизассемблер, в том числе в исходный текст формата ZEUS.
- не портит верхних 48К ОЗУ при возврате из прерванной программы (только 4 байта на вершине стека)
- корректная работа с регистром R
- значительное повышение удобства работы, поддержка ввода-вывода на кассету, в том числе в турбо-форматах двойной и тройной плотности (совместимо с копировщиком SORMOS3 и турбо-бейсиком "Рапид").

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

С тех пор, разумеется, появлялись более новые версии. Последняя рассчитана на работу с "Орелью", имеющей 160Кб ОЗУ, открытые порты TR-DOS, IN 7FFD и рядом других нестандартных изменений, поэтому на заводской "Орели" ее запустить нельзя. А версию 2.0 - можно, и этим она ценна.

Надеюсь, кому-нибудь пригодится!

Описания не сохранилось, могу только по памяти пару намеков дать. Синтаксис команд единообразный: "K Adr1,Adr2,Adr3", где K - буква или символ, Adr1,Adr2 - шестнадцатеричные числа. Монитор воспринимает также и десятичные числа, если указывать им префикс - апостроф. Если использовать в качестве префикса кавычку, то в качестве адреса или константы пойдет код символа, стоящего после кавычки. Удобно при модификации памяти.

D <Adr> - вывод содержимого памяти с адреса Adr, а если адрес не указан - то продолжение вывода, начатого предыдущей командой D.

U <Adr> - просмотр дизассемблированного содержимого памяти с адреса Adr или, если адрес не указан - продолжение вывода.

M Adr - модификация памяти с адреса Adr. Выход из режима модификации - клавиша "." (точка).

Q - выход в Бейсик (0 OK, 0:1). Если системные переменные бейсика испорчены - то сбой.

R - возврат из NMI

T Adr1,Adr2,Adr3 - перемещение памяти с Adr1 по Adr2 на Adr3.

I <Adr> - ввод с магнитофона (по адресу Adr)

O Adr1,Adr2 - вывод на магнитофон

S Adr1,Adr2,Byte1,<Byte2>,<Byte3>,<Byte4> - поиск последовательности в памяти начиная с Adr1 по Adr2, макс. длина последовательности - 4 байта

F Adr1,Adr2,Byte - заполнение памяти с Adr1 по Adr2 константой Byte

G Adr1,<Adr2> - возврат из NMI на адрес Adr1 или (если указан Adr2) выполнение кода с Adr1 по Adr2 (на Adr2 ставится точка останова вида CALL #66).

H Turbo - Установка скорости обмена с кассетой (допустимые значения: 1,2,3).

J Adr1 - выполнение подпрограммы в кодах по Adr1 (когда подпрограмма возвращается по RET, то управление передается на адрес #66)

X <Rb> - просмотр и изменение содержимого регистров в блоке Rb. Блок регистров 0 используется при входе и возврате из NMI; блок регистров 1 - при использовании команд G Adr1,Adr2 и J. Блок регистров 2 свободен.

B <Rb0>,<Rb1> - пересылка содержимого блока регистров Rb0 в блок Rb1.

N <Ramtop> - выход в бейсик вида "CLEAR Ramtop: NEW". Работает независимо от того, испорчены системные переменные или нет. Позволяет задействовать бейсик, сохранив некоторую часть содержимого верхней памяти.

+ Num1,Num2 - сложение чисел
- Num1,Num2 - вычитание чисел
= Num - вывод числа в шестнадцатеричной и десятичной системах счисления

Реализованы и другие команды. Фактически, из команд-букв задействованы почти все, но я к сожалению уже все это забыл.

Приятной работы с монитором!

Rubts0FF
05.01.2009, 17:32
А сорцы не завалялись, хотелось бы глянуть на дизассемблер.

Barmaley_m
06.01.2009, 14:09
Rubts0FF, завалялись сорцы от последней версии, но дизассемблер там без изменений практически был начиная с версии монитора 1.0.

Привожу необходимые файлы в аттаче.

Дизассемблер мы с Аркадием выдрали из компактного монитора Z80-List. На те времена меня не хватило на то, чтобы разобраться, как он работает. Лишь дал ему пару предохранительных веток, чтобы не портил память от длинных последовательностей DD/FD.

Как можно видеть из сорца, там метки все трехбуквенные и бессмысленные - это была на то время наша традиция такая расставления меток вручную. Ибо код переписывался сначала ручкой на бумагу с адресами (с помощью дизассемблера Infrared), а потом - заводился вручную в ZEUS. С некоторого времени впоследствии я перешел на CP/M, и сырцы мониторные остались в формате ассемблера M80 от Microsoft.

Сорц от дизассемблера (лакомую добычу!) я подарил Андрею Гетало, так что его Monitor Focal под Орель БК-08 также использует этот дизассемблер.

Теперь немного о том, как ориентироваться в сорце. Там есть точка входа DIRU - туда попадает управление, когда пользователь введет директиву U. По метке IKP крутится цикл - дизассемблируется и выводится на экран 14 команд. Подпрограмма DISA - дизассемблирование одной строки в буфер. В этом же сорце находится реализация другой директивы - 'E' - пошаговое выполнение (в версии 2.0 ее еще не было). Однако я так и не довел до совершенства пошаговое выполнение. Уже не помню точно, были ли там явные глюки, но мне оно не нравилось, и я им не пользовался практически никогда. Добавил в монитор просто "для полноты комплекта" и чтобы не отставать от Гетало.

Barmaley_m
07.01.2009, 00:56
Привожу описание остальных директив монитора, восстановленное по изучению исходного текста.

CLS - очистка экрана

C Adr1,Adr2,Adr3 - сравнение двух областей памяти

A Num - вывод числа в шестнадцатеричной и десятичной системах

= Ink,Paper - установка цвета

Y Adr - ввод в память строки текста

S Adr1,Adr2,Byte1,<Byte2>,<Byte3>,<Byte4> - поиск последовательности. Максимальная длина - 4 байта. В качестве элементов последовательности можно указывать символ "?", что означает "любое значение".

< Port - ввод из порта

> Port,Value - вывод в порт

P - выбор страницы ПЗУ. Возможные значения: 0 (бейсик), 1 (альтернативное ПЗУ), 2 (теневое ОЗУ). С выбранной страницей будут работать все остальные команды, читающие из памяти. Запись по адресам 0000-3FFF запрещена независимо от страницы - чтобы предотвратить самозатирание монитора.

L - показать экран. До нажатия любой клавиши отображается содержимое экранной области прерванной программы.

BYTEMAN
08.01.2009, 15:30
Монитор работает с любым спеком, имеющим 16Кб теневухи?

Barmaley_m
08.01.2009, 18:45
Да, но:

1. Требуется чтобы у этого спека теневуха включалась по порту #7F. OUT (#7F),2 - включение теневухи, OUT (#7F),0 - выключение.

2. Требуется чтобы в ПЗУ Бейсика была измененная подпрограмма обработки NMI в точности такого вида:

PUSH AF
LD A,2
OUT (#7F),A
PUSH HL
LD HL,(NMI_AD)
JP (HL)
POP HL
POP AF
RETN

3. Требуется расширенная клавиатура "Орели", иначе не удастся ввести такие важные символы, как ",". Клавиша "запятая" у Орели как раз размещена на тех битах порта #FE, которые в стандартном спеке не используются.

BYTEMAN
10.01.2009, 17:32
Судя по всему, у Байта клава имеет шесть доп. кнопок, которые висят как-раз на доп. битах. Вобщем, проверим :)

bigral
21.09.2017, 18:02
Да, но:

1. Требуется чтобы у этого спека теневуха включалась по порту #7F. OUT (#7F),2 - включение теневухи, OUT (#7F),0 - выключение.

2. Требуется чтобы в ПЗУ Бейсика была измененная подпрограмма обработки NMI в точности такого вида:

PUSH AF
LD A,2
OUT (#7F),A
PUSH HL
LD HL,(NMI_AD)
JP (HL)
POP HL
POP AF
RETN


А какой смысл было помещать в ПЗУ команды следующие после "OUT (#7F),A" ?

Barmaley_m
25.01.2018, 01:14
А какой смысл было помещать в ПЗУ команды следующие после "OUT (#7F),A" ?
Об этом лучше спросить у разработчиков ПЗУ "Орели". Я же могу описать лишь последствия принятого решения.

Можно скопировать содержимое ПЗУ бейсика в теневое ОЗУ и исполнять его оттуда. Тогда команда "out (#7f),a" не будет иметь никаких последствий, и при NMI будут исполняться следующие за ней команды. Появляется возможность передать управление по произвольному адресу при нажатии NMI, а также вернуться из прерывания.

Что касается теневого монитора - то он использует команды POP AF, RETN для возврата из NMI, и это важно, т.к. появляется возможность не размещать в верхних 48К памяти никакого кода, относящегося к монитору, а только лишь 4 байта на стеке - содержимое AF и адрес возврата.