6502.org Forum  Projects  Code  Documents  Tools  Forum
It is currently Mon May 13, 2024 6:06 am

All times are UTC




Post new topic Reply to topic  [ 69 posts ]  Go to page Previous  1, 2, 3, 4, 5  Next
Author Message
PostPosted: Thu Feb 24, 2022 4:56 am 
Offline
User avatar

Joined: Fri Aug 30, 2002 1:09 am
Posts: 8433
Location: Southern California
It looks right to me. The STY W+1 is storing to the operand of the JMP-indirect, making this a double indirect.

_________________
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: Thu Feb 24, 2022 6:06 am 
Offline
User avatar

Joined: Sun Jun 30, 2013 10:26 pm
Posts: 1929
Location: Sacramento, CA, USA
Hi, leepivonka. I admit that I get easily confused by the subtle differences between ITC and DTC, but it looks to me like Rob is doing the ITC thing, where VNEXT holds the value of IP and NEXT puts IP in W, increments IP and jumps indirectly through W.

My first attempt to write my own Forth used ITC, but when I read Dr. Brads "Moving Forth" series and felt like I was finally getting the gist of it, the first notion that came to my mind was "DTC seems to be more efficient than ITC, so why bother with ITC?". I'm sure there's a valid list of reasons to choose ITC over DTC, but I switched to DTC and haven't yet regretted it. Admittedly, I'm still a long way from the finish line, and every new day has the potential to enlighten or challenge this old brain.

_________________
Got a kilobyte lying fallow in your 65xx's memory map? Sprinkle some VTL02C on it and see how it grows on you!

Mike B. (about me) (learning how to github)


Top
 Profile  
Reply with quote  
PostPosted: Thu Feb 24, 2022 6:16 am 
Offline

Joined: Sun Apr 26, 2020 3:08 am
Posts: 357
leepivonka wrote:
Nice job of squeezing down these words!

It seems like NEXT is missing a step; or do I not understand something?

Code:
* : @ ( adr -- n )
AT   LDA $0000,Y

NEXT   LDY VNEXT   ; IP pointer is now a variable in direct page
:1   STY W+1  <<< shouldn't this store {ptr to CFA} instead of {ptr to ptr to CFA} ?
   INY
   INY
   STY VNEXT

   TAY
W   JMP ($0000)   <<<we want {jmp to machine code that CFA points to}, not {jmp to CFA itself}

Thanks.
The Y-reg is the CFA of a word pointed at by the IP. And at "W" we are not jumping to the CFA but to the contents of the CFA. Should be the same as doing CFA @ EXECUTE. If we were jumping to the CFA, it would just be W JMP $0000.

It may not look right because I put the IP into a variable called VNEXT into Direct Page. It is no longer an immediate operation that gets updated right at NEXT. It makes it a 2-byte instruction instead of 3-byte wherever it is used. BRANCH, LIT, DOES> and a couple of others use of it.


Top
 Profile  
Reply with quote  
PostPosted: Thu Feb 24, 2022 6:37 am 
Offline
User avatar

Joined: Sun Jun 30, 2013 10:26 pm
Posts: 1929
Location: Sacramento, CA, USA
Code:
: PERFORM ( same as @ EXECUTE )
PERFORM   LDA (VNEXT)
   TAY

* : EXECUTE ( adr -- )
EXECUTE EQU *
   LDA $00,X   ; load NOS in Acc; Y=adr
   INX
   INX
   BRA :1

* : @ ( adr -- n )
AT   LDA $0000,Y

NEXT   LDY VNEXT   ; IP pointer in direct page
:1   STY W+1
   INY
   INY
   STY VNEXT
   TAY
W   JMP ($0000)
@ looks great, but I'm getting buggy vibes from PERFORM and EXECUTE . For starters, if PERFORM is supposed to be the same as @ EXECUTE then why doesn't it start with a @ instead of something resembling DROP lit without the bump?

_________________
Got a kilobyte lying fallow in your 65xx's memory map? Sprinkle some VTL02C on it and see how it grows on you!

Mike B. (about me) (learning how to github)


Top
 Profile  
Reply with quote  
PostPosted: Thu Feb 24, 2022 8:48 am 
Offline

Joined: Fri Apr 15, 2016 1:03 am
Posts: 136
I'm still stuck on NEXT.
Here is how I assume the word Test would execute the word @
Code:
000000r 1                       .org 0 ;======= direct page, aka user area ========================================
000000  1               
000000  1  xx xx        VNEXT:  .res 2
000002  1               
000002  1               
000002  1                       .org $234 ;====== absolute ========================================================
000234  1               
000234  1               DoCol:
000234  1               SemiS:
000234  1  DB                   stp     ; unimplemeted words
000235  1               
000235  1               
000235  1               ; : @ ( adr -- n )
000235  1  B9 00 00     AT:     LDA $0000,Y
000238  1               
000238  1  A4 00        NEXT:   LDY VNEXT       ; IP pointer in direct page
00023A  1  8C 43 02     @1:     STY W+1
00023D  1               
00023D  1  C8                   INY
00023E  1  C8                   INY
00023F  1  84 00                STY VNEXT
000241  1               
000241  1  A8                   TAY      ; this saves about 80 bytes in word definitions and about 24 more
000242  1  6C 00 00     W:      JMP ($0000)   ; by allowing BRA NEXT instead of JMP NEXT
000245  1               
000245  1               
000245  1  81 C0        AtN:    .byte $80+1,'@'+$80     ; @ ( adr -- n )  dictionary entry
000247  1  00 00                .word 0         ; link field
000249  1  35 02        AtC:    .word AT        ; code field
00024B  1                                       ; no param field needed
00024B  1               
00024B  1               
00024B  1  84 54 65 73  TestN:  .byte $80+4,'Tes','t'+$80 ; Test ( -- ) dictionary entry
00024F  1  F4           
000250  1  45 02                .word AtN       ; link field
000252  1  34 02        TestC:  .word DoCol     ; code field
000254  1  49 02                .word AtC       ; param field
000256  1  49 02        TestC1: .word AtC
000258  1  34 02                .word SemiS
00025A  1               
00025A  1               
00025A  1               Reset:
00025A  1  18                   clc             ; native mode
00025B  1  FB                   xce
00025C  1  C2 38                rep #P_M+P_X+P_D ; 16bit M & X, not decimal
00025E  1  A9 56 02             lda #TestC1     ; start executing in the middle of Test word
000261  1  85 00                sta VNEXT
000263  1  4C 38 02             jmp NEXT
000266  1               
000266  1               
000266  1                       .org $fffc ;======= CPU vectors ===================================
00FFFC  1  5A 02                .word Reset     ; reset
00FFFE  1               


Running this in a simulator:
F:\65816\Fig16>\65816s\release\65816s rob1.lst
65816S Feb  7 2022 15:58:01
65c265 mode on
A=0000 X=0000 Y=0000 S=0180 EnvMXdIzc D=0000 B=00 18FBC238 00025a clc           Reset
A=0000 X=0000 Y=0000 S=0180 EnvMXdIzc D=0000 B=00 FBC238A9 00025b xce
A=0000 X=0000 Y=0000 S=0180 envMXdIzC D=0000 B=00 C238A956 00025c rep #0x38
A=0000 X=0000 Y=0000 S=0180 envmxdIzC D=0000 B=00 A9560285 00025e lda #0256     init VNEXT
A=0256 X=0000 Y=0000 S=0180 envmxdIzC D=0000 B=00 85004C38 000261 sta 00
A=0256 X=0000 Y=0000 S=0180 envmxdIzC D=0000 B=00 4C380242 000263 jmp 0238      jmp to NEXT
A=0256 X=0000 Y=0000 S=0180 envmxdIzC D=0000 B=00 A4008C43 000238 ldy 00
A=0256 X=0000 Y=0256 S=0180 envmxdIzC D=0000 B=00 8C4302C8 00023a sty 0243
A=0256 X=0000 Y=0256 S=0180 envmxdIzC D=0000 B=00 C8C88400 00023d iny
A=0256 X=0000 Y=0257 S=0180 envmxdIzC D=0000 B=00 C88400A8 00023e iny
A=0256 X=0000 Y=0258 S=0180 envmxdIzC D=0000 B=00 8400A86C 00023f sty 00
A=0256 X=0000 Y=0258 S=0180 envmxdIzC D=0000 B=00 A86C5602 000241 tay
A=0256 X=0000 Y=0256 S=0180 envmxdIzC D=0000 B=00 6C560281 000242 jmp (0256)
A=0256 X=0000 Y=0256 S=0180 envmxdIzC D=0000 B=00 35028454 000249 and 02,x      executing at AtC, not AT
A=0242 X=0000 Y=0256 S=0180 envmxdIzC D=0000 B=00 84546573 00024b sty 54


