My 6502 disassembler- not working on the paper tape dumps

Discuss software for the Micro-KIM and KIM-1

My 6502 disassembler- not working on the paper tape dumps

Postby cappy2112 » Oct Sun 26, 2014 2:04 am

I'm writing a 6502 disassembler- just for the experience of writing one.
I'm using some of the Micro-KIM paper tape dumps from this forum as test cases.

I'm encountering some problems with the Battleship game-found elsewhere in this forum.
I've noticed that almost all of the lines begin with the same sequence (1802), and the second byte isn't being disassembled
because 02 is not a valid opcode for the 6502.

Is there some overhead (no 6502 code) in the paper tape dump format that I'm not aware of?
I've highlighted a few of the bytes which are not valid opcodes.
for the first byte (opcode 18h), which is the CLC instruction

Code: Select all
;18[b]02[/b]00A9028500A90085E8A299A9029500CAD0F9A91185E785E3A20C9E
;18[b]02[/b]180718A007A90091E78810FBF8A5E7691085E7CA10ECF838A50CB0
;180230EA65ED65EE85E9A204B5E995EACA10F938E999B0E8A5EB290FE8
;18024806C900F041C902F036C904F01918A002A6E9B500C902F0B10B93
;180260A90195008A6909AA8810EF4C9502A002A6E9B500C902F0990B03
;180278A90195008A38E5E3AA8810EE4C9502A91085E34C6E02A9010AF5
;18029085E34C6E02A92085FAA90085F985E485FB85E6D8201F1F200CE7
;1802A86A1FC90FF037C90910F1C900F0ED85E5A5E6C901F016E6E60E54
;1802C006E506E506E506E5A5E585FB20FE1ED0FB4CA30218A5E5650D8F
;1802D8FB85FBC6E620FE1ED0FB4CA302A5FBC5E4F007AAB500C9010F7A
;1802F0F017F8A5FA38E901F03685FAD8A5FB85E420FE1ED0FB4CA31046
;18[b]03[/b]0802E6F9A5F9C903F00820FE1ED0FB4CF202F8A92138E5FA850E0B
;180320F9D8A9DE85FBA9AD85FA201F1F4C2A03A002A299B500C9010C1B
;180338F006CAD0F74C48038A99F900884C3A03201F1F4C480300000893
;00000E000E

Is there a specification for the paper tape dump?
cappy2112
 
Posts: 48
Joined: Sep Fri 26, 2014 1:28 am

Re: My 6502 disassembler- not working on the paper tape dump

Postby garryj » Oct Sun 26, 2014 11:59 am

cappy2112 wrote:Is there a specification for the paper tape dump?

Yep:
Code: Select all
     The paper tape LOAD and DUMP routines store and retrieve data in
a specific format designed to insure error free recovery.  Each byte
of data to be stored is converted to two half bytes.  The half bytes
(whose possible values are 0 to FHEX) are translated into their ASCII
equivalents and written out onto paper tape in this form.

     Each record outputted begins with a ";" character (ASCII 3B) to
mark the start of a valid record.  The next byte transmitted (18HEX) or
(2410) is the number of data bytes contained in the record.  The record's
starting address High (1 byte, 2 characters), starting address Lo (1 byte,
2 characters), and data (24 bytes, 48 characters) follow.  Each record is
terminated by the record's check-sum (2 bytes, 4 characters), a carriage
return (ASCII OD), line feed (ASCII øA), and six "NULL" characters
(ASCII øø).

     The last record transmitted has zero data bytes (indicated by ;00)
The starting address field is replaced by a four digit Hex number repre-
senting the total number of data records contained in the transmission,
followed by the records usual check-sum digits.  A "XOFF" character ends
the transmission.


;180000FFEEDDCCBBAA0099887766554433221122334455667788990AFC
;0000010001


Here's a link to the Kim-1 manual that contained the above:
Kim-1 Microcomputer Module User Manual
garryj
----------
garryj
 
Posts: 147
Joined: Aug Sun 15, 2010 12:26 pm

Re: My 6502 disassembler- not working on the paper tape dump

Postby cappy2112 » Oct Sun 26, 2014 12:06 pm

Thanks Garry
cappy2112
 
Posts: 48
Joined: Sep Fri 26, 2014 1:28 am

Re: My 6502 disassembler- not working on the paper tape dump

