From d2a79db0341222e639077c1cc437dd3e0304cf58 Mon Sep 17 00:00:00 2001 From: iq_132 <1191709+iq132@users.noreply.github.com> Date: Wed, 14 Dec 2011 22:28:03 +0000 Subject: [PATCH] Made v3021 rtc an external device. --- makefile.rules | 2 +- src/burn/devices/v3021.cpp | 87 ++++++++++++++++++++++++++++++ src/burn/devices/v3021.h | 6 +++ src/burn/drivers/pgm/pgm_run.cpp | 90 +++----------------------------- 4 files changed, 100 insertions(+), 85 deletions(-) create mode 100644 src/burn/devices/v3021.cpp create mode 100644 src/burn/devices/v3021.h diff --git a/makefile.rules b/makefile.rules index 41244bd56..b4aaa065e 100644 --- a/makefile.rules +++ b/makefile.rules @@ -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 \ diff --git a/src/burn/devices/v3021.cpp b/src/burn/devices/v3021.cpp new file mode 100644 index 000000000..bf608d910 --- /dev/null +++ b/src/burn/devices/v3021.cpp @@ -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; +} diff --git a/src/burn/devices/v3021.h b/src/burn/devices/v3021.h new file mode 100644 index 000000000..746eb65ae --- /dev/null +++ b/src/burn/devices/v3021.h @@ -0,0 +1,6 @@ +/* v3021 Calendar Emulation */ + +UINT8 v3021Read(); +void v3021Write(UINT16 data); + +INT32 v3021Scan(); diff --git a/src/burn/drivers/pgm/pgm_run.cpp b/src/burn/drivers/pgm/pgm_run.cpp index 2f43f5a98..f976a3eaf 100644 --- a/src/burn/drivers/pgm/pgm_run.cpp +++ b/src/burn/drivers/pgm/pgm_run.cpp @@ -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) {