1

Garry (Rybags z AtariAge) prosil mnie abym przedstawil jego prace na naszym forum

zapewne wiele osob widzialo juz ten watek na AtariAge, a moze nawet chcialo by moze cos sprobowac z tematem zrobic dalej

tymczasem z tad mozna pobrac binarke programiku wykozystujacego ta technike

sama technika nie jest skomplikowana, a jako ze urzadzenia typu TV sa standardowo przystosowane do wyswietlania takiego obrazu nie jest to tak uciazliwe jak w przypadku zwyklego interlace w ktorym chodzi o wieksza liczbe kolorow

polaczenie tej techniki z vbxe moze dac nam ladne 640x480 w 16 kolorach - a to jakby troche wiecej niz moze zdzialac ST czy STE w tym temacie

do pelni szczescia brakuje juz tylko karty turbo, ale to tez nie na dlugo...

A to kod, ktory mozna wykozystac do wlasnych prob wykozystania tej techniki:

;
; Initialization routine.  Call once Display List is set up
; Display List should have a blank line with DLI at the top
; and a Mode 2,3 or F line with DLI as it's last display instruction
;
    lda #0
    sta nmien
    ldx #<vblank
    ldy #>vblank
    stx $222
    sty $223
    lda #$40
    sta nmien
;    lda pactl
;    and #$fb
;    sta pactl
;    lda #$80
;    sta porta
;    lda pactl
;    ora #4
;    sta pactl
        rts
    .byte 0,0,0,0; filler
waitvc
    cmp vcount
    bne waitvc
    rts
vblank
    lda #$c0
    sta nmien
    ldx #<dli1
    ldy #>dli1
    stx $200
    sty $201
    lda 20
    lsr a
    bcc vblank2
    jmp vblankend
vblank2
    lda #$88
    jsr waitvc
; *****************************************************************************
; Important - don't modify anything between this comment and the next "Important" comment
; *****************************************************************************
    lda #0
    sta $d017
    sta $d018
    sta $d01a
    sta wsync
    sta porta
    ldy #3
    sta wsync
    sta wsync
; first line of vsync... half line at blanking level, second half at sync level
    nop; 105
    sty dmactl; 109
    ldx #7; 111
; Refresh cycles 26 30 34 38 42 46 50 54 58
vbwait1
    dex
    bne vbwait1; 5*X-1=34=31 (+2 Ref)= 33
    ldx #3; 36 (1)
    nop; 39 (1)
    nop; 41
    nop; 44 (1)
    nop; 47 (1)
    nop; 49
    sta dmactl; 55 (2)
    nop; 57
    stx vscount; 62 (1)
    ldx #7; 63
; Refresh cycles 26 30 34 38 42 46 50 54 58
vbloop1
vbwait3
    dex
    bne vbwait3; 5*X-1 = 34 = 97,
    sty dmactl; 101 get HSync pulses back in normal order
    nop; 103
    nop; 105
    nop; 107
    sta dmactl; 111
    dec vscount; 116 = 2
    beq vsyncend; 4
    ldx #5; 6
vbwait2
    dex
    bne vbwait2; 5*X-1 = 24 (+ 2 Ref) = 32
    ldx #6; 35 (1)
    nop; 37
    nop; 40 (1)
    nop; 43 (1)
    nop; 45
    sty dmactl; 51 (2)
    nop; 53
    sta dmactl; 59 (2)
    nop; 61
    nop; 63
    nop; 65
    jmp vbloop1; 68
; Refresh cycles 26 30 34 38 42 46 50 54 58
vsyncend
    lda #1
    jsr waitvc
vblankend
; *****************************************************************************
; Important - don't modify anything between this and the previous "Important" comment
; *****************************************************************************
    lda sdmctl
    sta savesdmctl
    lda #$20
    sta sdmctl
;    lda #$80
    sta wsync
;    sta porta
; Following NOPs just padding for patches etc. Can be safely removed
    .byte 234,234,234,234
    .byte 234,234,234,234
    .byte 234,234,234,234
    jmp $e45f
