DprToLvt (PasToLvt)

Все о разработке ПО для ПК-01,02 "Львов" на современных платформах
Post Reply
sas9568635
Posts: 372
Joined: 20 Apr 2012, 16:00
Location: Конотоп

DprToLvt (PasToLvt)

Post by sas9568635 »

Написанные мной дизассемблер и ассемблер, все это «промежуточная фигня» по сравнению с Мировой революцией… :-) На них очень скоро я поставлю окончательную «точку».
Как я уже писал, что хотелось бы «прогнуть» среду Delphi (Pascal) под компиляцию для ПК-01 Львов.
Потихоньку начинаю пытаться реализовывать это.
Так как я не являюсь профессиональным программистом у меня естественно возникают вопросы.
Рассчитываю на вашу поддержку.
Хочу реализовать модуль в дельфи, где регистры и каждая команда процессора КР580 будет переведена («окутана») процедурой Дельфи, например:
Разметка регистров будет позаимствованная с исходников эмулятора Антона Игнатичева (http://lvovpc.cu.cc/)

Code: Select all

  RgC:   byte;
  RgB:   byte;
  RgE:   byte;
  RgD:   byte;
  RgL:   byte;
  RgH:   byte;
  RgA:   byte;
  RgF:   byte;
  RgSP:  word; //Указатель стека
  RgPC:  word; // Счетчик команд
  RgBC:  word absolute RgC;
  RgDE:  word absolute RgE;
  RgHL:  word absolute RgL;
  RgPSW: word absolute RgA; 	// Флаги
А команды ассемблера будут «окутаны» и подточены для возможности выполнения их в дельфи т.е. вот так вот:

Code: Select all

Procedure _NOP;
begin
end;

 {LXI B} //        'B <-...',
Procedure LXIB(w:word);
begin
RgBC:=w;
end;

//{STAX B}   'A --> Mem(BC)' 02:
Procedure STAXB(b:byte);
begin
RAM[RgBC]:=b;
end;

// INX B {INX B}   'BC=BC+1' C03:
Procedure INXB;
begin
RgBC:=RgBC+1;
end;

// {INR B}   'B=B+1'
Procedure INRB;
begin
RgB:=RgB+1;
end;

и т.д.
Это сделано для того чтобы каждую команду асма можно было выполнять как процедуру дельфи и тоже самое делать с регистрами…
Вопрос вот в чем:

1. Будет ли хватать быстродействия современных машин, если программу написать на таких процедурах, и чтобы она выполняясь не медленнее, чем на реальном асме (кодах) ПК-01?

2. Незнаю как реализовать некоторые команды в Дельфи, например PUSH и POP? Помогите.
User avatar
liberation
Posts: 1405
Joined: 11 Aug 2008, 17:05
Location: Украина
Contact:

Re: DprToLvt (PasToLvt)

Post by liberation »

sas9568635 wrote:Как я уже писал, что хотелось бы «прогнуть» среду Delphi (Pascal) под компиляцию для ПК-01 Львов.
Безумству храбрых поем мы песню! Но почему все-таки Дельфи? Под CP/M80 был ТурбоПаскаль 3.0, который отлично работал на ПК-02 с Z80. Сам по себе он был удобен в работе, выдавал приличный код (хотя рантайм был около 10-11 кб), но по быстродействию все равно пасовал перед ассемблером. Чтобы написать что-либо шустрое, нужно было обращаться к inline-вставкам машинных кодов. К чему это я пишу, - может, не стоит мучить старичка ПК-01? Какой результат мы ожидаем? Может, все-таки лучше ориентироваться на Си, как-никак этот язык ближе к железу, чем Паскаль при всем уважении к нему. :)

upd. Или эта любопытная задумка ценна прежде всего самой возможностью ее реализации? Искусство, так сказать, ради искусства? :wink:
Carthago delenda est, Carthaginem delendam esse
sadfsdfsdaf
Posts: 227
Joined: 07 Dec 2010, 16:54

Re: DprToLvt (PasToLvt)

Post by sadfsdfsdaf »

честно говоря, мне раньше казалось, что я в жизни видел уже всё.... похоже, что я ошибался.....

to sas9568635:
В исходном сообщении речь идёт про компилятор, а в примере в коде реализован интерпретатор (эмулятор). Следовало бы определиться для кросс-компиляции с целевой и гостевой машинами.

BTW, liberation прав, был в своё время прекрасный express pascal под CP/M (я его на Корветах видел), как, впрочем, и Small C ... было даже такое поделие ...

