1

Witam,
Czy kto moglby pokazać mi 3 przykladowe, poprawnie napisane procedurki w asm, ktore robią co następuje:

- zainicjowanie ekranu w trybie 9 (OS)
- zainicjowanie ekranu w trybie 15 (OS)
- wstawienie procedury użytkownika do przerwania synchoronizacji pionowej (ramki)

Do dwoch pierwszych probowalem uzyc procedur systemowych ale nie chce mi dzialac :/
A co do przerwan to Zientara opisuje, ze trzeba uzyc specjalnej procedury systemowej do zmiany wektorow przerwan. A w programach, ktore probowalem analizowac wogole tego nie ma.
Dzieki.

2 Ostatnio edytowany przez Lizard (2006-07-18 13:19:01)

iccmd   =   $0342
icbufa  =   $0344
icax1   =   $034a
icax2   =   $034b
jciomain =  $e456

gr9     lda #9
        bne gr

gr15    lda #15

gr      ldx #$60
        sta icax2,x     ; tryb
        lda #$03        ; otworz
        sta iccmd,x
        lda #<dev       ; co?
        sta icbufa,x
        lda #>dev
        sta icbufa+1,x
        lda #%00011100  ; bez okna tekstowego, odczyt/zapis
        sta icax1,x
        jmp jciomain

dev     .by "S:" $9b
;       ldy #<vbli
;       ldx #>vbli
;       jsr setvbli

;       ldy #<vbld
;       ldx #>vbld
;       jsr setvbld

jsetvblv =  $e45c

setvbli lda #$06
        bne setvbl
setvbld lda #$07
setvbl  jmp jsetvblv
Zawsze mam rację, tylko nikt mnie nie słucha.

3

Dzieki Lizard. Zadzialalo jak dalem "jsr jciomain" zamiast "jmp jciomain" :)
ALE nie do konca dobrze.

Jest wyswietlane tylko pol obrazu w gr9! Znaczy gorne pol. Dolne jest smoliscie czarne, choc w pamieci siedza odpowiednie dane :/

Zerknij prosze jeszcze raz i powiedz prosze co moze byc przyczyna. Ja nie moge dojsc :(

4

Hm? Błędu to ja tu nie widzę. Zresztą ciężko byłoby takowy popełnić samymi rozkazami LDA; STA. ;) Zobacz pod Basiciem, czy OPEN #6,4,28,9,"S:" da ten sam efekt (czyli pół ekrannu).

Jak zmienisz na JSR JCIOMAIN, to funkcja ta wróci do ciągu "S:", a tego racej byś nie chciał. JMP zapewnia powrót do rozkazu za JSR GR9/15, gdzieś tam w Twoim kodzie.

Zapomniałem poprzednio napisać, że powyższe GRAPHICS otwiera na potrzeby ekranu kanał 6 (jak ma to w zwyczaju czynić Basic).

Nawiązując jeszcze do ustawiania wektorów przerwań. SETVBLI ustawia wektor dla pierwszej fazy (natyczmiastowej), a SETVBLD - drugiej (opóźnionej). Różnica polega na tym, że ta pierwsza wykonywana jest zawsze, a druga uzależniona od flagi CRITIC ($42 - OIDP) i znacznika I procesora. Jeśli cokolwiek z tego jest różne od zera, to druga faza VBL jest pomijana.

Zmieniając wektory procedur przerwań dobrym zwyczajem jest zapamiętywane starych wartości i odtworzenie ich na koniec programu tą samą metodą.

Zawsze mam rację, tylko nikt mnie nie słucha.

5 Ostatnio edytowany przez nosty (2006-07-21 12:55:00)

Zwracam honor, ale dalej nie wiem co robie zle :/

Jsr/jmp zrozumialem (po prostu u mnie dane sa na koncu a po linii jsr mialem dalszy ciag programu).

Open z basica dziala (tylko nie tak jak Ty podales a OPEN #6,28,9,"S:"). Jak to zrobie na emulcu a potem wejde F8 do monitora i wczytam do pamieci ekranu dane graficzne z przygotowanego pliku (read plik 8150 1e00) to widze caly obrazek.

Jak wykonam Twoja procedure asm otwierajaca tryb 9 i tu sie zatrzymam to po wykonaniu akcji w monitorze jak wyzej widze caly obrazek. Jest git.

Ale ja probuje w moim programie zrobic cos innego...
W xasm laduje do obszaru pamieci $4000 obrazek ($1e00 bajtow):
org $4000                   
    ins 'obrazek.ats'

Nastepnie otwieram tryb 9 (Twoja procedura)
Potem zmieniam w display list dwa bajty okreslajace pamiec obrazu na $00,$40.
Koniec (petla w miejscu bez konca)
I w tym momencie wyswietla mi sie gorne pol obrazka :/

Aha, obrazek siedzi na miejscu. Jak wpisze do DLa adres ekranu $5000 to widze dolna polowe obrazka w gornej czesci ekranu. Czyli dane w pamieci nie gina.

6

dl dla Twojego trybu ma gdzies przeladowanie (ustawiony bit LMS)

http://atari.pl/hsc/ad.php?i=1.

7

Wszystko się zgadza. Licznik danych obrazu przekręca tylko 12 młodszych bitów (4 KB), więc jeśli ekran zajmuje więcej, to w DL potrzebny jest drugi LMS. Użyj komendy "dlist" w monitorze, to zobaczysz, gdzie masz wpisać adres dolnej połówki. Uwaga: OS konstruuje Display Listę dzielącą obrazek na pół (po $f00 bajtów), więc wczytaj obrazek pod $4100 a wtedy dolna połówka będzie od $5000.

https://www.youtube.com/watch?v=jofNR_WkoCE

8

Yes! Yes! Yes!
Dzieki. Zadzialalo, teraz to juz z gorki :)
Fak, kiedys znalem budowe DL a teraz wszystko zapomnialem :/