6502.org Forum  Projects  Code  Documents  Tools  Forum
It is currently Fri May 10, 2024 2:16 am

All times are UTC




Post new topic Reply to topic  [ 19 posts ]  Go to page 1, 2  Next
Author Message
 Post subject: T1 Timer system ticker
PostPosted: Sat Nov 13, 2021 11:56 pm 
Offline
User avatar

Joined: Sun Sep 08, 2013 10:24 am
Posts: 740
Location: A missile silo somewhere under southern England
Hi guys

Just a quite basic question about timing.
Today, Ben Eater released a video which is effectively doing the same thing as me: implementing a universal timing (or tick) system. His system runs at 1MHz and uses T1 timer in continuous running mode and increment memory everytime T1 hits 0 using ISR.

Question: My system interrupts at 1ms intervals & writes to RAM each time, much like Ben's does. Is this too often load-wise, or should I pad it out to 2 or 3ms? I can't go beyond 3ms due to the constraints of allowing up to 20MHz MPU and the limit of 16bits for the T1 counter. Is there a better way of doing this (short of using a RTC)?

Here are my calculations (please let me know if they don't make sense):

Code:
CPU_Speed = 10                      ; 10MHz
CyclesPerMS = CPU_Speed * 1000      ; number of cycles per millisecond
T1counter = tickCyclesPerMS - 2     ; remove 2 cycles as 2 are added during the interrupt process. This is the value loaded into T1CL and T1CH


Top
 Profile  
Reply with quote  
PostPosted: Sun Nov 14, 2021 1:37 am 
Offline
User avatar

Joined: Fri Aug 30, 2002 1:09 am
Posts: 8433
Location: Southern California
banedon wrote:
My system interrupts at 1ms intervals & writes to RAM each time, much like Ben's does. Is this too often load-wise, or should I pad it out to 2 or 3ms? I can't go beyond 3ms due to the constraints of allowing up to 20MHz MPU and the limit of 16bits for the T1 counter. Is there a better way of doing this (short of using a RTC)?

Here are my calculations (please let me know if they don't make sense):

Code:
T1counter = tickCyclesPerMS - 2     ; remove 2 cycles as 2 are added during the interrupt process.  This is the value loaded into T1CL and T1CH

The two extra cycles are for the automatic re-load, not the interrupt process. In T1 free-run mode, the counters are automatically reloaded from the latches. You don't have to do it in the ISR (which is good, since there will be different numbers of cycles between when the timer times out and when the interrupt sequence starts, due to where in a multi-cycle instruction the interrupt hits).

T1 period = (n+2) / φ2 freq; so 998 (or $3E6) is the correct value if you want 1ms @ 1MHz. The timeout will happen roughly every 250 instructions. For 2ms you'd want 1998 (or $7CE), and for 3ms you'd want 2998 (or $BB6), al at 1MHz. The maximum nice, round number of ms you could get at 1MHz is 50, or 1/20th of a second, with 49,998 ($C34E) in the latches; then the timeout would happen roughly every 12,500 instructions. At 20MHz, the maximum nice round number of ms you could get is 2.5, and again the timeout would happen roughly every 12,500 instructions.

See my 6502 interrupts article's section on that, at http://wilsonminesco.com/6502interrupts/#2.1, with code for a software RTC. Also, see my "Tip of the Day, #9" at viewtopic.php?p=2311#p2311, also #21.

_________________
http://WilsonMinesCo.com/ lots of 6502 resources
The "second front page" is http://wilsonminesco.com/links.html .
What's an additional VIA among friends, anyhow?


Top
 Profile  
Reply with quote  
PostPosted: Sun Jan 09, 2022 8:02 pm 
Offline
User avatar

Joined: Sun Sep 08, 2013 10:24 am
Posts: 740
Location: A missile silo somewhere under southern England
Sorry for the (very) late response! I just realised that I didn't reply.
Thanks for advising, Garth.
I ended up settling on 5ms as 1ms seemed just too often and the more I/O I add, the greater the overhead per interrupt.
Also, good to know about the cycle adjustment re the auto-reload :).


Top
 Profile  
Reply with quote  
PostPosted: Sun Jan 09, 2022 8:44 pm 
Offline
User avatar

Joined: Thu May 28, 2009 9:46 pm
Posts: 8178
Location: Midwestern USA
banedon wrote:
I ended up settling on 5ms as 1ms seemed just too often and the more I/O I add, the greater the overhead per interrupt.

I use 10ms jiffy IRQ spacing, incrementing a 32-bit uptime counter and a 48-bit date-and-time counter (seconds elapsed since midnight October 1, 1752). Naturally, the more often your timer interrupts, the slower foreground processing will run.

_________________
x86?  We ain't got no x86.  We don't NEED no stinking x86!


Top
 Profile  
Reply with quote  
PostPosted: Mon Jan 10, 2022 1:07 am 
Offline
User avatar

Joined: Sun Sep 08, 2013 10:24 am
Posts: 740
Location: A missile silo somewhere under southern England
What clock speed are you using with that? I might modify mine as I really don't need it to be too often and my in-progress upcoming 65816 design I may ditch it entirely as I'm incorporating a timer IC, although I'll have to clock stretch on access as it's 70ns.

[Edit] I assume you have a lower PHI2 as otherwise the number exceeds two bytes (unless you tick the memory every two interrupts)?

For mine:
Code:
CPU_Speed = 12                                 ; PHI2 @ 12MHz
CyclesPerMS = CPU_Speed * 1000                 ; number of cycles per *millisecond*. Example: CPU_Speed = 10 then CyclesPerMS = 10*1000 = 10000
SystemVIA_T1counter = CyclesPerMS * 10         ; value we're going to use for the T1 clock register for 10ms
SystemVIA_T1counter = SystemVIA_T1counter - 2  ; adjust for the latch to counter autoreload time


CyclesPerMS = 12 * 1,000 = 12,000
SystemVIA_T1counter = 12,000 * 10 = 120,000
SystemVIA_T1counter = 120,000 - 2 = 119,998

LSB = 119,998 MOD 256 = $BE
MSB = 119,998 DIV 256 = $1D4 (thus too large)

So the highest speed PHI2 can go to allow 10ms is just over 6MHz.
The only solution to that would be clock stretch the PHI2 into VIA *all of the time* and try and match access to it (not really do-able) or maybe put something slower on PB6 and pulse count? Obviously beyond dropping PHI2 to 6MHz.


Top
 Profile  
Reply with quote  
PostPosted: Mon Jan 10, 2022 5:13 pm 
Offline
User avatar

Joined: Thu May 28, 2009 9:46 pm
Posts: 8178
Location: Midwestern USA
banedon wrote:
What clock speed are you using with that?

POC V1.3 runs with a 16 MHz Ø2 clock. However, the time base for jiffy IRQs is the counter/timer (C/T) in DUART #1, not the Ø2 clock generator. The C/T gets its time base from the 3.6864 MHz oscillator that runs the DUART. Hence the jiffy IRQ rate is unaffected by changes to Ø2.

Quote:
I might modify mine as I really don't need it to be too often and my in-progress upcoming 65816 design I may ditch it entirely as I'm incorporating a timer IC, although I'll have to clock stretch on access as it's 70ns.

Early on when I was considering the design of POC V1.0, I contemplated using a PIT of some sort. Since I was also going to incorporate an RTC (the Maxim DS1511Y), which could generate “evenly-spaced interrupts,” I went that route—until I discovered the “evenly-spaced interrupts” came a little too fast. It was at that point that I started using the DUART's C/T, which underflows at 10 millisecond intervals. The stability of that time base is as good as the oscillator that clocks the DUART.

Quote:
[Edit] I assume you have a lower PHI2 as otherwise the number exceeds two bytes (unless you tick the memory every two interrupts)?

Two bytes? To what are you referring?

Quote:
For mine:
Code:
CPU_Speed = 12                                 ; PHI2 @ 12MHz
CyclesPerMS = CPU_Speed * 1000                 ; number of cycles per *millisecond*. Example: CPU_Speed = 10 then CyclesPerMS = 10*1000 = 10000
SystemVIA_T1counter = CyclesPerMS * 10         ; value we're going to use for the T1 clock register for 10ms
SystemVIA_T1counter = SystemVIA_T1counter - 2  ; adjust for the latch to counter autoreload time

CyclesPerMS = 12 * 1,000 = 12,000
SystemVIA_T1counter = 12,000 * 10 = 120,000
SystemVIA_T1counter = 120,000 - 2 = 119,998

LSB = 119,998 MOD 256 = $BE
MSB = 119,998 DIV 256 = $1D4 (thus too large)

So the highest speed PHI2 can go to allow 10ms is just over 6MHz.

I've never considered the VIA (and Commodore's 6526) to be a good source for a jiffy IRQ. That the timers are slaved to Ø2 (assuming that's what you're using as a time base) means you can't change Ø2 and expect accurate timekeeping.

