RunCpm : Um emulador do sistema operativo CP/M ao estilo do NTVDM

Iniciado por Nosferatu Arucard, 22 de Setembro de 2016, 19:52

tópico anterior - próximo tópico

Nosferatu Arucard

Encontrei durante as minhas pesquisas um projecto activo para um emulador de um sistema operativo de 8-bit (!) que teve sucesso na transição da década de 1970 para a de 1980: o CP/M da Digital Research

Tratou-se do primeiro sistema operativo genérico para a maioria dos computadores pessoais de 8-bit, até que o padrão IBM-PC (de 16-bit) tomou o mercado, e o sistema acabou por se extingir após 1983, embora até 1985 ainda eram lançados softwares para ele.

O Digital Research acabaria por criar uma versão de 16-bit do CP/M (designado CP/M-86) que não teve grande sucesso, mas acabaria por se tornar a base do DR-DOS que era mais ou menos compatível com o MS-DOS original.

Além disso só funcionava com o processador Intel 8080 ou 8085, mas também com o Zilog Z80 (o mesmo que o ZX Spectrum ou o TK 85), ou com o Nec V20 e V30.

O CP/M e o MS-DOS possuem características comuns, como a designação de drives por letras, o padrão 8.3 para os nomes e extensões dos ficheiros, e o sistema operativo ser constituído por três módulos: o módulo do kernel (BIOS, similar ao msdos.sys), o módulo I/O (BDOS, similar ao io.sys) e o interpretador de comandos (CPM, similar ao command.com).

O emulador pode ser obtido através deste site:
https://github.com/MockbaTheBorg/RunCPM

E deve ter pelo menos instalado o compilador gcc e o pacote base de bibliotecas (o CP/M por si só não suportava gráficos, e somente exige a biblioteca ncurses em sistemas POSIX como o Linux ou o Mac OS X)

Portanto basta clonar o git:
$ git clone https://github.com/MockbaTheBorg/RunCPM.git
$ cd RunCPM\RunCPM

E compilar:
$ makefile -f Makefile.posix

