Tajemnice ATARI

PISZEMY GRĘ


    Witam ponownie w naszym cyklu. W poprzednich odcinkach prosiłem o nadsyłanie listów z uwagami, propozycjami czy pytaniami dotyczącymi tego cyklu i ogólnie pisania gier. Z wszystkich otrzymanych (jednego) wywnioskowałem, że Czytelnikami są w przeważającej większości (1:0) początkujący użytkownicy ATARI, mający problemy nawet z wyświetleniem trójkolorowego sprite'a czy napisaniem Display Listy. Tak więc, aby zadość uczynić danym obietnicom spełnienia życzeń Czytelników, zamiast pisać np. o tym jak uzyskać 21 sprite'ów na ekranie, napiszę po prostu o tym, jak wyświetlić trójkolorowego sprite'a. Aby informacje zawarte w artykule były dla wszystkich zrozumiałe, przedstawię je w formie kolejnych kroków do wykonania.

Krok pierwszy.

    Wykonaj takie czynności jak dla zwykłych sprite'ów jednokolorowych: rezerwacja pamięci, ustalenie rozdzielczości itd.

Krok drugi.

    Ustaw bit 5 w rejestrze GTICTLS ($26f).

Krok trzeci.

    Ustal kolory dla sprite'ów. Pamiętaj, że wynikowy kolor w miejscu nałożenia się punktów z obu sprite'ów jest sumą logiczną (OR) kolorów pojedynczych sprite'ów.

Krok czwarty.

    Ustaw oba sprite'y w tym samym miejscu ekranu.

    Myślę, że prościej nie można tego wyjaśnić. Dla opornych mam dwie rady: 1. analiza zamieszczonego przykładu, 2. rezygnacja z pisania gier i zajęcie się raczej ich wykorzystywaniem.
 opt 21
 org $a000

* --- Constans ---

pm_adr   equ $b000

dma_mod  equ %111010
* Normalny obraz,
* DMA dla graczy,
* rozdzelczosc jednoliniowa,
* DMA dla ANTIC'a.

gtia_mod equ %100001
* Najwyzszy priorytet dla sprite'ow,
* trojkolorowe sprite'y.

pm_mod   equ %10
* Zezwolenie na
* wyswietlanie graczy.

pm_size  equ %00
* Normalna szerokosc
* sprite'a.

col_1    equ %01110100
*                +
col_2    equ %10001000
*                =
*             11111100

height   equ 16
* Wysokosc.

min_x    equ 48
min_y    equ 32
max_x    equ 200
max_y    equ 224-height
* Minimalne i maksymalne
* pozycje na ekranie.

pl0_pos  equ $400
pl1_pos  equ $500
* Przesuniecia wzgledem
* poczatku obszaru
* pamieci sprite'ow.

* --- System -----

dmactl   equ $22f
gtiactl  equ $26f
colpm0   equ $2c0
colpf0   equ $2c4
hposp0   equ $d000
sizep0   equ $d008
pmctl    equ $d01d
pmbase   equ $d407

* --- Program ----

begin    equ *

* Krok pierwszy

 ldy #0
 tya

bgn_1    equ *

 sta pm_adr+$300,y
 sta pm_adr+$400,y
 sta pm_adr+$500,y
 sta pm_adr+$600,y
 sta pm_adr+$700,y
 iny
 bne bgn_1

 lda >pm_adr
 sta pmbase

 lda #pm_size
 sta sizep0
 sta sizep0+1

 lda #dma_mod
 sta dmactl

 lda #pm_mod
 sta pmctl

* Krok drugi

 lda #gtia_mod
 sta gtiactl

* Krok trzeci

 lda #col_1
 sta colpm0
 lda #col_2
 sta colpm0+1


* Poczatek przykladu

 lda #0
 sta colpf0+2
 lda #2
 sta colpf0+4

 lda #min_x
 lda #100
 sta x_plr
 lda #min_y
 lda #100
 sta y_plr
 lda #0
 sta zx
 sta zy

* Glowna petla
* przykladu

loop     equ *

* Oczekiwanie na
* synchronizacje
* pionowa.
* (Przerwanie VBLANK)

 lda 20
 cmp 20
 beq *-2

* Wywolanie procedur
* obslugi sprite'a.

 jsr clr_plr
 jsr new_pos
 jsr shw_plr

* Skok na poczatek
* petli.

 jmp loop

* Skasowanie sprite'a

clr_plr  equ *

 ldy y_plr
 ldx #0
 txa

clpl_1   equ *

 sta pm_adr+pl0_pos,y
 sta pm_adr+pl1_pos,y
 iny
 inx
 cpx #height
 bcc clpl_1
 rts

* Wyswietlenie sprite'a

shw_plr  equ *

 ldy y_plr
 ldx #0

shpl_1   equ *

 lda shape1,x
 sta pm_adr+pl0_pos,y
 lda shape2,x
 sta pm_adr+pl1_pos,y
 iny
 inx
 cpx #height
 bcc shpl_1
 lda x_plr
 sta hposp0
 sta hposp0+1
 rts

* Zmiana pozycji

new_pos  equ *

* Ustalenie nowej
* pozycji poziomej

 ldx x_plr
 inx
 lda zx
 beq right
 dex
 dex

right    equ *

 stx x_plr

* Sprawdzenie, czy
* ma nastapic zmiana
* kierunku ruchu w
* poziomie...

 lda #$00
 cpx #min_x
 bcs *+4
 lda #$ff

 cpx #max_x
 bcc *+4
 lda #$ff

* ...i ewentualna
* jego zmiana

 eor zx
 sta zx

* Ustalenie nowej
* pozycji pionowej

 ldx y_plr
 inx
 lda zy
 beq down
 dex
 dex

down     equ *

 stx y_plr

* Sprawdzenie, czy
* ma nastapic zmiana
* kierunku ruchu w
* pionie...

 lda #$00
 cpx #min_y
 bcs *+4
 lda #$ff

 cpx #max_y
 bcc *+4
 lda #$ff

* ...i ewentualna
* jego zmiana

 eor zy
 sta zy
 rts

* Zmienne

x_plr    dta b(0)
y_plr    dta b(0)
zx       dta b(0)
zy       dta b(0)

* Definicja pierwszego
* sprite'a

shape1   equ *

 dta b(%00011000)
 dta b(%00111100)
 dta b(%01111000)
 dta b(%01110000)
 dta b(%11100000)
 dta b(%11000000)
 dta b(%11000000)
 dta b(%10000001)
 dta b(%10000001)
 dta b(%00000011)
 dta b(%00000011)
 dta b(%00000111)
 dta b(%00001110)
 dta b(%00011110)
 dta b(%00111100)
 dta b(%00011000)

* Definicja drugiego
* sprite'a

shape2   equ *

 dta b(%00011000)
 dta b(%00111100)
 dta b(%01111110)
 dta b(%01111110)
 dta b(%11111111)
 dta b(%11111111)
 dta b(%11111111)
 dta b(%11111110)
 dta b(%11111110)
 dta b(%11111100)
 dta b(%11111100)
 dta b(%11111000)
 dta b(%01110000)
 dta b(%01100000)
 dta b(%00000000)
 dta b(%00000000)

 opt 7
 end
    P.S. Ciągle czekam na listy. Jak nic nie przyjdzie, to dalej będę pisał takie bzdury. Proponuję, abyśmy współtworzyli ten cykl na zasadach "Czytelnicy piszą, przyjaciółka odpowiada".


Dariusz "De JET" Żołna



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

Pixel 2002