tag:blogger.com,1999:blog-52631428225022773312024-02-24T17:46:53.418-03:00Cantinho do TK90XAqui se discute os hobbies do TK90X Fan: retrocomputação, retrogaming e eletrônica, além de outros assuntos relacionados.Unknownnoreply@blogger.comBlogger996125tag:blogger.com,1999:blog-5263142822502277331.post-59914060550655747912023-03-07T19:43:00.000-03:002023-03-07T19:43:34.354-03:00TK Disassembler<p style="text-align: justify;"> Este é um novo <i>disassembler</i> para o <b>TK90X</b>, com algoritmo baseado no <a href="https://cantinhotk90x.blogspot.com/2023/02/disassembasic-programa.html"><b>DisassemBASIC</b></a>.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUtRlbLv6IlnZstoLSqxT5peu8sWpI6yji4m1B061GZtMrR4R_PkbZEFxhcThBt6dsXJdwYINeDzUZSZO7NAbhZOP58A1NoZBi4m1pHLFjp-WCCZoFxHOjlu8chmCotKQh5tAoV7OThHwAlHngTRJh0Or--_iHa2PeH5dab1Xu34q68jvFUMwENvHO/s640/TK%20Disassembler1.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="480" data-original-width="640" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUtRlbLv6IlnZstoLSqxT5peu8sWpI6yji4m1B061GZtMrR4R_PkbZEFxhcThBt6dsXJdwYINeDzUZSZO7NAbhZOP58A1NoZBi4m1pHLFjp-WCCZoFxHOjlu8chmCotKQh5tAoV7OThHwAlHngTRJh0Or--_iHa2PeH5dab1Xu34q68jvFUMwENvHO/s320/TK%20Disassembler1.png" width="320" /></a></div>
<span><a name='more'></a></span>
<p style="text-align: justify;">Se o programa anterior era 100% em BASIC, o <b>TK Disassembler</b> é totalmente em <i>assembly</i>. Embora tenha sido feito mais como objeto de estudo para mim, acredito que ficou bem usável. Estou disponibilizando o código fonte em <i>assembly</i> repleto de comentário, para facilitar sua compreensão e estudo. Ele consegue decodificar todas as instruções do <b>Z80</b>, incluindo as que não são documentadas pela <b>Zilog.</b> A tela acima é do <a href="https://cantinhotk90x.blogspot.com/2023/02/all-opcodes-programa.html"><b>All Opcodes</b></a> que contém todas as instruções possíveis. Outro ponto é que consegui fazer o programa ficar razoavelmente pequeno, ocupando 1838 bytes de memória.<br /></p>
<p style="text-align: justify;">Também disponibilizo o arquivo TZX que contém uma versão na parte mais baixa da memória (<i>TKDIS_low</i>), residente a partir de 24500, e outra na parte alta da RAM (<i>TKDIS_high</i>), residente a partir de 60000. Foi incluído também o All Opcodes.<br /></p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9-klU0L27bIBiRXmnVTOco_cScoatjDs6CVZ_0ZN31I2iUrhPXYqui52lW7qI2CNaVi4ou5kje7dUNFPnL8p2WP37Fx4W3pTCx9eFbc3JaLIXrnBbwc2C-jcX4_SxgQL6HAXlKwU2zKOcQdpdtNYrDKaRwD3SuBqeqVSbg5-wd8K20SQHdHiRZqcM/s640/TK%20Disassembler2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="480" data-original-width="640" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9-klU0L27bIBiRXmnVTOco_cScoatjDs6CVZ_0ZN31I2iUrhPXYqui52lW7qI2CNaVi4ou5kje7dUNFPnL8p2WP37Fx4W3pTCx9eFbc3JaLIXrnBbwc2C-jcX4_SxgQL6HAXlKwU2zKOcQdpdtNYrDKaRwD3SuBqeqVSbg5-wd8K20SQHdHiRZqcM/s320/TK%20Disassembler2.png" width="320" /></a></div>
<p style="text-align: justify;">Os programas do TZX não definem os atributos de cores da tela como dá a entender a primeira figura deste artigo. Na verdade, se for dar RUN logo após carregado o programa, a tela fica em preto e branco como na segunda figura, logo acima. O usuário pode escolher as cores diretamente no BASIC, a única coisa que o TK Disassembler faz é diferenciar as colunas da listagem com diferentes valores de BRIGHT.<br /></p>
<p style="text-align: justify;">Aproveitando as duas figuras deste artigo, devo mencionar que o TK Disassembler pode exibir a listagem em decimal (primeira figura) ou hexadecimal (segunda figura). </p><p style="text-align: justify;">Para baixar o TK Disassembler, clique <a href="https://drive.google.com/file/d/1Df2ASUem-LQYotaP1uM3P8Zme9Ohx64c/view?usp=share_link" target="_blank">neste <i>link</i></a>. Não sei se ele vai ser útil para alguém. O que posso dizer é que aprendi muito durante seu desenvolvimento.<br /></p>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5263142822502277331.post-81708733029762938182023-02-09T08:06:00.003-03:002023-02-09T08:06:43.969-03:00DisassemBASIC (programa)<p style="text-align: justify;">Na realidade, o <a href="https://cantinhotk90x.blogspot.com/2023/02/all-opcodes-programa.html"><b>All Opcodes</b></a> é um subproduto de um projeto maior, o <b>DisassemBASIC</b>.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggRKJxgfABkHCHwCFiHQqMZropCCSLWd2WXbx9dHUV_-LUyiFwrVDsEWU4wn9g99ptzKQ6s8wFt7za8UxtDKe9rMVHmyhU8wdr4hsem8K4dECytX-apzocvtguoFmy9CtwDJIAyrQu9-uR6xDD5skmURrAdwepuV3MTknLLSvkhLfCgn_o-gf_21R1/s640/DisassemBASIC%20list.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="480" data-original-width="640" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggRKJxgfABkHCHwCFiHQqMZropCCSLWd2WXbx9dHUV_-LUyiFwrVDsEWU4wn9g99ptzKQ6s8wFt7za8UxtDKe9rMVHmyhU8wdr4hsem8K4dECytX-apzocvtguoFmy9CtwDJIAyrQu9-uR6xDD5skmURrAdwepuV3MTknLLSvkhLfCgn_o-gf_21R1/s320/DisassemBASIC%20list.png" width="320" /></a></div>
<span><a name='more'></a></span>
<p style="text-align: justify;">No portal <a href="http://Z80.info"><b>Z80.info</b></a> encontrei <a href="http://z80.info/decoding.htm" target="_blank">este documento</a> bem detalhado de Christian Dinu, que descreve um algoritmo para decodificar as instruções do <b>Z80 CPU</b>. Eu já vi algo semelhante no <a href="https://cantinhotk90x.blogspot.com/2012/11/o-dominio-do-codigo-maquina.html" target="_blank">livro do Toni Baker</a>, mas achei a apresentação de Dinu bem mais fácil de entender. Fiquei motivado a escrever um programa <i>disassembler</i> para o <b>TK90X</b>, usando a própria linguagem <b>BASIC</b> desse computador. Será que o projeto seria viável? Essa era a minha dúvida.</p><p style="text-align: justify;">Foi o projeto mais complexo que me envolvi, então resolvi não partir diretamente do BASIC. Optei por escrever um rascunho numa linguagem estruturada que lembra o Pascal. Acredito que foi isso que me permitiu concluir o projeto com poucos percalços. Em seguida, fui convertendo manualmente a listagem pseudo-pascal em Sinclair BASIC. O utilitário <a href="https://cantinhotk90x.blogspot.com/2023/02/zmakebas.html"><b>zmakebas</b></a> me ajudou nessa etapa, pois converte um arquivo texto do <b>PC</b> em imagem <b>.tap</b> que pode ser carregado num emulador. Outra vantagem do utilitário é a possibilidade de usar rótulos para comandos <b>GOTO/GOSUB</b>, simplificando tremendamente a programação (na minha opinião, dar conta dos números das linhas é demasiado confuso).<br /></p>
<p style="text-align: justify;">Depois de erros e correções, cheguei a um programa de 169 linhas BASIC ocupando um pouco mais de 6 KB de memória. Ao rodá-lo, pude constatar que funciona. Na tela abaixo, uma amostra do <i>disassembly</i> da ROM do TK90X. </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSnckdTmqKjZpGoA-A-9XGCEq53BvKQyTSnXWxQBQQutmda6xDxB-78v1lWLWJB3v-GE6AppuaFfG2J7h13e00yfi725DTRHD_6uWwm4L23r8VUAQQYhZiYZjtn-DgxFLEEl5tdAXcG0bkrBPXAq70Y_9rC6aQNL9-WOaIFirOeUNlXrcl0fcBX5XC/s640/DisassemBASIC%20ROM.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="480" data-original-width="640" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSnckdTmqKjZpGoA-A-9XGCEq53BvKQyTSnXWxQBQQutmda6xDxB-78v1lWLWJB3v-GE6AppuaFfG2J7h13e00yfi725DTRHD_6uWwm4L23r8VUAQQYhZiYZjtn-DgxFLEEl5tdAXcG0bkrBPXAq70Y_9rC6aQNL9-WOaIFirOeUNlXrcl0fcBX5XC/s320/DisassemBASIC%20ROM.png" width="320" /></a></div>
<p style="text-align: justify;">Funciona! Claro que, como um bom programa em BASIC, sua velocidade não é o ponto forte. Mesmo assim, sinto que não é tão lento quanto eu esperava a princípio; na verdade, parece ser perfeitamente utilizável. <br /></p>
<p style="text-align: justify;">Aqui é que entre o All Opcodes: como teste para o <i>disassembler</i>. Funciona perfeitamente, como se pode ver nas telas abaixo.<br /></p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi69oQa_vDdSbpwsJ4R9ODtmLLWfOUWEdfvdNx0zJ3_JA7Ge4k5gRfYiqLX0mPFxlIiA4Yyy2AOEFNTdypJyw2EWaL3L3lX60GDoM5QSgEp3tQVN4EVT94mZRTnKKY2bGHwmnQHKXtxAdqUfCakKT4LolllqGgm3VLCT19A3xBnciPjfysmzA6zcziS/s640/DisassemBASIC%20All%20Op%201.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="480" data-original-width="640" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi69oQa_vDdSbpwsJ4R9ODtmLLWfOUWEdfvdNx0zJ3_JA7Ge4k5gRfYiqLX0mPFxlIiA4Yyy2AOEFNTdypJyw2EWaL3L3lX60GDoM5QSgEp3tQVN4EVT94mZRTnKKY2bGHwmnQHKXtxAdqUfCakKT4LolllqGgm3VLCT19A3xBnciPjfysmzA6zcziS/s320/DisassemBASIC%20All%20Op%201.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl-EquQYJDyLemNrypGpmq_8sNbeSXYH0eFQRKydmO-HKavMBcZTF8PbIyef5B9ItAvMT5s1iGx9qC8-vTOQ3loCGl8L3Z13BxI-8IWZMj3ZZfwWfFI9j7sNalYa8-M7qQhDWDiRrn0pt570oXGnaMPGkyzF9yNP4UYZf2RjT9HFHPFYXoCcgwrIH8/s640/DisassemBASIC%20All%20Op%202.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="480" data-original-width="640" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl-EquQYJDyLemNrypGpmq_8sNbeSXYH0eFQRKydmO-HKavMBcZTF8PbIyef5B9ItAvMT5s1iGx9qC8-vTOQ3loCGl8L3Z13BxI-8IWZMj3ZZfwWfFI9j7sNalYa8-M7qQhDWDiRrn0pt570oXGnaMPGkyzF9yNP4UYZf2RjT9HFHPFYXoCcgwrIH8/s320/DisassemBASIC%20All%20Op%202.png" width="320" /></a></div>
<p style="text-align: justify;">As instruções não oficiais são também perfeitamente reconhecidas. Comparei a saída do DisassemBASIC com o documento de Sean Youg, "<a href="http://z80.info/zip/z80-documented.pdf" target="_blank"><i>The Undocumented Z80 Documented</i></a>" e, salvo algum engano de minha parte, as instruções conferem.</p>
<p style="text-align: justify;">Não recomendo o uso regular do DisassemBASIC para fazer <i>disassembly</i>, com certeza existem outros melhores. Reconheço ainda que o programa pode ser otimizado, seja em velocidade ou em tamanho. Entretanto, o intuito principal aqui foi o de aprendizado e de experimentação. Nesse sentido, acho que os objetivos foram plenamente atingidos. Para baixar o arquivo <i>zip</i> do DisassemBASIC, clique <a href="https://drive.google.com/file/d/11SVlfa6Er2ecBWamX0MZIAWGlWnC5tvx/view?usp=sharing" target="_blank">neste <i>link</i> para o Google Drive</a>.<br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5263142822502277331.post-66558109549664390662023-02-08T11:48:00.000-03:002023-02-08T11:48:38.939-03:00zmakebas<p style="text-align: justify;">Notei que não fiz um artigo sobre <a href="https://zgedneil.nfshost.com/zmakebas.html" rel="nofollow" target="_blank"><b>zmakebas</b></a> ainda e, como usei esse programa no <b>All Opcodes</b>, creio ser uma boa hora para falar a seu respeito.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/--hizzmil4Nw/VrEQwDbAGxI/AAAAAAAAIpE/BHrmQ8KE6d8/s320/IncompBASIC_4.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="240" data-original-width="320" height="240" src="https://1.bp.blogspot.com/--hizzmil4Nw/VrEQwDbAGxI/AAAAAAAAIpE/BHrmQ8KE6d8/s1600/IncompBASIC_4.png" width="320" /></a></div>
<span><a name='more'></a></span>
<p style="text-align: justify;">Não há motivos hoje, exceto pela nostalgia, programar para o <b>TK90X</b> com o editor nativo do seu monitor <b>BASIC</b>. Escrever um programa num PC ou <i>notebook</i> moderno, com um editor bem mais poderoso e com a ajuda de recursos de um SO moderno como o <b>Linux</b>... são facilidades que dificilmente sonharíamos em 1985. A única coisa que fica faltando é um meio de transferir o programa para o TK90X ou um emulador. Aí que entra o zmakebas, um utilitário para Linux/Unix que converte um programa digitado como texto ASCII puro em arquivo <b>.tap</b>. Para rodá-lo, deve-se digitar o comando no <i>shell</i>, como no exemplo a seguir:<br /></p>
<p style="margin-left: 40px; text-align: justify;"><code>zmakebas -l -i 10 -o output_file.tap input_file</code><br /></p>
<p style="text-align: justify;">O input_file seria o arquivo texto com o BASIC e o output_file é o nome do arquivo a ser gerado (se omitido, será out.tap). Um dos recursos interessantes é o modo em que o usuário não necessita digitar os números de linhas, ativado pela opção -l (<i>label</i>). Pode-se referenciar as linhas para <b>GOTO</b> ou <b>GOSUB</b> por meio de rótulos (que devem começar com @), que serão substituídos pelos números de linhas gerados automaticamente pelo zmakebas. A opção -i (<i>increment</i>) estabelece o valor de incremento do número de linhas, o <i>default</i> é 2 mas eu gosto de usar 10. Existem vários recursos além desses, não vou me alongar pois basta ler a página <b>man</b> do utilitário.</p>
<p style="text-align: justify;">Nem tudo é perfeito, notei um <i>bug</i> no zmakebas quando lida com o comando <b>DEF FN</b> que não funciona quando se carrega o arquivo .tap. Parece que o <i>bug</i> foi resolvido na versão 1.2b, porém a versão disponível no <a href="https://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=zmakebas;dist=unstable" rel="nofollow" target="_blank"><b>Debian</b></a> (e no <b>Ubuntu</b>) parece estar ainda com o problema. Pode-se contornar carregando o arquivo .tap no TK90X/emulador, fazer um LIST na linha com DEF FN, pressionar EDIT (Caps-shift + 1) e depois ENTER. O próprio monitor BASIC repara a linha problemática.<br /></p>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5263142822502277331.post-65834122279497228532023-02-07T19:04:00.000-03:002023-02-07T19:04:20.617-03:00All Opcodes com Genie<p style="text-align: justify;"><a href="https://spectrumcomputing.co.uk/entry/8208/ZX-Spectrum/Genie" target="_blank"><b>Genie</b></a> é um conhecido <i>disassembler</i> para <b>Multiface 1</b>. Resolvi verificar como ele se sai com o <a href="https://cantinhotk90x.blogspot.com/2023/02/all-opcodes-programa.html"><b>All Opcodes</b></a>.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgosa4uOQOF3WWEhQor4vELY_rnt2JCfS4FDmLz05INgFEytguA6mfZR4EaMfHt-gn7URLPjgwyJsmx070umu0vbCLBGailXYF5U6Ppli0VL7isseMf4898ZcB_UVbSZLdIq5eqG0Pe5cb8fmxxa8xWWvn97M4xcyEGTSYw_aXLEj063fvxEwStLwk/s640/All%20Opcodes%20Genie.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="480" data-original-width="640" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgosa4uOQOF3WWEhQor4vELY_rnt2JCfS4FDmLz05INgFEytguA6mfZR4EaMfHt-gn7URLPjgwyJsmx070umu0vbCLBGailXYF5U6Ppli0VL7isseMf4898ZcB_UVbSZLdIq5eqG0Pe5cb8fmxxa8xWWvn97M4xcyEGTSYw_aXLEj063fvxEwStLwk/s320/All%20Opcodes%20Genie.png" width="320" /></a></div>
<span><a name='more'></a></span>
<p style="text-align: justify;">Como era esperado, o Genie consegue <i>disassemblar</i> as instruções oficiais. Na tela acima, há uma amostra das primeiras instruções <b>Z80</b>, em ordem crescente de <i>opcode</i>. Instruções fora da lista oficialmente divulgada pela <b>Zilog</b> também são reconhecidas, como as SLL, e as que tratam separadamente os registradores IX e IY como IXh/IXl e IYh/IYl, respectivamente. Entretanto notei uma repetição de instruções de blocos (CPI, CPD, CPIR, CPDR, etc) nas instruções com prefixo ED não documentada em nenhum lugar. Não sei se é um problema do Genie.<br /></p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhMhX45pWfHDzpUGwKpWbnxSufkY3pAc_EadIosZbp45Jxy1g2rP5yRx_TBlihFv4svPOno2ceWvk5ND0yS84PLYH77oQTFGjdsWespyvxdvVoTY5tr1Q1VJI1ZM4PenapHFo98shxv5WJmq7fFQ9qfFNAZRBVdtZDXEhEsRJeddkfs6R1fZRGB-Eb/s640/All%20Opcodes%20Genie%202.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="480" data-original-width="640" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhMhX45pWfHDzpUGwKpWbnxSufkY3pAc_EadIosZbp45Jxy1g2rP5yRx_TBlihFv4svPOno2ceWvk5ND0yS84PLYH77oQTFGjdsWespyvxdvVoTY5tr1Q1VJI1ZM4PenapHFo98shxv5WJmq7fFQ9qfFNAZRBVdtZDXEhEsRJeddkfs6R1fZRGB-Eb/s320/All%20Opcodes%20Genie%202.png" width="320" /></a></div>
<p style="text-align: justify;">As instruções com prefixos duplos DDCB e FDCB são consideradas como instruções simples de rotação, deslocamento e manipulação de bit, como se vê na tela acima. Acredito que na época não se conheciam as instruções que transferem o resultado da operação de bit a um registrador de 8 bits como, por exemplo, LD B,RLC (IX+d). <br /></p>
<p style="text-align: justify;">Concluindo, o Genie é um bom programa para <i>disassembly</i>, considerando a sua idade.<br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5263142822502277331.post-40508055763267078912023-02-03T22:36:00.000-03:002023-02-03T22:36:14.650-03:00All Opcodes (programa)<p style="text-align: justify;">Criei um programa BASIC para <b>TK90X</b> que gera todas combinações possíveis de <i>opcodes</i> para o <b>Z80</b>.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOHCRWWjmjpBbr_v0dAcekViOobna9QYfu07_7_V6otGzGzNxSe7Ous_eEAldqw34XW9VB_YDjHaIVLyJMVjrMVwEBFF3Slob7gJwowmYGeKt3pb0fd6ZD_f7ON00atu4FdqCSzgirHapa7pwsicwOq8rXsMWHgTqdUWYjZWbGe_AasfcrauWPnwFs/s1009/All%20Opcodes%20Fuse%20Debug%201.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="572" data-original-width="1009" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOHCRWWjmjpBbr_v0dAcekViOobna9QYfu07_7_V6otGzGzNxSe7Ous_eEAldqw34XW9VB_YDjHaIVLyJMVjrMVwEBFF3Slob7gJwowmYGeKt3pb0fd6ZD_f7ON00atu4FdqCSzgirHapa7pwsicwOq8rXsMWHgTqdUWYjZWbGe_AasfcrauWPnwFs/s320/All%20Opcodes%20Fuse%20Debug%201.png" width="320" /></a></div>
<span><a name='more'></a></span>
<p style="text-align: justify;">No <i>debugger</i> do emulador <b>Fuse</b> da figura acima, pode-se ver na coluna central o <i>disassembly</i> do código gerado, começando com a instrução NOP (<i>opcode</i> 00). Como o Z80 é um microprocessador CISC, os <i>opcodes</i> podem ter tamanhos variados, de 1 a 4 bytes. Por causa disso, tive que fazer um programa para os produzir. Para facilitar a organização, os opcodes foram agrupados em blocos, iniciando com as instruções sem prefixo.<br /></p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1d8Qb-tPqJWAm9DR0CPSx9BgfgCr8cXUtlkVtLUyQSHHjdaHM0CZOI6Axxf1kX6dLq7vNSbI93cLX2hUyGitv9Ifl35J9zv-I8_UeQCyKx94XJVOy3AFHM6tz8nFdJf9OTfJcDLS7ZYqf8Tw_d0nK80U7EtVUwX4myV5kslmUH9jRXTWAp_K1ZW5J/s1009/All%20Opcodes%20Fuse%20Debug%202.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="572" data-original-width="1009" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1d8Qb-tPqJWAm9DR0CPSx9BgfgCr8cXUtlkVtLUyQSHHjdaHM0CZOI6Axxf1kX6dLq7vNSbI93cLX2hUyGitv9Ifl35J9zv-I8_UeQCyKx94XJVOy3AFHM6tz8nFdJf9OTfJcDLS7ZYqf8Tw_d0nK80U7EtVUwX4myV5kslmUH9jRXTWAp_K1ZW5J/s320/All%20Opcodes%20Fuse%20Debug%202.png" width="320" /></a></div>
<p style="text-align: justify;">Em seguida, vem as instruções com prefixo CB (vide acima), que são de rotação, deslocamento e manipulação de bits. O terceiro bloco são das instruções de prefixo ED que, em sua grande parte, nada fazem e na figura abaixo, são representadas como NOPD.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMZTjilJbxM51alEqcSswf40wZ97TfYhNue-xlYZ8P0tSqjm0Ggw7om9rhMrUolWUUvqZ3GWqFcblArkLQpHN1Y6mTiDL4Llif1K2VJVlA4-miZnSF4aI_P4SXbheuC4Qgxa5aL8WYcDMyK83rlAc9dlKX6VXvxqemTPdWFHB0Ulh7_C5Xo5CzPjDR/s1009/All%20Opcodes%20Fuse%20Debug%203.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="572" data-original-width="1009" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMZTjilJbxM51alEqcSswf40wZ97TfYhNue-xlYZ8P0tSqjm0Ggw7om9rhMrUolWUUvqZ3GWqFcblArkLQpHN1Y6mTiDL4Llif1K2VJVlA4-miZnSF4aI_P4SXbheuC4Qgxa5aL8WYcDMyK83rlAc9dlKX6VXvxqemTPdWFHB0Ulh7_C5Xo5CzPjDR/s320/All%20Opcodes%20Fuse%20Debug%203.png" width="320" /></a></div>
<p style="text-align: justify;">A seguir, vem as instruções de prefixos DD e FD que envolvem registradores IX e IY, respectivamente.<br /></p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1R6Af5yQ1UlDbKMwU8th5kQOOLrNk91BFNoNhZtOIC71QalT2--050J4yJRIVPmlWeJ8LRLUOdRAeuUQGXF2x1yKf5Jm9752dvYw8WsUftF9qdPUPLmPnF_u1d9xEYLaIVn-__pbAjYH-ZNCqZcj1GOlSZdJ5OKWxRckbU3NGOIwRsJHaPRx7Ticq/s1009/All%20Opcodes%20Fuse%20Debug%204.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="572" data-original-width="1009" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1R6Af5yQ1UlDbKMwU8th5kQOOLrNk91BFNoNhZtOIC71QalT2--050J4yJRIVPmlWeJ8LRLUOdRAeuUQGXF2x1yKf5Jm9752dvYw8WsUftF9qdPUPLmPnF_u1d9xEYLaIVn-__pbAjYH-ZNCqZcj1GOlSZdJ5OKWxRckbU3NGOIwRsJHaPRx7Ticq/s320/All%20Opcodes%20Fuse%20Debug%204.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji_6b5z03vL7LNbqgk9sWp-jAcH7g6J8Af1X5pWgpgWgz2FP0d-6zBfIc6Lp7JIUcejpgbUN9g9FH6ZAf_G5nkuX-o8_0fd1qKwBeCElj4mZOGWOibmoh28YqvlRu2eRX8zUxNxnMVkdHGjBXBnZBUOE-E2YKZs15MkCrRhTGNUrD1u05ddKbLH160/s1009/All%20Opcodes%20Fuse%20Debug%205.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="572" data-original-width="1009" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji_6b5z03vL7LNbqgk9sWp-jAcH7g6J8Af1X5pWgpgWgz2FP0d-6zBfIc6Lp7JIUcejpgbUN9g9FH6ZAf_G5nkuX-o8_0fd1qKwBeCElj4mZOGWOibmoh28YqvlRu2eRX8zUxNxnMVkdHGjBXBnZBUOE-E2YKZs15MkCrRhTGNUrD1u05ddKbLH160/s320/All%20Opcodes%20Fuse%20Debug%205.png" width="320" /></a></div><p style="text-align: justify;">Por fim, vem as de prefixo duplo DDCB e FDCB que, em grande parte, não são documentadas oficialmente pela <b>Zilog</b>.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVIMi9N8Ew8OxpyU9AhMbgj3Dn2HDY8NquMqlHhS49CvQmeXod787fhavcXh7ZWGKHD7Sulf5Db21ZebuHHXaIlvtwj_iCaH30ogthyQuFkRWF17Ib_5G31scR6eEFZ9_v5MRmM-kMTLXspUBX5rDSUZQF39mF85XC3zCwoz5u6epc16v-4dcnrVOl/s1009/All%20Opcodes%20Fuse%20Debug%206.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="572" data-original-width="1009" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVIMi9N8Ew8OxpyU9AhMbgj3Dn2HDY8NquMqlHhS49CvQmeXod787fhavcXh7ZWGKHD7Sulf5Db21ZebuHHXaIlvtwj_iCaH30ogthyQuFkRWF17Ib_5G31scR6eEFZ9_v5MRmM-kMTLXspUBX5rDSUZQF39mF85XC3zCwoz5u6epc16v-4dcnrVOl/s320/All%20Opcodes%20Fuse%20Debug%206.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHNUeHEe1LCCQA4KTeI6mw6JKEBiD_KsJb3ntmAT-nsilEtICHineeMHLrCs0_3t-lh2RARCDHyBD-C1WRKOKpa--sYEMX6moSdrAX_gZuq3MiJ0Yblyl7kC112DqL9dUHJhQ2gIweS1sD7r2vpBc_RBo-Z1AQbQuF4np5NQseEcflB623VDZBp_S7/s1009/All%20Opcodes%20Fuse%20Debug%207.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="572" data-original-width="1009" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHNUeHEe1LCCQA4KTeI6mw6JKEBiD_KsJb3ntmAT-nsilEtICHineeMHLrCs0_3t-lh2RARCDHyBD-C1WRKOKpa--sYEMX6moSdrAX_gZuq3MiJ0Yblyl7kC112DqL9dUHJhQ2gIweS1sD7r2vpBc_RBo-Z1AQbQuF4np5NQseEcflB623VDZBp_S7/s320/All%20Opcodes%20Fuse%20Debug%207.png" width="320" /></a></div>
<p style="text-align: justify;">Qual a utilidade disso? Uma seria testar se um programa <i>disassembler</i> consegue decodificar todos os <i>opcodes</i>, em especial as não reconhecidas oficialmente. Outra seria para estudar a linguagem <i>assembly</i> Z80. Só não recomendo tentar rodar esse código, os resultados seriam imprevisíveis. :-)<br /></p>
<p style="text-align: justify;">O arquivo <i>zip</i> contendo o programa BASIC e outras informações encontra-se <a href="https://drive.google.com/file/d/1o7We2HDuwbR-d5K8YKqR15AtCQ-478n0/view?usp=share_link" rel="nofollow" target="_blank">neste <i>link</i> para o <b>Google Drive</b></a>.<br /></p>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5263142822502277331.post-2789786247054227762023-01-21T21:02:00.001-03:002023-01-21T21:02:37.644-03:00Atualização do Spectrum Computing e Brasil<p style="text-align: justify;">Recentemente descobri como contribuir com o repositório de dados <a href="https://spectrumcomputing.co.uk" target="_blank"><b>Spectrum Computing</b></a>.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj46aNCdUAp2N9lJhBvQ2bMG2GfT42bxSP3FiYBdrc2Wwqxkkj89GK7F1neRLVwWdEwKudvjhLph0kz8RhDUfRsS8DP46lfzvL6SlFMd2IYWLuvmAapHtihEIb3B9ugcKmxH5UD_BqW13esT9mpqtsKwkYyfEYcYoMuRQRb3uumHIBgIVyisOCx8gPU/s800/SpectrumComputing.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="457" data-original-width="800" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj46aNCdUAp2N9lJhBvQ2bMG2GfT42bxSP3FiYBdrc2Wwqxkkj89GK7F1neRLVwWdEwKudvjhLph0kz8RhDUfRsS8DP46lfzvL6SlFMd2IYWLuvmAapHtihEIb3B9ugcKmxH5UD_BqW13esT9mpqtsKwkYyfEYcYoMuRQRb3uumHIBgIVyisOCx8gPU/s320/SpectrumComputing.jpg" width="320" /></a></div>
<span><a name='more'></a></span>
<p style="text-align: justify;">Já descrevi o referido portal num <a href="https://cantinhotk90x.blogspot.com/2022/01/spectrum-computing.html">artigo passado</a>. Acredito que no momento é a melhor fonte de informações sobre <b>ZX Spectrum</b> e <b>TK90X/95</b>, além da linha <b>ZX-81</b> (<b>TK85</b>, <b>CP200</b> e similares). Notei que as informações dos produtos e produções brasileiras estão ausentes ou incompletas no Spectrum Computing. Já coloquei algumas informações e arquivos que tinha à disposição. Na atualização do banco de dados <b>ZXDB</b> mais recente, de 19/Jan/2023, foram acrescentados os seguintes itens brasileiros:</p>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgW3ltmwXtpibZ1z93s-0yb7Yy0HMNp6O9r8Ax11Dgpmnpo4GXsFFyk6jnYdm6L3BUn39-P2rOJf0UyQNl-5pnXoCYzW2URd_qdIFRm_ro06Ach1RbPjmHVOXxob8myBgiMBaZbxBnhJlEBWDUHTfDh4oFbPqW_uXUiQMVljuXcxo0ZKIBx4C_WCM-W/s1944/Memory%20Expansion%2032k%20-%2001.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1824" data-original-width="1944" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgW3ltmwXtpibZ1z93s-0yb7Yy0HMNp6O9r8Ax11Dgpmnpo4GXsFFyk6jnYdm6L3BUn39-P2rOJf0UyQNl-5pnXoCYzW2URd_qdIFRm_ro06Ach1RbPjmHVOXxob8myBgiMBaZbxBnhJlEBWDUHTfDh4oFbPqW_uXUiQMVljuXcxo0ZKIBx4C_WCM-W/s320/Memory%20Expansion%2032k%20-%2001.jpg" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><span style="font-size: x-small;">Foto: <a href="https://cyberzon.com.br/" target="_blank">FrioTK</a></span><br /></td></tr></tbody></table>
<ul style="text-align: left;">
<li><a href="https://spectrumcomputing.co.uk/entry/1001161/Hardware/Memory_Expansion_32Kbytes" target="_blank">Memory Expansion 32Kbytes</a> (Microdigital);</li>
<li><a href="https://spectrumcomputing.co.uk/entry/1001160/Hardware/CBI-95" target="_blank">CBI-95</a> (Centro Brasileiro de Informática);</li>
<li>Fotos do <a href="https://spectrumcomputing.co.uk/entry/1000974/Hardware/CP200" target="_blank">CP200</a> (Prológica);</li>
<li>Fotos do <a href="https://spectrumcomputing.co.uk/entry/1000976/Hardware/CP200S" target="_blank">CP200S</a> (Prológica).</li></ul>
<p style="text-align: justify;">Registro meus agradecimentos ao meu amigo <a href="https://cyberzon.com.br/" target="_blank">FrioTK</a> que, gentilmente, cedeu várias fotos que ele havia tirado. Com tempo, pretendo ir adicionando mais materiais ao Spectrum Computing. Se algum leitor tiver alguma foto, manual, esquema ou qualquer coisa relacionado a <i>software</i> ou <i>hardware</i> produzido ou comercializado no Brasil, peço que entre em contato.<br /></p>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5263142822502277331.post-53095118299520707512023-01-16T14:49:00.000-03:002023-01-16T14:49:09.091-03:00Minha opinião sobre retro FPGA<p style="text-align: justify;">Já faz um tempo que tenho refletido sobre todo o movimento de recriar computadores clássicos com tecnologia moderna. O que me motivou a escrever a respeito foi este <a href="https://wiki.specnext.dev/Extended_Z80_instruction_set" rel="nofollow" target="_blank">artigo</a>.</p>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBHAMYjCnqzp7oI9z-9bH_C_M7zAzOPn4Pj5hXGBkUvMUMc5Im5cwpFEa2AnTQ9rIDnSpWeL5TR-jXN_J-QjSchICMANKb5jQYTBQ5pKHZiyjDZKNV25PB0nJt6uenGB64ttfK987jS2lHj1JATdOIvkC2BNmjF28CeimW1J5vBnEbDaBBrP4D2RD1/s387/ZX_Spectrum_Next_Issue_1.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="258" data-original-width="387" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBHAMYjCnqzp7oI9z-9bH_C_M7zAzOPn4Pj5hXGBkUvMUMc5Im5cwpFEa2AnTQ9rIDnSpWeL5TR-jXN_J-QjSchICMANKb5jQYTBQ5pKHZiyjDZKNV25PB0nJt6uenGB64ttfK987jS2lHj1JATdOIvkC2BNmjF28CeimW1J5vBnEbDaBBrP4D2RD1/s320/ZX_Spectrum_Next_Issue_1.jpg" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Fonte: <a href="https://en.wikipedia.org/wiki/File:ZX_Spectrum_Next_Issue_1.jpg" rel="nofollow" target="_blank">Wikipédia</a><br /></td></tr></tbody></table>
<span><a name='more'></a></span>
<p style="text-align: justify;">Fiquei sabendo que o <b>Z80</b> implementado no <a href="https://en.wikipedia.org/wiki/ZX_Spectrum_Next" target="_blank"><b>ZX Spectrum Next</b></a> não é 100% fiel à CPU da <b>Zilog</b>. Foram implementadas algumas instruções extras nos <i>opcodes</i> não aproveitadas no Z80 original. Confesso que essa descoberta me incomodou.</p>
<p style="text-align: justify;">Antes de prosseguir, quero deixar bem claro que não estou desaprovando o projeto do Next, nem criticando os elaboradores ou fãs. Na minha visão, toda iniciativa dentro da retrocomputação é válida e, neste caso, permite o acesso para quem não consegue adquirir o <i>hardware</i> original da época. Neste artigo, estou expressando as minhas percepções e reflexões a respeito, isto é, uma perspectiva individual minha.</p>
<p style="text-align: justify;">De uma certa forma <a href="https://cantinhotk90x.blogspot.com/2013/03/primeiros-testes-com-o-clone-da-ula-do.html">eu estive envolvido</a> no que se tornou o Next, quando a <a href="http://cantinhotk90x.blogspot.com/2012/12/ula-do-tk90x-clonado.html">ULA do TK90X foi clonada</a> em CPLD. Depois a coisa foi seguindo em frente e eu acabei não acompanhando mais. A impressão que tinha ficado para mim era que o Next seria uma ideia de um possível sucessor do <b>ZX Spectrum</b> que não o decepcionante <a href="https://en.wikipedia.org/wiki/Sinclair_QL" target="_blank"><b>Sinclair QL</b></a>. Uma iniciativa nesse sentido é o <a href="https://sites.google.com/site/ulaplus/" target="_blank">ULAplus</a> que talvez não fosse economicamente viável, mas tecnicamente era realizável na época. Teve ainda o <a href="https://en.wikipedia.org/wiki/SAM_Coup%C3%A9" target="_blank">Sam Coupé</a>, uma excelente máquina que poderia ser considerada o sucessor do Spectrum.</p>
<p style="text-align: justify;">O ponto é que nunca existiu um Z80 implementando as instruções extras presentes no FPGA do Next. Portanto não haveria condições de, na época, fazer um <i>hardware</i> real. Aliás, nem hoje, exceto em FPGA ou emulação. Isso é um pecado? Não, é totalmente válido. Só que é uma abordagem da qual não tenho interesse nenhum. Na minha concepção, <i>retrocomputação</i> tem sentido se: 1) ser agradável ou divertido; ou 2) ser historicamente verossímil. </p>
<p style="text-align: justify;">Começando pelo segundo ponto, com a tecnologia do Séc. XXI, pode-se fazer qualquer coisa ordens de grandeza mais complexa e eficiente do que em 1980-1990. Com as possibilidades atuais, não é difícil de se chegar a um <i>hardware</i> totalmente alienígena em relação à época histórica<i>.</i> Portanto seria um projeto moderno que fugiria, a rigor, da definição de <i>retrocomputação</i>. Apesar do aspecto histórico ter sua importância, o primeiro ponto abre uma brecha para desenvolver sistemas inviáveis de existirem no passado.</p><p style="text-align: justify;">Volto aqui então no quesito de ser agradável ou divertido. A <i>retrocomputação</i> não é apenas História, Ciência Exata ou Tecnologia. Ela existe porque há pessoas motivadas em investir seu tempo e conhecimento. Em outras palavras, a <i>retrocomputação</i> é um passatempo, que dever ser agradável e divertido. Se alguém acha interessante desenvolver uma implementação física ou virtual de um Z80 com clock de 1 GHz, por que não? Desde que haja motivação para isso, é uma iniciativa totalmente válida! <br /></p>
<p style="text-align: justify;">Volto então aqui ao início da conversa. Acredito que há uma comunidade que gosta muito do Next e que tem razões para isso. Mexer com <i>hardware</i> antigo tem seus pontos negativos dada a sua fragilidade, requer certas habilidades e pode dar muito trabalho e frustração. Ter portanto um Spectrum feito com tecnologia moderna, mais robusto e com materiais de melhor qualidade é um sonho realizado para muitos. Além disso, se tiver algumas melhorias como, por exemplo, modos de vídeo melhores, poderia motivar os programadores a criarem jogos e demos impossíveis na máquina original. Tudo isso é extremamente válido, não sou contra.</p><p style="text-align: justify;">Entretanto, o Next não me atrai, por uma série de razões. De início, eu possuo os equipamentos da época, portanto não necessito de uma recriação. Se o uso do <i>hardware</i> original não for cômodo, disponível ou adequado, posso lançar mão de um emulador em computador moderno. Por fim, não tenho interesse em nenhuma das melhorias implementadas modernamente, pois foge da nostalgia de sentir as limitações da antiga tecnologia. Um computador de mesa, <i>notebook</i> ou mesmo um telefone celular moderno tem capacidade quase infinitamente maior que o Spectrum e usamos cotidianamente. Não vejo portanto muita graça em introduzir recursos extras numa recriação e fazer um jogo ou demo "melhor" (seja lá o que significa isso) do que seria feito no equipamento original.</p><p style="text-align: justify;">De qualquer forma, isso é apenas uma opinião minha, válida para mim. Portanto, se você ama o Next, tem toda a razão. O importante é se divertir com o <i>hobby</i>.<br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5263142822502277331.post-72991900515937741372023-01-15T11:07:00.000-03:002023-01-15T11:07:27.345-03:00Mods na ROM da M1<p style="text-align: justify;">Depois que preparei o <a href="https://cantinhotk90x.blogspot.com/2023/01/nova-versao-do-disassembly-da-rom-da-m1.html" target=""><i>disassembly</i> da ROM da <b>Multiface 1</b></a>, resolvi fazer algumas modificações.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl0IiR1o41-JjFKE2fM-cBzBKrBDfW2qVHbaAcxJ-GBy5S29WnFoeniXSnY3m4jkOwXPposGJqISm8LXr5IiF43Lfl5XD8Db8ljnXrRYusqEplGKck0_vWdRPtVf_hLYhQW5OfU02obQCQK9dCLWY7dwTsn3eDKXeAjgzABUnjF5kFGefyV-cTjskm/s842/M1_05.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="700" data-original-width="842" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl0IiR1o41-JjFKE2fM-cBzBKrBDfW2qVHbaAcxJ-GBy5S29WnFoeniXSnY3m4jkOwXPposGJqISm8LXr5IiF43Lfl5XD8Db8ljnXrRYusqEplGKck0_vWdRPtVf_hLYhQW5OfU02obQCQK9dCLWY7dwTsn3eDKXeAjgzABUnjF5kFGefyV-cTjskm/s320/M1_05.jpg" width="320" /></a></div>
<span><a name='more'></a></span>
<p style="text-align: justify;">A primeira modificação foi remover todos os <i>bugs</i> que eu detectei durante o <i>disassembly</i>. No geral são <i>bugs</i> benignos e não faz muita diferença no funcionamento da M1. Segue o <a href="https://drive.google.com/file/d/1dBi4oS_YzYsbrnR3k2HmcaZdB5Tporxv/view?usp=share_link" target="_blank"><i>link</i> para baixar do Google Drive</a>.<br /></p>
<p style="text-align: justify;">Outra modificação foi remover todo o suporte para <b><a href="https://spectrumcomputing.co.uk/entry/1000350/Hardware/Rotronics_Wafadrive" target="_blank">Rotronics Wafadrive</a></b>. Não conheço nenhum emulador de <b>ZX Spectrum</b> que emule este <i>hardware</i> e são poucas a informações a seu respeito. Uma das coisas que reparei no <i>disassembly</i> é que o código para Wafadrive destoa do código para fita, Microdrive ou Beta 48, ocupando mais de 1800 bytes da ROM. Ao remover todo o código dedicado a esse <i>hardware</i>, abre-se um espaço grande na ROM, que poderia ser usado para um recurso novo na M1. Aqui está o <a href="https://drive.google.com/file/d/1_-uZh3XMUyQB-TNiZt2fSRhRlw_ATlaB/view?usp=share_link" target="_blank"><i>link</i> para baixar do Google Drive</a>.</p>
<p style="text-align: justify;">Os arquivos <i>zip</i> que estou fornecendo contém o código fonte das ROM modificadas. Para obter o arquivo binário, pode ser usado o <a href="https://cantinhotk90x.blogspot.com/2013/04/pasmo.html"><b>pasmo</b></a> ou outro <i>assembler</i> para <b>Z80</b>.<br /></p>
<p style="text-align: justify;">Pretendo fazer novas <i>mods</i> na ROM, estarei anunciando aqui no <b>Cantinho do TK90X</b>.</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5263142822502277331.post-49455154665556138442023-01-09T11:09:00.000-03:002023-01-09T11:09:41.846-03:00Disassembly da ROM da M1 brasileira<p style="text-align: justify;"> Fiz o <i>disassembly</i> da ROM do clone brasileiro da <b>Multiface 1</b>.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfKpwrDG7DviLfOKpmqIcbWffXSVnFhDjifqbRrtDdAKWtavs0WzMbpuOI6yMPIcDJQHls2QhtR83QCEIQ5AIi2Z7ivsYbpvC9uczZ-Q2Kb-g1f8Ri-TCOR0UfMofEQtiheFsWyFEygy1fZPWhUjmmbpAipKdXA8c6F9qV3Lou4fJu_uyuuQrkWe0Q/s1809/M1_02.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1435" data-original-width="1809" height="254" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfKpwrDG7DviLfOKpmqIcbWffXSVnFhDjifqbRrtDdAKWtavs0WzMbpuOI6yMPIcDJQHls2QhtR83QCEIQ5AIi2Z7ivsYbpvC9uczZ-Q2Kb-g1f8Ri-TCOR0UfMofEQtiheFsWyFEygy1fZPWhUjmmbpAipKdXA8c6F9qV3Lou4fJu_uyuuQrkWe0Q/s320/M1_02.jpg" width="320" /></a></div>
<span><a name='more'></a></span>
<p style="text-align: justify;">Como eu já tinha feito o <i>disassembly</i> da <a href="https://cantinhotk90x.blogspot.com/2022/11/disassembly-da-rom-da-m1.html">ROM mais comum</a>, agora foi a vez do clone brasileiro que possuo. Fiz uma imagem da ROM do meu equipamento e usei o <i>disassembler</i> <a href="https://www.tablix.org/~avian/blog/articles/z80dasm/" target="_blank"><b>z80dasm</b></a>. Depois formatei e inseri os comentários manualmente. A propósito, o "número mágico" da versão brasileira é 93 (em hexadecimal).<br /></p><p style="text-align: justify;">Há poucas diferenças em relação ao <i>disassembly</i> anterior, a ROM brasileira é um pouco menor porque o não há no Direct Jump o código para verificar o Jump Mode (mais detalhes, procure nos comentários do <i>disassembly</i>). Por conta disso, as posições das rotinas estão todas deslocadas e portanto o acesso direto a elas é dificultada. Percebi ainda dois <i>bytes</i> que parecem terem sidos corrompidos ao serem clonados. Não faço ideia da origem dessa ROM.</p><p style="text-align: justify;">Para baixar o arquivo <i>zip</i> com o <i>disassembly</i>, clique <a href="https://drive.google.com/file/d/1JEyrWFx6KpK0q0cgJBZDEX00nzn3u0Ma/view?usp=share_link" rel="nofollow" target="_blank">neste <i>link</i></a>. A propósito, os comentários estão em inglês.<br /></p>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5263142822502277331.post-78251362490869225442023-01-05T13:18:00.000-03:002023-01-05T13:18:08.124-03:00Nova versão do disassembly da ROM da M1<p style="text-align: justify;"> Fiz uma nova versão do <i>disassembly</i> que <a href="https://cantinhotk90x.blogspot.com/2022/11/disassembly-da-rom-da-m1.html">anunciei anteriormente</a>.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh59kSE0UzrDyJVPpFImg-EM-v3QPkfSC7qI0WaupJtXKWUUzFxK-ht414yDbgnh3xtkvYygwIFH-puhXpUJ6ZIcGePQFUuYuVVnhYbgl35zOlfMO4dc_WhtuiEsAMGAHT1MN2aFmemv-ZhdzkjOQFKmtAIqpDKIN4219-frIN2USEOiE-3X57gTQPt/s800/M1_02.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="635" data-original-width="800" height="254" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh59kSE0UzrDyJVPpFImg-EM-v3QPkfSC7qI0WaupJtXKWUUzFxK-ht414yDbgnh3xtkvYygwIFH-puhXpUJ6ZIcGePQFUuYuVVnhYbgl35zOlfMO4dc_WhtuiEsAMGAHT1MN2aFmemv-ZhdzkjOQFKmtAIqpDKIN4219-frIN2USEOiE-3X57gTQPt/s320/M1_02.jpg" width="320" /></a></div><br />
<span><a name='more'></a></span>
<p style="text-align: justify;">Adicionei alguns mapas de memórias que esqueci na versão anterior e fiz algumas correções menores. Para baixar o arquivo zip, acesse <a href="https://drive.google.com/file/d/1JLH_fYa4NuvIoZkW6_2aQVkyuJU237xN/view?usp=share_link" target="_blank">este <i>link</i></a>. <br /></p>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5263142822502277331.post-73517549357129744692023-01-04T10:52:00.002-03:002023-01-04T13:57:09.951-03:00Softfile (Plansoft)<p style="text-align: justify;">Ontem recebi do meu amigo <a href="https://oldplayers.com.br/wp/" rel="nofollow" target="_blank">BrancoRP2000</a> os arquivos TZX resultante da digitalização da fita do programa Softfile da <a href="https://spectrumcomputing.co.uk/list?label_id=11546" target="_blank">Plansoft</a>.</p>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFpSp25lyb19Gnkd-WOXLEi1kqWP1ZnWrbsi4TO--qh4SV4ao24kWhcB6CL-OYgW00NSfkBgYqqYtD77PlRGgJP7I4oHxwK_8XYo1gjrVoO-Oygfsj528LVf6he_3mZPLevH0L2dmxFNA5IXukUCLMiA43ZtK83FuzutOdx5Ba5mGh76Tx8YTh2oNu/s702/Fita%20Softfile%20by%20BrancoRP2000%20small.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="702" data-original-width="628" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFpSp25lyb19Gnkd-WOXLEi1kqWP1ZnWrbsi4TO--qh4SV4ao24kWhcB6CL-OYgW00NSfkBgYqqYtD77PlRGgJP7I4oHxwK_8XYo1gjrVoO-Oygfsj528LVf6he_3mZPLevH0L2dmxFNA5IXukUCLMiA43ZtK83FuzutOdx5Ba5mGh76Tx8YTh2oNu/w286-h320/Fita%20Softfile%20by%20BrancoRP2000%20small.jpg" width="286" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Crédito da foto: BrancoRP2000<br /></td></tr></tbody></table>
<span><a name='more'></a></span>
<p style="text-align: justify;">O problema é que toda tentativa de carregar o programa resultava na reinicialização do TK90X, então foi me pedido para tentar investigar o problema. Ao analisar o programa BASIC inicial, notei que não havia nenhuma instrução CLEAR para ajustar o RAMTOP. Entretanto a parte em código de máquina, carregada logo após, sobrepõe o topo da RAM BASIC e, por consequência, acaba corrompendo a pilha da máquina. Portanto bastaria definir o RAMTOP num endereço anterior ao início do código de máquina em 57328 antes de carregar o programa, com <code>CLEAR 57327</code>. Feito isso, a tela inicial aparece e o programa funciona normalmente.<br /></p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQd4kPmw_fXBp1NWkr2BoafalrLmHt88vwzWEzexghPyXr7JVSLwxRTyTFjQchmGFUtNd4N42clRlJsYjvXW5nUVi2Avee-y0vJQV6i7zpZ6tqMnaUm8E-PIW-fMyO_EYUDuh5A6ESL-7LrWlT3KGb6olCtxxie63tH5GKBnQUjvVugp5qjxbl2XDh/s320/TelaInicial.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="240" data-original-width="320" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQd4kPmw_fXBp1NWkr2BoafalrLmHt88vwzWEzexghPyXr7JVSLwxRTyTFjQchmGFUtNd4N42clRlJsYjvXW5nUVi2Avee-y0vJQV6i7zpZ6tqMnaUm8E-PIW-fMyO_EYUDuh5A6ESL-7LrWlT3KGb6olCtxxie63tH5GKBnQUjvVugp5qjxbl2XDh/s1600/TelaInicial.png" width="320" /></a></div>
<p style="text-align: justify;">O programa é o banco de dados <a href="https://spectrumcomputing.co.uk/entry/8395/ZX-Spectrum/Masterfile" rel="nofollow" target="_blank">Masterfile</a> traduzido para o português. A informação foi obtida por Garretimus com o próprio autor da tradução do programa e manual. Uma rápida pesquisada no Datassette me fez encontrar o <a href="https://datassette.org/manuais/br-brasil-aplicativos-zx-spectrum-sinclair-manuais/softfile" target="_blank">referido manual</a>. Nele, encontrei as instruções para fazer o CLEAR antes de carregar o programa. 🙂 Mistério resolvido.<br /></p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_QN3MmEFHtxwvwB5wVUbGEWYVfU9SzPrR4_qX2w9135hCJaZgmHWIAomCIPahiBdyYH6qjBT3CdD5rTZYPVY00pQmECnPHN6G2zr8h1lLRKm5RSNLPbzJZ-FRe72R3iWnT6y-DeoSoQO1pyD_BcsddqBnJLkUSDHT1IpgxMzA3WT6mSg9PjagOGjv/s1748/Instru%C3%A7%C3%A3o%20Carga.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="409" data-original-width="1748" height="75" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_QN3MmEFHtxwvwB5wVUbGEWYVfU9SzPrR4_qX2w9135hCJaZgmHWIAomCIPahiBdyYH6qjBT3CdD5rTZYPVY00pQmECnPHN6G2zr8h1lLRKm5RSNLPbzJZ-FRe72R3iWnT6y-DeoSoQO1pyD_BcsddqBnJLkUSDHT1IpgxMzA3WT6mSg9PjagOGjv/s320/Instru%C3%A7%C3%A3o%20Carga.png" width="320" /></a></div>
<p style="text-align: justify;">Na fita ainda vem um exemplo de dados gerados pelo Softfile. Além de alguns registros contendo informações básicas, aparece uma lista de <i>softwares</i> que, aparentemente, fazia parte do catálogo da Plansoft.<br /></p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnGQzvrj7pdXwMDw1pHGO5a6Ybehie9ywEDwm0CwnHtRJCYxrIw0I3OYBQorPWi_N17KGzIhai_OV1wXoqSaTz_RX_W5bCpWAW-djcOHn9aRJwyMFvZpazjq_WhfXKOon-i_A0yXuCNErjMtJWvT1F2OljthMk9iIf8ktyS4g53HMAmDbSAk9A2Rv9/s320/Exemplo1.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="240" data-original-width="320" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnGQzvrj7pdXwMDw1pHGO5a6Ybehie9ywEDwm0CwnHtRJCYxrIw0I3OYBQorPWi_N17KGzIhai_OV1wXoqSaTz_RX_W5bCpWAW-djcOHn9aRJwyMFvZpazjq_WhfXKOon-i_A0yXuCNErjMtJWvT1F2OljthMk9iIf8ktyS4g53HMAmDbSAk9A2Rv9/s1600/Exemplo1.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj7anlXueXre6IgIukKQZa11fIJkjf3njkoYrPbBoMxYLTjRGYJr8HW3VZXkckAMSbVqUVznr5g4PD7BvoWNk7A1D8RuCVA-ofpUjmChyBKeFkC-rhlGDfHD8bDgZDzsoEBjxDnwstpXIjQ400Zspy8iAchL58lg9ml64zrvjmJYZr6y5giuDalQ7l/s320/Exemplo2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="240" data-original-width="320" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj7anlXueXre6IgIukKQZa11fIJkjf3njkoYrPbBoMxYLTjRGYJr8HW3VZXkckAMSbVqUVznr5g4PD7BvoWNk7A1D8RuCVA-ofpUjmChyBKeFkC-rhlGDfHD8bDgZDzsoEBjxDnwstpXIjQ400Zspy8iAchL58lg9ml64zrvjmJYZr6y5giuDalQ7l/s1600/Exemplo2.png" width="320" /></a></div>
<p style="text-align: justify;"><b>Atualização:</b> o arquivo zip contendo o programa e materiais adicionais pode ser acessado <a href="https://softwares.oldplayers.com.br/wp/softwares-nacionais-ou-adaptados/softfile/" target="_blank">neste <i>link</i></a>.<br /></p>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5263142822502277331.post-82961785659785573882022-11-20T12:00:00.001-03:002023-01-05T13:19:23.141-03:00Disassembly da ROM da M1<p style="text-align: justify;">Terminei o <i>disassembly</i> comentado de uma das ROMs da <a href="https://spectrumcomputing.co.uk/entry/1000275/Hardware/Multiface_1" target="_blank">Multiface 1</a> e estou publicando aqui.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh59kSE0UzrDyJVPpFImg-EM-v3QPkfSC7qI0WaupJtXKWUUzFxK-ht414yDbgnh3xtkvYygwIFH-puhXpUJ6ZIcGePQFUuYuVVnhYbgl35zOlfMO4dc_WhtuiEsAMGAHT1MN2aFmemv-ZhdzkjOQFKmtAIqpDKIN4219-frIN2USEOiE-3X57gTQPt/s1809/M1_02.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1435" data-original-width="1809" height="254" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh59kSE0UzrDyJVPpFImg-EM-v3QPkfSC7qI0WaupJtXKWUUzFxK-ht414yDbgnh3xtkvYygwIFH-puhXpUJ6ZIcGePQFUuYuVVnhYbgl35zOlfMO4dc_WhtuiEsAMGAHT1MN2aFmemv-ZhdzkjOQFKmtAIqpDKIN4219-frIN2USEOiE-3X57gTQPt/s320/M1_02.jpg" width="320" /></a></div>
<span><a name='more'></a></span>
<p style="text-align: justify;">Este é um projeto que estava querendo fazer há um longo tempo, finalmente consegui finalizar. O objetivo foi para entender melhor o funcionamento deste fabuloso <i>hardware</i>, que tanto me ajudou com o TK90X. Porém o arquivo da ROM não são das <a href="https://cantinhotk90x.blogspot.com/2012/04/minha-multiface-1.html">minhas M1</a>, trabalhei com o binário que é distribuído com alguns emuladores e, segundo
<a href="https://x128.speccy.cz/multiface/multiface.htm" target="_blank">James McKay</a>, seria a versão mais comum. Esta ROM é aquela cujo "número secreto" (que aparece ao pressionar STOP no menu principal) é E4 (em hexadecimal). Fico devendo fazer o mesmo para a versão dos clones brasileiros da MF1 (parece ter várias diferenças).<br /></p>
<p style="text-align: justify;">Devo esclarecer que cheguei ao máximo que pude, ficaram algumas lacunas por falta de informações sobre o <a href="https://spectrumcomputing.co.uk/entry/1000350/Hardware/Rotronics_Wafadrive" target="_blank">Wafadrive</a> da Rotronics. É inacreditável a ausência de informações mais técnicas a respeito desse <i>hardware</i>. Senti falta em especial as portas I/O usadas pela interface e sobre as rotinas da ROM acessadas pelo programa da M1.<br /></p>
<p style="text-align: justify;">Para baixar o arquivo <i>zip</i> do <i>disassembly</i>, clique neste <a href="https://drive.google.com/file/d/1BBObupWD9Ms_9ummAHe8nIuwqr6eTYur/view?usp=sharing" target="_blank"><i>link</i></a>.</p><p style="text-align: justify;"><b>Atualização (05/Jan/2023):</b> nova versão <a href="https://cantinhotk90x.blogspot.com/2023/01/nova-versao-do-disassembly-da-rom-da-m1.html">aqui</a>. <br /></p>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5263142822502277331.post-40561877275906531102022-09-28T11:41:00.000-03:002022-09-28T11:41:34.929-03:00Bug da Multiface 1 (parte 2)<p style="text-align: justify;">Dando sequência ao <a href="https://cantinhotk90x.blogspot.com/2022/09/bug-da-multiface-1-parte-1.html">artigo</a> sobre o <i>bug</i> recém descoberto da Multiface 1, aqui explicarei o motivo desse comportamento.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi9alixmLJV3G2QyuUt1-wYfe4odss7iYl59_kexPYaVuX7sHaP_4EAAJx__X8RD_ySPLlnMHzmP4VHsPxabO49D533WSR2WN-v9ZUVrfMAuirC-fszb0FJM1L50zaSavh9DeqNEGhFOzpScj5iM3AhKVRVRxstxGxlYJskr3G1lLArYb2yRGgdIZj/s959/Bug%20da%20Multiface%201.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="711" data-original-width="959" height="237" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi9alixmLJV3G2QyuUt1-wYfe4odss7iYl59_kexPYaVuX7sHaP_4EAAJx__X8RD_ySPLlnMHzmP4VHsPxabO49D533WSR2WN-v9ZUVrfMAuirC-fszb0FJM1L50zaSavh9DeqNEGhFOzpScj5iM3AhKVRVRxstxGxlYJskr3G1lLArYb2yRGgdIZj/s320/Bug%20da%20Multiface%201.png" width="320" /></a></div>
<span><a name='more'></a></span>
<p style="text-align: justify;">Quando se tenta salvar a memória do TK90X com a M1, se houver uma sequência de <i>bytes</i> (em hexadecimal) #37, #ED e #CB, acaba ocasionando um <i>crash</i>. Em outras palavras, não é possível salvar um conteúdo de RAM contendo a referida sequência.<br /></p>
<p style="text-align: justify;">Para entender o motivo, é necessário saber que a M1 comprime a RAM nos endereços 16384-23295 (#4000-#5AFF em hex) e 25264-65535 (#62B0-#FFFF em hex) antes de salvar na fita (ou outra mídia suportada). Após salvar a RAM ou quando o programa salvo é carregado, esses blocos são descomprimidos. O esquema de compressão é rudimentar, se uma sequência do mesmo valor de <i>byte</i> é encontrada 8 ou mais vezes, é substituída por uma sequência de 6 bytes. Os 3 primeiros fazem parte do identificador de bloco comprimido #CB, #ED e #37. O 4º é o byte que se repete e o 5º e o 6º é o contador de 16 bits do número de vezes da repetição.</p>
<p style="text-align: justify;">Entretanto na tela acima, a sequência aparece como sendo invertida: #FF, #FF, #FF, #37, #ED e #CB. Na verdade a descompressão ocorre na ordem inversa, isto é, do endereço final em direção ao endereço inicial, portanto o programa vê primeiro #CB, depois #ED e assim por diante. Explicando o que aconteceu no vídeo, após encontrar os bytes identificadores, a rotina de descompressão entende que deve repetir 255 (#FF) por 65535 (#FFFF) vezes que, na prática, é preencher toda a memória com 255. A RAM acaba sendo corrompida e o sistema entra em <i>crash</i>. <br /></p>
<p style="text-align: justify;">Portanto qualquer programa contendo a sequência #37, #ED e #CB acaba corrompendo a RAM, que pode resultar em resultados catastróficos. Tal fato só não se verifica nos endereços 23296-25253 (#5B00-#62AF) porque esta região não é comprimida pela M1.</p><p style="text-align: justify;">Daí, emerge uma questão. Será que os programas não contém essa famigerada sequência? Ou, se contém, a RAM não é corrompida o suficiente para não funcionar? Outra questão: será que existe algum programa não copiável com a M1? Pretendo especular um pouco mais no próximo artigo.<br /></p>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5263142822502277331.post-45080366842421139302022-09-27T19:19:00.000-03:002022-09-27T19:19:27.364-03:00Bug da Multiface 1 (parte 1)<p style="text-align: justify;">Descobri um bug da Multiface 1, como exposto no vídeo abaixo.</p>
<div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/Q7Cpvw1umZ4" width="320" youtube-src-id="Q7Cpvw1umZ4"></iframe></div>
<p style="text-align: justify;">O vídeo mostra que uma sequência de três bytes (em hexadecimal) #37, #ED e #CB na RAM causam um <i>crash</i> quando se tenta salvar o conteúdo da memória do TK90X. Entre as várias consequências, uma seria que, se as <i>softhouses</i> da época soubessem do <i>bug</i>, poderiam ter criando um esquema de proteção contra pirataria feita com a Multiface. Outra seria que alguns programas poderiam ser potencialmente incompatíveis com a interface.<br /></p>
<p>Fico devendo a explicação sobre o <i>bug</i> num artigo futuro, que pretendo escrever em breve.<br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5263142822502277331.post-62678899361348935302022-09-09T17:05:00.001-03:002022-09-09T17:05:49.590-03:00Programa para fazer grade na tela e USR "a"<p style="text-align: justify;">No artigo sobre a <a href="https://cantinhotk90x.blogspot.com/2022/09/estrutura-da-tela-do-tk90x.html">estrutura da tela do TK90X</a>, fiz um programa BASIC para criar a tela abaixo.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB25mPd3g2iW0U5nnC6S1TmIVDrDiNTIyDDeGntMifzvoSU93xEzbHwRfDm0zUa_TRZxa6g9gaOFRTx3y-PoXoctADuk09dY2E0gftj8LpisJC5cRlS_MDPbWAuQLYDBxK1E1ZPtpstbduzM2hkC2ohsVPUUzHEpijG1Zu1BqVtvBR735ToIUL5Ztj/s640/Grade2x.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="480" data-original-width="640" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB25mPd3g2iW0U5nnC6S1TmIVDrDiNTIyDDeGntMifzvoSU93xEzbHwRfDm0zUa_TRZxa6g9gaOFRTx3y-PoXoctADuk09dY2E0gftj8LpisJC5cRlS_MDPbWAuQLYDBxK1E1ZPtpstbduzM2hkC2ohsVPUUzHEpijG1Zu1BqVtvBR735ToIUL5Ztj/s320/Grade2x.png" width="320" /></a></div>
<span><a name='more'></a></span>
<p>Segue a respectiva listagem:</p><div style="margin-left: 40px; text-align: left;">
<code>
10 FOR n=0 TO 7</code><br /><code>
20 LET u=BIN 10000000: IF n=0 THEN LET u=BIN 11111111</code><br /><code>
30 POKE USR "a"+n,u</code><br /><code>
40 NEXT n</code><br /><code>
50 PRINT AT 0,0;</code><br /><code>
60 FOR n=1 TO 704: PRINT CHR$ 144;: NEXT n</code><br /><code>
70 PRINT #0;AT 0,0;</code><br /><code>
80 FOR n=1 TO 64: PRINT #0;CHR$ 144;: NEXT n</code><br /><code>
90 LET p=0: OVER 1: PRINT AT 0,0;0</code><br /><code>
100 FOR n=0 TO 31</code><br /><code>
110 PRINT AT 0,n;p;</code><br /><code>
120 IF n<22 THEN PRINT AT n,0;p;</code><br /><code>
130 LET p=p+1: IF p=10 THEN LET p=0</code><br /><code>
140 NEXT n</code><br /><code>
150 PRINT #0; OVER 1;AT 0,0;2;AT 1,0;3</code><br /><code>
160 PAUSE 0</code><br /></div><div style="margin-left: 40px;"><code>
</code>
</div><p style="text-align: justify;">No lugar de PLOT ou LINE, optei por usar um gráfico definido pelo usuário, o famoso UDG. A construção do UDG é feita nas linhas 10 a 40 do programa. </p>
<p><b>USR string</b></p>
<p style="text-align: justify;">Talvez o leitor estranhe a linha 30, se considerar que a função USR executa um código de máquina a partir do endereço fornecido como argumento. Então o que seria esse USR que aceita um <i>string</i> como argumento?</p>
<p style="text-align: justify;">Uma outra sintaxe pouco conhecida de USR é que pode aceitar como argumento um <i>string</i>. O <i>string</i> deve conter um caractere de "a" a "u" (pode ser letra maiúscula ou minúscula) e a função irá retornar o endereço do primeiro byte do respectivo caractere. Por exemplo, PRINT USR "u" irá imprimir normalmente o endereço 65528 no TK90X de 48K. </p>
<p style="text-align: justify;">A utilidade dessa forma de se usar USR é para facilitar o POKE na hora de definir os UDGs. Um exemplo dessa aplicação está no próprio programa apresentado acima.</p>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5263142822502277331.post-45313993238626614192022-09-08T11:20:00.000-03:002022-09-08T11:20:16.100-03:00Estrutura da tela do TK90X<p style="text-align: justify;">A organização da tela do TK90X na RAM é complexa, como se pode observar no vídeo abaixo:</p>
<div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/JA7QTRAOIzc" width="320" youtube-src-id="JA7QTRAOIzc"></iframe></div>
<span><a name='more'></a></span>
<p style="text-align: justify;">Um pequeno programa BASIC faz poke na memória de vídeo linearmente, de 16384 (#4000 hex) a 22527 (#57FF hex). O que se observa é que a tela vai sendo preenchida de forma não linear. Embora haja várias publicações que explicam essa organização, resolvi escrever sobre o tema também, com abordagem um pouco diferente.</p>
<p style="text-align: justify;">O ponto de partida é o caractere, que pode representar letras, algarismos, símbolos, blocos gráficos ou, no caso do UDG, virtualmente qualquer coisa. Um caractere é um conjunto de 64 pixels, organizados numa matriz 8×8. O estado de cada pixel é representado por um bit, portanto são necessários 8 bytes para representar um caractere. Segue o exemplo do caractere “A”.</p>
<p style="text-align: center;"><code>
Byte 0: 00000000<br />
Byte 1: 00<b>1111</b>00<br />
Byte 2: 0<b>1</b>0000<b>1</b>0<br />
Byte 3: 0<b>1</b>0000<b>1</b>0<br />
Byte 4: 0<b>111111</b>0<br />
Byte 5: 0<b>1</b>0000<b>1</b>0<br />
Byte 6: 0<b>1</b>0000<b>1</b>0<br />
Byte 7: 00000000<br />
</code></p>
<p style="text-align: justify;">A tela do TK90X é formada por 256 pixels horizontais por 192 pixels verticais, portanto comporta no total 768 caracteres, em 24 linhas e 32 colunas. As linhas são numeradas de 0 a 23, em direção de cima para baixo. As colunas são numeradas de 0 a 31, em direção da esquerda para a direita.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwWUSPfSM0RCnx_eMS-WnEHuV5S24B-Q8lus4IjqNgQ3PC30Hl17Hq4DMvRvvRdZOusjFSHqe_lO6ZRQKxkD_c0GkixnwxYMWSLm2Ios6wZ3f7-4VTezhe8i153_uF_wakWeYqiC1pBDmMdAZpsh_ELSiE6h_5jq534BaoSi46pQFVgrgugrLg9Ttt/s640/Grade2x.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="480" data-original-width="640" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwWUSPfSM0RCnx_eMS-WnEHuV5S24B-Q8lus4IjqNgQ3PC30Hl17Hq4DMvRvvRdZOusjFSHqe_lO6ZRQKxkD_c0GkixnwxYMWSLm2Ios6wZ3f7-4VTezhe8i153_uF_wakWeYqiC1pBDmMdAZpsh_ELSiE6h_5jq534BaoSi46pQFVgrgugrLg9Ttt/s320/Grade2x.png" width="320" /></a></div>
<p style="text-align: justify;">Para construir um endereço dentro da RAM da tela, basta saber a linha (bits L0 a L4) e a coluna (bits C0 a C4) do caractere e a posição do byte desejado (bits B0 a B2):</p>
<table cellpadding="2" cellspacing="0" style="background: transparent none repeat scroll 0% 0%; width: 523px;">
<tbody><tr style="background: transparent none repeat scroll 0% 0%;" valign="top">
<td bgcolor="#ffffff" colspan="5" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: rgb(0, 0, 0) currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: solid none solid solid; border-top: 1px solid #000000; border-width: 1px medium 1px 1px; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0cm; padding-top: 0.05cm; padding: 0.05cm 0cm 0.05cm 0.05cm;" width="196"><p align="center">
<span style="color: black;">Linha</span></p>
</td>
<td bgcolor="#ffffff" colspan="5" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: rgb(0, 0, 0) currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: solid none solid solid; border-top: 1px solid #000000; border-width: 1px medium 1px 1px; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0cm; padding-top: 0.05cm; padding: 0.05cm 0cm 0.05cm 0.05cm;" width="197"><p align="center">
<span style="color: black;">Coluna</span></p>
</td>
<td bgcolor="#ffffff" colspan="3" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border: 1px solid rgb(0, 0, 0); padding: 0.05cm;" width="117"><p align="center">
<span style="color: black;">Byte</span></p>
</td>
</tr>
<tr valign="top">
<td bgcolor="#00ffff" style="background: rgb(0, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.05cm 0.05cm;" width="35"><p align="center">
<span style="color: black;">L4</span></p>
</td>
<td bgcolor="#00ffff" style="background: rgb(0, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.05cm 0.05cm;" width="36"><p align="center">
<span style="color: black;">L3</span></p>
</td>
<td bgcolor="#00ffff" style="background: rgb(0, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.05cm 0.05cm;" width="36"><p align="center">
<span style="color: black;">L2</span></p>
</td>
<td bgcolor="#00ffff" style="background: rgb(0, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.05cm 0.05cm;" width="36"><p align="center">
<span style="color: black;">L1</span></p>
</td>
<td bgcolor="#00ffff" style="background: rgb(0, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.05cm 0.05cm;" width="36"><p align="center">
<span style="color: black;">L0</span></p>
</td>
<td bgcolor="#ffff00" style="background: rgb(255, 255, 0) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.05cm 0.05cm;" width="36"><p align="center">
<span style="color: black;">C4</span></p>
</td>
<td bgcolor="#ffff00" style="background: rgb(255, 255, 0) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.05cm 0.05cm;" width="36"><p align="center">
<span style="color: black;">C3</span></p>
</td>
<td bgcolor="#ffff00" style="background: rgb(255, 255, 0) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.05cm 0.05cm;" width="36"><p align="center">
<span style="color: black;">C2</span></p>
</td>
<td bgcolor="#ffff00" style="background: rgb(255, 255, 0) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.05cm 0.05cm;" width="36"><p align="center">
<span style="color: black;">C1</span></p>
</td>
<td bgcolor="#ffff00" style="background: rgb(255, 255, 0) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.05cm 0.05cm;" width="36"><p align="center">
<span style="color: black;">C0</span></p>
</td>
<td bgcolor="#ff00ff" style="background: rgb(255, 0, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.05cm 0.05cm;" width="34"><p align="center">
<span style="color: black;">B2</span></p>
</td>
<td bgcolor="#ff00ff" style="background: rgb(255, 0, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.05cm 0.05cm;" width="40"><p align="center">
<span style="color: black;">B1</span></p>
</td>
<td bgcolor="#ff00ff" style="background: rgb(255, 0, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: 1px solid #000000; border-style: none solid solid; border-top: none; border-width: medium 1px 1px; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0.05cm; padding-top: 0cm; padding: 0cm 0.05cm 0.05cm;" width="35"><p align="center">
<span style="color: black;">B0</span></p>
</td>
</tr>
</tbody></table>
<br />
<p style="text-align: justify;">Agora, basta rearranjar esses 13 bits como mostrado abaixo, para formar o endereço de 16 bits: </p>
<table cellpadding="4" cellspacing="0" style="width: 100%px;">
<tbody><tr valign="top">
<td bgcolor="#ffffff" colspan="8" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: rgb(0, 0, 0) currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: solid none solid solid; border-top: 1px solid #000000; border-width: 1px medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm; padding: 0.1cm 0cm 0.1cm 0.1cm;" width="50%"><p align="center">
<span style="color: black;">Endereço (byte mais significativo)</span></p>
</td>
<td bgcolor="#ffffff" colspan="8" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border: 1px solid rgb(0, 0, 0); padding: 0.1cm;" width="50%"><p align="center">
<span style="color: black;">Endereço (byte menos significativo)</span></p>
</td>
</tr>
<tr valign="top">
<td bgcolor="#ffffff" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">b15</span></p>
</td>
<td bgcolor="#ffffff" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="7%"><p align="center">
<span style="color: black;">b14</span></p>
</td>
<td bgcolor="#ffffff" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">b13</span></p>
</td>
<td bgcolor="#ffffff" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">b12</span></p>
</td>
<td bgcolor="#ffffff" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">b11</span></p>
</td>
<td bgcolor="#ffffff" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">b10</span></p>
</td>
<td bgcolor="#ffffff" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="7%"><p align="center">
<span style="color: black;">b9</span></p>
</td>
<td bgcolor="#ffffff" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">b8</span></p>
</td>
<td bgcolor="#ffffff" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">b7</span></p>
</td>
<td bgcolor="#ffffff" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">b6</span></p>
</td>
<td bgcolor="#ffffff" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">b5</span></p>
</td>
<td bgcolor="#ffffff" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">b4</span></p>
</td>
<td bgcolor="#ffffff" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">b3</span></p>
</td>
<td bgcolor="#ffffff" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">b2</span></p>
</td>
<td bgcolor="#ffffff" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">b1</span></p>
</td>
<td bgcolor="#ffffff" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: 1px solid #000000; border-style: none solid solid; border-top: none; border-width: medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm; padding: 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">b0</span></p>
</td>
</tr>
<tr valign="top">
<td bgcolor="#ffffff" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">0</span></p>
</td>
<td bgcolor="#ffffff" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="7%"><p align="center">
<span style="color: black;">1</span></p>
</td>
<td bgcolor="#ffffff" style="background: rgb(255, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">0</span></p>
</td>
<td bgcolor="#00ffff" style="background: rgb(0, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">L4</span></p>
</td>
<td bgcolor="#00ffff" style="background: rgb(0, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">L3</span></p>
</td>
<td bgcolor="#ff00ff" style="background: rgb(255, 0, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">B2</span></p>
</td>
<td bgcolor="#ff00ff" style="background: rgb(255, 0, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="7%"><p align="center">
<span style="color: black;">B1</span></p>
</td>
<td bgcolor="#ff00ff" style="background: rgb(255, 0, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">B0</span></p>
</td>
<td bgcolor="#00ffff" style="background: rgb(0, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">L2</span></p>
</td>
<td bgcolor="#00ffff" style="background: rgb(0, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">L1</span></p>
</td>
<td bgcolor="#00ffff" style="background: rgb(0, 255, 255) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">L0</span></p>
</td>
<td bgcolor="#ffff00" style="background: rgb(255, 255, 0) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">C4</span></p>
</td>
<td bgcolor="#ffff00" style="background: rgb(255, 255, 0) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">C3</span></p>
</td>
<td bgcolor="#ffff00" style="background: rgb(255, 255, 0) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">C2</span></p>
</td>
<td bgcolor="#ffff00" style="background: rgb(255, 255, 0) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: none; border-style: none none solid solid; border-top: none; border-width: medium medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">C1</span></p>
</td>
<td bgcolor="#ffff00" style="background: rgb(255, 255, 0) none repeat scroll 0% 0%; border-bottom: 1px solid #000000; border-color: currentcolor rgb(0, 0, 0) rgb(0, 0, 0); border-left: 1px solid #000000; border-right: 1px solid #000000; border-style: none solid solid; border-top: none; border-width: medium 1px 1px; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm; padding: 0cm 0.1cm 0.1cm;" width="6%"><p align="center">
<span style="color: black;">C0</span></p>
</td>
</tr>
</tbody></table>
<p style="text-align: justify;">Em Assembly Z80 há instruções para manipular bits, portanto não é difícil de se fazer o rearranjo acima. Entretanto no BASIC Sinclair, não há comando ou função equivalente, então a equação torna-se mais complicada. Considerando as variáveis L (linha), C (coluna) e B (byte), ficaria:<br /></p><p>
<code>LET Endereco = 16384+2048*INT(L/8)+256*B+32*(L-8*INT(L/8))+C</code></p>
<p style="text-align: justify;">O comando BASIC acima pode ser simplificado como:<br /></p><p style="text-align: left;">
<code>LET Endereco = 16384+1792*INT(L/8)+256*B+32*L+C</code></p>
<p style="text-align: justify;">Da posse dessas informações, agora fica possível de se fazer um poke linear na tela do TK90X. Segue a listagem do programa BASIC: </p><div style="margin-left: 40px; text-align: left;">
<code>
10 FOR L=0 TO 23</code><br /><code>
20 FOR B=0 TO 7</code><br /><code>
30 FOR C=0 TO 31</code><br /><code>
40 POKE 16384+1792*INT (L/8)+256*B+32*L+C,255</code><br /><code>
50 NEXT C: NEXT B: NEXT L</code><br /><code>
60 PAUSE 0</code><br /></div><div style="margin-left: 40px;"><code></code>
</div><p style="text-align: justify;">O vídeo mostrando a exibição do programa acima rodando é:</p><p></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/E83jawA9y9Y" width="320" youtube-src-id="E83jawA9y9Y"></iframe></div><p></p>
<p style="text-align: justify;">Para maiores informações sobre o assunto, veja:</p>
<ul style="text-align: left;"><li>Mike James, Guia avançado para o Spectrum. Lisboa/São Paulo: Editorial Verbo, 1984, p. 94.</li><li>Álvaro F. F. Borja, A tela do TK90X, Micro Sistemas, Nº 56, Maio/1986, p. 22.</li></ul>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5263142822502277331.post-41505402844337064422022-06-02T10:24:00.000-03:002022-06-02T10:24:55.546-03:00Carla (Microhobby BR)<p style="text-align: justify;"><i>"Que tal uma conversa com uma psicanalista num sábado à noite, na sua casa? Seria interessante, não? ... Mais ainda se 'Carla' nada mais fosse do que seu querido TK."</i> <br /></p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcbPsSsiLuj7h7OopkfIGbOcZnGUH1MsGJaS-Wprr-zmgWwYcjz3SK1FJG6SmzuerLLuUiJVovyjmrRk1L87QpOtRERi_IcrGPSo_sCQCqUuAZt_TLTqlHjG9yWyAJKwenMM8YextvAkWfOSokkqtUFs5x3_SNbubERh4t6kszUOBBszJ0BWaKM-Y9/s406/Carla.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="406" data-original-width="355" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcbPsSsiLuj7h7OopkfIGbOcZnGUH1MsGJaS-Wprr-zmgWwYcjz3SK1FJG6SmzuerLLuUiJVovyjmrRk1L87QpOtRERi_IcrGPSo_sCQCqUuAZt_TLTqlHjG9yWyAJKwenMM8YextvAkWfOSokkqtUFs5x3_SNbubERh4t6kszUOBBszJ0BWaKM-Y9/s320/Carla.jpg" width="280" /></a></div>
<span><a name='more'></a></span>
<p style="text-align: justify;">Assim começa provocativo, o artigo de capa da revista <b>Microhobby</b> brasileira, em seu número 12 de 1984 (<a href="https://datassette.org/revistas/microhobby-computadores-revistas/microhobby-no-12" target="_blank">disponível no <b>Datassette</b></a>). Na época eu era usuário de um <b>CP200</b> ávido por digitar listagens de programas, sendo que <b>Carla</b> foi uma delas. A promessa era de que o pequeno computador teria inteligência suficiente para manter um diálogo com um humano. Se agora, em 2022, inteligência artificial tornou-se uma ferramenta bastante presente, há quase 40 anos soava como magia. </p><p style="text-align: justify;">Está claro que um programa totalmente em BASIC, com cerca de 12 kb, não seria uma inteligência artificial de fato. Com uso de reconhecimento de palavras-chave e engenhosa manipulação da frase introduzida pelo usuário/paciente, havia uma simulação interessante de uma psicóloga como interlocutora. Como o próprio artigo reconhece, o usuário pode estabelecer um diálogo razoável se conhecer e fizer bom uso das palavras-chave mas, caso não as conheça, respostas estranhas podem ser dadas. Além de ser uma curiosidade, o programa também serve para estudar manipulação de cadeias (<i>strings</i>) em linguagem BASIC. Foi nessa listagem que conheci a função INSTR que está ausente do <b>Sinclair BASIC</b>, a qual é devidamente implementada como uma sub-rotina. Seja para conversar com a Carla ou aprender as técnicas de programação envolvidas, vale a pena examiná-la. Meu testemunho pessoal é de que foi um dos programas que me marcou e permaneceu na memória.</p><p style="text-align: justify;">Para reviver aquela experiência, resolvi digitar novamente o programa, desta vez no emulador <b>Fuse</b>. O leitor pode estranhar, mas o BASIC do TK90X (ZX Spectrum) é bastante compatível com o do CP200/TK85 (ZX81). Como o espírito era o de manter a experiência do CP200, não fiz nenhum melhoramento para o TK90X; com certeza poderia ter acentuado os textos com o <b>UDG</b> ou colocado mais de um comando por linha do BASIC. As únicas modificações foram a substituição dos comandos SLOW e FAST por REM, por não fazerem sentido no TK90X.<br /></p><p style="text-align: justify;">O arquivo TZX do programa digitado está <a href="https://drive.google.com/file/d/1yyaRvYC1vnyO4yXo-6K2vqVtaA2cYxw8/view?usp=sharing" target="_blank">neste <i>link</i></a>. Ao ser carregado, Carla apresenta-se e espera pela resposta do usuário pelo editor de linha. Como o ZX81 só possui caracteres em caixa alta, o usuário terá que acionar o <i>Caps-lock</i> (cursor <b>C</b>), pressionando as teclas <i>Caps-shift</i> e <i>2</i>. O caractere acentuado <b>É</b> é simulado por <i>E</i> seguido de um caractere semigráfico, que no TK90X deve ser a tecla <i>2</i> digitado no modo gráfico (cursor <b>G</b>). Para entrar no modo gráfico, digite <i>Caps-shift</i> e <i>9</i>, para voltar ao modo <i>Caps-lock</i>, tecle apenas <i>9</i>. <br /></p>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5263142822502277331.post-24723999715496559432022-06-01T14:29:00.002-03:002022-06-01T21:15:32.817-03:00Atualizações do Cantinho do TK90X<p style="text-align: justify;">Embora minha atividade no <i>blog</i> tenha sido bem pequena ultimamente, pretendo continuar mantendo o <b>Cantinho do TK90X</b>. Sempre que possível, estarei postando alguma coisa nova aqui.<br /></p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1eJALmj3VQLQ1EdlEKWPvDp-OiewiFhHo11qH8GZgAXgO3UJQiFgxaZvMkbHf5ucSmNMMlt-Mm_N9cxjFW6hbIMT6B9nQG01RsCzNMGOZz3a7KtqJH4lApMxIAxRIAoLbiGZH5Pv1EsMhJNkUoG8grIrq86qXN1s6Ec6b7lnPFK9zMOt-cUqhpE8B/s589/001-CantinhoDoTk90x.jpeg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="424" data-original-width="589" height="230" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1eJALmj3VQLQ1EdlEKWPvDp-OiewiFhHo11qH8GZgAXgO3UJQiFgxaZvMkbHf5ucSmNMMlt-Mm_N9cxjFW6hbIMT6B9nQG01RsCzNMGOZz3a7KtqJH4lApMxIAxRIAoLbiGZH5Pv1EsMhJNkUoG8grIrq86qXN1s6Ec6b7lnPFK9zMOt-cUqhpE8B/w320-h230/001-CantinhoDoTk90x.jpeg" width="320" /></a></div>
<span><a name='more'></a></span>
<p style="text-align: justify;">Porém tenho notado que vários artigos precisam de manutenção, devido a <i>links</i>, imagens ou vídeos que estão inacessíveis e outros problemas. Não vou me comprometer a fazer uma atualização sistemática de todos os artigos já publicados. Caso eu me depare com algum artigo que mereça ou requeira alguma atualização, procederei a sua edição. Não pretendo manter um registro das alterações realizadas, para não me desanimar, salvo os casos em que a mudança do teor do artigo seja substancial. Por outro lado, notícias que envelheceram ou estão desatualizadas vão permanecer, para manter a história do <i>blog</i>.<br /></p><p style="text-align: justify;">Penso no futuro imediato fazer:<br /></p><ul style="text-align: left;"><li>correção de conteúdos errôneos (neste caso, farei um registro de alteração como tem sido habitual); </li><li>substituição ou eliminação de <i>links</i> que não são mais acessíveis (quando possível, apontar para páginas preservadas no <a href="https://archive.org/web/" target="_blank">Wayback Machine</a>);</li><li>substituição ou eliminação de arquivos multimídia que não são mais acessíveis;</li><li>em relação a <i>hardware</i> e <i>software</i> do ZX Spectrum, usar como referência canônica o banco de dados <b>ZXDB</b> do portal <a href="https://spectrumcomputing.co.uk/" target="_blank"><b>Spectrum Computing</b></a> em substituição ao World of Spectrum (<a href="http://cantinhotk90x.blogspot.com/2022/01/spectrum-computing.html">as razões estão expostas aqui</a>). <br /></li></ul><p style="text-align: justify;">Longa vida ao Cantinho do TK90X! <br /></p>Unknownnoreply@blogger.com7tag:blogger.com,1999:blog-5263142822502277331.post-17772892016036377002022-05-06T14:27:00.001-03:002022-06-01T21:14:05.020-03:00Revista Microhobby (Microdigital)<p style="text-align: justify;">Antes do advento da Internet e da <i>web</i>, uma das principais fontes de informações eram as revistas especializadas. Microhobby foi uma das que tive o prazer de acompanhar.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikxnLFavVUJeuGDMOV1U0dsUvbwtdrgtZN4tWlnjfRsZDm15tS4KWUEnIWU7-p-kCUv_G8yPWwyhovNm-gHF6vmHiAaKLKxzK0yjsO6Pov6rAh5m4zDK97lO_bQiqdB3BP-WAFGRH7I53R15V6w2Ns6tLK8MaMhUJIAOuyAOLSm-7IIBXwHUobvg-X/s500/Microhobby_10_capa.jpeg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="500" data-original-width="380" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikxnLFavVUJeuGDMOV1U0dsUvbwtdrgtZN4tWlnjfRsZDm15tS4KWUEnIWU7-p-kCUv_G8yPWwyhovNm-gHF6vmHiAaKLKxzK0yjsO6Pov6rAh5m4zDK97lO_bQiqdB3BP-WAFGRH7I53R15V6w2Ns6tLK8MaMhUJIAOuyAOLSm-7IIBXwHUobvg-X/w243-h320/Microhobby_10_capa.jpeg" width="243" /></a></div>
<span><a name='more'></a></span>
<p style="text-align: justify;">Não tenho mais lembrança de como conheci esta publicação, creio que tenha sido em banca de revista (eu era assíduo frequentador da revistaria Iacarujá, em Suzano, que funciona até hoje). Puxando de memória, acho que conheci a revista em seu número 10, cuja capa é a da ilustração acima. Lembro-me de ter digitado o programa de capa, Kong, ficando um pouco decepcionado com o resultado, como era comum. :-)</p>
<p style="text-align: justify;">Uma curiosidade: Microhobby era uma publicação da Microdigital e teve como diretor o professor Pierluigi Piazzi. Assim, a revista apresentava matérias para todas as linhas produzidas pela Microdigital, de TK82-C e TK85 até TK3000. Eram matérias de qualidade, entre novidades, apresentação/<i>review</i> de equipamentos e programas, artigos técnicos/científicos e, como era de praxe, listagens de programas BASIC ou linguagem de máquina para digitar. Uma das diversões favoritas dos usuários da época era digitar esses programas, ansiosos para ver como seria. Creio que seja pela influência de Pierluigi, havia também matérias de cunho educativo, em especial na área de Matemática. Nessa direção, havia artigos com o protagonista Nabor Rosenthal que, nas suas aventuras, sempre chegava a algum problema que deveria ser resolvido por um programa. O desafio ficava em aberto nessas aventuras, cuja solução era dada no número seguinte da revista.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-xJhPCKo6lfI/VnmtWpTj01I/AAAAAAAAIOM/idGCFdGCtHY/s744/microhobby_21_capa.jpeg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="744" data-original-width="566" height="320" src="https://1.bp.blogspot.com/-xJhPCKo6lfI/VnmtWpTj01I/AAAAAAAAIOM/idGCFdGCtHY/s320/microhobby_21_capa.jpeg" width="243" /></a></div>
<p style="text-align: justify;">Uma influência na minha pessoa foi a matéria de capa do número 21, na qual se anunciava a chegada do TK90X ao mercado. Nem preciso dizer que foi a primeira vez que conheci esse computador e que esse artigo me motivou para trocar meu CP200 pelo TK90X. O fato é que Microhobby foi uma das publicações que marcou a minha vida de usuário de micros e, por isso mesmo, guardo muito carinho.<br /></p>
<p style="text-align: justify;">O <i>site</i> Datassette disponibiliza arquivos digitais que preservam as páginas da Microhobby, acessíveis <a href="https://datassette.org/revistas/microhobby" target="_blank">neste <i>link</i></a>. Estão disponíveis o exemplar piloto nº 00 e os números 01 a 28 e o número 34. Estão faltando os números 29 a 33 e não sei se há número 35 ou maior. Como fui assinante, creio que tive todos os números de 10 a 34, pelo menos. Eu doei toda a minha coleção para ser digitalizada, mas a pessoa que a recebeu simplesmente desapareceu, não fazendo mais contato. Se alguém ainda tiver os exemplares faltantes, peço que entre em contato com o pessoal do Datassete, para podermos preservar essa porção da história da informática brasileira. </p><p style="text-align: justify;"><b>Nota:</b> <i>este artigo se refere à Microhobby do Brasil, não à revista espanhola homônima sobre o ZX Spectrum. Será que a Microdigital copiou</i><i><i> até o nome da revista</i>? Vide <a href="https://cantinhotk90x.blogspot.com/2013/05/microdigital-copiou-microdigital.html">esse link</a> e <a href="https://cantinhotk90x.blogspot.com/2013/07/commodore-264.html">mais esse</a>. </i></p>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5263142822502277331.post-34984692215247570392022-01-22T23:13:00.001-03:002022-01-24T20:27:35.436-03:00Caixinha de fazer loucos<p style="text-align: justify;">Provavelmente este foi o primeiro projeto que montei de forma completa, incluindo a caixa.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgRk2i8kRQp_gh0JE3jJ2qJFLMq9voIVxkpCyH4-asNJfNdjLZVX80psjfclbv1kq2OFf_F4NPYGWryyF_OBOLeq1DpHKlcUzqvgwkWbIbUDToCKlr58JsuEJQV-2uYK8tH3fAXsCVgQ-xDmXgFwNorpAaB-H67SouZ6hWHlPiVNsODaF338L_2jTUf=s464" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="372" data-original-width="464" height="321" src="https://blogger.googleusercontent.com/img/a/AVvXsEgRk2i8kRQp_gh0JE3jJ2qJFLMq9voIVxkpCyH4-asNJfNdjLZVX80psjfclbv1kq2OFf_F4NPYGWryyF_OBOLeq1DpHKlcUzqvgwkWbIbUDToCKlr58JsuEJQV-2uYK8tH3fAXsCVgQ-xDmXgFwNorpAaB-H67SouZ6hWHlPiVNsODaF338L_2jTUf=w400-h321" width="400" /></a></div>
<span><a name='more'></a></span>
<p style="text-align: justify;"><b>Experiência e Brincadeiras com Eletrônica</b> era uma publicação derivada da revista <b>Saber Eletrônica</b>, centrada em coletânea de projetos destinados a um público novato e mais jovem. <i>Scans</i> dessa coleção podem ser encontrados no <a href="https://datassette.org/revistas/experiencias-e-brincadeiras-com-eletronica" target="_blank"><b>Datassette</b></a>. No volume 10, encontra-se o referido projeto, a Caixinha de Fazer Loucos.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEg8jMcVjGWSeoFwN98DaYwlDs51XAq91yY7g0uUEIsiPXxQ3Q5qQlflBEHSwxK9WBDD1zSpd2gmQhrpNxP7H67263Ba0i9G9TQ5zHfJi3ECLpV9VY3qGfY5PLF5eSMihVMDVLPaVb0veMzY9z0orDlDk9U2S4n_KCwdsMQkGpXz9xNAehAzH_O5faac=s543" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="543" data-original-width="400" height="200" src="https://blogger.googleusercontent.com/img/a/AVvXsEg8jMcVjGWSeoFwN98DaYwlDs51XAq91yY7g0uUEIsiPXxQ3Q5qQlflBEHSwxK9WBDD1zSpd2gmQhrpNxP7H67263Ba0i9G9TQ5zHfJi3ECLpV9VY3qGfY5PLF5eSMihVMDVLPaVb0veMzY9z0orDlDk9U2S4n_KCwdsMQkGpXz9xNAehAzH_O5faac=w148-h200" width="148" /></a></div>
<p style="text-align: justify;">Atrás do título irreverente e chamativo, há um gerador de efeitos sonoros com um número grande de controles que, literalmente, pode deixar o usuário (ou os que estão em volta) completamente louco. Trata-se de um oscilador de áudio com frequência ajustável e que pode ser modulado por um oscilador astável, de frequência ajustável. Com um número grande de potenciômetros e interruptores, a variedade de sons que podem ser gerados é enorme.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiZRBhWgTgYFI1_whgDpDmp6hgpvPc8l9r-Q1hNRnEcRAwzpqWJNRPEzRaOSck2Y5sPpc2N2LjBAbzBQqjXElF6mVovlOZE688CBf-kkkDjO96LrFKKtpXSs56-TPt5Pfmd_qZNkpNdfFFuBRG4io1KLDd92kbLFXDh2m9bnZRJ8DI1tH1y1qI2zCP7=s691" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="509" data-original-width="691" height="236" src="https://blogger.googleusercontent.com/img/a/AVvXsEiZRBhWgTgYFI1_whgDpDmp6hgpvPc8l9r-Q1hNRnEcRAwzpqWJNRPEzRaOSck2Y5sPpc2N2LjBAbzBQqjXElF6mVovlOZE688CBf-kkkDjO96LrFKKtpXSs56-TPt5Pfmd_qZNkpNdfFFuBRG4io1KLDd92kbLFXDh2m9bnZRJ8DI1tH1y1qI2zCP7=s320" width="320" /></a></div>
<p style="text-align: justify;">Acima está o chapeado da montagem na versão em ponte de terminais, que foi a que eu montei. Na época quem era iniciante usava muito essa técnica, essa ponte de terminais era uma espécie de lâmina de material isolante que acomodava vários terminais metálicos com dois orifícios, aos quais poderiam ser encaixados os terminais dos componentes, que depois eram soldados. Usei bastante essa técnica, antes de adquirir um kit de confecção de circuitos impressos.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhQMNIF9Pd8qwRtuxTCmW1z1e0z5oIebYW9CBEBLwfhcpeWc-GLNX0gBQJR9JTZMh94Abola_2Iui4pwHD_gSMyVlIhf8p6Ic251C58pgLNy5XJx7F0C4B982Uu4cBeUw03A1GqXtok4mhLPno4yyrBUyS_r7evSlfqWSWhkCMqiJWiFazW4K98N14Y=s435" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="284" data-original-width="435" height="209" src="https://blogger.googleusercontent.com/img/a/AVvXsEhQMNIF9Pd8qwRtuxTCmW1z1e0z5oIebYW9CBEBLwfhcpeWc-GLNX0gBQJR9JTZMh94Abola_2Iui4pwHD_gSMyVlIhf8p6Ic251C58pgLNy5XJx7F0C4B982Uu4cBeUw03A1GqXtok4mhLPno4yyrBUyS_r7evSlfqWSWhkCMqiJWiFazW4K98N14Y=s320" width="320" /></a></div>
<p style="text-align: justify;">E realmente montei o projeto bem completinho, fiz uma caixa com compensado, sendo o painel frontal fiel à sugestão acima da publicação. A única diferença foi o uso de chaves H-H no lugar da que era sugerida no projeto. Na época estava ajudando na véspera das Festas das Nações da minha escola (E.E.P.S.G. Prof. Geraldo Justiniano de Resende Silva em Suzano-SP) e levei o projeto para atormentar meus colegas e professores. Infelizmente depois de um tempo tive que desmontar a caixinha de fazer loucos, pois precisava dos componentes para outros projetos. O que restou foi a diversão e o prazer de aprender e, agora, esta postagem no <b>Cantinho do TK90X</b>.</p><p style="text-align: justify;">PS: o mestre Newton C. Braga, autor do artigo original, publicou uma versão mais moderna e com mais recursos em seu <i>site</i> (<a href="https://www.newtoncbraga.com.br/index.php/projetos/15454-maquina-de-fazer-loucos-art1735.html?highlight=WyJmYXplciIsIidmYXplciciLCJmYXplciciLCJsb3Vjb3MiLCJmYXplciBsb3Vjb3MiXQ==" target="_blank">ART1735</a>). <br /></p>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5263142822502277331.post-28894790434559673942022-01-21T23:34:00.001-03:002022-01-21T23:35:15.800-03:00Oldplayers entrevista Newton C Braga<p><b>Newton C. Braga</b> é um dos nomes icônicos para os <i>hobbystas</i> de eletrônica no Brasil. </p>
<div class="separator" style="clear: both; text-align: center;"><p><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhFacbkVQfUznEcuS6bBmr1j_9p_yndNKtf1IXR-3MIR-HMBPsO4naY8w6OOrDMRzAyC_IkdToWXIx-3Tl5Sm2n62VCfF0Wj9Sha83hFk20BVS_O1nquaUTSjsGQu_Tv26K6PUexpDHlI-GYYkWE-N8dY6gSD8N0L0qFNiSajzlrmY7Qc4qGLwol4il=s481" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="481" data-original-width="480" height="320" src="https://blogger.googleusercontent.com/img/a/AVvXsEhFacbkVQfUznEcuS6bBmr1j_9p_yndNKtf1IXR-3MIR-HMBPsO4naY8w6OOrDMRzAyC_IkdToWXIx-3Tl5Sm2n62VCfF0Wj9Sha83hFk20BVS_O1nquaUTSjsGQu_Tv26K6PUexpDHlI-GYYkWE-N8dY6gSD8N0L0qFNiSajzlrmY7Qc4qGLwol4il=s320" width="319" /></a></p></div>
<span><a name='more'></a></span>
<p style="text-align: justify;"><b><a href="https://oldplayers.com.br/" target="_blank">Oldplayers</a></b> conseguiu a façanha de entrevistar esse grande ícone vivo ontem (<a href="https://youtu.be/8eJCpvL8JUE" target="_blank"><i>link</i> para a entrevista no YouTube</a>). Para mim, Newton C. Braga era um enigmático nome que assinava um grande número de artigos da revista Saber Eletrônica; depois de assistir à entrevista, o nome ganhou um rosto. Um simpático senhor de 74 anos, bastante falador e disposto a compartilhar a sua vivência. Ele começou cedo, aos 11 anos de idade já mexia com eletrônica, fez uma carreira de extensos feitos e até hoje continua, mantendo o seu <i>site</i>. </p><p style="text-align: justify;">Sendo Oldplayers um blog mais focado em jogos digitais, Newton contou sobre um dos primeiros <i>videogame</i> do Brasil, <a href="https://www.newtoncbraga.com.br/index.php/projetos/11600-tv-jogo-eletron-art2735.html" target="_blank">publicado na revista Saber Eletrônica</a> e vendido na forma de <i>kit</i> pela Superkit. Uma coisa interessante é que toda as funções principais do equipamento é feito por um circuito integrado específico, produzido pela General Instruments. Como é um componente muito delicado e nem todo <i>hobbysta</i> teria habilidade para soldá-lo na placa de circuito impresso, o CI vinha já soldado na placa. </p><p style="text-align: justify;">Newton fez uma interessante síntese histórica desde o já citado tv-jogo até os jogos modernos. Basicamente a concepção já existia há tempos, mas com a integração maior e aumento da memória e processamento, os jogos são o que são hoje. Não ficou só nisso; demonstrando estar antenado nas tendências de fronteira, o entrevistado arriscou uma previsão quando os computadores quânticos estiverem disponíveis, os entrelaçamentos quânticos entre os jogadores e o cenário poderiam criar um novo patamar de interatividade e imersão. Sensacional!</p><p style="text-align: justify;">Infelizmente o tempo era curto, a entrevista tinha um teto de 1 hora de duração e passou voando. A entrevista se encerrou, mas ficou o convite para os que querem saber mais a visitar o <a href="https://www.newtoncbraga.com.br/index.php" target="_blank">site do Instituto Newton C. Braga</a>, onde há artigos novos, mas também um número enorme de artigos do passado. O interessante é que não é só uma cópia simples dos antigos textos, há notas atualizando e até adaptando aos dias atuais. Newton confessou ter 40 mil artigos previstos para serem publicados, mas em ritmo lento, para não confundir o mecanismo de busca do Google. Fica o meu agradecimento ao meu amigo BrancoRP2000, a pessoa por trás do Oldplayers.<br /></p>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5263142822502277331.post-25140249275156532002022-01-06T20:46:00.000-03:002022-01-06T20:46:40.224-03:00Spectrum Computing<p>Parece que o mítico <b>World of Spectrum</b> tem um sucessor à altura. </p>
<div class="separator" style="clear: both; text-align: center;"><p><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgxaaZk8adBNsfVNzFsNx86rdST6vraKmRk4CGmeWxAnL-zGJ8CBkc6XqBMzjkQbaDAvetTIsiG-tirpsIIGGzHtJBoNG9y6UspXV06sH2SJ5CtiXn9Q4E0PivZuC3qAu2BkknUUxf4YF3Dx9rYhnnlzfVIAFTEYCbOe9dnKtNlZkiBm6-gK7p8O-s-=s800" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="457" data-original-width="800" height="183" src="https://blogger.googleusercontent.com/img/a/AVvXsEgxaaZk8adBNsfVNzFsNx86rdST6vraKmRk4CGmeWxAnL-zGJ8CBkc6XqBMzjkQbaDAvetTIsiG-tirpsIIGGzHtJBoNG9y6UspXV06sH2SJ5CtiXn9Q4E0PivZuC3qAu2BkknUUxf4YF3Dx9rYhnnlzfVIAFTEYCbOe9dnKtNlZkiBm6-gK7p8O-s-=s320" width="320" /></a></p></div>
<span><a name='more'></a></span>
<p style="text-align: justify;">Não é que o <a href="https://spectrumcomputing.co.uk/" target="_blank"><b>Spectrum Computing</b></a> seja novo, ele já está na estrada há um bom tempo. Eu é que não o conhecia bem, por ter me afastado da <i>retrocomputação</i> por anos. Gostei da organização, o banco de dados contém as informações mais relevantes e parece ser bem completo; não cheguei ainda a explorar muito, mas creio que não fica atrás do WOS dos bons tempos. O mecanismo de busca é funcional e eficiente, pode-se fazer uma busca rápida de programa, <i>hardware</i>, livro, autor e empresa ou usar a busca avançada, com número muito grande de parâmetros. Acredito que dê para fazer muitas coisas com o motor de buscas e pretendo explorar mais. Dentro de cada título, há várias informações, figuras, fotos, arquivos e <i>links</i>, incluindo de artigos das revistas da época.<br /></p><p style="text-align: justify;">Há ainda o fórum de discussões desse portal, fiz minha inscrição recentemente e estou tentando me situar. Depois de tanto tempo afastado, creio que seja a hora de voltar a acompanhar a comunidade. <br /></p>
<p style="text-align: justify;">Depois de ter perdido a confiança no WOS (que os deuses de silício o tenha), penso em adotar o Spectrum Computing como a minha fonte primária de informações sobre o ZX Spectrum. <br /></p>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5263142822502277331.post-47189198393345033432022-01-04T12:40:00.000-03:002022-01-04T12:40:17.360-03:00Revista do Instituto Newton C. Braga<p style="text-align: justify;">Embora não tenha praticado os hobbys por um tempo longo, por vezes tenho espiado a <i>web</i> e topado com coisas interessantes. </p>
<div class="separator" style="clear: both; text-align: center;"><p><a href="https://blogger.googleusercontent.com/img/a/AVvXsEg-i3LtTgBdq0wQgw6cK0p31ozEoQz3TIjbM46iOoZF4RkQituS2Kp8ZNQojT5cCiyuCSGBSuqlAH-u1ln7agoVd_FqKKEhgeFUMhz47iNQV8vQ74ClawqNNeAhJuMvGfVYU60Rp287OJAd0Ju8RSXolPGI1Xr7cNW-QiR0rhj61EPytnGxprza4-r5=s355" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="355" data-original-width="250" height="320" src="https://blogger.googleusercontent.com/img/a/AVvXsEg-i3LtTgBdq0wQgw6cK0p31ozEoQz3TIjbM46iOoZF4RkQituS2Kp8ZNQojT5cCiyuCSGBSuqlAH-u1ln7agoVd_FqKKEhgeFUMhz47iNQV8vQ74ClawqNNeAhJuMvGfVYU60Rp287OJAd0Ju8RSXolPGI1Xr7cNW-QiR0rhj61EPytnGxprza4-r5=s320" width="225" /></a></p></div>
<span><a name='more'></a></span>
<p style="text-align: justify;">Quem acompanhou a revista Saber Eletrônica certamente conhece o nome de Newton C Braga, que assinava vários artigos lá publicados. Muitos devem conhecer <a href="https://www.newtoncbraga.com.br/" target="_blank">o seu <i>website</i></a> que, com tempo, tem acumulado muitas informações do passado e do presente e hoje, mudou o nome para Instituto Newton C Braga. Certamente um dos locais de acesso obrigatório para quem curte Eletrônica. </p><p style="text-align: justify;">O que eu não sabia, mas tomei conhecimento agora, é que desde 2020 ele passou a publicar a <a href="https://www.newtoncbraga.com.br/index.php/revista-incb-eletronica.html" target="_blank">revista INCB Eletrônica</a>. Pelo que vi, há uma versão impressa a ser adquirida <i>online</i> para os malucos que adoram a coisa em papel, além da versão digital em PDF, que pode ser baixada gratuitamente. </p><p style="text-align: justify;">Acabei de baixar o PDF da revista nº 1 de Dez/2020 e estou escrevendo as minhas impressões a respeito desse exemplar. O aspecto geral é de uma produção profissional, com leiaute muito bem caprichado e profusão de ilustrações e fotos coloridas (algo que era proibitivo na década de 1980). Com 64 páginas, há uma quantidade impressionante de conteúdo, que não se resume apenas à revista. Há impressos nas páginas dos artigos, QR codes que podem ser lidos e que abrem uma lista de <i>links</i> para acessar materiais extras pertinentes aos conteúdos abordados. Como o próprio Newton propõe-se no Editorial, uma revista que parte do formato antigo, direcionado à tecnologia do presente e do futuro. Uma excelente proposta e parece ser bem executada.</p><p style="text-align: justify;">Quanto ao conteúdo, tem assuntos novíssimos como a Internet das coisas (IoT) e placas Raspberry Pi ou Arduíno. Aguçou minha curiosidade o sensor de fluxo de água, um dispositivo a base do efeito Hall que pode ser usado em automação com Arduíno ou outro microcontrolador. Há ainda o lado nostálgico, a reprodução um artigo da época em que os transistores ainda eram novidade publicada na revista Eletrônica Popular, que também era um dos primeiros da autoria do Newton. Outro artigo de importância histórica era sobre o vibrador (não é o que você pode estar pensando...), um componente eletromecânico que elevava a tensão de 6 ou 12 V da bateria de um automóvel para centenas de volts, necessários para acionar rádios à válvulas. Como uma boa revista de eletrônica, há projetos prontos para serem experimentados, como o já manjado microtransmissor FM (da Saber Eletrônica), ao lado dos modernos projetos de eletrônica paranormal com Arduíno e uma releitura dos rádios a cristal, mas com um moderníssimo MOSFET no lugar da galena ou diodo de germânio. Há ainda artigos de cunho didático, como uma compilação sobre o integrado 555 e um pisca LED com CMOS 4093.</p><p style="text-align: justify;">Este primeiro exemplar me impressionou muito bem! E o ritmo de publicações parece ir rápido, no momento o último número é 7, datado de Nov-Dez/2021. Vou baixar e ler com calma os demais números, já adianto que recomendo fortemente o nº 1.<br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5263142822502277331.post-27685222262136566652021-07-17T13:47:00.000-03:002021-07-17T13:47:03.367-03:00Código de Máquina para TK e CP200 (2)<p style="text-align: justify;">Depois de um longo hiato, vou retomando aos poucos as coisas que ficaram pendentes. Uma delas é sobre o referido livro, cuja postagem estou devendo há anos.<br /></p>
<div class="separator" style="clear: both; text-align: center;"><p><a href="https://4.bp.blogspot.com/-ix19ovO-2bM/UIXD8CyEGOI/AAAAAAAABJo/ssKSL0kAnZs/s320/Capa_CódigoDeMáquinaParaTKeCP200_low.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="320" data-original-width="229" height="320" src="https://4.bp.blogspot.com/-ix19ovO-2bM/UIXD8CyEGOI/AAAAAAAABJo/ssKSL0kAnZs/w229-h320/Capa_CódigoDeMáquinaParaTKeCP200_low.png" width="229" /></a> </p></div>
<span><a name='more'></a></span>
<p style="text-align: justify;">Fiz <a href="https://cantinhotk90x.blogspot.com/2012/10/codigo-de-maquina-para-tk-e-cp200.html">uma postagem em 2012</a> sobre este livro, o qual foi a minha introdução ao mundo da linguagem de máquina e <i>assembly</i> Z80. Qual não foi minha surpresa quando Daniela, a própria filha do autor Délio Santos Lima, comentou na minha postagem. Repassei o livro e o contato da Daniela para o meu amigo Clóvis Friolani, que gentilmente fez o <i>scan</i> e obteve permissão da família para disponibilizar o arquivo.</p><p style="text-align: justify;">O livro em formato PDF encontra-se no Datassete: <a href="https://datassette.org/livros/sinclair-zx8081/codigo-de-maquina-para-tk-e-cp200" target="_blank">https://datassette.org/livros/sinclair-zx8081/codigo-de-maquina-para-tk-e-cp200</a>. <br /></p><p style="text-align: justify;">Meus agradecimentos à família do Délio e ao Clóvis, graças à sua boa vontade, mais uma obra da época foi preservada para a posteridade.<br /></p>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5263142822502277331.post-31578456101833091562021-07-13T12:47:00.003-03:002021-07-13T16:49:30.108-03:00Hiato e Entrevista para OldPlayers<p style="text-align: justify;"> Após um hiato de mais de 4 anos, finalmente estou postando aqui.<br /></p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBuk6GtCg3xle-DW0A8bfJviYqi3nssUV-xRYa8Surejd861oty5qoEqOHdC9QPEiWJOWTtQAld_mRyY_iNitSG7wv9SndHLwoLKXph4FpiBd-R6e1fYxSs0Vca3zNVdUe_eh8AxrfLJE/s616/OldPlayersLogo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="412" data-original-width="616" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBuk6GtCg3xle-DW0A8bfJviYqi3nssUV-xRYa8Surejd861oty5qoEqOHdC9QPEiWJOWTtQAld_mRyY_iNitSG7wv9SndHLwoLKXph4FpiBd-R6e1fYxSs0Vca3zNVdUe_eh8AxrfLJE/s320/OldPlayersLogo.png" width="320" /></a></div>
<span><a name='more'></a></span>
<p style="text-align: justify;">Na verdade o <i>hobby</i> continua em suspenso, foi graças à insistência do meu amigo <a href="https://oldplayers.com.br/wp/" target="_blank">Branco</a>, resolvi ao menos retomar os contatos. Sabe que até está dando um comichão para voltar, mas no momento não tenho condições de mexer nos meus brinquedos velhos. Aguardo que isso ocorra cedo ou tarde, tenho que ter paciência.</p><p style="text-align: justify;">O Branco convidou-me para uma entrevista nesta quinta-feira, 15/Jul, às 20h00, no seu <a href="https://www.youtube.com/channel/UCsTf4uLylkXah4fn9TJc4Ew" target="_blank">canal Old Players</a> do YouTube. Não vai ter novidades pois, como é de praxe na retrocomputação, vai ter velharias. Espero poder repassar as minhas lembranças antigas e as menos antigas para os presentes. <br /></p><p><br /></p>Unknownnoreply@blogger.com5