Programowanie: Przerywanie długotrwałych operacji klawiszem BREAK

From Atariki

Revision as of 15:26, 10 cze 2014; view current revision
←Older revision | Newer revision→
Jump to: navigation, search

SpartaDOS X posiada mechanizmy pozwalające programiście elegancko obsługiwać sytuacje wyjątkowe. Służą do tego procedury opisane w 4 rozdziale podręcznika programowania p.t. "Obsługa błędów".

Zazwyczaj używa się ich przy przechwytywaniu sytuacji wyjątkowych występujących podczas operacji na plikach, jednakże można z powodzeniem wykorzystać ten mechanizm do generowania sytuacji wyjątkowych we własnych procesach.

Wystarczy ustawić własną obsługę błędu za pomocą U_SFAIL i z wnętrza własnej procedury wywołać fukcję U_FAIL z kodem błędu w akumulatorze:

protectedroutine:
  lda ?catchad
  ldx ?catchad+1
  jsr U_SFAIL
  
  jsr routine
  
  jmp U_XFAIL

?catchad .dw catchroutine

catchroutine:
  nop           ;obsługujemy błąd
  
  rts

;a to procedura generująca błąd
routine:
  nop           ;coś robimy
  
  lda #ERROR    ;i generujemy błąd
  jmp U_FAIL

W przypadku wygenerowania błędu funkcja U_FAIL przekazuje sterowanie natychmiast do procedury obsługi, a stan stosu odtwarzany jest tak, aby powrót nastąpił do procedury wywołującej kod zakładający pułapkę - w tym przypadku będzie to punkt wywołujący protectedroutine.

TODO: ujemny/dodatni kod błędu.

UWAGA! U_SFAIL w żaden sposób nie raportuje przepełnienia wewnętrznego stosu zarejestrowanych procedur obsługi błędów należy więc pamiętać, iż takich procedur obsługi może być maksymalnie 10.

OS w przypadku naciśnięcia klawisza BREAK powoduje wyzerowanie komórki IRQSTAT ($11). Można więc wykorzystując opisany wyżej mechanizm łatwo zaimplementować funkcjonalność przerywania dowolnego długotrwałego procesu za pomocą wciśnięcia klawisza BREAK.

W kodzie długotrwałej procedury należy co jakiś czas sprawdzać zawartość IRQSTAT i jeśli została wyzerowana rzucić błąd (np. BREAK KEY ABORT)

routine:
  ...
  jsr erroronbreak
  ...
  rts
 
erroronbreak:
  lda IRQSTAT
  seq
  rts
  lda #$80      ;BREAK KEY ABORT
  sta IRQSTAT
  jmp U_FAIL

Warto zauważyć, iż po wykryciu wciśnięcia klawisza BREAK przywracana jest wartość $80 w IRQSTAT. Ustawiana jest ona przez OS podczas normalnej pracy (podczas operacji SIO mogą się tam znaleźć kody błędów). Jest to o tyle istotne, że funkcje konsoli sprawdzają tę komórkę i również generują błąd wciśnięcia klawisza BREAK. Brak obsługi IRQSTAT spowodowałby nieoczekiwane wyrzucenie błędu przy pierwszej próbie użycia np. PRINTF, PUTC, itp.

Personal tools