1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-06-29 09:29:31 +00:00
kickc/src/test/ref/address-of-2.asm

95 lines
1.9 KiB
NASM

// Test address-of by assigning the affected variable in multiple ways
// Commodore 64 PRG executable file
.file [name="address-of-2.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(__start)
.label val = 2
.segment Code
__start: {
// val = 0
lda #0
sta.z val
jsr main
rts
}
main: {
.label SCREEN1 = $400
.label SCREEN2 = SCREEN1+$28
// Use address-of - hereafter all versions of val must be in the same memory
.label ptr = val
// SCREEN1[idx] = val
lda.z val
sta SCREEN1
// SCREEN2[idx++] = '.'
lda #'.'
sta SCREEN2
// val = 1
// Here we have not yet used address-of - so val can be versioned freely
lda #1
sta.z val
// SCREEN1[idx] = val
sta SCREEN1+1
// SCREEN2[idx++] = '.'
lda #'.'
sta SCREEN2+1
// val = 2
// Set value directly
lda #2
sta.z val
// SCREEN1[idx] = val
sta SCREEN1+2
// SCREEN2[idx++] = *ptr
lda.z ptr
sta SCREEN2+2
// *ptr = 3
// Set value through pointer
lda #3
sta.z ptr
// SCREEN1[idx] = val
lda.z val
sta SCREEN1+3
// SCREEN2[idx++] = *ptr
lda.z ptr
sta SCREEN2+3
// setv(4)
// Set value directly in a call
jsr setv
// SCREEN1[idx] = val
lda.z val
sta SCREEN1+4
// SCREEN2[idx++] = *ptr
lda.z ptr
sta SCREEN2+4
// setp(ptr, 5)
// Set value through pointer in a call
jsr setp
// SCREEN1[idx] = val
lda.z val
sta SCREEN1+5
// SCREEN2[idx++] = *ptr
lda.z ptr
sta SCREEN2+5
// }
rts
}
setv: {
.const v = 4
// val = v
lda #v
sta.z val
// }
rts
}
setp: {
.const v = 5
// *p = v
lda #v
sta.z main.ptr
// }
rts
}