Hot answers tagged

18

The Fix for cc65 This was discussed in cc65 issue #946 and fixed by cc65 PR #965. That was merged to the master branch on 2019-10-26, and should appear in V2.19 of cc65. (I don't know when that release will happen, however; it's been five months since the last release.) It is, however, quite easy to do your own build of cc65 if you want to use the master ...


8

Your source is most likely in ISO 8859-1 (or -15) encoded (*1), so the compiler has to do code conversion between character literals in your source and the designated target. Without a specifying a target CL65 uses, unlike all other tools, the C64 target by default (*2). As specified in target.c line 193, the C64 Target uses the PETSCII table at line 113, ...


7

Is there an escape character in ca65 to add such commands to a text string? In general: No. The whole ASCII(Z) mechanic is meant to write device independent code, so adding device specific sequences is rather outside of the scope. To get arbitary inserts, you may want to use the good old .BYTE: msg .BYTE "Hello ",$05,"World",0 Then ...


7

Simple reason CL65 is using "C64" target, while CA65 uses "none". Adding a -t none should make this disappear. Details: The CL65 documentation for -t does clearly point out the difference: -t sys, --target sys The default for this option is different from the compiler and linker in the case that the option is missing: While the other ...


5

There is a pseudo variable __AX__ of type unsigned int that can be assigned a value that then ends up in register A (lo byte) and X (hi byte). So, the following macro definition works as intended: #define set_bgcolor(C) (__AX__ = (C),asm("sta $D021")) I found this under "Extensions" in the cc65 user guide.


3

(Caveat: This is from memory with a quick peek into the manual. So some reply after trying it might be useful.) TL;DR; Fill it Try fill=yes (*1) for the memory area of MAIN and make HIMEMSEG overwrite the area you added: MEMORY { ZP: file = "", start = $0002, size = $00FE, define = yes; LOADADDR: file = %O, start = %S - 2, size =...


3

Adding this to the code as per @tofro's suggestion: unsigned char kernel_getin(void *ptr, unsigned char *size) { unsigned char * data = (unsigned char *)ptr; unsigned char i; unsigned char st=0; for(i=0; i<*size; i++) { st = cbm_k_readst(); if (st) break; data[i] = cbm_k_getin(); } data[i] = '\0'; ...


2

I would expect that the CC65 compiler, like most compilers, would output string literals using whatever sequence of bytes appears in the source file. If you want to ensure that particular byte values get included in a string, you can use a backslash followed by a three-digit octal number to include any byte value within a string. While one could use fewer ...


1

ca65 was designed as a single-pass assembler. So this works: addr = 4096 .byte $9e,.sprintf("%d", addr) but this does not: .byte $9e,.sprintf("%d", addr) addr = 4096 --> Error: Constant expression expected The expression can't simply be constant; it must be constant and has to be defined before the sprintf ...


Only top voted, non community-wiki answers of a minimum length are eligible