Mercurial > repos > blastem
annotate m68k_util.c @ 1971:80920c21bb52
Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 08 May 2020 11:40:30 -0700 |
parents | 8494fe8d6b65 |
children | 414eb8c34198 |
rev | line source |
---|---|
1951
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1 #include <string.h> |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2 |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3 void m68k_read_8(m68k_context *context) |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
4 { |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 context->cycles += 4 * context->opts->gen.clock_divider; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
6 context->scratch1 = read_byte(context->scratch1, context->mem_pointers, &context->opts->gen, context); |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
7 } |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
8 |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
9 void m68k_read_16(m68k_context *context) |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
10 { |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
11 context->cycles += 4 * context->opts->gen.clock_divider; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
12 context->scratch1 = read_word(context->scratch1, context->mem_pointers, &context->opts->gen, context); |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
13 } |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
14 |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
15 void m68k_write_8(m68k_context *context) |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
16 { |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
17 context->cycles += 4 * context->opts->gen.clock_divider; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
18 write_byte(context->scratch2, context->scratch1, context->mem_pointers, &context->opts->gen, context); |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
19 } |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
20 |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
21 void m68k_write_16(m68k_context *context) |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
22 { |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
23 context->cycles += 4 * context->opts->gen.clock_divider; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
24 write_word(context->scratch2, context->scratch1, context->mem_pointers, &context->opts->gen, context); |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
25 } |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
26 |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
27 void m68k_sync_cycle(m68k_context *context, uint32_t target_cycle) |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
28 { |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
29 //TODO: interrupt stuff |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
30 context->sync_cycle = target_cycle; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
31 } |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
32 |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
33 void init_m68k_opts(m68k_options *opts, memmap_chunk * memmap, uint32_t num_chunks, uint32_t clock_divider) |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
34 { |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
35 memset(opts, 0, sizeof(*opts)); |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
36 opts->gen.memmap = memmap; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
37 opts->gen.memmap_chunks = num_chunks; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
38 opts->gen.address_mask = 0xFFFFFF; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
39 opts->gen.byte_swap = 1; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
40 opts->gen.max_address = 0x1000000; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
41 opts->gen.bus_cycles = 4; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
42 opts->gen.clock_divider = clock_divider; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
43 } |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
44 |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
45 m68k_context *init_68k_context(m68k_options * opts, m68k_reset_handler reset_handler) |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
46 { |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
47 m68k_context *context = calloc(1, sizeof(m68k_context)); |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
48 context->opts = opts; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
49 context->reset_handler = reset_handler; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
50 context->int_cycle = 0xFFFFFFFFU; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
51 return context; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
52 } |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
53 |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
54 void m68k_reset(m68k_context *context) |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
55 { |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
56 //read initial SP |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
57 context->scratch1 = 0; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
58 m68k_read_16(context); |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
59 context->aregs[7] = context->scratch1 << 16; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
60 context->scratch1 = 2; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
61 m68k_read_16(context); |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
62 context->aregs[7] |= context->scratch1; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
63 |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
64 //read initial PC |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
65 context->scratch1 = 4; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
66 m68k_read_16(context); |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
67 context->pc = context->scratch1 << 16; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
68 context->scratch1 = 6; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
69 m68k_read_16(context); |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
70 context->pc |= context->scratch1; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
71 |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
72 context->scratch1 = context->pc; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
73 m68k_read_16(context); |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
74 context->prefetch = context->scratch1; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
75 context->pc += 2; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
76 |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
77 context->status = 0x27; |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
78 } |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
79 |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
80 void m68k_print_regs(m68k_context *context) |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
81 { |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
82 printf("XNZVC\n%d%d%d%d%d\n", context->xflag != 0, context->nflag != 0, context->zflag != 0, context->vflag != 0, context->cflag != 0); |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
83 for (int i = 0; i < 8; i++) { |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
84 printf("d%d: %X\n", i, context->dregs[i]); |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
85 } |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
86 for (int i = 0; i < 8; i++) { |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
87 printf("a%d: %X\n", i, context->aregs[i]); |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
88 } |
8494fe8d6b65
Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
89 } |