Postby cappy2112 » Oct Sun 26, 2014 6:53 pm

garryj wrote:
cappy2112 wrote:Is there a specification for the paper tape dump?

Yep:

;180000FFEEDDCCBBAA0099887766554433221122334455667788990AFC
;0000010001
[/code]

Here's a link to the Kim-1 manual that contained the above:
Kim-1 Microcomputer Module User Manual


Let me see if I understand that spec correctly, using this record as a reference
Code: Select all
;180000FFEEDDCCBBAA0099887766554433221122334455667788990AFC


; <- Record begin
18 <- Record length - (actually, this refers ONLY to the data payload, not the address nor checksum bytes)
00 <- Address high
00 <- Address low
FFEEDDCCBBAA009988776655443322112233445566778899 <- 24 data bytes
0AFC <- Checksum from adding up the 24 data bytes

The check-sum is calculated by adding all data in the record except the ";" character.


Do you interpret this as "everything following the ;" or JUST the 24 data bytes?
I've tried both ways, I don't get 0AFC by adding the 24 data bytes in the record above,
nor by adding everything between the ; and the 4 checksum bytes.

My understanding of the spec still isn't right.
cappy2112
 
Posts: 48
Joined: Sep Fri 26, 2014 1:28 am

Re: My 6502 disassembler- not working on the paper tape dump

Postby garryj » Oct Mon 27, 2014 3:00 pm

My understanding of the spec still isn't right.
.
The record/data definitions are a bit confusing.

Using the third line in your "Battleship" dump, the format breaks down like this:
Code: Select all
; [18 02 30 <EA 65 ED 65 EE 85 E9 A2 04 B5 E9 95 EA CA 10 F9 38 E9 99 B0 E8 A5 EB 29>] 0FE8


The 24 bytes within the angle brackets make up the "record".
The 27 bytes within the square brackets make up the "data".

Every byte within the square brackets gets added as a 16-bit big-endian sum. If the sum exceeds 16 bits, it was usually allowed to roll over with no carry, though in this case rollover isn't an issue.
garryj
----------
garryj
 
Posts: 147
Joined: Aug Sun 15, 2010 12:26 pm

Re: My 6502 disassembler- not working on the paper tape dump

Postby cappy2112 » Oct Mon 27, 2014 3:28 pm

Code: Select all
; [18 02 30 <EA 65 ED 65 EE 85 E9 A2 04 B5 E9 95 EA CA 10 F9 38 E9 99 B0 E8 A5 EB 29>] 0FE8

The 24 bytes within the angle brackets make up the "record".
The 27 bytes within the square brackets make up the "data".


I would expect just the opposite. Is that my way of thinking, or would you expect the opposite from what you posted?
Either way, I've tried including everything calculating the checksum from the 18 to the end, excluding the checksum.

Every byte within the square brackets gets added as a 16-bit big-endian sum. If the sum exceeds 16 bits, it was usually allowed to roll over with no carry, though in this case rollover isn't an issue.


I just did a simple addition on each byte, with no regard to endianness, nor length. I ended up with a sum that has 0 in the high nibble, so apparently there was no rollover.
I need to sit down and try it again, and see if endianness has an effect

thanks!
cappy2112
 
Posts: 48
Joined: Sep Fri 26, 2014 1:28 am

Re: My 6502 disassembler- not working on the paper tape dump

Postby garryj » Oct Mon 27, 2014 4:06 pm

Just to be clear on the checksum, my mention of big-endian meant how to interpret the checksum in the dump printing, and not how it may be stored in memory. With 27 data bytes, you'll never overflow a 16-bit result. When I add the 27 data bytes in my example I get the 0FE8 checksum result.
garryj
----------
garryj
 
Posts: 147
Joined: Aug Sun 15, 2010 12:26 pm

Re: My 6502 disassembler- not working on the paper tape dump

Postby cappy2112 » Oct Mon 27, 2014 6:58 pm

Every byte within the square brackets gets added as a 16-bit big-endian sum. If the sum exceeds 16 bits, it was usually allowed to roll over with no carry, though in this case rollover isn't an issue.


Did you add these a nibble at a time, as per the spec, or a byte a time as you've posted above?
cappy2112
 
Posts: 48
Joined: Sep Fri 26, 2014 1:28 am

Re: My 6502 disassembler- not working on the paper tape dump

