quinta-feira, junho 30, 2022

MSX Programs: SCREEN IV

SCREEN IV

Tentarei neste post juntar as informações do projeto SCREEN IV, que foi publicado em partes na Revista CPU MSX do número 8 ao número 17 totalizando 10 partes. Não colocarei as listagens pois a digitação é bem trabalhosa, acredito que ninguém terá interesse em se afundar em listagens em LM, até mesmo porque, caso tenha interesse hoje temos ferramentas de depuração melhores onde carregamos o binário e podemos depurar, defetuar um disassembly, etc..

Recentemente em um grupo de MSX, um usuário postou um link para o ótimo trabalho de recuperação de alguns discos de MSX, muitos tendo programas relativamente difíceis de encontrar como é o caso do Screen IV funcionando. Eu tive acesso ao Screen IV funcional anteriormente que me foi passado por um outro usuário, porém ao longo do tempo ficou perdido em uma montanha de discos, e até hoje não consegui encontrar mais.


Ao receber estes discos recuperados, encontrei o Screen IV funcional novamente, não tem indicação se foi cedido ou não pelo mesmo usuário, então vão aqui alguns agradecimentos:

  • Adriano: Por ter digitado e testado o programa e ter cedido uma versão funcional, pois a minha continha alguns bugs.
  • Mauricio e Eduardo : Por terem recuperados esta coleção de discos e disponibilizar os mesmos para uso, este artigo é um agradecimento pelo trabalho.
  • Júlio (R.I.P.): Por ter cedido os discos para recuperação, o artigo fica como um agradecimento póstumo.
  • Alexandre: Por ter criado o projeto MSX Livros, o qual eu e meu irmão (William) tivemos oportunidade de ajudar com algumas digitalizações, e ter escaneado todas as revistas e livros importantes da época.
  • Sérgio: Por ter criado o projeto Screen IV e publicado na revista.

O projeto

O Screen IV foi lançado em partes pela extinta revista CPU, e a autoria original é do Sérgio que escreveu muitos artigos bons para a mesma.

As listagens continham códigos em LM para serem introduzidos via MSX-DEBUG, com o módulo principal sendo incluído no primeiro artigo, e módulos adicionais ao longo dos próximos números.

Foi um ótimo trabalho, tive a impressão que o projeto não foi tão valorizado na época, mas pode ser apenas uma impressão pois poucas pessoas comentam sobre ele.

Aqui vou apenas listar pontos importantes e descrever o uso e seus comandos, não tem sentido reproduzir fielmente o artigo que pode ser facilmente encontrado nas revistas.

Parte 1

Mesmo com todos os recursos do MSX-BASIC, estamos limitados a usar 40 caracteres por linha, salvo usuários que possuem cartão de 80 colunas ou MSX 2. O MSX também conta com recursos gráficos incríveis que nos permitem criar telas maravilhosas, porém os editores raramente tem rotinas para impressão destas telas.

Mas podemos equipar o BASIC com estes recursos e muitos outros, então a partir de agora estamos iniciando o projeto SCREEN IV que vai incluir muitos recursos interessantes para serem usados no BASIC.

Tela de edição em 64 colunas, gráficos e textos simultâneos, rotinas de impressão e comando que vão complementar o BASIC normal. O SCREEN IV vai ser apresentado em 10 partes, onde cada uma implementa um novo recurso.

Na verdade o programa já está todo completo e funcional, apenas detalhes técnicos de cada parte vão ser apresentados, além dos novos comandos e no final um pequeno resumo. Quem tiver curiosidade de ler o artigo em todos os detalhes, disponibilizo as páginas digitalizadas para DOWNLOAD.

O SCREEN IV só foi possível pela própria constituição do MSX-BASIC (ROM) que possue ganchos e chamadas que podem ser alteradas ou incluídas em RAM. Os HOOKS do MSX são regiôes que permitem criar uma pequena chamada ou desvio para cada comando do BASIC, apontando para outras rotinas desenvolvidas pelo usuário em RAM. Inicialmente contem uma sequência de C9 (RET) que podem ser alteradas, por exemplo para CALL #C020 e em #C020 podemos escrever uma nova rotina de apoio, e ao fim retornar para o sistema.

