Strona 1 z 1

RDY aka HLT in 65xx programowo

: 23 mar 2012, 14:25
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

: 23 mar 2012, 18:07
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ą.

: 23 mar 2012, 18:56
autor: carrion
brush powrócił.... skoro takie rzeczy pamięta i jeszcze na forum pisze.

: 28 mar 2012, 08:43
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ć

: 05 kwie 2012, 09:27
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

: 05 kwie 2012, 11:50
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.

: 05 kwie 2012, 22:14
autor: brush
Zacznijmy od początku. Co chcesz osiągnąć?

: 06 kwie 2012, 11:27
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ć.

: 06 kwie 2012, 17:38
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)

: 07 kwie 2012, 10:15
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

: 14 kwie 2012, 08:04
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? :)

: 14 kwie 2012, 09:22
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)

: 14 kwie 2012, 21:50
autor: at0mic
genialne!

: 15 kwie 2012, 08:20
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.

: 15 kwie 2012, 20:55
autor: wegi
z $Dc04 5/6 dla rozjaśnienia zerknij tutaj:

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

: 18 kwie 2012, 20:01
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

: 18 kwie 2012, 20:59
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:)

: 23 kwie 2012, 13:18
autor: at0mic
Wegi,

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

: 24 kwie 2012, 21:02
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