savesdmctl .byte 0
; Following zeros just padding
    .word 0,0,0,0,0,0,0,0
dli1
    pha
    lda savesdmctl
    sta sdmctl
    sta wsync
    sta dmactl
    lda #<dli2
    sta $200
    lda #>dli2
    sta $201
    pla
    rti
dli2
    pha
    lda #0
    sta wsync
    sta dmactl
    pla
    rti

Jeszcze notka od Garrego:

For some reason the process of saving SDMCTL before the Stage 2 VBlank, then restoring it later would sometimes get messed up and you'd wind up with a blank screen.
I just fixed it by hardcoding the first DLI to always store #$22 in DMACTL.

The proper fix would be to just save the value when calling the init routine, then load the value from the saved copy in the first DLI. I implemented the save/restore thing to cater for values other than the default $22. The entire clumsy process has to be done that way because you need the screen left blank in the offscreen areas to avoid corruption, then you need Display List access still (value = $20) so that the first DLI will occur.

For the source I release, I'll be sure to implement the "proper" fix.

przechodze na tumiwisizm

2 Ostatnio edytowany przez pavros (2009-06-05 13:11:03)

Ha! Tak czulem, ze mozna programowo wymusic interlace w Atarce. Tropem bylo to tajemnicze zrywanie syncronizacji gdy ostatnia 240-ta linia ekranu jest w hi-res (2,3 lub F Antica). Mam nadzieje, ze Tebe dorzuci mozliwosc wykorzystania interlace w G2F.

3

jaka jest różnica w porównaniu ze standardowym interlacem gdzie przęłączamy dwa obrazu co ramke (obie klatki obrazu wykorzystują przeplot linii) ?

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

4 Ostatnio edytowany przez seban (2009-06-05 18:51:26)

różnica jest taka że gościowi udało się tak namieszać GTIA że dekoder synchronizacji w monitorze/TV faktycznie (tak jak jest to w prawdziwym obrazie PAL) w nieparzystych klatkach przesuwa cały obraz o 0,5 linii trybu ANTIC $0F w dół. czyli faktycznie można uzyskać prawdziwy przeplot (nie szybkie rysowanie w tym samym miejscu dwa razy) ale masz linie parzyste i nieparzyste (są dwa razy cieńsze). Na emu nic nie widać potrzebny real hardware.

No jestem pod wrażeniem i uporem gościa. Gość prawdopodobnie wykorzystał fakt iż GTIA gdy ma w ostatniej linii $0F normalnie zrywała synchronizację  i efektem był taki biały pasek. Prawdopodobnie GTIA w tym momencie na wyjściu generuje napięcie odpowiadające "blanking level" (DMACT=$03) a gdy DMACTL=$00 to robi się na wyjściu napięcie odpowiadające SYNC_LEVEL. Rybags ręcznie generuje serię impulsów synchronizacji odpowiadającej przełączeniu się monitora/TV na ramki nieparzyste (normalnie GTIA generuje tylko klatki jednego typu, chyba parzyste).

Czyli upraszczając dzięki Garry-emu macie do dyspozycji tryby real-interlace takie jak np. Amiga (w trybach x512) z prawdziwymi nieparzystymi i parzystymi liniami :) no chylę czoła przed gostkiem! SZACUN!

o PAL i Sync Pulses trochę jest tu: http://martin.hinner.info/vga/pal.html (sekcja PAL B/G/D/K/I, Timing)


A tutaj dokładna różnica pomiędzy impulsami synchronizacji pomiędzy klatkami parzystymi a nieparzystymi:

http://www.kolumbus.fi/pami1/video/pal.gif

RYBAGS! GREAT WORK! :D

5

Niesamowite! A co na to powie Electron? VBXE to zrealizuje?

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

6

Co do VBXE to sync pulses jest brany z GTIA myślę że można to bez większych problemów wykorzystać ten manewr z VBXE :) przełączając tylko parę rejestrów VBXE podczas VBL tak jak pisał Candle udałoby się pewnie zrobić 640x480 :)

