Pacote gráfico Basic 64 TC2068
Pacote gráfico Basic 64
Extensão ao Sinclair Basic
Versão para o TC2068
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, versão 1.1, possibilita ao utilizador o uso das capacidades gráficas
e de impressão de texto especiais, suportadas pela arquitetura do microcomputador TC2068
(em modo TC2068).
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 BASEST1A, em caso
contrário (sim) o código a carregar é BASEST1, 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 32280,
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 expresses. 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 flexvel, 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, bem como das áreas de STACK e CÓDIGO
RESIDENTE EM RAM. A área BASIC passa a situar-se a partir do endereço 34313 (apontado
pela variável de sistema PROG). Logo a seguir à àrea reservada aos CANAIS (CHANS),
situa-se o novo SET de caracteres (comprimento = 768 bytes), seguindo-se a rotina Basic64
(comprimento = 2030 bytes), que antecede a área do BASIC. As zonas de STACK e CÓDIGO
RESIDENTE EM RAM ficam colocados no segmento de 8K bytes superior, do mapa de memória.
Esquematicamente temos:
..----------------------------------------------------------------------------------------------..
HOME | 1º Display | Atributos | Printer | Variáveis | 2º Display | Atributos |
| Canais |
ROM | File | 1º D.F. | Buffer
| do Sist. | File | 2º D.F. |
| |
..---^------------^-----------^---------^-----------^------------^-----------^-------^--------^-..
16384 22528
23296 23552 24576
30720 31488
(CHANS) 31510
(ARSBUF)
..--------------------------------------------------------------------------------------------------..
| Set carac. | Rotina | Prog. | Variáveis | 80H | Buffer | 0DH |
80H | Buffer | 0DH | Buffer |
| 6x8 | Basic64 | Basic |
| |
Edição | | | Input
| | Temp. |
..--^------------^---------^-------^-----------------^--------------------^-----------------------^-..
31510 32280 34343
VARS
E_LINE
WORKSP
STKBOT
(PROG)
..---------------------------------------------------------------------------------------
| Stack | Livre | 3EH | UDG | Stack da |
Código executor | Código de comutação |
| Calculador |
| | | Maquina | de utilitários |
de bancos |
..--^------------^-------^-----^-----^----^-----^---------------------------------------^
STKBOT STKEND RAMTOP UDG 63424
SP 63936
P_RAMT
(MSTBOT)
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 | 31491 | XCOORD | Coordenada x do ultimo ponto colocado |
1 | 31493 | YCOORD | Coordenada y do ultimo ponto colocado |
1 | 31494 | FLAG | Flag do sistema |
2 | 31495 | COUNT | Contador |
2 | 31497 | WORK | Buffer |
1 | 31499 | VDMOD | Modo de resolução: 0 se 256x176, 1 se 512x176 |
1 | 31500 | COL | Coluna do ultimo caracter imprimido |
1 | 31501 | LIN | 21 menos a linha do ultimo caracter impresso |
2 | 31502 | XCR | Utilizado pelo canal #5 |
1 | 31504 | YCR | Idem |
1 | 31505 | CURST | Canal que está a ser utilizado |
1 | 31506 | NCOL | Nº maximo de colunas em utilização |
1 | 31507 | LARG | Largura em pixeis, dos caracteres impressos usando o canal #5 |
1 | 31508 | MAXCL | Nº maximo de colunas da impressão usando o canal #5 |
1 | 31509 | 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 1230h. 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 1230h ;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 1230h ;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 1230h ;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 compem 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 1230h
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 *"BASEST1"CODE 32280,2030
seguido de:
SAVE *"SETNM"CODE 31510,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 *"BASEST1"CODE
... sendo a linha 14 alterada para:
14 RANDOMIZE USR 32280: OUT255,0: LOAD *"SETNM"CODE 31510
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.