Quote:
The only solution to that would be clock stretch the PHI2 into VIA *all of the time* and try and match access to it (not really do-able) or maybe put something slower on PB6 and pulse count? Obviously beyond dropping PHI2 to 6MHz.

That seems to be an awkward way to make up for a fundamental limitation of the 6522.

_________________
x86?  We ain't got no x86.  We don't NEED no stinking x86!


Top
 Profile  
Reply with quote  
PostPosted: Mon Jan 10, 2022 5:54 pm 
Offline
User avatar

Joined: Sun Sep 08, 2013 10:24 am
Posts: 740
Location: A missile silo somewhere under southern England
Quote:
POC V1.3 runs with a 16 MHz Ø2 clock. However, the time base for jiffy IRQs is the counter/timer (C/T) in DUART #1, not the Ø2 clock generator. The C/T gets its time base from the 3.6864 MHz oscillator that runs the DUART. Hence the jiffy IRQ rate is unaffected by changes to Ø2.

I left in an option to for the SC28L92 for this design, but not looked into how it's implemented beyond the pinout yet. I'll do so in a bit (I have both of your guides that you kindly post elsewhere :) ) and look at using it's clock.

Quote:
Early on when I was considering the design of POC V1.0, I contemplated using a PIT of some sort. Since I was also going to incorporate an RTC (the Maxim DS1511Y), which could generate “evenly-spaced interrupts,” I went that route—until I discovered the “evenly-spaced interrupts” came a little too fast. It was at that point that I started using the DUART's C/T, which underflows at 10 millisecond intervals. The stability of that time base is as good as the oscillator that clocks the DUART.

