Текстовый эмулятор Pseudo-86RK

Советский компьютер Радио-86РК (1986) и его клоны

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Текстовый эмулятор Pseudo-86RK

Post by Shaos »

Задумал я тут текстовый эмулятор Pseudo-86RK (как часть nedoPC SDK), чтобы можно было CI/CD наладить на гитлабе, который бы прогонял тесты при изменениях каких-то в моих будущих программульках для РК (и вообще для 8080/8085 кода) и сравнивал бы вывод с эталонным. Вариант по умолчанию будет работать с ncurses, чтобы можно было менять местоположение курсора и раскрашивать текст, однако будет вариант сборки чисто текстовый при котором вывод через монитор будет делаться в stdout, причём каждая строка (опционально) может иметь префикс с количеством тактов, прошедших на момент начала этой строки, чтобы можно было точно считать время потраченное на вычисления (например декодирование SHAFF). Потом можно будет ещё сделать вариант сборки для доса (работа с текстовым экраном через conio) - просто чтобы было :lol:

P.S. Результат: https://gitlab.com/nedopc/sdk/-/tree/master/pseudo-86rk
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Текстовый эмулятор Pseudo-86RK

Post by Shaos »

Псевдографика там тоже будет т.к. UTF-8 может такие символы показать ▓█▀▄█▓:
02584
E29684
None


-------------
02580
E29680
None


-------------
02588
E29688
None


-------------
0258C
E2968C
None


-------------
02590
E29690
None


-------------
02596
E29696
None
&#9622

-------------
02597
E29697
None


-------------
02598
E29698
None


-------------
02599
E29699
None


-------------
0259A
E2969A
None


-------------
0259B
E2969B
None


-------------
0259C
E2969C
None


-------------
0259D
E2969D
None


-------------
0259E
E2969E
None


-------------
0259F
E2969F
None


-------------
02593
E29693
None

Источник: https://www.isthisthingon.org/unicode/index.phtml?page=02&subpage=5&hilite=02595#Block%20Elements

Надо ещё найти стрелочки (они точно были), человечка и яблоко :mrgreen:

P.S. Ещё там есть такое:
025A2
E296A2
None


-------------
025A4
E296A4
None

(это для моих шрифтовых расширений)

P.P.S. Вот этот советский символ тоже надо вместо доллара взять :roll:
¤

U+00A4 Currency Sign

System Representation (click value to copy)
Nº 164
UTF-8 C2 A4
UTF-16 00 A4
UTF-32 00 00 00 A4
URL-Quoted %C2%A4
HTML hex reference ¤
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Текстовый эмулятор Pseudo-86RK

Post by Shaos »

Стрелки (они правда худосочные):
02190
E28690
81A9


-----------
02191
E28691
81AA


-----------
02192
E28692
81A8


-----------
02193
E28693
81AB

Вертикальные и горизонтальные палки разной толщины:
02500
E29480
849F


-----------
02501
E29481
84AA


-----------
02502
E29482
84A0


-----------
02503
E29483
84AB


-----------
025AC
E296AC
None

Яблоко (правда красное):

Code: Select all

Unicode Character (U+1F34E):

HTML Entity:	

    🍎
    🍎

UTF-8 Encoding:	0xF0 0x9F 0x8D 0x8E
Источник: https://www.compart.com/en/unicode/U+1F34E

Сам символ яблока сюда вставить не могу, т.к. у MySQL из-за него сносит крышу, а вот терминал моего дебияна этот символ замечательно показывает:
Screenshot from 2024-03-02 12-56-55.png
P.S. Ещё вот такие стрелочки есть: ← ↑ → ↓

Code: Select all

←
↑
→
↓
Это из блока вручную написанных символов: https://www.compart.com/en/unicode/block/U+FF00
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Alikberov
Doomed
Posts: 347
Joined: 14 Oct 2019 18:10
Location: Tashkent

Re: Текстовый эмулятор Pseudo-86RK

Post by Alikberov »

