Curso de Basic
Interrupções


  Uma interrupção é um sinal enviado pelo hardware ou software ao processador, indicando que um evento deverá ser imediatamente tratado. Dessa forma, o processador suspende sua atividade, desviando para uma sub-rotina de tratamento de interrupção. Após tratar a interrupção, o processador retoma a atividade interrompida [1].
  A interrupção se diferencia do desvio, uma vez que o desvio é ativado quando uma determinada condição é atingida pelo fluxo normal de execução de um programa, enquanto que a interrupção pode ser ativada em qualquer parte do programa e a qualquer tempo, devido a ocorrência de um evento.

  Exemplo de desvio [2]:
10 INPUT "Entre com um número entre 1 e 3";A
20 IF A<1 OR A>3 THEN 10
30 ON A GOSUB 100,200,300
40 RUN
100 PRINT"SUB-ROTINA 1"
110 RETURN
200 PRINT"SUB-ROTINA 2"
210 RETURN
300 PRINT"SUB-ROTINA 3"
310 RETURN
  Para desviar o programa para uma sub-rotina, a linha 30 deverá ser executada sempre que se desejar efetuar esse desvio.

  Exemplo de interrupção:
10 ON KEY GOSUB 100
20 KEY(1) ON
30 GOTO 30
100 PRINT"Tecla F1 pressionada"
110 RETURN
  Nesse programa, indicamos apenas uma vez ao sistema que sempre que a tecla F1 for pressionada, o programa deverá ser desviado para a linha 100. Assim, quem ativa o desvio é a tecla pressionada.
  Repare que o programa está "preso" na linha 30, e que será desviado para a linha 100 quando a tecla F1 for pressionada.


  Tipos de interrupção [1]:
  Interrupções do Basic do MSX:

Interrupção Tipo Quem ativa a interrupção
Key Hardware Teclas de função F1 a F10
Stop Hardware Teclas Control+Stop
Interval Hardware Temporizador do MSX
Strig Hardware Botão de tiro ou barra de espaços
Sprite Hardware Colisão de sprites
Error Software Erro no programa


  On Key Gosub

  Desvia a execução de um programa para uma sub-rotina, quando uma tecla de função (F1 a F10) é pressionada.

  Sintaxe:
ON KEY GOSUB linha_F1, linha_F2, linha_F3, ..., linha_F10
  As teclas de função podem ser ativadas ou desativadas através do comando KEY(n) ON/OFF. Por padrão, as teclas estão desligadas (OFF).

  Exemplo:
10 ON KEY GOSUB 100,200,300
20 KEY(1) ON:KEY(2) ON:KEY(3) ON
30 GOTO 30
100 PRINT "Tecla F1"
110 RETURN
200 PRINT "Tecla F2"
210 RETURN
300 PRINT "Tecla F3"
310 RETURN

  Obs: é necessário indicar a linha de tratamento somente até a tecla que está sendo utilizada. Além disso, é necessário utilizar o número de vírgulas até a posição correspondente a esta tecla, independente se as teclas anteriores estão sendo utilizadas ou não.

  Exemplo:
10 ON KEY GOSUB ,,300
20 KEY(3) ON
30 GOTO 30
300 PRINT "Tecla F3"
310 RETURN
  Apesar das teclas F1 e F2 não estarem sendo utilizadas, colocamos o tratamento de F3 na terceira posição da instrução ON KEY GOSUB.

  O programa "placar" da seção Basic utiliza as teclas funcionais para controlar um placar eletrônico.


  On Stop Gosub

  Desvia o programa para uma sub-rotina, após as teclas CONTROL e STOP terem sido pressionadas juntas. Essas teclas são utilizadas para interromper a execução de um programa em Basic.
  A instrução ON STOP GOSUB era muito utilizada por programadores para que o programa não fosse interrompido.

  Exemplo:
10 ON STOP GOSUB 100
20 STOP ON
30 GOTO 30
100 ' Tratamento
110 PRINT "Nao quero parar ..."
120 RETURN

  A instrução STOP ON/OFF habilita/desabilita a interrupção causada pelas teclas CONTROL+STOP.


  On Interval Gosub

  Desvia o programa para uma determinada sub-rotina, após um tempo decorrido. O temporizador do MSX é que causa a interrupção.

  Sintaxe:
ON INTERVAL=tempo GOSUB linha
  A unidade de tempo é de 1/60 segundos.

  Cálculo do tempo em segundos:
t_s = tempo * 1/60

  Exemplo:
