// Demonstrates problem with missing parenthesis in double-dereferencing // https://gitlab.com/camelot/kickc/issues/270 // Commodore 64 PRG executable file .file [name="struct-ptr-22.prg", type="prg", segments="Program"] .segmentdef Program [segments="Basic, Code, Data"] .segmentdef Basic [start=$0801] .segmentdef Code [start=$80d] .segmentdef Data [startAfter="Code"] .segment Basic :BasicUpstart(main) .label print_screen = $400 .label print_char_cursor = 4 .label print_line_cursor = 6 .segment Code main: { .label __13 = 6 // file->bufEdit = (char*)0x4000 lda #<$4000 sta files lda #>$4000 sta files+1 // file->bufEdit[3] = 0xAA lda #$aa ldy #3 ldx files stx.z $fe ldx files+1 stx.z $ff sta ($fe),y // ((char *)file->bufEdit)[4] = 0xCC lda files sta.z __13 lda files+1 sta.z __13+1 // writes address 0x0000 (wrong!) lda #$cc ldy #4 sta (__13),y // print_cls() // writes address 0x4004 (right!) jsr print_cls // print_str("$0000=") lda #print_screen sta.z print_char_cursor+1 lda #str sta.z print_str.str+1 jsr print_str // print_uchar(*(char *)0x0000) ldx.z 0 jsr print_uchar // print_ln() lda #print_screen sta.z print_line_cursor+1 jsr print_ln lda.z print_line_cursor sta.z print_char_cursor lda.z print_line_cursor+1 sta.z print_char_cursor+1 // print_str("$4004=") lda #str1 sta.z print_str.str+1 jsr print_str // print_uchar(*(char *)0x4004) ldx $4004 jsr print_uchar // print_ln() jsr print_ln // } rts .segment Data str: .text "$0000=" .byte 0 str1: .text "$4004=" .byte 0 } .segment Code // Clear the screen. Also resets current line/char cursor. print_cls: { // memset(print_screen, ' ', 1000) jsr memset // } rts } // Print a zero-terminated string // void print_str(__zp(2) char *str) print_str: { .label str = 2 __b1: // while(*str) ldy #0 lda (str),y cmp #0 bne __b2 // } rts __b2: // print_char(*(str++)) ldy #0 lda (str),y jsr print_char // print_char(*(str++)); inc.z str bne !+ inc.z str+1 !: jmp __b1 } // Print a char as HEX // void print_uchar(__register(X) char b) print_uchar: { // b>>4 txa lsr lsr lsr lsr // print_char(print_hextab[b>>4]) tay lda print_hextab,y // Table of hexadecimal digits jsr print_char // b&0xf lda #$f axs #0 // print_char(print_hextab[b&0xf]) lda print_hextab,x jsr print_char // } rts } // Print a newline print_ln: { __b1: // print_line_cursor + 0x28 lda #$28 clc adc.z print_line_cursor sta.z print_line_cursor bcc !+ inc.z print_line_cursor+1 !: // while (print_line_cursorstr sta.z dst+1 __b1: // for(char* dst = str; dst!=end; dst++) lda.z dst+1 cmp #>end bne __b2 lda.z dst cmp #