Outra característica que permite a criação de um projeto assim é o sistema de chaveamento de SLOTS (4 páginas por slot de 16K). Controlando adequadamente este chaveamento, podemos criar o SCREEN IV em uma área que não interfere diretamente na memória disponível para os programas MSX-BASIC do usuário, explorando assim na totalidade os 64K de memória que a maioria dos MSX possui.

Aqui tem uma pequena resalva sobre o programa. Da maneira como foi constituído, ele somente vai rodar em equipamentos "padrão brasil", ou seja Expert 1.0 ou 1.1. Claro isso não é totalmente verdade, micros com configurações similares as do Expert também vão rodar de boa o programa, bastando ter 64Kb de RAM. Nao testei o programa em um Hotbit, então não sei se funciona 100% neles mas o artigo os cita e não achei reclamações de não rodar em Hotbit na parte de cartas dos usuários, porém não funciona em muitos MSX importados, por exemplo. Mesmo quem for rodar em emulador, vai precisar escolher uma máquina do tipo Expert BR. O programa também não roda em Expert adaptado para MSX 2.0, pelo menos com o adaptador da MPO que equipa o meu, também imagino gerar conflito pois o MSX 2.0 já tem o comando SCREEN 4

Ao final da digitação dos dois blocos iniciais, você vai ter os arquivos "SCREEN.COM" e "SET.ALF" respectivamente com o módulo principal e o alfabeto adaptado para 64 colunas.

