PISZEMY DEMOW tym artykule dołączymy do naszego dema następną procedurę - "DLIV.ASM" oraz tekst do płynących napisów. Procedura "DLIV.ASM" obsługuje przerwanie Display List i jest jedną z najobszerniejszych procedur dema. Procedure Equ $9897 List_mem Equ %00000110 List_err Equ %00000101 Code_mem Equ %00010000 Code_dsk Equ %00100000 Chrctl Equ $D401 Colpf0 Equ $D016 Colpf1 Equ $D017 Colpf2 Equ $D018 Colpm0 Equ $D012 Colpm1 Equ $D013 Colpm2 Equ $D014 Colpm3 Equ $D015 Dliv Equ $0200 Dmactl Equ $D400 Hposp0 Equ $D000 Hposp1 Equ $D001 Hposp2 Equ $D002 Hposp3 Equ $D003 HScrol Equ $D404 Nmien Equ $D40E Sizep1 Equ $D009 Sizep3 Equ $D00B Wsync Equ $D40A BHScrol Equ $0088 HHScrol Equ $0089 OHScrol Equ $008A Opt List_err+Code_dsk Org Procedure Ldx <Przerw Ldy >Przerw Stx Dliv Sty Dliv+1 Lda #$C0 Sta Nmien Rts Przerw Pha Txa Pha Tya Pha Lda Licznik Asl @ Tax Lda Vect+$01,x Pha Lda Vect,x Pha Rts Koniec Inc Licznik Lda Licznik Cmp #$05 Bne L1 Lda #$00 Sta Licznik L1 Pla Tay Pla Tax Pla Rti Dliv_1 Lda #$3D Sta Dmactl Lda #$30 Sta Hposp0 Lda #$38 Sta Hposp1 Lda #$C0 Sta Hposp2 Lda #$C8 Sta Hposp3 Ldy #$00 Sty Sizep1 Sty Sizep3 Ldx #$06 L2 Sta Wsync Dex Bpl L2 Lda #$0C Sta Hscrol Ldx #$07 L3 Lda Tab_2,y Sta Colpm0 Sta Colpm1 Sta Colpm2 Sta Colpm3 Iny Sta Wsync Lda Tab_2,y Sta Colpm0 Sta Colpm1 Sta Colpm2 Sta Colpm3 Iny Sta Wsync Lda Tab_1,x Sta Colpf0 Dex Bpl L3 Lda #$06 Sta Chrctl Lda #$00 Sta Colpm0 Sta Colpm2 Sta Colpf1 Sta Wsync Sta Wsync Ldx #$0D Txa L4 Stx Hscrol Stx Wsync Dex Sec Sbc #$02 Bpl L4 Lda #$02 Sta Chrctl Inc Plr+$02 Lda Plr+$02 And #$03 Sta Plr+$02 Bne L8 Ldx #$00 L5 Lda Tab_2+1,x Sta Tab_2,x Inx Cpx #$10 Bne L5 Lda Plr+$01 Bne L6 Inc Plr Inc Plr Lda Plr And #$0E Cmp #$0E Bne L7 Inc Plr+$01 Jmp L7 L6 Dec Plr Dec Plr Lda Plr And #$0F Bne L7 Dec Plr+$01 Clc Lda Plr Adc #$10 Sta Plr L7 Lda Plr Sta Tab_2+$0F L8 Jmp Koniec Dliv_2 Lda HHScrol Sta HScrol Lda #$34 Sta Hposp0 Lda #$40 Sta Hposp1 Lda #$C4 Sta Hposp2 Lda #$A0 Sta Hposp3 Lda #$92 Sta Colpm1 Sta Colpm3 Lda #$03 Sta Sizep1 Sta Sizep3 Ldx #$06 L9 Lda Tab_3,x Sta Colpf2 Lda Tab_1,x Ora #$10 Sta Colpm0 Sta Colpm2 Sta Wsync Dex Bpl L9 Jmp Koniec Dliv_3 Lda #$F2 Sta Colpf0 Lda #$36 Sta Colpf1 Lda #$3C Sta Colpf2 Lda OHScrol Sta HScrol Jmp Koniec Dliv_4 Lda HHScrol Sta HScrol Ldx #$00 Stx Colpf1 L10 Lda Tab_3,x Sta Colpf2 Lda Tab_1,x Ora #$10 Sta Colpm0 Sta Colpm2 Sta Wsync Inx Cpx #$08 Bne L10 Lda #$00 Sta Colpm0 Sta Colpm2 Jmp Koniec Dliv_5 Sta Wsync Lda BHScrol Sta HScrol Lda #$B4 Sta Colpf0 Lda #$B8 Sta Colpf1 Lda #$BC Sta Colpf2 Lda #$3F Sta Dmactl Lda #$A0 Sta Hposp1 Lda #$0F Sta Colpm1 Jmp Koniec Licznik Dta B($00) Plr Dta B($10),B($00),B($00) Vect Dta A(Dliv_1-$01) Dta A(Dliv_2-$01) Dta A(Dliv_3-$01) Dta A(Dliv_4-$01) Dta A(Dliv_5-$01) Tab_1 Dta B($4E),B($4C),B($4A) Dta B($48),B($46),B($44) Dta B($42),B($40) Tab_2 Dta B($00),B($02),B($04) Dta B($06),B($08),B($0A) Dta B($0C),B($0E),B($0E) Dta B($0C),B($0A),B($08) Dta B($06),B($04),B($02) Dta B($00) Tab_3 Dta B($54),B($96),B($98) Dta B($98),B($98),B($98) Dta B($96),B($94) End of fileW procedurze wykorzystywane są trzy zmienne: BHScrol, HHscrol i OHscroll. Każda z nich przechowuje wartość dla HScrol'a. BHScrol odpowiada za stan Hscrol'a największego płynącego napisu na dole ekranu. HHScrol pełni tę samą rolę dla dwóch napisów umieszczonych nad i pod obrazkiem. Natomiast OHScrol odpowiedzialny jest za pozycję poruszającego się obrazka. Wszystkie te zmienne umieszczone są w obszarze od $88 do $8A. Jest to obszar wykorzystywany przez QA. Mimo tego procedurę da się uruchomić spod asemblera. Niestety większość następnych procedur będzie możliwe do uruchomienia tylko po skompilowaniu ich na dysk. Aby można było zobaczyć efekt działania procedury, konieczne jest uprzednie uruchomienie procedury zamieszczonej w poprzednim artykule - "DLI.ASM". Procedura zaczyna się uaktywnieniem przerwania Dliv - ustawia wektor ($200) na etykietę Przerw. Ponieważ przerwanie Display List wywoływane jest kilkakrotnie na jednym ekranie i za każdym razem pełni inną funkcję, dlatego też główną częścią procedury przerwania jest wybór odpowiedniej podprocedury. Realizowane jest to przy pomocy licznika Licznik i tablicy skoków Vect. Przy każdym wywołaniu przerwania Licznik jest zwiększany, następnie według niego zostaje wybrany adres z tablicy do kolejnej podprocedury i podprocedura ta jest uruchamiana. Pierwsza uruchamiana podprocedura Dliv_1 ustawia odpowiednią szerokość ekranu i poziome pozycje dla obracających się znaczków Atari. Następnie opuszczane jest siedem linii ekranu i w kolejnej pętli z tablicy Tab_2 pobierane są wartości kolorów dla player'ów i z tablicy Tab_1 wartości kolorów dla napisu 'Tajemnice Atari". Druga linia z napisem 'Tajemnice Atari" jest lustrem poprzedniej, czyli musi być obrócona "do góry nogami". Realizowane jest to przy pomocy rejestru sprzętowego Chrctl ($D401) kontrolującego wygląd znaków, po czym zerowane są wartości kolorów dla player'ów oraz wykonywana jest pętla ustalająca kolory i pozycję drugiej linii napisu. Po wykonaniu tych czynności przywracany jest poprzedni stan rejestru Chrctl. Dalsza część podprocedury Dliv_1 przygotowuje tablicę kolorów player'ów Tab_2 przy pomocy trzybajtowej tablicy Plr. Jest to wykonywane co czwarty obieg przerwania (licznikiem jest ostatni bajt tablicy Plr). W takim wypadku przepisywana jest tablica Tab_2, a ostatni jej bajt określany jest na podstawie pierwszego bajtu tablicy Pjr. Natomiast drugi bajt tej tablicy kontroluje zwiększanie lub zmniejszanie pierwszego bajtu. Kolejna podprocedura - Dliv_2 ustawia HScrol'a dla płynącego napisu oraz zmienia stan kolorów i pozycji player'ów. Ostatnią czynnością tej procedury jest ustalenie kolorów pionowych scroll'i i poziomego płynącego napisu. Czynności te wykonywane są w pętli. Podprocedura Dliv_3 ustawia wartości dla kolorów i HScrol'a obrazka. Dliv_4 pełni podobną rolę jak podprocedura Dliv_2: ustala wartości kolorów dla poziomego płynącego napisu i napisów pionowych. Ostatnia podprocedura - Dliv_5 rozszerza ekran, ustawia wartości kolorów dla dużego płynącego napisu oraz pozycję i kolor jednego player'a, który będzie wykorzystywany jako wskaźnik głośności kanałów dźwiękowych. Każda podprocedura kończy się skokiem do etykiety Koniec, gdzie jest zwiększany Licznik. Poniżej zamieszczony został tekst do płynących napisów w formacie "Zgrywusa+". Dane należy przepisać, dołączyć "Zgrywusa+" i zapisać w formacie plikowym. Plik posiada własny nagłówek Dos'a i będzie ładowany pod adres $6E00. Jeśli Czytelnik nie ma ochoty wpisywać tego tekstu, a umie napisać własny pod dowolnym monitorem, to przydatna będzie informacja, że: Ponieważ zamieściliśmy już tekst do płynących napisów, dlatego też w następnym artykule zajmiemy się procedurami przesuwu. 1000 REM *--------------------------* 1001 REM * Piszemy demo 10 * 1002 REM * autorzy: Tomasz Bielak * 1003 REM * Rafal Bielecki * 1004 REM * (c) 1993 Tajemnice ATARI * 1005 REM *--------------------------* 1010 DATA ffff006eff7300000000002175 1020 DATA 746f727a790064656d6f6e7374 1030 DATA 7261636a6900706f7a64726177 1040 DATA 69616a41000000002136212c2f 1050 DATA 2e003425212d00000022292700 1060 DATA 262f2f3407610000002a212b35 1070 DATA 222100283533212b2100000034 1080 DATA 2f2d21333a21002c2925222923 1090 DATA 28210000002d21272e35332100 1100 DATA 6900696e6e796368007a003726 1110 DATA 2d280000002d29322127250033 1120 DATA 2f2634372132250000002f3532 1130 DATA 00152f26340000003021332b35 1140 DATA 242100000033232f3230292f00 1150 DATA 332f2634372132250000002d29 1160 DATA 2328212c210037292425322500 1170 DATA 00006f72617a007a616772616e 1180 DATA 69637a6e650067727570790070 1190 DATA 726f6772616d6973744f770000 1200 DATA 00213421322900222934002239 1210 DATA 342532003533253200232c3522 1220 DATA 0000002725322d212e00232821 1230 DATA 2f342923330000002829272800 1240 DATA 34252328003425212d0000002c 1250 DATA 2f3224002f26002421322b2e25 1260 DATA 33330000003025342532210033 1270 DATA 2122213428210000003a253030 1280 DATA 252c292e0027212d2533000000 1290 DATA 00337065636a616c6e6500706f 1300 DATA 7a64726f7769656e6961007072 1310 DATA 7a6573794c616d7900646c6100 1320 DATA 6e61737a796368006b6f6c6567 1330 DATA 4f77000000223a29212b210000 1340 DATA 00242f2d252c210000002d2132 1350 DATA 29212e21000000322f34210000 1360 DATA 0037352a210000006900696e6e 1370 DATA 7963680c006f006b744f727963 1380 DATA 68007a61706f6d6e69656c6953 1390 DATA 6d79000e0e0e00000000000000 1400 DATA 00000000000000000000008080 1410 DATA 80808080808080808080808080 1420 DATA 80808080808080808080808080 1430 DATA 80808080a4e5edefeef3f4f2e1 1440 DATA e3eac580fae1f0f2efe7f2e1ed 1450 DATA eff7e1ece99a80b4efede1f3fa 1460 DATA 80a2e9e5ece1eb80e980b2e1e6 1470 DATA e1cc80a2e9e5ece5e3ebe98e80 1480 DATA 80afe2f2e1fae5eb80f0efede9 1490 DATA c5e4faf980f3e3f2efecec87e1 1500 DATA ede980faeff3f4e1cc80eee1f2 1510 DATA f9f3eff7e1eef980f0f2faf980 1520 DATA f0efedefe3f980f0f2efe7f2e1 1530 DATA edf580e7f2e1e6e9e3faeee5e7 1540 DATA ef80a2ece1fae9eee780b0e1e4 1550 DATA e4ece5f380f0f2fae5fa80b2e1 1560 DATA e6e1cce180a2e9e5ece5e3ebe9 1570 DATA e5e7ef8e8080a4e1eee580e4ef 1580 DATA 80edf5faf9ebe980faeff3f4e1 1590 DATA ccf980f0f2fae5eee9e5f3e9ef 1600 DATA eee580fa80ebefedf0f5f4e5f2 1610 DATA e180a9a2ad80eee180a1b4a1b2 1620 DATA a980e4ef80f0f2efe7f2e1edf5 1630 DATA 80edf5faf9e3faeee5e7ef80a6 1640 DATA f5f4f5f2e580a3efedf0eff3e5 1650 DATA f280f0f2fae5fa80b4efede1f3 1660 DATA fae180a2e9e5ece1ebe18e80aa 1670 DATA e5f3f480f4ef80e4eff3f9c380 1680 DATA faeee1eef980f0eff3e9e1e4e1 1690 DATA e3faefed80a1ada9a780e980a9 1700 DATA a2ad87cff780f5f4f7cff280f0 1710 DATA efe480eee1faf7c18087a3f2e5 1720 DATA edefeee1878e8080a4e5edefee 1730 DATA f3f4f2e1e3eae180faeff3f4e1 1740 DATA cce180eee1f0e9f3e1eee180f7 1750 DATA 80e1f3e5ede2ece5f2fae58096 1760 DATA 95909280f0f2faf980f0efedef 1770 DATA e3f980b1a18e80808080808080 1780 DATA 80808080808080808080808080 1790 DATA 80808080808080808080808080 1800 DATA 80808000000014007369657270 1810 DATA 6e6961001119191200726f6b75 1820 DATA 007a616b6f4e637a796c69536d 1830 DATA 79007072616365006e6164006e 1840 DATA 61737a410064656d6f6e737472 1850 DATA 61636a410e0034790c00777974 1860 DATA 7277614c7900237a7974656c6e 1870 DATA 696b75000870727a656b6c6570 1880 DATA 797761637a75090c00646f7069 1890 DATA 65726f00746572617a0c006a61 1900 DATA 6b6f006a6564656e007a006e69 1910 DATA 657769656c7500646f74727761 1920 DATA 4c655300646f0075707261676e 1930 DATA 696f6e65676f0c007a61724f77 1940 DATA 6e6f0070727a657a006e617300 1950 DATA 6a616b00690070727a657a0023 1960 DATA 6965626965006b6f4e63610e0e 1970 DATA 0e00370064774f636800706f77 1980 DATA 795a737a7963680c00706f7a69 1990 DATA 6f6d796368007363726f6c6c07 2000 DATA 616368007a6e616a647a696573 2010 DATA 7a006b724f746b4100696e666f 2020 DATA 726d61636a4500646f7479637a 2030 DATA 416341006e61737a656a006465 2040 DATA 6d6f6e73747261636a690e002a 2050 DATA 655a656c69007a6e75647a6900 2060 DATA 23694500746100637a45534300 2070 DATA 64656d61006d6f5a65737a006e 2080 DATA 616369736e4143003328292634 2090 DATA 006162790070727a656a534300 2100 DATA 646f006e61737445706e656a00 2110 DATA 69007a6172617a656d006f7374 2120 DATA 61746e69656a00637a45536369 2130 DATA 0e003a616e696d00746f006a65 2140 DATA 646e616b0075637a796e69737a 2150 DATA 00706f637a656b616a006a6573 2160 DATA 7a637a6500636877696c450069 2170 DATA 0070727a65637a7974616a0074 2180 DATA 656e0074656b737400646f006b 2190 DATA 6f4e63610e000000 Tomasz Bielak
Rafał Bielecki |