Top
 Profile  
Reply with quote  
PostPosted: Thu Feb 24, 2022 9:41 am 
Offline

Joined: Sun Apr 26, 2020 3:08 am
Posts: 357
leepivonka wrote:
I'm still stuck on NEXT.
Here is how I assume the word Test would execute the word @
Code:
000000r 1                       .org 0 ;======= direct page, aka user area ========================================
000000  1               
000000  1  xx xx        VNEXT:  .res 2
000002  1               
000002  1               
000002  1                       .org $234 ;====== absolute ========================================================
000234  1               
000234  1               DoCol:
000234  1               SemiS:
000234  1  DB                   stp     ; unimplemeted words
000235  1               
000235  1               
000235  1               ; : @ ( adr -- n )
000235  1  B9 00 00     AT:     LDA $0000,Y
000238  1               
000238  1  A4 00        NEXT:   LDY VNEXT       ; IP pointer in direct page
00023A  1  8C 43 02     @1:     STY W+1
00023D  1               
00023D  1  C8                   INY
00023E  1  C8                   INY
00023F  1  84 00                STY VNEXT
000241  1               
000241  1  A8                   TAY      ; this saves about 80 bytes in word definitions and about 24 more
000242  1  6C 00 00     W:      JMP ($0000)   ; by allowing BRA NEXT instead of JMP NEXT
000245  1               
000245  1               
000245  1  81 C0        AtN:    .byte $80+1,'@'+$80     ; @ ( adr -- n )  dictionary entry
000247  1  00 00                .word 0         ; link field
000249  1  35 02        AtC:    .word AT        ; code field
00024B  1                                       ; no param field needed
00024B  1               
00024B  1               
00024B  1  84 54 65 73  TestN:  .byte $80+4,'Tes','t'+$80 ; Test ( -- ) dictionary entry
00024F  1  F4           
000250  1  45 02                .word AtN       ; link field
000252  1  34 02        TestC:  .word DoCol     ; code field
000254  1  49 02                .word AtC       ; param field
000256  1  49 02        TestC1: .word AtC
000258  1  34 02                .word SemiS
00025A  1               
00025A  1               
00025A  1               Reset:
00025A  1  18                   clc             ; native mode
00025B  1  FB                   xce
00025C  1  C2 38                rep #P_M+P_X+P_D ; 16bit M & X, not decimal
00025E  1  A9 56 02             lda #TestC1     ; start executing in the middle of Test word
000261  1  85 00                sta VNEXT
000263  1  4C 38 02             jmp NEXT
000266  1               
000266  1               
000266  1                       .org $fffc ;======= CPU vectors ===================================
00FFFC  1  5A 02                .word Reset     ; reset
00FFFE  1               


