Что ругаешься? Может он так задумывал. :)
Код ведь не соответствует add hl,bc ;)
Вид для печати
Что ругаешься? Может он так задумывал. :)
Код ведь не соответствует add hl,bc ;)
Я всё писал в мнемонике Z80, но для совместимости с ВМ80 (эмулятор всё равно расширенные команды не пропускает - заточен под ВМ80). А приведённая подпрограмма учитывает перенос в старший разряд. Если и adc пойдёт, то напишите. Чуть подзабыл ассемблер, лет 7 со времен писания программ под Скорпион прошло...
Если по условию нужно сложить именно [HL] и [BC] как 16ти битную арифметику, то:
1. Не нужно сбрасывать 'C', т.к. первая команда сложения не учитывает этот флаг.
2. Корректировать старший байт нужно ДО второго сложения.
3. А значит, подпрограмма будет выглядить так:
4. Но если вспомнить таблицу команд ВМ80, то можно просто сделать DAD B и всего делов...Код:PUSH PSW
MOV A,L
ADD C
MOV L,A
MOV A,H
ADC B
MOV H,A
POP PSW
RET
PS Я предлагаю использовать TASM и в родных мнемониках ВМ80.
А вот коды этой подпрограммы и некоторых других я взял то с сайта Shoorickа (если автор не против), конкретнее с архива.
Я уже выкладывал этот док на соседнем форуме, но думаю, что он понадобиться и тут. Это реплика удобной таблички команд 580ВМ80 из журнала Радио, статья про Радио-86РК. Думаю, что в соседней ветке про Радио и Орион она тоже будет полезна. ;)
Я, пожалуй, начну с BIOSа. И так понятно, что это ответственная часть. В самом BIOSе всего несколько ключевых подпрограмм. И начну я с вывода символа.
Вывод символа будет стандартный для Спеца (для поддержки совместимости): 64х25, даже координатная сетка будет та же. Только реализация будет быстрой и с поддержкой цвета. Задумок много, пока только оформлю хотелки. Для начала все будет писаться для именно для стандарт режима, потом допилится и до МХа.
1. Полная совместимость со старыми программами, которые печатают старый текст в режиме КОИ7. А значит будет управляющий код, переключающий КОИ7 и ... (нет, не КОИ8р, я его с линупсов не люблю. :3) ср866. Почему? FAT. Этим все сказано.
2. Полная поддержка цвета. 5/8 для стандарта и 16 для МХа. Символы будут выводиться без проверки на перекрытие байтом атрибутов двух символов. Так что эстетическая сторона полностью на совести программистов. :3
3. Поддержка ESC кодов. Вообще, весь сервис планируется именно через ESC последовательности. Во первых, они стандартны (вроде как), а во вторых - можно придумать много своих, не теряя в совместимости со старыми программами.
Пошерстил журнальчики про Орион, 86РК и Спец и нарыл следующие управляющие коды, которые будет поддерживаться моим выводом символа:
Эта таблица не полная, поэтому призываю к активному обсуждению и дополнению ее. Так же, будет введен код управления направления автосмещения. По умолчанию, это курсор вправо. Но можно будет задавать вверх, вниз, влево и даже отменять автоматическое перемещение. Это позволит быстро рисовать всяческие рамки. ;) Так же, хочется повторить много управляющих кодов из МХа, но там они однобайтовые, что в нашем случае не подходит: у нас полная кодовая страница ср866, за исключением кодом менее 20Н. Давайте обсудим это и я примусь за реализацию.Код:07H - Гудок
08H - Влево, с переходом на строку выше на границе экрана
0AH - Перевод строки со скроллингом
0CH - Домой
0DH - Возврат каретки
18H - Вправо с переходом на следующую строку на границе экрана
19H - Вверх со скроллингом
1AH - Вниз со скроллингом
1FH - Очистка экрана
7FH - Инверсия вывода (выключается повтором кода)
1BH - ESC:
1BH, 41H - Вверх
1BH, 42H - Вниз
1BH, 43H - Вправо
1BH, 44H - Влево
1BH, 45H - Стирание экрана
1BH, 48H - Домой
1BH, 4AH - Стирание ниже курсора
1BH, 4BH - Стирание правее курсора
1BH, 59H, (XXH+20H), (YYH+20H) - Позиция курсора
1BH, 61H - Гашение курсора
1BH, 62H - Восстановление курсора
Ах да, сам вывод символа будет запускаться из ПЗУ и сам фонт так же будет находиться в ПЗУ. Как в стандарте, так и в МХе.
Будет ли Монитор иметь константы в ОЗУ, описывающие геометрию экрана (как в Орионе) - на Орионе это позволяло уменьшать "область экрана драйвера" (вводить служебные строки, не попадающие под искейп-обработку)?
Я правильно понял, будешь идти по возможности близко к стандартам VT-52?
Вот результат моих исследований:
Коды помеченные "+" должны быть реализованы обязательно в минимальном наборе (т.е. вместе с другими, возможно не только они).Код:VT52 compliant codes
====================
Orion Monitor-2 Orion CPM (ACPM) MYZ80 CPM.EXE
--------------- ---------------- -------------
01h ------------ ------------ HOME
04h ------------ ------------ CLS+HOME
07h BELL BELL BELL
+ 08h cursor LEFT cursor LEFT BACKSPACE
+ 09h TAB TAB TAB
+ 0Ah LF LF LF
0Bh ------------ ------------ cursor UP
0Ch HOME ------------ CLS
+ 0Dh CR CR CR
18h cursor RIGHT cursor RIGHT CLREOLN
19h cursor UP cursor UP -----------
1Ah cursor DOWN cursor DOWN CLS+HOME
1Eh ------------ ------------ HOME
+ 1Fh CLS+HOME CLS+HOME CR+LF
+ 7Fh INVERSE ------------ -----------
+ 1Bh+34h='4' ------------ LineWrap ON -----------
+ 1Bh+35h='5' ------------ LineWrap OFF -----------
+ 1Bh+36h='6' ------------ Inverse ON -----------
+ 1Bh+37h='7' ------------ Inverse OFF -----------
1Bh+3Ah=':' ------------ cursor ON CLS
1Bh+3Bh=';' ------------ cursor OFF CLS
+ 1Bh+41h='A' cursor UP cursor UP cursor UP
+ 1Bh+42h='B' cursor DOWN cursor DOWN cursor DOWN
+ 1Bh+43h='C' cursor RIGHT cursor RIGHT cursor RIGHT
+ 1Bh+44h='D' cursor LEFT cursor LEFT cursor LEFT
+ 1Bh+45h='E' CLS CLS CLS+HOME
+ 1Bh+48h='H' HOME HOME HOME
1Bh+49h='I' ------------ set/get ActiveScreen reverse LineFeed
+ 1Bh+4Ah='J' CLRREOSCR CLRREOSCR CLRREOSCR
+ 1Bh+4Bh='K' CLREOLN CLREOLN CLREOLN
1Bh+4Ah='L' ------------ INSROW INSROW
1Bh+4Bh='M' ------------ DELROW DELROW
1Bh+52h='R' ------------ set cursor height DELROW
+ 1Bh+59h='Y'+X+Y cursor position cursor position cursor position
1Bh+64h='d' ------------ ----------- CLRBOSCR
1Bh+65h='e' [ ------------ ----------- cursor ON
1Bh+66h='f' ------------ ----------- cursor OFF
1Bh+6Ah='j' ------------ ----------- save cursor
1Bh+6Bh='k' ------------ ----------- restore cursor position
1Bh+6Ch='l' ------------ ----------- clear line
1Bh+6Fh='o' ------------ ----------- CLRBOLN
1Bh+70h='p' ------------ ----------- Inverse ON
1Bh+71h='q' ------------ ----------- Inverse OFF
1Bh+76h='v' ------------ ----------- line wrap on
1Bh+77h='w' ------------ ----------- line wrap off
Использование только "+"-помеченных кодов позволило мне написать коммандер (исходники на сайте) работающий не только как в "классическом" MS-DOS эмуляторе CP/M, так и на всех VT-52 версиях CP/M Ориона. Кроме того, этот коммандер корректно отображается в RS-232 терминальных клиентах, понимающих VT52 (например стандартном виндовозном HyperTerm). Этот результат на Орионе больше не одним псевдографическим коммандером не достигнут - все прочие рисуют по RS-232 кашу даже при включенной эмуляции VT52.
Файл во вложении - описание Esc-последовательностей драйвера ACPM Ориона. Оконные функции реализовывались через коды расширенного драйвера VT-52 Ориона - последовательностью Esc+W (и не только: стандартные ESC,'L' , ESC,'M' внутри окна дают вертикальный скроллинг содержимого окна вверх/вниз). Esc-W в Орионе реализовано не совместимо с "оконными" искейпами эмулятора MyZ80, но оконные Esc-расширения стандарта VT-52 и не прижились в "стандартных" CP/M приложениях - не используются почти нигде, и как бы это помягче сказать - вообще "недостандартизованы" (неполны, неудобны, не совпадают от мануала к мануалу).
Будут ли векторизированы в ОЗУ подпрограммы Монитора, адрес фонта в некоторой ячейке и т.д.? Это даст подключать пользовательские драйвера и фонты... Например для CР/M, 64х25 - это мало, неудобно. Иногда надо 64х24, и почти всегда надо 80х25, т.е. по любому в CP/М придется подгружаемый драйвер иметь.