English Amiga Board

English Amiga Board (https://eab.abime.net/index.php)
-   Coders. Asm / Hardware (https://eab.abime.net/forumdisplay.php?f=112)
-   -   Strange behavior when using blit queue in copper list (https://eab.abime.net/showthread.php?t=86698)

losso 09 April 2017 04:02

Strange behavior when using blit queue in copper list
 
1 Attachment(s)
Hi everyone,

I ran into a strange problem with my copper list blit queue. In WinUAE and on my Amiga 1200, everything runs as expected (objects get drawn, offscreen buffer gets cleared). However, on my Amiga 500, the effect soon begins to deteriorate, as can be seen here (24 sec into the video):

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

The only difference between the two versions is that the "fixed" one does two blitter-waits instead of one (i.e. $00010000 in the copper list). Boy, that took some time to isolate…

Regarding strange copper+blitter behavior, I only came across the COPJMP2-bug, but I'm not using any copper jumps.

I behaves as if the copper wait is unstable -- right after the WAIT instruction, new blitter register values get set early, and the current blit overwrites unwanted memory areas etc.

Is it good practice to use two consecutive blitter waits when you use a copper list for your blit queue? Or is my Amiga 500 (512KB trapdoor, Gotek) showing signs of subtle hardware failure? All other demos I tested while debugging this ran fine, but that may be coincidence.

Executables attached; I'd be interested if this happens on other machines as well.


Edit: Of course there might still be something stupid going on which just happens to look better with this workaround. I will try to provide a bare-minimum example instead of a binary blob, but not before Revision :). What I've tested so far:
  • accidentally accessing blitter registers on the main thread (found none)
  • using BLTPRI (no difference)
  • removing an unnecessary COPJMP I was using (triggered by the copper; no difference)
  • blitter register order (setting CONx and masks before PTH, no difference)
  • disabling debug features (keyboard control and serial output, no difference)
  • making sure the blit queue is completely written before the copper reaches it ($dff180-banging suggests it is)
  • doing just 1 blit, i.e. 1 object without clearing (that worked and led to the 2-WAIT workaround)
  • using copper NOPs around the copper WAIT In the copper (no difference)

Not tried out yet:
  • spurious interrupts (I'm using a copper interrupt, $dff180-banging at least does not look like it's called more than once a frame)
  • using a static blit queue (only indirectly by having the same objects without movement; started to glitch, too)

ross 09 April 2017 12:14

Hi losso,
surely you have to wait for someone with another Amiga 500 to ensure that it is not an issue of your.

Quote:

Originally Posted by losso (Post 1151301)
  • using copper NOPs around the copper WAIT In the copper (no difference)

I was going to suggest to try: CNOP BWAIT ($01fe $CAFE $0001 $0000)
but you have already done that :)

What is the result with an always satisfied WAIT then BWAIT
(like $0001 $fffe $0001 $0000)
or a 'merged' video/blitter wait (like a single $0001 $7ffE)?

Bye!
ross

Toni Wilen 09 April 2017 12:31

Does it work (or at least problem happens less regularly) if you modify some less "dangerous" blitter registers than BLTCON0/1 after copper blitter wait? (for example do BLTxMOD updates first)

Because blitter finished state gets set before final D write is done (which is still pipelined inside blitter), it may be possible that next copper move(s) (depending on number of bitplanes) happens before D write is done. I think I couldn't duplicate this reliably so I didn't bother to do logic analyzer tests to confirm it 100%.

OCS or ECS Agnus?

losso 09 April 2017 12:54

bpls
 
Thanks for the ideas. My results are:
  • WAIT+BWAIT: glitches
  • merged WAIT/BWAIT: glitches
  • setting modulos first: glitches

In the modulo-first case, the instructions are now:

Code:

000306a0: 0001 0000            ;  Wait for , ignore horizontal
                                ;  VP 00, VE 00; HP 00, HE 00; BFD 0
 000306a4: 0064 fffe            ;  BLTAMOD := 0xfffe
 000306a8: 0066 001e            ;  BLTDMOD := 0x001e
 000306ac: 0060 001e            ;  BLTCMOD := 0x001e
 000306b0: 0040 1bfa            ;  BLTCON0 := 0x1bfa
 000306b4: 0042 0000            ;  BLTCON1 := 0x0000
 000306b8: 0044 ffff            ;  BLTAFWM := 0xffff
 000306bc: 0046 0000            ;  BLTALWM := 0x0000
 000306c0: 0054 0003            ;  BPTDPTH := 0x0003
 000306c4: 0056 6aa2            ;  BLTDPTL := 0x6aa2
 000306c8: 0048 0003            ;  BLTCPTH := 0x0003
 000306cc: 004a 6aa2            ;  BLTCPTL := 0x6aa2
 000306d0: 0050 0003            ;  BLTAPTH := 0x0003
 000306d4: 0052 31e0            ;  BLTAPTL := 0x31e0
 000306d8: 0058 1585            ;  BLTSIZE := 0x1585

SysInfo reports ECS AGNUS - 1Meg

Edit: Running in 4 bitplanes, by the way

ross 09 April 2017 12:56

Hi Toni, so a simple delay suffice?
losso inserted a CNOP (4 cycles) and do not work..
If a 6 cycles delay is enough then $0001 $fffe $0001 $000 should work...

Bye,
ross

[EDIT: too late :)]

ross 09 April 2017 13:19

mmh... thinking better, if like Toni said blitter finished state gets set before final D write then a wait need to be after,
so BWAIT+WAIT ($0001 $0000 $0001 $fffe)..

Can You test?

Bye,
ross

meynaf 09 April 2017 13:27

Doing two blitter waits might be necessary ; see comments about Agnus bugs in doc of graphics.library/WaitBlit.

ross 09 April 2017 13:33

Quote:

Originally Posted by meynaf (Post 1151345)
Doing two blitter waits might be necessary ; see comments about Agnus bugs in doc of graphics.library/WaitBlit.

Hi meynaf, i can remember bad, but what you are referring is not an old Agnus revision (A1000 OCS) bug?

Bye,
ross

losso 09 April 2017 14:09

Interesting... it seems $00010000 $0001fffe as suggested by ross does the trick, too.

This works fine (posting full copperlist just in case):

(EDIT: Just noticed there is only 1 blob in here, I captured the wrong state in WinUAE. However, on the machine it works with all balls activated.)

Code:

000105bc: 0201 fffe            ;  Wait for vpos >= 0x02 and hpos >= 0x00
                                ;  VP 02, VE 7f; HP 00, HE fe; BFD 1
 000105c0: 009c 8010            ;  INTREQ := 0x8010
 000105c4: 0120 0001            ;  SPR0PTH := 0x0001
 000105c8: 0122 05b8            ;  SPR0PTL := 0x05b8
 000105cc: 0124 0001            ;  SPR1PTH := 0x0001
 000105d0: 0126 05b8            ;  SPR1PTL := 0x05b8
 000105d4: 0128 0001            ;  SPR2PTH := 0x0001
 000105d8: 012a 05b8            ;  SPR2PTL := 0x05b8
 000105dc: 012c 0001            ;  SPR3PTH := 0x0001
 000105e0: 012e 05b8            ;  SPR3PTL := 0x05b8
 000105e4: 0130 0001            ;  SPR4PTH := 0x0001
 000105e8: 0132 05b8            ;  SPR4PTL := 0x05b8
 000105ec: 0134 0001            ;  SPR5PTH := 0x0001
 000105f0: 0136 05b8            ;  SPR5PTL := 0x05b8
 000105f4: 0138 0001            ;  SPR6PTH := 0x0001
 000105f8: 013a 05b8            ;  SPR6PTL := 0x05b8
 000105fc: 013c 0001            ;  SPR7PTH := 0x0001
 00010600: 013e 05b8            ;  SPR7PTL := 0x05b8
 00010604: 0180 0112            ;  COLOR00 := 0x0112
 00010608: 0182 0112            ;  COLOR01 := 0x0112
 0001060c: 0184 0248            ;  COLOR02 := 0x0248
 00010610: 0186 0248            ;  COLOR03 := 0x0248
 00010614: 0188 0112            ;  COLOR04 := 0x0112
 00010618: 018a 0112            ;  COLOR05 := 0x0112
 0001061c: 018c 0248            ;  COLOR06 := 0x0248
 00010620: 018e 0248            ;  COLOR07 := 0x0248
 00010624: 0190 068a            ;  COLOR08 := 0x068a
 00010628: 0192 068a            ;  COLOR09 := 0x068a
 0001062c: 0194 0acd            ;  COLOR10 := 0x0acd
 00010630: 0196 0acd            ;  COLOR11 := 0x0acd
 00010634: 0198 068a            ;  COLOR12 := 0x068a
 00010638: 019a 068a            ;  COLOR13 := 0x068a
 0001063c: 019c 0acd            ;  COLOR14 := 0x0acd
 00010640: 019e 0acd            ;  COLOR15 := 0x0acd
 00010644: 0100 0200            ;  BPLCON0 := 0x0200
 00010648: 008e 2ca1            ;  DIWSTRT := 0x2ca1
 0001064c: 0090 2ca1            ;  DIWSTOP := 0x2ca1
 00010650: 0092 0048            ;  DDFSTRT := 0x0048
 00010654: 0094 00c0            ;  DDFSTOP := 0x00c0
 00010658: 1b01 fffe            ;  Wait for vpos >= 0x1b and hpos >= 0x00
                                ;  VP 1b, VE 7f; HP 00, HE fe; BFD 1
 0001065c: 00e4 0001            ;  BPL2PTH := 0x0001
 00010660: 00e6 bd14            ;  BPL2PTL := 0xbd14
 00010664: 00ec 0001            ;  BPL4PTH := 0x0001
 00010668: 00ee bd3c            ;  BPL4PTL := 0xbd3c
 0001066c: 00e0 0001            ;  BPL1PTH := 0x0001
 00010670: 00e2 c5bc            ;  BPL1PTL := 0xc5bc
 00010674: 00e8 0001            ;  BPL3PTH := 0x0001
 00010678: 00ea c5dc            ;  BPL3PTL := 0xc5dc
 0001067c: 01fe 0000            ;  NO-OP(NULL) := 0x0000
 00010680: 01fe 0000            ;  NO-OP(NULL) := 0x0000
 00010684: 0106 0c00            ;  BPLCON3 := 0x0c00
 00010688: 01fc 0000            ;  FMODE := 0x0000
 0001068c: 0100 4200            ;  BPLCON0 := 0x4200
 00010690: 010a 0030            ;  BPL2MOD := 0x0030
 00010694: 0108 0020            ;  BPL1MOD := 0x0020
 00010698: 0102 0000            ;  BPLCON1 := 0x0000
 0001069c: 2801 fffe            ;  Wait for vpos >= 0x28 and hpos >= 0x00
                                ;  VP 28, VE 7f; HP 00, HE fe; BFD 1

