Hehe. Za każdą nową wersją dochodzę ciut dalej :)
A jak będziesz robił wersję GTIA to zrobiłbyś może jakąś opcję w menu żeby można było pograć na GTIA bez przełączania monitorów?
Edit: A, i kasuj status BREAK przed wejściem do gry.
Nie jesteś zalogowany. Proszę się zalogować lub zarejestrować.
Fujisan 1.1.3 Fujisan 1.1.3 to nowa odsłona emulatora opartego na libatari800, skupiona na integracji z FujiNet.
Śnieżna planeta w Cosmic Hero 2 Zelax prezentuje postępy nad kontynuacją klasyka. Zobacz mroźną planetę w Cosmic Hero 2.
ABBUC Creative Contest 2026 Poznaj zasady nowej edycji konkursu ABBUC Creative Contest dla twórców związanych z 8-bitowym Atari.
Gearlynx 1.0.0 Pierwsza stabilna wersja wieloplatformowego emulatora Atari Lynx o nazwie Gearlynx trafiła do sieci.
Jubileuszowy 25. odcinek kursu Larka Arkadiusz Lubaszka kontynuuje swoją serię poradników, publikując 25. lekcję programowania gier.
atari.area forum » Posty przez mono
Hehe. Za każdą nową wersją dochodzę ciut dalej :)
A jak będziesz robił wersję GTIA to zrobiłbyś może jakąś opcję w menu żeby można było pograć na GTIA bez przełączania monitorów?
Edit: A, i kasuj status BREAK przed wejściem do gry.
Ale skąd ta cena 6.4K ? Przecież jest napisane na pudełku 64K.
@toscanii: http://www.atari.org.pl/tape_preservation_project
Poza tym na głównej stronie portalu AtariArea znajduje się sekcja "Artykuły" i "FAQ". Możesz tam znaleźć różne rzeczy.
Ja oprogramowaniem mógłbym się zająć, ale nie w najbliższym czasie, bo mam kilka projektów do zrobienia.
Powinno być to coś w tej podobie:
1. 1bpp:
tile1bpp:
lda #%11111111 ;kolor przezroczysty (%1 powielony na wszystkie piksele)
eor (zp1) ;z piksela przezroczystego robimy %0
nop ;i liczymy maske
pha ;maskujemy piksele kloca
and (zp1)
sta tmp
pla ;maskujemy piksele ekranu
eor #%11111111
and (zp2)
ora tmp ;i scalamy
sta (zp2)2. 2bpp
tile2bpp:
lda #%10101010 ;kolor przezroczysty (%10 powielony na wszystkie piksele)
eor (zp1) ;z piksela przezroczystego robimy %00
pha ;i liczymy maske
and #%01010101
sta tmp
pla
and #%10101010
lsr
ora tmp
sta tmp
asl
ora tmp
pha ;maskujemy piksele kloca
and (zp1)
sta tmp
pla ;maskujemy piksele ekranu
eor #%11111111
and (zp2)
ora tmp ;i scalamy
sta (zp2)3. 4bpp
tile4bpp:
lda #%00010001 ;kolor przezroczysty (%0001 powielony na wszystkie piksele)
eor (zp1) ;z piksela przezroczystego robimy %0000
pha ;i liczymy maske
and #%00001111
seq
ora #%00001111
sta tmp
pla
and #%11110000
seq
ora #%11110000
ora tmp
pha ;maskujemy piksele kloca
and (zp1)
sta tmp
pla ;maskujemy piksele ekranu
eor #%11111111
and (zp2)
ora tmp ;i scalamy
sta (zp2)Począwszy od "maskujemy piksele kloca" kod jest identyczny. Podobny też jest kod aż do "i liczymy maske". Różny jest kod do liczenia maski stąd najfajniej mieć tę maskę stablicowaną :)
Edit: Oczywiście indeks koloru przezroczystego może być dowolny.
Edit 2: No i zp1 i zp2 możesz używać z dowolnym x czy y bo są nie używane (dlatego nie pisałem pełnego trybu adresowego).
W FPGA jest tutaj razem z wewnętrznym ROM-em: https://github.com/trcwm/Speech256
Pomysł jest bardzo fajny. A do sterowania w zasadzie wystarczą trzy rejestry:
$D500 WR: DATA
b7..b0 - A8..A1
$D501 WR: CTRL
b7 - /RESET
b6 - /SBYRESET
b5 - ROMDISABLE (opcjonalnie)
b4..b0 - n/c
$D501 RD: STAT
b7 - /LRQ
b6 - SBY
b5..b0 - n/c
kiedy ROMDISABLE=0 i SE=1 (/ALD jest spięty jakoś z R/W z Atari).
Jeśli lista alofonów jest podobna do SC-01A (http://www.atari.org.pl/forum/viewtopic.php?id=11736) i do tej używanej przez S.A.M. to może nawet udałoby się to spiąć z istniejącym oprogramowaniem?
Pytanie: co jest w zewnętrznym ROM-ie? Czy po prostu blokowany jest wewnętrzny i SP0256 wykonuje wtedy program z zewnętrznego? Są te ROM-y SPR128 gdzieś dostępne (chip i zawartość)? Jeśli jest gdzieś zawartość to może wsadzić do urządzenia jakiś RAM zapisywany z poziomu Atari i udostępnić jeszcze ROMDISABLE w rejestrze sterującym żeby można było użyć innych wsadów (albo zrobić sobie własne)?
Na wiki do Amstrada trochę o tym chipie jest: http://www.cpcwiki.eu/index.php/SP0256_Allophones
Tak. To wymaga malowania dwóch sprajtów na sobie.
Nie musisz mieć tablic - możesz maskować programowo :P.
Jeśli byś się za te sprajty brał to mam następującą sugestię:
Zazwyczaj jeden z pikseli (zazwyczaj 0) traktowany jest jako kolor przezroczysty - reszta to piksele definicji sprajta. W trybach 1bpp taki sprajt jest szybko nakładany przez OR, w innych trzeba zamaskować. No ale mając np. tryb 4-kolorowy to para %00 jest zazwyczaj kolorem ramki, która często jest kolorem czarnym. Skutek jest taki, że zazwyczaj taka gra ma tło czarne. Gdybyś umożliwił przy nakładaniu sprajta wybór który kolor z definicji jest traktowany jako przezroczysty, to można byłoby wykorzystać kolor %00 jako zwykły piksel sprajta - dalej jeden sprajt miałby 3 kolory, ale jeden korzystałby z pikseli %01, %10, %11 a inny np. z %01, %10 i %00 a więc można by używać koloru ramki i mieć np. kolorowe tło (tak, jak ma Gorgh w swojej grze z motorem).
Można powiedzieć, że niczym się to nie różni od sytuacji kiedy masz dla sprajta zdefiniowany jego kształt i osobno maskę. Ale wtedy dla każdego sprajta musisz mieć i kształt i maskę. W proponowanej wyżej sytuacji masz tylko definicję sprajta, dzięki czemu zajmuje to mniej pamięci bo nie każdy sprajt musi używać pary %00.
Problem jest tylko taki, że nakładanie takiego sprajta trzeba maskować więc trzeba by mieć 256-bajtowe tablice masek. Dla trybów 1bpp potrzebujesz 2 tablice, dla 2bpp 4 tablice, dla 4bpp 16 tablic.
Można by założyć że sprajty o indeksach $00..$7F mają zawsze piksel %00 przezroczysty, a sprajty $80..$FF piksel %11 przezroczysty. Wtedy trzeba 2 tablice dla 1bpp, 2 tablice dla 2bpp i 2 tablice dla 4bpp.
Czyli przepisujesz bajt z generatora do pamięci ekranu. Czyli generator ma mieć konstrukcję odpowiednią dla trybu (1bpp - singlecolor, 2bpp - multicolor, 4bpp - GTIA). W sumie to ideowo zgadza się to z tym co Atari chciało a czego nie, bo tekst w GR.12 też niespecjalnie wygląda z generatorami systemowymi :)
Skoro tiles, to może pomyśl o odbiciach w poziomie (tablica) i pionie (procedura). Twórcom BASIC-owych gier mogłoby to nieco uprzyjemnić robotę.
Edit: A pozycjonowanie co do piksela robienie sprajtów softwareowych.
Edit 2: A jeszcze z maskowaniem... Paaaanie. Tzn. z przezroczystością.
Świetnie to wygląda.
Mam kilka pytań odnośnie funkcji piszącej tekst na ekranie w trybie graficznym.
Jak wiadomo systemowe generatory znaków przygotowane są dla trybów hires (1 bit na piksel). Czy:
1. Można pisać dowolny tekst używając takiego generatora (jak są interpretowane znaki w inverse video)?
2. Czy mając własny generator znaków zaprojektowany dla trybu multicolor (2 bity na piksel) można go użyć do rysowania fontów w trybie graficznym który pozwala na malowanie pikseli w kilku kolorach (np. czcionka dla trybu 12 OS rysowana w trybie 15 OS lub 7 OS)?
3. Czy można pisać tekst obrócony o 90, 180 i 270 stopni (a może 45, 135, 225 i 315)?
4. Czy tekst można pozycjonować z dokładnością do piksela czy do bajtu?
5. Czy w trybach GTIA tekst jest czytelny czy trzeba sobie skonstruować dla niego osobny generator znaków (4 bity na piksel)?
Edit: Czyli właściwie pytania 1, 2 i 5 sprowadzają się do kwestii mapowania pikseli z generatora znaków na piksele trybu graficznego :)
Weź pod uwagę to, że IOCB 0, 6 i 7 są rezerwowane przez BASIC na kolejno: edytor, grafikę, operacje I/O - (C)LOAD/(C)SAVE,LIST,ENTER,LPRINT. 6 otwierana jest po GRAPHICS a 7 tylko na czas wykonania operacji I/O.
GET/PUT/INPUT/PRINT realizuje się na już otwartym kanale, ale przy XIO zawsze możesz podać nazwę urządzenia (niezależnie od tego czy kanał jest otwarty czy nie) co pozwala Ci dość prosto rekonfigurować dowolne urządzenie (np. operacja RENAME dla DOS, lub parametryzacja otwieranego okna przez sterownik O: z któregoś Bajtka) albo nawet cały sterownik. Co więcej do operacji CIO można wykorzystać wszystkie ICAX1..6 (choć BASIC pozwala używać tylko ICAX1 i 2), ponieważ tylko ICAX3Z..ICAX6Z są rezerwowane dla potrzeb CIO. W takim przypadku parametry w ICAX3..ICAX6 ustawia się POKE-m w BASIC-u.
Z ciekawostek (rozmawialiśmy o tym, ale może komuś też się przyda): po RESET system (i BASIC) ma otwarty tylko IOCB #0 z edytorem E:, ale po dowolnym GRAPHICS (również GR.0) otwarty jest już #6 z S: :)
No i pamiętaj jeszcze że INPUT #16;zmienna nie wyświetla znaku ? przy wprowadzaniu.
Planujesz rezerwację pamięci na generatory znaków dla trybów tekstowych (1KB lub 512B)? Może obsługę trybu 3 ANTIC-a? I bardziej eleganckie włączanie V scrolla? Może H scroll też i operacje XIO do skrolowania zawartości ekranu z szybkim wpisywaniem brakującej linii/kolumny (np. właśnie w nazwie urządzenia)?
Edit: I jeszcze przyszło mi do głowy, że może tryb GTIA mógłby być włączany w dowolnym trybie ANTIC-a a nie tylko 9,10,11? Albo np. tryby dwuliniowe 9+11 :) Albo Avalonowa 4 z dwoma generatorami przelączanymi co wiersz?
Edit 2: Czy przy splicie będziesz miał różne zestawy kolorów dla każdego trybu?
Edit 3: Szerokość ekranu: wąski, normalny, szeroki.
Można przemapować dowolne urządzenie SIO na napęd Dx: za pomocą polecenia MAP np.:
MAP 1 SIO N:Od tej pory SDX pod DN: będzie widział dysk 1 SIO.
Edit: Mnie się to przydaje przy pracy z HDD, bo na A: ciągle mam HDD (który normalnie przykrywa mi urządzenie SIO), a na N: mam pierwsze urządzenie SIO.
Edit 2: Widzę że jest jeszcze SWAP do zamiany miejscami napędów. Ale nie używałem :)
W manualu do SDX (sekcja "9.9.Utilities") widzę "9.9.10. HDSC". Nie miałem potrzeby używać tego narzędzia (jest na dysku toolkit.atr), ale może się nada?
Zmieńmy trochę tablice:
masktab:
:64 .byte [1 << [# & %111]] ^ $FF
pixeltab:
:64 .byte [1 << [# & %111]]Przeoczyłem jakoś Twój post.
SuperKey? Chyba w TA było.
S: nie znam, K: też - bufory klawiatury które widziałem wpinają się w przerwania VBLKD oraz VKEYBD OS-a.
Mnie się podoba i nawet wciągnęło mnie na chwilę. Balonów ani tuneli nie było w wersji z TA :) Co to za muzyka?
Tak. Przepraszam - pisałem na szybko. Poniżej działająca:
;YX-U2
iifp:
stx FR0
sty FR0+1
cpy #$80
php
bcc @+
txa
eor #$ff ;abs(a)
adc #0
sta FR0
tya
eor #$ff
adc #0
sta FR0+1
@ jsr IFP
asl FR0 ;korekcja znaku
plp
ror FR0
rtsTo zamienia Ci liczbę U2 na FP.
Wcześniej zrobiłem uzupełnienie do 1 zamiast do 2 przy abs.
o co chodzi? o czas :-)
jesli jest biblioteka, ktora realizuje pewne zadania to po co mialbym pisac wszystko od zera skoro mozna skorzystac z biblioteki?
jak masz wbic wozdzia to robisz do tego celu mlotek? ;-)
Daj spokój, to jest rzecz oczywista. Zaskoczyło mnie że szukasz biblioteki do dodawania/odejmowania liczb U2.
przykladowo czego mi brakuje w pakiecie FP z ROM: operacji na liczbach int ze znakiem (nawet c64 to ma :/).
nie chce przygotowywac liczb do operacji (korzystajac z pakietu) chce podac skladniki ewentualnie ich format, operacje i dostac wynik oraz info czy wynik jest prawidlowy. :-)
To może trzeba sobie rozszerzyć pakiet o procedury z ROM-u C64 :)
tym bardziej, ze konwertowanie liczb na string a pozniej na fp albo przechowywanie reprezentacji wartosci -1 w formacie ataroskim FP w programie usera do dalszch obliczen... to tylko atari moglo na to wpasc ;-)
To fakt. Musiałbyś robić coś w rodzaju:
;FR0.w=int
lda FR0+1
cmp #$80
php
bcc @+
eor #$ff ;abs(a)
sta FR0+1
lda FR0
eor #$ff
sta FR0
@ jsr IFP
asl FR0 ;korekcja znaku
plp
ror FR0Dodawanie i odejmowanie? Wydawało mi się że wystarczy potraktować liczbę jako U2 i wtedy zwyczajnie:
lda a
clc
adc b
sta c
lda a+1
adc b+1
sta c+1b15 składników i wyniku wskazuje znak (i N w rejestrze flag). V mówi o przepełnieniu zakresu U2. OCB z bibliotekami?
Mnożenie U2 jest bardziej skomplikowane, ale OIDP na codebase64 są procedury korygujące znak.
Procedura @xxl'a zapala piksel ale nie pozwoli na zgaszenie.
Poniżej może trochę przejrzyściej, choć ciut wolniej:
;C-color (0..1), Y-x coord (0..161), X-y coord (0..63)
plot lda rowadl,x
sta adr
lda rowadh,x
sta adr+1
lda (adr),y
and masktab,x
scc
ora pixeltab,x
sta (adr),y
rts
rowadl:
:64 .byte <[screen+162*[#/8]]
rowadh:
:64 .byte >[screen+162*[#/8]]
masktab:
:64 .byte [1 << [~# & %111]] ^ $FF
pixeltab:
:64 .byte [1 << [~# & %111]]
screen .ds 162*[64/8]Znacznikiem C podajesz kolor piksela, w Y-x a w X-y. W screen masz bufor ekranu - kolejno 8 "stron" (po 162 bajty) w organizacji takiej, jak potrzebujesz dla wyświetlacza.
Sama procedura może rezydować w dowolnym miejscu pamięci, tylko słowo adr powinno być ulokowane na ZPG.
To na pewno jest pełny loader? To jest BOOT więc 6 pierwszych bajtów to jest nagłówek - ładowane są 2 sektory 128 bajtowe począwszy od adresu $75F. Spróbowałbyś ponownie zdisassemblować kod loadera?
Edit: Czytasz mi w myślach :) Dzięki. ALE! $75F to jest adres ładowania boota razem z nagłówkiem. Loader jest niepełny bo to:
0805 A9 20 LDA #$20
0807 8D 8E 07 STA $078E
080A F0 82 BEQ $078Eprzecież pójdzie w krzaki.
A czy to nie wygląda na ubitą linię LUM1 (logiczna 1 albo 0)? Może ta bramka odwracająca (4050 pin 11 i 12 ze schematu) padła? Albo się rozlutowało :>
atari.area forum » Posty przez mono
Wygenerowano w 0.125 sekund, wykonano 16 zapytań