Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

z80: fetch opcode timing #61

Closed
WilfriedRabouin opened this issue Feb 21, 2022 · 1 comment
Closed

z80: fetch opcode timing #61

WilfriedRabouin opened this issue Feb 21, 2022 · 1 comment

Comments

@WilfriedRabouin
Copy link

You load the opcode during the M1/T2 cycle but what happens if (for some reasons) the data from the data bus changes during that cycle? Shouldn't the opcode be loaded during M1/T3 so you're sure the value is the good one?
Thank you for your great work btw! ;)

@floooh
Copy link
Owner

floooh commented Feb 21, 2022

Arguably yes, in the tracelog (from https://floooh.github.io/visualz80remix/) the instruction register (OP) is loaded between M1/T2 and M1/T3, but the data bus value already flips in M1/T2 (because the emulated memory system doesn't have any latency).

┌─────────┬────┬──────┬──────┬──────┬────┬────┬──────┬────┬──────┬────┬──────────────┐
│ Cycle/h │ M1 │ MREQ │ IORQ │ RFSH │ RD │ WR │ AB   │ DB │ PC   │ OP │ Asm          │
├─────────┼────┼──────┼──────┼──────┼────┼────┼──────┼────┼──────┼────┼──────────────┤
│     1/0 │ M1 │      │      │      │    │    │ 0000 │ 00 │ 0000 │ 00 │ LD SP,0030h  │
│     1/1 │ M1 │ MREQ │      │      │ RD │    │ 0000 │ 00 │ 0001 │ 00 │ LD SP,0030h  │
│     2/0 │ M1 │ MREQ │      │      │ RD │    │ 0000 │ 31 │ 0001 │ 00 │ LD SP,0030h  │
│     2/1 │ M1 │ MREQ │      │      │ RD │    │ 0000 │ 31 │ 0001 │ 00 │ LD SP,0030h  │
│     3/0 │    │      │      │ RFSH │    │    │ 0000 │ 31 │ 0001 │ 31 │ LD SP,0030h  │
│     3/1 │    │ MREQ │      │ RFSH │    │    │ 0000 │ 31 │ 0001 │ 31 │ LD SP,0030h  │
│     4/0 │    │ MREQ │      │ RFSH │    │    │ 0000 │ 31 │ 0001 │ 31 │ LD SP,0030h  │
│     4/1 │    │      │      │ RFSH │    │    │ 0000 │ 31 │ 0001 │ 31 │ LD SP,0030h  │

I'm loading the value in M1/T2 because that's the following clock cycle after the memory read was intiated, but moving it one clock cycle later wouldn't break anything (e.g. the Z80 emulation expects that the tick function doesn't modify the data bus pins if no requests must be handled, but it also expects that the data bus has been updated in the next clock cycle for read requests).

But as I wrote in the blog post here, I took some liberties to allow a simpler and more performant system tick function.

For a proper "Ben Eater syle breadboard emulator" it would be better if the pin timings would behave exactly as a real Z80.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants