!!!!!!! Nie Bój Się Przerwań... i Duszków czytelnia Try2emu

Nie Bój Się Przerwań... i Duszków

Na zakończenie cyklu artykułów opisujących przerwania w komputerze Atari prezentuję przykład praktycznego wykorzystania przerwania VBLK i grafiki graczy i pocisków.

KROK 1 (linie 40—90)

Piszemy i umieszczamy w liniach DATA procedurę przerwania VBLK,która sprawdza położenie joysticka i odpowiednio przenosi rysunek strzałki. Na początku procedury umieszczamy dodatkowe instrukcje ustawiające przerwanie użytkownika po VBLK i parametry początkowe grafiki graczy i pocisków.


SETVBLK    = $E45C
EXITVBLK    = $E462
GTIACNTL    = $026F
PMCNTL    = $D01D
DNACNTL    = $022F
RAMTOP    = $6A
PMBASE    = $D407
HPOSP1    = $D001
JOYO    = $0278
TRIBO    = $0284
HPOS    = $CB
VPOS    = $CC
    *= $0600
    PLA
    LDY # <START
    LDX # >START
    LDA #$07
    JMP SETVBLK    ;inicjowanie procedury
        ;VBLK uzytkownika
ENTRY    PLA    ;wejscie z BASIC-u
    LDA #$01    ;priorytet graczy
    STA GTIACNTL
    LDA #$02    ;wlaczenie graczy
    STA PMCNTL
    LDA #$3E    ;obraz norialny, DMA
        ;dla graczy i ANTIC-a,
        ;rozdzielczosc jednowierszowa
    STA DMACNTL
    LDA #$9C
    STA RAMTOP
    STA PMBASE
    LDA #$78    ;poczatkowe polozenie
        ;gracza
    STA D1+1
    STA D2+1
    LDA #$9D
    STA D1+2
    CLC
    RTS    ;powrot do BASIC-u
        ;poczatek przerwania
START    LDA JOYO    ;polozenie joysticka
    AND #$0F
    EOR #$OF
    BEQ SHAPE    ;jezli joystick w
        ;polozeniu neutralnym,
        ;to skok
    HOR TAX    ;ruch poziomy
     AND #$0C
     BEQ VERT
     LDY D2+1 ;polozenie
     AND #$08
     BEQ LEFT
RIGHT    INY    ;ruch w prawo
    JMP HEND
LEFT    DEY    ;ruch w lewo
HEND    STY HPOSP1
    STY D2+1
VERT    TXA    ;ruch pionowy
    AND    #$03
    BEQ SHAPE
    AND #$01
    BEQ DOWN
UP    DEC D1+1     ;ruch u gore
    JMP SHAPE
DOWN    INC D1+1    ;ruch w doi
SHAPE    LDX #$00    ;przeniesienie wzoru
        ;do obszaru P/MG
LOOP    LDA PATTERN,X
D1    STA $9D78,X
     INX
    CPX #$10
    BNE LOOP
    LDA TRIGO    ;stan przycisku
    BNE EXIT    ;jezeli nie nacisniety,
     ;to skok
D2    LDA #$78
    STA HPOS    ;pozycja pozioma
    LDA D1+1
    STA VPOS    ;pozycja pionowa
EXIT    JMP EXITVBLK    ;koniec
PATTERN    .BYTE 0,64,96,112,120,120,112,112,
    ;80,16,8,8,8,4,4,0

Pierwsze pięć instrukcji inicjuje przerwanie VBLK — opis tej operacji był w trzecim odcinku naszego cyklu. Kolejny blok instrukcji od etykiety ENTRY do START ma za zadanie wprowadzenie odpowiednich wartości dorejestrów grafiki graczy i pocisków (dokładny opis w „Bajtku" 3/87).

Właściwa procedura przerwania rozpoczyna się od etykiety START. Sprawdza ona położenie joysticka i odpowiednio do tego modyfikuje położenie duszka na ekranie monitora. Następnie sprawdza rejestr przycisku i jeżeli przycisk jest wciśnięty, to współrzędne aktualnego położenia duszka zapisywane są w komórkach 203 i 204. Jednostką miary w pionie jest numer linii ekranu, zaś w poziomie numer cyklu koloru. Wartości z komórek 203 i 204 mogą być już bezpośrednio wykorzystane przez program w BASIC-u.

KROK 2 (linia 10)

Gotową procedurę przenosimy przypomocy pętli FOR/NEXT na stronę 6 pamięci (od adresu 1536).

KROK 3 (linia 20)

Pamięć grafiki graczy i pocisków będzie znajdować się w miejscu, w którym obecnie mieści się pamięć obrazu. Dlatego też najprostszym sposobem oczyszczenia tego obszaru przed zainicjowaniem jest wykonanie instrukcji GRAPHICS. Teraz już można ustalić parametry PM/G (I = USR(1546)) i ustawić przerwanie użytkownika (I = USR (1536)).

KROK 4 (linia 30)

Ostatnią czynnością powinno być przesunięcie na nowe miejsce pamięci obrazu — zrobi to instrukcja GRAPHICS. Powoduje ona jednak także wyłączenie PM/G konieczne jest więc ponowne uruchomienie przez I = USR(1546) — czynność ta musi być powtarzana po każdej instrukcji GRAPHICS.

Zamieszczony obok wydruk w BASIC-u realizuje cały opisany wyżej przykład. Można dołączyć go do dowolnego własnego programu, aby umożliwić użytkownikowi wybór opcji przez wykorzystanie joysticka. Oczywiście wybór ten musi być uzależniony od zawartości komórek 203 i 204.

Od następnego numeru naszego pisma będziemy zamieszczać nadesłane przez Czytelników krótkie procedury wykorzystujące dostępne w Atari przerwania.
 

[atari]
10 FOR I=0 TO 143:READ A:POKE 1536+I,A:NEXT I

20 GRAPHICS 0:I=USR(1536):I=USR(1546)

30 GRAPHICS 0:I=USR(1546)

40 DATA 104,160,48,162,6,169,7,76,92,228,104,169,1,141,111,2,169,2,141,29,208,169,62,141,47,2,169

30 DATA 156,133,106,141,7,212,169,120,141,104,6,141,117,6,169,157,141,105,6,24,96,173,120,2,41,15

60 DATA 73,15,240,41,170,41,12,240,18,172,117,6,41,8,240,4,200,76,74,6,136,140,1,208,140,117,6,138

70 DATA 41,3,240,13,41,1,240,6,206,104,6,76,98,6,238,104,6,162,0,189,128,6,157,120,157,232,224,16

80 DATA 208,245,173,132,2,208,9,169,120,133,203,173,104,6,133,204,76,98,228,0,64,96,112,120,120,112
90 DATA 112,80,16,8,8,8,4,4,0

[/atari]

(ziew)