Piszemy DEMODo końca cyklu redagowanego przez nas zostały już tylko dwa odcinki. W dzisiejszym zamieścimy wszystkie procedury potrzebne do uruchomienia drugiej części demonstracji: PLAYER2.ASM, SKOCZEK.ASM, DLI2.ASM i BARY.ASM. Pierwsza z nich przygotowuje grafikę PMG: Procedure Equ $9FD5 List_mem Equ %00000110 List_err Equ %00000101 Code_mem Equ %00010000 Code_dsk Equ %00100000 Colpm1s Equ $02C1 Hposp1 Equ $D001 Pomoc Equ $0080 Start_pl Equ $9000 Opt List_err+Code_dsk Org Procedure Ldx <Start_pl Ldy >Start_pl Stx Pomoc Sty Pomoc+$01 Ldy #$00 Tya L1 Sta (Pomoc),y Iny Bne L1 Inc Pomoc+$01 Ldx Pomoc+$01 Cpx #$98 Bne L1 Ldx #$A0 Ldy #$0F Stx Hposp1 Sty Colpm1s Rts End of fileProcedura czyści obszar pamięci PMG (od etykiety Start_pl) oraz ustawia kolor i pozycję pierwszego z graczy. Tego gracza będzie obsługiwała procedura WSKAZNIK.ASM, zamieszczona w poprzednim artykule. Druga z procedur, SKOCZEK.ASM, w odróżnieniu od PLAYER2.ASM będzie wykonywana co 1/50 sekundy, a jej zadaniem jest ruch pionowy obrazka z pierwszej części demonstracji. Procedure Equ $A10C List_mem Equ %00000110 List_err Equ %00000101 Code_mem Equ %00010000 Code_dsk Equ %00100000 Dlptrs Equ $0230 Pomoc Equ $008A Opt List_err+Code_dsk Org Procedure Jmp Init_proc Int_proc Inc Pomoc Ldy Pomoc Cpy #$4C Bne L1 Ldy #$00 Sty Pomoc L1 Lda Tablica,y Sta Dlptrs Rts Init_proc Ldx #$26 Ldy #$00 L2 Lda Tablica,x Sta Tablica+$26,y Iny Dex Bne L2 Rts Tablica Dta B($92),B($92),B($91) Dta B($91),B($90),B($90) Dta B($8F),B($8E),B($8D) Dta B($8B),B($89),B($87) Dta B($85),B($83),B($81) Dta B($7E),B($7B),B($77) Dta B($73),B($6F),B($6B) Dta B($67),B($63),B($5E) Dta B($59),B($54),B($4F) Dta B($49),B($43),B($3C) Dta B($36),B($30),B($29) Dta B($22),B($1A),B($12) Dta B($0B),B($00) End of FileWywołanie procedury spowoduje powielenie wartości z tablicy Tablica w odwrotnej kolejności (etykieta Init_proc). Procedura wywoływana jest co 1/50 sekundy od etykiety Int_proc, gdzie z tablicy Tablica pobierana jest kolejna wartość i wpisywana do rejestru Dlptrs. Żeby uzyskać pożądany efekt konieczne jest skonstruowanie odpowiedniej Display List, co robi procedura następna (DLI2.ASM): Procedure Equ $A000 List_mem Equ %00000110 List_err Equ %00000101 Code_mem Equ %00010000 Code_dsk Equ %00100000 Colpf0s Equ $02C4 Colpf1s Equ $02C5 Colpf2s Equ $02C6 Dlptrs Equ $0230 Dmactls Equ $022F Ekran Equ $6600 Obrazek Equ $8000 Pomoc Equ $0080 Opt List_err+Code_dsk Org Procedure Jmp Init_Dl Org Procedure+$92 Dlist Dta B($70),B($70) Dta B($4E) Dta A(0brazek+$02) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($0E),B($0E),B($0E) Dta B($41),A(Dlist) Init_Dl Ldx #$00 Txa L1 Sta Procedure,x Inx Cpx #$92 Bne L1 Lda #$3E Ldx <Procedure Ldy >Procedure Sta Dmactls Stx Dlptrs Sty Dlptrs+$01 Ldx #$62 Ldy #$86 Lda #$9C Stx Colpf0s Sty Cocpf1s Sta Colpf2s Rts End of fileWłaściwy program dla ANTIC'a rozpoczyna się od etykiety Dlist, czyli $92 bajty od początku procedury (dyrektywa Org Procedure+$92). Program (etykieta Init_Dl) zeruje powstałą "dziurę". Jak pamiętamy, każde $00 w programie ANTIC'a tworzy jedną pustą linię na ekranie. Zmieniając wartość Dlptrs zmieniamy ilość pustych linii przed obrazkiem, co powoduje ruch obrazka w pionie. Po wyzerowaniu fragmentu Display List procedura DLI2.ASM ustawia wektor Dlptrs, wpisuje odpowiednie wartości do Dmactls i rejestrów kolorów. Ostatnia procedura drugiej części demonstracji to BARY.ASM. Procedura ta wyświetla na ekranie poruszające się, różnokolorowe linie ekranu zwane potocznie "barami": Procedure Equ $A17D List_mem Equ %00000110 List_err Equ %00000101 Code_mem Equ %00010000 Code_dsk Equ %00100000 Colbak Equ $D01A Skstat Equ $D20F Vcount Equ $D40B Wsync Equ $D40A Tab_rur Equ $6D00 Opt List_err+Code_dsk Org Procedure Jsr Przepisz L1 Jsr Czysc_tab Jsr Wstaw_rury Jsr Pokaz_rury Lda Skstat And #$08 Bne L1 Rts Przepisz Ldx #$3F Ldy #$00 L2 Lda Pozycje,x Sta Pozycje+$40,y Iny Dex Bpl L2 Rts Czysc_tab Lda #$00 Tax L3 Sta Tab_rur,x Inx Cpx #$DF Bne L3 Rts Wstaw_rury Ldx #$00 L4 Txa Pha Ldy Poz_rur,x Lda Pozycje,y Tay Inc Poz_rur,x Lda Poz_rur,x And #$7F Sta Poz_rur,x Lda Tab_Kolorow,x Tax Lda #$0D Sta Count L5 Sta Kolory,x Sta Tab_rur,y Inx Iny Dec Count Lda Count Bne L5 Pla Tax Inx Cpx #$05 Bne L4 Rts Pokaz_rury Lda Vcount Cmp #$08 Bne Pokaz_rury Ldy #$00 L6 Lda Tab_rur,y Sta Wsync Sta Colbak Iny Cpy #$DF Bne L6 Rts Tab_kolorow Dta B($00),B($0D),B($1A) Dta B($27),B($34) Poz_rur Dta B($00),B($05),B($0A) Dta B($0F),B($14) Count Dta B($00) Kolory Dta B($F2),B($F4),B($F6) Dta B($F8),B($FA),B($FC) Dta B($FE),B($FC),B($FA) Dta B($F8),B($F6),B($F4) Dta B(F2) Dta B($92),B($94),B($96) Dta B($98),B($9A),B($9C) Dta B($9E),B($9C),B($9A) Dta B($98),B($96),B($94) Dta B($92) Dta B($32),B($34),B($36) Dta B($38),B($3A),B($3C) Dta B($3E),B($3C),B($3A) Dta B($38),B($36),B($34) Dta B($32) Dta B($C2),B($C4),B($C6) Dta B($C8),B($CA),B($CC) Dta B($CE),B($CC),B($CA) Dta B($C8),B($C6),B($C4) Dta B($C2) Dta B($02),B($04),B($06) Dta B($08),B($0A),B($0C) Dta B($0E),B($0C),B($0A) Dta B($08),B($06),B($04) Dta B($02) Pozycje Dta B($01),B($01),B($02) Dta B($03),B($04),B($05) Dta B($06),B($08),B($0A) Dta B($0C),B($0E),B($11) Dta B($14),B($17),B($1A) Dta B($1D),B($21),B($25) Dta B($29),B($2D),B($31) Dta B($35),B($3A),B($3E) Dta B($43),B($48),B($4D) Dta B($51),B($56),B($5B) Dta B($60),B($65),B($6B) Dta B($70),B($75),B($7A) Dta B($7F),B($83),B($88) Dta B($8D),B($92),B($96) Dta B($9B),B($9F),B($A3) Dta B($A7),B($AB),B($AF) Dta B($B3),B($B6),B($B9) Dta B($BC),B($BF),B($C2) Dta B($C4),B($C6),B($C8) Dta B($CA),B($CB),B($CC) Dta B($CD),B($CE)B($CF) Dta B($CF) End of fileGłówny program składa się z wywołania kilku podprocedur, dopóki nie zostanie naciśnięty klawisz SHIFT. Jeden raz wywoływana jest podprocedura Przepisz, która powiela tablicę pozycji "barów" w odwrotnej kolejności. "Bary" tworzone są w tablicy Tab_rur. W tablicy tej każdy bajt odpowiada za kolor odpowiedniej linii ekranu. Kolejna podprocedura Czysc_tab zeruje tę tablicę, natomiast Wstaw_rury przepisuje odpowiednie wartości do tej tablicy. Podprocedura Wstaw_rury korzysta z dodatkowych tablic: Kolory - tu zamieszczone są wartości kolorów dla poszczególnych "barów". Każdy "bar" zajmuje 13 linii ekranu, czyli zawiera się w 13 bajtach. Każdy blok 13 bajtów w tablicy Kolory określa wygląd jednego z "barów". Pobieranie danych z tej tablicy jest proste dzięki dodatkowej tablicy Tab_kolorów, która określa, z którego miejsca tablicy Kolory pobierać dane dla kolejnych "barów". Tablica Poz_rur zawiera początkowe pozycje "barów", czyli określa, w które miejsce tablicy Tab_rur przepisywane będą kolejne "bary". Tablica ta modyfikowana jest po każdorazowym utworzeniu "barów". Dodatkowy bajt Count służy jako licznik do przepisywania 13 bajów koloru "bara" (etykieta L5). Ostatnia podprocedura Pokaz_rury tablicę Tab_rur do rejestru Colbak, czyli tworzy "bary" na ekranie. Na zakończenie oglądnijmy efekt działania powyższych procedur. Do uruchomienia drugiej części potrzebne będą następujące zbiory z poprzedniego odcinka: CZYSC.OBJ (czyści pamięć), MUZYKA.OBJ i OBRAZEK.DAT. Oprócz tego zbiór PLAYER.OBJ inicjujący grafikę PMG oraz procedury dzisiejsze: WSKAZNIK.OBJ, PLAYER2.0BJ, DLI2.0BJ, SKOCZEK.OBJ i procedura uruchamiająca RUN.OBJ: Procedure Equ $0600 List_mem Equ %00000110 List_err Equ %00000101 Code_mem Equ %00010000 Code_dsk Equ %00100000 Nmien Equ $D40E Sizep1 Equ $D009 Skctl Equ $D20F Vvblk Equ $0222 Bary Equ $A17D Dli2 Equ $A000 Music Equ $7400 Player Equ $9B5B Play_2 Equ $9FD5 Reset Equ $E474 Skoczek Equ $A10C Wskaznik Equ $9F95 Opt List_err+Code_dsk Org Procedure RUN Ldx Vvblk Ldy Vvblk+$01 Stx Koniec+$01 Sty Koniec+$02 Lda #$03 Sta Skctl Ldx <Przerw Ldy >Przerw Lda #$C0 Stx Vvblk Sty Vvblk+$01 Sta Nmien Jsr Dli2 Jsr Player Jsr Play_2 Lda #$03 Sta Sizepl Jsr Skoczek Jsr Bary Jmp Reset Przerw Jsr Music+$01 Jsr Wskaznik Jsr Skoczek+$03 Koniec Jmp Koniec Org $02E0 Dta A($0600) End of FileZamieszczamy również nieco zmieniony program w Basic'u z poprzedniego odcinka cyklu, który pozwoli na stworzenie samodzielnie działającego zbioru DEMO.COM. 10 REM 20 REM PROGRAM LACZACY ZBIORY 30 REM 40 COM NAZWA$(14) 50 OPEN #l,8,0,"D:DEMO.COM" 60 FOR L=0 TO 40:READ D 70 POKE 1536+L,D:NEXT L 80 FOR L=0 TO 9:READ NAZWA$;? NAZWA$ 90 OPEN #2,4,0,NAZWA$ 100 D=USR(1536,32,7,14000) 110 X=USR(1536,16,11,D) 120 CLOSE #2:NEXT L:CLOSE #1:END 897 REM 898 REM PROGRAM MASZYNOWY 899 REM 900 DATA 104,104,104,170,104,104,157 910 DATA 66,3,104,157,73,3,104,157 920 DATA 72,3,169,0,157,68,3,169,100 930 DATA 157,69,3,32,86,228,189,72,3 940 DATA 133,212,189,73,3,133,213,96 997 REM 998 REM NAZWY ZBIOROW 999 REM 1000 DATA D:CZYSC.OBJ 1010 DATA D:MUZYKA.OBJ 1020 DATA D:PLAYER.OBJ 1030 DATA D:WSKAZNIK.OBJ 1040 DATA D:PLAYER2.0BJ 1050 DATA D:DLI2.0BJ 1060 DATA D:SKOCZEK.OBJ 1070 DATA D:BARY.OBJ 1080 DATA D:OBRAZEK.DAT 1090 DATA D:RUN.OBJ Tomasz Bielak
Rafał Bielecki |