* Copyright (C) 1999 Jonathan St-André
* Copyright (C) 1999 Hugo Villeneuve <hugo@hugovil.com>
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ * This file is released under the GPLv2
*/
#include <stdio.h>
#include "psw.h"
#include "options.h"
#include "instructions_8051.h"
+#include "timers.h"
-static int gp_timer_value;
+static int gp_timer_value[GP_TIMERS_COUNT];
extern struct options_t options;
void
-gp_timer_reset(void)
+gp_timer_reset(int id)
{
- log_debug("gp timer reset");
- gp_timer_value = 0;
+ log_debug("gp timer %d reset", id);
+ gp_timer_value[id] = 0;
}
void
-gp_timer_increment(int count)
+gp_timers_increment(int count)
{
- log_debug("gp timer increment");
- gp_timer_value += count;
+ int id;
+
+ log_debug("gp timers increment");
+
+ for (id = 0; id < GP_TIMERS_COUNT; id++)
+ gp_timer_value[id] += count;
}
int
-gp_timer_read(void)
+gp_timer_read(int id)
{
- return gp_timer_value;
+ return gp_timer_value[id];
}
static void
{
unsigned int tmp;
- tmp = cpu8051_ReadD(counter_address);
+ tmp = mem_read_direct(counter_address);
tmp++;
tmp &= 0xFF;
if (tmp == 0) {
/* If overflow set TFx */
- cpu8051_WriteD(_TCON_, cpu8051_ReadD(_TCON_) | tf_mask);
+ mem_write_direct(_TCON_,
+ mem_read_direct(_TCON_) | tf_mask);
}
- cpu8051_WriteD(counter_address, tmp); /* Save new value. */
+ mem_write_direct(counter_address, tmp); /* Save new value. */
}
static void
-timer_with_prescaler(uint8_t tl, uint8_t th, uint8_t tf_mask, int prescaler_width)
+timer_with_prescaler(uint8_t tl, uint8_t th, uint8_t tf_mask,
+ int prescaler_width)
{
unsigned int prescaler;
- prescaler = cpu8051_ReadD(tl);
+ prescaler = mem_read_direct(tl);
prescaler++;
prescaler &= (1 << prescaler_width) - 1; /* Keep only required bits */
- cpu8051_WriteD(tl, prescaler);
+ mem_write_direct(tl, prescaler);
if (prescaler == 0)
timer_increment_check_overflow(th, tf_mask);
static void
process_timer(uint8_t tl, uint8_t th, uint8_t tf_mask, uint8_t TR, uint8_t mode,
- uint8_t GATE, uint32_t TimerCounter)
+ uint8_t gate, uint32_t timer_counter)
{
unsigned int tmp;
break;
case 2:
/* Mode 2, 8-bits counter with Auto-Reload */
- tmp = cpu8051_ReadD(tl);
+ tmp = mem_read_direct(tl);
tmp++;
tmp &= 0xFF;
if (tmp == 0) {
/* If overflow -> reload and set TF0 */
- cpu8051_WriteD(_TCON_, cpu8051_ReadD(_TCON_) | tf_mask);
- cpu8051_WriteD(tl, cpu8051_ReadD(th));
- } else
- cpu8051_WriteD(tl, tmp);
+ mem_write_direct(
+ _TCON_,
+ mem_read_direct(_TCON_) | tf_mask);
+ mem_write_direct(tl, mem_read_direct(th));
+ } else {
+ mem_write_direct(tl, tmp);
+ }
break;
case 3:
/*
if (tl == _TL1_)
break;
- if (TR && !GATE && !TimerCounter)
+ if (TR && !gate && !timer_counter)
timer_increment_check_overflow(tl, tf_mask);
/* TH0 uses TR1 et TF1. */
- TR = cpu8051_ReadD(_TCON_) & 0x40;
+ TR = mem_read_direct(_TCON_) & 0x40;
if (TR)
timer_increment_check_overflow(th, 0x80);
void
timers_check(void)
{
- unsigned int TR;
- unsigned int MODE;
- unsigned int GATE;
- unsigned int TimerCounter;
+ unsigned int tr;
+ unsigned int mode;
+ unsigned int gate;
+ unsigned int timer_counter;
/* Timer 0 */
- TR = cpu8051_ReadD(_TCON_) & 0x10;
- MODE = cpu8051_ReadD(_TMOD_) & 0x03;
- GATE = cpu8051_ReadD(_TMOD_) & 0x08;
- TimerCounter = cpu8051_ReadD(_TMOD_) & 0x04;
+ tr = mem_read_direct(_TCON_) & 0x10;
+ mode = mem_read_direct(_TMOD_) & 0x03;
+ gate = mem_read_direct(_TMOD_) & 0x08;
+ timer_counter = mem_read_direct(_TMOD_) & 0x04;
- if ((TR && !GATE && !TimerCounter) || (MODE == 3))
- process_timer(_TL0_, _TH0_, 0x20, TR, MODE, GATE, TimerCounter);
+ if ((tr && !gate && !timer_counter) || (mode == 3))
+ process_timer(_TL0_, _TH0_, 0x20, tr, mode, gate,
+ timer_counter);
/* Timer 1 */
- TR = cpu8051_ReadD(_TCON_) & 0x40;
- MODE = (cpu8051_ReadD(_TMOD_) & 0x30) >> 4 ;
- GATE = cpu8051_ReadD(_TMOD_) & 0x80;
- TimerCounter = cpu8051_ReadD(_TMOD_) & 0x40;
-
- if (TR && !GATE && !TimerCounter)
- process_timer(_TL1_, _TH1_, 0x80, TR, MODE, GATE, TimerCounter);
+ tr = mem_read_direct(_TCON_) & 0x40;
+ mode = (mem_read_direct(_TMOD_) & 0x30) >> 4;
+ gate = mem_read_direct(_TMOD_) & 0x80;
+ timer_counter = mem_read_direct(_TMOD_) & 0x40;
+
+ if (tr && !gate && !timer_counter)
+ process_timer(_TL1_, _TH1_, 0x80, tr, mode, gate,
+ timer_counter);
}