brainwagon "There is much pleasure in useless knowledge." — Bertrand Russell

18Apr/121

K3MGY, the Titanic Special Event Station

On this past Saturday, April 14th, I was tuning around to see if I could pick up one of the stations which was activated to celebrate (is that the right word) the 100th anniversary of the Titanic disaster. I quickly found K3MGY in Baltimore, and recorded an hour of their operation on twenty meters. Not the most compelling audio, as my setup is pretty crude by most standards, but K3MGY's signal was strong, and I could often hear both sides of the QSO. If you want to hear what it's like to be using my dining room shack, go ahead and download the 27 megabytes, grab a Diet coke, and close your eyes: it'll be just like being there.

April 14th, 2012 recording of station K3MGY (MP3, 27 megabytes)

Warning: it's just raw, unedited audio. Repeat. Raw, unedited audio. You will find it boring, unless you are crazy like me.

Filed under: Amateur Radio 1 Comment
15Apr/120

A cool JT65 QSO…

Last night I got home from a day spent with new-baby-relatives, and decided to power up the ham radio setup and see if I could snag any good QSOs via JT65. The bands weren't really all that good for me, but heck: it's JT65, and it always seems to present something. A few minutes later, I saw the callsign K3IO pop up: I answered the call, and then tried to hit QRZ to find his details, but QRZ appeared (appears?) to be down, so I just googled.

And then I realized that it was Doctor Tom Clark (formerly W3IWI). Many hams know who he is, but in case you don't, here's a list of some of his accomplishments taken from his retirement announcement in 2001:

Tom received his B.S. in Engineering Physics and his Ph.D. in Astro-Geophysics from the University of Colorado in 1961 and 1967 respectively. From 1966 to 1968, he served as Chief of the Astronomy Branch at NASA Marshall Space Flight Center and as ProjectScientist on the Spacelab Coronagraph. Since arriving at GSFC in 1968, Tom has received numerous NASA awards for his pioneering work on Radio Astronomy Explorer 1 and 2 and several generations of Very Long Baseline Interferometry (VLBI) systems. Since the beginning of the NASA Crustal Dynamics Project in 1979, a global network of approximately 30 VLBI stations have been used to define the Celestial reference Frame and to measure global plate tectonics, Earth orientation parameters, and Universal Time. In recent years, he developed the Totally Accurate Clock (TAC), an inexpensive GPS timing receiver that has found widespread use in a number of global networks. Tom was named a Fellow of the American Geophysical Union (AGU) in 1991 and a Fellow of the International Association of Geodesy (IAG) in 1999. Tom was also a pioneer in amateur and digital radio; he designed and flew several low cost satellites for relaying amateur radio messages around the globe and is a past president of AMSAT. Earlier this month, he was one of only 50 initial inductees into the CQ Amateur Radio Hall of Fame, a list which included such engineering luminaries and inventors as Guglielmo Marconi (radio), Samuel Morse (telegraph), Nikola Tesla (HF generators and radio), and John Bardeen and William Schockley (transistor).

The same announcement refers to him as NASA Goddard Space Flight Center's "resident curmudgeon". I can't think of a cooler description.

I mangled the final 73, and sent Tom a quick email after our QSO apologizing and (in addition to telling him the details of my dining room table shack) gushing a bit about what a pleasure it was to exchange a QSO with him. He kindly responded similarly, thanking me for recognizing his "new" callsign. It's too bad JT65 isn't good for conversations, but it's still a nice QSO.

Filed under: Amateur Radio No Comments
10Apr/122

fldigi now includes WEFAX reception…

Okay, nothing really more to say: fldigi now has WEFAX reception. I decided to try it out on transmissions from Norfolk, VA tonight. Not bad (although I think my own receiver works a bit better). Still, it's nice to have them in one place. Now, all that fldigi needs is JT65A, and life would be good.

Filed under: Amateur Radio 2 Comments
10Apr/122

Russ Cox muses about Fields and Reed-Solomon codes

