Page 4 of 8
"Hello, World!" with cc65
Posted: Sat Oct 10, 2020 9:05 pm
by SlithyMatt
2 hours ago, kliepatsch said:
. To me, the 2061 still seems like a magic number. Where does it come from?
2061 = $080D
It's simply the start of the machine language program. Before that is just tokenized BASIC and the CPU would choke trying to run that directly, instead of with the BASIC interpreter.
"Hello, World!" with cc65
Posted: Sat Oct 10, 2020 9:52 pm
by geek504
45 minutes ago, SlithyMatt said:
2061 = $080D
It's simply the start of the machine language program. Before that is just tokenized BASIC and the CPU would choke trying to run that directly, instead of with the BASIC interpreter.
My hello.asm does a byte by byte commentary on these magic numbers before your assembly code:
Quote
;
; cl65 -o hello2.prg -t cx16 -C cx16-asm.cfg hello2.asm
;
; Also, you should count on CHROUT modifying X, so you should flank that jsr with phx and plx.
; Run with x16emu.exe -prg hello2.prg -run -scale 2
.org $0801 ; Assembled code should start at $0801
; (where BASIC programs start)
; The real program starts at $0810 = 2064
; 10 SYS 2064
.byte $0C, $08 ; $080C - pointer to next line of BASIC code
.byte $0A, $00 ; 2-byte line number ($000A = 10)
.byte $9E ; SYS BASIC token
.byte $20 ; [space]
.byte $32, $30, $36, $34 ; $32="2",$30="0",$36="6",$34="4"
.byte $00 ; End of Line
.byte $00, $00 ; This is address $080C containing
; 2-byte pointer to next line of BASIC code
; ($0000 = end of program)
.byte $00, $00 ; Padding so code starts at $0810
CHROUT = $FFD2
ldx #0
again:
lda hello, x
cmp #0
beq done
stx SaveX
jsr CHROUT
ldx SaveX
inx
jmp again
done:
rts
SaveX: .byte 0
hello:
.byte "hello world! ", $00
Enjoy!
"Hello, World!" with cc65
Posted: Sun Oct 11, 2020 2:18 am
by SlithyMatt
You can lose that CMP #0 instruction. It's unnecessary. The LDA before already sets the Z bit the exact same way.
"Hello, World!" with cc65
Posted: Mon Oct 12, 2020 11:23 pm
by geek504
On 10/10/2020 at 11:18 PM, SlithyMatt said:
You can lose that CMP #0 instruction. It's unnecessary. The LDA before already sets the Z bit the exact same way.
Point noted, just as the stx/ldx SaveX could be replaced by the most efficient phx/plx to save a few bytes more. Sometimes a more verbose code explains better than an efficient code
? Efficient code sometimes look like magic!
"Hello, World!" with cc65
Posted: Tue Oct 13, 2020 11:03 pm
by MontyHall
I can't get hello world to work. I'm running ubuntu 20 and compiled cc65.
When I make I get the following:
(base) rick@rick:~/workspace/x16-hello-cc65$ make
make -C asm
make[1]: Entering directory '/home/rick/workspace/x16-hello-cc65/asm'
cl65 -t cx16 -o HELLOASM.PRG -l hello.list hello.asm
ld65: Error: Cannot find config file 'cx16.cfg'
make[1]: *** [Makefile:4: all] Error 1
make[1]: Leaving directory '/home/rick/workspace/x16-hello-cc65/asm'
make: *** [Makefile:2: all] Error 2
I have cc65/bin in my path. I suspect I need to hack the make file to point to configs.
"Hello, World!" with cc65
Posted: Tue Oct 13, 2020 11:41 pm
by MontyHall
What's the performance penalty of using cc65 C over pure assembly? Have to admit would like to rapid prototype in C w/o the assembly albatross. Would you say cc65 C is 2x slower? It certainly can't be worse than basic 2.0.
"Hello, World!" with cc65
Posted: Tue Oct 13, 2020 11:55 pm
by desertfish
It should be way way faster than basic. Some micro benchmarks comparing several languages (including raw assembly) is here
https://github.com/KarolS/millfork-benchmarks/tree/master/6502
"Hello, World!" with cc65
Posted: Wed Oct 14, 2020 12:33 am
by MontyHall
That's impressive. Reasonable hit in speed using cc65 C.
"Hello, World!" with cc65
Posted: Wed Oct 14, 2020 1:00 am
by geek504
1 hour ago, MontyHall said:
What's the performance penalty of using cc65 C over pure assembly? Have to admit would like to rapid prototype in C w/o the assembly albatross. Would you say cc65 C is 2x slower? It certainly can't be worse than basic 2.0.
Just don't do a printf() version of "Hello, World!" That'll generate a binary of at least 2,000 bytes! Use CHROUT or STROUT instead with assembly or C using a specific X16 library.
"Hello, World!" with cc65
Posted: Wed Oct 14, 2020 1:02 am
by geek504
1 hour ago, MontyHall said:
I have cc65/bin in my path.
You need other directories defined as well... here's my Windows batch file I run before compiling with cc65:
Quote
set CC65_HOME=c:\cc65
set CA65_INC=c:\cc65\asminc
set CC65_INC=c:\cc65\include
set LD65_LIB=c:\cc65\lib
set LD65_CFG=c:\cc65\cfg
set LD65_OBJ=c:\cc65\obj
set PATH=%PATH%;c:\cc65\bin