1

(117 odpowiedzi, napisanych Programowanie - 8 bit)

@Fox, a to nie jest jakiś bug?

Jak mam serię:

        nmb
.pages $20

        .local,$A000
        (...)
        .endl
.endpg

        nmb
.pages $20

        .local,$A000
        (...)
        .endl
.endpg

To w pewnym momencie dostaje:

WARNING: Memory range has been exceeded

Ale wszystko działa z tym warningiem.

Ja dodam te f- f+ to jest ok.

        nmb
.pages $20
        opt f-
        org $A000
        opt f+
    .local,$A000
        (...)
        .endl
.endpg

f- f+ coś tam resetuje?

2

(123 odpowiedzi, napisanych Fabryka - 8bit)

Czy da się zrobić jakiś "align" ale w pliku wynikowym bin.
Załóżmy, że najpierw lecę:
opt h-f+

potem przestawiam się na:
opt h+f-
i mam fragment jakby xexowy

i chcę wrócić na h+f-

I jak się wyrównać, żeby plik BIN wrócił do tego jednego ciągu. Niestety nie wiem jak wyrównać się bo ciąg xexowy może wychodzić w różnej długości.

3

(117 odpowiedzi, napisanych Programowanie - 8 bit)

Dzięki! Myślałem, że do local nie da się patrzeć z zewnątrz, ale się da :)

;-------------------
.local  ,$A000
        org $A000
BANK1   rts
        org $BFFF
        dta $FF
.endl
;-------------------
.local  ,$A000
        org $A000
BANK2   rts
        org $BFFF
        dta $FF
.endl
;-------------------

i ładnie się banki 8kB robią.

4

(117 odpowiedzi, napisanych Programowanie - 8 bit)

Jak wybrnąć z sytuacji, gdy potrzebuję skompilować kilka banków carta.

;-------------------
         opt h-f+
;-------------------
         org $A000
BEGIN.   lda 20
         sta 712
         jmp BEGIN
;-------------------
         org $BFF0
INIT     rts
;-------------------
         org $BFFA
         dta <BEGIN, >BEGIN, $00, $04, <INIT, >INIT
;-------------------
         org $A000
LOOP1.   jmp LOOP1
         org $BFFF
         dta $FF
;-------------------
         org $A000
LOOP2.   jmp LOOP2
         org $BFFF
         dta $FF
;-------------------

MADS wali mi błędem

ERROR: Can't fill from higher ($C000) to lower memory location ($A000)

A chciałbym wyprodukować 3 x 8192 bajty binarne.

5

(32 odpowiedzi, napisanych Software, Gry - 8bit)

XEX2WAV https://github.com/GienekP/xex2wav
Loader do mona, jednorekordowy, zatrzymuje silnik po INIT a sam xex2wav wydłuża przerwę.

za jednym poleceniem zrobisz wava na całą stronę kasety

xex2wav gra1.xex gra2.xex gra3.xex gra4.xex zestaw.wav

Po wygenerowaniu wava warto sprawdzić w Altirra czy xexy w ogóle chcą z taśmą gadać.

6

(32 odpowiedzi, napisanych Software, Gry - 8bit)

He, w 156 miało coś być ekstra, ale ostatecznie zniknęło :)

7

(32 odpowiedzi, napisanych Software, Gry - 8bit)

Ok, tak żeby zostało. Pozbierałem moje XEX2CAS w jedno miejsce:
https://github.com/GienekP/xex2cas
v1.0 - to ten pierwszy zrobiony "sto lat" temu
v1.1 - v1.0 przepisany do C
v1.2 - tutaj zamiast wykrzynika jest loader od mona, jednoblokowy, no ja dodałem od siebie trik z bardzo krótkimi przerwami
v1.3 - to jest wersja 1.1 ale ma poprawiony "Wykrzyknik". Ten loader jak wszyscy wiedzą działa przypadkowo na XL/XE. Zdebugowałem, go, koledzy pomogli i wyszła wersja taka jaką autor miał na myśli. Dla eksperymentu można włączyć wczytywanie z BASICem. Wyskoczy ładny komunikat, że mamy carta w slocie, czego nie zobaczymy na oryginalnym wykrzykniku.

8