Running this in a simulator:
F:\65816\Fig16>\65816s\release\65816s rob1.lst
65816S Feb  7 2022 15:58:01
65c265 mode on
A=0000 X=0000 Y=0000 S=0180 EnvMXdIzc D=0000 B=00 18FBC238 00025a clc           Reset
A=0000 X=0000 Y=0000 S=0180 EnvMXdIzc D=0000 B=00 FBC238A9 00025b xce
A=0000 X=0000 Y=0000 S=0180 envMXdIzC D=0000 B=00 C238A956 00025c rep #0x38
A=0000 X=0000 Y=0000 S=0180 envmxdIzC D=0000 B=00 A9560285 00025e lda #0256     init VNEXT
A=0256 X=0000 Y=0000 S=0180 envmxdIzC D=0000 B=00 85004C38 000261 sta 00
A=0256 X=0000 Y=0000 S=0180 envmxdIzC D=0000 B=00 4C380242 000263 jmp 0238      jmp to NEXT
A=0256 X=0000 Y=0000 S=0180 envmxdIzC D=0000 B=00 A4008C43 000238 ldy 00
A=0256 X=0000 Y=0256 S=0180 envmxdIzC D=0000 B=00 8C4302C8 00023a sty 0243
A=0256 X=0000 Y=0256 S=0180 envmxdIzC D=0000 B=00 C8C88400 00023d iny
A=0256 X=0000 Y=0257 S=0180 envmxdIzC D=0000 B=00 C88400A8 00023e iny
A=0256 X=0000 Y=0258 S=0180 envmxdIzC D=0000 B=00 8400A86C 00023f sty 00
A=0256 X=0000 Y=0258 S=0180 envmxdIzC D=0000 B=00 A86C5602 000241 tay
A=0256 X=0000 Y=0256 S=0180 envmxdIzC D=0000 B=00 6C560281 000242 jmp (0256)
A=0256 X=0000 Y=0256 S=0180 envmxdIzC D=0000 B=00 35028454 000249 and 02,x      executing at AtC, not AT
A=0242 X=0000 Y=0256 S=0180 envmxdIzC D=0000 B=00 84546573 00024b sty 54

You are absolutely right. Good Eye. And I know where I went wrong. I was treating the LDY at NEXT as an immediate operation when it was supposed to have been an absolute address. And was thinking I could just swap over to a variable. I still can, but not as simply. The code would probably look something like this then, where VNEXT is still a variable.

Code:
NEXT   LDY VNEXT   ; IP pointer in direct page
        PHA
        LDA $0000,Y
:1   STA W+1

   INY
   INY
   STY VNEXT

        PLA
   TAY      ; this saves about 80 bytes in word definitions and about 24 more
W   JMP ($0000)   ; by allowing BRA NEXT instead of JMP NEXT

But if that's the case, I will probably have to go back to changing VNEXT to an absolute address. DARN!
Still very simple though as I just have to change my VNEXT back to NEXT+1. And will have to go back and verify the words that branch to :1 as well.
Code:
NEXT  LDY $0000   ; Take note, this is an absolute address and not an immediate, which does one level of redirection
:1       STY W+1

        LDY NEXT+1    ; This is needed back again.
        INY
        INY
        STY NEXT+1

        TAY      
W      JMP ($0000)

Thanks for getting me back on track before I went too far astray. I just changed it recently and you caught it instantly.

EDIT: I woke up this morning with a start realizing this still isn't right. Man, I am even coding when I am dreaming. If the instruction at NEXT is an absolute address, then we have to increment that value and not the value it is loading. Too many levels of redirection.


Top
 Profile  
Reply with quote  
PostPosted: Thu Feb 24, 2022 4:26 pm 
Offline
User avatar

Joined: Sun Jun 30, 2013 10:26 pm
Posts: 1929
Location: Sacramento, CA, USA
Leepivonka, I think your doCol is defective, but I've been wrong before, and I'm saying this before I have finished my coffee. Those "Moving Forth" articles have the effect of bringing out the "armchair quarterback" in me, for better or worse.

_________________
Got a kilobyte lying fallow in your 65xx's memory map? Sprinkle some VTL02C on it and see how it grows on you!

Mike B. (about me) (learning how to github)


Top
 Profile  
Reply with quote  
PostPosted: Thu Feb 24, 2022 9:55 pm 
Offline

Joined: Sun Apr 26, 2020 3:08 am
Posts: 357
barrym95838 wrote:
Leepivonka, I think your doCol is defective, but I've been wrong before, and I'm saying this before I have finished my coffee. Those "Moving Forth" articles have the effect of bringing out the "armchair quarterback" in me, for better or worse.

Nope. He is spot-on. It was your code that I messed up, Mike. I had to go back to one of the other Topics to where you posted part of that NEXT code to confirm. You had posted it there correctly with NEXT being a LDY to an absolute address.

In my excitement of creating compact code, I accidentally converted it to an immediate instruction, then from there to a User variable. This had the affect of dropping one depth of getting the correct CFA address.