; start blitting

 000106a0: 0001 0000            ;  Wait for , ignore horizontal
                                ;  VP 00, VE 00; HP 00, HE 00; BFD 0
 000106a4: 0001 fffe            ;  Wait for  hpos >= 0x00
                                ;  VP 00, VE 7f; HP 00, HE fe; BFD 1
 000106a8: 0064 fffe            ;  BLTAMOD := 0xfffe
 000106ac: 0066 001e            ;  BLTDMOD := 0x001e
 000106b0: 0060 001e            ;  BLTCMOD := 0x001e
 000106b4: 0040 8bfa            ;  BLTCON0 := 0x8bfa
 000106b8: 0042 0000            ;  BLTCON1 := 0x0000
 000106bc: 0044 ffff            ;  BLTAFWM := 0xffff
 000106c0: 0046 0000            ;  BLTALWM := 0x0000
 000106c4: 0054 0001            ;  BPTDPTH := 0x0001
 000106c8: 0056 659e            ;  BLTDPTL := 0x659e
 000106cc: 0048 0001            ;  BLTCPTH := 0x0001
 000106d0: 004a 659e            ;  BLTCPTL := 0x659e
 000106d4: 0050 0001            ;  BLTAPTH := 0x0001
 000106d8: 0052 2230            ;  BLTAPTL := 0x2230
 000106dc: 0058 1b85            ;  BLTSIZE := 0x1b85
 000106e0: 0001 0000            ;  Wait for , ignore horizontal
                                ;  VP 00, VE 00; HP 00, HE 00; BFD 0
 000106e4: 0001 fffe            ;  Wait for  hpos >= 0x00
                                ;  VP 00, VE 7f; HP 00, HE fe; BFD 1
 000106e8: 0040 0100            ;  BLTCON0 := 0x0100
 000106ec: 0066 000c            ;  BLTDMOD := 0x000c
 000106f0: 0042 0000            ;  BLTCON1 := 0x0000
 000106f4: 0054 0002            ;  BPTDPTH := 0x0002
 000106f8: 0056 39c6            ;  BLTDPTL := 0x39c6
 000106fc: 0058 6e0e            ;  BLTSIZE := 0x6e0e
 00010700: 0001 0000            ;  Wait for , ignore horizontal
                                ;  VP 00, VE 00; HP 00, HE 00; BFD 0
 00010704: 0001 fffe            ;  Wait for  hpos >= 0x00
                                ;  VP 00, VE 7f; HP 00, HE fe; BFD 1
 00010708: ffff fffe            ;  Wait for vpos >= 0xff and hpos >= 0xfe
                                ;  VP ff, VE 7f; HP fe, HE fe; BFD 1
                                ;  End of Copperlist

