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 ...


10

Since the inline assembler of cc65 doesn't accept anonymous labels (from my other answer), another approach is to provide a unique suffix to the labels, which can be applied by the macro. The stringizing operator of the C preprocessor, and the fact that C string literals written consecutively are automatically concatenated, might make this more convenient: #...


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

You can use anonymous labels in ca65. The equivalent to your example code using these, but without the C wrapping, would be: CMP #$60 BCC :+ AND #$DF BNE :++ : AND #$3F : You can also use :- to refer to an anonymous label preceding the current position. Increasing the number of + or - symbols increases the number of anonymous labels to skip over. ...


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