I was really after a RTC mostly and a jiffy timer as an after thought, but it's good to know. By too fast, do you mean it was running it's internal clock faster than advertised?

Quote:
Two bytes? To what are you referring?

The LSB (T1CL) and MSB (T1CH) of the VIA T1 clock/timer.

Quote:
I've never considered the VIA (and Commodore's 6526) to be a good source for a jiffy IRQ. That the timers are slaved to Ø2 (assuming that's what you're using as a time base) means you can't change Ø2 and expect accurate timekeeping.
...
That seems to be an awkward way to make up for a fundamental limitation of the 6522.

I fully agree. Maybe they thought that having the option on pulse counting on PB6 made up for that? Especially with the WDC designs as they probably wanted to keep backward compatibility.

As for 16MHz: my current design seems ok at that speed apart from the VIAs which fall to bits after 12MHz. Probably routing as the clock seems stable and (mostly) noiseless and the MPU/RAM/ROM all seem fine - certainly the code from the ROM runs and RAM (slowest component at 55ns) tests/stack access show fine. VIAs aren't CS tied to PHI high either, but if you up PHI2 from 14MHz to 16MHz they stop sending out interrupts. Bring PHI2 down to 14MHz (without reset) and the interrupt outputs again - as measured on the VIA. I might try swapping them out to see if it's just a bit of variability as 14MHz is the stated maximum. I did notice a bit of noise on the power rail, though, some may a bit of ensitivity to that? Got penty of bypass & main board 33uF (tants) so need ot investigate.


Top
 Profile  
Reply with quote  
PostPosted: Mon Jan 10, 2022 6:01 pm 
Offline
User avatar

Joined: Wed Feb 14, 2018 2:33 pm
Posts: 1411
Location: Scotland
banedon wrote:
As for 16MHz: my current design seems ok at that speed apart from the VIAs which fall to bits after 12MHz. Probably routing as the clock seems stable and (mostly) noiseless and the MPU/RAM/ROM all seem fine - certainly the code from the ROM runs and RAM (slowest component at 55ns) tests/stack access show fine. VIAs aren't CS tied to PHI high either, but if you up PHI2 from 14MHz to 16MHz they stop sending out interrupts. Bring PHI2 down to 14MHz (without reset) and the interrupt outputs again - as measured on the VIA. I might try swapping them out to see if it's just a bit of variability as 14MHz is the stated maximum. I did notice a bit of noise on the power rail, though, some may a bit of ensitivity to that? Got penty of bypass & main board 33uF (tants) so need ot investigate.