Shaos wrote:Сам символ яблока сюда вставить не могу, т.к. у MySQL из-за него сносит крышу
Вот ведь, а!?
Вроде бы "Проблему 2000" уже как-то решали ведь. Но, нашлось "яблоко раздора"! :surprised:
(Сколько нового софта ни пишут, а багов - целый клоповник!)
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Текстовый эмулятор Pseudo-86RK

Post by Shaos »

Ну это видать сильно расширенный юникод с очень большим номером :lol:

P.S. Вот из той же серии цветной человечек :)

https://www.compart.com/en/unicode/U+1F57A
Screenshot from 2024-03-02 13-10-48.png
P.P.S. Под спойлером сообщение об ошибке при попытке заслать текст с этим человечком в форум:

 ERROR
Screenshot from 2024-03-02 13-19-41.png

You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
vital72
Senior
Posts: 181
Joined: 17 Jun 2014 04:29
Location: 93.80.157.217

Re: Текстовый эмулятор Pseudo-86RK

Post by vital72 »

может версия мускуля старая? когда они тока ввели поддержку UTF-8, они под эти символы выделили только три байта... только ТРИ, млять, БАЙТА!!! какому "гению" в голову пришло, что для кодирования UTF-8 надо только три байта, какую документацию он читал? уже позже, когда поняли, что лоханулись, добавили ещё один тип данных -- utf8mb4, где уже под символ UTF-8 выделено 4 байта.
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Текстовый эмулятор Pseudo-86RK

Post by Shaos »

vital72 wrote:может версия мускуля старая? когда они тока ввели поддержку UTF-8, они под эти символы выделили только три байта... только ТРИ, млять, БАЙТА!!! какому "гению" в голову пришло, что для кодирования UTF-8 надо только три байта, какую документацию он читал? уже позже, когда поняли, что лоханулись, добавили ещё один тип данных -- utf8mb4, где уже под символ UTF-8 выделено 4 байта.
Да - на этом виртуальном серваке староватая лампа стоит, надо наверное обновиться...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Текстовый эмулятор Pseudo-86RK

Post by Shaos »

Эмулятор планирую строить на основе своего C++ класса Processor8080, который я начал писать ещё в 1994 году (т.е. этому коду уже 30 лет!!!), первую рабочую версию выкатил в 1996 и далее сделал ряд улучшений, включая активность 2012 года по причёсыванию наших эмуляторов. См. https://gitlab.com/nedopc/sdk/-/blob/master/common/proc8080.cpp

Code: Select all

/*  proc8080.cpp - class Processor8080 for emulation of 8080/8085.

    Part of nedoPC SDK (software development kit for DIY and RETRO computers)

    Copyright (c) 1994-2024, Alexander Shabarshin <me@shaos.net>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "proc8080.h"

/*
    02 Apr 1994 - Start of implementation
    14 Oct 1996 - First version for Borland-C++ 2.0
    20 Jun 1997 - Some fixes
    17 Jan 1998 - Port to Watcom-C/C++ 10.0
    26 Sep 2000 - Some fixes
    17 Oct 2006 - Some modifications for OrioniX
    26 Dec 2006 - Released under GPLv2 through SourceForge
    18 Nov 2007 - Added timings for 8085 + some fixes
    26 Aug 2012 - Fixed DAA and flag AC
    02 Mar 2024 - Re-licensed under GPLv3
*/
Этот класс например уже использовался в моём эмуляторе компьютера Орион под названием OrioniX (2006 и ранее в досовской версии):

viewtopic.php?f=94&t=8480

а также в симуляторе домашней сети куда могли быть включены несколько компьютеров с процессором i8080 (1997-1998):

viewtopic.php?f=46&t=9621

Image
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Alikberov
Doomed
Posts: 347
Joined: 14 Oct 2019 18:10
Location: Tashkent

Re: Текстовый эмулятор Pseudo-86RK

Post by Alikberov »

Кстати, а в чём общая суть такой эмуляции?

В соседней ветке тоже представил скрипт симуляции (не эмуляции) работы архитектур i8080/i8086/x86/x64…
В принципе, его можно дописать и довести до ума, чтобы воспроизвести больший функционал РАДИО-86РК.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Текстовый эмулятор Pseudo-86RK

