1
/* Hey EMACS -*- linux-c -*- */
2
/* $Id: mem92p.c 1455 2005-05-31 18:38:03Z roms $ */
4
/* TiEmu - an TI emulator
6
* Copyright (c) 2000-2001, Thomas Corvazier, Romain Lievin
7
* Copyright (c) 2001-2003, Romain Lievin
8
* Copyright (c) 2003, Julien Blache
9
* Copyright (c) 2004, Romain Li�vin
10
* Copyright (c) 2005, Romain Li�vin
12
* This program is free software; you can redistribute it and/or modify
13
* it under the terms of the GNU General Public License as published by
14
* the Free Software Foundation; either version 2 of the License, or
15
* (at your option) any later version.
17
* This program is distributed in the hope that it will be useful,
18
* but WITHOUT ANY WARRANTY; without even the implied warranty of
19
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
* GNU General Public License for more details.
22
* You should have received a copy of the GNU General Public License
23
* along with this program; if not, write to the Free Software
24
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
28
Memory management: TI92+ FLASH without Hardware Protection
29
Some values may be hard-coded for performance reasons !
44
#include "ti68k_def.h"
45
#include "ti68k_int.h"
48
// 000000-0fffff : RAM (256 KB)
49
// 100000-1fffff : ghost of RAM
50
// 200000-2fffff : ghost of FLASH (HW2)
51
// 300000-3fffff : unused
52
// 400000-4fffff : external FLASH
53
// 500000-5fffff : idem
54
// 600000-6fffff : memory mapped I/O (all HW)
55
// 700000-7fffff : memory mapped I/O (HW2)
56
// 800000-8fffff : unused
57
// 900000-9fffff : ...
62
// e00000-efffff : ...
63
// d00000-ffffff : unused
65
int ti92p_mem_init(void)
68
mem_get_byte_ptr = ti92p_get_byte;
69
mem_get_word_ptr = ti92p_get_word;
70
mem_get_long_ptr = ti92p_get_long;
71
mem_put_byte_ptr = ti92p_put_byte;
72
mem_put_word_ptr = ti92p_put_word;
73
mem_put_long_ptr = ti92p_put_long;
75
mem_get_real_addr_ptr = ti92p_get_real_addr;
80
uint8_t* ti92p_get_real_addr(uint32_t adr)
83
if(IN_BOUNDS(0x000000, adr, 0x1fffff))
85
return getp(tihw.ram, adr, RAM_SIZE_TI92P - 1);
89
else if(IN_BOUNDS(0x200000, adr, 0x5fffff))
91
return getp(tihw.rom, adr, ROM_SIZE_TI92P - 1);
95
else if(IN_BOUNDS(0x600000, adr, 0x6fffff))
97
return getp(tihw.io, adr, IO1_SIZE_TI92P - 1);
100
// memory-mapped I/O (hw2)
101
else if(IN_RANGE(adr, 0x700000, IO2_SIZE_TI92P))
103
return getp(tihw.io2, adr, IO2_SIZE_TI92P - 1);
109
uint32_t ti92p_get_long(uint32_t adr)
112
if(IN_BOUNDS(0x000000, adr, 0x1fffff))
114
return getl(tihw.ram, adr, RAM_SIZE_TI92P - 1);
118
else if(IN_BOUNDS(0x200000, adr, 0x5fffff))
120
return getl(tihw.rom, adr, ROM_SIZE_TI92P - 1) | wsm.ret_or;
124
else if(IN_BOUNDS(0x600000, adr, 0x6fffff))
126
return io_get_long(adr);
129
// memory-mapped I/O (hw2)
130
else if(IN_RANGE(adr, 0x700000, IO2_SIZE_TI92P))
132
return io2_get_long(adr);
138
uint16_t ti92p_get_word(uint32_t adr)
141
if(IN_BOUNDS(0x000000, adr, 0x1fffff))
143
return getw(tihw.ram, adr, RAM_SIZE_TI92P - 1);
147
else if(IN_BOUNDS(0x200000, adr, 0x5fffff))
149
return getw(tihw.rom, adr, ROM_SIZE_TI92P - 1) | wsm.ret_or;
153
else if(IN_BOUNDS(0x600000, adr, 0x6fffff))
155
return io_get_word(adr);
158
// memory-mapped I/O (hw2)
159
else if(IN_RANGE(adr, 0x700000, IO2_SIZE_TI92P))
161
return io2_get_word(adr);
167
uint8_t ti92p_get_byte(uint32_t adr)
170
if(IN_BOUNDS(0x000000, adr, 0x1fffff))
172
return getb(tihw.ram, adr, RAM_SIZE_TI92P - 1);
176
else if(IN_BOUNDS(0x200000, adr, 0x5fffff))
178
return getb(tihw.rom, adr, ROM_SIZE_TI92P - 1) | wsm.ret_or;
182
else if(IN_BOUNDS(0x600000, adr, 0x6fffff))
184
return io_get_byte(adr);
187
// memory-mapped I/O (hw2)
188
else if(IN_RANGE(adr, 0x700000, IO2_SIZE_TI92P))
190
return io2_get_byte(adr);
196
void ti92p_put_long(uint32_t adr, uint32_t arg)
199
if(IN_BOUNDS(0x000000, adr, 0x1fffff))
201
putl(tihw.ram, adr, RAM_SIZE_TI92P - 1, arg);
205
else if(IN_BOUNDS(0x200000, adr, 0x5fffff))
207
FlashWriteLong(adr, arg);
211
else if(IN_BOUNDS(0x600000, adr, 0x6fffff))
213
io_put_long(adr, arg);
216
// memory-mapped I/O (hw2)
217
else if(IN_RANGE(adr, 0x700000, IO2_SIZE_TI92P))
219
io2_put_long(adr, arg);
225
void ti92p_put_word(uint32_t adr, uint16_t arg)
228
if(IN_BOUNDS(0x000000, adr, 0x1fffff))
230
putw(tihw.ram, adr, RAM_SIZE_TI92P - 1, arg);
234
else if(IN_BOUNDS(0x200000, adr, 0x5fffff))
236
FlashWriteWord(adr, arg);
240
else if(IN_BOUNDS(0x600000, adr, 0x6fffff))
242
io_put_word(adr, arg);
245
// memory-mapped I/O (hw2)
246
else if(IN_RANGE(adr, 0x700000, IO2_SIZE_TI92P))
248
io2_put_word(adr, arg);
254
void ti92p_put_byte(uint32_t adr, uint8_t arg)
257
if(IN_BOUNDS(0x000000, adr, 0x1fffff))
259
putb(tihw.ram, adr, RAM_SIZE_TI92P - 1, arg);
263
else if(IN_BOUNDS(0x200000, adr, 0x5fffff))
265
FlashWriteByte(adr, arg);
269
else if(IN_BOUNDS(0x600000, adr, 0x6fffff))
271
io_put_byte(adr, arg);
274
// memory-mapped I/O (hw2)
275
else if(IN_RANGE(adr, 0x700000, IO2_SIZE_TI92P))
277
io2_put_byte(adr, arg);