7

fantastyczna sprawa, trzeba to bedzie kiedys wykorzystac...

swoja droga to chyba najciekawsze 'odkrycie' mozliwosci malego atari!

http://atari.pl/hsc/ad.php?i=1.

8

A ktos kiedys mowil ze z chipow w atari wycisnieto juz wszystko :)

9

kolejny BUG GTIA który daje fantastyczne możliwości :) Wykorzystanie tego iż GTIA przestaje generować poprawne imp. synchronizacji i aby syntezować je ręcznie był fenomenalny :)

10

Rybagsowi należy się wielki frasunek, jak się mówiło na Quaście 2003. Odkrycie co najmniej na miarę HIPa.

Obrazek zamieszczony przez Sebana jest dla mnie mało czytelny. Bardziej przemawia do mnie kolejny z tego artykułu:

http://martin.hinner.info/vga/pal_tv_diagram_interlace.jpg

https://www.youtube.com/watch?v=jofNR_WkoCE

11 Ostatnio edytowany przez seban (2009-06-05 21:22:42)

dlatego podałem linka to strony zawierającej pokazane właśnie rysunki, podając również sekcję w której one się znajdowały :D Tyle że te rysunki nie pokazują tak dokładnie co się dzieje ;) Najprostszym wytłumaczeniem jest po prostu cytat fragmentu z omawianej strony:

Vertical sync is obtained from the last few and first lines of each field. These lines contain a series of special sync pulses which differ on alternate fields: -

The format for field 1 (starting at line 623.. ends at line 5 inclusive):

    * 6 Pre-equalizing pulses.. 5 long sync pulses... 5 Post-equalizing pulses.

The format for field 2 (starting at line 311.. ends at line 317 inclusive):

    * 5 Pre-equalizing pulses.. 5 long sync pulses... 4 Post-equalizing pulses.

12

No bardzo fajne, dawno czegoś równie ciekawego na Atarkę nikt nie zrobił...
To teraz może jeszcze wymyśli ktoś przesuwanie w poziomie? :)

Ale mam 1 poważne pytanie - czy to działa? testował ktoś to na różnych maszynkach? I jeśli działa - jakie są szansę na emulację tego? :)

: 404. Stopka not found

13 Ostatnio edytowany przez seban (2009-06-05 23:34:41)

Nie przyglądałem się temu na oscyloskopie co generuje procedura Rybags-a, trzeba by jednak to zrobić i zobaczyć na ile zgodne jest to z tym co standard PAL przewiduje. Ale jeżeli jego karta TV w PC i jakiś monitor CRT złapały co trzeba i dokonały detekcji ramek parzystych i nieparzystych to jest spora szansa że będzie to działać globalnie na większości monitorów i TV. Dekodery PAL są mocno głupoto-odporne z racji że musiały sobie kiedyś radzić z kiepskim sygnałem złapanym z powietrza :) (analogowa telewizja naziemna) Tolerują więc większość rozbieżności w sygnale PAL.

Co do testów to jak się pozrastam i wstanę z łóżka to sprawdzę dokładnie ;) A tymczasem tutaj obrazek pokazany przez Rybags-a na Atari Age:

http://seban.slight.pl/aa/rybags_480i.jpg

zwróćcie uwagę na wygląd scroll-a :) To sugeruje że to istotnie działa ;)

14

Garry puszczal oscylogramy na AtariAge, trzeba tylko pogrzebac w starszych tematach

przechodze na tumiwisizm

15

Greetings all.  I've used Google Translate to read some of your posts with some success but I won't bother trying to use it to communicate in Polish (I've read it's not so great for that).

I started experimenting with the "Scanline 240 bug" which is a design fault in ANTIC, back around the start of this year.  I had thought for a long time that somehow it might be able to be exploited to give us an interlaced signal.  In fact in the past I'd tried various things but they mainly involved simply triggering the bug every second frame.