Just to add a data point... Not seeing any issues on my Ruby 816 boards at 16Mhz with a 1Khz interrupt...

-Gordon

_________________
--
Gordon Henderson.
See my Ruby 6502 and 65816 SBC projects here: https://projects.drogon.net/ruby/


Top
 Profile  
Reply with quote  
PostPosted: Mon Jan 10, 2022 6:53 pm 
Offline
User avatar

Joined: Fri Dec 11, 2009 3:50 pm
Posts: 3354
Location: Ontario, Canada
banedon wrote:
apart from the VIAs which fall to bits after 12MHz
Various things could cause this, and I'll explain one that seems worth looking into.

You're already aware, I think, that a VIA needs its Chip Select and Register Select inputs to be valid before the rise of Phi2. My concern involves the Chip Select inputs.

It may be that your glue logic (the address decoder) is the limiting factor. That is, at low clock rates the glue logic may fast enough. But above 12 MHz the rise of Phi2 happens sooner. And it could be that when Phi2 rises the VIA's Chip Select is not yet in the appropriate state.

Is the schematic for your glue logic posted anywhere? And are the chips in your project socketed? (An upgrade to 74AHC family may offer a quick fix!)

-- Jeff

_________________
In 1988 my 65C02 got six new registers and 44 new full-speed instructions!
https://laughtonelectronics.com/Arcana/ ... mmary.html


Top
 Profile  
Reply with quote  
PostPosted: Mon Jan 10, 2022 7:14 pm 
Offline
User avatar

Joined: Thu May 28, 2009 9:46 pm
Posts: 8178
Location: Midwestern USA
Dr Jefyll wrote:
It may be that your glue logic (the address decoder) is the limiting factor.

Stealing stuff out of my head again, you rascal! :D

It does smack of a glue logic bottleneck, but without a schematic, it's more an educated guess than anything else.

_________________
x86?  We ain't got no x86.  We don't NEED no stinking x86!


Top
 Profile  
Reply with quote  
PostPosted: Mon Jan 10, 2022 8:00 pm 
Offline
User avatar

Joined: Thu May 28, 2009 9:46 pm
Posts: 8178
Location: Midwestern USA
banedon wrote:
I left in an option to for the SC28L92 for this design, but not looked into how it's implemented beyond the pinout yet. I'll do so in a bit (I have both of your guides that you kindly post elsewhere :) ) and look at using it's clock.

The 28L92 has a lot to offer, not the least of which is two channels of (apparently) bug-free, high-speed serial I/O. :D The timer is easy to set up and use. In fact, the only thing that has to be done to acknowledge the timer interrupt is to do a read on a specific register (I use BIT for that purpose). Here's a quick snippet of code that can run on a 65C02 or a 65C816:

Code:
iirq0100 lda io_quart+nx_isra  ;DUART interrupting?
         beq iirq0200          ;no
;
;   ——————————————————
;   Timer A Processing
;   ——————————————————
;
         bit #nxpctirq         ;timer interrupting?
         beq iirq0200          ;no
;
         bit io_quart+nx_rcta  ;yes, clear interrupt
         dec jiffct            ;(jiffy IRQ counter) time to update?
         bne iirq0200          ;no

I believe I covered this in one of my articles.

Quote:
I was really after a RTC mostly and a jiffy timer as an after thought, but it's good to know. By too fast, do you mean it was running it's internal clock faster than advertised?

Lemme explain.

The DS1511Y has a watchdog timer that can be configured to interrupt regular intervals. The smallest interval that can be set is 10 milliseconds, which, of course, produces a 100 Hz jiffy IRQ, exactly what I wanted. The problem is the time base for the DS1511Y is an internal 32,768 Hz oscillator. Due to that frequency, it's mathematically impossible to get an exact 10ms interval out of the watchdog. As it worked out, the watchdog would run a little fast.

As near as I could tell with the instrumentation I had available to me when I discovered this issue, the watchdog at 10ms was about one percent fast. There was no apparent solution, and since the DUART's counter/timer was idle at the time, I decided to make it the new source of jiffy IRQs. Over a period of several months, the system kept time within a few seconds of what my UNIX software development box was reporting.

