User:Moiree/Pointers in assembler vs. C (cc65)
From C64-Wiki
Jump to navigationJump to search
These examples are for example purpose only.
| Why to start coding in C rather than in BASIC | |
|---|---|
!to "ptest0.asm" *=$1000 |
void main(void)
{
|
COLORRAM = $D800 |
#define COLORRAM ((unsigned char*) 0xd800) |
colorram_p = $fc |
unsigned char *ColorRAM_p; |
lda #$d7
sta $fe
lda #$01
ldy #$e7
ldx #$db
sty colorram_p
stx colorram_p+1
|
ColorRAM_p = COLORRAM; |
ldy #$00
.loop: sta (colorram_p),y
dec colorram_p
bne .loop
dec colorram_p+1
ldx colorram_p+1
cpx $fe
beq .end
lda #$01
jmp .loop
.end: rts
|
unsigned int i;
for (i = 0; i < 1000; ++i)
{
*(ColorRAM_p++) = 1;
}
|
} | |
| Comparison of above asm code vs. what cc65 -Oi -Os -Or produced | |
|---|---|
COLORRAM = $D800
colorram_p = $fc
lda #$d7
sta $fe
lda #$01
ldy #$e7
ldx #$db
sty colorram_p
stx colorram_p+1
ldy #$00
.loop: sta (colorram_p),y
dec colorram_p
bne .loop
dec colorram_p+1
ldx colorram_p+1
cpx $fe
beq .end
lda #$01
jmp .loop
.end: rts
|
.segment "BSS"
_ColorRAM_p:
.res 2,$00
_i:
.res 2,$00
; ---------------------------------------------------------------
; void __near__ main (void)
; ---------------------------------------------------------------
.segment "CODE"
.proc _main: near
.segment "CODE"
ldx #$D8
lda #$00
sta _ColorRAM_p
stx _ColorRAM_p+1
sta _i
sta _i+1
L0006: lda _i+1
cmp #$03
bne L000D
lda _i
cmp #$E8
L000D: bcs L0007
lda _ColorRAM_p
ldx _ColorRAM_p+1
sta regsave
stx regsave+1
clc
adc #$01
bcc L0012
inx
L0012: sta _ColorRAM_p
stx _ColorRAM_p+1
lda #$01
ldy #$00
sta (regsave),y
inc _i
bne L0006
inc _i+1
jmp L0006
L0007: rts
.endproc
|
Lets write C like assembler and see what cc65 does with it (optimizations all on!)
#define COLORRAM ((unsigned char*) 0xd800)
unsigned char *ColorRAM_p;
void main(void)
{
ColorRAM_p = COLORRAM;
for ( ColorRAM_p = (unsigned char *) 0xdbe7;
ColorRAM_p == (unsigned char *) 0xd7ff;
*( --ColorRAM_p ) = 1 );
}
| |
.segment "BSS"
_ColorRAM_p:
.res 2,$00
_i:
.res 2,$00
; ---------------------------------------------------------------
; void __near__ main (void)
; ---------------------------------------------------------------
.segment "CODE"
.proc _main: near
.segment "CODE"
ldx #$D8
lda #$00
sta _ColorRAM_p
stx _ColorRAM_p+1
sta _i
sta _i+1
L0006: lda _i+1
cmp #$03
bne L000D
lda _i
cmp #$E8
L000D: bcs L0007
lda _ColorRAM_p
ldx _ColorRAM_p+1
sta regsave
stx regsave+1
clc
adc #$01
bcc L0012
inx
L0012: sta _ColorRAM_p
stx _ColorRAM_p+1
lda #$01
ldy #$00
sta (regsave),y
inc _i
bne L0006
inc _i+1
jmp L0006
L0007: rts
.endproc
|
.segment "BSS" _ColorRAM_p: .res 2,$00 ; --------------------------------------------------------------- ; void __near__ main (void) ; --------------------------------------------------------------- .segment "CODE" .proc _main: near .segment "CODE" ldx #$D8 lda #$00 sta _ColorRAM_p stx _ColorRAM_p+1 ldx #$DB lda #$E7 sta _ColorRAM_p stx _ColorRAM_p+1 L0006: lda _ColorRAM_p+1 cmp #$D7 bne L0007 lda _ColorRAM_p cmp #$FF bne L0007 lda _ColorRAM_p sec sbc #$01 sta _ColorRAM_p bcs L0010 dec _ColorRAM_p+1 L0010: ldx _ColorRAM_p+1 sta ptr1 stx ptr1+1 lda #$01 ldy #$00 sta (ptr1),y jmp L0006 L0007: rts .endproc |
| So better write C like C, the CC65 compiler seems good enough! | |
common sense
lda #01
ldy #249
- sta $d800,y
sta $d800+250,y
sta $d800+500,y
sta $d800+750,y
dey
bpl -
rts