Postby garryj » Oct Mon 27, 2014 8:15 pm

The checksum is computed by adding one byte (two hex digits) at a time. That's why the example paired the nibbles up.
garryj
----------
garryj
 
Posts: 147
Joined: Aug Sun 15, 2010 12:26 pm

Re: My 6502 disassembler- not working on the paper tape dump

Postby cappy2112 » Oct Mon 27, 2014 8:25 pm

Uggh

From the spec
The check-sum is calculated by adding all data in the record except the ";" character.

My interpretation of this is- everything between the ; and the last 4 checksum bytes are used to calculate the checksum.
However, your definition of a record (above) is that the checksum should be calculated on the 24 data bytes only.

Either way you slice it, I cannot get the 0FE8 checksum.
cappy2112
 
Posts: 48
Joined: Sep Fri 26, 2014 1:28 am

Re: My 6502 disassembler- not working on the paper tape dump

Postby garryj » Oct Mon 27, 2014 8:45 pm

Code: Select all
18 02 30 EA 65 ED 65 EE 85 E9 A2 04 B5 E9 95 EA CA 10 F9 38 E9 99 B0 E8 A5 EB 29 = 0FE8


My bad. I re-read the spec, and the record is indeed the entire line. The 24 bytes I called the record make up part of the "Battleship" program data.
The 27 byte sequence within the square brackets is everything between ";" and the 0FE8 checksum. When I add them up, I get 0FE8.
garryj
----------
garryj
 
Posts: 147
Joined: Aug Sun 15, 2010 12:26 pm

Re: My 6502 disassembler- not working on the paper tape dump

Postby cappy2112 » Oct Tue 28, 2014 12:48 am

Got it.
My checksum calculation works now.
Back to my disassembler.

Thanks Garry
cappy2112
 
Posts: 48
Joined: Sep Fri 26, 2014 1:28 am

Re: My 6502 disassembler- not working on the paper tape dump

Postby AartBik » Nov Fri 07, 2014 2:03 pm

For reference, when I got my Kim-1, I extended my 65xx cross-assembler with paper tape format output (both as output of the assembler, and as input for the built-in dis-assembler).
Below is the dis-assembly for battleship.

Code: Select all
$ lin2c64 -dP battle
**** MOS Technology 6510 Assembler
**** for the Commodore 64 (v2.0.4)
**** (C) 2005-2011   Aart J.C. Bik

disassembling paper tape format (text)
$0200 a9 02   lda #$02
$0202 85 00   sta $00
$0204 a9 00   lda #$00
$0206 85 e8   sta $e8
$0208 a2 99   ldx #$99
$020a a9 02   lda #$02
$020c 95 00   sta $00, x
$020e ca   dex
$020f d0 f9   bne $020a
$0211 a9 11   lda #$11
$0213 85 e7   sta $e7
$0215 85 e3   sta $e3
$0217 a2 07   ldx #$07
$0219 18   clc
$021a a0 07   ldy #$07
$021c a9 00   lda #$00
$021e 91 e7   sta ($e7), y
$0220 88   dey
$0221 10 fb   bpl $021e
$0223 f8   sed
$0224 a5 e7   lda $e7
$0226 69 10   adc #$10
$0228 85 e7   sta $e7
$022a ca   dex
$022b 10 ec   bpl $0219
$022d f8   sed
$022e 38   sec
$022f a5 ea   lda $ea
$0231 65 ed   adc $ed
$0233 65 ee   adc $ee
$0235 85 e9   sta $e9
$0237 a2 04   ldx #$04
$0239 b5 e9   lda $e9, x
$023b 95 ea   sta $ea, x
$023d ca   dex
$023e 10 f9   bpl $0239
$0240 38   sec
$0241 e9 99   sbc #$99
$0243 b0 e8   bcs $022d
$0245 a5 eb   lda $eb
$0247 29 06   and #$06
$0249 c9 00   cmp #$00
$024b f0 41   beq $028e
$024d c9 02   cmp #$02
$024f f0 36   beq $0287
$0251 c9 04   cmp #$04
$0253 f0 19   beq $026e
$0255 18   clc
$0256 a0 02   ldy #$02
$0258 a6 e9   ldx $e9
$025a b5 00   lda $00, x
$025c c9 02   cmp #$02
$025e f0 b1   beq $0211
$0260 a9 01   lda #$01
$0262 95 00   sta $00, x
$0264 8a   txa
$0265 69 09   adc #$09
$0267 aa   tax
$0268 88   dey
$0269 10 ef   bpl $025a
$026b 4c 95 02   jmp $0295
$026e a0 02   ldy #$02
$0270 a6 e9   ldx $e9
$0272 b5 00   lda $00, x
$0274 c9 02   cmp #$02
$0276 f0 99   beq $0211
$0278 a9 01   lda #$01
$027a 95 00   sta $00, x
$027c 8a   txa
$027d 38   sec
$027e e5 e3   sbc $e3
$0280 aa   tax
$0281 88   dey
$0282 10 ee   bpl $0272
$0284 4c 95 02   jmp $0295
$0287 a9 10   lda #$10
$0289 85 e3   sta $e3
$028b 4c 6e 02   jmp $026e
$028e a9 01   lda #$01
$0290 85 e3   sta $e3
$0292 4c 6e 02   jmp $026e
$0295 a9 20   lda #$20
$0297 85 fa   sta $fa
$0299 a9 00   lda #$00
$029b 85 f9   sta $f9
$029d 85 e4   sta $e4
$029f 85 fb   sta $fb
$02a1 85 e6   sta $e6
$02a3 d8   cld
$02a4 20 1f 1f   jsr $1f1f
$02a7 20 6a 1f   jsr $1f6a
$02aa c9 0f   cmp #$0f
$02ac f0 37   beq $02e5
$02ae c9 09   cmp #$09
$02b0 10 f1   bpl $02a3
$02b2 c9 00   cmp #$00
$02b4 f0 ed   beq $02a3
$02b6 85 e5   sta $e5
$02b8 a5 e6   lda $e6
$02ba c9 01   cmp #$01
$02bc f0 16   beq $02d4
$02be e6 e6   inc $e6
$02c0 06 e5   asl $e5
$02c2 06 e5   asl $e5
$02c4 06 e5   asl $e5
$02c6 06 e5   asl $e5
$02c8 a5 e5   lda $e5
$02ca 85 fb   sta $fb
$02cc 20 fe 1e   jsr $1efe
$02cf d0 fb   bne $02cc
$02d1 4c a3 02   jmp $02a3
$02d4 18   clc
$02d5 a5 e5   lda $e5
$02d7 65 fb   adc $fb
$02d9 85 fb   sta $fb
$02db c6 e6   dec $e6
$02dd 20 fe 1e   jsr $1efe
$02e0 d0 fb   bne $02dd
$02e2 4c a3 02   jmp $02a3
$02e5 a5 fb   lda $fb
$02e7 c5 e4   cmp $e4
$02e9 f0 07   beq $02f2
$02eb aa   tax
$02ec b5 00   lda $00, x
$02ee c9 01   cmp #$01
$02f0 f0 17   beq $0309
$02f2 f8   sed
$02f3 a5 fa   lda $fa
$02f5 38   sec
$02f6 e9 01   sbc #$01
$02f8 f0 36   beq $0330
$02fa 85 fa   sta $fa
$02fc d8   cld
$02fd a5 fb   lda $fb
$02ff 85 e4   sta $e4
$0301 20 fe 1e   jsr $1efe
$0304 d0 fb   bne $0301
$0306 4c a3 02   jmp $02a3
$0309 e6 f9   inc $f9
$030b a5 f9   lda $f9
$030d c9 03   cmp #$03
$030f f0 08   beq $0319
$0311 20 fe 1e   jsr $1efe
$0314 d0 fb   bne $0311
$0316 4c f2 02   jmp $02f2
$0319 f8   sed
$031a a9 21   lda #$21
$031c 38   sec
$031d e5 fa   sbc $fa
$031f 85 f9   sta $f9
$0321 d8   cld
$0322 a9 de   lda #$de
$0324 85 fb   sta $fb
$0326 a9 ad   lda #$ad
$0328 85 fa   sta $fa
$032a 20 1f 1f   jsr $1f1f
$032d 4c 2a 03   jmp $032a
$0330 a0 02   ldy #$02
$0332 a2 99   ldx #$99
$0334 b5 00   lda $00, x
$0336 c9 01   cmp #$01
$0338 f0 06   beq $0340
$033a ca   dex
$033b d0 f7   bne $0334
$033d 4c 48 03   jmp $0348
$0340 8a   txa
$0341 99 f9 00   sta $00f9, y
$0344 88   dey
$0345 4c 3a 03   jmp $033a
$0348 20 1f 1f   jsr $1f1f
$034b 4c 48 03   jmp $0348
$034e 00   brk
$034f 00   brk
User avatar
AartBik
 