I've been pretty interested in codes of all sort, both the cryptographic codes and the codes that are used to provide error detection and correction. While I've played around quite a bit with convolutional codes, I haven't really every bothered to develop more than a cursory understanding of the Reed-Solomon error correcting codes which have widely applied in many applications such as data storage (most notably for compact discs) and satellite data transmission. It's very cool technology.

Luckily, super smart guy Russ Cox has a very nice writeup on the theory and practice of Reed Solomon codes. Previously Russ had postings about fast regular expression matching which you might have read (or should have). I really like his postings: he has a very clear, pragmatic but not dumbed-down approach to both the theory and practice of programming. This series promises to go on in future postings, I'll be eagerly awaiting future installments.

8Apr/120

My first week of JT65..

Over the last week, I started playing around with JT65-HF. JT65-HF is a digital mode, which is good for only the most basic of information exchanges: grid square, signal levels, and perhaps a very short 73 message. But it's got some cool features. It operates on low power, and can automatically log any callsigns you spot to a centralized location, rather like the WSPR propagation reporter. JT-65 writes records of all signals received in CSV format, and so you can mine them for all sorts of good information. I wrote a simple script that isolated all transmissions that specified a Maidenhead gridsquare, and then gathered them together all the callsigns that originated in each square. Over the last week, I've logged 453 unique callsigns, from 249 unique gridsquares. Not bad, for very low 40m dipole. Check it out!

BL01 KH6GRT, KH6SAT
BL11 KH6DC, KH6OO
BP51 KL5E, KL7YK
BP54 WL7BDO
CM87 WQ6C
CM88 KD6HQ, N6BX
CM94 KI4MI
CM95 KG6WIK
CM97 AK1P, K6EU, K6RF, KD6FTR
CM98 KJ6CC, KJ6RKZ, W6KAP
CN76 K7MSC
CN79 VA7HZ
CN82 K7TLP
CN84 AI7W, KF7JGF
CN85 K2NCC, K7FET, KE7WEG, W7JAZ, W7LHT, W7YES, WE1SH
CN87 AE7U, WA7SCH, WB7AJP
CN88 AC7SG, K3NDE, VA7RME
CN89 VA7EFV, VE7GMN, VE7NH
CO70 VA7JH
CO90 VA7AQD
DL80 XE1GZU
DL99 K5WW
DM03 WA6OWM
DM04 AG6EF, K6AZR
DM12 N3PV
DM13 K6RBS, KC6OVG, KD6MHL, W4EG, W6KY, WB6RLC
DM14 N6CVA
DM26 AG7CM, KS7DX, N7BPA
DM33 K3WYC, K7TEJ, N7AMA, N7GDP, NR5O
DM35 AE7CD
DM37 KK7H
DM41 N1LS
DM43 KM3N, N7NEV, N9CVB, W8FDV
DM49 KK7FC
DM62 WA5DJJ
DM65 WB2FKO
DM68 K0JY
DM78 W0KIT
DM79 AB0YM, KC0ZGK, KD0BIK, WB4CIW
DM91 K5OAI
DM95 WY5R
DN17 N7JFP, W7MEM
DN23 KF7GMV
DN31 KD7SXN, KJ7NO, N7JCO, NS7K
DN36 N7NSO
DN40 KJ2U
DN47 NT7R
DN71 WA7ZXL
DN84 K0JV, K7RE
DN98 W0TUP
DO33 VA6SZ, VE6SQ
EL07 K2OO
EL17 KF5IAK
EL18 NW5P
EL29 AE5RA, KB5UPS, KF5MDZ
EL49 KB5GA, W5ZPA, WB5NPW
EL86 NY4FD
EL87 KG4OXA
EL89 K3LUE, WB4RQD
EL95 AJ4WC, KK4CIS
EL98 AA4KN, KS4N, N4ABN, W2RXG
EL99 KG4Q
EM00 AC0WN
EM05 AA5CK
EM11 K5HGX, N6PL
EM12 K6VNG, NA5AA, W5AP
EM13 AC5T, KJ5XX, WA5MS, WA5PGS
EM15 AE5ZD, W7CNK
EM20 AA5KK
EM28 K0ASK, WB0ZPW
EM29 KB0PPQ, KD0AGX, W0PSK, WB0LCW, WB0ZYU
EM30 K5DDM
EM34 AE5ZZ
EM37 N0FYF
EM40 K5CJU, W5ADD
EM42 N5VEI
EM45 AE5RU, AE5SB, W5TT
EM47 N0NSR
EM48 AA0YY, AC0LP, K0TPP, W9MO
EM50 N4UPX, W5XN, W8DM
EM59 K9EEI
EM63 KF4RWA, KK4AFS
EM65 K4KQZ
EM67 W9ATB
EM69 N9WKW, WB9IIV
EM70 K4TFT
EM73 K4STA
EM74 AI4RJ, KB4KBS
EM78 K8LEN, K9AAN, N4MRM, N9DFD
EM79 N8XYN, W8JAQ
EM83 KS4GY
EM84 KD4YDD, KG6MC, W4DJW, WB2GJD, WB4ZWK
EM85 KJ4ZQX, N5FPW
EM88 KC8GCR, KD7YZ
EM92 K4BTC
EM95 KR4RO, W1HFB, WB4KJV
EM96 K4BSZ
EM99 WT8D
EN10 N0LWF
EN11 KA0VXK
EN21 WD0DMO
EN33 N0HD
EN34 W0OHU, WB0N
EN35 KC0YFC, N0OLE, ND0M
EN36 K0JWC
EN37 NA0F
EN41 KB0NAZ, KD0JHW, WA0EIR
EN42 AA0N, K8OM
EN43 WB9BJQ
EN44 KC9ECI
EN50 N9GUE
EN51 KA9BHD, KA9CCH, KB9MNM, KC9UDE, W9YNP, WA9MNF
EN52 K9JKM, KC9MEG
EN53 KA9SWE
EN55 WB9SDD
EN60 KA2EYH
EN61 KB9ILT, KC9OMS, N2BJ, WB9B
EN62 KC9IL
EN63 KD8OTT
EN72 N8BB
EN73 NZ8V
EN80 K0KC, NT8Z, W8DEL, W8KHR, W8MDG
EN81 KD8BIN, NM8W
EN82 AC8KR, KK8MM, VA3DAZ, VA3UG
EN90 WA3CAS
EN91 KG8IU
EN92 VE3FMC
EN93 VE3IYB, VE3ZUP
FD55 LU1XT
FD66 LU2XPK, LU2XSN, LU8XQL
FF45 CE4SFG
FF97 LU4FT
FG75 LU5OM
FI07 HC5VF
FJ78 YV6BFE
FJ79 YV5MM, YV6GM
FJ92 PV8AZ
FK52 PJ2MI
FM03 N4ITM
FM04 KS4S
FM08 KX4P
FM09 WK8G
FM16 K4MJ, K4VHV, KQ4ZH, N8XHF
FM17 K8SI
FM18 KB3FF, KG3BOZ, N3CAL, N3ES, W3YTS
FM19 AB3RS, W3FJD
FM28 AB3OF, KB3IWV, W3MLK, W3SJT
FM29 N2IDW, W3NRL, WA3QHJ
FN00 N3WLB
FN01 KB3MOW
FN02 VE3EBN, W2DLL
FN03 KC2ZUF, VA3LLZ, VA3PID, VA3WLD, VE3EK, VE3EQV
FN04 VE3NLS
FN10 K3MRK, KB3VNH, WD3K
FN11 K3KAA
FN13 VA3JLF, VE3EP
FN20 K2RWH, K8WHA, KB3TC, KC2WUF, KI2P, ND2K, NY3Z, W2GM, W3BI
FN25 VA3NRN
FN30 KA2DUT, KB2AMY, KC2MBV
FN31 KB1UUB, KC2QFR, WA1NGH
FN34 AB1NJ, KC2FZN, N1DNN
FN41 K1MGH, KA1ERL, W1UU
FN42 KB1ESR, KT1B, N1MGO, NJ1H, W1MSN
FN43 K1CF, KA1QW, W1WRH
FN44 N1GB
FN46 VE2PTB
FN53 N1IPA
FN74 VE1SKY
FN75 VE9DX
GF05 LU8ENU, LU8EX
GF15 CX8AF
GF49 PY3APY, PY3FBI
GG40 PY3OL
GJ25 PZ5RA
IL18 EA8OM
IM58 CT1FBK, CT1HMN
IM87 EA7GDC
IN52 EA1YV
IN80 EA4GB
IN95 F1MWV, F8RZ
IO62 EI3JB
IO64 MI3LDO
IO75 MM0AMW
IO82 G0HDB, G3NYY
JN01 EA3AQS
JN11 EA3NE
JN15 F5BOB
JN37 F6DKQ
JN46 DL1GHJ
JN47 OE9HGV
JN49 DJ9UN
JN55 IK2VTJ
JN69 OK1DX
JN88 OM2AOA
JO03 2E0ZRQ
JO10 F4BAL, F4FVH
JO11 PA0INA
JO21 PA3GAN
JO30 DF7KB
JO31 DK6CS, DL1EKZ, DO1IP
JO32 PA1NL, PD5T
JO45 OZ1TMK
JO51 DM2BPG
JO52 DL1AAH
JO53 DK6XY, DL1HCN
JO62 DD6AJ
JO82 SP3CUG
JP53 LA3LJA
KF26 ZS2EC, ZS2ND
KG43 ZS6BUN
KN95 RN6AM
KO14 LY2OT
KO72 R3WF
LN15 RV6FT
LO14 UA4UK
LO16 UA3TN
LO54 UA4PPQ
NJ84 YB6EN
OF78 VK6NAT
OI94 YC8HI
ON80 BA1PK, BG1QQT
PF94 VK5KGP, VK5NG
PM45 HL5BLI
PM53 JA6ATL
PM54 JH4BTI
PM63 JA5JGY, JA5TX
PM64 JA5AOA, JA5BDZ, JI4JGD
PM74 JA3LXJ, JA8CQM, JE3RNC, JH3OWW, JH3XYP
PM75 JA3BJZ
PM84 JA2IDR
PM85 JA0FOX, JA2JNT, JG2JSZ, JH2DBQ, JQ2HVN
PM94 JR2FVG
PM95 7J1ADS, 7J1BBC, JA1KXQ, JA1OYY, JA1PJS, JA1XIA, JA7FYU, JG1XSL,
     JH1CJY, JH1KYA, JI1CPN, JP1QDH
PM96 JA1MOD, JG1PDG, JH0FSO
PN53 UA0LMO, UA0NL
PN68 UA0DBX
PN78 RA0CGY
QE37 VK7SM
QF22 VK3AMA, VK3BM
QF44 VK1DW
QF56 VK2AJF
QG39 VK4FNQ
QG62 VK4GC, VK4MJF
QG63 VK4LHD
QH30 VK4BDJ
QM05 JA1RNJ, JQ1HDR, JR3ELR
QN12 JA8LN
QO59 UA0IT
RE66 ZL3AB, ZL3NB
Filed under: Amateur Radio No Comments
6Apr/120

My first crude DCPU-16 simulator…

A few days ago, I mentioned that @notch, the creator of Minecraft, had a new idea for a space game that he was beginning to work on. One of the features of this game is that your spaceship would be controlled by a simulated computer that you could program. He released a preliminary specification for the 16 bit machine called DCPU-16. I like writing things like this, so I spent a couple of hours and hacked the simple core of one together. It doesn't yet properly count cycles, but it does implement the basic instruction set, and executes the sample program that he provided in the notes. As yet, he hasn't specified how things like I/O will work (I suspect some of the type 0 reserved opcodes will be used), so it's not of much use, but it might serve as the basis for others to explores.

Addendum: The example program implements a simple loop with the target :loop, but I suspect the bottom of the loop should be an IFE rather than an IFN instruction, otherwise, the loop simple exits on the first iteration.

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>