(32 odpowiedzi, napisanych Software, Gry - 8bit)

A może nie trzeba za bardzo kombinować, tylko wziąć XEXa i dodać mu "Wykrzyknik".

9

(32 odpowiedzi, napisanych Software, Gry - 8bit)

800 bodów ($0320). Mój magnetofon wyrabia na 900. No więc wziąłem 1 blokowy loader xexów od mona. Dokleiłem drugi blok gdzie jest procedura przenosząca ROM do RAM i która zmienia timingi. No i na koniec doklejony jest sam XEX.

Jeszcze nie miałem czasu sprawdzić na realnej taśmie, ale jak zadziała to puszczę małego toolsa dla tych co chcą maksa wyciągnąć z normala.

10

(32 odpowiedzi, napisanych Software, Gry - 8bit)

Ja sobie czasem eksperymentuje w "normalu". Pod emulcem działa, FujiNeta nie mam, więc jakby ktoś sprawdził czy to zadziała.

P.S.
Docudowałem 1-blokowy loader od mona

11

(14 odpowiedzi, napisanych Fabryka - 8bit)

Dzięki @mono
w sumie to trochę upraszcza sprawę zakresu $D5XX. Bo w tym zakresie cartridge ma totalny priorytet i w zasadzie nie ma się co przejmować tym co jest pod spodem.

12

(14 odpowiedzi, napisanych Fabryka - 8bit)

Poprawcie mnie jak piszę głupoty. Zakres $D5XX jest trzypoziomowy. Najniżej jest RAM. Nad nim jest ROM. I to wszystko przykrywa złącze cartridge. Jak carta nie ma to widzimy FF. Włączenie bitu SELFTEST powoduje migrację obszaru $D000 na $5000. Ale migracja dotyczy tylko(?) ROM. Więc w obszarze 55XX żadne FF się nie pojawią (?).

Czy w ATARI bez żadnych modyfikacji jest jakakolwiek szansa dostać się pod RAM $D5XX? Czy tutaj zawsze cart z butami siedzi.
Czy zapis na $D5XX zawsze idzie do carta, czy w zależności od PORTB jest w stanie trafić gdzieś indziej?
Jeżeli jest SELFTEST to zapis w $5000 idzie na manowce czy zapisze pod RAM "pod spodem"?

Dążę do wniosku, że jeżeli na D5XX zawsze jest widoczny cartridge to kopiowanie na żywca w emulatorze w zasadzie jest akceptowalne. Ale jeżeli magistrala przestawia się jak na semaforach to to co jest w atari800 to na pewno tego nie uwzględnia i zmiana musi być bardziej pokręcona.

13

(14 odpowiedzi, napisanych Fabryka - 8bit)

Może chodzi o to, że co prawda strona D5 zakrywa RAM, ale dla emulatora to to kopiowanie to nie jest "kopia do RAM". Tylko kopia dla kodu emulacji procka, który idzie z MEMORY_mem. No nie czaję tego...

Nie to jest coś pokręcone. To raczej wygląda jakby obsługa D5 w ogóle nie była zrobiona. Bo to, że akurat D5 się wykorzystuje do pstrykania bankami to nie jest ważne. Równie dobrze można by cały zakres A000-BFFF zrobić rejestrami a banki mieć na D5xx. CCTL to jest taki sam pin na złączu carta jak S4 czy S5.

14

(14 odpowiedzi, napisanych Fabryka - 8bit)

Na real sprzęcie zwykły ? PEEK(54528) pokazuje mi bajt z magistrali carta, więc jakbym podlutował zwykły ram to bym sobie mógł normalnie tam zapisywać. Jak jest rom to wiadomo, tylko odczyt. Więc bit PORTB (dla SelfTestu) chyba nie wpływa na D5 tylko na 50. I tu coś jest pokręcone w atari800. Bo on jakby na siłę chciał robić trik z SelfTestem.

15

(14 odpowiedzi, napisanych Fabryka - 8bit)

Jak było samo "GetByte" to D(isassembly) pokazywało kod poprawnie ale procek leciał na manowce.
Jak dodałem MEMORY_CopyFromCart to ruszył mi zarówno tester jak i inny programik co robię, który to na rzeczywistym sprzęcie też działa.
Nie mam za bardzo porównania, bo w sumie to nie spotkałem się z kombinacją, że procek wykonuje kod na stronie D5xx. A przecież nie ma ku temu żadnych przeszkód.