While this one glitches/crashes (using normal wait, but taking care to set modulos first):

Code:

000105bc: 0201 fffe            ;  Wait for vpos >= 0x02 and hpos >= 0x00
                                ;  VP 02, VE 7f; HP 00, HE fe; BFD 1
 000105c0: 009c 8010            ;  INTREQ := 0x8010
 000105c4: 0120 0001            ;  SPR0PTH := 0x0001
 000105c8: 0122 05b8            ;  SPR0PTL := 0x05b8
 000105cc: 0124 0001            ;  SPR1PTH := 0x0001
 000105d0: 0126 05b8            ;  SPR1PTL := 0x05b8
 000105d4: 0128 0001            ;  SPR2PTH := 0x0001
 000105d8: 012a 05b8            ;  SPR2PTL := 0x05b8
 000105dc: 012c 0001            ;  SPR3PTH := 0x0001
 000105e0: 012e 05b8            ;  SPR3PTL := 0x05b8
 000105e4: 0130 0001            ;  SPR4PTH := 0x0001
 000105e8: 0132 05b8            ;  SPR4PTL := 0x05b8
 000105ec: 0134 0001            ;  SPR5PTH := 0x0001
 000105f0: 0136 05b8            ;  SPR5PTL := 0x05b8
 000105f4: 0138 0001            ;  SPR6PTH := 0x0001
 000105f8: 013a 05b8            ;  SPR6PTL := 0x05b8
 000105fc: 013c 0001            ;  SPR7PTH := 0x0001
 00010600: 013e 05b8            ;  SPR7PTL := 0x05b8
 00010604: 0180 0112            ;  COLOR00 := 0x0112
 00010608: 0182 0112            ;  COLOR01 := 0x0112
 0001060c: 0184 0248            ;  COLOR02 := 0x0248
 00010610: 0186 0248            ;  COLOR03 := 0x0248
 00010614: 0188 0112            ;  COLOR04 := 0x0112
 00010618: 018a 0112            ;  COLOR05 := 0x0112
 0001061c: 018c 0248            ;  COLOR06 := 0x0248
 00010620: 018e 0248            ;  COLOR07 := 0x0248
 00010624: 0190 068a            ;  COLOR08 := 0x068a
 00010628: 0192 068a            ;  COLOR09 := 0x068a
 0001062c: 0194 0acd            ;  COLOR10 := 0x0acd
 00010630: 0196 0acd            ;  COLOR11 := 0x0acd
 00010634: 0198 068a            ;  COLOR12 := 0x068a
 00010638: 019a 068a            ;  COLOR13 := 0x068a
 0001063c: 019c 0acd            ;  COLOR14 := 0x0acd
 00010640: 019e 0acd            ;  COLOR15 := 0x0acd
 00010644: 0100 0200            ;  BPLCON0 := 0x0200
 00010648: 008e 2ca1            ;  DIWSTRT := 0x2ca1
 0001064c: 0090 2ca1            ;  DIWSTOP := 0x2ca1
 00010650: 0092 0048            ;  DDFSTRT := 0x0048
 00010654: 0094 00c0            ;  DDFSTOP := 0x00c0
 00010658: 1b01 fffe            ;  Wait for vpos >= 0x1b and hpos >= 0x00
                                ;  VP 1b, VE 7f; HP 00, HE fe; BFD 1
 0001065c: 00e4 0002            ;  BPL2PTH := 0x0002
 00010660: 00e6 3514            ;  BPL2PTL := 0x3514
 00010664: 00ec 0002            ;  BPL4PTH := 0x0002
 00010668: 00ee 353c            ;  BPL4PTL := 0x353c
 0001066c: 00e0 0001            ;  BPL1PTH := 0x0001
 00010670: 00e2 c5bc            ;  BPL1PTL := 0xc5bc
 00010674: 00e8 0001            ;  BPL3PTH := 0x0001
 00010678: 00ea c5dc            ;  BPL3PTL := 0xc5dc
 0001067c: 01fe 0000            ;  NO-OP(NULL) := 0x0000
 00010680: 01fe 0000            ;  NO-OP(NULL) := 0x0000
 00010684: 0106 0c00            ;  BPLCON3 := 0x0c00
 00010688: 01fc 0000            ;  FMODE := 0x0000
 0001068c: 0100 4200            ;  BPLCON0 := 0x4200
 00010690: 010a 0030            ;  BPL2MOD := 0x0030
 00010694: 0108 0020            ;  BPL1MOD := 0x0020
 00010698: 0102 0000            ;  BPLCON1 := 0x0000
 0001069c: 2801 fffe            ;  Wait for vpos >= 0x28 and hpos >= 0x00
                                ;  VP 28, VE 7f; HP 00, HE fe; BFD 1

