Curso de Basic
Interrupções
Você está em: MarMSX >> Cursos >> BASIC
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]:
- Hardware - usada pelos dispositivos periféricos para avisar que eles necessitam da atenção por parte do sistema operacional. Por exemplo, uma tecla pressionada.
- Software - é causada por uma condição anormal ou por uma instrução especial do programa. Por exemplo, uma divisão por zero.
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:
- Barra de espaços
- Botão 1 do joystick A
- Botão 2 do joystick A
- Botão 1 do joystick B
- 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.