10 ON INTERVAL=60 GOSUB 100
20 INTERVAL ON
30 CLS:S=0:M=0
40 GOTO 40
100 ' Tratamento
110 S=S+1
120 IF S>59 THEN S=0:M=M+1
130 LOCATE 0,0:PRINT USING"##:##";M;S
140 RETURN

  A instrução INTERVAL ON ativa o tratamento da interrupção causada pelo temporizador, enquanto que a instrução INTERVAL OFF suspende esse tratamento.

  O capítulo 14 aborda o temporizador, enquanto que o programa "placar" da seção Basic implementa um relógio digital para o placar eletrônico.


  On Strig Gosub

  Desvia a execução do programa, quando a barra de espaços ou um dos botões de um dos dois joysticks forem pressionados.

  Código dos botões:
  1. Barra de espaços
  2. Botão 1 do joystick A
  3. Botão 2 do joystick A
  4. Botão 1 do joystick B
  5. Botão 2 do joystick B
  Sintaxe:
ON STRIG GOSUB linha_cod_0, linha_cod_1, ..., linha_cod_4
  A instrução STRIG(codigo) ON/OFF habilita/desabilita a interrupção dos botões ou barra de espaços.

  Exemplo [2]:
10 ON STRIG GOSUB 100, 200, 300, 400, 500
20 FOR F=0 TO 4
30 STRIG(F) ON
40 NEXT F
50 CLS
60 PRINT "Pressione ESPACO ou um BOTAO"
70 GOTO 70
100 PRINT "Barra de espacos" : RETURN
200 PRINT "Botao 1, Joystick A" : RETURN
300 PRINT "Botao 2, Joystick A" : RETURN
400 PRINT "Botao 1, Joystick B" : RETURN
500 PRINT "Botao 2, Joystick B" : RETURN


  On Sprite Gosub

  Desvia o programa para uma sub-rotina, quando há uma interrupção causada pela colisão de dois sprites.

  Exemplo:
10 SCREEN 2,1
20 OPEN"GRP:" AS #1
30 FOR F=1 TO 8
40 READ A$
50 S$=S$+CHR$(VAL("&H"+A$))
60 NEXT F
70 SPRITE$(0)=S$
80 ON SPRITE GOSUB 500
90 SPRITE ON
100 FOR X=0 TO 255
110 PUT SPRITE 0,(X,100),15,0
120 PUT SPRITE 1,(255-X,100),10,0
130 NEXT X
140 GOTO 140
150 DATA 3C,7E,81,81,FF,7E,24,42
500 ' Tratamento
510 PRESET(100,130):PRINT#1,"Crash !!!"
520 RETURN
  Adaptado de [2].

  A instrução SPRITE ON/OFF habilita/desabilita a interrupção por conta da colisão de sprites.

  No programa anterior, a execução do código principal pára quando houver colisão.
  Para continuar a execução do loop (linhas 100-130), a colisão deverá ser desabilitada para o tratamento e depois habilitada novamente.
  Altere as linhas 500-520 do programa anterior para:
500 ' Tratamento
510 SPRITE OFF
520 BEEP
530 SPRITE ON
540 RETURN


  On Error Goto

  Desvia a execução de um programa para uma sub-rotina devido a um erro de execução do programa ou na entrada de dados.
  A instrução RESUME <linha> indica a linha de retorno após o tratamento do erro.

  Exemplo:
10 ON ERROR GOTO 100
20 INPUT"Dividendo";A
30 INPUT "Divisor";B
40 C = A/B
50 PRINT A;"/";B;"=";C
60 END
100 ' Tratamento do erro
110 PRINT "Erro: divisao por zero"
120 RESUME 20
  Saída 1:
  Dividendo? 4
  Divisor? 2
  4 / 2 = 2

  Saída 2:
  Dividendo? 4
  Divisor? 0
  Erro: divisao por zero
  Dividendo?

  A instrução ainda permite tratar erros de sintaxe dentro do programa. Exemplo:
10 ON ERROR GOTO 100
20 PRUNT
30 END
100 PRINT "Xiii. Meu programa tem erro."
110 RESUME 30
  A linha 20 contém um erro proposital para demonstrar o tratamento desse erro.



  Referências:

  [1]- Interrupt, Wikipedia. Em: http://en.wikipedia.org/wiki/Interrupt
  [2]- Livro: Linguagem Basic MSX, editora Aleph, 5a. Edição, 1987.


<< Anterior Basic Próxima >>


/MARMSX/CURSOS/Basic