PC-01 Lviv
http://pc01.lviv.ua/forum/

DprToLvt (PasToLvt)
http://pc01.lviv.ua/forum/viewtopic.php?f=20&t=153
Page 1 of 15

Author:  sas9568635 [ 04 Jun 2012, 22:06 ]
Post subject:  DprToLvt (PasToLvt)

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

Author:  liberation [ 04 Jun 2012, 22:45 ]
Post subject:  Re: DprToLvt (PasToLvt)

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

upd. Или эта любопытная задумка ценна прежде всего самой возможностью ее реализации? Искусство, так сказать, ради искусства? :wink:

Author:  sadfsdfsdaf [ 05 Jun 2012, 00:01 ]
Post subject:  Re: DprToLvt (PasToLvt)

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

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

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

P.S. ответ на вопросы есть здесь:
http://www.amazon.com/Advanced-Compiler ... 1558603204

Author:  liberation [ 05 Jun 2012, 00:29 ]
Post subject:  Re: DprToLvt (PasToLvt)

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

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

2upd. "Самолет хорошо, пароход хорошо, а олени лучше!", - может, все-таки Форт? :wink:

Author:  sadfsdfsdaf [ 05 Jun 2012, 00:53 ]
Post subject:  Re: DprToLvt (PasToLvt)

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

тема раскрыта?

Author:  liberation [ 05 Jun 2012, 01:01 ]
Post subject:  Re: DprToLvt (PasToLvt)

Quote:
для хостовой реализации Форт - это единственно возможный вариант (тем более что во встроенном бейсике есть и библиотека с плавающей точкой и графика и т.п. - достаточно просто их оттуда выковырять)
Меня терзают смутные подозрения... Вроде бы я Вас уже спрашивал про сохранившиеся записи по дизассемблированию стандартного ПЗУ ПК-01? Что-то найти удалось?
Quote:
и это при том, что _уже_ можно пользоваться компиляторами для однокристалок и/или гнусью.
А какой-нибудь наглядный пример можно?
Quote:
тема раскрыта?
Для меня более чем! Уже не на шутку спать хочется. :D

Author:  sas9568635 [ 05 Jun 2012, 01:15 ]
Post subject:  Re: DprToLvt (PasToLvt)

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

Попытаюсь рассказать свою задумку словами :-) насколько это возможно… :-)
Создаешь новый проект в дельфи (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:
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.

Author:  sas9568635 [ 05 Jun 2012, 10:23 ]
Post subject:  Re: DprToLvt (PasToLvt)

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

Author:  b2m [ 05 Jun 2012, 10:32 ]
Post subject:  Re: DprToLvt (PasToLvt)

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

А если к твоей системе вместо отлаживаемой программы добавить дешифрацию команд i8080, то ты получишь вполне полноценный эмулятор. :)
Quote:
2. Незнаю как реализовать некоторые команды в Дельфи, например PUSH и POP? Помогите.
Например так:
Code:
 {PUSH B} //        'stack <- BC',
Procedure PUSHB;
begin
  RgSP := RgSP - 1;
  SetMem(RgSP, RgB);
  RgSP := RgSP - 1;
  SetMem(RgSP, RgC);
end;
Я намеренно заменил твоё RAM[RgSP] := ... на процедуру, поскольку все обращения к памяти нужно делать через общую процедуру, учитывающую раскладку памяти, и обновляющую точки экрана, если это необходимо.

Author:  sas9568635 [ 05 Jun 2012, 10:37 ]
Post subject:  Re: DprToLvt (PasToLvt)

Quote:
В исходном сообщении речь идёт про компилятор, а в примере в коде реализован интерпретатор (эмулятор).
Задумка в том, что в среде Дельфи программа будет работать как в интерпретаторе, а после "палировки" ее, можно будет компилировать отдельной утилитой в ПК-01. Понятно, что абсолютно все, что можна наваять в дельфи никакая утилита скомпилировать под ПК-01 (ЛВТ) не сможет, поэтому нужно будет в среде Дельфи окончальный вариант программы "подтачивать" (ну или сразу писать с таким расчетом) под то чтобы его можно было скомпилировать утилитой.
Ну это похоже как раньше было "интерпретатор-бейсика" и "Турбо-бейсик".

Author:  sas9568635 [ 05 Jun 2012, 10:54 ]
Post subject:  Re: DprToLvt (PasToLvt)

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

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

Author:  b2m [ 05 Jun 2012, 10:59 ]
Post subject:  Re: DprToLvt (PasToLvt)

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

В дальнейшем, если автор LvivStudio захочет, можно будет объеденить LvivStudio, твой ассемблер, и мой эмулятор в одну IDE, удобство пользования которой не будет уступать Дельфи. Надо будет только, чтобы твой ассемблер генерировал отладочную информацию, которую смог бы использовать LvivStudio, передавая её через определённый интерфейс отладки моему эмулятору. Этот интерфейс содержит все возможности управления отладкой внутри эмулятора (выдача/установка регистров, памяти, точек останова). А автору LvivStudio нужно будет сделать подсветку точек останова и текущей строки в редакторе, и выдачу/редактирование регистров, памяти и портов.

Author:  sas9568635 [ 05 Jun 2012, 11:14 ]
Post subject:  Re: DprToLvt (PasToLvt)

Quote:
Я думаю, будет даже гораздо быстрее, чем надо, и рано или поздно ты задумаешься о том, как сделать выполнение близким по скорости к реальному....
Это конечно хорошо. Задержки писать думаю не проблема...
Quote:
А если к твоей системе вместо отлаживаемой программы добавить дешифрацию команд i8080, то ты получишь вполне полноценный эмулятор. :)
А поточнее можно?...
Quote:
Я намеренно заменил твоё RAM[RgSP] := ... на процедуру, поскольку все обращения к памяти нужно делать через общую процедуру, учитывающую раскладку памяти, и обновляющую точки экрана, если это необходимо.
Спасибо за содержательные ответы. Я так понял мне еще очень внимательно надо изучить принцип работы этих команд и стека и т.д. слава богу, думаю это можно будет проследить например в том же "Эмуляторе 3000". Спасибо.

Author:  liberation [ 05 Jun 2012, 11:23 ]
Post subject:  Re: DprToLvt (PasToLvt)

Quote:
В дальнейшем, если автор LvivStudio захочет, можно будет объеденить LvivStudio, твой ассемблер, и мой эмулятор в одну IDE, удобство пользования которой не будет уступать Дельфи.
Ого, идет Кутузов бить французов! Дмитрий, у Вас же есть интересный ассемблер на js, может быть, стоит его развивать? И Студию можно будет перепилить под работу в Вебе. В результате получим аналог Cloud9 IDE для восьмиразрядных машин. Можно будет кодить хоть с утюга, главное чтобы доступ в Инет был. И даже на iPad'е! :wink:

Author:  Zelya [ 05 Jun 2012, 11:33 ]
Post subject:  Re: DprToLvt (PasToLvt)

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

Page 1 of 15 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/