Tajemnice ATARI

Piszemy GRĘ


    Po przepisaniu programu z dzisiejszego odcinka można będzie już zagrać w naszą grę. Pozostały tylko procedury zbierania przedmiotów i sprawdzania zderzeń, zliczanie i wyświetlanie punktów, paliwa i amunicji oraz procedura wytwarzająca efekty dźwiękowe.

    Procedura TAKE odpowiedzialna jest za zbieranie przedmiotów i zderzenia ludzika z helikopterami. Zderzenia sprawdzane są dwukrotnie, najpierw z głową, a później z nogami ludzika. I tu należy się kilka słów wyjaśnienia. Spotykałem się niejednokrotnie z programami, w których programista tylko raz obliczał adres obiektu na ekranie, a później według tego jednego adresu sprawdzał zderzenia z innymi obiektami umieszczonymi "pod", lub obok niego. Jest to jednak błędne, gdyż w taki sposób zderzenia sprawdzane są "zgrubnie" i może się zdarzyć, że zostaną wykryte przed faktycznym zetknięciem się z obiektem. Należy więc, tak jak w naszym przykładzie, obliczać adres każdego sprawdzanego punktu. Dla niewiernych powiem, że taki sposób zastosowany był w grach "Misja", "Fred", "Digi Duck" czy "Spy Master". W naszym przykładzie procedura TAKE dwukrotnie wywołuje procedurę CHK_TAKE, która po obliczeniu adresu punktu na ekranie sprawdza jego zderzenia z paliwem, amunicją, premią punktową i helikopterami. Z tymi ostatnimi jest pewien problem, gdyż są wyświetlane na sześciu fazach, a śmiertelne powinno być zetknięcie z każdą z nich.

    Procedura RESULT zajmuje się wyświetlaniem liczników i sprawdzaniem, czy został pobity rekord i czy graczowi nie brakło paliwa. Wszystkie liczniki wykorzystują tryb "dziesiętny" procesora, co oznacza, że w jednym bajcie można umieścić dwie cyfry od 0 do 9. Wyświetlaniem liczb w takim formacie zajmują się dwie procedurki SHW_DIG i SHW_CPH, z których pierwsza kilkukrotnie wywoływana jest z podprogramu RESULT. Procedury TAKE i RESULT sygnalizują programowi głównemu w zmiennej DEATH, że nasz gracz zakończył swój żywot. Wpisanie tam niezerowej wartości spowoduje śmierć ludzika.

    Procedura SOUNDS, jak sama nazwa wskazuje, odpowiedzialna jest za efekty dźwiękowe. Wpisanie niezerowej wartości do komórek SOUND1, SOUND2 lub SOUND3 spowoduje wywołanie odpowiedniego efektu dźwiękowego.

    Procedurka GAME_OVR to oczywiście koniec gry. Dźwiękowy i wizualny efekt wybuchu, a potem powrót na planszę tytułową.

    Na tym zakończyliśmy pisanie naszej gry, lecz myślę, że cykl będzie kontynuowany. Wszystko zależy od Was...
inf_zero equ $2c

audf1    equ $d200
audc1    equ $d201

* procedura zbierania
* paliwa, amunicji i 
* punktow, a takze
* sprawdzania zderzen
* z helikopterami

take     equ *

 lda y_plr
 clc
 adc #2
 jsr chk_take
 lda y_plr
 clc
 adc #13

chk_take equ *

 ldx <screen+5
 stx adr1
 ldx >screen+5
 stx adr1+1
 lsr @
 lsr @
 lsr @
 lsr @
 tax

take_1   equ *

 dex
 bmi take_2
 ldy #adr1
 lda #scwidth
 jsr inad
 jmp take_1

take_2   equ *

 ldy #0
 lda (adr1),y
 cmp #ammo
 beq tak_ammo
 cmp #fuel
 beq tak_fuel
 cmp #bonus
 beq tak_bonu
 sec
 sbc #heli
 cmp #$0e
 bcs #take_3
 lda #255
 sta death

