1.32 release

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@87 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2007-04-04 18:35:48 +00:00
parent 4696954094
commit 6cadc2da00
42 changed files with 803 additions and 167 deletions

View file

@ -1,9 +1,5 @@
// This is part of Pico Library
// (c) Copyright 2007 notaz, All rights reserved.
// Free for non-commercial use.
// For commercial use, separate licencing terms must be obtained.
// Savestate handling for emulated Sega/Mega CD machine.
// (c) Copyright 2007, Grazvydas "notaz" Ignotas
#include "../PicoInt.h"

View file

@ -1,9 +1,9 @@
/***********************************************************
* *
* This source is taken from the Gens project *
* This source was taken from the Gens project *
* Written by Stéphane Dallongeville *
* Copyright (c) 2002 by Stéphane Dallongeville *
* Modified/adapted for Picodrive by notaz, 2007 *
* Modified/adapted for PicoDrive by notaz, 2007 *
* *
***********************************************************/

View file

@ -1,3 +1,12 @@
/***********************************************************
* *
* This source was taken from the Gens project *
* Written by Stéphane Dallongeville *
* Copyright (c) 2002 by Stéphane Dallongeville *
* Modified/adapted for PicoDrive by notaz, 2007 *
* *
***********************************************************/
#ifndef _LC89510_H
#define _LC89510_H

View file

@ -1,10 +1,6 @@
// This is part of Pico Library
// (c) Copyright 2004 Dave, All rights reserved.
// (c) Copyright 2007 notaz, All rights reserved.
// Free for non-commercial use.
// For commercial use, separate licencing terms must be obtained.
// Memory I/O handlers for Sega/Mega CD.
// Loosely based on Gens code.
// (c) Copyright 2007, Grazvydas "notaz" Ignotas
// A68K no longer supported here
@ -698,7 +694,7 @@ static void PicoWriteM68k16(u32 a,u16 d)
Pico_mcd->s68k_regs[0xe] = d >> 8;
#ifdef USE_POLL_DETECT
if ((s68k_poll_adclk&0xfe) == 0xe && s68k_poll_cnt > POLL_LIMIT) {
SekSetStopS68k(0); s68k_poll_adclk = -1;
SekSetStopS68k(0); s68k_poll_adclk = 0;
plprintf("s68k poll release, a=%02x\n", a);
}
#endif

View file

