Clube Z80 1983; 14: 8.

Dicas de programação
Poupe memória sabendo para onde vai o próximo byte…!!!

Ramiro Verissimo

Address mail to
Prof Doutor Ramiro Verissimo
Psicologia Médica / Faculdade de Medicina do Porto
Al Hernani Monteiro, 4200-319 Porto, Portugal.
Phone: + 351 225 023 963 Fax: + 351 225 088 011
E-mail: [email protected]

Há várias técnicas para encurtar programas tendo em vista a economia de memória.

Posto que o ZX81 usa 6 bytes para armazenar números, conseguiremos uma economia notável substituindo todos os números de um programa (excepto os de linha) por símbolos equivalentes. Se os números 0 e 1 forem substituídos por NOT PI e SGN PI respectivamente, obtém-se uma economia de 4 bytes de cada vez.

Para um número maior, de um ou dois algarismos, pode usar-se a função VAL. Por exemplo, VAL '4' poupa dois bytes, pois o algarismo 4 é armazenado como string e não como número.

A função CODE pode ser usada com números maiores, desde que haja um símbolo, no conjunto de caracteres, que corresponda ao número em causa. Por exemplo, CODE 'IF' substituirá o número 250.

Se o mesmo número é usado repetidamente ao longo de um programa, então o melhor é atribui-lo no início a uma variável, e usá-lo de cada vez que for necessário. Se o número 500 aparece repetidas vezes num programa, então poder-se-á atribuí-lo inicialmente a uma variável - digamos LET N=500. Feito isto, quando surgirem situações do tipo LET X = X + 500, passaremos a escrever LET X = X + N, poupando 5 bytes de cada vez.

Além da substituição dos valores numéricos, outras técnicas há eventualmente aplicáveis (ou aplicadas). Um processo de poupar memória é reduzir os gastos com instruções condicionais.

Por exemplo

IF A = X THEN LET P = P + 1

pode assumir a forma

LET P = P + (A = X)

poupando 6 bytes. Muitas das instruções utilizadas pelos MENUS utilizam a função INKEY$ como no seguinte caso:

10 IF INKEY$ = "8" THEN LET X = X + 1
20 IF INKEY$ = "5" THEN LET X = X - 1

Elas podem ser usadas para mover algo no écran para a direita e para a esquerda. Ora isto pode ser substituído por

10 LET X = X + (INKEY$ = "8") - (INKEY$ = "5")

poupando 20 bytes de cada vez. Se a variável tiver de aumentar ou diminuir mais do que um, então os parêntesis deverão ser multiplicados pelo número pretendido, como por exemplo:

10 IF INKEY$ = "6" THEN LET Y = Y + 2
20 IF INKEY$ = "7" THEN LET Y = Y - 2

pode ser substituído por

LET Y = Y + VAL "2" * ((INKEY$ = "6") - (INKEY$ = "7"))

poupando 13 bytes.

De igual modo, muitas das instruções PRINT podem ser modificadas para economizar memória. Por exemplo, ao escrever as instruções para operar um programa, certas palavras podem ser substituídas por uma instrução de 1 byte. Será o caso de PRINT "ENTRADA DO SEU NOME", que pode transformar-se no equivalente PRINT "INPUT DO SEU NOME" em que INPUT é metido como uma instrução. Isto poupa 6 bytes uma vez que os espaços antes e depois de INPUT não custam nada.

Muitas outras palavras-instruções, tal como IF, OR, TO, AND, THEN, e outras, podem ser usadas com este fim; e são-no. Contudo, para permitir que algumas delas entrem, pode ser necessário meter primeiro THEN, e apagá-lo posteriormente. Quando se vai escrever um texto de linhas que se completam, tal como

10 PRINT "………………"
20 PRINT "………………"
30 PRINT "………………"

este pode ser substituído por

10 PRINT "………………",,"………………",,"………………"

o que, neste caso, poupa 6 bytes.

É de lembrar ainda que GOTO e GOSUB não necessitam de ser atribuídos a valores numéricos como GOTO 100, mas que podem usar funções. Por exemplo, a rotina

10 IF X * 1 THEN GOTO 100
20 IF X * 1 THEN GOTO 200
30 IF X * 1 THEN GOTO 300

pode ser simplesmente substituída por

10 GOTO 100 * X

poupando a enormidade de 40 bytes.

Recorrendo a técnicas como as apontadas, encurtar-se-ão os programas com econimia de memória, e tornar-se-á a programação mais eficaz; por outro lado, as mesmas podem facilitar a análise de determinados passos de programas que a elas recorrem.Topo

line