mirror of
https://gitlab.com/camelot/kickc.git
synced 2025-02-06 13:31:05 +00:00
Playing a little with XMega helloworld.
This commit is contained in:
parent
7484e27a32
commit
074826fb1f
@ -2,11 +2,17 @@
|
||||
// Each function of the kernal is a no-args function
|
||||
// The functions are placed in the SYSCALLS table surrounded by JMP and NOP
|
||||
|
||||
import "string"
|
||||
|
||||
#pragma link("xmega65.ld")
|
||||
|
||||
|
||||
const char* RASTER = 0xd012;
|
||||
const char* VIC_MEMORY = 0xd018;
|
||||
const char* SCREEN = 0x0400;
|
||||
const char* BGCOL = 0xd021;
|
||||
const char* COLS = 0xd800;
|
||||
const char BLACK = 0;
|
||||
const char WHITE = 1;
|
||||
|
||||
char[] MESSAGE = "hello world!";
|
||||
@ -14,20 +20,27 @@ char[] MESSAGE = "hello world!";
|
||||
void main() {
|
||||
// Initialize screen memory
|
||||
*VIC_MEMORY = 0x14;
|
||||
|
||||
// Print message in white
|
||||
char* sc = SCREEN;
|
||||
char* cols = COLS;
|
||||
for(char* msg = MESSAGE; *msg; msg++, sc++, cols++) {
|
||||
*sc = *msg;
|
||||
*cols = WHITE;
|
||||
*BGCOL = 0x0f;
|
||||
// Init screen/colors
|
||||
memset(SCREEN, ' ', 40*25);
|
||||
memset(COLS, WHITE, 40*25);
|
||||
// Print message
|
||||
char* sc = SCREEN+40;
|
||||
char* msg = MESSAGE;
|
||||
while(*msg) {
|
||||
*sc++ = *msg++;
|
||||
}
|
||||
|
||||
// Loop forever
|
||||
// Loop forever with 2 bars
|
||||
while(true) {
|
||||
if(*RASTER==54 || *RASTER==66) {
|
||||
*BGCOL = WHITE;
|
||||
} else {
|
||||
*BGCOL = BLACK;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void syscall1() {
|
||||
const char* BORDERCOL = $d020;
|
||||
(*BORDERCOL)++;
|
||||
|
@ -8,27 +8,47 @@
|
||||
.segmentdef Data [startAfter="Code", min=$8200, max=$bdff]
|
||||
.segmentdef Stack [min=$be00, max=$beff, fill]
|
||||
.segmentdef Zeropage [min=$bf00, max=$bfff, fill]
|
||||
.label RASTER = $d012
|
||||
.label VIC_MEMORY = $d018
|
||||
.label SCREEN = $400
|
||||
.label BGCOL = $d021
|
||||
.label COLS = $d800
|
||||
.const BLACK = 0
|
||||
.const WHITE = 1
|
||||
.const JMP = $4c
|
||||
.const NOP = $ea
|
||||
.segment Code
|
||||
main: {
|
||||
.label msg = 2
|
||||
.label sc = 4
|
||||
.label cols = 6
|
||||
.label msg = 2
|
||||
// Initialize screen memory
|
||||
lda #$14
|
||||
sta VIC_MEMORY
|
||||
lda #<COLS
|
||||
sta.z cols
|
||||
lda #>COLS
|
||||
sta.z cols+1
|
||||
lda #$f
|
||||
sta BGCOL
|
||||
ldx #' '
|
||||
lda #<SCREEN
|
||||
sta.z sc
|
||||
sta.z memset.str
|
||||
lda #>SCREEN
|
||||
sta.z memset.str+1
|
||||
lda #<$28*$19
|
||||
sta.z memset.num
|
||||
lda #>$28*$19
|
||||
sta.z memset.num+1
|
||||
jsr memset
|
||||
ldx #WHITE
|
||||
lda #<COLS
|
||||
sta.z memset.str
|
||||
lda #>COLS
|
||||
sta.z memset.str+1
|
||||
lda #<$28*$19
|
||||
sta.z memset.num
|
||||
lda #>$28*$19
|
||||
sta.z memset.num+1
|
||||
jsr memset
|
||||
lda #<SCREEN+$28
|
||||
sta.z sc
|
||||
lda #>SCREEN+$28
|
||||
sta.z sc+1
|
||||
lda #<MESSAGE
|
||||
sta.z msg
|
||||
@ -40,28 +60,71 @@ main: {
|
||||
cmp #0
|
||||
bne b2
|
||||
b3:
|
||||
// Loop forever
|
||||
lda #$36
|
||||
cmp RASTER
|
||||
beq b4
|
||||
lda #$42
|
||||
cmp RASTER
|
||||
beq b4
|
||||
lda #BLACK
|
||||
sta BGCOL
|
||||
jmp b3
|
||||
b4:
|
||||
lda #WHITE
|
||||
sta BGCOL
|
||||
jmp b3
|
||||
b2:
|
||||
ldy #0
|
||||
lda (msg),y
|
||||
sta (sc),y
|
||||
lda #WHITE
|
||||
sta (cols),y
|
||||
inc.z msg
|
||||
bne !+
|
||||
inc.z msg+1
|
||||
!:
|
||||
inc.z sc
|
||||
bne !+
|
||||
inc.z sc+1
|
||||
!:
|
||||
inc.z cols
|
||||
inc.z msg
|
||||
bne !+
|
||||
inc.z cols+1
|
||||
inc.z msg+1
|
||||
!:
|
||||
jmp b1
|
||||
}
|
||||
// Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str.
|
||||
// memset(void* zeropage(4) str, byte register(X) c, word zeropage(2) num)
|
||||
memset: {
|
||||
.label end = 2
|
||||
.label dst = 4
|
||||
.label num = 2
|
||||
.label str = 4
|
||||
lda.z num
|
||||
bne !+
|
||||
lda.z num+1
|
||||
beq breturn
|
||||
!:
|
||||
lda.z end
|
||||
clc
|
||||
adc.z str
|
||||
sta.z end
|
||||
lda.z end+1
|
||||
adc.z str+1
|
||||
sta.z end+1
|
||||
b2:
|
||||
lda.z dst+1
|
||||
cmp.z end+1
|
||||
bne b3
|
||||
lda.z dst
|
||||
cmp.z end
|
||||
bne b3
|
||||
breturn:
|
||||
rts
|
||||
b3:
|
||||
txa
|
||||
ldy #0
|
||||
sta (dst),y
|
||||
inc.z dst
|
||||
bne !+
|
||||
inc.z dst+1
|
||||
!:
|
||||
jmp b2
|
||||
}
|
||||
syscall2: {
|
||||
.label BGCOL = $d021
|
||||
inc BGCOL
|
||||
|
@ -9,32 +9,65 @@
|
||||
[3] phi()
|
||||
main: scope:[main] from @1
|
||||
[4] *((const byte*) VIC_MEMORY#0) ← (byte) $14
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@2
|
||||
[5] (byte*) main::cols#2 ← phi( main/(const byte*) COLS#0 main::@2/(byte*) main::cols#1 )
|
||||
[5] (byte*) main::sc#2 ← phi( main/(const byte*) SCREEN#0 main::@2/(byte*) main::sc#1 )
|
||||
[5] (byte*) main::msg#2 ← phi( main/(const byte[]) MESSAGE#0 main::@2/(byte*) main::msg#1 )
|
||||
[6] if((byte) 0!=*((byte*) main::msg#2)) goto main::@2
|
||||
to:main::@3
|
||||
main::@3: scope:[main] from main::@1 main::@3
|
||||
[5] *((const byte*) BGCOL#0) ← (byte) $f
|
||||
[6] call memset
|
||||
to:main::@6
|
||||
main::@6: scope:[main] from main
|
||||
[7] phi()
|
||||
[8] call memset
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main::@2 main::@6
|
||||
[9] (byte*) main::sc#2 ← phi( main::@6/(const byte*) SCREEN#0+(byte) $28 main::@2/(byte*) main::sc#1 )
|
||||
[9] (byte*) main::msg#2 ← phi( main::@6/(const byte[]) MESSAGE#0 main::@2/(byte*) main::msg#1 )
|
||||
[10] if((byte) 0!=*((byte*) main::msg#2)) goto main::@2
|
||||
to:main::@3
|
||||
main::@3: scope:[main] from main::@1 main::@4 main::@5
|
||||
[11] if(*((const byte*) RASTER#0)==(byte) $36) goto main::@4
|
||||
to:main::@7
|
||||
main::@7: scope:[main] from main::@3
|
||||
[12] if(*((const byte*) RASTER#0)==(byte) $42) goto main::@4
|
||||
to:main::@5
|
||||
main::@5: scope:[main] from main::@7
|
||||
[13] *((const byte*) BGCOL#0) ← (const byte) BLACK#0
|
||||
to:main::@3
|
||||
main::@4: scope:[main] from main::@3 main::@7
|
||||
[14] *((const byte*) BGCOL#0) ← (const byte) WHITE#0
|
||||
to:main::@3
|
||||
main::@2: scope:[main] from main::@1
|
||||
[8] *((byte*) main::sc#2) ← *((byte*) main::msg#2)
|
||||
[9] *((byte*) main::cols#2) ← (const byte) WHITE#0
|
||||
[10] (byte*) main::msg#1 ← ++ (byte*) main::msg#2
|
||||
[11] (byte*) main::sc#1 ← ++ (byte*) main::sc#2
|
||||
[12] (byte*) main::cols#1 ← ++ (byte*) main::cols#2
|
||||
[15] *((byte*) main::sc#2) ← *((byte*) main::msg#2)
|
||||
[16] (byte*) main::sc#1 ← ++ (byte*) main::sc#2
|
||||
[17] (byte*) main::msg#1 ← ++ (byte*) main::msg#2
|
||||
to:main::@1
|
||||
memset: scope:[memset] from main main::@6
|
||||
[18] (byte) memset::c#4 ← phi( main/(byte) ' ' main::@6/(const byte) WHITE#0 )
|
||||
[18] (void*) memset::str#3 ← phi( main/(void*)(const byte*) SCREEN#0 main::@6/(void*)(const byte*) COLS#0 )
|
||||
[18] (word) memset::num#2 ← phi( main/(word)(number) $28*(number) $19 main::@6/(word)(number) $28*(number) $19 )
|
||||
[19] if((word) memset::num#2<=(byte) 0) goto memset::@return
|
||||
to:memset::@1
|
||||
memset::@1: scope:[memset] from memset
|
||||
[20] (byte*) memset::end#0 ← (byte*)(void*) memset::str#3 + (word) memset::num#2
|
||||
[21] (byte*~) memset::dst#4 ← (byte*)(void*) memset::str#3
|
||||
to:memset::@2
|
||||
memset::@2: scope:[memset] from memset::@1 memset::@3
|
||||
[22] (byte*) memset::dst#2 ← phi( memset::@1/(byte*~) memset::dst#4 memset::@3/(byte*) memset::dst#1 )
|
||||
[23] if((byte*) memset::dst#2!=(byte*) memset::end#0) goto memset::@3
|
||||
to:memset::@return
|
||||
memset::@return: scope:[memset] from memset memset::@2
|
||||
[24] return
|
||||
to:@return
|
||||
memset::@3: scope:[memset] from memset::@2
|
||||
[25] *((byte*) memset::dst#2) ← (byte) memset::c#4
|
||||
[26] (byte*) memset::dst#1 ← ++ (byte*) memset::dst#2
|
||||
to:memset::@2
|
||||
syscall2: scope:[syscall2] from
|
||||
[13] *((const byte*) syscall2::BGCOL#0) ← ++ *((const byte*) syscall2::BGCOL#0)
|
||||
[27] *((const byte*) syscall2::BGCOL#0) ← ++ *((const byte*) syscall2::BGCOL#0)
|
||||
to:syscall2::@return
|
||||
syscall2::@return: scope:[syscall2] from syscall2
|
||||
[14] return
|
||||
[28] return
|
||||
to:@return
|
||||
syscall1: scope:[syscall1] from
|
||||
[15] *((const byte*) syscall1::BORDERCOL#0) ← ++ *((const byte*) syscall1::BORDERCOL#0)
|
||||
[29] *((const byte*) syscall1::BORDERCOL#0) ← ++ *((const byte*) syscall1::BORDERCOL#0)
|
||||
to:syscall1::@return
|
||||
syscall1::@return: scope:[syscall1] from syscall1
|
||||
[16] return
|
||||
[30] return
|
||||
to:@return
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,10 @@
|
||||
(label) @1
|
||||
(label) @begin
|
||||
(label) @end
|
||||
(byte*) BGCOL
|
||||
(const byte*) BGCOL#0 BGCOL = (byte*) 53281
|
||||
(byte) BLACK
|
||||
(const byte) BLACK#0 BLACK = (byte) 0
|
||||
(byte*) COLS
|
||||
(const byte*) COLS#0 COLS = (byte*) 55296
|
||||
(byte) JMP
|
||||
@ -9,6 +13,8 @@
|
||||
(const byte[]) MESSAGE#0 MESSAGE = (string) "hello world!"
|
||||
(byte) NOP
|
||||
(const byte) NOP#0 NOP = (byte) $ea
|
||||
(byte*) RASTER
|
||||
(const byte*) RASTER#0 RASTER = (byte*) 53266
|
||||
(byte*) SCREEN
|
||||
(const byte*) SCREEN#0 SCREEN = (byte*) 1024
|
||||
(struct SysCall[]) SYSCALLS
|
||||
@ -26,15 +32,34 @@
|
||||
(label) main::@1
|
||||
(label) main::@2
|
||||
(label) main::@3
|
||||
(byte*) main::cols
|
||||
(byte*) main::cols#1 cols zp ZP_WORD:6 22.0
|
||||
(byte*) main::cols#2 cols zp ZP_WORD:6 5.5
|
||||
(label) main::@4
|
||||
(label) main::@5
|
||||
(label) main::@6
|
||||
(label) main::@7
|
||||
(byte*) main::msg
|
||||
(byte*) main::msg#1 msg zp ZP_WORD:2 7.333333333333333
|
||||
(byte*) main::msg#1 msg zp ZP_WORD:2 22.0
|
||||
(byte*) main::msg#2 msg zp ZP_WORD:2 11.0
|
||||
(byte*) main::sc
|
||||
(byte*) main::sc#1 sc zp ZP_WORD:4 11.0
|
||||
(byte*) main::sc#2 sc zp ZP_WORD:4 6.6000000000000005
|
||||
(byte*) main::sc#2 sc zp ZP_WORD:4 11.0
|
||||
(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num)
|
||||
(label) memset::@1
|
||||
(label) memset::@2
|
||||
(label) memset::@3
|
||||
(label) memset::@return
|
||||
(byte) memset::c
|
||||
(byte) memset::c#4 reg byte x 1.375
|
||||
(byte*) memset::dst
|
||||
(byte*) memset::dst#1 dst zp ZP_WORD:4 22.0
|
||||
(byte*) memset::dst#2 dst zp ZP_WORD:4 15.333333333333332
|
||||
(byte*~) memset::dst#4 dst zp ZP_WORD:4 4.0
|
||||
(byte*) memset::end
|
||||
(byte*) memset::end#0 end zp ZP_WORD:2 2.1666666666666665
|
||||
(word) memset::num
|
||||
(word) memset::num#2 num zp ZP_WORD:2 2.0
|
||||
(void*) memset::return
|
||||
(void*) memset::str
|
||||
(void*) memset::str#3 str zp ZP_WORD:4
|
||||
(void()) syscall1()
|
||||
(label) syscall1::@return
|
||||
(byte*) syscall1::BORDERCOL
|
||||
@ -44,6 +69,6 @@
|
||||
(byte*) syscall2::BGCOL
|
||||
(const byte*) syscall2::BGCOL#0 BGCOL = (byte*) 53281
|
||||
|
||||
zp ZP_WORD:2 [ main::msg#2 main::msg#1 ]
|
||||
zp ZP_WORD:4 [ main::sc#2 main::sc#1 ]
|
||||
zp ZP_WORD:6 [ main::cols#2 main::cols#1 ]
|
||||
zp ZP_WORD:2 [ memset::num#2 memset::end#0 main::msg#2 main::msg#1 ]
|
||||
zp ZP_WORD:4 [ memset::str#3 memset::dst#2 memset::dst#4 memset::dst#1 main::sc#2 main::sc#1 ]
|
||||
reg byte x [ memset::c#4 ]
|
||||
|
Loading…
x
Reference in New Issue
Block a user