Part of the reason I am confusing myself is there are two depths of CFA addresses. The compiled one in a word definition that is part of the body of a word, and the actual one that follows a word. I need a better way of identifying or distinguishing the two in my notes.

One of the reasons I just love programming Forth. It twists my brain around.


Top
 Profile  
Reply with quote  
PostPosted: Thu Feb 24, 2022 10:49 pm 
Offline

Joined: Wed Aug 21, 2019 6:10 pm
Posts: 217
barrym95838 wrote:
My first attempt to write my own Forth used ITC, but when I read Dr. Brads "Moving Forth" series and felt like I was finally getting the gist of it, the first notion that came to my mind was "DTC seems to be more efficient than ITC, so why bother with ITC?"


Yes, for 65816:

EXIT: LDY RS : LDX $0000,Y : DEY : DEY : STY RS
NEXT: INX :INX : JMP ($0000,X)

; Word begins with JSR ENTER
ENTER: LDY RS : INY : INY : STX $0000,Y : STY RS : PLX : INX : JMP ($0000,X)

... seems reasonably straightforward, if I am not too fuzzy headed after a day at work.

This implies using the hardware stack as the data stack, but Y is always free as a spare register for use inside a primitive.


Last edited by BruceRMcF on Fri Feb 25, 2022 12:13 am, edited 3 times in total.

Top
 Profile  
Reply with quote  
PostPosted: Fri Feb 25, 2022 12:01 am 
Offline
User avatar

Joined: Fri Dec 11, 2009 3:50 pm
Posts: 3354
Location: Ontario, Canada
IamRob wrote:
I need a better way of identifying or distinguishing the two in my notes.
Maybe just make a policy of never getting careless with terms "Code Field" and "Code Field Address." They're not interchangeable. The Code Field is a 16-bit value that appears as part of a word's header. And the Code Field Address is the address at which the Code Field appears. Does that help, or have I misunderstood the problem?

-- 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: Fri Feb 25, 2022 12:29 am 
Offline

Joined: Sun Apr 26, 2020 3:08 am
Posts: 357
Dr Jefyll wrote:
IamRob wrote:
I need a better way of identifying or distinguishing the two in my notes.
Maybe just make a policy of never getting careless with terms "Code Field" and "Code Field Address." They're not interchangeable. The Code Field is a 16-bit value that appears as part of a word's header. And the Code Field Address is the address at which the Code Field appears. Does that help, or have I misunderstood the problem?
-- Jeff

Doesn't the Code Field really only pertain to definitions that are primitives? Thus the CODE "field"?

And word definitions where the compiled Forth words are, is called the body?

Then how about BFA? Body Field Address. I think the body of a definition is understood by everyone.


Top
 Profile  
Reply with quote  
PostPosted: Fri Feb 25, 2022 1:18 am 
Offline
User avatar

Joined: Fri Aug 30, 2002 1:09 am
Posts: 8433
Location: Southern California
That sounds kind of like the discrepancy with the terminology "vectors." Are the vectors really what's at FFFA-FFFF of the '02, a little broader on the '816), or are the vectors the contents of those addresses, or are they what the contents point to?

The CFA of a primitive usually points to the body which is where the machine code is. On a secondary, the CFA points to the nest code. [Edit: FIG calls it DOCOL.] A secondary always has a body, whereas a primitive might not; for example DROP's CFA usually just points to the code for POP.

_________________
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: Fri Feb 25, 2022 1:53 am 
Offline
User avatar

Joined: Fri Dec 11, 2009 3:50 pm
Posts: 3354
Location: Ontario, Canada
[I see Garth has posted while I was typing. I'll post this anyway, as there's additional detail.]

In FIG Forth, a definition in the dictionary has a Name Field, Link Field, Code Field and Parameter Field, in that order. The addresses at which those fields are found are the NFA, LFA, CFA and PFA (abbreviated). There are some handy (but perhaps suboptimally named) words available, such as CFA which takes from the stack the PFA of a definition and in its place leaves the definition's CFA. And NFA takes a PFA and leaves an NFA. I'm just illustrating how these terms are accepted and well-known as FIG jargon.

