Programa originalmente escrito por Miguel Angel Rodriguez Jodar, o IdeaFix, com o objetivo de exibir números grandes em um ZX Spectrum e, consequentemente, qualquer outro computador baseado em Z80. E o maior número que esta rotina consegue formatar é um sujeito com tamanho de 255 bytes, este aqui:
22040-1
Mas se você for daqueles fanáticos por números e só acredita nos dígitos que pode contar com os dedos…
12623830496605862226841748706511699984548477605357610950050916182626 81841362026988015515680137613807175340545348511641386489045279316051 60527688095259563605939964364716019515983399209962459578542172100149 93776393858121960407273342250718005600967254090070955410951681657377 95933263322883148732515590778530684449778648033919625808006827600178 49589281937637993445539366428356761821065267423102149447628375691862 21071720202524163030311855918867830431407694380169252824698095970590 16414442388949286208254823034318069556902263087734268295039009305293 95181208739591967195841536053143145775307050594328881077553168201547 775
…chame familiares, vizinhos, gato, cachorro, papagaio, periquito, cidade inteira se precisar para ajudar.
O código para o Speccy está disponível na página dele, na ZX Projects. Este aqui é minha adaptação para rodar em computadores MSX com a mudança no endereço de execução e um complemento para escrever o número na tela logo de uma vez:
https://gist.github.com/plainspooky/c3beef32b2b3e520ffa6
Ele pode ser ser montado com o Pasmo, a sintaxe é:
pasmo -d -v --msx large.asm large.bin
Mas ainda precisa de um programa em BASIC para combinar.
https://gist.github.com/plainspooky/7978f409bc4f5afd3169
Porém, como o MSX não tem um contador de 24-bit como o ZX Spectrum que armazenaria quase 4 dias de operação e a variável de sistema JIFFY com 16-bit só registraria pouco mais de 18 minutos minha alternativa foi recorrer ao circuito de relógio do MSX — ou seja MSX2 e superiores, MSX1 fica de fora da brincadeira desta vez. 🙁
A única ressalva deste programa é de não rodá-lo perto de meia noite, ou a contagem ficará negativa — mas se você quiser pode usar o GET DATE para acrescentar dia, mês ou ano às variáveis T1# e T2#.
Para os que gostam de comparações o tempo para formatar o número no ZX Spectrum foi de cerca de 3.214 segundos (~53’30”) enquanto que em um MSX turbo R em modo Z80 foi de 3.656 segundos (~60’55”) e em modo R800 de apenas 632 segundos (~10’30”).
Aliás, curiosa a diferença de pouco mais de 7 minutos entre os Z80, não?
O MSX gera um wait cycle para cada ciclo M1, por isso é mais lento que o Spectrum para fazer o mesmo cálculo.
Já o Turbo R (R800) roda as instruções do Z80 usando menos menos ciclos de máquina por instrução, por isso ele é mais rápido do que um Z80 com o clock multiplicado (ou, é por isso que as placas MSX ‘turbo’ são mais lentas que o R800 para o mesmo clock).
Para fazer no MSX 1 basta criar seu próprio jiffy usando o hook HTIMI ($FD9F).
Você pode implementar um contador de 24 bits assim (ou até maior)
org od9fh:
jp my_jiffy
ret
my_jiffy: ; contador de 24 bits
ld hl,(mycounter)
inc (hl) ; incrementa lsb
ret nz ; retorna se não estourou
inc hl ; estourou? incrementa proximo byte
inc (hl) ; e por aí vai
ret nz
inc (hl) ; retorna apos incrementar o mais significativo
ret
mycounter: db 0,0,0
Só faltou avisar que seria interessante colocar um ventilador do lado do seu MSX para realizar o calculo, o Z80 deve fritar para realizar toda a tarefa. Interessante a comparação entre as duas arquiteturas (MSX e ZX).
Interessante senão fosse velho XD
Em 2013 quando lancei o MSXDUMP, precisei implementar na minha biblioteca em Turbo Pascal, toda uma aritmética para trabalhar com numeros grandes uma vez que as IDE’s no MSX suportam operações em setores de 24bits. Essa biblioteca que chamei de BigInt.
http://sourceforge.net/p/oldskooltech/code/HEAD/tree/msx/trunk/msxdos/pascal/bigint.pas
Nela você consegue trabalhar com numero de qualquer tamanho e no caso hoje tenho 2 typedefs 1 para numeros de 24Bits e outra para 32Bits, entretanto a biblioteca é genérica e suporta quantos bits vc quiser e couber na memória do MSX.
Na BigInt.pas você tem funções de comparação, soma, subtração, multiplicação, só faltou mesmo divisão que colocarei em breve.
Não medi o tempo mas é bem performática, principalmente porque como ela foi criada para o MSXDUMP, que é um software que faz uso extensivo do disco, sua performance não é o gargalo.
Penso um dia em mudar as funções para Assembly, não pela performance mas sim pelo uso de memória.