My first efforts involved just changing Color Register COLPF1 to see if anything could be achieved there... I soon found that to be the wrong approach.

The second approach I tried (with almost immediate success) was just a program that plugged some predefined Random numbers into DMACTL 3 times per scanline in the scanlines around VSync.
Once success was attained, the next step was to investigate just what I was doing... for that I used the PC soundcard for a while to read the video signal but 200 KHz sampling just wasn't enough so I had to go and buy and oscilloscope.

The whole interlace thing is possible thanks to Antic's little bug:  If the last line possible for the normal display is a 320 pixel mode, or if you interrupt a 320 pixel mode by turning off Playfield DMA at the right time (ie before the next DList Instruction is able to be read), then you trigger the bug.

What the bug means is that the AN2 line from Antic gets stuck on "1", which means that we have some control in the offscreen area over GTIAs behaviour so far as what it displays and when it sends HSync pulses.  We can simply force AN2 to toggle between 1 and 0 by changing the Playfield Width setting in Antic's DMACTL (typically bitsetting the lsbs to 00 or 11).

Just imagine the Playfield area if we're in "Widescreen" mode - pretty much within that area we can fool GTIA into sending a Sync Pulse.

During the 3 scanlines of VSync, we can also alter the signal.   What I do is the "simplest form" way I've discovered to force interlace.  The Atari by default doesn't create a standard VSync pulse train, however it seems it is sufficient for most TVs out there.

The standard Atari VSync signal actually does not contain pre or post equalisation pulses, and also doesn't use the half-scanline pulsewidth VSync pulses.  I've verified all this many times with an oscilloscope.

I earlier did a version that generates all the pre and post signals as well as the half-scanline width VSync pulses - a right mess of a program with lots of NOPs - I canned that version and started from scratch again because it was messy code.

This latest one simply changes DMACTL back to Wide Playfield during what should be the first half scanline of the first line of VSync, which is sufficient to force the next field to be the 1/2 Atari scanline offset.

16

My mind boggles. Rybags, you bloody rule. Imagine we still have only PDP-11 - how bloody efficient would this hardware be nowadays (:

http://www.5oft.pl/

17

Jestem bardzo pozytywnie zaskoczony. Nie sądziłem, że w temacie standardowych możliwości graficznych atarki pojawi się coś tak rewolucyjnego, owszem, zakładałem, że ktoś parę ciekawych tricków wymyśli, ale ten może być rzeczywiście przełomem.

18

Rybags, you are great! This is real breakthrough. Congratulations!

19

Rybags this is the greatest discovery of last years! Your idea is brilliant! Big respect for you and your great work! This is another milestone that will achieve even greater graphics capabilities!

THANK YOU VERY MUCH FOR THAT! And also many thanks for your willingness to share knowledge and experience!

with big greetings
Seban / SLIGHT

20

OWNED. Congratulations, Rybags!

Hitler, Stalin, totalniak, SSman, NKWDzista, kaczor dyktator, za długo byłem w ChRL, wypowiadam się afektywnie.

21

czyli jest to sprzętowy interlace, mając tylko jedna klatkę obrazu włączając ten tryb uzyskamy interlace ?

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

22

łoł. No to szykuje się rewolucja :). Czyli jednak Atari jest lepsze od C64 :D

Kontakt: pin@usdk.pl

23

drewniany czueniu - miales watpliwosci? ;)
musze.se kabel dorobic, coby przerzucic toto na atarke i stestowac ;)

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep

24

jellonek: jeśli masz na myśli komp ode mnie to wystarczy Ci zwykły kabel COM null modem - ten DB9 w budzie to właśnie wyjście SIO2PC

na Atari810 (ten program do obsługi na PC, a nie stacja) pracowałem i łaziło miodnie, z Q-Megiem nawet UltraSpeeda rozpoznawało i "latało" z ponad 50kbit/s

25

mam na mysli kabel usb2rs232, albo pomysle o wyprowadzeniu z plyty w stacjonarnym kabla do atarki...

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep