Gosh darn, it's been a while... You might find this to be marginally more efficient.

.word $c000 ; file header

*=$c000

MAIN: LDX #$00

Loop: LDA hello,x

; CMP #$00 - no need for explicit compare as zero

; flags are set on LDA

BEQ Out

JSR CHROUT

INX

; JMP Loop - 3 bytes. Why waste of a byte and cycle...

BNE Loop ; when this will do just as well...

Out: RTS

hello: .asc "hELLO, WORLD!"

.byt 13,0

Saving 3 bytes and cycles might seem a bit odd to some of you people out there but it was the ethos of the 6502 hacker...