Para testar, basta digitar SCREEN 4 no MSX-BASIC (nos downloads tem tanto a versão COM como a BIN, então pode ser carregado pelo MSX-DOS com SCREEN4.COM ou via MSX-BASIC com: BLOAD "SCREEN4", R


Parte 2

Neste módulo foram apresentadas as rotinas que geram o texto em 64 colunas. Como alguns usuários não possuem monitores específicos, ligando o MSX em TVs comuns, uma parte das 64 colunas pode não aparecer, sendo assim o padrão da SCREEN IV e usar apenas 60 colunas, o próximo módulo vai acrescentar o comando WIDTH, até este ponto o WIDTH continua aceitando apenas 40 colunas como seu máximo. Temporariamente quem desejava usar 64 colunas poderia dar o seguinte comando:

POKE &HF3B0, NC

onde NC é o úmero de colunas. Números acima de 64 vão causar problemas no programa.

Para testar esta parte, foram apresentadas as seguintes rotinas em MSX-BASIC

Referência de Listagem

ListagemArquivo
Listagem 1cpu09-l1.bas
Listagem 2cpu09-l2.bas
Listagem 3cpu09-l3.bas
Listagem 4cpu09-l4.bas
Listagem 5cpu09-l5.bas

Listagem 1

10 REM Testa a impressao do set de caracteres
20 SCREEN 4: REM Habilita tela grafica em 64 colunas
30 FOR F=32 TO 254
40 PRINT CHR$(F);" ";
50 NEXT
60 A$=INPUT$(1)
Basic

Listagem 2

10 REM Tels comando LOCATE e COLOR
20 SCREEN 4
30 FOR F=0 TO 15
40 LOCATE F,F:COLOR F:PRINT "Posicao: ";F;",";F
50 NEXT
60 COLOR 15,1,1
90 A$=INPUT$(1)
Basic

Listagem 3

10 REM Testa rolamento de tela
20 SCREEN 4
30 FOR F=0 TO 30
40 PRINT "Linha: ";F
50 NEXT
60 LOCATE 0,0:PRINT"Digite uma tecla!":A$=INPUT$(1):LOCATE 4,4
70 PRINT CHR$(27);"L";:REM Insere linha
80 PRINT CHR$(27);"M";:REM Deleta linha
90 GOTO 70:REM Pare com [CTRL]+[STOP]
Basic

Listagem 4

10 REM Testa funcoes de tela
20 SCREEN 4
30 FOR F=0 TO 20:PRINT TAB(F);"Funcao de tela":NEXT
40 LOCATE 0,0:PRINT "Digite uma tecla!":A$=INPUT$(1)
50 LOCATE 0,0:PRINT CHR$(27);"K";:REM Apaga ate fim da linha
60 PRINT "Digite uma tecla!":A$=INPUT$(1)
70 PRINT CHR$(27);"J";:REM Apaga ate fim da tela
80 PRINT "Digite uma tecla!"
90 A$=INPUT$(1)
Basic

Listagem 5

10 REM Combina Texto e Grafico
20 SCREEN 4
30 LINE(0,0)-(255,191),,B
40 LINE(2,2)-(253,189),,B
50 LOCATE 1,1
60 PRINT "Janela grafica calculada!"
90 A$=INPUT$(1)
Basic



Parte 3

Aqui foram implementadas rotinas para ajustar o comando WIDTH para comportar o novo número de colunas.

Para testar foi fornecido um pequeno programa.

Referência de Listagem

ListagemArquivo
Listagem 1cpu10-l1.bas

Listagem 1

10 REM Testa o comando WIDTH
20 SCREEN 4:REM Habilita tela grafica e texto em 64 colunas
30 PRINT "Temos agora 60 colunas para texto"
40 PRINT "Pressione uma tecla..."
50 A$=INPUT$(1)
60 WIDTH 40
70 PRINT "Voltamos a ter somente 40 colunas"
80 PRINT "Pressione uma tecla..."
90 A$=INPUT$(1)
100 WIDTH 64
110 PRINT "Esta e a tela maxima!"
120 FILES:PRINT
130 PRINT "Prepare-se para uma mensagem de erro e tecle algo!"
140 A$=INPUT$(1)
150 WIDTH 65

Basic

Parte 4
Aqui foram implementadas as últimas rotinas do ambiente MSX-BASIC/Editor, tornando ele totalmente funcional na SCREEN 4, aceitando as teclas de edição e controle normalmente, além das rotinas da BIOS para escrita na tela a partir do BASIC em modo gráfico/texto em 64 colunas.

Mais um pequeno programa foi usado para demonstrar o andamento do projeto.

Referência de Listagem

ListagemArquivo
Listagem 1cpu11-l1.bas

Listagem 1

10 KEY OFF:SCREEN 4:REM Habilita a tela 4
20 WIDTH 64:LOCATE ,,0:REM Desliga o cursor para impressoes
30 PRINT "Pressione uma tecla para ativar as funcoes"
40 A$=INKEY$:IF A$="" THEN GOTO 40
50 KEY N
60 PRINT:PRINT "Pressione e solte a tecla [SHIFT] repetidamente"
70 PRINT "e observe se o cursor esta no fim desta frase!";
80 A$=INPUT$(1):REM Espera tecla com o cursor
90 CLS:LOCATE 0,0,0:PRINT "Impressao do cursor:"
100 FILES
110 PRINT:PRINT:PRINT "Impressao com cursor:"
120 LOCATE ,,1:FILES:REM Imprime com cursor
130 LOCATE ,,0:PRINT:REM Imprime sem cursor
140 A$=INPUT$(1):WIDTH 32
150 FILES:WIDTH 60
Basic

Parte 5
É o final da primeira parte, onde o SCREEN IV tem a estrutura básica montada, e também se torna um sistema mais estável, além de manter a SCREEN 4 após o término da execução de um programa. O tamanho padrão do WIDTH passa a ser 64 colunas e não  mais apenas 60. O sistema permite dar comandos gráficos em modo direto agora, misturando textos e gráficos. Uma resalva é que neste ponto o CLS não reposiciona o cursor, mas PRINT CHR$(12) ou [CTRL]+[L] funciona a contento. Também não é possível neste ponto dar um CALL SYSTEM estando em SCREEN 4, sendo necessário trocar para um modo mais baixo.

Não houve programa de exemplo nesta parte.

Parte 6

A partir deste momento, com o programa relativamente estabilizado o autor começa a implementar funções novas para extender a SCREEN 4. A primeira função a ser implementada é o PRINT @, inspirado no mesmo comando do TRS-80, onde as posições de tela não são mais especificadas em colunas e linhas, mas sim e posições sequênciais, traduzindo um LOCATE Col, Lin:PRINT "A" em um PRINT @ Lin* C + Col "A", onde C é o número máximo de coluna no momento (dado pelo WIDTH).

Os comandos CLS e CALL SYSTEM ainda seguem com as mesmas limitações de antes.

Dois programas de teste foram divulgados.

Referência de Listagem

ListagemArquivo
Listagem 1cpu13-l1.bas
Listagem 2cpu13-l2.bas

Listagem 1

10 'Preenche a tela com as letras de A a J
20 'A tela 4 deve estar ativada
30 WIDTH 64
40 FOR F=0 TO 1471 STEP 4
50 PRINT @ F,CHR$(65+F MOD 10
60 NEXT
Basic

Listagem 2

10 'Observe a prioridade do @ em relacao ao LOCATE
20 'A tela 4 deve estar ativada
30 WIDTH 64
40 LOCATE 0,0:PRINT @ 64*10-1,"O LOCATE e irrelevante!"
50 END
Basic


Parte 7

Foi feita a implementação de uma rotina que vai atuar justamente com o comando LIST. Inspirada no ZX-81, vai permitir que ao listar o programa e este preencher o espaço da tela, a listagem vai ter uma pausa, mostrando a mensagem "Scroll ?" no final da tela, aguardando o pressionamento de uma tecla para continuar a sequência da listagem após a limpeza da tela. Esta rotina era opcional e somente funciona desta maneira quando em SCREEN 4, não afetando os outros modos de tela.



Parte 8

Nesta parte foram implementados os comandos CLS ON, CLS OFF, o comando OVER e o comando FILL.

O problema do CLS e do CALL SYSTEM foram sanados também.

Os coamndos CLS ON e OFF habilitam ou desabilitam a limpeza de tela a cada WIDTH dado, por padrão o MSX limpa a tela quando mudamos a quantidade de colunas, com este comando e na SCREEN 4, podemos controlar se a tela vai ser limpa ou não.

O comando OVER permite que um caractere seja impresso sobre outro caractere sem apagar o anterior. O comando pode receber parâmetro de 0 a 15 que permite sobrepor total ou parcialmente os caracteres, sendo que 15 realiza a impressão sem apagar nada do anterior e 0 apaga totalmente, funcionando como o modo padrão do MSX.

Deve ser estudado o seguinte ponto. Os caracteres na SCREEN 4 possuem uma matriz de 4x8 pontos. Por exemplo ao usar OVER 9 (1001b) apenas o interior do caracter será apagado mantendo os extremos ligados.

O artigo recomenda não usar o OVER no modo direto, pois a movimentação do cursor vai ser afetada deixando um rastro de sobreposição conforme fomos editando a tela.

O último comando, FILL, funciona de modo análogo ao PAINT e sua principal vantagem é o ganho de velocidade, sendo 8x mais rápido em alguns casos. Outro diferencial é poder preencher uma área sem se preocupar com a cor dos limites, como ocorre no PAINT. Por fim, a velocidade é conquistada não verificando buracos de escape para preenchimento, o comando procua o espaço na vertical, e expande-se lateralmente até encontrar os limites. Assim que atingir o topo ou o chão da figura o comando termina. Este fato deve ser considerado ao procurar o ponto inicial para preenchimento da área.

Três programas foram apresentados para demonstrar as novas funções.

Referência de Listagem

ListagemArquivo
Listagem 1cpu15-l1.bas
Listagem 2cpu15-l2.bas
Listagem 3cpu15-l3.bas

Listagem 1

10 REM Testa o comando OVER
20 CLS:KEY OFF:WIDTH 64:OVER 0
30 LINE(0,5)-(255,5)
40 PRINT @ 10," Comando OVER 0 "
50 OVER 15
60 PRINT @ 40," Comando OVER 15 "
70 OVER 0
80 PRINT @ 64,"Pressione uma tecla..."
90 A$=INPUT$(1)
Basic

Listagem 2

10 REM Testa o comando FILL
20 CLS:KEY OFF:COLOR 15
30 CIRCLE (127,95),90
40 FILL (127,95),2
50 FILL (255,95),3
60 FILL (0,95),3
70 PRINT @ 0,"Pressione uma tecla..."
80 A$=INPUT$(1)
Basic

Listagem 3

10 REM Estabelece parada do FILL
20 REM a partir do ponto de localizacao
30 REM
40 REM Comando mal localizado:
50 KEY OFF:WIDTH 64
60 LINE (0,0)-(255,191)
70 FILL (127,0)
80 PRINT @ 0, "Note o ponto de parada (127,95)
90 PRINT @ 64, "Pressione uma tecla..."
100 A$=INPUT$(1) 110 REM 120 REM Comando bem localizado 130 CLS 140 LINE (0,0)-(255,191) 150 FILL(255,0) 160 PRINT @ 0,"O ponto agora e (255,191) 170 PRINT @ 64, "Pressione uma tecla..." 180 A$=INPUT$(1) 190 CLS 200 REM Exemplo explicito de parada do comando 210 PSET (127,95) 220 FILL (127,140),2 230 PRINT @ 0,"Qualquer ponto na linha de expansão server como criterio de parada"
Basic

Parte 9

Dois novos comandos foram incorporados nesta parte, eles permitem gravar e carregar telas que estão na memória de vídeo diretamente para o cassete, são o SCREEN SAVE e SCREEN LOAD.

Não foram usados os comandos para diskette pois, segundo o artigo, a maioria dos editores gráficos para MSX ainda salvam as telas em cassete, e estes comandos irão permitir manipular estas telas.

O uso é bem simples:

SCREEN LOAD "<NOME>", <OFFSET>

e

SCREEN SAVE "<NOME>", <INICIO>, <FIM>

O nome pode ser qualquer sequência de 6 caracteres, sendo que CAS: não determina o dispositivo, e se informado se torna parte do nome. E no caso do SCREEN LOAD, pode-se informar apenas "" como nome para pegar o próximo arquivo.

Offset funciona de modo análogo ao BSAVE, só que para a RAM de vídeo.

O formato é compatível com os do BSAVE então podem ser misturados para carregar binários para qualquer parte da tela.

Parte 10

Finalização do projeto. O último comando foi apresentado: SCREEN OUT que permite o DUMP da tela em impressoras.

A tela de 256x192 será impressa em 512x384 ou 768x576, ampliando os pixels para 2x2 ou 3x3. A sintaxe é:

  • SCREEN OUT V <,largura> <,tabulamento>
  • SCREEN OUT H <,largura> <,tabulamento>
  • SCREEN OUT T <,largura> <,tabulamento>

As letras H, V e T indicam o modo de repodução:

  • H: Duplo horizontal
  • V: Duplo vertical
  • T: Triplo vertical

Em impressoras de 80 colunas as opções H e T devem ter o parâmetro largura especificado, sendo menor ou igual a 480. Dois programas de exemplo foram disponibilizados.

Referência de Listagem

ListagemArquivo
Listagem 1cpu17-l1.bas
Listagem 2cpu17-l2.bas

Listagem 1

10 REM Exemplo de como usar o SCREEN OUT
20 KEY OFF:CLS:KEY OFF:COLOR 15
30 CIRCLE(127,95),80
40 FILL(127,95),3
50 LINE(0,95)-(255,95),4
60 FILL(10,90),2
70 FILL(10,100),2
80 FILL(250,90),2
90 FILL(10,100),2
100 SCREEN OUT V
110 A$=INPUT$(1)
Basic

Listagem 2

10 REM Imprime tela do disco
20 REM Carrega a tela
30 BLOAD "TELA.SCR",S
40 REM Espera led apagar
50 FOR I=1 TO 1000:NEXT
60 REM Imprime
70 SCREEN OUT T, 480
Basic

Resumo

Para carregar o Screen IV pelo MSX-DOS, basta renomear o SCREEN4.CMD para SCREEN4.COM, e a partir disto digitar

A:>SCREEN4

Para carregar via MSX-BASIC:

BLOAD "SCREEN4",R

para entrar no modo SCREEN4, basta digitar:

SCREEN4

Downloads

  • screen-4.dsk: Disco contendo as versões binárias do projeto Screen IV.
  • screen-4.zip: Artigos originais digitalizados da revista.





Nenhum comentário:

Postar um comentário