Posts: 24
Joined: Nov Fri 04, 2011 12:20 am
Location: Mountain View, CA, USA

Re: My 6502 disassembler- not working on the paper tape dump

Postby cappy2112 » Nov Sun 09, 2014 3:18 am

AartBik wrote:For reference, when I got my Kim-1, I extended my 65xx cross-assembler with paper tape format output (both as output of the assembler, and as input for the built-in dis-assembler).
Below is the dis-assembly for battleship.

Code: Select all
$ lin2c64 -dP battle
**** MOS Technology 6510 Assembler
**** for the Commodore 64 (v2.0.4)
**** (C) 2005-2011   Aart J.C. Bik

disassembling paper tape format (text)
$0200 a9 02   lda #$02
$0202 85 00   sta $00
$0204 a9 00   lda #$00
$0206 85 e8   sta $e8
$0208 a2 99   ldx #$99
$020a a9 02   lda #$02
$020c 95 00   sta $00, x
$020e ca   dex
$020f d0 f9   bne $020a
$0211 a9 11   lda #$11
$0213 85 e7   sta $e7
$0215 85 e3   sta $e3
$0217 a2 07   ldx #$07
$0219 18   clc
$021a a0 07   ldy #$07
$021c a9 00   lda #$00
$021e 91 e7   sta ($e7), y
$0220 88   dey
$0221 10 fb   bpl $021e
$0223 f8   sed
$0224 a5 e7   lda $e7
$0226 69 10   adc #$10
$0228 85 e7   sta $e7
$022a ca   dex
$022b 10 ec   bpl $0219
$022d f8   sed
$022e 38   sec
$022f a5 ea   lda $ea
$0231 65 ed   adc $ed
$0233 65 ee   adc $ee
$0235 85 e9   sta $e9
$0237 a2 04   ldx #$04
$0239 b5 e9   lda $e9, x
$023b 95 ea   sta $ea, x
$023d ca   dex
$023e 10 f9   bpl $0239
$0240 38   sec
$0241 e9 99   sbc #$99
$0243 b0 e8   bcs $022d
$0245 a5 eb   lda $eb
$0247 29 06   and #$06
$0249 c9 00   cmp #$00
$024b f0 41   beq $028e
$024d c9 02   cmp #$02
$024f f0 36   beq $0287
$0251 c9 04   cmp #$04
$0253 f0 19   beq $026e
$0255 18   clc
$0256 a0 02   ldy #$02
$0258 a6 e9   ldx $e9
$025a b5 00   lda $00, x
$025c c9 02   cmp #$02
$025e f0 b1   beq $0211
$0260 a9 01   lda #$01
$0262 95 00   sta $00, x
$0264 8a   txa
$0265 69 09   adc #$09
$0267 aa   tax
$0268 88   dey
$0269 10 ef   bpl $025a
$026b 4c 95 02   jmp $0295
$026e a0 02   ldy #$02
$0270 a6 e9   ldx $e9
$0272 b5 00   lda $00, x
$0274 c9 02   cmp #$02
$0276 f0 99   beq $0211
$0278 a9 01   lda #$01
$027a 95 00   sta $00, x
$027c 8a   txa
$027d 38   sec
$027e e5 e3   sbc $e3
$0280 aa   tax
$0281 88   dey
$0282 10 ee   bpl $0272
$0284 4c 95 02   jmp $0295
$0287 a9 10   lda #$10
$0289 85 e3   sta $e3
$028b 4c 6e 02   jmp $026e
$028e a9 01   lda #$01
$0290 85 e3   sta $e3
$0292 4c 6e 02   jmp $026e
$0295 a9 20   lda #$20
$0297 85 fa   sta $fa
$0299 a9 00   lda #$00
$029b 85 f9   sta $f9
$029d 85 e4   sta $e4
$029f 85 fb   sta $fb
$02a1 85 e6   sta $e6
$02a3 d8   cld
$02a4 20 1f 1f   jsr $1f1f
$02a7 20 6a 1f   jsr $1f6a
$02aa c9 0f   cmp #$0f
$02ac f0 37   beq $02e5
$02ae c9 09   cmp #$09
$02b0 10 f1   bpl $02a3
$02b2 c9 00   cmp #$00
$02b4 f0 ed   beq $02a3
$02b6 85 e5   sta $e5
$02b8 a5 e6   lda $e6
$02ba c9 01   cmp #$01
$02bc f0 16   beq $02d4
$02be e6 e6   inc $e6
$02c0 06 e5   asl $e5
$02c2 06 e5   asl $e5
$02c4 06 e5   asl $e5
$02c6 06 e5   asl $e5
$02c8 a5 e5   lda $e5
$02ca 85 fb   sta $fb
$02cc 20 fe 1e   jsr $1efe
$02cf d0 fb   bne $02cc
$02d1 4c a3 02   jmp $02a3
$02d4 18   clc
$02d5 a5 e5   lda $e5
$02d7 65 fb   adc $fb
$02d9 85 fb   sta $fb
$02db c6 e6   dec $e6
$02dd 20 fe 1e   jsr $1efe
$02e0 d0 fb   bne $02dd
$02e2 4c a3 02   jmp $02a3
$02e5 a5 fb   lda $fb
$02e7 c5 e4   cmp $e4
$02e9 f0 07   beq $02f2
$02eb aa   tax
$02ec b5 00   lda $00, x
$02ee c9 01   cmp #$01
$02f0 f0 17   beq $0309
$02f2 f8   sed
$02f3 a5 fa   lda $fa
$02f5 38   sec
$02f6 e9 01   sbc #$01
$02f8 f0 36   beq $0330
$02fa 85 fa   sta $fa
$02fc d8   cld
$02fd a5 fb   lda $fb
$02ff 85 e4   sta $e4
$0301 20 fe 1e   jsr $1efe
$0304 d0 fb   bne $0301
$0306 4c a3 02   jmp $02a3
$0309 e6 f9   inc $f9
$030b a5 f9   lda $f9
$030d c9 03   cmp #$03
$030f f0 08   beq $0319
$0311 20 fe 1e   jsr $1efe
$0314 d0 fb   bne $0311
$0316 4c f2 02   jmp $02f2
$0319 f8   sed
$031a a9 21   lda #$21
$031c 38   sec
$031d e5 fa   sbc $fa
$031f 85 f9   sta $f9
$0321 d8   cld
$0322 a9 de   lda #$de
$0324 85 fb   sta $fb
$0326 a9 ad   lda #$ad
$0328 85 fa   sta $fa
$032a 20 1f 1f   jsr $1f1f
$032d 4c 2a 03   jmp $032a
$0330 a0 02   ldy #$02
$0332 a2 99   ldx #$99
$0334 b5 00   lda $00, x
$0336 c9 01   cmp #$01
$0338 f0 06   beq $0340
$033a ca   dex
$033b d0 f7   bne $0334
$033d 4c 48 03   jmp $0348
$0340 8a   txa
$0341 99 f9 00   sta $00f9, y
$0344 88   dey
$0345 4c 3a 03   jmp $033a
$0348 20 1f 1f   jsr $1f1f
$034b 4c 48 03   jmp $0348
$034e 00   brk
$034f 00   brk



Your disassembly dump was a big help! Thanks
I was able to find a bug in the instruction table in my program.
Even though I have written unit tests for my disassembler, the unittest validity is highly dependant
on the instruction table.

If you've got more disassembly dumps, please post them (and a reference to the sources, so I can compare my output).
cappy2112
 
Posts: 48
Joined: Sep Fri 26, 2014 1:28 am

Re: My 6502 disassembler- not working on the paper tape dump

Postby AartBik » Nov Tue 11, 2014 12:37 am

cappy2112 wrote:Your disassembly dump was a big help! Thanks

If you've got more disassembly dumps, please post them (and a reference to the sources, so I can compare my output).


Glad to help. If I find other interesting examples, I can post them here (and hopefully you will download my assembler to generate your own paper tape format examples!). Looking forward to some new activity in this forum!
User avatar
AartBik
 
Posts: 24
Joined: Nov Fri 04, 2011 12:20 am
Location: Mountain View, CA, USA

Next

Return to Software

Who is online

Users browsing this forum: No registered users and 1 guest

cron