Revision abd0c6bd hw/m48t59.c
b/hw/m48t59.c | ||
---|---|---|
80 | 80 |
} M48t59SysBusState; |
81 | 81 |
|
82 | 82 |
/* Fake timer functions */ |
83 |
/* Generic helpers for BCD */ |
|
84 |
static inline uint8_t toBCD (uint8_t value) |
|
85 |
{ |
|
86 |
return (((value / 10) % 10) << 4) | (value % 10); |
|
87 |
} |
|
88 |
|
|
89 |
static inline uint8_t fromBCD (uint8_t BCD) |
|
90 |
{ |
|
91 |
return ((BCD >> 4) * 10) + (BCD & 0x0F); |
|
92 |
} |
|
93 | 83 |
|
94 | 84 |
/* Alarm management */ |
95 | 85 |
static void alarm_cb (void *opaque) |
... | ... | |
219 | 209 |
break; |
220 | 210 |
case 0x1FF2: |
221 | 211 |
/* alarm seconds */ |
222 |
tmp = fromBCD(val & 0x7F);
|
|
212 |
tmp = from_bcd(val & 0x7F);
|
|
223 | 213 |
if (tmp >= 0 && tmp <= 59) { |
224 | 214 |
NVRAM->alarm.tm_sec = tmp; |
225 | 215 |
NVRAM->buffer[0x1FF2] = val; |
... | ... | |
228 | 218 |
break; |
229 | 219 |
case 0x1FF3: |
230 | 220 |
/* alarm minutes */ |
231 |
tmp = fromBCD(val & 0x7F);
|
|
221 |
tmp = from_bcd(val & 0x7F);
|
|
232 | 222 |
if (tmp >= 0 && tmp <= 59) { |
233 | 223 |
NVRAM->alarm.tm_min = tmp; |
234 | 224 |
NVRAM->buffer[0x1FF3] = val; |
... | ... | |
237 | 227 |
break; |
238 | 228 |
case 0x1FF4: |
239 | 229 |
/* alarm hours */ |
240 |
tmp = fromBCD(val & 0x3F);
|
|
230 |
tmp = from_bcd(val & 0x3F);
|
|
241 | 231 |
if (tmp >= 0 && tmp <= 23) { |
242 | 232 |
NVRAM->alarm.tm_hour = tmp; |
243 | 233 |
NVRAM->buffer[0x1FF4] = val; |
... | ... | |
246 | 236 |
break; |
247 | 237 |
case 0x1FF5: |
248 | 238 |
/* alarm date */ |
249 |
tmp = fromBCD(val & 0x1F);
|
|
239 |
tmp = from_bcd(val & 0x1F);
|
|
250 | 240 |
if (tmp != 0) { |
251 | 241 |
NVRAM->alarm.tm_mday = tmp; |
252 | 242 |
NVRAM->buffer[0x1FF5] = val; |
... | ... | |
270 | 260 |
case 0x1FF9: |
271 | 261 |
case 0x07F9: |
272 | 262 |
/* seconds (BCD) */ |
273 |
tmp = fromBCD(val & 0x7F);
|
|
263 |
tmp = from_bcd(val & 0x7F);
|
|
274 | 264 |
if (tmp >= 0 && tmp <= 59) { |
275 | 265 |
get_time(NVRAM, &tm); |
276 | 266 |
tm.tm_sec = tmp; |
... | ... | |
289 | 279 |
case 0x1FFA: |
290 | 280 |
case 0x07FA: |
291 | 281 |
/* minutes (BCD) */ |
292 |
tmp = fromBCD(val & 0x7F);
|
|
282 |
tmp = from_bcd(val & 0x7F);
|
|
293 | 283 |
if (tmp >= 0 && tmp <= 59) { |
294 | 284 |
get_time(NVRAM, &tm); |
295 | 285 |
tm.tm_min = tmp; |
... | ... | |
299 | 289 |
case 0x1FFB: |
300 | 290 |
case 0x07FB: |
301 | 291 |
/* hours (BCD) */ |
302 |
tmp = fromBCD(val & 0x3F);
|
|
292 |
tmp = from_bcd(val & 0x3F);
|
|
303 | 293 |
if (tmp >= 0 && tmp <= 23) { |
304 | 294 |
get_time(NVRAM, &tm); |
305 | 295 |
tm.tm_hour = tmp; |
... | ... | |
309 | 299 |
case 0x1FFC: |
310 | 300 |
case 0x07FC: |
311 | 301 |
/* day of the week / century */ |
312 |
tmp = fromBCD(val & 0x07);
|
|
302 |
tmp = from_bcd(val & 0x07);
|
|
313 | 303 |
get_time(NVRAM, &tm); |
314 | 304 |
tm.tm_wday = tmp; |
315 | 305 |
set_time(NVRAM, &tm); |
... | ... | |
318 | 308 |
case 0x1FFD: |
319 | 309 |
case 0x07FD: |
320 | 310 |
/* date */ |
321 |
tmp = fromBCD(val & 0x1F);
|
|
311 |
tmp = from_bcd(val & 0x1F);
|
|
322 | 312 |
if (tmp != 0) { |
323 | 313 |
get_time(NVRAM, &tm); |
324 | 314 |
tm.tm_mday = tmp; |
... | ... | |
328 | 318 |
case 0x1FFE: |
329 | 319 |
case 0x07FE: |
330 | 320 |
/* month */ |
331 |
tmp = fromBCD(val & 0x1F);
|
|
321 |
tmp = from_bcd(val & 0x1F);
|
|
332 | 322 |
if (tmp >= 1 && tmp <= 12) { |
333 | 323 |
get_time(NVRAM, &tm); |
334 | 324 |
tm.tm_mon = tmp - 1; |
... | ... | |
338 | 328 |
case 0x1FFF: |
339 | 329 |
case 0x07FF: |
340 | 330 |
/* year */ |
341 |
tmp = fromBCD(val);
|
|
331 |
tmp = from_bcd(val);
|
|
342 | 332 |
if (tmp >= 0 && tmp <= 99) { |
343 | 333 |
get_time(NVRAM, &tm); |
344 | 334 |
if (NVRAM->type == 8) |
345 |
tm.tm_year = fromBCD(val) + 68; // Base year is 1968
|
|
335 |
tm.tm_year = from_bcd(val) + 68; // Base year is 1968
|
|
346 | 336 |
else |
347 |
tm.tm_year = fromBCD(val);
|
|
337 |
tm.tm_year = from_bcd(val);
|
|
348 | 338 |
set_time(NVRAM, &tm); |
349 | 339 |
} |
350 | 340 |
break; |
... | ... | |
410 | 400 |
case 0x07F9: |
411 | 401 |
/* seconds (BCD) */ |
412 | 402 |
get_time(NVRAM, &tm); |
413 |
retval = (NVRAM->buffer[addr] & 0x80) | toBCD(tm.tm_sec);
|
|
403 |
retval = (NVRAM->buffer[addr] & 0x80) | to_bcd(tm.tm_sec);
|
|
414 | 404 |
break; |
415 | 405 |
case 0x1FFA: |
416 | 406 |
case 0x07FA: |
417 | 407 |
/* minutes (BCD) */ |
418 | 408 |
get_time(NVRAM, &tm); |
419 |
retval = toBCD(tm.tm_min);
|
|
409 |
retval = to_bcd(tm.tm_min);
|
|
420 | 410 |
break; |
421 | 411 |
case 0x1FFB: |
422 | 412 |
case 0x07FB: |
423 | 413 |
/* hours (BCD) */ |
424 | 414 |
get_time(NVRAM, &tm); |
425 |
retval = toBCD(tm.tm_hour);
|
|
415 |
retval = to_bcd(tm.tm_hour);
|
|
426 | 416 |
break; |
427 | 417 |
case 0x1FFC: |
428 | 418 |
case 0x07FC: |
... | ... | |
434 | 424 |
case 0x07FD: |
435 | 425 |
/* date */ |
436 | 426 |
get_time(NVRAM, &tm); |
437 |
retval = toBCD(tm.tm_mday);
|
|
427 |
retval = to_bcd(tm.tm_mday);
|
|
438 | 428 |
break; |
439 | 429 |
case 0x1FFE: |
440 | 430 |
case 0x07FE: |
441 | 431 |
/* month */ |
442 | 432 |
get_time(NVRAM, &tm); |
443 |
retval = toBCD(tm.tm_mon + 1);
|
|
433 |
retval = to_bcd(tm.tm_mon + 1);
|
|
444 | 434 |
break; |
445 | 435 |
case 0x1FFF: |
446 | 436 |
case 0x07FF: |
447 | 437 |
/* year */ |
448 | 438 |
get_time(NVRAM, &tm); |
449 | 439 |
if (NVRAM->type == 8) |
450 |
retval = toBCD(tm.tm_year - 68); // Base year is 1968
|
|
440 |
retval = to_bcd(tm.tm_year - 68); // Base year is 1968
|
|
451 | 441 |
else |
452 |
retval = toBCD(tm.tm_year);
|
|
442 |
retval = to_bcd(tm.tm_year);
|
|
453 | 443 |
break; |
454 | 444 |
default: |
455 | 445 |
/* Check lock registers state */ |
Also available in: Unified diff