; start blitting

 000106a0: 0001 0000            ;  Wait for , ignore horizontal
                                ;  VP 00, VE 00; HP 00, HE 00; BFD 0
 000106a4: 0064 fffe            ;  BLTAMOD := 0xfffe
 000106a8: 0066 001e            ;  BLTDMOD := 0x001e
 000106ac: 0060 001e            ;  BLTCMOD := 0x001e
 000106b0: 0040 8bfa            ;  BLTCON0 := 0x8bfa
 000106b4: 0042 0000            ;  BLTCON1 := 0x0000
 000106b8: 0044 ffff            ;  BLTAFWM := 0xffff
 000106bc: 0046 0000            ;  BLTALWM := 0x0000
 000106c0: 0054 0001            ;  BPTDPTH := 0x0001
 000106c4: 0056 dd9e            ;  BLTDPTL := 0xdd9e
 000106c8: 0048 0001            ;  BLTCPTH := 0x0001
 000106cc: 004a dd9e            ;  BLTCPTL := 0xdd9e
 000106d0: 0050 0001            ;  BLTAPTH := 0x0001
 000106d4: 0052 2230            ;  BLTAPTL := 0x2230
 000106d8: 0058 1b85            ;  BLTSIZE := 0x1b85
 000106dc: 0001 0000            ;  Wait for , ignore horizontal
                                ;  VP 00, VE 00; HP 00, HE 00; BFD 0
 000106e0: 0064 fffe            ;  BLTAMOD := 0xfffe
 000106e4: 0066 001e            ;  BLTDMOD := 0x001e
 000106e8: 0060 001e            ;  BLTCMOD := 0x001e
 000106ec: 0040 8bfa            ;  BLTCON0 := 0x8bfa
 000106f0: 0042 0000            ;  BLTCON1 := 0x0000
 000106f4: 0044 ffff            ;  BLTAFWM := 0xffff
 000106f8: 0046 0000            ;  BLTALWM := 0x0000
 000106fc: 0054 0001            ;  BPTDPTH := 0x0001
 00010700: 0056 d34e            ;  BLTDPTL := 0xd34e
 00010704: 0048 0001            ;  BLTCPTH := 0x0001
 00010708: 004a d34e            ;  BLTCPTL := 0xd34e
 0001070c: 0050 0001            ;  BLTAPTH := 0x0001
 00010710: 0052 3490            ;  BLTAPTL := 0x3490
 00010714: 0058 1485            ;  BLTSIZE := 0x1485
 00010718: 0001 0000            ;  Wait for , ignore horizontal
                                ;  VP 00, VE 00; HP 00, HE 00; BFD 0
 0001071c: 0040 0100            ;  BLTCON0 := 0x0100
 00010720: 0066 000c            ;  BLTDMOD := 0x000c
 00010724: 0042 0000            ;  BLTCON1 := 0x0000
 00010728: 0054 0001            ;  BPTDPTH := 0x0001
 0001072c: 0056 49c6            ;  BLTDPTL := 0x49c6
 00010730: 0058 6e0e            ;  BLTSIZE := 0x6e0e
 00010734: 0001 0000            ;  Wait for , ignore horizontal
                                ;  VP 00, VE 00; HP 00, HE 00; BFD 0