@ -1,8 +1,7 @@
@ vim:filetype=armasm
@ Memory i/o handlers for Sega/Mega CD emulation
@ Memory I/O handlers for Sega/Mega CD emulation
@ (c) Copyright 2007, Grazvydas "notaz" Ignotas
@ All Rights Reserved
@ -27,14 +26,17 @@
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x280000 - 0x2fffff
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x300000
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x3fffff
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x400000
.long m_m68k_&\on&\sz&_bcram_size @ 0x400000
.long m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x420000
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x4fffff
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x500000
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x5fffff
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x600000
.long m_m68k_&\on&\sz&_bcram @ 0x600000
.long m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x620000
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x6fffff
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x700000
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x7fffff
.long m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x7dffff
.long m_m68k_&\on&\sz&_bcram_reg @ 0x7e0000
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x800000
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x8fffff
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x900000
@ -364,6 +366,25 @@ PicoWriteS68k32: @ u32 a, u32 d
streq r1, [r2, r0]
.endm
@
.macro bcram_reg_rw is_read addr_check
rsb r0, r0, #0x800000
ldr r2, =(Pico+0x22200)
cmp r0, #(0x800000-\addr_check)
ldreq r2, [r2]
.if \is_read
movne r0, #0
.endif
bxne lr
add r2, r2, #0x110000
add r2, r2, #0x002200
.if \is_read
ldrb r0, [r2, #0x18]
.else
strb r1, [r2, #0x18]
.endif
bx lr
.endm
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ -448,6 +469,35 @@ m_m68k_read8_wordram1_1M_b1: @ 0x220000 - 0x23ffff, cell arranged
bx lr
m_m68k_read8_bcram_size: @ 0x400000
sub r0, r0, #1
cmp r0, #0x400000
ldreq r1, =SRam
mov r0, #0
ldreq r1, [r1]
bxne lr
tst r1, r1
movne r0, #3 @ pretend to be a 64k cart (8<<3)
bx lr
m_m68k_read8_bcram: @ 0x600000 - 0x61ffff
ldr r1, =SRam
bic r0, r0, #0xfe0000
ldr r1, [r1]
mov r0, r0, lsr #1
tst r1, r1
moveq r0, #0
bxeq lr
add r1, r1, #0x2000
ldrb r0, [r1, r0]
bx lr
m_m68k_read8_bcram_reg: @ 0x7fffff
bcram_reg_rw 1, 0x7fffff
m_m68k_read8_system_io:
bic r2, r0, #0xfe0000
bic r2, r2, #0x3f
@ -656,6 +706,25 @@ m_m68k_read16_wordram1_1M_b1: @ 0x220000 - 0x23ffff, cell arranged
bx lr
m_m68k_read16_bcram_size: @ 0x400000
cmp r0, #0x400000
ldreq r1, =SRam
mov r0, #0
ldreq r1, [r1]
bxne lr
tst r1, r1
movne r0, #3 @ pretend to be a 64k cart
bx lr
@ m_m68k_read16_bcram: @ 0x600000 - 0x61ffff
.equiv m_m68k_read16_bcram, m_m68k_read8_bcram
m_m68k_read16_bcram_reg: @ 0x7fffff
bcram_reg_rw 1, 0x7ffffe
m_m68k_read16_system_io:
bic r1, r0, #0xfe0000
bic r1, r1, #0x3f
@ -851,6 +920,33 @@ m_m68k_read32_wordram1_1M_b1_unal:
bx r12
m_m68k_read32_bcram_size: @ 0x400000
cmp r0, #0x400000
ldreq r1, =SRam
mov r0, #0
ldreq r1, [r1]
bxne lr
tst r1, r1
movne r0, #0x30000 @ pretend to be a 64k cart
bx lr
m_m68k_read32_bcram: @ 0x600000 - 0x61ffff, not likely to be called
mov r12,lr
add r3, r0, #2
bl m_m68k_read8_bcram
mov r1, r0
mov r0, r3
mov r3, r1
bl m_m68k_read8_bcram
orr r0, r0, r3, lsl #16
bx r12
m_m68k_read32_bcram_reg: @ 0x7fffff
bcram_reg_rw 1, 0x7ffffc
@ it is not very practical to use long access on hw registers, so I assume it is not used too much.
m_m68k_read32_system_io:
bic r1, r0, #0xfe0000
@ -916,6 +1012,7 @@ m_m68k_read32_ram:
m_write_null:
m_m68k_write8_bios:
m_m68k_write8_bcram_size: @ 0x400000
bx lr
@ -986,6 +1083,33 @@ m_m68k_write8_wordram1_1M_b1: @ 0x220000 - 0x23ffff, cell arranged
bx lr
m_m68k_write8_bcram: @ 0x600000 - 0x61ffff
@ can't use r3 or r12, because of write32
ldr r2, =SRam
bic r0, r0, #0xfe0000
ldr r2, [r2]
tst r2, r2
bxeq lr
add r0, r2, r0, lsr #1
ldr r2, =(Pico+0x22200)
ldr r2, [r2]
add r0, r0, #0x2000
add r2, r2, #0x110000
add r2, r2, #0x002200
ldr r2, [r2, #0x18]
tst r2, #1 @ check bcram reg
bxeq lr
strb r1, [r0]
ldr r2, =SRam
mov r0, #1
strb r0, [r2, #0x0e] @ SRam.changed = 1
bx lr
m_m68k_write8_bcram_reg: @ 0x7fffff
bcram_reg_rw 0, 0x7fffff
m_m68k_write8_system_io:
bic r2, r0, #0xfe0000
bic r2, r2, #0x3f
@ -1020,6 +1144,7 @@ m_m68k_write8_ram:
m_m68k_write16_bios:
m_m68k_write16_bcram_size: @ 0x400000
bx lr
@ -1091,6 +1216,14 @@ m_m68k_write16_wordram1_1M_b1: @ 0x220000 - 0x23ffff, cell arranged
bx lr
@ m_m68k_write16_bcram: @ 0x600000 - 0x61ffff
.equiv m_m68k_write16_bcram, m_m68k_write8_bcram
m_m68k_write16_bcram_reg: @ 0x7fffff
bcram_reg_rw 0, 0x7ffffe
m_m68k_write16_system_io:
bic r0, r0, #1
bic r2, r0, #0xfe0000
@ -1098,7 +1231,7 @@ m_m68k_write16_system_io:
cmp r2, #0x012000
bne OtherWrite16
m_m68k_write16_m68k_regs:
m_m68k_write16_regs:
and r0, r0, #0x3e
cmp r0, #0x0e
beq m_m68k_write16_regs_spec
@ -1153,6 +1286,7 @@ m_m68k_write16_ram:
m_m68k_write32_bios:
m_m68k_write32_bcram_size: @ 0x400000
bx lr
@ -1248,6 +1382,22 @@ m_m68k_write32_wordram1_1M_b1_unal:
b m_m68k_write16_wordram1_1M_b1
m_m68k_write32_bcram: @ 0x600000 - 0x61ffff, not likely to be called
mov r12,lr
add r3, r0, #2
mov r1, r1, ror #16
bl m_m68k_write8_bcram
mov r0, r3
mov r1, r1, ror #16
bl m_m68k_write8_bcram
bx r12
m_m68k_write32_bcram_reg: @ 0x7fffff
bcram_reg_rw 0, 0x7ffffc
@ it is not very practical to use long access on hw registers, so I assume it is not used too much.
m_m68k_write32_system_io:
bic r2, r0, #0xfe0000
@ -1255,26 +1405,13 @@ m_m68k_write32_system_io:
cmp r2, #0x012000
bne m_m68k_write32_misc
and r2, r0, #0x3e
cmp r2, #0x10
blt m_m68k_write32_regs
cmp r2, #0x20
bxge lr
@ Handle the 0x10-0x1f range
ldr r0, =(Pico+0x22200)
mov r3, #0xff
ldr r0, [r0]
orr r3, r3, r3, lsl #16
add r0, r0, #0x110000
and r12,r3, r1, ror #16 @ data is big-endian to be written as little, have to byteswap
and r1, r3, r1, ror #24
orr r1, r1, r12,lsl #8 @ end of byteswap
strh r1, [r2, r0]!
cmp r2, #0x1e
movne r1, r1, lsr #16
strneh r1, [r2, #2]
bx lr
cmp r2, #0x10
bge m_m68k_write32_regs_comm
cmp r2, #0x0c
bge m_m68k_write32_regs_spec @ hits the nasty comm reg qiurk
m_m68k_write32_regs:
bic r0, r0, #1
stmfd sp!,{r0,r1,lr}
mov r1, r1, lsr #24
@ -1293,6 +1430,29 @@ m_m68k_write32_regs:
add r0, r0, #3
b m68k_reg_write8
m_m68k_write32_regs_comm: @ Handle the 0x10-0x1f range
ldr r0, =(Pico+0x22200)
mov r3, #0xff
ldr r0, [r0]
orr r3, r3, r3, lsl #16
add r0, r0, #0x110000
and r12,r3, r1, ror #16 @ data is big-endian to be written as little, have to byteswap
and r1, r3, r1, ror #24
orr r1, r1, r12,lsl #8 @ end of byteswap
cmp r2, #0x1e
strh r1, [r2, r0]!
ldr r3, =s68k_poll_adclk
ldr r0, [r3]
movne r1, r1, lsr #16
strneh r1, [r2, #2]
cmp r0, #0x10
bxlt lr
ldr r0, =PicoCpuS68k @ remove poll detected state for s68k
mov r1, #0
str r1, [r0, #0x58]
str r1, [r3]
bx lr
m_m68k_write32_misc:
bic r0, r0, #1
stmfd sp!,{r0,r1,lr}
@ -1302,6 +1462,15 @@ m_m68k_write32_misc:
add r0, r0, #2
b OtherWrite16
m_m68k_write32_regs_spec:
bic r0, r0, #1
stmfd sp!,{r0,r1,lr}
mov r1, r1, lsr #16
bl m_m68k_write16_regs
ldmfd sp!,{r0,r1,lr}
add r0, r0, #2
b m_m68k_write16_regs
m_m68k_write32_vdp:
tst r0, #0x70000
@ -2123,12 +2292,11 @@ m_s68k_write32_pcm_ram:
m_s68k_write32_pcm_reg:
mov r0, r0, lsr #1
add r2, r0, #1
mov r3, r1
stmfd sp!,{r2,r3,lr}
stmfd sp!,{r0,r1,lr}
mov r1, r1, lsr #16
bl pcm_write
ldmfd sp!,{r0,r1,lr}
add r0, r0, #1
b pcm_write
@ -2137,11 +2305,16 @@ m_s68k_write32_regs:
bic r0, r0, #0x008000
bic r0, r0, #1
tst r0, #0x7e00
movne r0, #0
bxne lr
sub r2, r0, #0x58
cmp r2, #0x10
blo m_s68k_write32_regs_gfx
and r2, r0, #0x1fc
cmp r2, #0x0c
beq m_s68k_write32_regs_spec @ hits 0x0f
and r2, r0, #0x1f0
cmp r2, #0x20
beq m_s68k_write32_regs_comm
stmfd sp!,{r0,r1,lr}
mov r1, r1, lsr #24
@ -2161,11 +2334,34 @@ m_s68k_write32_regs:
b s68k_reg_write8
m_s68k_write32_regs_gfx:
mov r3, r1
add r2, r0, #2
stmfd sp!,{r2,r3,lr}
stmfd sp!,{r0,r1,lr}
mov r1, r1, lsr #16
bl gfx_cd_write16
ldmfd sp!,{r0,r1,lr}
add r0, r0, #2
b gfx_cd_write16
m_s68k_write32_regs_comm: @ Handle the 0x20-0x2f range
ldr r2, =(Pico+0x22200)
mov r3, #0xff
ldr r2, [r2]
orr r3, r3, r3, lsl #16
add r2, r2, #0x110000
and r12,r3, r1, ror #16 @ data is big-endian to be written as little, have to byteswap
and r1, r3, r1, ror #24
orr r1, r1, r12,lsl #8 @ end of byteswap
cmp r0, #0x2e
strh r1, [r0, r2]!
movne r1, r1, lsr #16
strneh r1, [r0, #2]
bx lr
m_s68k_write32_regs_spec:
stmfd sp!,{r0,r1,lr}
mov r1, r1, lsr #16
bl m_s68k_write16_regs
ldmfd sp!,{r0,r1,lr}
add r0, r0, #2
b m_s68k_write16_regs

View file

@ -1,3 +1,5 @@
// Some misc stuff
// (c) Copyright 2007, Grazvydas "notaz" Ignotas
unsigned char formatted_bram[4*0x10] =
@ -21,6 +23,7 @@ unsigned char formatted_bram[4*0x10] =
// 128K | bit ] | bank0 |
// 256K | unused | bank1 |
#ifndef _ASM_MISC_C
void wram_2M_to_1M(unsigned char *m)
{
unsigned short *m1M_b0, *m1M_b1;
@ -53,4 +56,5 @@ void wram_1M_to_2M(unsigned char *m)
*m2M++ = tmp;
}
}
#endif

View file

@ -1,10 +1,4 @@
// This is part of Pico Library
// (c) Copyright 2004 Dave, All rights reserved.
// (c) Copyright 2007 notaz, All rights reserved.
// Free for non-commercial use.
// For commercial use, separate licencing terms must be obtained.
#include "../PicoInt.h"
@ -81,6 +75,12 @@ int PicoResetMCD(int hard)
//PicoMemResetCDdecode(1); // don't have to call this in 2M mode
#endif
// use SRam.data for RAM cart
if (SRam.data) free(SRam.data);
SRam.data = NULL;
if (PicoOpt&0x8000)
SRam.data = calloc(1, 0x12000);
return 0;
}

View file

@ -1,10 +1,4 @@
// This is part of Pico Library
// (c) Copyright 2004 Dave, All rights reserved.
// (c) Copyright 2006 notaz, All rights reserved.
// Free for non-commercial use.
// For commercial use, separate licencing terms must be obtained.
#include "../PicoInt.h"

View file

@ -1,3 +1,6 @@
// Buffering handling
// (c) Copyright 2007, Grazvydas "notaz" Ignotas
#include "../PicoInt.h"
//#include <stdlib.h>

View file

@ -1,3 +1,12 @@
/***********************************************************
* *
* This source was taken from the Gens project *
* Written by Stéphane Dallongeville *
* Copyright (c) 2002 by Stéphane Dallongeville *
* Modified/adapted for PicoDrive by notaz, 2007 *
* *
***********************************************************/
#include <sys/stat.h>
#include "cd_file.h"

View file

@ -1,3 +1,12 @@
/***********************************************************
* *
* This source was taken from the Gens project *
* Written by Stéphane Dallongeville *
* Copyright (c) 2002 by Stéphane Dallongeville *
* Modified/adapted for PicoDrive by notaz, 2007 *
* *
***********************************************************/
#include <stdio.h>
#include "cd_sys.h"
#include "cd_file.h"
@ -17,19 +26,7 @@
#define PLAYING 0x0100 // PLAYING audio track CDD status
/*
int CDDA_Enable;
int CD_Audio_Buffer_L[8192];
int CD_Audio_Buffer_R[8192];
int CD_Audio_Buffer_Read_Pos = 0;
int CD_Audio_Buffer_Write_Pos = 2000;
int CD_Audio_Starting;
*/
static int CD_Present = 0;
// int CD_Timer_Counter = 0; // TODO: check refs
#define CHECK_TRAY_OPEN \
@ -65,20 +62,6 @@ if (!CD_Present) \
}
#if 0
static void MSB2DWORD(unsigned int *d, unsigned char *b)
{
unsigned int retVal;
retVal = (unsigned int )b[0];
retVal = (retVal<<8) + (unsigned int )b[1];
retVal = (retVal<<8) + (unsigned int )b[2];
retVal = (retVal<<8) + (unsigned int )b[3];
*d = retVal;
}
#endif
static int MSF_to_LBA(_msf *MSF)
{
return (MSF->M * 60 * 75) + (MSF->S * 75) + MSF->F - 150;

View file

@ -1,3 +1,12 @@
/***********************************************************
* *
* This source was taken from the Gens project *
* Written by Stéphane Dallongeville *
* Copyright (c) 2002 by Stéphane Dallongeville *
* Modified/adapted for PicoDrive by notaz, 2007 *
* *
***********************************************************/
#ifndef _CD_SYS_H
#define _CD_SYS_H

View file

@ -1,3 +1,5 @@
// Convert "cell arrange" address to normal address.
// (c) Copyright 2007, Grazvydas "notaz" Ignotas
// 64 x32 x16 x8 x4 x4
static unsigned int cell_map(int celln)

View file

@ -1,3 +1,9 @@
// This is a direct rewrite of gfx_cd.asm (x86 asm to C).
// You can even find some x86 register names :)
// Original code (c) 2002 by Stéphane Dallongeville
// (c) Copyright 2007, Grazvydas "notaz" Ignotas
#include "../PicoInt.h"

76
Pico/cd/misc.s Normal file
View file

@ -0,0 +1,76 @@
@ vim:filetype=armasm
@ Memory converters for different modes
@ (c) Copyright 2007, Grazvydas "notaz" Ignotas
@ r10 is tmp, io1 is lsb halfword, io2 is msb
@ | 0 1 | 2 3 | -> | 0 2 | 1 3 | (little endian)
.macro _conv_reg io1 io2
mov r10, \io2, lsl #16
and \io2, \io2, r11, lsl #16
orr \io2, \io2, \io1, lsr #16
and \io1, \io1, r11
orr \io1, \io1, r10
/*
mov \io2, \io2, ror #16
mov r10, \io1, lsl #16
orr r10, r10, \io2, lsr #16
mov \io1, \io1, lsr #16
orr \io1, \io1, \io2, lsl #16
mov \io2, r10, ror #16
*/
.endm
.global wram_2M_to_1M
wram_2M_to_1M:
stmfd sp!,{r4-r11,lr}
add r1, r0, #0x60000 @ m1M_b1
add r0, r0, #0x40000 @ m1M_b0
mov r2, r0 @ m2M
mov r11, #0xff
orr r11, r11, r11, lsl #8
mov r12, #(0x40000/8/4)
_2Mto1M_loop:
ldmdb r2!,{r3-r9,lr}
_conv_reg r3,r4
_conv_reg r5,r6
_conv_reg r7,r8
_conv_reg r9,lr
subs r12, r12, #1
stmdb r0!,{r3,r5,r7,r9}
stmdb r1!,{r4,r6,r8,lr}
bne _2Mto1M_loop
ldmfd sp!,{r4-r11,pc}
.global wram_1M_to_2M
wram_1M_to_2M:
stmfd sp!,{r4-r11,lr}
mov r2, r0 @ m2M
add r1, r0, #0x40000 @ m1M_b1
add r0, r0, #0x20000 @ m1M_b0
mov r11, #0xff
orr r11, r11, r11, lsl #8
mov r12, #(0x40000/8/4)
_1Mto2M_loop:
ldmia r0!,{r3,r5,r7,r9}
ldmia r1!,{r4,r6,r8,lr}
_conv_reg r3,r4
_conv_reg r5,r6
_conv_reg r7,r8
_conv_reg r9,lr
subs r12, r12, #1
stmia r2!,{r3-r9,lr}
bne _1Mto2M_loop
ldmfd sp!,{r4-r11,pc}

View file

@ -1,3 +1,7 @@
// Emulation routines for the RF5C164 PCM chip.
// Based on Gens code by Stéphane Dallongeville
// (c) Copyright 2007, Grazvydas "notaz" Ignotas
#include "../PicoInt.h"
#include "pcm.h"