RDY aka HLT in 65xx programowo

Forum, na którym możemy pogadać o wszelakim oprogramowaniu na C64, grach, programach.
Wiadomość
Autor
Awatar użytkownika
at0mic
Posty: 82
Rejestracja: 02 gru 2011, 14:55

RDY aka HLT in 65xx programowo

#1 Post autor: at0mic »

czy programowo można np przez timery CIA zatrzymywać procesor na określony czas ?

widzę że jest tam na schemacie bramka AND od układu PLA i DMA - ale mi to niewiele mówi...

no cóż chyba się nie da a szkoda bo przydałoby się coś takiego zaprogramować co działałoby podobnie jak w Atari Xl/XE $d40a

cyklowanie rastra przy fruwających sprajtach to jest harakiri/sepuku/masakra ;P jak dla mnie
At0mic

brush
Posty: 254
Rejestracja: 20 kwie 2009, 10:32
Grupa: Elysium

#2 Post autor: brush »

Na cyklowanie przy "latajacych" sprajtach są właściwie tylko 3 sposoby:

a) NIE cyklujesz :) Dzięki takim trickom jak rozciąganie sprajtów przez $d017 możesz zrobić tak, żeby zawsze w danej linijce było tyle samo sprajtów a ruch góra dół robisz rozciągając pierwszą linijke sprajta

b) robisz multiplexera w którym na stałe ustawiasz sprajty na danych pozycjach Y i tylko X'em ruszasz. Wbrew pozorom niektóre "sinusy" na sprajtach własnie tak działały Ruch góra/dół był złudzeniem - po prostu przełączano bitmape w sprajtach kolejnych i wyglądało jakbyś ruszał sprajty..

c) prawdziwe cyklowanie. To wbrew pozorom nie jest kocepcyjnie aż tak bardzo trudno, chociaż żmudne. Dokładnie wiadomo ile cykli zajmuje sprajt o ile jest wyświetlony w linii rastrowej. Oczywiście musisz raczej użyć jakiegoś tricku, żeby pozbyć się krótkich linii bo z krótkimi to więcej niż 4 sprajtów w linii nie wyświetlisz chociaż jak się uprzesz to 4 latające mogą być też ładne :) Najprościej mógłbyś to zrobić tak:

1. Robisz tabele o długości powiedzmy 200. Wypełniasz ją zerami.
2. Sprawdzasz pozycje sprajta #1, powiedzmy, że wynosi ona Y. W tabeli dodajesz do 21 kolejnych komórek 1.
3. Powtarzasz punkt 2 dla kolejnych sprajtów
4. na koniec masz teraz tablice z ilościa sprajtów od 0 do 8 w każdej linijce rastrowej. Możesz za pomocą tego skonstruować sobie w locie procedurę efektu (musisz miec scyklowane tylko 8 różnych wersji (od 1 do 8 sprajtów) i w odpowiednich linijkach użyć odpowiedniej.

Oczywiście pkt. 4 można rozwiązać inaczej, przez jakieś dynamiczne modyfikacje kodu istniejącej procki itp. itd. ale generalnie logika samej procedury zostaje taka sama.

Have fun. Cyklowanie jest dobrą zabawą.
Elysium vs Arise. Czym byłoby dobro bez zła?

Awatar użytkownika
carrion
Posty: 2329
Rejestracja: 27 lut 2009, 17:38
Kontakt:

#3 Post autor: carrion »

brush powrócił.... skoro takie rzeczy pamięta i jeszcze na forum pisze.
c64portal.pl, retronavigator.com

Awatar użytkownika
at0mic
Posty: 82
Rejestracja: 02 gru 2011, 14:55

#4 Post autor: at0mic »

a jak działa ten bajer z timerami że:

w irq ustawia się:

LDA#$04
LDX#$DC
STA$FFFE
STX$FFFF

-> wskazuje na timer $DC04

LDA#$4C
STA$DC04
LDA#$00
STA$DC05
...

-.- ? -.-



nie rozumiem więc piszę trochę chaotycznie ale słyszałem coś o tym i chciałbym żeby może ktoś przybliżył sprawę lub chociaż rzucił linkiem gdzie jest to prosto wytłumaczone.



Obrazek

rozumiem że 4c to ->JMP
i siedzi pod DC04 a DC05 to LO a DC06 to HI
i razem tworzy skok do adresu JMP$HILO ale jak nad tym zapanować - nie mogę wyklarować
At0mic

Awatar użytkownika
at0mic
Posty: 82
Rejestracja: 02 gru 2011, 14:55

#5 Post autor: at0mic »

kurczę, nie mogę załapać idei jak i gdzie ile cykli jest kradzione i jak DMA haltuje procesor i dlaczego nie haltuje jak robi PLA

napisałem coś takiego ale jest spierdzielone:

Kod: Zaznacz cały

//KickAssembler syntax

:BasicUpstart2(poczatek)

.pc = $08ff
poczatek:
	sei
	lda#$7f
	sta$dc0d
	lda#$09
	pha
	pha
	rts
dalej:
 	ldy $d012
 	pla
 	sta $d020
 	tu: cpy$d012
 	beq tu
 	lda$1000,y
 	pha
 	nop nop nop nop
 	nop nop nop nop
 	nop nop nop nop
 
	lda#$09
	pha pha
	rts

.pc =$1000 "raster data"
.byte $00,$00,$00,$02,$00

.byte $02,$02,$0a,$02,$0a,$0a,$07,$0a,$07,$07,$01,$07,$01,$01,$03,$01,$03,$03,$0e,$03,$0e,$0e,$06,$0e,$06,$06,$00,$06,$00,$00,$02,$00 
.byte $02,$02,$0a,$02,$0a,$0a,$07,$0a,$07,$07,$01,$07,$01,$01,$03,$01,$03,$03,$0e,$03,$0e,$0e,$06,$0e,$06,$06,$00,$06,$00,$00,$02,$00
.byte $02,$02,$0a,$02,$0a,$0a,$07,$0a,$07,$07,$01,$07,$01,$01,$03,$01,$03,$03,$0e,$03,$0e,$0e,$06,$0e,$06,$06,$00,$06,$00,$00,$02,$00
.byte $02,$02,$0a,$02,$0a,$0a,$07,$0a,$07,$07,$01,$07,$01,$01,$03,$01,$03,$03,$0e,$03,$0e,$0e,$06,$0e,$06,$06,$00,$06,$00,$00,$02,$00
.byte $02,$02,$0a,$02,$0a,$0a,$07,$0a,$07,$07,$01,$07,$01,$01,$03,$01,$03,$03,$0e,$03,$0e,$0e,$06,$0e,$06,$06,$00,$06,$00,$00,$02,$00
.byte $02,$02,$0a,$02,$0a,$0a,$07,$0a,$07,$07,$01,$07,$01,$01,$03,$01,$03,$03,$0e,$03,$0e,$0e,$06,$0e,$06,$06,$00,$06,$00,$00,$02,$00
.byte $02,$02,$0a,$02,$0a,$0a,$07,$0a,$07,$07,$01,$07,$01,$01,$03,$01,$03,$03,$0e,$03,$0e,$0e,$06,$0e,$06,$06,$00,$06,$00,$00,$02,$00
.byte $02,$02,$0a,$02,$0a,$0a,$07,$0a,$07,$07,$01,$07,$01,$01,$03,$01,$03,$03,$0e,$03,$0e,$0e,$06,$0e,$06,$06,$00,$06,$00,$00,$02,$00

nie mam pojęcia jak c64 działa...


http://www.8.3poig-otwock.pl/UPLOAD/gusio.prg
At0mic

Awatar użytkownika
at0mic
Posty: 82
Rejestracja: 02 gru 2011, 14:55

#6 Post autor: at0mic »

na AtariXL/XE

działa mi to bez problemu a poznaję system od niedawna:

Kod: Zaznacz cały

;Mad AtariXL/XE Syntax
 org $08ff

 sei
 lda#$00
 sta$d40e
 eor#$9
 pha
 pha
 rts
 lda$d40b
 sta$d40a
 asl 
 sta$d01a
 lda#$09
 pha
 pha
 rts
http://8.3poig-otwock.pl/UPLOAD/atarek.xex emulator Atari800WinPlus

potrzebuję pomocy, jakiejś ksiązki, czy linka bo mimo że czytam o cyklowaniu to tak naprawdę wszyscy piszą jak się pozbyć szarpaniny a nie jak dalej docyklować kolorki czy inne efekty.

Jak sprawdzam pod emulatorem C64 Vice to nie ma szarpaniny ale docyklować nie bardzo wiem jak (chodzi o teorię - program sobie napiszę)

na małym atari jest o wiele prościej i to bez żadnych Display List i innych bajerów bo mają haltera 7 cykli przed końcem linii rastra i już nic docyklowywać nie potrzeba.

Na C64 nie potrafię pojąć sprzętu i już chyba nie pojmę bez jakiejś podpowiedzi.
At0mic

brush
Posty: 254
Rejestracja: 20 kwie 2009, 10:32
Grupa: Elysium

#7 Post autor: brush »

Zacznijmy od początku. Co chcesz osiągnąć?
Elysium vs Arise. Czym byłoby dobro bez zła?

Awatar użytkownika
at0mic
Posty: 82
Rejestracja: 02 gru 2011, 14:55

#8 Post autor: at0mic »

jak już nie mam szarpanki to czy jest jakiś prosty sposób/algorytm (nie chce wywarzać otwartych drzwi) żeby:

a) wpisać do 4 rejestrów (cztery tła w trybie z wilokolorowym tłem) inne wartości żeby się rastry nie rozwaliły w badlines

b)jak zmieniać obsługę rasterbarów że jeden program jest uruchamiany w liniach bez sprajtów a drugi w liniach ze sprajtami, przecież sam jsr czy jmp wywali sprawę - a może robić rastry po dwie linie ? (ale to drętwo wygląda:/)

c)jaki program/demo wziąć najlepiej za wzorcowy żeby go analizować -> moje umiejętności nie są tak masakryczne jak kod ludzi z Demosceny <- "masochizm intelektualny" i raczej sama teoria może nie wystarczyć.
At0mic

brush
Posty: 254
Rejestracja: 20 kwie 2009, 10:32
Grupa: Elysium

#9 Post autor: brush »

at0mic pisze:jak już nie mam szarpanki to czy jest jakiś prosty sposób/algorytm (nie chce wywarzać otwartych drzwi) żeby:

a) wpisać do 4 rejestrów (cztery tła w trybie z wilokolorowym tłem) inne wartości żeby się rastry nie rozwaliły w badlines

b)jak zmieniać obsługę rasterbarów że jeden program jest uruchamiany w liniach bez sprajtów a drugi w liniach ze sprajtami, przecież sam jsr czy jmp wywali sprawę - a może robić rastry po dwie linie ? (ale to drętwo wygląda:/)

c)jaki program/demo wziąć najlepiej za wzorcowy żeby go analizować -> moje umiejętności nie są tak masakryczne jak kod ludzi z Demosceny <- "masochizm intelektualny" i raczej sama teoria może nie wystarczyć.
a) w krótkiej linii masz do dyspozycji bodajże ze 23 cykle.Jeśli przygotujesz sobie w poprzedniej (długiej) linii w akumulatorze, Xie i Y, wartości kolorów to wtedy możesz zrobić:
STA $d021
STY $d022
STX $do23
LDA #$xx
STA $D020

Co ci zajmie 18 cykli i się powinieneś zmieścić.

b) Czy sprajty mają się ruszać czy być statyczne?

