Curso de Basic
Autoexec da Riosoft

┌───────────────────────────┐
│      RUNEXEC  Vs 1.0      │
│            BY             │
│ RIOSOFT INFORMATICA  LTDA │
│    TEL. (021) 264-****    │
└───────────────────────────┘
┌──────────────┬──────────────┐
│[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:
  1. Mudar a cor do texto para preto (mesma cor do fundo) para deixá-lo momentaneamente invisível.
  2. 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.
  3. 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).
  4. 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:
  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.



MARMSX/CURSOS/Basic