Ale z breakpointami to dziwna sprawa bo "b" nie działa natomiast jak dam:

bpc $D500

to wyświetla:

Breakpoint is at PC=D000

Jakie D0? Coś tu jest więcej zakręcone...

16

(14 odpowiedzi, napisanych Fabryka - 8bit)

@Fox
Dzięki! Będę się z tym próbował. Dziwne, że dwie instrukcje poszły.

Fork jest (powstał na potrzeby zabaw z JACART), ale zbytnio się tym nie chwalę bo babol z D5XX siedzi:
https://github.com/GienekP/atari800

EDIT.
DZIAŁA :)
Nie wiem czy elegancko dodałem, bo jeszcze nie czuję kodu atari800, w każdym razie wybrnąłem tak:

MEMORY_CopyFromCart(0xd500, 0xd5ff, active_cart->image + (active_cart->state & 0x3f) * 0x2000 + 0x1500);

17

(14 odpowiedzi, napisanych Fabryka - 8bit)

Ma ktoś doświadczenie z emulatorem ATARI800 i działaniem kodu ze strony $D500? Coś dziwnego się dzieje.

Zrobiłem sobie carta (DCart) co udostępnia cześć banku na stronę $D5XX, tak, że mogę wykonać kod nawet gdy sam cart ma wyłączony bank. Bardzo wygodna sprawa, bo można zaszyć procedury, które są "niezniszczalne". W sensie, przełączanie banków, RAM/ROM nie rusza ich.

Zrobiłem sobie tester i na real ATARI wszystko śmiga zgodnie z planem.

No to chciałem emulator ATARI800 uzupełnić o taki cart. Dodawałem sobie już carty, więc nie jest to jakieś trudne. I niby wszystko jest OK. Jednak coś ATARI800 ma poknocone z D5XX.

Puszczam kod w monitorze. Idę krok po kroku. Jestem na stronie $06 i skaczę pod $D500. Na polecenie "D" Debuger ładnie pokazuje kod ukryty na stronie $D5. Robię jedną instrukcję, sprawdzam, drugą, sprawdzam. Wszystko OK. Robię trzecią i kod idzie w adres z czapy $5462. Jakim cudem? Nic tam niema. A pod $D500 wszystko jest OK.

Próbowałem założyć BREAKPOINTy na stronie $D5 ale też coś to nie działa. Jakby ktoś w emulatorze zrobił bypass dla tego zakresu i jest on traktowany jakoś wyjątkowo. Ale znaleźć to to nie wiem jak.

Upgrade dla ATARI800 (z nowym cartem) oraz tester poniżej. Tester jest prosty. Miga ramka, po naciśnięciu START, skacze do RAM i tam kod miga tłem, potem START i skacze do $D500 i mają migać znaki. Na real działa, na emu nie.

Widok z monitora

> g
  0  21 A=A5 X=00 Y=94 S=FF P=N-*----C PC=064D: 4C 00 D5  JMP $D500
> 
  0  24 A=A5 X=00 Y=94 S=FF P=N-*----C PC=D500: A5 14     LDA $14     ;RTCLOK+2
> d d500
D500: A5 14     LDA $14     ;RTCLOK+2
D502: 8D C5 02  STA $02C5   ;COLOR1
D505: AD 1F D0  LDA $D01F   ;CONSOL
D508: 29 01     AND #$01
D50A: D0 F4     BNE $D500
D50C: 4C 77 E4  JMP $E477   ;COLDSV
D50F: A5 14     LDA $14     ;RTCLOK+2
D511: 8D C8 02  STA $02C8   ;COLOR4
D514: AD 1F D0  LDA $D01F   ;CONSOL
D517: 29 01     AND #$01
D519: D0 F4     BNE $D50F
D51B: A9 00     LDA #$00
D51D: 8D C8 02  STA $02C8   ;COLOR4
D520: AD 1F D0  LDA $D01F   ;CONSOL
D523: 29 01     AND #$01
D525: F0 F9     BEQ $D520
D527: A2 4F     LDX #$4F
D529: BD 35 B5  LDA $B535,X
D52C: 9D 00 06  STA $0600,X
D52F: CA        DEX
D530: 10 F7     BPL $D529
D532: 4C 00 06  JMP $0600
D535: AC C6 02  LDY $02C6   ;COLOR2
D538: A9 40     LDA #$40
> g
  0  26 A=A5 X=00 Y=94 S=FF P=N-*----C PC=D502: 8D C5 02  STA $02C5   ;COLOR1