c) coś poszukamy w zalezności od odpowiedzi na b)
Elysium vs Arise. Czym byłoby dobro bez zła?

Awatar użytkownika
at0mic
Posty: 82
Rejestracja: 02 gru 2011, 14:55

#10 Post autor: at0mic »

sprajty będą do podkolorowania znaków w trybie z wieloma tłami ale ekran chyba będzie skrolowany w x i y tak jak w boulderdash

ze skrolu w y mogę zrezygnować to może będzie łatwiej
At0mic

brush
Posty: 254
Rejestracja: 20 kwie 2009, 10:32
Grupa: Elysium

#11 Post autor: brush »

at0mic pisze:sprajty będą do podkolorowania znaków w trybie z wieloma tłami ale ekran chyba będzie skrolowany w x i y tak jak w boulderdash

ze skrolu w y mogę zrezygnować to może będzie łatwiej
No ale nadal nie powiedziales czy sprajty będą statyczne czy bedą sobie swobodnie lataly po ekranie? :)
Elysium vs Arise. Czym byłoby dobro bez zła?

Awatar użytkownika
skull
Posty: 760
Rejestracja: 15 wrz 2008, 08:18
Grupa: samar

#12 Post autor: skull »

no jak z Y zrezygnuje to tak jakby były "statyczne".

Ogólnie opóźnienia możesz regulować zmieniając kod "w trakcie".
Ja np. jako opóźniacza uzywam rozkazu dwubajtowego cmp:

cmp #$00 ; 2cykle opóźnienia
cmp $00 ; 3 cykle
cmp $00,x ; 4
cmp ($00),y ; 5 (tylko tu uwaga na Y na przejście miedzy stronami pamięci)
cmp ($00,x) ; 6 cykle

i wystarczy modyfikować tylko jeden bajt (rozkazu)
Bo pecet to zwykły banan...

Awatar użytkownika
at0mic
Posty: 82
Rejestracja: 02 gru 2011, 14:55

#13 Post autor: at0mic »

genialne!
At0mic

Awatar użytkownika
skull
Posty: 760
Rejestracja: 15 wrz 2008, 08:18
Grupa: samar

#14 Post autor: skull »

Należy też pamiętać, że Sprites "kradną" cykle w ściśle określonych momentach w linii , ale trzeba zawsze doliczać 3 cykle tuż przed, na wyłączenie dostępu dla CPU (pojedyńczy sprite zabiera w sumie 5 cykli: te 3 + 2 na swoje dane, czyli dwa sprite = 3+2+2 :ale jak są kolejno po sobie, czyli spr 0 i 1 lub np. 3 i 4 itd).
Co to daje? - ano tyle że jak włączymy np. sprite 0 i 3 to w czasie dla (niewłączonych) nr 1 i 2 i tak nie ma niedostępu dla proca (nie zdąży się przełączyć) - co w rezultacie daje taką dziurę...
Ale teraz, czy się pojawią tam, sprite 1 lub 2 lub oba naraz - nie wpłynie to na efektu cyklowania! Czyli te 2 mogą sobie jeździć nawet z góry na dół i nie wpłyną na szrapanie "rastrów". To też taki "auto" docykl.
Bo pecet to zwykły banan...

Awatar użytkownika
wegi
Posty: 839
Rejestracja: 14 lip 2009, 01:17

#15 Post autor: wegi »

z $Dc04 5/6 dla rozjaśnienia zerknij tutaj:

http://www.the-dreams.de/articles/2x2-fli.txt

Awatar użytkownika
at0mic
Posty: 82
Rejestracja: 02 gru 2011, 14:55

#16 Post autor: at0mic »

a czy jest ważna kolejność sprajtów jak chcę je powiększyć 2x&2y
i na górnej ramce scrolla zrobić na sprajtach z rastrami
(tęczowe $D020 - sprites maskują na czarno tak że to co puste tworzy tęczowe litery)
- ramka otwarta czyli d016 przed końcem każdej linii musiałoby się zmieniać dwa razy -czy tak?

przyznam że nie potrafiłem dotąd otworzyć ramki z boków ze względu na braki w cyklowaniu rastra
At0mic

Awatar użytkownika
wegi
Posty: 839
Rejestracja: 14 lip 2009, 01:17

#17 Post autor: wegi »

W kolejności jakiej je poustawiasz będziesz je rolował tudzież przesuwał jeżeli nie robisz na 8miu sprajtach - więc kolejność jest o tyle ważna, że musisz ją wziąć pod uwagę podczas rolowania...
Piszesz o górnej ramce a nie o bocznych - jeżeli chcesz robić to również na bocznych to musisz zrobić dwa wpisy do $D016.

Albo nie używasz sprajta zerowego a jeżeli używasz wówczas wyłączasz grafikę (np w linii $FA wpisujesz 2 do $d011 i w linii $fc wpisujesz #$0b do $d011 a w 39 kolumnie strzelasz do $d016 rozkazem dec $d016 i potem inc $d016

Patrz znakomite artykuły Jetboya - klub wesołego cyklisty w C&A (pobierzesz z retroreaders)

edit:
Zapomniałem - na lewym borderze odświeżane są dane dla sprajta 0 zdaje się - więc z lewej strony go nie wstawiaj - dojdziesz do tego podczas rastrowych bojów:)

Awatar użytkownika
at0mic
Posty: 82
Rejestracja: 02 gru 2011, 14:55

#18 Post autor: at0mic »

Wegi,

jak używasz Hoxa64 do cyklowania ? - masz jakąś instrukcję (może być ang.)
At0mic

Awatar użytkownika
wegi
Posty: 839
Rejestracja: 14 lip 2009, 01:17

#19 Post autor: wegi »

Tu masz przykład 8 w linii sprajtów bez wielkiej synchronizacji na borderach z włączoną grafiką
poanalizuj sobie pokombinuj pozmieniaj...

Kod: Zaznacz cały



*= $0801
         .BYTE $0B,$08,$90,$06,$9E,$32
         .BYTE $30,$34,$39,$00,$A0,$00
         
		SEI

		LDA #$00
		STA $3FFF
		LDX #$3E
		LDA #$55
	-
		STA $3FC0,X
		EOR #$FF
		DEX
		BPL -
		STX $D017
		STX $D01D
		
		LDX #8
		STX $D02C
		LDY #0
                  
		LDA #40
	-
		STA $D000,Y         
		CLC
		ADC #48
		INY
		PHA
		LDA LINIA
		STA $D000,Y
		LDA #$FF
		STA $07F7,X
		PLA
		INY
		DEX
		BNE -

		LDA #$F0
		STA $D00E
		LDA #%11100000
		STA $D010		
	
LINIA = *+1		
	-
		
		LDX #$34 
		;LDY #$14	;#$14 - TOP BORDER
		DEX
		BIT $D011
		BPL *-3
		LDA #$1B
		STA $D011
		
		BIT $D011
		BMI *-3		
		DEC $D015
		
		CPX $D012
		BNE *-3

		LDY #7
		;LDY #7+9  ;IF LINIA = #$14
		BIT $44

		LDX #45
		BNE +	
	-
		LDY #2
	+
		LDA $D012
		CLC
		ADC #$05
		AND #$07
		ORA #$18
		STA $D011
		DEY
		BNE *-1
		NOP
		DEC $D016
		INC $D016
		DEX
		BNE -
		
		STX $D015		
		LDA #$FA
		CMP $D012
		BNE *-3
		LDA #$02
		STA $D011

		JMP --


[/b]

Co do Hoxs'a - f9 wywołuje monitor widać 2 okna C64 CPU i disk CPU - disk CPU możesz zamknąć

f8 - step by cycle
f7 step by instruction
f6 trace frame
f5 - trace

z menu step masz jeszcze trace interrupt taken

ODPOWIEDZ