Made v3021 rtc an external device.
This commit is contained in:
parent
bafa279da0
commit
d2a79db034
|
@ -83,7 +83,7 @@ depobj := about.o bzip.o cona.o debugger.o drv.o dwmapi_core.o dynhuff.o fba_ka
|
|||
burn.o burn_gun.o burn_led.o burn_memory.o burn_sound.o burn_sound_c.o cheat.o debug_track.o hiscore.o load.o \
|
||||
tiles_generic.o timer.o vector.o \
|
||||
\
|
||||
8255ppi.o eeprom.o pandora.o seibusnd.o timekpr.o \
|
||||
8255ppi.o eeprom.o pandora.o seibusnd.o timekpr.o v3021.o \
|
||||
\
|
||||
ay8910.o burn_y8950.o burn_ym2151.o burn_ym2203.o burn_ym2413.o burn_ym2608.o burn_ym2610.o burn_ym2612.o \
|
||||
burn_ym3526.o burn_ym3812.o burn_ymf278b.o dac.o es5506.o es8712.o fm.o fmopl.o ics2115.o iremga20.o k007232.o \
|
||||
|
|
|
@ -0,0 +1,87 @@
|
|||
/* v3021 Calendar Emulation */
|
||||
|
||||
#include "burnint.h"
|
||||
|
||||
static UINT8 CalVal, CalMask, CalCom=0, CalCnt=0;
|
||||
|
||||
static UINT8 bcd(UINT8 data)
|
||||
{
|
||||
return ((data / 10) << 4) | (data % 10);
|
||||
}
|
||||
|
||||
UINT8 v3021Read()
|
||||
{
|
||||
UINT8 calr;
|
||||
calr = (CalVal & CalMask) ? 1 : 0;
|
||||
CalMask <<= 1;
|
||||
return calr;
|
||||
}
|
||||
|
||||
void v3021Write(UINT16 data)
|
||||
{
|
||||
time_t nLocalTime = time(NULL);
|
||||
tm* tmLocalTime = localtime(&nLocalTime);
|
||||
|
||||
CalCom <<= 1;
|
||||
CalCom |= data & 1;
|
||||
++CalCnt;
|
||||
if(CalCnt==4)
|
||||
{
|
||||
CalMask = 1;
|
||||
CalVal = 1;
|
||||
CalCnt = 0;
|
||||
|
||||
switch(CalCom & 0xf)
|
||||
{
|
||||
case 0x1: case 0x3: case 0x5: case 0x7: case 0x9: case 0xb: case 0xd:
|
||||
CalVal++;
|
||||
break;
|
||||
|
||||
case 0x0: // Day
|
||||
CalVal=bcd(tmLocalTime->tm_wday);
|
||||
break;
|
||||
|
||||
case 0x2: // Hours
|
||||
CalVal=bcd(tmLocalTime->tm_hour);
|
||||
break;
|
||||
|
||||
case 0x4: // Seconds
|
||||
CalVal=bcd(tmLocalTime->tm_sec);
|
||||
break;
|
||||
|
||||
case 0x6: // Month
|
||||
CalVal=bcd(tmLocalTime->tm_mon + 1); // not bcd in MVS
|
||||
break;
|
||||
|
||||
case 0x8: // Milliseconds?
|
||||
CalVal=0;
|
||||
break;
|
||||
|
||||
case 0xa: // Day
|
||||
CalVal=bcd(tmLocalTime->tm_mday);
|
||||
break;
|
||||
|
||||
case 0xc: // Minute
|
||||
CalVal=bcd(tmLocalTime->tm_min);
|
||||
break;
|
||||
|
||||
case 0xe: // Year
|
||||
CalVal=bcd(tmLocalTime->tm_year % 100);
|
||||
break;
|
||||
|
||||
case 0xf: // Load Date
|
||||
tmLocalTime = localtime(&nLocalTime);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
INT32 v3021Scan()
|
||||
{
|
||||
SCAN_VAR(CalVal);
|
||||
SCAN_VAR(CalMask);
|
||||
SCAN_VAR(CalCom);
|
||||
SCAN_VAR(CalCnt);
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
/* v3021 Calendar Emulation */
|
||||
|
||||
UINT8 v3021Read();
|
||||
void v3021Write(UINT16 data);
|
||||
|
||||
INT32 v3021Scan();
|
|
@ -1,6 +1,7 @@
|
|||
|
||||
#include "pgm.h"
|
||||
#include "arm7_intf.h"
|
||||
#include "v3021.h"
|
||||
|
||||
UINT8 PgmJoy1[8] = {0,0,0,0,0,0,0,0};
|
||||
UINT8 PgmJoy2[8] = {0,0,0,0,0,0,0,0};
|
||||
|
@ -231,88 +232,12 @@ static INT32 pgmGetRoms(bool bLoad)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Calendar Emulation */
|
||||
|
||||
static UINT8 CalVal, CalMask, CalCom=0, CalCnt=0;
|
||||
|
||||
static UINT8 bcd(UINT8 data)
|
||||
{
|
||||
return ((data / 10) << 4) | (data % 10);
|
||||
}
|
||||
|
||||
static UINT8 pgm_calendar_r()
|
||||
{
|
||||
UINT8 calr;
|
||||
calr = (CalVal & CalMask) ? 1 : 0;
|
||||
CalMask <<= 1;
|
||||
return calr;
|
||||
}
|
||||
|
||||
static void pgm_calendar_w(UINT16 data)
|
||||
{
|
||||
time_t nLocalTime = time(NULL);
|
||||
tm* tmLocalTime = localtime(&nLocalTime);
|
||||
|
||||
CalCom <<= 1;
|
||||
CalCom |= data & 1;
|
||||
++CalCnt;
|
||||
if(CalCnt==4)
|
||||
{
|
||||
CalMask = 1;
|
||||
CalVal = 1;
|
||||
CalCnt = 0;
|
||||
|
||||
switch(CalCom & 0xf)
|
||||
{
|
||||
case 0x1: case 0x3: case 0x5: case 0x7: case 0x9: case 0xb: case 0xd:
|
||||
CalVal++;
|
||||
break;
|
||||
|
||||
case 0x0: // Day
|
||||
CalVal=bcd(tmLocalTime->tm_wday);
|
||||
break;
|
||||
|
||||
case 0x2: // Hours
|
||||
CalVal=bcd(tmLocalTime->tm_hour);
|
||||
break;
|
||||
|
||||
case 0x4: // Seconds
|
||||
CalVal=bcd(tmLocalTime->tm_sec);
|
||||
break;
|
||||
|
||||
case 0x6: // Month
|
||||
CalVal=bcd(tmLocalTime->tm_mon + 1); // not bcd in MVS
|
||||
break;
|
||||
|
||||
case 0x8: // Milliseconds?
|
||||
CalVal=0;
|
||||
break;
|
||||
|
||||
case 0xa: // Day
|
||||
CalVal=bcd(tmLocalTime->tm_mday);
|
||||
break;
|
||||
|
||||
case 0xc: // Minute
|
||||
CalVal=bcd(tmLocalTime->tm_min);
|
||||
break;
|
||||
|
||||
case 0xe: // Year
|
||||
CalVal=bcd(tmLocalTime->tm_year % 100);
|
||||
break;
|
||||
|
||||
case 0xf: // Load Date
|
||||
tmLocalTime = localtime(&nLocalTime);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
UINT8 __fastcall PgmReadByte(UINT32 sekAddress)
|
||||
{
|
||||
switch (sekAddress)
|
||||
{
|
||||
case 0xC00007:
|
||||
return pgm_calendar_r();
|
||||
return v3021Read();
|
||||
|
||||
case 0xC08007: // dipswitches - (ddp2)
|
||||
return ~(PgmInput[6]) | 0xe0;
|
||||
|
@ -332,7 +257,7 @@ UINT16 __fastcall PgmReadWord(UINT32 sekAddress)
|
|||
return ics2115_soundlatch_r(1);
|
||||
|
||||
case 0xC00006: // ketsui wants this
|
||||
return pgm_calendar_r();
|
||||
return v3021Read();
|
||||
|
||||
case 0xC08000: // p1+p2 controls
|
||||
return ~(PgmInput[0] | (PgmInput[1] << 8));
|
||||
|
@ -383,7 +308,7 @@ void __fastcall PgmWriteWord(UINT32 sekAddress, UINT16 wordValue)
|
|||
break;
|
||||
|
||||
case 0xC00006:
|
||||
pgm_calendar_w(wordValue);
|
||||
v3021Write(wordValue);
|
||||
break;
|
||||
|
||||
case 0xC00008:
|
||||
|
@ -1008,6 +933,8 @@ INT32 pgmScan(INT32 nAction,INT32 *pnMin)
|
|||
SekScan(nAction);
|
||||
ZetScan(nAction);
|
||||
|
||||
v3021Scan();
|
||||
|
||||
SCAN_VAR(PgmInput);
|
||||
|
||||
SCAN_VAR(nPgmZ80Work);
|
||||
|
@ -1015,11 +942,6 @@ INT32 pgmScan(INT32 nAction,INT32 *pnMin)
|
|||
SCAN_VAR(nPgmCurrentBios);
|
||||
|
||||
ics2115_scan(nAction, pnMin);
|
||||
|
||||
SCAN_VAR(CalVal);
|
||||
SCAN_VAR(CalMask);
|
||||
SCAN_VAR(CalCom);
|
||||
SCAN_VAR(CalCnt);
|
||||
}
|
||||
|
||||
if (pPgmScanCallback) {
|
||||
|
|
Loading…
Reference in New Issue