Curso de Basic
Autoexec da Riosoft
Você está em: MarMSX >> Cursos >> BASIC
A figura a seguir ilustra o programa AUTOEXEC.BAS.
┌───────────────────────────┐
│ RUNEXEC Vs 1.0 │
│ BY │
│ RIOSOFT INFORMATICA LTDA │
│ TEL. (021) 264-3726 │
└───────────────────────────┘
┌──────────────┬──────────────┐
│[RIOSOFT 1990]│ RIOSOFT 1990 │
│ RIOSOFT 1990 │ RIOSOFT 1990 │
│ RIOSOFT 1990 │ RIOSOFT 1990 │
│ RIOSOFT 1990 │ RIOSOFT 1990 │
│ RIOSOFT 1990 │ RIOSOFT 1990 │
│ RIOSOFT 1990 │ RIOSOFT 1990 │
│ RIOSOFT 1990 │ RIOSOFT 1990 │
│ RIOSOFT 1990 │ RIOSOFT 1990 │
│ RIOSOFT 1990 │ RIOSOFT 1990 │
│ RIOSOFT 1990 │ RIOSOFT 1990 │
┌┴──────────────┼──────────────┴┐
│S - SISTEMA │B - MSX BASIC │
│N - NOVO DISCO │ENTER - EXECUTA│
├───────────────┴───────────────┤
│ Cursores movimentam colchetes │
└───────────────────────────────┘
O programa autoexec.bas foi criado pela Riosoft em 1990 com o objetivo de funcionar como um menu interativo para carregamento de programas e jogos.
A idéia do programa é bem simples e fácil de entender. Entretanto, vejamos antes como ele está estruturado:
Sub-rotina para desenhar o menu na tela.
Sub-rotina de controle do cursor e teclas.
Sub-rotina para listar arquivos e armazená-los em um vetor.
Sub-rotina para executar o arquivo.
A seguir, a listagem do programa juntamente com o código segmentado de acordo com as cores das sub-rotinas apresentadas acima.
1 '**********************************
2 '* RUNEXEC VS. 1.0 *
3 '* PROGRAMADO PARA RIOSOFT *
4 '* POR *
5 '* ALEXANDRE NUNES *
6 '**********************************
7 POKE-1,0
10 KEYOFF:SCREEN0:WIDTH40:COLOR15,1,1:CLEAR300:DIMNO$(21):GOTO250
20 CLS:LOCATE5,0:PRINT"┌───────────────────────────┐":LOCATE5,1:PRINT"│ RUNE
XEC Vs 1.0 │":LOCATE5,2:PRINT"│ BY │":LOCATE5,3:PRI
NT "│ RIOSOFT INFORMATICA LTDA │"
30 LOCATE5,4:PRINT"│ TEL. (021) 264-**** │":LOCATE5,5:PRINT"└─────────────
──────────────┘"
40 LOCATE4,6:PRINT"┌──────────────┬──────────────┐":FORF=1TO10:PRINT" │";SPA
CE$(14);"│";SPACE$(14);"│":NEXT
50 Y1=7:FORF=1TO10:IFLEN(NO$(F))=0THENLOCATE6,Y1:PRINT"RIOSOFT 1990"ELSELOCATE6,
Y1:PRINTNO$(F)
60 Y1=Y1+1:NEXT
70 Y1=7:FORF=11TO20:IFLEN(NO$(F))=0THENLOCATE21,Y1:PRINT"RIOSOFT 1990"ELSELOCATE
21,Y1:PRINTNO$(F)
80 Y1=Y1+1:NEXT
90 PRINT" ┌┴──────────────┼──────────────┴┐":PRINT" │S - SISTEMA │B - MSX
BASIC │":PRINT" │N - NOVO DISCO │ENTER - EXECUTA│":PRINT" ├───────────────
┴───────────────┤"
100 PRINT" │ Cursores movimentam colchetes │":PRINT" └──────────────────────
─────────┘"
110 LOCATE 5,7:PRINT"[":LOCATE18,7:PRINT"]":NF=1:Y1=7:X1=5:X2=18
120 A=STICK(0):B$=INKEY$
130 IFA=1THENNF=NF-1:IFNF=0ORNF=10THENNF=NF+1ELSELOCATEX1,Y1:PRINT" ":LOCATEX2,Y
1:PRINT" ":Y1=Y1-1:LOCATEX1,Y1:PRINT"[":LOCATEX2,Y1:PRINT"]"
140 A=STICK(0)
150 IFA=3THENNF=NF+10:IFNF>20THENNF=NF-10ELSELOCATEX1,Y1:PRINT" ":LOCATEX2,Y1:PR
INT" ":X1=X1+15:X2=X2+15:LOCATEX1,Y1:PRINT"[":LOCATEX2,Y1:PRINT"]"
160 A=STICK(0)
170 IFA=5THENNF=NF+1:IFNF=11ORNF=21THENNF=NF-1ELSELOCATEX1,Y1:PRINT" ":LOCATEX2,
Y1:PRINT" ":Y1=Y1+1:LOCATEX1,Y1:PRINT"[":LOCATEX2,Y1:PRINT"]"
180 A=STICK(0)
190 IFA=7THENNF=NF-10:IFNF<=0THENNF=NF+10ELSELOCATEX1,Y1:PRINT" ":LOCATEX2,Y1:PR
INT" ":X1=X1-15:X2=X2-15:LOCATEX1,Y1:PRINT"[":LOCATEX2,Y1:PRINT"]"
200 IFB$=CHR$(13)THEN320
210 IFB$="B"ORB$="b"THENCLS:PRINT"MSX BASIC":PRINT"RIOSOFT INFORMATICA 1990":PRI
NT"TEL.(021) 264-****":KEYON:END
220 IFB$="S"ORB$="s"THENPOKE&HF346,1:CLS:PRINT"RIOSOFT INFORMATICA 1990":CALL SY
STEM
230 IF B$="N" OR B$="n"THENRUN
240 GOTO 120
250 CLS:N=0:COLOR1,1:FILES"*.B??":FORI=0TO960STEP40
260 IFVPEEK(I)=32THEN300ELSEN=N+1:FORJ=ITOI+12:NO$(N)=NO$(N)+CHR$(VPEEK(J)):NEXT
J
270 IFVPEEK(I+13)=32THEN300ELSEN=N+1:FORJ=I+13TOI+25:NO$(N)=NO$(N)+CHR$(VPEEK(J)
):NEXTJ
280 IFVPEEK(I+26)=32THEN300ELSEN=N+1:FORJ=I+26TOI+38:NO$(N)=NO$(N)+CHR$(VPEEK(J)
):NEXTJ
290 NEXTI
300 IFES(5)THENCOLOR15,1,1:GOTO20
310 CLS:COLOR15,1,1:GOTO20
320 IF NF<=N AND RIGHT$(NO$(NF),4)="BAS "THENCLS:RUN NO$(NF)
330 IF NF<=N AND RIGHT$(NO$(NF),4)="BIN "THENCLS:BLOAD NO$(NF) ,R
340 BEEP:BEEP:BEEP:GOTO 120
Comentários:
Sub-rotina para listar arquivos e armazená-los em um vetor
Embora esta sub-rotina seja o terceiro bloco, ele é chamada logo no inicio da execução da sub-rotina de desenho na tela, quando a linha 10 desvia para a linha 250.
A principal responsabilidade desta sub-rotina é ler os arquivos executáveis do disco e armazená-los em um vetor.
Tarefas desempenhadas:
- Mudar a cor do texto para preto (mesma cor do fundo) para deixá-lo momentaneamente invisível.
- Dar o comando "FILES" seguido do wildcard "*.B??". Este comando irá listar na tela todos os arquivos com extensão começando por "B" e que possuam mais dois caracteres quaisquer. A listagem dos arquivos na tela não será vista porque o texto está invisível.
- Varrer a memória de vídeo de forma a identificar os nomes dos arquivos listados na tela e armazená-los no vetor NO$. A variável "I" vai de 0 a 960, pulando de 40 em 40, ou seja, de linha em linha. Ele varre as 3 colunas da listagem dos arquivos, onde cada coluna tem comprimento igual a 12 (arquivo do tipo 8.3).
- Ao terminar a execução dessa sub-rotina, o programa retorna à sub-rotina de desenho na linha 20.
O programa a seguir ilustra como podemos ler uma palavra ou frase na tela de modo a armazená-la em uma variável.
10 SCREEN 0:WIDTH 40
20 PRINT"MarMSX"
30 FOR I=0 TO 5
40 NO$ = NO$ + CHR$(VPEEK(I))
50 NEXT I
60 PRINT"A palavra que eu li na tela é: " + NO$
Sub-rotina para desenhar o menu na tela
Esta sub-rotina faz o desenho do menu que está no topo dessa página.
Primeiramente ela formata a tela que será desenhado o menu e cria um vetor de nomes de arquivo chamado NO$ com tamanho igual a 21. Nesse momento, o programa é desviado para a sub-rotina que "lista arquivos e os armazena em um vetor".
Após executar essa sub-rotina, os nomes dos arquivos que irão compor o menu são armazenados no vetor NO$.
O restante do código é o desenho do menu, onde os nomes dos arquivos são lidos de NO$. No menu, cabem 20 arquivos.
Obs: O comando "POKE -1,0" serve para ajustar a RAM para o sub-slot 0.
Sub-rotina de controle do cursor e teclas
Esta rotina é o loop principal do programa. Ela espera uma ação do usuário e trata os eventos advindos dele.
O comando "STICK(0)" espera um evento vindo dos cursores do teclado e o comando "INKEY$" é utilizado para receber as letras do teclado. Em ambos os casos, as funções não ficam à espera da ação do usuário, ou seja, passa logo para a instrução seguinte. Assim, a sub-rotina tem que ficar em loop e fica o tempo todo sendo executada.
O comando "INPUT$(1)" poderia substituir ambos os comandos, pois é capaz de ler tanto as teclas do cursor como as letras do teclado. Além disso, esse comando trava a execução do programa à espera da ação do usuário.
Ações esperadas:
- Cursores - navegam pelo arquivo.
- "B" - Retona ao basic.
- "N" - Reexecuta o programa (no caso de mudar o disquete).
- "S" - Chama o MSX-DOS. O poke &HF346,1 habilita chamar o S.O..
- "Enter" - executa o arquivo selecionado.
Sub-rotina para executar o arquivo
Essa sub-rotina analisa a extensão do arquivo selecionado. Se for "BAS ", utiliza o comando "RUN". Caso seja "BIN ", utiliza o comando "BLOAD". Caso não seja nenhum deles, dá um beep e retorna à sub-rotina de controle do cursor e teclas.