Post by Shaos »

Alikberov wrote:Кстати, а в чём общая суть такой эмуляции?
Общая суть озвучена в первой строчке первого сообщения - CI/CD надобно для GitLab :roll:

Ну и плюс хотелось бы с точностью до такта знать время выполнения тех или иных подпрограмм, написанных в кодах 8080/8085 (кодеры, декодеры, компиляторы, разнообразная математика и т.д.), причём с максимально возможной скоростью...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Текстовый эмулятор Pseudo-86RK

Post by Shaos »

Теперь про мой класс Processor8080:

Code: Select all

/*  proc8080.h - class Processor8080 for emulation of 8080/8085.

    Part of nedoPC SDK (software development kit for DIY and RETRO computers)

    Copyright (c) 1994-2024, Alexander Shabarshin <me@shaos.net>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef __PROC8080_H
#define __PROC8080_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SH_FALSE 0
#define SH_TRUE 1
#define SH_BIT int
#define SH_BYTE unsigned char
#define SH_WORD unsigned short

#define SH_FLAG_8085 1

class Processor8080
{
 int flags;
protected: 
 unsigned long time;
 unsigned long timel;
 SH_BYTE lastcom;
 SH_BYTE A,B,C,D,E,H,L;
 SH_WORD SP,PC,PC_;
 SH_BIT z_,p_,c_,s_,a_,i_;
 SH_BYTE par[256];
 SH_WORD mul256(SH_BYTE b) { return ((SH_WORD)b)<<8; };
 SH_BYTE plus(SH_BYTE b1,SH_BYTE b2,SH_BYTE b3=0)
 {
   SH_BYTE b1l,b1r,b2l,b2r,b_l,b_r;
   b1l=(b1&0xF0)>>4;
   b1r=b1&0x0F;
   b2l=(b2&0xF0)>>4;
   b2r=b2&0x0F;
   b_r=b1r+b2r+b3;
   a_=(b_r&0x10)>>4;
   b_r=b_r&0x0F;
   b_l=b1l+b2l+a_;
   c_=(b_l&0x10)>>4;
   b_l=b_l&0x0F;
   return (b_l<<4)|b_r;
 }
 SH_BYTE minus(SH_BYTE b1,SH_BYTE b2,SH_BYTE b3=0)
 {
   SH_BYTE b1l,b1r,b2l,b2r,b_l,b_r;
   b1l=(b1&0xF0)>>4;
   b1r=b1&0x0F;
   b2l=(b2&0xF0)>>4;
   b2r=b2&0x0F;
   b_r=b1r-b2r-b3;
   if(b_r&0x10) a_=SH_TRUE;
   else a_=SH_FALSE;
   b_r=b_r&0x0F;
   b_l=b1l-b2l-a_;
   if(b_l&0x10) c_=SH_TRUE;
   else c_=SH_FALSE;
   b_l=b_l&0x0F;
   if(a_) a_=SH_FALSE;
   else a_=SH_TRUE;
   return (b_l<<4)|b_r;
 }
 void flag_p(SH_BYTE b) { p_=(SH_BIT)par[b]; };
 void flag_z(SH_BYTE b) { if(!b) z_=SH_TRUE; else z_=SH_FALSE; };
 void flag_s(SH_BYTE b) { s_=(b&0x80)>>7; };
 void flag_all(SH_BYTE b) { flag_s(b); flag_z(b); flag_p(b); };
 void ret(void) { PC=getw(SP); SP+=2; };
 void call(SH_WORD a) { SP-=2; putw(SP,PC); PC=a; };
public:
 SH_BIT INTR;
 SH_BIT HALT;
 long getTime(void){return timel;};
 void setPC(SH_WORD a) { PC=a; };
 void setSP(SH_WORD a) { SP=a; };
 void setBC(SH_WORD x) { B=x>>8; C=x&0xFF; };
 void setDE(SH_WORD x) { D=x>>8; E=x&0xFF; };
 void setHL(SH_WORD x) { H=x>>8; L=x&0xFF; };
 void setPSW(SH_WORD x)
 { 
   A=(x>>8)&0xFF;
   s_=(x&0x0080)>>7;
   z_=(x&0x0040)>>6;
   a_=(x&0x0010)>>4;
   p_=(x&0x0004)>>2;
   c_=(x&0x0001);
 }
 SH_WORD getPC(void) { return PC; };
 SH_WORD getSP(void) { return SP; };
 SH_WORD getBC(void) { return mul256(B)|C; };
 SH_WORD getDE(void) { return mul256(D)|E; };
 SH_WORD getHL(void) { return mul256(H)|L; };
 SH_WORD getPSW(void) { return (mul256(A)|(s_<<7)|(z_<<6)|(a_<<4)|(p_<<2)|2|c_); };
 SH_BYTE getM(void) { return get(getHL()); };
 int is8085(void) { return flags&SH_FLAG_8085; };
 Processor8080(int f=0);
 virtual ~Processor8080() { ; };
 virtual SH_BYTE get(SH_WORD a) { return 0xFF; }; // read from memory
 virtual void put(SH_WORD a,SH_BYTE b) { ; }; // write to memory
 virtual SH_BYTE interruption(void) { return 0; }; // interrupt
 virtual int aux(SH_BYTE com,SH_BIT ok) { return 0; }; // parallel activity
 virtual SH_BYTE inp(SH_BYTE p) { return 0xFF; }; // read from port
 virtual void outp(SH_BYTE p,SH_BYTE b) { ; }; // write to port
 SH_WORD getw(SH_WORD a) { SH_WORD w=get(a); w|=mul256(get(a+1)); return w; };
 void putw(SH_WORD a, SH_WORD w) { put(a,w&0xFF); put(a+1,(w>>8)&0xFF); };
 unsigned long step(unsigned long t=1);
 int load(const char *s,SH_WORD adr,SH_WORD len=0xFFFF,SH_WORD off=0);
 int save(const char *s,SH_WORD adr,SH_WORD len);
};

class Processor8085 : public Processor8080
{
public:
 Processor8085() : Processor8080(SH_FLAG_8085) {;};
 virtual ~Processor8085() {;};
};

#endif
Как не трудно заметить, этот класс не имеет памяти (причём поначалу имел, но затем перестал т.к. у разных машин подразумеваяется разная реализация памяти) и чтобы к процессору добавить память надо переопределить виртуальные методы get и put (чтения и запись одного байта соответственно). Для выполнения шага эмуляции используется метод step, а в случае необходимости перехватывать какие-то инструкции или просто что-то делать после каждого шага существует виртуальный метод aux, который можно переопределить. Также при необходимости можно переопределить методы работы с портами ввода-вывода (inp и outp).

P.S. Вернул обратно в класс методы save и load, которые в ориониксе были вынесены в дочерний класс...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Alikberov
Doomed
Posts: 347
Joined: 14 Oct 2019 18:10
Location: Tashkent

Re: Текстовый эмулятор Pseudo-86RK

Post by Alikberov »

Может поднять небольшой TelNet/PuTTY-сервер с эмуляцией РАДИО-86РК? :mrgreen:
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Текстовый эмулятор Pseudo-86RK

Post by Shaos »

Alikberov wrote:Может поднять небольшой TelNet/PuTTY-сервер с эмуляцией РАДИО-86РК? :mrgreen:
Ну у меня есть rk86.net, который я планировал оснастить сетевыми возможностями, чтобы пользователи могли запускать сетевые программы, ходить "в гости" друг к другу посещая сессии друг-друга и т.д. Эмулятор в браузере поди куда практичнее нежели эмулятор по телнету или тем более ssh :roll:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
shiny
Maniac
Posts: 324
Joined: 14 Oct 2023 06:59

Re: Текстовый эмулятор Pseudo-86RK

Post by shiny »

User avatar
shiny
Maniac
Posts: 324
Joined: 14 Oct 2023 06:59

Re: Текстовый эмулятор Pseudo-86RK

Post by shiny »

vital72 wrote:добавили ещё один тип данных -- utf8mb4, где уже под символ UTF-8 выделено 4 байта.
так появилось UTF-16 8)