*00010738: ffff fffe            ;  Wait for vpos >= 0xff and hpos >= 0xfe
                                ;  VP ff, VE 7f; HP fe, HE fe; BFD 1
                                ;  End of Copperlist


Toni Wilen 09 April 2017 14:30

Can you duplicate it with "static" copper list? (Stop all movement calculations etc), it would make this much easier to check with logic analyzer.

Hmm.. Or perhaps A1000 Agnus busy bit fix didn't fix copper blit waits. Does anything change if you add one dummy copper move after BLTSIZE write but before the wait?

ross 09 April 2017 14:41

So it is just a problem of delay cycles.
Now you should understand if some blitter registers can be touched immediately after (a work for Toni ;)).

[EDIT]
@Toni: no demo use this technique?
I vaguely remember something of Spaceballs that performed a blitter rendering with a queue of precalculated instruction

:great

losso 09 April 2017 15:06

1 Attachment(s)
I tested the dummy-move-after-bltsize variant. I also removed the object movement. Unfortunately with a bob configuration that does not trigger the glitching in both versions.

However, I noticed something else: I left the keyboard controls in, and when you press "B" and "N" you change one ball's size, which does trigger the glitching.

Here, the two versions do behave differently:

static.exe: glitches hard, crashes
dummy.exe: glitches when switching sizes, then "stabilizes"

This can bee seen here: https://www.youtube.com/watch?v=5vk1PVVqyLg (when pressing "B" and "N", and "R" at the end to activate movement)