> d d500
D500: A5 14     LDA $14     ;RTCLOK+2
D502: 8D C5 02  STA $02C5   ;COLOR1
D505: AD 1F D0  LDA $D01F   ;CONSOL
D508: 29 01     AND #$01
D50A: D0 F4     BNE $D500
D50C: 4C 77 E4  JMP $E477   ;COLDSV
D50F: A5 14     LDA $14     ;RTCLOK+2
D511: 8D C8 02  STA $02C8   ;COLOR4
D514: AD 1F D0  LDA $D01F   ;CONSOL
D517: 29 01     AND #$01
D519: D0 F4     BNE $D50F
D51B: A9 00     LDA #$00
D51D: 8D C8 02  STA $02C8   ;COLOR4
D520: AD 1F D0  LDA $D01F   ;CONSOL
D523: 29 01     AND #$01
D525: F0 F9     BEQ $D520
D527: A2 4F     LDX #$4F
D529: BD 35 B5  LDA $B535,X
D52C: 9D 00 06  STA $0600,X
D52F: CA        DEX
D530: 10 F7     BPL $D529
D532: 4C 00 06  JMP $0600
D535: AC C6 02  LDY $02C6   ;COLOR2
D538: A9 40     LDA #$40
> g
  0  29 A=A5 X=00 Y=94 S=FF P=N-*----C PC=5462: 00        BRK
> d
5462: 00        BRK
5463: 00        BRK
5464: 00        BRK
5465: 00        BRK
5466: 00        BRK
5467: 00        BRK
5468: 00        BRK
5469: 00        BRK
546A: 00        BRK
546B: 00        BRK
546C: 00        BRK
546D: 00        BRK
546E: 00        BRK
546F: 00        BRK
5470: 00        BRK
5471: 00        BRK
5472: 00        BRK
5473: 00        BRK
5474: 00        BRK
5475: 00        BRK
5476: 00        BRK
5477: 00        BRK
5478: 00        BRK
5479: 00        BRK
> d d500
D500: A5 14     LDA $14     ;RTCLOK+2
D502: 8D C5 02  STA $02C5   ;COLOR1
D505: AD 1F D0  LDA $D01F   ;CONSOL
D508: 29 01     AND #$01
D50A: D0 F4     BNE $D500
D50C: 4C 77 E4  JMP $E477   ;COLDSV
D50F: A5 14     LDA $14     ;RTCLOK+2
D511: 8D C8 02  STA $02C8   ;COLOR4
D514: AD 1F D0  LDA $D01F   ;CONSOL
D517: 29 01     AND #$01
D519: D0 F4     BNE $D50F
D51B: A9 00     LDA #$00
D51D: 8D C8 02  STA $02C8   ;COLOR4
D520: AD 1F D0  LDA $D01F   ;CONSOL
D523: 29 01     AND #$01
D525: F0 F9     BEQ $D520
D527: A2 4F     LDX #$4F
D529: BD 35 B5  LDA $B535,X
D52C: 9D 00 06  STA $0600,X
D52F: CA        DEX
D530: 10 F7     BPL $D529
D532: 4C 00 06  JMP $0600
D535: AC C6 02  LDY $02C6   ;COLOR2
D538: A9 40     LDA #$40
> 

18

(1,753 odpowiedzi, napisanych Fabryka - 8bit)

Rozumiem.
Zawsze stronę D5XX mogę zrobić tak, że na początku dam sobie tablicę skoków. I w każdym "minibanku" te skoki będą identyczne. Więc przełączanie tych minibanków po D5XX nie wpłynie na powroty itp.

Bardzo ciekawy ten xBIOS :)

@xxl

