Skleroza mnie boli a więc wiele podpowiedzi mi będzie potrzebne, aby napisać ponownie coś po ponad 20 latach.

Szukasz drobnej pomocy przy kodowaniu, albo chcesz przedstawić światu swoją gotową lub w trakcie realizacji produkcję? To właściwy dział.
Wiadomość
Autor
AJOT
Posty: 15
Rejestracja: 27 mar 2019, 19:55
Grupa: Sentinel
Kontakt:

Skleroza mnie boli a więc wiele podpowiedzi mi będzie potrzebne, aby napisać ponownie coś po ponad 20 latach.

#1 Post autor: AJOT »

A więc jak w tytule, prace idą opornie, ale cały czas coś tam kombinuję, aktualnie mam taki oto wyciąg z kodu:

Kod: Zaznacz cały

        jsr $1000

		sei

		lda #<irq_01
		sta $0314
		lda #>irq_01
		sta $0315
		
		lda #$0
		sta $dc0d
		
		ldy #$0
		sty $dc0e
		iny
		sty $d01a
		
		lda $d011
		and #$7f
		sta $d011
		lda #$fa
		sta $d012


		cli

Kod: Zaznacz cały

irq_01:
		ldx $d020
		ldy $d021
		lda $d011
		pha 
		and #%11110111
		sta $d011
		stx $d021
		
		tya 
		pha 
		
		dec $d020
		jsr $1003	
		inc $d020	

		pla 
		tay 
		pla 
		sta $d011
		tya 
		pha 
		

		
irq_01b:		
		lda $d011
		and #$80
		cmp #$0
		bne irq_01b
				
		pla 
		ldx #$32
irq_01a:
		cpx $d012
		bne irq_01a
		
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		
		sta $d021
		
		dec $d019
		lda $dc0d
		pla
		tay
		pla
		tax
		pla
		rti
Podsumowując $1000 i $1003 to odwołanie do muzyki tworzonej w DMC, problem w tym, że wywołując przerwanie raz program ruszy bez problemu a za drugim razem mi się wiesza. Patrzyłem po moim starym kodzie (który tworzyłem ponad 20 lat temu -a więc i też stąd ta skleroza) i nie wiem w czym problem.
Przerwanie powinno być złapane w momencie otwarcia ramki dolnej (a tym samym górnej), zamiana otwartej ramki na kolor ramki, puszczenie nuty muzycznej, odczekaniu do zejścia ramki górnej i włączenia koloru tła.

Awatar użytkownika
wackee
Posty: 1609
Rejestracja: 05 paź 2008, 23:05
Grupa: Arise
Kontakt:

Re: Skleroza mnie boli a więc wiele podpowiedzi mi będzie potrzebne, aby napisać ponownie coś po ponad 20 latach.

#2 Post autor: wackee »

A co masz po CLI? Wstaw tam jmp * chociaż. Dla mnie to dlatego się wywala, że po włączeniu przerwań lądujesz w BRK.
Arise - keeping your eyes wide open since 1991.

Awatar użytkownika
juntek
Posty: 237
Rejestracja: 23 wrz 2018, 20:17

Re: Skleroza mnie boli a więc wiele podpowiedzi mi będzie potrzebne, aby napisać ponownie coś po ponad 20 latach.

#3 Post autor: juntek »

W kodzie obsługi przerwania masz błąd polegający na tym, że na początku nie zachowujesz na stosie wartości rejestrów A, X, Y ale na koniec je ze stosu zdejmujesz (sekwencja: pla, tay, pla, tax, pla). Żeby się zgadzało to wchodząc do procedury powinieneś dać: pha, txa, pha, tya, pha

W rezultacie na koniec procedury obsługi przerwania wskaźnik stosu masz 3 bajty niżej niż podczas wejścia do procedury przerwania. Procesor nie jest więc w stanie poprawnie odtworzyć wartości rejestrów PC i SP które zapisał sobie na stosie tuż przed przekazaniem sterowania do procedury obsługi przerwania i dlatego kod wylatuje w powietrze.
Dodatkowo z przerwania wychodzisz z innymi wartościami rejestrów A,X,Y niż miałeś na wejściu, a powinny być takie same.
READY.

AJOT
Posty: 15
Rejestracja: 27 mar 2019, 19:55
Grupa: Sentinel
Kontakt:

Re: Skleroza mnie boli a więc wiele podpowiedzi mi będzie potrzebne, aby napisać ponownie coś po ponad 20 latach.

#4 Post autor: AJOT »

wackee pisze:A co masz po CLI? Wstaw tam jmp * chociaż. Dla mnie to dlatego się wywala, że po włączeniu przerwań lądujesz w BRK.
Po CLI jest dalsza część programu i akurat to nie jest BRK, nie tędy droga...

AJOT
Posty: 15
Rejestracja: 27 mar 2019, 19:55
Grupa: Sentinel
Kontakt:

Re: Skleroza mnie boli a więc wiele podpowiedzi mi będzie potrzebne, aby napisać ponownie coś po ponad 20 latach.

#5 Post autor: AJOT »

juntek pisze:W kodzie obsługi przerwania masz błąd polegający na tym, że na początku nie zachowujesz na stosie wartości rejestrów A, X, Y ale na koniec je ze stosu zdejmujesz (sekwencja: pla, tay, pla, tax, pla). Żeby się zgadzało to wchodząc do procedury powinieneś dać: pha, txa, pha, tya, pha

W rezultacie na koniec procedury obsługi przerwania wskaźnik stosu masz 3 bajty niżej niż podczas wejścia do procedury przerwania. Procesor nie jest więc w stanie poprawnie odtworzyć wartości rejestrów PC i SP które zapisał sobie na stosie tuż przed przekazaniem sterowania do procedury obsługi przerwania i dlatego kod wylatuje w powietrze.
Dodatkowo z przerwania wychodzisz z innymi wartościami rejestrów A,X,Y niż miałeś na wejściu, a powinny być takie same.
Drogi Panie, z tego co kojarzę C64 wywołuje adres $EA31, patrząc na znajdujący się tam kod czytamy:

Kod: Zaznacz cały

jsr $ffea
nie za uwarzyłem żadnego zrzutu na stos, C64 robi to automatycznie -to nie PC.

Awatar użytkownika
juntek
Posty: 237
Rejestracja: 23 wrz 2018, 20:17

Re: Skleroza mnie boli a więc wiele podpowiedzi mi będzie potrzebne, aby napisać ponownie coś po ponad 20 latach.

#6 Post autor: juntek »

nie za uwarzyłem żadnego zrzutu na stos, C64 robi to automatycznie -to nie PC.
PC też robi to automatycznie. Ale masz rację - dopiero teraz zauważyłem że wektor przerwań ustawiasz w $0314/$0315 a nie w $fffe/$ffff i w takim przypadku faktycznie rejestry masz już wrzucone na stos przed wejściem do procedury obsługi przerwania. Skompilowałem i odpaliłem kilka razy na emulatorze Vice ten Twój kod ale bez odwołań do muzyki i ani razu mi się nie powiesił - może tu jest wskazówka?
READY.

ODPOWIEDZ