Quote:
Quote:
Two bytes? To what are you referring?

The LSB (T1CL) and MSB (T1CH) of the VIA T1 clock/timer.

Ah-so! The maximum interval you can program is 65,535 clock transitions, which limits you to around a 6 MHz Ø2 rate if you are after a 100 Hz jiffy IRQ rate (approximately—I'm doing the math in what's left of my brain). You can rig up timer B to counter timer A underflows, which would give you a longer spacing between IRQs.

In the case of using the C/T in the 28L92 to generate the 100 Hz jiffy IRQ, a value of 18,432 ($4800) exactly divides into the 3.6864 MHz “X1” clock (the clock that also drives the serial interface), so the 100 Hz rate is right on the money if the oscillator is also right on the money. An interesting alternative to using the X1 clock as the C/T's time base is the ability to run it from a separate clock source. I have a vague idea of doing so with the second DUART in POC V2.0 (still awaiting final assembly) via the X-Acto knife and blue wire method. The oscillator for that purpose would be chosen so the C/T runs at 1 MHz, giving me a HPET to supplement the 100 Hz jiffy IRQ.

Quote:
Quote:
I've never considered the VIA (and Commodore's 6526) to be a good source for a jiffy IRQ. That the timers are slaved to Ø2 (assuming that's what you're using as a time base) means you can't change Ø2 and expect accurate timekeeping.
...
That seems to be an awkward way to make up for a fundamental limitation of the 6522.

I fully agree. Maybe they thought that having the option on pulse counting on PB6 made up for that? Especially with the WDC designs as they probably wanted to keep backward compatibility.

WDC intended for their rendition of the 6522 to exactly replace the NMOS part. I see no reason why you couldn't apply a relatively low frequency pulse train to PB6, using a standard can oscillator. The only trouble with doing that is you can no longer use port B as an eight-bit peripheral interface.

Quote:
As for 16MHz: my current design seems ok at that speed apart from the VIAs which fall to bits after 12MHz.

As Jeff noted, it's probably a glue logic issue. You need to post a current schematic so we can see what's what.

The WDC VIAs are all officially rated for 14 MHz, and given their use of a 0.6µ process geometry in current production, I suspect they can tolerate more. In fact, I wouldn't be surprised if the parts with the latest TSMC cores could work at 20 MHz. The FMAX vs. VDD chart on page 39 of the data sheet seems to imply this.

_________________
x86?  We ain't got no x86.  We don't NEED no stinking x86!


Top
 Profile  
Reply with quote  
PostPosted: Mon Jan 10, 2022 11:02 pm 
Offline
User avatar

Joined: Sun Sep 08, 2013 10:24 am
Posts: 740
Location: A missile silo somewhere under southern England
I can definitely see the VIA being selected, but I don't know if the it's outside the acceptable window/too late.
The CPLD is an ATF1504AS 7ns part which should be fast enough. As the schematic is very large and spread out, I've posted relevant parts below.
I'll also post some of the CPLD code shortly.

Core (plus serial):

Attachment:
6502GPD_revB_Core_plus_Serial.gif
6502GPD_revB_Core_plus_Serial.gif [ 49.39 KiB | Viewed 2941 times ]


CPLD (contains all glue logic):

Attachment:
6502GPD_revB_CPLD.gif
6502GPD_revB_CPLD.gif [ 15.42 KiB | Viewed 2941 times ]


VIAs:

Attachment:
6502GPD_revB_VIAs.gif
6502GPD_revB_VIAs.gif [ 24.59 KiB | Viewed 2941 times ]


Top
 Profile  
Reply with quote  
PostPosted: Mon Jan 10, 2022 11:16 pm 
Offline
User avatar

Joined: Sun Sep 08, 2013 10:24 am
Posts: 740
Location: A missile silo somewhere under southern England
CPLD code
I've removed any irrelevant bits (RAM banking, RAM/ROM selects, etc.) for clarity:

Pin definitions:

Code:
/* Inputs */
Pin 2  = PHI2;            /* Fixed pin 2:  Main CPU clock (GCLK2) */
Pin [37,36,34,33,27,26,25,24] = [A7..0];  /* A15 to A8 */
Pin 39 = opendrain_irq;   /* Open drain IRQ input, used by SC28L92 */
Pin 40 = via1_irq;        /* Non-open drain IRQ input, used by 65C22 VIA */
Pin 41 = via2_irq;        /* Non-open drain IRQ input, used by 65C22 VIA */

