timex-computer.jpg (19841 bytes)

PACOTE GRÁFICO BASIC 64
TC2048


Pacote gráfico Basic 64 TC2048
Pacote gráfico Basic 64
Extensão ao Sinclair Basic
Versão para o TC2048
Pacote Gráfico Basic 64


Nota: As rotinas BASIC64 e o conteúdo deste manual podem ser utilizados em programas de utilizador.
Programas comerciais que as utilizem, deverão mencionar apenas, que são usadas as rotinas BASIC64.

CAP 0 - Introdução

O programa Basic64 possibilita ao utilizador o uso das capacidades gráficas e de impressão de texto especiais, suportadas pela arquitetura dos microcomputadores TC2068 (em modo ZX Spectrum) e TC2048.

Foram destacados canais especiais, para impressão em 64 colunas (canal #4) ou impressão com numero definivel de colunas (canal #5). Está implementado um novo conjunto de comandos Basic, em adição ao já existente, permitindo a utilização destes modos gráficos em programas escritos em Basic. Por outro lado, está igualmente previsto o uso de rotinas em linguagem máquina, que desenvolvem estas capacidades.

Refira-se que esta implementação utiliza o mesmo tipo de procedimentos, por parte do utilizador, em relação ao Basic standard.

CAP 1 - Inicialização do Sistema

Introduza a cassete que contém o programa Basic64, no seu gravador e execute o comando:

LOAD ""

Após ter sido carregado um LOADER surge a seguinte mensagem:

TEM O SISTEMA FDD LIGADO AO COMPUTADOR? (S/N)

Se a resposta é não, então é carregado o código BASESTA, em caso contrário (sim) o código a carregar é BASEST, o que justifica, pois com o sistema FDD ligado a rotina máquina é ligueiramente diferente, do queno caso com o FDD desligado (interface Timex desligado). Seguidamente é carregado o segundo bloco de código, após o que surge a mensagem:

0 OK, 0:2

Pode agora verificar que existe uma linha 0 que inclui uma chamada directa à rotina e uma mensagem de copyright. A chamada à rotina vai promover a recolocação do BASIC, iniciar as novas variàveis introduzidas prelo Basic64, abrir os novos canais de impressão (#4 e #5) e preparar o interpretador Basic, de modo a que este aceite a sintaxe dos novos comandos criados.

Refira-se que o utilizador deve executar o comando RANDOMIZE USR 31488, após a execução dum CLEAN n, dum RUN n ou de um GOSUB n para ter acesso aos comandos estendidos. Por outro lado aconselha-se que a edição de programas Basic, seja feita em 32 colunas, para o que é necessario executar o seguinte comando:

OUT 255,0

Após a edição, pode retornar aos modos estendidos com os comandos INK* n ou PAPER* n.

1.1 Salvar e chamar programas em Basic 64

Existem duas formas de salvar programas em Basic64, envolvendo uma delas a alteração do programa em Basic, fornecido na cassete.

Num primeiro passo comum aos dois processos, o programa é gravado na cassete pela forma usual. Para o chamar novamente pode-se primeiro chamar a rotina Basic64, e depois chama-se o programa com um simples LOAD "nome". Se se pretende chamar num só passo (i.e. fazendo apenas um LOAD ""), há que proceder da seguinte forma: primeiro faz-se um NEW, depois a partir da cassete BASIC64 executa-se MERGE "" após o que se fizer LIST verificará a existência da linha 15 que possui um comentário bastante ilucidativo. Coloque então nessa linha a intrução conveniente e grave o programa com SAVE "BASIC64" LINE 10

CAP 2 -Basic estendido

2.1 Modos de resolução


No que respeita às capacidades gráficas, o utilizador possui dois modos de resolução permitidos pelo sistema:

0 - 256x192 pixeis (256x176 pixeis na zona de ecrã dedicada à impressão)
1 - 512x192 pixeis (512x176, idem)

Estes modos, ambos utilizando dois DISPLAY FILES, são relativos aos novos comandos gráficos, que passamos a introduzir e que serão explicados na próxima secção:

-PLOT* x,y
-LINE x,y
-LINE x,y,z
-CIRCLE* x,y,r
-SCREEN$ n


Convém referir que os modos 0 e 1 podem ser utilizados simultâneamente no mesmo programa e são independentes dos comandos de impressão de texto e de express›es. Assim em qualquer deles é poss’vel a utilização dos canais #4 e/ou #5 da maneira que se descreve:

#4: Este canal á especialmente dedica do à impressão em 64 colunas. Utiliza o set de caracteres da ROM do microcomputador, apontando pela variável CHARS. Cada caracter está definido numa matriz de pontos de 8x8. A impressão é invocada utilizando os comandos, a introduzir, PRINT #4 ... e LIST #4 ...

#5: Este canal permite uma impressão relativamente flex’vel, já que o modo de impressão é programaval por parte do utilizador. Este possui dois graus de liberdade.

-Número de colunas no ecrã (variável do sistema MAXCL).
-Número de pixeis, na horizontal, da matriz de pontos de definição dos caracteres (variàvel do sistema LARG).

Existe um novo set de caracteres definidos numa matriz de 8x6 pontos, apontados pela variável do sistema CHRST. Trata-se dum set especialmente vocacionado para a impressão em 85/80 colunas, embora possa igualmente ser utilizado em 64 colunas. Assim o canal #5 está definido, por defeito, da seguinte maneira:

-Impressão do novo set de caracteres em 85 colunas e com uma matriz de 8x6, utilizando os comandos PRINT #5 ... e LIST #5...

2.2 Novos comandos Basic

2.2.1 Comandos de impressão de texto


-PRINT #n...
O parâmetro n especifica o canal utilizado (#4 ou #5). O campo ... indica uma sequência de parâmetros do comando PRINT, intercalados por separados (, ; e "). Os parâmetros podem ser: expressão numérica, expressão literal e ainda caracteres de controle (AT m,n TAB n).

-LIST #n;m O parâmetro n especifica o canal em uso (34 ou #5). Este comando provoca uma listagem do programa a partir da primeira linha cujo número é pelo menos m. Se m não é espeficicado então a listagem é feita a partir da primeira linha do programa.

2.2.2 Comandos gráficos

-CLS*
Apaga os dois DISPLAY FILES.

-INK* n O utilizador apenas pode defenir, para o conjunto dos dois DISPLAY FILES, um INK e um PAPER com cores complementares. Este comando coloca INK=n e PAPER=7-n.

-PAPER* n Comando semelhante ao anterior. Coloca PAPER=n, INK=7-n

-SCREEN$ n Estabelece o modo de resolução gráfica. Se n=1, temos o modo de 512x192. Se n=0, o modo então é de 256x192.

-PLOT* x,y Imprime um ponto de INK, tendo em conta OVER e INVERSE, no pixel (x,y) e actualiza a posição PLOT.

-LINE x,y,z Desenha uma linha, desde a posição actual de PLOT, mudando x horizontalmente e y verticalmente e percorrendo um arco de circunferência de z rad.

-LINE x,y LINE x,y,0

-CIRCLE* x,y,r
Desenha uma circunferência de centro (x,y) e raio r, se o modo gráfico é 0 (SCREEN$ 0). Se o modo é 1 (SCREEN$ 1), então desenha uma oval.

2.3 Organização de memória

O novo mapa de memória é caracterizado pela existência de dois DISPLAY FILES e pela recolocação da àrea reservada ao Basic. Este passa a situar-se a partir do endereço 33489 (apontado pela variável de sistema PROG). Logo a seguir à àrea de atributos do segundo DISPLAY FILE encontra-se armazenada a rotina Basic64 (endereço 31488), que anteçede a àrea do Basic.

O novo set de caracteres situa-se numa zona compreendida entre os dois DISPLAY FILES, a partir do endereço 23755.

Esquematicamente temos:

..-------------------------------------------------------------------------------------..
ROM | 1º Display | Atributos | Printer | Variáveis | Canais | 80H | Set cara | Livre |
    |    File    |  1º D.F.  | Buffer  |  do Sist. |        |     |   6x8    |       |
..--^------------^-----------^---------^-----------^--------------^----------^-------^-..
  16384        22528       23296     23552       23434          23755      34523   24576
                                                (CHANS)

..-----------------------------------------------------------------------------------------..
    | 2º Display | Atributos | Rotina  | Programa | Variáveis | 80H | Buffer | 0DH | 80H |
    |    File    |  2º D.F.  | Basic64 |   Basic  |           |     | Edição |     |     |
..--^------------^-----------^---------^----------^-----------------^--------------------^-..
  34576        30720       31488     33489       VARS             E_LINE              WORKSP
                                      (PROG)

..-----------------------------------------------------------------------------------
    | Buffer | 0DH | Buffer |  Stack do  | Livre | Stack | 3EH | Graficos Definidos |
    | Input  |     | Temp.  | Calculador |       |       |     |  pelo Utilizador   |
..--^-----------------------^------------^---------^-----^-----^--------------------^
WORKSP                STKBOT        STKEND       SP   RAMTOP UDG                 P_RAMT

De notar que as zonas de atributos de ambos os DISPLAY FILES não são utilizadas pela rotina Basic64, pelo que podem ser utilizadas como àrea de trabalho pelo utilizador.

2.4 Novas variáveis de sistema

Em adição às variáveis de sistema do Basic do microcomputador, a rotina utiliza as seguinte variáveis:

Nº de bytes Endereço Nome Conteúdo
2 32283 XCOORD Coordenada x do ultimo ponto colocado
1 32285 YCOORD Coordenada y do ultimo ponto colocado
1 32286 FLAG Flag do sistema
2 32287 COUNT Contador
2 32289 WORK Buffer
1 32291 VDMOD Modo de resolução: 0 se 256x176, 1 se 512x176
1 32292 COL Coluna do ultimo caracter imprimido
1 32293 LIN 21 menos a linha do ultimo caracter impresso
2 32294 XCR Utilizado pelo canal #5
1 32296 YCR Idem
1 32297 CURST Canal que está a ser utilizado
1 32298 NCOL Nº maximo de colunas em utilização
1 32299 LARG Largura em pixeis, dos caracteres impressos usando o canal #5
1 32300 MAXCL Nº maximo de colunas da impressão usando o canal #5
1 32301 CHRST 256 menos do que o endereço do set de caracteres utilizado pelo canal #5. Por defeito é igual a 31510-256=31254


CAP 3 - Utilização da linguagem máquina

3.1 Impressão de um caracter em 64, 85 ou 128 colunas


A impressão de um caracter em 64 ou 85 colunas é perfeitamente directa, envolvendo apenas previamente a abertura do canal adequado seguida de um RST 10h, tendo o acumulador, como é normal, o código do caracter a ser impresso. Este caracter pode ser, como será visto adiante, um caracter de controlo.

3.1.1 Impressão em 64 colunas

O canal #4 tem de ser aberto. Esta operação é feita através da rotina do ROM situada a partir do endereço 1601h. Esta rotina tem como parâmetro o número do canal a abrir, que é colocado no acumulador. Assim para imprimir o caracter !, código ASCII=21h, teriamos:

LD   A,4       ;é o canal #4 que vai ser aberto
CALL 1601h     ;abertura do canal
LD   A,21h
RST  10h       ;impressão do caracter !, na linha e coluna correntes
RET

3.1.2 Impressão em 85 colunas

É perfeitamente igual à anterior, simplesmente agora utiliza-se o canal #5. Por exemplo, para impressão do caracter ! teriamos:

LD   A,5       ;é o canal #5 que vai ser aberto
CALL 1601h     ;abertura do canal
LD   A,21h
RST  10h       ;impressão do caracter !, na linha e coluna correntes
RET

3.1.3 Impressão em 128 ou outro número de colunas

Para realizar esta impressão é necessário primeiro definir um novo set de caracteres, que no caso das 128 colunas terá de ser definido numa matriz de 8x4 pixeis. Em qualquer caso cada caracter fica sempre definido pelos normais 8 bytes.

A definição de cada caracter faz-se de forma inteiramente análoga à definição dos UDGs, só que no caso presente apenas as 4 primeiras colunas, a contar da esquerda, podem ser usadas para gerar o ser de caracteres (28 colunas). Este número 4 foi encontardo tendo em atenção que a resolução horizontal é agora de 512 pixeis e assim numa matriz de 128 colunas, a largura de cada coluna é de 512/128=4 pixeis.

Após colocado o set de caracteres em memória, por exemplo a partir do endereço 50000, as variáveis de sistema LARG e MAXCL (note-se que esta impressão refere-se apenas ao canal #5) teriam de ser alteradas em conformidade; LARG tomaria o valor 4 e MAXCL o valor 128.

3.2 Utilização dos caracteres de controlo

A utilização dos caracteres de controlo é direita: abertura do canal adequado seguido de um RST 10h. Depois da "impressão" do caracter de controlo são enviados os parâmetros também através do RST 10h. Por exemplo, para fazer o equivalente a PRINT #5; AT 10,50;"!"; teriamos:

LD   A,5    ;esta abertura do canal é só
CALL 1601h  ;necessária fazer uma vez
LD   A,16h
RST  10h
LD   A,10   ;linha
RST  10h
LD   A,50   ;coluna
RST  10h
LD   A,21h
RST  10h
RET

A utilização do TAB control seria feita de forma inteiramente análoga. Note-se que os caracteres de controlo referentes aos atributos (INK, PAPER, BRIGHT) não têm efeito.

3.3 Impressão de um "string" de caracteres

A impressão de um string de caracteres não é mais do que uma sequência de RST 10h, em que vão sendo enviados sucessivamente os códigos dos caracteres que comp›em o string. Existe uma rotina ROM que realiza este trabalho, situa-se apartir do endereço 203Ch. Esta rotina tem como parâmetros os pares de registos DE e BC que têm respectivamente, o primeiro endereço a partir do qual está armazenado o string e o seu comprimento. Por exemplo, a impressão de um string armazenado a partir do endereço 50000 e de comprimento 100 bytes, seria feita da seguinte forma:

LD DE,50000
LD BC,100
CALL 203Ch
RET

Nota: o canal adequado teria de ser aberto.

3.4 Impressão de uma constante numérica

Utiliza-se para este efeito a rotina PRINT_FP situada a partir do endereço 2DE3h. Esta rotina imprime o número que se encontra no topo do stack do calculador. Assim se se desejar imprimir um número de 2 bytes em 64 colunas, por exemplo 28054 seria:

LD   A,4
CALL 1601h
LD   BC,28054
CALL 2D2Bh    ;por BC no stack do calculador
CALL 2DE3h    ;PRINT_FP
RET

Adenda - Utilização do sistema FDD

Se o seu sistema informático inclui um FLOPPY DISK DRIVE SYSTEM (FDD) da TIMEX, então torna-se desejável a alteração do programa LOADER (BASIC_64) fornecido na cassete, com vista a uma eficiente inicialização do sistema. Assim após ter percorrido os procedimentos descritos no CAPITULO 1, com o sistema FDD ligado, deverá executar os seguintes comandos:

SAVE *"BASEST"CODE 31488,2000

seguido de:

SAVE *"SETNM"CODE 23755,768

Seguindamente, severá executar (a partir da cassete) MERGE "BASIC_64". Depois de fazer LIST, deverá apagar as linhas 2 a 12, inclusivé. Será então introduzida a seguinte linha de programa:

12 LOAD *"BASEST"CODE

... sendo a linha 14 alterada para:

14 RANDOMIZE USR 31488: OUT255,0: LOAD *"SETNM"CODE 23755

Nesta altura o programa de LOADER já está convenientemente escrito e restará apenas guarda-lo em diskette. Deverá executar:

SAVE *"START" LINE 12

... e o programa BASIC64 inicializa-se por pressão no botão de reset do interface TIMEX.