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.Krok drugi.Krok trzeci.Krok czwarty.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 endP.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
|