annotate transz80.c @ 345:29d2ca563499

Don't sync the 68K clock to the VDP clock unless the 68K had to wait for the VDP. This unfortunately breaks the direct color DMA demos, but should be more correct overall.
author Mike Pavone <pavone@retrodev.com>
date Sun, 19 May 2013 13:47:47 -0700
parents fd7c24b97ebf
children 140af5509ce7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
235
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #include "z80inst.h"
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
2 #include "z80_to_x86.h"
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
3 #include "mem.h"
250
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
4 #include "vdp.h"
235
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5 #include <stdio.h>
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
6 #include <stdlib.h>
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
7
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
8 uint8_t z80_ram[0x2000];
245
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
9 uint16_t cart[0x200000];
235
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
10
250
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
11 #define MCLKS_PER_Z80 15
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
12 //TODO: Figure out the exact value for this
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
13 #define MCLKS_PER_FRAME (MCLKS_LINE*262)
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
14 #define VINT_CYCLE ((MCLKS_LINE * 226)/MCLKS_PER_Z80)
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
15 #define CYCLE_NEVER 0xFFFFFFFF
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
16
316
fd7c24b97ebf Add YM2612 stubs to transz80
Mike Pavone <pavone@retrodev.com>
parents: 250
diff changeset
17 uint8_t z80_read_ym(uint16_t location, z80_context * context)
fd7c24b97ebf Add YM2612 stubs to transz80
Mike Pavone <pavone@retrodev.com>
parents: 250
diff changeset
18 {
fd7c24b97ebf Add YM2612 stubs to transz80
Mike Pavone <pavone@retrodev.com>
parents: 250
diff changeset
19 return 0xFF;
fd7c24b97ebf Add YM2612 stubs to transz80
Mike Pavone <pavone@retrodev.com>
parents: 250
diff changeset
20 }
fd7c24b97ebf Add YM2612 stubs to transz80
Mike Pavone <pavone@retrodev.com>
parents: 250
diff changeset
21
fd7c24b97ebf Add YM2612 stubs to transz80
Mike Pavone <pavone@retrodev.com>
parents: 250
diff changeset
22 z80_context * z80_write_ym(uint16_t location, z80_context * context, uint8_t value)
fd7c24b97ebf Add YM2612 stubs to transz80
Mike Pavone <pavone@retrodev.com>
parents: 250
diff changeset
23 {
fd7c24b97ebf Add YM2612 stubs to transz80
Mike Pavone <pavone@retrodev.com>
parents: 250
diff changeset
24 return context;
fd7c24b97ebf Add YM2612 stubs to transz80
Mike Pavone <pavone@retrodev.com>
parents: 250
diff changeset
25 }
fd7c24b97ebf Add YM2612 stubs to transz80
Mike Pavone <pavone@retrodev.com>
parents: 250
diff changeset
26
235
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
27 int main(int argc, char ** argv)
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
28 {
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
29 long filesize;
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
30 uint8_t *filebuf;
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
31 x86_z80_options opts;
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
32 z80_context context;
245
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
33 if (argc < 2) {
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
34 fputs("usage: transz80 zrom [cartrom]\n", stderr);
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
35 exit(1);
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
36 }
235
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
37 FILE * f = fopen(argv[1], "rb");
245
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
38 if (!f) {
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
39 fprintf(stderr, "unable to open file %s\n", argv[2]);
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
40 exit(1);
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
41 }
235
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
42 fseek(f, 0, SEEK_END);
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
43 filesize = ftell(f);
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
44 fseek(f, 0, SEEK_SET);
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
45 fread(z80_ram, 1, filesize < sizeof(z80_ram) ? filesize : sizeof(z80_ram), f);
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
46 fclose(f);
245
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
47 if (argc > 2) {
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
48 f = fopen(argv[2], "rb");
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
49 if (!f) {
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
50 fprintf(stderr, "unable to open file %s\n", argv[2]);
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
51 exit(1);
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
52 }
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
53 fseek(f, 0, SEEK_END);
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
54 filesize = ftell(f);
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
55 fseek(f, 0, SEEK_SET);
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
56 fread(cart, 1, filesize < sizeof(cart) ? filesize : sizeof(cart), f);
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
57 fclose(f);
250
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
58 for(unsigned short * cur = cart; cur - cart < (filesize/2); ++cur)
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
59 {
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
60 *cur = (*cur >> 8) | (*cur << 8);
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
61 }
245
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
62 }
235
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
63 init_x86_z80_opts(&opts);
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
64 init_z80_context(&context, &opts);
245
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
65 //Z80 RAM
235
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
66 context.mem_pointers[0] = z80_ram;
250
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
67 context.sync_cycle = context.target_cycle = MCLKS_PER_FRAME/MCLKS_PER_Z80;
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
68 context.int_cycle = CYCLE_NEVER;
245
ea3899e3e7ec Implement cartridge rom loading in transz80
Mike Pavone <pavone@retrodev.com>
parents: 244
diff changeset
69 //cartridge/bank
250
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
70 context.mem_pointers[1] = context.mem_pointers[2] = (uint8_t *)cart;
235
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
71 z80_reset(&context);
244
df8a36bf5e1d Implement cycle limit in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 235
diff changeset
72 for(;;)
df8a36bf5e1d Implement cycle limit in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 235
diff changeset
73 {
df8a36bf5e1d Implement cycle limit in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 235
diff changeset
74 z80_run(&context);
250
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
75 if (context.current_cycle >= MCLKS_PER_FRAME/MCLKS_PER_Z80) {
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
76 context.current_cycle -= MCLKS_PER_FRAME/MCLKS_PER_Z80;
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
77 }
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
78 if (context.current_cycle < VINT_CYCLE && context.iff1) {
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
79 context.int_cycle = VINT_CYCLE;
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
80 }
5f1b68cecfc7 Implemented basic interrupt support in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 245
diff changeset
81 context.target_cycle = context.sync_cycle < context.int_cycle ? context.sync_cycle : context.int_cycle;
244
df8a36bf5e1d Implement cycle limit in Z80 core.
Mike Pavone <pavone@retrodev.com>
parents: 235
diff changeset
82 }
235
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
83 return 0;
d9bf8e61c33c Get Z80 core working for simple programs
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
84 }