Jak już jesteś na linii to mam kilka pytań związanych z xBIOSem. Nie znam go a interesuje mnie sprawa obsługi cartridgeów.
1. Czy xBIOS umiałby potraktować pamięć carta jak sektory dyskietek ale z dziurami? Czyli np. z banku 8kB tylko połowa jest na te sektory a druga połowa to coś tam.

2. Czy biblioteki xBIOS umiałby się przecisnąć przez okno $D500-$D5FF. Chodzi mi, że jakbym zrobił takiego carta co przy zapisie bankuje jak zwykły Maxflash ale przy odczycie to tam w tym zakresie pojawi się normalny kod dla CPU to czy xBIOS dało by się ogarnąć w tych 256bajtach (ten zakres też mogłyby być bankowany)? Zmierzam do tego, żeby mając cart w ogóle nie używać pamięci RAM (no może stos).

20

(37 odpowiedzi, napisanych Fabryka - 8bit)

No ale skoro wiadomo w jakiej fazie jest PHI2 względem OSC, to przecież RAS i CAS jest stały względem OSC? Jak pływa to w skutek niedoskonałości. To ja bym olał wejście PHI2 do tego "zamiennika".

Dawniej technicznie był kłopot, że zegar powiedzmy 228MHz to poza zasięgiem. Teraz względem takiego zegarka zwykłe dzielniki (liczniki) zrobią to co kiedyś wypadało na przesunięciach fazowych.

0000000011111111 - to jest jakiś bazowy zegar
0101010101010101 - to po PLL x8
0123456789ABCDEF - to jest zwykły licznik 4 bitowy
0000111111110000 - a to przesunięcie -90 stopni (od fazy4 do fazyB)
0000000000001111 - a to przesunięcie +90 stopni z wypełnieniem 25%

Ja nie wiem czy by to zwykłym GALem nie obskoczył (oprócz tego multipleksera adresów).

21

(37 odpowiedzi, napisanych Fabryka - 8bit)

Kumam. Ale taki trik. Mam FPGA z wewnętrznym PLL. Niech będzie MAX10-tka. Obok niego mam oscylator 14.XXX (osobny, nie ten ATARowski). Sygnał wpuszczam na FPGA gdzie w środku mnożę PLLką niech będzie x16. Powstaje mi wewnętrzny zegar 224,XXMHz. Następnie najprościej jak się da maszyna stanu, liczona do 16.
Dla 0 wyjścia takie i takie.
Dla 1 ... itd.
Dla 15 ..
Wtedy nie potrzeba mi CLK_IN CLK_OUT PHI2. A OSC i wszystko co FREDDIE kontroluje ma zbocza żylety. Przesunięcia fazowe załatwia mi właśnie to zliczanie do 16 (ale może być większe przecież).

Czy wtedy PHI2 będzie stały w fazie (bo rozumiem, że zbocze SALLY jakoś tam zepsuje)?

22

(37 odpowiedzi, napisanych Fabryka - 8bit)

Technicznie: Czy ktoś kiedyś wieszał się jakimś naprawdę wypasionym oscyloskopem na CLK_IN CLK_OUT PH0 i PH2?
Chodzi mi o wyłapanie niuansów, co robi takie krzywe zbocza i lekko pływające w fazie (przynajmniej u mnie to tak wyglądało na gnieździe carta).
Chodzi o tego "FREDDIEGO"?

No bo jak te Freddie padają (a ja mam też 65XE) to może trzeba by zrobić taki wypełniacz PRO na bazie konkretnego FPGA z PLLami żyleta?

Czy:
CLK_IN
CLK_OUT
OSC
FPHI0
PHI0
PHI1
PHI2
To wszystkie zegary ATARI?

23

(37 odpowiedzi, napisanych Fabryka - 8bit)

Matko. Czytam z zainteresowaniem, bo zastanawiałem się jak sobie poprawić PHI2 na złączu carta, bo tak na oko oscyloskopu to on jest w fazie nijakiej z wypełnieniem dziwacznym. Kiedyś PLLem poprawiłem fazę (na minus) CLK dla HDMI (pixelclock74MHz) lecącego drutem przez slipringa. PLLka robi to w trybie basic przy minimalnej wiedzy operatora.

No ale tutaj jakaś masakra jest, przecież te zegary latają po wszystkich układach i każdy coś w nich grzebie. To jak na końcu cart ma się dobrze wystawić na magistrali i dla CPU i ANITCa i GTIA to bez szans jest gmeranie przy tym. To cud, że to w ogóle działa :/

24

(7 odpowiedzi, napisanych Programowanie - 8 bit)

OK sprawdziłem :)
Są plusy i minusy.
Puszczenie ładowania z jednym normalnym VBLANK powoduje, że rejestry ładnie się odtwarzają i gra wczytuje się z normalną niebieską ramką (tak jak z kasety czy dyskietki). PLUS :)

Jeżeli ANTIC patrzył na A000-BFFF to przełączenie banków puszcza ANTICa w maliny :/ MINUS

Nie zawiesiło się na moich przykładach, ale to kwestia prawdopodobieństwa.
Raczej nie ma szans, żeby podczas wczytywania stabilnie utrzymać czołówkę jeżeli siedzi na A000-BFFF.

No można też tak jak zrobiłem w ATR2CAR, że wszelkie odczyty zaczynają się na końcu obrazu, wtedy bankowanie nie miga. Ale to bardzo zmniejsza transfer. Więc chyba lepiej po CRITIC wyłączyć DMA i ładować binarkę na pełnym speedzie. W końcu XEX to chcemy jak najszybciej uruchomić i czarny ekran pomiędzy fazami ładowania nie taki tragiczny.

25

(7 odpowiedzi, napisanych Programowanie - 8 bit)

Może być też problem. Chodzi o DL pod bankami carta.

Procedura wygląda tak:
1. Włącza się cart, odkładam na stos DL kolory itd. Czyli to co zmieniam. (Niektóre XEXy zakładają, że edytor jest skonfigurowany więc trzeba im to odtworzyć przed ucurhomieniem)
2. Ustawiam DL na carta bo tam jest menu itp.
3. "Operator" wybiera grę
4. Biorę ze stosu oryginalne DL itd. Ale wyłączam DMA (!)
5. [Błąd] od razu włączam CRITIC - a to powoduje, że te cienie (oryginalne odtworzone z procedury boot) nie zdążą się przepisać więc w tle są te co pokazują na carta (ale jeszcze tragedii nie ma)
6. Jeżeli XEX idzie w jednym bloku to dociągnie na tym wyłączonym DMA (wtedy nie ma problemu)
7. Gdy wykryję koniec pliku to wyłączam CRITIC ustawiam TRIG3 i skaczę do RUNAD (i super)
8. Gdy wykryję INITAD to robię tak. Wyłączam CRITIC ustawiam TRIG wyłączam CARTA i przekazuję skok do INITAD. Jak procedura wraca włączam CRITIC i jadę dalej [Błąd bo jak proceudrka coś ruszała przy DL jakieś czołówki to ten CRITIC jest fatalny]
A najgorszy przypadek, jak procedura INIAD włączy DMA, ANTIC patrzy na DL na adresy na carcie lub pod cartem (najcześciej :/), ale przecież podczas wczytywania ja przełączam banki. No to jak podmienię BANK na który patrzy ANTIC to czort wie gdzie on potem trafi z adresami, wskaźnikami do pamięci itd. Zawsze przed zawieszeniem obraz przez chwilę migał.

Roboczy loader w załączniku (na razie tyle mam). A,B,C.. wybiera grę. Dowolny klawisz losuję nam grę (tego chyba nie ma nikt). Co ciekawe loader z MaxflashStudio nie potrafi załadować Hacker.xex. Nie wnikałem dlaczego, u mnie to łyka. Dobrze idą mi gry co idą partiami (Szpiedzy oraz Scorch). Może dlatego, że zabieram tylko 21 bajtów z pamięci RAM (tam gdzie stos, ale na jego końcu więc kompresory lecą OK).

Loader będzie dla MAXFLASH (na tym na razie bazuję bo najtrudniejsze), S-XEGS i RAMCART. Program jest uruchamiany z konsoli (skompilowanej na... wszystko co ma gcc) a menu pobiera z pliku TXT (tak przyszłościowo, żeby własne zestawy robić przez serwer www ;) )