|
nedoPC.orgCommunity for electronics hobbyists, established in 2002 |
|
Текстовый эмулятор Pseudo-86RK
Author |
Message |
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23454 Location: Silicon Valley
|
Задумал я тут текстовый эмулятор Pseudo-86RK (как часть nedoPC SDK), чтобы можно было CI/CD наладить на гитлабе, который бы прогонял тесты при изменениях каких-то в моих будущих программульках для РК (и вообще для 8080/8085 кода) и сравнивал бы вывод с эталонным. Вариант по умолчанию будет работать с ncurses, чтобы можно было менять местоположение курсора и раскрашивать текст, однако будет вариант сборки чисто текстовый при котором вывод через монитор будет делаться в stdout, причём каждая строка (опционально) может иметь префикс с количеством тактов, прошедших на момент начала этой строки, чтобы можно было точно считать время потраченное на вычисления (например декодирование SHAFF). Потом можно будет ещё сделать вариант сборки для доса (работа с текстовым экраном через conio) - просто чтобы было P.S. Результат: https://gitlab.com/nedopc/sdk/-/tree/master/pseudo-86rk
|
02 Mar 2024 13:22 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23454 Location: Silicon Valley
|
Псевдографика там тоже будет т.к. UTF-8 может такие символы показать ▓█▀▄█▓: Источник: https://www.isthisthingon.org/unicode/index.phtml?page=02&subpage=5&hilite=02595#Block%20ElementsНадо ещё найти стрелочки (они точно были), человечка и яблоко P.S. Ещё там есть такое: (это для моих шрифтовых расширений) P.P.S. Вот этот советский символ тоже надо вместо доллара взять
|
02 Mar 2024 13:42 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23454 Location: Silicon Valley
|
Стрелки (они правда худосочные): Вертикальные и горизонтальные палки разной толщины: Яблоко (правда красное): Источник: https://www.compart.com/en/unicode/U+1F34EСам символ яблока сюда вставить не могу, т.к. у MySQL из-за него сносит крышу, а вот терминал моего дебияна этот символ замечательно показывает: P.S. Ещё вот такие стрелочки есть: ← ↑ → ↓ Это из блока вручную написанных символов: https://www.compart.com/en/unicode/block/U+FF00
|
02 Mar 2024 14:02 |
|
|
Alikberov
Doomed
Joined: 14 Oct 2019 18:10 Posts: 346 Location: Tashkent
|
Вот ведь, а!? Вроде бы "Проблему 2000" уже как-то решали ведь. Но, нашлось "яблоко раздора"! (Сколько нового софта ни пишут, а багов - целый клоповник!)
|
02 Mar 2024 14:10 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23454 Location: Silicon Valley
|
Ну это видать сильно расширенный юникод с очень большим номером P.S. Вот из той же серии цветной человечек https://www.compart.com/en/unicode/U+1F57AP.P.S. Под спойлером сообщение об ошибке при попытке заслать текст с этим человечком в форум: ERROR
|
02 Mar 2024 14:11 |
|
|
vital72
Senior
Joined: 17 Jun 2014 04:29 Posts: 164 Location: 93.80.157.217
|
может версия мускуля старая? когда они тока ввели поддержку UTF-8, они под эти символы выделили только три байта... только ТРИ, млять, БАЙТА!!! какому "гению" в голову пришло, что для кодирования UTF-8 надо только три байта, какую документацию он читал? уже позже, когда поняли, что лоханулись, добавили ещё один тип данных -- utf8mb4, где уже под символ UTF-8 выделено 4 байта.
_________________https://radio-86rk.ruкто я такой, чтобы спорить с самим собой
|
02 Mar 2024 14:22 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23454 Location: Silicon Valley
|
Да - на этом виртуальном серваке староватая лампа стоит, надо наверное обновиться...
|
02 Mar 2024 14:30 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23454 Location: Silicon Valley
|
Эмулятор планирую строить на основе своего C++ класса Processor8080, который я начал писать ещё в 1994 году (т.е. этому коду уже 30 лет!!!), первую рабочую версию выкатил в 1996 и далее сделал ряд улучшений, включая активность 2012 года по причёсыванию наших эмуляторов. См. https://gitlab.com/nedopc/sdk/-/blob/master/common/proc8080.cppЭтот класс например уже использовался в моём эмуляторе компьютера Орион под названием OrioniX (2006 и ранее в досовской версии): http://www.nedopc.org/forum/viewtopic.php?f=94&t=8480а также в симуляторе домашней сети куда могли быть включены несколько компьютеров с процессором i8080 (1997-1998): http://www.nedopc.org/forum/viewtopic.php?f=46&t=9621
|
02 Mar 2024 15:47 |
|
|
Alikberov
Doomed
Joined: 14 Oct 2019 18:10 Posts: 346 Location: Tashkent
|
Кстати, а в чём общая суть такой эмуляции? В соседней ветке тоже представил скрипт симуляции (не эмуляции) работы архитектур i8080/i8086/x86/x64… В принципе, его можно дописать и довести до ума, чтобы воспроизвести больший функционал РАДИО-86РК.
|
03 Mar 2024 03:36 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23454 Location: Silicon Valley
|
Общая суть озвучена в первой строчке первого сообщения - CI/CD надобно для GitLab Ну и плюс хотелось бы с точностью до такта знать время выполнения тех или иных подпрограмм, написанных в кодах 8080/8085 (кодеры, декодеры, компиляторы, разнообразная математика и т.д.), причём с максимально возможной скоростью...
|
03 Mar 2024 10:56 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23454 Location: Silicon Valley
|
Теперь про мой класс Processor8080: | | | | Code: /* 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, которые в ориониксе были вынесены в дочерний класс...
|
04 Mar 2024 00:29 |
|
|
Alikberov
Doomed
Joined: 14 Oct 2019 18:10 Posts: 346 Location: Tashkent
|
Может поднять небольшой TelNet/PuTTY-сервер с эмуляцией РАДИО-86РК?
|
16 Mar 2024 11:09 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23454 Location: Silicon Valley
|
Ну у меня есть rk86.net, который я планировал оснастить сетевыми возможностями, чтобы пользователи могли запускать сетевые программы, ходить "в гости" друг к другу посещая сессии друг-друга и т.д. Эмулятор в браузере поди куда практичнее нежели эмулятор по телнету или тем более ssh
|
16 Mar 2024 21:28 |
|
|
shiny
Maniac
Joined: 14 Oct 2023 06:59 Posts: 291
|
_________________ uselessretro.blogspot.com
|
17 Mar 2024 09:20 |
|
|
shiny
Maniac
Joined: 14 Oct 2023 06:59 Posts: 291
|
так появилось UTF-16
_________________ uselessretro.blogspot.com
|
17 Mar 2024 09:23 |
|
|
Who is online |
Users browsing this forum: No registered users and 1 guest |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|