This smells hardware-ish to me, but I'm more confused than before.

(AFK now for today)

one last edit: also worth mentioning for the flickering in this: I'm using triple buffering

Toni Wilen 09 April 2017 17:40

Before I bother to examine it: it needs to be narrowed down to either:
a) all blits cause the problem, all the time.
b) there is only single blit/wait/write to blit registers that usually/always causes the problem.

Without this it gets too random, especially if it requires copper list change to trigger it and only one (or few) blits trigger it. All the unknown variables must be removed first.

Possible debugging options:

Write to background color before BLTSIZE write, then reset it immediately after WAIT. Assuming all blits are not too short, it should be easy to see if the problem is BLTSIZE+WAIT combination always/sometimes thinking that blit hasn't yet been started.

To prevent crashes (less annoying to debug), add extra WAIT after the color change.

Then reduce variables until only the problem remains :)

(It is guaranteed I'll test this someday if no one else does it)

ross 09 April 2017 20:01

Quote:

Originally Posted by ross (Post 1151358)
@Toni: no demo use this technique?
I vaguely remember something of Spaceballs that performed a blitter rendering with a queue of precalculated instruction

Ok, finally remembered!
Was 'Mobile Destination Unknown' from The Gathering '93.
The demo stream precalculated frames (blitter fill-lists..) from disk, but actually use the CPU [to drive the blitter].
So not a good reference, sorry :rolleyes

Bye,
ross

meynaf 10 April 2017 08:50

Quote:

Originally Posted by ross (Post 1151348)
Hi meynaf, i can remember bad, but what you are referring is not an old Agnus revision (A1000 OCS) bug?

Bye,
ross

There are two bugs, actually. One is apparently old A1000 bug indeed, but the other is for "all revisions thru ECS".

Toni Wilen 10 April 2017 18:36

It does not appear to be that easy to duplicate.

WAIT some visible position
COLOR0=0f0
BLTSIZE=value
Copper blitter wait
COLOR0=000

Waits normally. (ECS Agnus). Number of planes also does not seem to have any effect (except blit speed changing).

ross 10 April 2017 19:38

Why not try something different? We have to get a precise syncronization and mantain blitter control..
We have BPLCON0==$4200 so we can wait $xxE1 even on V-line==$FF without losing Copper control.

So with $7fe1,$00fe we trigger blitter action if, and only if, we are at this precise position ($E0)at end of every line
(yes, you can possibly loss an entire line but with triple buffer I don't think is a problem, even better for CPU chip access..)
Then with DMA cycles explained:
$DE ($E0-2) 3rd copper WAIT cycle, awakening if h>=$E0 and blitter finished, practically only if H==$E0 ($E1-2 (odd) and $E2-2 ($E0==lost) is not awakening positions possible)
$DF (free cycle for blitter! -> final D write, blitter nasty required) (if DDFSTOP<$D8 as in our case)
$E0 lost
$E1 copper delayed cycle, MOVE 1st word fetch (address)
$E2 refresh/strobe
$00 ..next line.. MOVE 2st word fetch (data)
$01 refresh
..and so on..

Make sense?

Toni Wilen 10 April 2017 19:50

I want to solve this copper blitter wait problem first :)

ross 10 April 2017 21:49

2 Attachment(s)
Ok, made a version of "balls" with $7fe1,$00fe mod.
(attached bootable ADF).

No problem whatsoever in WinUAE (OCS, ECS, AGA, cycle exact).
Someone can test in real A500/+?

@Toni: if it's working (or minor glitch) then you can clarify many things about this copper wait bug :)

[EDIT: added blitter_nasty version]

Bye,
ross

Wrangler 11 April 2017 20:56

@ross: Hi - just tested both of those adfs on a real A500 (OCS) and they both work fine, no glitches.


All times are GMT +2. The time now is 21:59.

Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc.

Page generated in 0.04872 seconds with 11 queries