Agora crie uma pasta para o CPM (mkdir ~/cpm)
Depois crie uma pasta dentro do cpm com o nome A (mkdir A), e depois dentro da pasta A, crie uma com o nome 0 (mkdir 0).
Isto cria um drive A virtual com o selector USER 0 (uma das características bizarras deste sistema operativo era criar sub-partições (até 16) para cada uma dos 16 drivers possíveis (de A a P)

Agora copia o novo executável RunCPM para a directoria "cpm", e depois o conteúdo da pasta ./RunCPM/CCP para a mesma directoria do executável (é a implementação de terceiros da shell de comandos do CP/M 2.2).
Por fim, copie o ficheiro A.zip de ./RunCPM/DISK para a pasta ~/cpm/A/0 e depois descompacte aí (pode apagar o zipfile depois).

Para operar o programa abra a janela de Terminal, navege para a pasta ~/cpm e digite:
$ ./RunCPM

Se tudo correr bem, é iniciado um emulador Zilog Z80 e mostra a prompt de comando:
A>

Digite dir, e deve mostar algo do género:

CP/M 2.2 Emulator v2.7 by Marcelo Dantas
      Build Sep 22 2016 - 23:14:16
-----------------------------------------
CCP: CCP-DR.BIN Loaded at 0xf400

RunCPM Version 2.7 (CP/M 2.2 64K)

A>dir
A: 1STREAD  ME  : ASM      COM : BDOS     ASM : BDOS     SUB
A: BDOSEQU  LIB : CCP-DR   BIN : CCP-ZCPR BIN : CCP      ASM
A: CCP      SUB : CLEAN    SUB : DDT      COM : DISKDEF  LIB
A: DISPLAY  LIB : DUMP     ASM : ED       COM : EXIT     ASM
A: EXIT     COM : EXIT     SUB : EXIT     Z80 : LOAD     COM
A: LU       COM : MAC      COM : MBASIC   COM : MLOAD    ASM
A: MLOAD    COM : MLOAD    DOC : MOVCPM   COM : OPCODES  TXT
A: PIP      COM : RSTAT    COM : RSTAT    SUB : RSTAT    Z80
A: STAT     COM : SUBMIT   COM : SYSGEN   COM : TE       COM
A: UNARC    COM : UNCR     COM : USQ      COM : XSUB     COM
A: Z80ASM   COM : Z80ASM   PDF : ZCPR     ASM : ZCPR     SUB
A: ZCPRHDR  LIB : ZEXALL   COM : ZEXDOC   COM : ZSID     COM
A: ZTRAN    COM
A>

Em seguida invoque "exit"
A>exit

Para retornar ao bash.

E com isso pode correr os programas dignos da arqueologia informática como o MBASIC ou o SuperCalc (!). Evidentemente, que se quer aceder a disquetes de 8 polegadas no Linux, isso já é outro problema totalmente diferente.

Tota

Rapaz, que saudades você despertou.

Usei muito o cp-m/80, Apple II+, vídeo de fósforo âmbar...

A similaridade entre o cp-m e o MS-DOS , se deve ao fato de que a hoje Microsoft precisava na época um sistema para colocar nos IBM-PC e comprou um fork do cp-m/86 de um cara. Foi um negócio de gênio à época.

O Gates comprou o programa por nada, agregou o BASIC nele e licenciou para a IBM o que ele chamou de Ms-DOS.

O que os executivos da IBM não entenderam é que o licenciamento não dava exclusividade, o que fez o programa ser distribuído nos clones da IBM.

Nosferatu Arucard

Actualmente estou envolvido num programa de análise numérica em Física Nuclear que poderá ser open-source assim que estiver mais ou menos pronto.
O programa que implementei utiliza o wxWidgets para facilitar a compilação de versões nativas para Linux, Windows e Mac OS X.
Excepto o plug-in wxMathPlot para gerar os gráficos de rendimentos, optei por implementar várias funções para a leitura e escrita de ficheiros de dados em formato texto (LabView, Ibandl, etc...), para o cálculo de rendimentos, etc...

Entretanto experimentei num tablet com o programa Termux (que é um emulador de Terminal para Android que suporta pacotes externos, a imitar o Ubuntu), compilar o RunCPM e correr nele...
De facto é possível, mas exigiu modificar uma linha do makefile para compilar.

Primeiro tinha que instalar os seguintes pacotes:
$ apt install clang make ncurses-dev libandroid-glob-dev git
$ cd /data/data/com.termux/files/home

Depois era só clonar o git e compilar:
$ git clone https://github.com/MockbaTheBorg/RunCPM.git
$ cd RunCPM/RunCPM

Editar uma linha do makefile:
$ apt install nano
$ nano Makefile.posix
E mudar a linha
LDFLAGS = -lncurses
para:
LDFLAGS = -lncurses -landroid-glob
E salvá-lo com outro nome, como Makefile.android

Por fim, compila e executa sem problemas:
$ make -f Makefile.android
$ mkdir /data/data/com.termux/files/home/cpm
$ mkdir /data/data/com.termux/files/home/cpm/A
$ mkdir /data/data/com.termux/files/home/cpm/A/0
$ mv RunCPM /data/data/com.termux/files/home/cpm

E copiar os ficheiros de sistema CP/M para os locais certos.
$ cp /data/data/com.termux/files/home/RunCPM/DISK/A.ZIP  /data/data/com.termux/files/home/cpm/A/0
$ cp /data/data/com.termux/files/home/RunCPM/CCP/*  /data/data/com.termux/files/home/cpm
$ cd /data/data/com.termux/files/home/cpm/A/0
$ unzip A.ZIP
$ rm A.ZIP
(O comando unzip é intrínseco ao busybox)

Depois desses passos, basta correr o emulador sem grandes problemas:
$ cd /data/data/com.termux/files/home/cpm
$ ./RunCPM

E a partir daí temos a linha de comando do CP/M num tablet Android...
- Se puder usar o comando exit, retorna à shell busybox, senão terá que fechar a aplicação Termux.