P.S. ответ на вопросы есть здесь:
http://www.amazon.com/Advanced-Compiler ... 1558603204
User avatar
liberation
Posts: 1405
Joined: 11 Aug 2008, 17:05
Location: Украина
Contact:

Re: DprToLvt (PasToLvt)

Post by liberation »

Добавлю пару слов. Что именно из Дельфи нам нужно? Я слабо ориентируюсь в этой среде, но понимаю, что библиотека визуальных компонент нам точно не нужна, да и средства работы с БД тоже вряд ли будут востребованы. Что остается? Управляющие структруры языка? ООП? Типы данных, которые Паскаль поддерживает "искаропки"? Надо уточнить приоритеты. :)

upd. Опирясь на собственный опыт использования TP 3.0 на ПК-02, могу сказать, что больше всего использовал работу с вещественными числами, обработку строк и работу с файлами. Возможно, без всего этого можно было обойтись, если бы для "Львова" существовали соответствующие библиотеки на ассемблере. Хотя возможность спокойно создавать переменные без оглядки на число регистров тоже очень радовала. :D

2upd. "Самолет хорошо, пароход хорошо, а олени лучше!", - может, все-таки Форт? :wink:
Carthago delenda est, Carthaginem delendam esse
sadfsdfsdaf
Posts: 227
Joined: 07 Dec 2010, 16:54

Re: DprToLvt (PasToLvt)

Post by sadfsdfsdaf »

Если рассматривать вопрос с практической стороны, то:
для хостовой реализации Форт - это единственно возможный вариант (тем более что во встроенном бейсике есть и библиотека с плавающей точкой и графика и т.п. - достаточно просто их оттуда выковырять)
для кросс-компилятора - тут можно навернуть всё что угодно, вплоть до супероптимизатора на все 64К программы в памяти....

и это при том, что _уже_ можно пользоваться компиляторами для однокристалок и/или гнусью.
а вот по этому http://www.cpm.z80.de/small_c.html есть даже книга на русском языке:
681.3.06 Х38
Хендрикс, Д.
Компилятор языка Си для микроЭВМ [Текст] = The Small-C Handbook : пер. с англ. / Д. Хендрикс; Ред. Б.А. Кузьмин. - . - . - . - М. : Радио и связь, 1989. - . - 240 с. : ил., прил.. - . - . - Библиогр.. - . - ISBN 5-256-00161-2 : 00.80 р.

тема раскрыта?
User avatar
liberation
Posts: 1405
Joined: 11 Aug 2008, 17:05
Location: Украина
Contact:

Re: DprToLvt (PasToLvt)

Post by liberation »

sadfsdfsdaf wrote:для хостовой реализации Форт - это единственно возможный вариант (тем более что во встроенном бейсике есть и библиотека с плавающей точкой и графика и т.п. - достаточно просто их оттуда выковырять)
Меня терзают смутные подозрения... Вроде бы я Вас уже спрашивал про сохранившиеся записи по дизассемблированию стандартного ПЗУ ПК-01? Что-то найти удалось?
sadfsdfsdaf wrote:и это при том, что _уже_ можно пользоваться компиляторами для однокристалок и/или гнусью.
А какой-нибудь наглядный пример можно?
sadfsdfsdaf wrote:тема раскрыта?
Для меня более чем! Уже не на шутку спать хочется. :D
Carthago delenda est, Carthaginem delendam esse
sas9568635
Posts: 372
Joined: 20 Apr 2012, 16:00
Location: Конотоп

Re: DprToLvt (PasToLvt)

Post by sas9568635 »

(Написанные в этой и других темах сообщения почитаю и вникну завтра, на свежую голову)

Попытаюсь рассказать свою задумку словами :-) насколько это возможно… :-)
Создаешь новый проект в дельфи (DPR,pas)
Подключаешь в него модули «КР580», «ПЗУ ПК-01 Львов» и «экран ПК-01 Львов», (для начала хотябы только такие модули), которые эмулируют … понятно что… :-) (скорее всего это будут DLL- модули, вообщем как будет получаться…)… модуль «экран ПК-01 Львов» будет состоять из формы-дельфи, а в ней «подобие» экрана Львов (компонент TPaintBox), и обращение к экрану соответственно будет такое же как (аналог IN OUT) и в ПК-01.
Итак. Программа написанная на дельфи будет управлять «КР580», «ПЗУ ПК-01 Львов» и «экран ПК-01 Львов», словно программа написанная в самом ПК-01. Это понатно! Так ведь? :-)
Далее.
Для реальной компиляции, в реальные коды КР580, необходимо будет заменять дельфийские структуры и процедуры, на такие, которые будут заложены в возможность их к компиляции в машкоды КР580. Т.е. это будут команды КР580, А ТАКЖЕ некоторые структуры, которые могут смело переводится на машкоды КР580 (в несколько команд КР580)

После чего их утилита-компилятор сможет их перевести в LVT-формат.

При нежелании переводить на машкоды КР580 :-) можно просто скопилировать в обычный экзешник.. :-) (ради шутки)

Основная соль этого всего:
Удобство написания программ в среде дельфи в отличии от например, той же LvivStudio :-)
Возможность отрабатывать пошагово, наблюдая за всем, что только можно (регистрами, флагами процессора и т.д.), причем при необходимости, а такое бывает часто при отладке, можно в программе их изменять «в наглую» присвоив им нужное значение, причем в любом месте программы. (Например RgSP:=RgSP+1; RgHL:=$1500; FlagS:=False и т.д.)
Никаких границ по памяти, правда до последнего момента :-) когда их утилита-компилятор будет компилировать в LVT-формат.
Использовать всю мощь дельфи и ее процедуры и функции, как вспомогательные, в «гремучей смеси» с обычными (возможными к компиляции в КР580) командами.
Может еще чего забыл… :-)

Вот огрызок-черновик от части программы которая написана в среде дельфи и ее компиляция в КР580, будет очень даже реальна.
Как бы я хотел уже сейчас использовать такое для написания и компиляции программ для ПК-01.
Может что-то подобное уже есть? Где?

Code: Select all

program PastoLV;//
uses
  PasToLVUnit in 'PasToLVUnit.pas',
  I8080 in 'I8080.PAS';

Label STARTj81A0,j81C1;
var
d84B0,d84B1………………… :AddrDB; // метки под данные

Procedure c80D4;forward;
Procedure c80D4;
Begin
RgHL:=d85F4;            // LXI H, d85F4  ;HL <-...
SHLD($80D5);              //  SHLD $80D5    ;L-->Mem(...),H-->Mem(...+1)
RET;
end;

Procedure cF82D;forward;
Procedure cF82D;
Begin
………………..
end;

begin
BEGINPROGRAM:=$81A0;

d84B0:=SetAddrDB; // привязать к МЕТКЕ данных адрес Данных  (это как на асме метка= «d84B0:»
addDB($F2);  // Установить (добавлять) данные  (это как на асме = «.DB $F2»


d84B1:=SetAddrDB; // привязать к МЕТКЕ данных адрес Данных, это как на асме =» d84B1: .db 46,$CA,$4F, $40»
addDB(46); addDB($CA);addDB($4F); addDB($40);
….

STARTj81A0:
RgSP:= $AFFF;                // LXI SP, $AFFF ;SP <-...
c83B4;                       //CALL c83B4    ;Безусловный вызов ПП
RgHL:=d85F4;                 // LXI H, d85F4  ;HL <-...
SHLD($80D5);                //  SHLD $80D5    ;L-->Mem(...),H-->Mem(...+1)
c80D4;                       //   ;Безусловный вызов ПП
……
……………
j81C1:
RgDE:=RgDE-1;               //    DCX D         ;DE=DE-1
RgA:=RgE;                   //     MOV A,D       ;A=D

if FlagZ then goto j81C1;  //JNZ j81C1     ;БП, если Z=0
c8b4;                      // CALL c83B4    ;Безусловный вызов ПП
RgHL:=$4806;                //LXI H, $4806  ;HL <-...
RgE:=$0C;                   //MVI E, $0C    ;E <-...Загрузка байта данных ... в приемник E
RgBC:=$03D1;                       //LXI B, $03D1  ;BC <-...

………………
end.
sas9568635
Posts: 372
Joined: 20 Apr 2012, 16:00
Location: Конотоп

Re: DprToLvt (PasToLvt)

Post by sas9568635 »

liberation wrote:Под CP/M80 был ТурбоПаскаль 3.0, который отлично работал на ПК-02 с Z80.
Ссылку кинь, посмотрю, что это, если оно конечно запустится подвии, уменя например ( PC-01 Lvov emulator version 1.05 Copyright (c) Anton V. Ignatichev 1999-2002) под вин на ноуте не запускается видимо из-за граф.режима....
liberation wrote: Чтобы написать что-либо шустрое, нужно было обращаться к inline-вставкам машинных кодов.
Дак все таки... Если я напишу таким образом быстродествие будет меньше чем на ПК-01 ?
liberation wrote:Может, все-таки лучше ориентироваться на Си, как-никак этот язык ближе к железу, чем Паскаль при всем уважении к нему. :)
Язык Си мне попросту незнаком, реализовываю, то что знаю...
liberation wrote: Или эта любопытная задумка ценна прежде всего самой возможностью ее реализации? Искусство, так сказать, ради искусства? :wink:
Я думаю, что если это реализовать, даже хоть как-то, то можно это будет использовать это на всю катушку, создавать модули (библиотеки) процедур и функций разного назначения, где потом можно легко писать программы и легким нажатием скомпилировать в достаточного оптимальный код для ПК-01. Оптимальный код нужно будет закладывать в процедуры (и модули процедур unit)? вообщем, что-то подобное макроАсму, но в среде Дельфи... и я думаю это будет круче.
b2m
Posts: 115
Joined: 29 Mar 2012, 21:35
Contact:

Re: DprToLvt (PasToLvt)

Post by b2m »

sas9568635 wrote:1. Будет ли хватать быстродействия современных машин, если программу написать на таких процедурах, и чтобы она выполняясь не медленнее, чем на реальном асме (кодах) ПК-01?
Я думаю, будет даже гораздо быстрее, чем надо, и рано или поздно ты задумаешься о том, как сделать выполнение близким по скорости к реальному. Т.е. во всех процедурах нужно будет добавить увеличение глобального счётчика тактов, а где-то в глобальном цикле надо будет сделать пересчёт тактов в реальное время и задержку на это время (за вычетом времени, ушедшего на выполнение).

А если к твоей системе вместо отлаживаемой программы добавить дешифрацию команд i8080, то ты получишь вполне полноценный эмулятор. :)
sas9568635 wrote:2. Незнаю как реализовать некоторые команды в Дельфи, например PUSH и POP? Помогите.
Например так:

Code: Select all

 {PUSH B} //        'stack <- BC',
Procedure PUSHB;
begin
  RgSP := RgSP - 1;
  SetMem(RgSP, RgB);
  RgSP := RgSP - 1;
  SetMem(RgSP, RgC);
end;
Я намеренно заменил твоё RAM[RgSP] := ... на процедуру, поскольку все обращения к памяти нужно делать через общую процедуру, учитывающую раскладку памяти, и обновляющую точки экрана, если это необходимо.
sas9568635
Posts: 372
Joined: 20 Apr 2012, 16:00
Location: Конотоп

Re: DprToLvt (PasToLvt)

Post by sas9568635 »

sadfsdfsdaf wrote: В исходном сообщении речь идёт про компилятор, а в примере в коде реализован интерпретатор (эмулятор).
Задумка в том, что в среде Дельфи программа будет работать как в интерпретаторе, а после "палировки" ее, можно будет компилировать отдельной утилитой в ПК-01. Понятно, что абсолютно все, что можна наваять в дельфи никакая утилита скомпилировать под ПК-01 (ЛВТ) не сможет, поэтому нужно будет в среде Дельфи окончальный вариант программы "подтачивать" (ну или сразу писать с таким расчетом) под то чтобы его можно было скомпилировать утилитой.
Ну это похоже как раньше было "интерпретатор-бейсика" и "Турбо-бейсик".
sas9568635
Posts: 372
Joined: 20 Apr 2012, 16:00
Location: Конотоп

Re: DprToLvt (PasToLvt)

Post by sas9568635 »

liberation wrote:Добавлю пару слов. Что именно из Дельфи нам нужно?
Дельфи нам нужен ВЕСЬ :-) ну или как захочешь... :-) КАК ВСПОМАГЕТЕЛЬНЫЙ ИНСТРУМЕНТ ДЛЯ НАПИСАНИЯ И "ПАЛИРОВКИ" ПРОГРАММЫ!
Ну допустим ты пишиешь такое на дельфи: Скажем процедуру вывода спрайта...

Code: Select all

For x:=0 to 34 do begin
For y:=0 to 14 do begin
OUT($C2) // аналоги асм команд и портов ПК-01
.....
OUT($D2) // аналоги асм команд и портов ПК-01
.....
IN ($D2) // аналоги асм команд и портов ПК-01
....
MVIA($00)// аналоги асм команд и портов ПК-01
OUT $C2 // аналоги асм команд и портов ПК-01
....
end; end;

Так пишешь целую программ... подобие как Паскаль (Дельфи) с асм вставками...
Отпалировал, Запустил, работает! Далее, аккуратно и постепенно заменяешь процедуры конструкции котороем не могут быть скомпилированы, на аналогичные (асмовские) по ходу проверяя запуском проги правильность "подмены"...
liberation wrote:"Самолет хорошо, пароход хорошо, а олени лучше!", - может, все-таки Форт? :wink:
Ну не знаю Я "ФОРТы" "ЛИСПы" "СИшки" еще чего-то там...
ну... ...не виновата Я, он сам... :-) (из фильма "БР")
b2m
Posts: 115
Joined: 29 Mar 2012, 21:35
Contact:

Re: DprToLvt (PasToLvt)

Post by b2m »

sas9568635 wrote:Возможность отрабатывать пошагово, наблюдая за всем, что только можно (регистрами, флагами процессора и т.д.), причем при необходимости, а такое бывает часто при отладке, можно в программе их изменять «в наглую» присвоив им нужное значение, причем в любом месте программы.
Но ведь это всё есть и в отладчике эмулятора!
Я предлагаю тебе сконцентрироваться на разработке ассемблера, потому что если твой ассемблер будет генерировать листинг в определённом формате, то его можно будет "подключить" к отладчику, и вместо дизассемблированного кода, в котором нет меток, ты увидишь текст твоей программы из листинга, со всеми метками и комментариями.

В дальнейшем, если автор LvivStudio захочет, можно будет объеденить LvivStudio, твой ассемблер, и мой эмулятор в одну IDE, удобство пользования которой не будет уступать Дельфи. Надо будет только, чтобы твой ассемблер генерировал отладочную информацию, которую смог бы использовать LvivStudio, передавая её через определённый интерфейс отладки моему эмулятору. Этот интерфейс содержит все возможности управления отладкой внутри эмулятора (выдача/установка регистров, памяти, точек останова). А автору LvivStudio нужно будет сделать подсветку точек останова и текущей строки в редакторе, и выдачу/редактирование регистров, памяти и портов.
sas9568635
Posts: 372
Joined: 20 Apr 2012, 16:00
Location: Конотоп

Re: DprToLvt (PasToLvt)

Post by sas9568635 »

b2m wrote:Я думаю, будет даже гораздо быстрее, чем надо, и рано или поздно ты задумаешься о том, как сделать выполнение близким по скорости к реальному....
Это конечно хорошо. Задержки писать думаю не проблема...
b2m wrote: А если к твоей системе вместо отлаживаемой программы добавить дешифрацию команд i8080, то ты получишь вполне полноценный эмулятор. :)
А поточнее можно?...
b2m wrote:Я намеренно заменил твоё RAM[RgSP] := ... на процедуру, поскольку все обращения к памяти нужно делать через общую процедуру, учитывающую раскладку памяти, и обновляющую точки экрана, если это необходимо.
Спасибо за содержательные ответы. Я так понял мне еще очень внимательно надо изучить принцип работы этих команд и стека и т.д. слава богу, думаю это можно будет проследить например в том же "Эмуляторе 3000". Спасибо.
User avatar
liberation
Posts: 1405
Joined: 11 Aug 2008, 17:05
Location: Украина
Contact:

Re: DprToLvt (PasToLvt)

Post by liberation »

b2m wrote:В дальнейшем, если автор LvivStudio захочет, можно будет объеденить LvivStudio, твой ассемблер, и мой эмулятор в одну IDE, удобство пользования которой не будет уступать Дельфи.
Ого, идет Кутузов бить французов! Дмитрий, у Вас же есть интересный ассемблер на js, может быть, стоит его развивать? И Студию можно будет перепилить под работу в Вебе. В результате получим аналог Cloud9 IDE для восьмиразрядных машин. Можно будет кодить хоть с утюга, главное чтобы доступ в Инет был. И даже на iPad'е! :wink:
Carthago delenda est, Carthaginem delendam esse
User avatar
Zelya
Site Admin
Posts: 1071
Joined: 24 Jul 2008, 12:05

Re: DprToLvt (PasToLvt)

Post by Zelya »

b2m wrote:
sas9568635 wrote: LvivStudio, передавая её через определённый интерфейс отладки моему эмулятору. Этот интерфейс содержит все возможности управления отладкой внутри эмулятора (выдача/установка регистров, памяти, точек останова).
Вот-вот! И я про это уже давно говорю! Пора нам, Дмитрий, кооперироваться! Согласен поддержать любой предложенный интерфейс. Как я это видел - общение через порт, LvivStudio "дергает" методы, типа: устнови брикпоинты на адресса, дай занчение, не остановились ли мы где-то и т.п.
Post Reply

Who is online

Users browsing this forum: No registered users and 0 guests