/* Outputs */
Pin [14,16,11] = [B2..0];  /* A18 to A16 */
Pin 17 = !dev_via1_sel;    /* VIA 65C22 device 1 select */
Pin 18 = !dev_via2_sel;    /* VIA 65C22 device 2 select */
Pin 20 = IRQB;             /* MPU IRQ signal */


/* --- Buried Nodeq/Pins --- */
pinnode = romsel;           /* rom select flag */
pinnode = ramsel;           /* ram select flag */
pinnode = iosel;            /* I/O select flag */


VIA device selects:

Code:
/* iosel and romsel are determined first. If neither of these are selected (1) then ramsel is selected by default. */
iosel   = BaseAddr:['h'90..'h'99];   /* returns 1 if the top 4 bits correspond with %1001 (9) */
dev_via1_sel = iosel  & BaseAddr:['h'x1];               /* VIA1 device select. 65C22 should not be validated against PHI2 */
dev_via2_sel = iosel  & BaseAddr:['h'x2];               /* VIA2 device select. 65C22 should not be validated against PHI2 */


IRQs:

Code:
IRQB = opendrain_irq & via1_irq & via2_irq;


Top
 Profile  
Reply with quote  
PostPosted: Tue Jan 11, 2022 1:19 am 
Offline
User avatar

Joined: Thu May 28, 2009 9:46 pm
Posts: 8178
Location: Midwestern USA
banedon wrote:
CPLD code
I've removed any irrelevant bits (RAM banking, RAM/ROM selects, etc.) for clarity:

I'd like to see the IOSEL code.

_________________
x86?  We ain't got no x86.  We don't NEED no stinking x86!


Top
 Profile  
Reply with quote  
PostPosted: Tue Jan 11, 2022 8:41 am 
Offline
User avatar

Joined: Sun Sep 08, 2013 10:24 am
Posts: 740
Location: A missile silo somewhere under southern England
Code:
Pin 17 = !dev_via1_sel;    /* VIA 65C22 device 1 select */
Pin 18 = !dev_via2_sel;    /* VIA 65C22 device 2 select */

pinnode = iosel;            /* I/O select flag */

iosel   = BaseAddr:['h'90..'h'9F];   /* returns 1 if the top 4 bits correspond with %1001 (9) */
dev_via1_sel = iosel  & BaseAddr:['h'x1];               /* VIA1 device select. 65C22 should not be validated against PHI2 */
dev_via2_sel = iosel  & BaseAddr:['h'x2];               /* VIA2 device select. 65C22 should not be validated against PHI2 */


I've attached the entire PLD file here: (re-uploaded)
My snippets in the previous post had the IOSEL is seto BaseAddr of 90xx-99xx which is incorrect - I was playing around with the address ranges previously, testing with WinCUPL sim and hadn't restored the values. I've now restored it to 90xx-9Fxx. Not that it makes any difference to the VIAs.

I think we previously discussed this setup in another thread/PM, but for anyone else:

- iosel is set to true if:
A8..A15 (in the code it's referred to as A0..7) of the address bus is $9xxx: $90 through to $9F (so the MPU address bus is $90xx to $9Fxx).

- The VIA chip selects (dev_via1_sel & dev_via2_sel) are true if:
For VIA 1: iosl AND'd to the lower MSB address nibble (A8 to A11) equaling %0001 (i.e. 1) is true. So the address is $9xxx from iosel and $x1xx here must be: $91xx
For VIA 2: iosl AND'd to the lower MSB address nibble (A8 to A11) equaling %0010 (i.e. 2) is true. So the address is $9xxx from iosel and $x1xx here must be: $92xx

So this gives $9100 to $91FF for VIA1 and $9200 to $92FF for VIA2 (of course, each VIA only uses the LSB lower nibble : $0-$F so a bit of wastage address wise, but quite reasonable)

The pin outputs going to VIA1 and VIA2 are inverted, so 1 becomes 0 (high goes low) so the device is selected


Last edited by banedon on Thu Jan 13, 2022 11:16 pm, edited 1 time in total.

Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 19 posts ]  Go to page 1, 2  Next

All times are UTC


Who is online

Users browsing this forum: No registered users and 8 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron