annotate jaguar.c @ 1083:f6e998227300

Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
author Michael Pavone <pavone@retrodev.com>
date Thu, 06 Oct 2016 09:35:35 -0700
parents 382614130914
children bc86eaf6699d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1080
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #include <stdint.h>
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
2 #include <stdio.h>
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
3 #include <stddef.h>
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
4 #include <stdlib.h>
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
5 #include "m68k_core.h"
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
6 #include "jaguar.h"
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
7 #include "util.h"
1083
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
8 #include "debug.h"
1080
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
9
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
10 //BIOS Area Memory map
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
11 // 10 00 00 - 10 04 00 : Video mode/ Memory control registers
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
12 // 10 04 00 - 10 08 00 : CLUT
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
13 // 10 08 00 - 10 10 00 : Line buffer A
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
14 // 10 10 00 - 10 18 00 : Line buffer B
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
15 // 10 18 00 - 10 20 00 : Write Line buffer
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
16 // 10 21 00 - 10 30 00 : GPU/blitter registers
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
17 // 10 30 00 - 10 40 00 : GPU Local RAM (mirrored every 1K?)
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
18 // 11 00 00 - 11 00 40 : Timer/Clock registers
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
19 // 11 40 00 - 11 40 04 : Joystick Interface
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
20 // 11 A1 00 - 11 A1 52 : DSP/DAC/I2S Registers
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
21 // 11 B0 00 - 11 D0 00 : DSP Local RAM (8KB)
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
22 // 11 D0 00 - 11 E0 00 : Wave table ROM
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
23
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
24 int headless = 1;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
25
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
27 void rom0_write_16(uint32_t address, jaguar_context *system, uint16_t value)
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
28 {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
29 //TODO: Use write_latch and write_pending to turn two 16-bit writes into a 32-bit one
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
30 //Documentation heavily suggests that writes to most registers should be 32-bits wide
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
31 if (address < 0x100000 || address >= 0x120000) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
32 //Boot ROM
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
33 fprintf(stderr, "Invalid write to Boot ROM - %X:%X\n", address, value);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
34 return;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
35 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
36 if (address < 0x103000) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
37 if (address < 0x101000) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
38 if (address < 0x100400) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
39 //Video mode / Memory control registers
1083
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
40 switch(address & 0x3FE)
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
41 {
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
42 case 0:
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
43 if (((value ^ system->memcon1) & 1) || !system->memcon_written) {
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
44 uint16_t **mem_pointers = system->m68k->mem_pointers;
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
45 int rom = value & 1 ? 4 : 1;
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
46 int ram0 = value & 1 ? 0 : 6;
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
47 int ram1 = value & 1 ? 2 : 4;
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
48 mem_pointers[ram0] = mem_pointers[ram0 + 1] = system->dram;
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
49 //these are probably open bus, but mirror DRAM for now
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
50 mem_pointers[ram1] = mem_pointers[ram1 + 1] = system->dram;
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
51
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
52 mem_pointers[rom] = system->cart;
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
53 mem_pointers[rom + 1] = system->cart + ((0x200000 & (system->cart_size-1)) >> 1);
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
54 mem_pointers[rom + 2] = system->cart + ((0x400000 & (system->cart_size-1)) >> 1);
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
55 system->memcon_written = 1;
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
56 //TODO: invalidate code cache
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
57 }
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
58 system->memcon1 = value;
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
59 break;
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
60 case 2:
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
61 system->memcon2 = value;
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
62 break;
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
63 default:
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
64 fprintf(stderr, "Unhandled write to video mode/memory control registers - %X:%X\n", address, value);
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
65 break;
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
66 }
1080
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
67 } else if (address < 0x100800) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
68 //CLUT
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
69 address = address >> 1 & 255;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
70 system->clut[address] = value;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
71 } else {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
72 //Line buffer A
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
73 address = address >> 1 & 0x3FF;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
74 if (address < LINEBUFFER_WORDS) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
75 system->line_buffer_a[address] = value;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
76 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
77 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
78 } else if (address < 0x101800) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
79 //Line buffer B
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
80 address = address >> 1 & 0x3FF;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
81 if (address < LINEBUFFER_WORDS) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
82 system->line_buffer_b[address] = value;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
83 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
84 } else if (address < 0x102100) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
85 //Write Line Buffer
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
86 address = address >> 1 & 0x3FF;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
87 if (address < LINEBUFFER_WORDS) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
88 system->write_line_buffer[address] = value;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
89 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
90 } else {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
91 //GPU/Blitter registers
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
92 fprintf(stderr, "Unhandled write to GPU/Blitter registers %X: %X\n", address, value);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
93 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
94 } else if (address < 0x11A100) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
95 if (address < 0x110000) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
96 //GPU Local RAM
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
97 uint32_t offset = address >> 2 & (GPU_RAM_BYTES / sizeof(uint32_t) - 1);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
98 uint32_t value32 = value;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
99 if (address & 2) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
100 system->gpu_local[offset] &= 0xFFFF0000;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
101 } else {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
102 system->gpu_local[offset] &= 0x0000FFFF;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
103 value32 = value32 << 16;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
104 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
105 system->gpu_local[offset] |= value32;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
106 } else if (address < 0x114000) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
107 //timer clock registers
1083
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
108 fprintf(stderr, "Unhandled write to timer/clock registers - %X:%X\n", address, value);
1080
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
109 } else {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
110 //joystick interface
1083
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
111 fprintf(stderr, "Unhandled write to joystick interface - %X:%X\n", address, value);
1080
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
112 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
113 } else if (address < 0x11B000) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
114 //DSP/DAC/I2S Registers
1083
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
115 fprintf(stderr, "Unhandled write to DSP/DAC/I2S registers - %X:%X\n", address, value);
1080
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
116 } else if (address < 0x11D000) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
117 //DSP local RAM
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
118 uint32_t offset = address >> 2 & (DSP_RAM_BYTES / sizeof(uint32_t) - 1);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
119 uint32_t value32 = value;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
120 if (address & 2) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
121 system->dsp_local[offset] &= 0xFFFF0000;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
122 } else {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
123 system->dsp_local[offset] &= 0x0000FFFF;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
124 value32 = value32 << 16;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
125 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
126 system->gpu_local[offset] |= value32;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
127 } else {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
128 //Wave table ROM
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
129 fprintf(stderr, "Invalid write to wave table ROM - %X:%X\n", address, value);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
130 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
131 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
132
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
133 uint16_t rom0_read_16(uint32_t address, jaguar_context *system)
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
134 {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
135 if (address < 0x100000 || address >= 0x120000) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
136 //Boot ROM
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
137 address = address >> 1 & ((system->bios_size >> 1) - 1);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
138 return system->bios[address];
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
139 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
140 if (address < 0x103000) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
141 if (address < 0x101000) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
142 if (address < 0x100400) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
143 //Video mode / Memory control registers
1083
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
144 fprintf(stderr, "Unhandled read from video mode/memory control registers - %X\n", address);
1080
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
145 } else if (address < 0x100800) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
146 //CLUT
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
147 address = address >> 1 & 255;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
148 return system->clut[address];
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
149 } else {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
150 //Line buffer A
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
151 address = address >> 1 & 0x3FF;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
152 if (address < LINEBUFFER_WORDS) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
153 return system->line_buffer_a[address];
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
154 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
155 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
156 } else if (address < 0x101800) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
157 //Line buffer B
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
158 address = address >> 1 & 0x3FF;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
159 if (address < LINEBUFFER_WORDS) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
160 return system->line_buffer_b[address];
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
161 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
162 } else if (address < 0x102100) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
163 //Write Line Buffer
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
164 address = address >> 1 & 0x3FF;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
165 if (address < LINEBUFFER_WORDS) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
166 return system->write_line_buffer[address];
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
167 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
168 } else {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
169 //GPU/Blitter registers
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
170 fprintf(stderr, "Unhandled read from GPU/Blitter registers %X\n", address);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
171 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
172 } else if (address < 0x11A100) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
173 if (address < 0x110000) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
174 //GPU Local RAM
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
175 uint32_t offset = address >> 2 & (GPU_RAM_BYTES / sizeof(uint32_t) - 1);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
176 if (address & 2) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
177 return system->gpu_local[offset];
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
178 } else {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
179 return system->gpu_local[offset] >> 16;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
180 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
181 } else if (address < 0x114000) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
182 //timer clock registers
1083
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
183 fprintf(stderr, "Unhandled read from timer/clock registers - %X\n", address);
1080
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
184 } else {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
185 //joystick interface
1083
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
186 fprintf(stderr, "Unhandled read from joystick interface - %X\n", address);
1080
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
187 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
188 } else if (address < 0x11B000) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
189 //DSP/DAC/I2S Registers
1083
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
190 fprintf(stderr, "Unhandled read from DSP/DAC/I2S registers - %X\n", address);
1080
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
191 } else if (address < 0x11D000) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
192 //DSP local RAM
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
193 uint32_t offset = address >> 2 & (DSP_RAM_BYTES / sizeof(uint32_t) - 1);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
194 if (address & 2) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
195 return system->dsp_local[offset];
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
196 } else {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
197 return system->dsp_local[offset] >> 16;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
198 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
199 } else {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
200 //Wave table ROM
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
201 fprintf(stderr, "Unhandled read from wave table ROM - %X\n", address);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
202 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
203 return 0xFFFF;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
204 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
205
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
206
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
207 void *rom0_write_m68k(uint32_t address, void *context, uint16_t value)
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
208 {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
209 rom0_write_16(address, ((m68k_context *)context)->system, value);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
210 return context;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
211 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
212
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
213 uint16_t rom0_read_m68k(uint32_t address, void *context)
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
214 {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
215 return rom0_read_16(address, ((m68k_context *)context)->system);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
216 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
217
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
218 void *rom0_write_m68k_b(uint32_t address, void *context, uint8_t value)
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
219 {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
220 //seems unlikely these areas support byte access
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
221 uint16_t value16 = value;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
222 value16 |= value16 << 8;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
223 rom0_write_16(address, ((m68k_context *)context)->system, value16);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
224 return context;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
225 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
226
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
227 uint8_t rom0_read_m68k_b(uint32_t address, void *context)
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
228 {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
229 uint16_t value = rom0_read_16(address, ((m68k_context *)context)->system);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
230 if (address & 1) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
231 return value;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
232 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
233 return value >> 8;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
234 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
235
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
236 m68k_context * sync_components(m68k_context * context, uint32_t address)
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
237 {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
238 if (context->current_cycle > 0x10000000) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
239 context->current_cycle -= 0x10000000;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
240 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
241 return context;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
242 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
243
1083
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
244 m68k_context *handle_m68k_reset(m68k_context *context)
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
245 {
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
246 puts("M68K executed RESET");
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
247 return context;
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
248 }
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
249
1080
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
250 jaguar_context *init_jaguar(uint16_t *bios, uint32_t bios_size, uint16_t *cart, uint32_t cart_size)
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
251 {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
252 jaguar_context *system = calloc(1, sizeof(jaguar_context));
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
253 system->bios = bios;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
254 system->bios_size = bios_size;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
255 system->cart = cart;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
256 system->cart_size = cart_size;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
257
1083
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
258 memmap_chunk *jag_m68k_map = calloc(8, sizeof(memmap_chunk));
1080
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
259 for (uint32_t start = 0, index=0; index < 8; index++, start += 0x200000)
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
260 {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
261 jag_m68k_map[index].start = start;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
262 jag_m68k_map[index].end = start + 0x200000;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
263 jag_m68k_map[index].mask = index ? 0x1FFFFF : 0xFFFFFF;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
264 jag_m68k_map[index].aux_mask = bios_size - 1;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
265 jag_m68k_map[index].ptr_index = index;
1083
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
266 jag_m68k_map[index].flags = MMAP_READ | MMAP_WRITE | MMAP_PTR_IDX | MMAP_FUNC_NULL | MMAP_AUX_BUFF | MMAP_CODE;
1080
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
267 jag_m68k_map[index].buffer = bios;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
268 jag_m68k_map[index].read_16 = rom0_read_m68k;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
269 jag_m68k_map[index].read_8 = rom0_read_m68k_b;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
270 jag_m68k_map[index].write_16 = rom0_write_m68k;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
271 jag_m68k_map[index].write_8 = rom0_write_m68k_b;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
272 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
273 m68k_options *opts = malloc(sizeof(m68k_options));
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
274 init_m68k_opts(opts, jag_m68k_map, 8, 2);
1083
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
275 system->m68k = init_68k_context(opts, handle_m68k_reset);
1080
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
276 system->m68k->system = system;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
277 return system;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
278 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
279
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
280 //modified copy of the version in blastem.c
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
281 uint16_t *load_rom(char * filename, uint32_t *size)
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
282 {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
283 FILE * f = fopen(filename, "rb");
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
284 if (!f) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
285 return 0;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
286 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
287 fseek(f, 0, SEEK_END);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
288 long filesize = ftell(f);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
289 fseek(f, 0, SEEK_SET);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
290
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
291 *size = nearest_pow2(filesize);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
292 uint16_t *cart = malloc(*size);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
293 if (filesize != fread(cart, 1, filesize, f)) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
294 fatal_error("Error reading from %s\n", filename);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
295 }
1083
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
296 filesize = (filesize + 1) & ~1L;
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
297 for (long i = 0; i < filesize; i+=2)
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
298 {
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
299 long index = i >> 1;
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
300 cart[index] = cart[index] >> 8 | cart[index] << 8;
f6e998227300 Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
Michael Pavone <pavone@retrodev.com>
parents: 1080
diff changeset
301 }
1080
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
302 while (filesize < *size)
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
303 {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
304 cart[filesize / 2] = 0xFFFF;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
305 filesize += 2;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
306 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
307 fclose(f);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
308 return cart;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
309 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
310
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
311 //temporary main function until I clean up blastem.c
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
312 int main(int argc, char **argv)
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
313 {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
314 if (argc < 3) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
315 fputs("Usage: blastjag BIOS ROM\n", stderr);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
316 return 1;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
317 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
318 uint32_t bios_size;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
319 uint16_t *bios = load_rom(argv[1], &bios_size);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
320 if (!bios_size) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
321 fatal_error("Failed to read BIOS from %s\n", argv[1]);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
322 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
323 uint32_t cart_size;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
324 uint16_t *cart = load_rom(argv[2], &cart_size);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
325 if (!bios_size) {
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
326 fatal_error("Failed to read cart from %s\n", argv[2]);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
327 }
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
328 jaguar_context *system = init_jaguar(bios, bios_size, cart, cart_size);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
329 m68k_reset(system->m68k);
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
330 return 0;
382614130914 Some initial work on Atari Jaguar emulation
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
331 }