/*
 * An implementation of Notch's DCPU-16 specification, version 1.1
 * Written by Mark VandeWettering.
 */

/* this has to be 16 bits, because we aren't going to mask increments
 * and decrements.
 */
typedef unsigned short Word ;
#define MEMSIZE (65536)
Word M[MEMSIZE] ;
Word R[8] = {0, 0, 0, 0, 0, 0, 0, 0} ;
Word PC = 0 ;
Word SP = 0 ;
Word O = 0 ;
Word W = 0 ;
unsigned long cycles = 0L ;

#define OP(w)                   ((w)&(0xF))
#define FIELDA(w)               (((w)>>4)&(0x3F))
#define FIELDB(w)               (((w)>>10)&(0x3F))

unsigned char *Rn[] = { "A", "B", "C", "X", "Y", "Z", "I", "J"} ;

Word 
DecodeSRC(Word v)
{
    Word EA ;
    if (v < 0x8) {
        return R[v] ;
    } else if (v < 0x10) {
        return M[R[v&0x7]] ;
    } else if (v < 0x18) {
        EA = M[PC++] ;
        EA += R[v&0x7] ;
        return M[EA] ;
    } else if (v < 0x20) {
        switch (v) {
        case 0x18:
            return M[SP++] ;
        case 0x19:
            return M[SP] ;
        case 0x1a:
            return M[--SP] ;
        case 0x1b:
            return SP ;
        case 0x1c:
            return PC ;
        case 0x1d:
            return 0 ;
        case 0x1e:
            return M[M[PC++]] ;
        case 0x1f:
            return M[PC++] ;
        default:
            abort() ;
        }
    } else if (v < 0x40) {
        return v - 0x20 ;
    } 
    abort() ;
}

Word *
DecodeDST(Word v)
{
    Word EA ;
    Word *T ;
    if (v < 0x8) {
        return R+v ;
    } else if (v < 0x10) {
        return M+(v&0x7) ;
    } else if (v < 0x18) {
        EA = M[PC++] ;
        EA += R[v&0x7] ;
        return M + EA ;
    } else if (v < 0x1f) {
        switch (v) {
        case 0x18:
            return M+(SP++) ;
        case 0x19:
            return M+SP ;
        case 0x1a:
            return M+(--SP) ;
        case 0x1b:
            return &SP ;
        case 0x1c:
            return &PC ;
        case 0x1d:
            return &W ;
        case 0x1e:
            return M+PC++ ;
        case 0x1f:
            return &W ;
        default:
            abort() ;
        }
    } else if (v < 0x40) {
        return &W ;
    } 
    abort() ;
}

int
SkipArg(Word arg)
{
    if (arg >= 0x10 && arg < 0x18)
        return 1 ;
    if (arg == 0x1e)
        return 1 ;
    if (arg == 0x1f)
        return 1 ;
    return 0 ;
}

void
Skip() 
{
    Word I = M[PC++] ;
    Word A = FIELDA(I) ;
    Word B = FIELDB(I) ;
    PC += SkipArg(A) ;
    PC += SkipArg(B) ;
}

#define DEBUGPRINTF(x)          

void
execute()
{
    Word I ;
    Word T ;
    Word B ;
    Word * A ;
    uint32_t a, b ;

    I = M[PC] ;
    PC ++ ;

    if (OP(I) != 0)
        A = DecodeDST((I>>4)&0x3f) ;
    B = DecodeSRC((I>>10)&0x3f) ;
 
    switch (OP(I)) {
    case 0x0:
        switch (((I)>>4)&0x3F) {
        case 0x01:
            /* JSR */
            DEBUGPRINTF("... JSR") ;
            /* Push the PC on the stack */
            M[--SP] = PC ;
            PC = B ;
            break ;
        default:
            abort() ;
        }
        break ;
    case 0x1:   
        /* SET */
        DEBUGPRINTF("... SET\n") ;
        *A = B ;
        break ;
    case 0x2:   
        /* ADD */
        DEBUGPRINTF("... ADD\n") ;
        a = *A ;
        b = B ;
        *A = (a + b) ;
        O = (a + b) >> 16 ;
        break ;
    case 0x3:
        /* SUB */
        DEBUGPRINTF("... SUB\n") ;
        a = *A ;
        b = B ;
        *A = (a - b) ;
        O = (a - b) >> 16 ;
        break ;
    case 0x4:
        /* MUL */
        DEBUGPRINTF("... MUL\n") ;
        a = *A ;
        b = B ;
        *A = (a * b) ;
        O = ((a * b)>>16) ;
        break ;
    case 0x5:
        /* DIV */
        DEBUGPRINTF("... DIV\n") ;
        a = *A ;
        b = B ;
        if (b == 0) {
            *A = O = 0 ;
        } else {
            *A = a / b ;
            O = ((a<<16)/b) ;
        } 
        break ;
    case 0x6:
        /* MOD */
        DEBUGPRINTF("... MOD\n") ;
        a = *A ;
        b = B ;
        if (b == 0)
            *A = 0 ;
        else
            *A = a % b ;
        break ;
    case 0x7:
        /* SHL */
        DEBUGPRINTF("... SHL\n") ;
        a = *A ;
        b = B ;
        *A = a << b ;
        O = (a << b) >> 16 ;
        break ;
    case 0x8:
        /* SHR */
        DEBUGPRINTF("... SHR\n") ;
        a = *A ;
        b = B ;
        *A = a >> b ;
        O = (a << 16) >> b ;
    case 0x9:
        /* AND */
        DEBUGPRINTF("... AND\n") ;
        *A &= B ;
        break ;
    case 0xa:
        /* BOR */
        DEBUGPRINTF("... BOR\n") ;
        *A |= B ;
        break ;
    case 0xb:
        /* XOR */
        DEBUGPRINTF("... XOR\n") ;
        *A ^= B ;
        break ;
    case 0xc:
        /* IFE */
        DEBUGPRINTF("... IFE\n") ;
        if (*A == B) Skip() ;
        break ;
    case 0xd:
        /* IFN */
        DEBUGPRINTF("... IFN\n") ;
        if (*A != B) Skip() ;
        break ;
    case 0xe:
        /* IFG */
        DEBUGPRINTF("... IFG\n") ;
        if (*A > B) Skip() ;
        break ;
    case 0xf:
        /* IFB */
        DEBUGPRINTF("... IFB\n") ;
        if ((*A & B) != 0) Skip() ;
        break ;
    }
    DEBUGPRINTF("\n") ;
}

Word prog0[] = {
    /* 0000 */ 0x7c01, 0x0030, 0x7de1, 0x1000, 0x0020, 0x7803, 0x1000, 0xc00d,
    /* 0008 */ 0x7dc1, 0x001a, 0xa861, 0x7c01, 0x2000, 0x2161, 0x2000, 0x8463,
    /* 0010 */ 0x806d, 0x7dc1, 0x000d, 0x9031, 0x7c10, 0x0018, 0x7dc1, 0x001a,
    /* 0018 */ 0x9037, 0x61c1, 0x7dc1, 0x001a, 0x0000, 0x0000, 0x0000, 0x0000,
} ;
        
void
dumpregs()
{
    int i ;
    printf("... PC=0x%04X SP=0x%04X ", PC, SP) ;
    for (i=0; i<8; i++)
        printf("%s=0x%04X ", Rn[i], R[i]) ;
    printf("O=0x%04X\n", O) ;
}
        

main()
{
    printf("... DCPU-16 simulator.\n") ;
    printf("... version 1.0, written by Mark VandeWettering\n") ;
    printf("... loading %d words of program ...", sizeof(prog0)/sizeof(prog0[0])) ;

    int i ;
    for (i=0; i<sizeof(prog0)/sizeof(prog0[0]); i++) {
        M[i] = prog0[i] ;
    }
    printf("done.\n\n") ;

    for (i=0; i<20; i++) {
        execute() ;
    }
}
5Apr/126

My First True Boat Anchor: A Collins R-390A

My boss is retiring, and as part of his downsizing made me an offer that I couldn't refuse. I'm now the owner although have not yet taken delivery of) a vintage receiver: the Collins R-390A. Here's a pic of it, in all it's vintage glory:

Here's the thing: I'm mostly completely out of my element with regards to these things. The only other piece of vintage tube gear I have is my trusty (not rusty) Drake 2B, and this thing appears to be in a completely different league. While searching around, I found this awesome resource manual, but I would feel better if I had a real genuine mentor to help me get this radio a) safe (some of the things in the manual scare me a teensy bit) and (b) operating well. Can anyone out there suggest any resources (either online or local to the Bay Area) for people who are crazy enough to try to fix/maintain/use this fine bit of vintage equipment?

Filed under: Amateur Radio 6 Comments
5Apr/121

Free to Play (F2P) games

I follow @notch (author of the near legendary independent game Minecraft, where I have spent more than a few hours). I think Minecraft showed considerable creative thinking, and tapped into a need for a kind of gameplay that wasn't well satisfied by other typical genre games. I'm following somewhat eagerly his postings about his new venture: an Elite-like hard science fiction game entitled 0x10c. It's got a number of interesting ideas, not the least of which is a computational sub-component: players will interact with virtual computers that control their spacecraft and provides other mostly hinted at capabilities. Intriguing! I'm working on my own DCPU-16 implementation as we speak.

He recently tweeted a pointer to his unofficial FAQ, which gave some other hints to game play. It included this interesting statement:

No price decided yet. But there will certainly be a monthly fee for playing on the multiverse since even when you will not be connected trajectory and your ship's computer will still be simulated.

Followed up by the statement (found first in this tweet), that F2P (free to play) was a scam.

I'm not a commercial game developer, but I kind of bristled at this. Don't get me wrong, I understand why a player might say it's a scam. Most F2P games make their money by selling in game items (for real cash) that provide a richer game experience. The players who play for free are really only playing a small fraction of the game. If one wants to unlock the full experience, one needs to shell out the coin. The trick of the game developer then becomes to provide the most manipulative incentives to try to get those dollars out of their marks players.

I can see why @notch might not like that. He does genuinely seem to want to create innovative game experiences.

But here's the thing: pay to play is a bit different than traditional games. If I want to play chess, or checkers, I just get a chess set and play. Heck, I could even make a chess set if I wanted to. Unlike most other forms of entertainment we have, traditional games like chess, checkers, cards are games that you buy (or even make) and then enjoy without further financial concerns. One of the truly innovative features (but perhaps overlooked) of Minecraft was that it was more like those games: because @notch released the multiplayer game server software as well as the client, even casual gamers could pick up and enjoy minecraft. If one of your friends set up a server, you could all continue to play. Minecraft was a limitless horizon.

But it appears that 0x10c is going to be a different kind of game: a pay-to-play game. It does have one major advantage: you can't simply buy your way to the end (although given the popularity of F2P, perhaps that is actually a disadvantage?) But it does mean that while you play, you are shelling out money. In that sense, it's more like going out to the movies, or playing games at a casino. It may be cheap as casino games go, but I submit it fundamentally changes the nature of play. And, of course, the game only lasts as long as the casino remains open. If they decide in the future that running this particular kind of casino isn't what they want to do, the game ends, and nobody gets to play any more.

Are (virtually all) F2P games scams? Absolutely. And I applaud @notch for refusing to crassly exploit gamers. But pay-to-play seems to also have some cynical downside as well. Given that a game like 0x10c will likely need centralized servers to provide multiplayer capability, perhaps it's inevitable, but I wonder if other business models could be successful. I think @notch did well to innovate game play. Perhaps another innovator will create a different kind of business model for games.

Filed under: Amateur Radio 1 Comment