take_3   equ *

 rts

tak_ammo equ *

 lda #$99
 sta ammo_cou
 jmp cls_take

tak_fuel equ *

 lda #$99
 sta fuel_cou
 lda #$19
 sta fuel_cou+1
 jmp cls_take

tak_bonu equ *

 lda #$50
 jsr inc_scor

* skasowanie zebranego
* przedmiotu

cls_take equ *

 lda #space
 jsr shw_adr 
 lda #100
 sta sound3
 rts

* wyswietlenie
* stanu gry

result   equ *

* sprawdzenie, czy
* pobito rekord

 lda score
 cmp high
 lda score+1
 sbc high+1
 bcc no_high
 lda score
 sta high
 lda score+1
 sta high+1

no_high  equ *

* sprawdzenie, czy
* jest jeszcze paliwo

 ldx #255 
 lda fuel_cou
 ora fuel_cou+1
 beq out_fuel

 ldx death
 sed  
 lda fuel_cou
 sec
 sbc #$01
 sta fuel_cou
 lda fuel_cou+1
 scb #$00
 sta fuel_cou+1
 cld

out_fuel equ *

 stx death

 ldy #$04 
 lda score+1
 jsr shw_dig
 lda score
 jsr shw_dig

 ldy #14
 lda high+1
 jsr shw_dig
 lda high
 jsr shw_dig

 ldy #$24
 lda fuel_cou+1
 jsr shw_dig
 lda fuel_cou
 jsr shw_dig
 ldy #$34
 lda ammo_cou

* wyswietlenie
* liczby dwucyfrowej

shw_dig  equ *

 pha
 lsr @
 lsr @
 lsr @
 lsr @
 jsr shw_cph
 pla

* wyswietlenie cyfry

shw_cph  equ *

 and #$0f
 asl @
 clc
 adc #inf_zero
 jsr shw_info
 iny
 iny
 rts

* procedura obslugi
* dzwieku

sounds   equ *

 lda sound1
 beq no_1sou
 sta audcl
 clc
 adc #200
 sta audfl
 dec soundl
 bne no_1sou
 lda #0
 sta audcl
 sta audfl

no_1sou  equ *

 lda sound2
 beq no_2sou
 ora #%01000000
 sta audcl+2
 lda #10
 sta audfl+2
 dec sound2
 bne no_2sou
 lda #0
 sta audcl+2
 sta audfl+2

no_2sou  equ *

 lda sound3
 beq no_3sou
 clc
 adc #10
 sta audfl+4
 lda #230
 sta audcl+4
 lda sound3
 sec
 sbc #5
 sta sound3
 bne no_3sou
 sta audcl+4
 sta audfl+4

no_3sou  equ *

 rts

* wyciszenie dzwięku

silence  equ *

 ldy #7
 lda #0
 sta audfl,y
 dey
 bpl *-4
 rts

* zakonczenie gry

game_ovr equ *

 jsr silence

* efekt wybuchu

 ldy #l5

expl_1   equ *

 lda clock
 clc
 adc #2
 cmp clock
 bne *-2
 sty audcl
 tya
 clc
 adc #100
 sta audfl
 sty colpm0
 tya
 lsr @
 sta colpm0+1
 dey
 bpl expl_1
 jsr silence
 jmp gme_strt

sound3   dta b(0)
high     dta a(0)
    P.S. Do poprzednich odcinków wkradło się kilka błędów, a właściwie braków. Niestety z mojej winy. Serdecznie przepraszam i obiecuję poprawę. A oto errata:

W odcinku 1 w linii po komentarzu
* wyzerowanie zmiennych
i instrukcji
ldy #0
zabrakło instrukcji
tya

W odcinku 2 zabrakło na końcu programu instrukcji:
y_plr    dta b(0)
przesuw  dta b(0)
W odcinku 3 zabrakło na końcu programu instrukcji:
score    dta a(0)
sound1   dta b(0)
sound2   dta b(0)
lstr     dta b(0)

Dariusz "De JET" Żołna


    A oto gotowy program naszej gry w formacie Zgrywusa+. Zabawę można zacząć po połączeniu tego pliku z zestawem znaków, drukowanym w TA 3/93.
1000 REM *--------------------------*
1002 REM : HELI.OBJ                 :
1004 REM :  autor: Dariusz Zolna    :
1006 REM : (c) 1992 Tajemnice ATARI :
1008 REM *--------------------------*
1010 DATA ffff00a0b2a5208ca04c60a0a0
1020 DATA 0098998ba1c8c00e90f8a9048d
1030 DATA c002a9028dc102a9998d8da18d
1040 DATA 8ba1a9198d8ca1a9ff8dfc02a5
1050 DATA 14c514f0fca900854de6b9adfc
1060 DATA 02c91cd0034ceda020fca120a4
1070 DATA a22003a3205da3203aa420a5a4
1080 DATA 2026a5ad8ea1f0d04c8aa52044
1090 DATA a12054a120f3a2ad8402f0fba9
1100 DATA ff8dfc02adfc02c91cd0034ced
1110 DATA a0ad8402f007ad1fd0c906d0ea
1120 DATA 4c06a0200ea1a9c08d0ed4a903
1130 DATA 8d1dd0a004a9009908d08810fa
1140 DATA a9a88d07d4a9408d00d08d01d0
1150 DATA a9008d08d2a9038d0fd2207fa5
1160 DATA a000a92a2079a1c8c8c06090f5
1170 DATA a94085b8a000a5b82079a1c8c8
1180 DATA a9482079a1a5b818690285b898
1190 DATA 18690ea8c03290e460a514c514
1200 DATA f0fc200ea1a9408d0ed4a007a9
1210 DATA 009900d08810fa207fa5a9ff8d
1220 DATA fc0260a000a200bd99a185b0bd
1230 DATA 9aa185b1b1b048bd9ba191b068
1240 DATA 9d9ba1e8e8e8e02790e36048d8
1250 DATA ad0bd4290449041869b48d0ad4
1260 DATA 8d09d46840a0009848a9002082
1270 DATA a168a8c8c8d0f360a011981869
1280 DATA 4a9992a88810f6a0159818695c
1290 DATA 99b3a88810f6a00e9818697299
1300 DATA dca88810f6609900a809019901
1310 DATA a8609940a809019941a8600000
1320 DATA 0000000000000000000000002f
1330 DATA 023d3002c03102a10002300102
1340 DATA a1c40202c50204c6020ac70206
1350 DATA c80200c00204c102026f023170
1360 DATA 70f0d440a8d440a8d464a8d464
1370 DATA a8d488a8d488a8d4aca8d4aca8
1380 DATA d4d0a8d4d0a8d4f4a8d4f4a8d4
1390 DATA 18a9d418a9c400a8c400a8c420
1400 DATA a8c420a841c0a1ce97a1ad97a1
1410 DATA 8d04d430034c8ba2a9038d97a1
1420 DATA 8d04d4a94085b085b2a9a885b1
1430 DATA 85b3e6b2d002e6b3a206a000b1
1440 DATA b291b0c8c02390f7a90091b0a0
1450 DATA b0a924208ca2a0b2a924208ca2
1460 DATA ca10e0ad0ad2c932b03ea90885
1470 DATA b8ad0ad2c932b00829030a1869
1480 DATA 0285b8a96185b0a9a885b1ad0a
1490 DATA d22907aaca300aa0b0a924208c
1500 DATA a24c6ea2a000b1b0c8c811b0d0
1510 DATA 0688a5b84c9ca2601879000099
1520 DATA 0000a9007901009901006091b0
1530 DATA c8090191b060ac92a1a20fa900
1540 DATA 9920ac9920adc8ca10f6ac92a1
1550 DATA ad78022901d005c000f00188ad
1560 DATA 78022902d005c060b001c88c92
1570 DATA a1a5b929030a0a0a0aaaa90f85
1580 DATA b8bd10b59920acbd10b99920ad
1590 DATA c8e8c6b810ee60a000989900ab
1600 DATA 9900ac9900adc8d0f460ad8402
1610 DATA d04ead98a1f049ad8da1f044a9
1620 DATA 4385b0a9a885b1ad92a1186906
1630 DATA 4a4a4a4aaaca300aa0b0a92420
1640 DATA 8ca24c25a3a000b1b0c811b029
1650 DATA fec900d017a000a920209ca2f8
1660 DATA ad8da138e9018d8da1d8a9058d
1670 DATA 96a1ad84028d98a160a00084b7
1680 DATA b940a8c9089024c922b020a200
1690 DATA dd13a4f007e8e00d90f6b0128a
1700 DATA 0aaabd20a48d8aa3bd21a48d8b
1710 DATA a3209ba3a4b7c8c0fc90cc60a5
1720 DATA b92901f00160b940a81869024c
1730 DATA 82a1a9084c82a1a9002082a1c8
1740 DATA c898a206dd0ca4f026ca10f8b9
1750 DATA 40a8c902f022c904f01ec906f0
1760 DATA 1ac914f01638e908c90c900a88
1770 DATA a9202082a1c884b760a90120fa
1780 DATA a3a90f8d95a1a9144c82a1a5b9
1790 DATA 2901f00160a9004c82a1f8186d
1800 DATA 93a18d93a1a9006d94a18d94a1
1810 DATA d86022466a8eb2d6fa080a0c0e
1820 DATA 10121416181a1c1e209ba39ba3
1830 DATA 9ba39ba39ba3a4a394a394a394
1840 DATA a394a394a3eea3a9a3ad92a118
1850 DATA 69022049a4ad92a118690da245
1860 DATA 86b0a2a886b14a4a4a4aaaca30
1870 DATA 0aa0b0a924208ca24c56a4a000
1880 DATA b1b0c906f015c902f019c904f0
1890 DATA 2238e908c90eb005a9ff8d8ea1
1900 DATA 60a9998d8da14c9aa4a9998d8b
1910 DATA a1a9198d8ca14c9aa4a95020fa
1920 DATA a3a900209ca2a9648d8fa160ad
1930 DATA 93a1cd90a1ad94a1ed91a1900c
1940 DATA ad93a18d90a1ad94a18d91a1a2
1950 DATA ffad8ba10d8ca1f016ae8ea1f8
1960 DATA ad8ba138e9018d8ba1ad8ca1e9
1970 DATA 008d8ca1d88e8ea1a004ad94a1
1980 DATA 2011a5ad93a12011a5a014ad91
1990 DATA a12011a5ad90a12011a5a024ad
2000 DATA 8ca12011a5ad8ba12011a5a034
2010 DATA ad8da1484a4a4a4a201aa56829
2020 DATA 0f0a18692c2079a1c8c860ad95
2030 DATA a1f0168d01d21869c88d00d2ce
2040 DATA 95a1d008a9008d01d28d00d2ad
2050 DATA 96a1f01709408d03d2a90a8d02
2060 DATA d2ce96a1d008a9008d03d28d02
2070 DATA d2ad8fa1f01c18690a8d04d2a9
2080 DATA e68d05d2ad8fa138e9058d8fa1
2090 DATA d0068d05d28d04d260a007a900
2100 DATA 9900d28810fa60207fa5a00fa5
2110 DATA 14186902c514d0fc8c01d29818
2120 DATA 69648d00d28cc002984a8dc102
2130 DATA 8810e2207fa54c60a0e002e102
2140 DATA 00a0




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

Pixel 2002