src/mess/drivers/a310.c
| r828 | r829 | |
| 51 | 51 | static UINT32 a310_pagesize; |
| 52 | 52 | static int a310_latchrom; |
| 53 | 53 | static INT16 a310_pages[(32*1024*1024)/(4096)]; // the logical RAM area is 32 megs, and the smallest page size is 4k |
| 54 | | UINT32 a310_vidregs[256]; |
| 54 | UINT32 a310_vidregs[256], a310_iocregs[0x80/4]; |
| 55 | 55 | |
| 56 | 56 | VIDEO_START( a310 ) |
| 57 | 57 | { |
| r828 | r829 | |
| 109 | 109 | page = (offset<<2) / page_sizes[a310_pagesize]; |
| 110 | 110 | poffs = (offset<<2) % page_sizes[a310_pagesize]; |
| 111 | 111 | |
| 112 | | printf("Reading offset %x (addr %x): page %x (size %d %d) offset %x ==> %x %x\n", offset, offset<<2, page, a310_pagesize, page_sizes[a310_pagesize], poffs, a310_pages[page], a310_pages[page]*page_sizes[a310_pagesize]); |
| 112 | // printf("Reading offset %x (addr %x): page %x (size %d %d) offset %x ==> %x %x\n", offset, offset<<2, page, a310_pagesize, page_sizes[a310_pagesize], poffs, a310_pages[page], a310_pages[page]*page_sizes[a310_pagesize]); |
| 113 | 113 | |
| 114 | 114 | if (a310_pages[page] != -1) |
| 115 | 115 | { |
| r828 | r829 | |
| 139 | 139 | page = (offset<<2) / page_sizes[a310_pagesize]; |
| 140 | 140 | poffs = (offset<<2) % page_sizes[a310_pagesize]; |
| 141 | 141 | |
| 142 | | printf("Writing offset %x (addr %x): page %x (size %d %d) offset %x ==> %x %x\n", offset, offset<<2, page, a310_pagesize, page_sizes[a310_pagesize], poffs, a310_pages[page], a310_pages[page]*page_sizes[a310_pagesize]); |
| 142 | // printf("Writing offset %x (addr %x): page %x (size %d %d) offset %x ==> %x %x\n", offset, offset<<2, page, a310_pagesize, page_sizes[a310_pagesize], poffs, a310_pages[page], a310_pages[page]*page_sizes[a310_pagesize]); |
| 143 | 143 | |
| 144 | 144 | if (a310_pages[page] != -1) |
| 145 | 145 | { |
| r828 | r829 | |
| 188 | 188 | |
| 189 | 189 | static READ32_HANDLER(ioc_r) |
| 190 | 190 | { |
| 191 | |
| 192 | if (offset >= 0x80000 && offset < 0xc0000) |
| 193 | { |
| 194 | logerror("IOC: R reg %x (mask %08x)\n", (offset*4)&0x7c, mem_mask); |
| 195 | return a310_iocregs[offset]; |
| 196 | } |
| 197 | else |
| 198 | { |
| 199 | logerror("I/O: R @ %x (mask %08x)\n", (offset*4)+0x3000000, mem_mask); |
| 200 | } |
| 201 | |
| 202 | |
| 191 | 203 | return 0; |
| 192 | 204 | } |
| 193 | 205 | |
| 194 | 206 | static WRITE32_HANDLER(ioc_w) |
| 195 | 207 | { |
| 196 | | logerror("IOC: W %x @ %x (mask %08x)\n", data, offset, mem_mask); |
| 208 | if (offset >= 0x80000 && offset < 0xc0000) |
| 209 | { |
| 210 | logerror("IOC: W %x @ reg %x (mask %08x)\n", data, (offset*4)&0x7c, mem_mask); |
| 211 | COMBINE_DATA(&a310_iocregs[offset]); |
| 212 | } |
| 213 | else |
| 214 | { |
| 215 | logerror("I/O: W %x @ %x (mask %08x)\n", data, (offset*4)+0x3000000, mem_mask); |
| 216 | } |
| 197 | 217 | } |
| 198 | 218 | |
| 199 | 219 | static READ32_HANDLER(vidc_r) |
| r828 | r829 | |
| 203 | 223 | |
| 204 | 224 | static WRITE32_HANDLER(vidc_w) |
| 205 | 225 | { |
| 206 | | logerror("VIDC: %x to register %x\n", data & 0xffffff, data>>24); |
| 226 | UINT32 reg = data>>24; |
| 227 | UINT32 val = data & 0xffffff; |
| 228 | static const char *vrnames[] = |
| 229 | { |
| 230 | "horizontal total", |
| 231 | "horizontal sync width", |
| 232 | "horizontal border start", |
| 233 | "horizontal display start", |
| 234 | "horizontal display end", |
| 235 | "horizontal border end", |
| 236 | "horizontal cursor start", |
| 237 | "horizontal interlace", |
| 238 | "vertical total", |
| 239 | "vertical sync width", |
| 240 | "vertical border start", |
| 241 | "vertical display start", |
| 242 | "vertical display end", |
| 243 | "vertical border end", |
| 244 | "vertical cursor start", |
| 245 | "vertical cursor end", |
| 246 | }; |
| 207 | 247 | |
| 208 | | a310_vidregs[data>>24] = data & 0xffffff; |
| 248 | if (reg >= 0x80 && reg <= 0xbc) |
| 249 | { |
| 250 | logerror("VIDC: %s = %d\n", vrnames[(reg-0x80)/4], val>>12); |
| 251 | } |
| 252 | else |
| 253 | { |
| 254 | logerror("VIDC: %x to register %x\n", val, reg); |
| 255 | } |
| 256 | |
| 257 | a310_vidregs[reg] = val; |
| 209 | 258 | } |
| 210 | 259 | |
| 211 | 260 | static READ32_HANDLER(memc_r) |
| r828 | r829 | |
| 220 | 269 | { |
| 221 | 270 | switch ((data >> 17) & 7) |
| 222 | 271 | { |
| 272 | |
| 273 | |
| 223 | 274 | case 7: /* Control */ |
| 224 | 275 | a310_pagesize = ((data>>2) & 3); |
| 225 | 276 | |
| 226 | | logerror("MEMC: %x to Control (page size %d)\n", data & 0x1ffc, page_sizes[a310_pagesize]); |
| 277 | logerror("MEMC: %x to Control (page size %d, %s, %s)\n", data & 0x1ffc, page_sizes[a310_pagesize], ((data>>10)&1) ? "Video DMA on" : "Video DMA off", ((data>>11)&1) ? "Sound DMA on" : "Sound DMA off"); |
| 227 | 278 | break; |
| 228 | 279 | |
| 229 | 280 | default: |
| r828 | r829 | |
| 261 | 312 | 16k page: bits 6-2 being bits 4-0, bits 1-0 being bits 6-5 |
| 262 | 313 | 32k page: bits 6-3 being bits 4-0, bit 0 being bit 4, bit 2 being bit 5, bit |
| 263 | 314 | 1 being bit 6 |
| 315 | */ |
| 264 | 316 | |
| 265 | | |
| 266 | | |
| 267 | | |
| 268 | | */ |
| 269 | 317 | static WRITE32_HANDLER(memc_page_w) |
| 270 | 318 | { |
| 271 | 319 | UINT32 log, phys, memc, perms; |
| 272 | 320 | |
| 273 | | // logerror("MEMC_PAGE: W %x @ %x (mask %08x)\n", data, offset, mem_mask); |
| 274 | | |
| 275 | 321 | perms = (data & 0x300)>>8; |
| 276 | 322 | log = phys = memc = 0; |
| 277 | 323 | |
| r828 | r829 | |
| 318 | 364 | // now go ahead and set the mapping in the page table |
| 319 | 365 | a310_pages[log] = phys * memc; |
| 320 | 366 | |
| 321 | | printf("MEMC_PAGE(%d): W %08x: log %x to phys %x, MEMC %d, perms %d\n", a310_pagesize, data, log, phys, memc, perms); |
| 367 | // printf("MEMC_PAGE(%d): W %08x: log %x to phys %x, MEMC %d, perms %d\n", a310_pagesize, data, log, phys, memc, perms); |
| 322 | 368 | } |
| 323 | 369 | |
| 324 | 370 | static ADDRESS_MAP_START( a310_mem, ADDRESS_SPACE_PROGRAM, 32 ) |
| r828 | r829 | |
| 477 | 523 | |
| 478 | 524 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT CONFIG COMPANY FULLNAME */ |
| 479 | 525 | COMP( 1988, a310, 0, 0, a310, a310, a310, NULL, "Acorn", "Archimedes 310", GAME_NOT_WORKING) |
| 480 | | |
| 481 | | |
| 482 | | |