RDY aka HLT in 65xx programowo
RDY aka HLT in 65xx programowo
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
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
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ą.
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?
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.
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ć
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.
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
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:
nie mam pojęcia jak c64 działa...
http://www.8.3poig-otwock.pl/UPLOAD/gusio.prg
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
http://www.8.3poig-otwock.pl/UPLOAD/gusio.prg
At0mic
na AtariXL/XE
działa mi to bez problemu a poznaję system od niedawna:
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.
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
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
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) 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
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ć: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ć.
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?
No ale nadal nie powiedziales czy sprajty będą statyczne czy bedą sobie swobodnie lataly po ekranie?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
Elysium vs Arise. Czym byłoby dobro bez zła?
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)
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...
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.
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...
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
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
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:)
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:)
Tu masz przykład 8 w linii sprajtów bez wielkiej synchronizacji na borderach z włączoną grafiką
poanalizuj sobie pokombinuj pozmieniaj...
[/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
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 --
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