In a colon definition, the Code Field (found at the CFA) is the address of DOCOL. The Code Field gets loaded into the Program Counter, which is to say the CPU will jump to DOCOL (and will find machine code there). Other common addresses used as the Code Field are those of DOCON DOVAR and DODOES, among others.

In a primitive's definition, the Code Field (found at the CFA) is the PFA of the primitive (!). The CPU will load the Code Field into its PC, just as with any other definition. And in this case the machine code isn't found "somewhere else" (such as at DOCOL or DOCON); it is found very close by indeed, in the Parameter Field.

(If you're getting cognitive dissonance from that, you can rationalize by considering the code as being a form of parameter. Or, you can consider primitives a special case where no parameter exists, but they decided to stick the code there instead! :P )

Quote:
Then how about BFA? Body Field Address. I think the body of a definition is understood by everyone.
Not by me -- or at least not with any clear and unambiguous meaning. Certainly FIG doesn't mention any BFAs. NFA, LFA, CFA and PFA are sufficient.

HTH,
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: Fri Feb 25, 2022 8:33 am 
Offline

Joined: Sun Apr 26, 2020 3:08 am
Posts: 357
GARTHWILSON wrote:

The CFA of a primitive usually points to the body which is where the machine code is. On a secondary, the CFA points to the nest code. A secondary always has a body, whereas a primitive might not; for example DROP's CFA usually just points to the code for POP.

I would consider the code at POP to be the body for DROP. The only difference being the header is separate from the body. Which is mostly what I will be doing with this conversion.

But I see that the primitive part of a definition is called "the body", and not the compiled Forth CFA's. Is that a correct assumption?


Top
 Profile  
Reply with quote  
PostPosted: Fri Feb 25, 2022 8:51 am 
Offline

Joined: Sun Apr 26, 2020 3:08 am
Posts: 357
Dr Jefyll wrote:
[I see Garth has posted while I was typing. I'll post this anyway, as there's additional detail.]

In FIG Forth, a definition in the dictionary has a Name Field, Link Field, Code Field and Parameter Field, in that order. The addresses at which those fields are found are the NFA, LFA, CFA and PFA (abbreviated). There are some handy (but perhaps suboptimally named) words available, such as CFA which takes from the stack the PFA of a definition and in its place leaves the definition's CFA. And NFA takes a PFA and leaves an NFA. I'm just illustrating how these terms are accepted and well-known as FIG jargon.

In a colon definition, the Code Field (found at the CFA) is the address of DOCOL. The Code Field gets loaded into the Program Counter, which is to say the CPU will jump to DOCOL (and will find machine code there). Other common addresses used as the Code Field are those of DOCON DOVAR and DODOES, among others.

In a primitive's definition, the Code Field (found at the CFA) is the PFA of the primitive (!). The CPU will load the Code Field into its PC, just as with any other definition. And in this case the machine code isn't found "somewhere else" (such as at DOCOL or DOCON); it is found very close by indeed, in the Parameter Field.

(If you're getting cognitive dissonance from that, you can rationalize by considering the code as being a form of parameter. Or, you can consider primitives a special case where no parameter exists, but they decided to stick the code there instead! :P )

Quote:
Then how about BFA? Body Field Address. I think the body of a definition is understood by everyone.
Not by me -- or at least not with any clear and unambiguous meaning. Certainly FIG doesn't mention any BFAs. NFA, LFA, CFA and PFA are sufficient.

I wasn't referrring to BFA as a definition. Just as a comment in my notes to distinguish between a word definition's CFA, and the CFA's that are compiled that make up the rest of the definition. Obviously assuming a non-primitive word here. But I guess the body is more often referred to as where the primitive part of the definition is. And not to where the compiled word CFA's are that make up the definition of a word. Is that a correct assumption?

And although I am following the FIG Standard for the conversion to 65816 code, the standard is going to be broken as I am attempting efficiency over compatibility. Meaning some FIG words will become redundant and the header structure may be changed.

I am also striving for flexibility in so much if any one of the standards is needed to be adhered to, then a vocabulary can be created to match those standards.


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

All times are UTC


Who is online

Users browsing this forum: No registered users and 2 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: