1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-02-16 18:30:37 +00:00

Added CBM keyboard test using GETIN().

This commit is contained in:
jespergravgaard 2021-09-26 22:27:44 +02:00
parent 3e979a4ebb
commit 5f7d7c45be
6 changed files with 9413 additions and 0 deletions

View File

@ -4288,6 +4288,11 @@ public class TestProgramsFast extends TestPrograms {
compileAndCompare("test-keyboard.c");
}
@Test
public void testCbmKeyboard() throws IOException {
compileAndCompare("cbm-keyboard.c");
}
@Test
public void testC64DtvColor() throws IOException {
compileAndCompare("c64dtv-color.c");

View File

@ -0,0 +1,51 @@
#pragma var_model(mem)
#pragma zp_reserve(0x91, 0x99, 0xa0, 0xa1, 0xa2, 0xc0, 0xc5, 0xc6, 0xcb, 0xcc )
#include <6502.h>
#include <c64.h>
#include <stdio.h>
#include <conio.h>
// Show the currently pressed key
int main(void) {
VICII->MEMORY = toD018(DEFAULT_SCREEN, DEFAULT_FONT_MIXED);
clrscr();
char current = 0;
for(;;) {
char ch = GETIN();
if(ch && ch!=current) {
printf("'%c'($%2x) ", petscii_to_screencode(ch), ch);
current = ch;
}
}
}
// Convert a PETSCII char to screencode
char petscii_to_screencode(char petscii) {
if(petscii<32)
return petscii+128;
else if(petscii<64)
return petscii;
else if(petscii<96)
return petscii-64;
else if(petscii<128)
return petscii-32;
else if(petscii<160)
return petscii+64;
else if(petscii<255)
return petscii-128;
else // ==255
return 0x5e;
}
// GETIN. Read byte from default input. (If not keyboard, must call OPEN and CHKIN beforehands.)
// Return: next byte in buffer or 0 if buffer is empty.
char GETIN() {
char * const ch = (char*)0xff;
asm {
jsr $ffe4
sta ch
}
return *ch;
}

View File

@ -0,0 +1,839 @@
// Commodore 64 PRG executable file
.file [name="cbm-keyboard.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)
.const LIGHT_BLUE = $e
.const OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS = 1
.const OFFSET_STRUCT_MOS6569_VICII_MEMORY = $18
.const STACK_BASE = $103
.const SIZEOF_STRUCT_PRINTF_BUFFER_NUMBER = $c
/// The VIC-II MOS 6567/6569
.label VICII = $d000
/// Color Ram
.label COLORRAM = $d800
/// Default address of screen character matrix
.label DEFAULT_SCREEN = $400
/// Default address of the chargen font (mixed case)
.label DEFAULT_FONT_MIXED = $1800
// The current text cursor line start
.label conio_line_text = $e
// The current color cursor line start
.label conio_line_color = $c
.segment Code
__start: {
// __ma char *conio_line_text = CONIO_SCREEN_TEXT
lda #<DEFAULT_SCREEN
sta.z conio_line_text
lda #>DEFAULT_SCREEN
sta.z conio_line_text+1
// __ma char *conio_line_color = CONIO_SCREEN_COLORS
lda #<COLORRAM
sta.z conio_line_color
lda #>COLORRAM
sta.z conio_line_color+1
// #pragma constructor_for(conio_c64_init, cputc, clrscr, cscroll)
jsr conio_c64_init
jsr main
rts
}
// Set initial cursor position
conio_c64_init: {
// Position cursor at current line
.label BASIC_CURSOR_LINE = $d6
// char line = *BASIC_CURSOR_LINE
ldx BASIC_CURSOR_LINE
// if(line>=CONIO_HEIGHT)
cpx #$19
bcc __b1
ldx #$19-1
__b1:
// gotoxy(0, line)
jsr gotoxy
// }
rts
}
// Output one character at the current cursor position
// Moves the cursor forward. Scrolls the entire screen if needed
// void cputc(__register(A) char c)
cputc: {
.const OFFSET_STACK_C = 0
tsx
lda STACK_BASE+OFFSET_STACK_C,x
// if(c=='\n')
cmp #'\n'
beq __b1
// conio_line_text[conio_cursor_x] = c
ldy conio_cursor_x
sta (conio_line_text),y
// conio_line_color[conio_cursor_x] = conio_textcolor
lda conio_textcolor
sta (conio_line_color),y
// if(++conio_cursor_x==CONIO_WIDTH)
inc conio_cursor_x
lda #$28
cmp conio_cursor_x
bne __breturn
// cputln()
jsr cputln
__breturn:
// }
rts
__b1:
// cputln()
jsr cputln
rts
}
// Show the currently pressed key
main: {
.const toD0181_return = (>(DEFAULT_SCREEN&$3fff)*4)|(>DEFAULT_FONT_MIXED)/4&$f
// VICII->MEMORY = toD018(DEFAULT_SCREEN, DEFAULT_FONT_MIXED)
lda #toD0181_return
sta VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY
// clrscr()
jsr clrscr
lda #0
sta current
__b1:
// char ch = GETIN()
jsr GETIN
sta ch
// if(ch && ch!=current)
beq __b1
cmp current
bne __b2
jmp __b1
__b2:
// petscii_to_screencode(ch)
lda ch
jsr petscii_to_screencode
sta __6
// printf("'%c'($%2x) ", petscii_to_screencode(ch), ch)
lda #<cputc
sta.z printf_str.putc
lda #>cputc
sta.z printf_str.putc+1
lda #<s
sta.z printf_str.s
lda #>s
sta.z printf_str.s+1
jsr printf_str
// printf("'%c'($%2x) ", petscii_to_screencode(ch), ch)
lda __6
pha
jsr cputc
pla
lda #<cputc
sta.z printf_str.putc
lda #>cputc
sta.z printf_str.putc+1
lda #<s1
sta.z printf_str.s
lda #>s1
sta.z printf_str.s+1
jsr printf_str
// printf("'%c'($%2x) ", petscii_to_screencode(ch), ch)
ldx ch
jsr printf_uchar
// printf("'%c'($%2x) ", petscii_to_screencode(ch), ch)
lda #<cputc
sta.z printf_str.putc
lda #>cputc
sta.z printf_str.putc+1
lda #<s2
sta.z printf_str.s
lda #>s2
sta.z printf_str.s+1
jsr printf_str
lda ch
sta current
jmp __b1
.segment Data
s: .text "'"
.byte 0
s1: .text "'($"
.byte 0
s2: .text ") "
.byte 0
__6: .byte 0
ch: .byte 0
current: .byte 0
}
.segment Code
// Set the cursor to the specified position
// void gotoxy(char x, __register(X) char y)
gotoxy: {
.label __5 = 8
.label __6 = $a
// if(y>CONIO_HEIGHT)
cpx #$19+1
bcc __b2
ldx #0
__b2:
// conio_cursor_x = x
lda #0
sta conio_cursor_x
// conio_cursor_y = y
stx conio_cursor_y
// unsigned int line_offset = (unsigned int)y*CONIO_WIDTH
txa
sta __7
lda #0
sta __7+1
lda __7
asl
sta __8
lda __7+1
rol
sta __8+1
asl __8
rol __8+1
clc
lda __9
adc __8
sta __9
lda __9+1
adc __8+1
sta __9+1
asl line_offset
rol line_offset+1
asl line_offset
rol line_offset+1
asl line_offset
rol line_offset+1
// CONIO_SCREEN_TEXT + line_offset
lda line_offset
clc
adc #<DEFAULT_SCREEN
sta.z __5
lda line_offset+1
adc #>DEFAULT_SCREEN
sta.z __5+1
// conio_line_text = CONIO_SCREEN_TEXT + line_offset
lda.z __5
sta.z conio_line_text
lda.z __5+1
sta.z conio_line_text+1
// CONIO_SCREEN_COLORS + line_offset
lda line_offset
clc
adc #<COLORRAM
sta.z __6
lda line_offset+1
adc #>COLORRAM
sta.z __6+1
// conio_line_color = CONIO_SCREEN_COLORS + line_offset
lda.z __6
sta.z conio_line_color
lda.z __6+1
sta.z conio_line_color+1
// }
rts
.segment Data
__7: .word 0
.label line_offset = __7
__8: .word 0
.label __9 = __7
}
.segment Code
// Print a newline
cputln: {
// conio_line_text += CONIO_WIDTH
lda #$28
clc
adc.z conio_line_text
sta.z conio_line_text
bcc !+
inc.z conio_line_text+1
!:
// conio_line_color += CONIO_WIDTH
lda #$28
clc
adc.z conio_line_color
sta.z conio_line_color
bcc !+
inc.z conio_line_color+1
!:
// conio_cursor_x = 0
lda #0
sta conio_cursor_x
// conio_cursor_y++;
inc conio_cursor_y
// cscroll()
jsr cscroll
// }
rts
}
// clears the screen and moves the cursor to the upper left-hand corner of the screen.
clrscr: {
.label line_text = $10
.label line_cols = $12
lda #<COLORRAM
sta.z line_cols
lda #>COLORRAM
sta.z line_cols+1
lda #<DEFAULT_SCREEN
sta.z line_text
lda #>DEFAULT_SCREEN
sta.z line_text+1
ldx #0
__b1:
// for( char l=0;l<CONIO_HEIGHT; l++ )
cpx #$19
bcc __b2
// conio_cursor_x = 0
lda #0
sta conio_cursor_x
// conio_cursor_y = 0
sta conio_cursor_y
// conio_line_text = CONIO_SCREEN_TEXT
lda #<DEFAULT_SCREEN
sta.z conio_line_text
lda #>DEFAULT_SCREEN
sta.z conio_line_text+1
// conio_line_color = CONIO_SCREEN_COLORS
lda #<COLORRAM
sta.z conio_line_color
lda #>COLORRAM
sta.z conio_line_color+1
// }
rts
__b2:
ldy #0
__b3:
// for( char c=0;c<CONIO_WIDTH; c++ )
cpy #$28
bcc __b4
// line_text += CONIO_WIDTH
lda #$28
clc
adc.z line_text
sta.z line_text
bcc !+
inc.z line_text+1
!:
// line_cols += CONIO_WIDTH
lda #$28
clc
adc.z line_cols
sta.z line_cols
bcc !+
inc.z line_cols+1
!:
// for( char l=0;l<CONIO_HEIGHT; l++ )
inx
jmp __b1
__b4:
// line_text[c] = ' '
lda #' '
sta (line_text),y
// line_cols[c] = conio_textcolor
lda conio_textcolor
sta (line_cols),y
// for( char c=0;c<CONIO_WIDTH; c++ )
iny
jmp __b3
}
// GETIN. Read byte from default input. (If not keyboard, must call OPEN and CHKIN beforehands.)
// Return: next byte in buffer or 0 if buffer is empty.
GETIN: {
.label ch = $ff
// asm
jsr $ffe4
sta ch
// return *ch;
// }
rts
}
// Convert a PETSCII char to screencode
// __register(A) char petscii_to_screencode(__register(A) char petscii)
petscii_to_screencode: {
// if(petscii<32)
cmp #$20
bcc __b1
// if(petscii<64)
cmp #$40
bcc __breturn
// if(petscii<96)
cmp #$60
bcc __b2
// if(petscii<128)
cmp #$80
bcc __b3
// if(petscii<160)
cmp #$a0
bcc __b4
// if(petscii<255)
cmp #$ff
bcc __b5
lda #$5e
rts
__b5:
// return petscii-128;
sec
sbc #$80
__breturn:
// }
rts
__b4:
// return petscii+64;
clc
adc #$40
rts
__b3:
// return petscii-32;
sec
sbc #$20
rts
__b2:
// return petscii-64;
sec
sbc #$40
rts
__b1:
// return petscii+128;
clc
adc #$80
rts
}
/// Print a NUL-terminated string
// void printf_str(__zp($10) void (*putc)(char), __zp($12) const char *s)
printf_str: {
.label s = $12
.label putc = $10
__b1:
// while(c=*s++)
ldy #0
lda (s),y
inc.z s
bne !+
inc.z s+1
!:
cmp #0
bne __b2
// }
rts
__b2:
// putc(c)
pha
jsr icall2
pla
jmp __b1
icall2:
jmp (putc)
}
// Print an unsigned char using a specific format
// void printf_uchar(void (*putc)(char), __register(X) char uvalue, char format_min_length, char format_justify_left, char format_sign_always, char format_zero_padding, char format_upper_case, char format_radix)
printf_uchar: {
.label putc = cputc
.label format_min_length = 2
// printf_buffer.sign = format.sign_always?'+':0
// Handle any sign
lda #0
sta printf_buffer
// uctoa(uvalue, printf_buffer.digits, format.radix)
// Format number into buffer
jsr uctoa
// printf_number_buffer(putc, printf_buffer, format)
lda printf_buffer
sta printf_number_buffer.buffer_sign
// Print using format
jsr printf_number_buffer
// }
rts
}
// Scroll the entire screen if the cursor is beyond the last line
cscroll: {
// if(conio_cursor_y==CONIO_HEIGHT)
lda #$19
cmp conio_cursor_y
bne __breturn
// if(conio_scroll_enable)
lda conio_scroll_enable
bne __b3
// gotoxy(0,0)
ldx #0
jsr gotoxy
__breturn:
// }
rts
__b3:
// memcpy(CONIO_SCREEN_TEXT, CONIO_SCREEN_TEXT+CONIO_WIDTH, CONIO_BYTES-CONIO_WIDTH)
lda #<DEFAULT_SCREEN
sta.z memcpy.destination
lda #>DEFAULT_SCREEN
sta.z memcpy.destination+1
lda #<DEFAULT_SCREEN+$28
sta.z memcpy.source
lda #>DEFAULT_SCREEN+$28
sta.z memcpy.source+1
jsr memcpy
// memcpy(CONIO_SCREEN_COLORS, CONIO_SCREEN_COLORS+CONIO_WIDTH, CONIO_BYTES-CONIO_WIDTH)
lda #<COLORRAM
sta.z memcpy.destination
lda #>COLORRAM
sta.z memcpy.destination+1
lda #<COLORRAM+$28
sta.z memcpy.source
lda #>COLORRAM+$28
sta.z memcpy.source+1
jsr memcpy
// memset(CONIO_SCREEN_TEXT+CONIO_BYTES-CONIO_WIDTH, ' ', CONIO_WIDTH)
ldx #' '
lda #<DEFAULT_SCREEN+$19*$28-$28
sta.z memset.str
lda #>DEFAULT_SCREEN+$19*$28-$28
sta.z memset.str+1
jsr memset
// memset(CONIO_SCREEN_COLORS+CONIO_BYTES-CONIO_WIDTH, conio_textcolor, CONIO_WIDTH)
ldx conio_textcolor
lda #<COLORRAM+$19*$28-$28
sta.z memset.str
lda #>COLORRAM+$19*$28-$28
sta.z memset.str+1
jsr memset
// conio_line_text -= CONIO_WIDTH
sec
lda.z conio_line_text
sbc #$28
sta.z conio_line_text
lda.z conio_line_text+1
sbc #0
sta.z conio_line_text+1
// conio_line_color -= CONIO_WIDTH
sec
lda.z conio_line_color
sbc #$28
sta.z conio_line_color
lda.z conio_line_color+1
sbc #0
sta.z conio_line_color+1
// conio_cursor_y--;
dec conio_cursor_y
rts
}
// Converts unsigned number value to a string representing it in RADIX format.
// If the leading digits are zero they are not included in the string.
// - value : The number to be converted to RADIX
// - buffer : receives the string representing the number and zero-termination.
// - radix : The radix to convert the number to (from the enum RADIX)
// void uctoa(__register(X) char value, __zp($10) char *buffer, char radix)
uctoa: {
.const max_digits = 2
.label buffer = $10
lda #<printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS
sta.z buffer
lda #>printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS
sta.z buffer+1
lda #0
sta started
sta digit
__b1:
// for( char digit=0; digit<max_digits-1; digit++ )
lda digit
cmp #max_digits-1
bcc __b2
// *buffer++ = DIGITS[(char)value]
lda DIGITS,x
ldy #0
sta (buffer),y
// *buffer++ = DIGITS[(char)value];
inc.z buffer
bne !+
inc.z buffer+1
!:
// *buffer = 0
lda #0
tay
sta (buffer),y
// }
rts
__b2:
// unsigned char digit_value = digit_values[digit]
ldy digit
lda RADIX_HEXADECIMAL_VALUES_CHAR,y
sta digit_value
// if (started || value >= digit_value)
lda started
bne __b5
cpx digit_value
bcs __b5
__b4:
// for( char digit=0; digit<max_digits-1; digit++ )
inc digit
jmp __b1
__b5:
// uctoa_append(buffer++, value, digit_value)
jsr uctoa_append
// uctoa_append(buffer++, value, digit_value)
// value = uctoa_append(buffer++, value, digit_value)
// value = uctoa_append(buffer++, value, digit_value);
inc.z buffer
bne !+
inc.z buffer+1
!:
lda #1
sta started
jmp __b4
.segment Data
digit_value: .byte 0
digit: .byte 0
started: .byte 0
}
.segment Code
// Print the contents of the number buffer using a specific format.
// This handles minimum length, zero-filling, and left/right justification from the format
// void printf_number_buffer(void (*putc)(char), __mem() char buffer_sign, char *buffer_digits, char format_min_length, char format_justify_left, char format_sign_always, char format_zero_padding, char format_upper_case, char format_radix)
printf_number_buffer: {
.label buffer_digits = printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS
// strlen(buffer.digits)
jsr strlen
// strlen(buffer.digits)
// signed char len = (signed char)strlen(buffer.digits)
// There is a minimum length - work out the padding
ldx __19
// if(buffer.sign)
lda buffer_sign
beq __b8
// len++;
inx
__b8:
// padding = (signed char)format.min_length - len
txa
eor #$ff
sec
adc #printf_uchar.format_min_length
// if(padding<0)
cmp #0
bpl __b1
lda #0
__b1:
// if(!format.justify_left && !format.zero_padding && padding)
cmp #0
bne __b6
jmp __b2
__b6:
// printf_padding(putc, ' ',(char)padding)
sta printf_padding.length
jsr printf_padding
__b2:
// if(buffer.sign)
lda buffer_sign
beq __b3
// putc(buffer.sign)
pha
jsr cputc
pla
__b3:
// printf_str(putc, buffer.digits)
lda #<printf_uchar.putc
sta.z printf_str.putc
lda #>printf_uchar.putc
sta.z printf_str.putc+1
lda #<buffer_digits
sta.z printf_str.s
lda #>buffer_digits
sta.z printf_str.s+1
jsr printf_str
// }
rts
.segment Data
.label __19 = strlen.len
buffer_sign: .byte 0
}
.segment Code
// Copy block of memory (forwards)
// Copies the values of num bytes from the location pointed to by source directly to the memory block pointed to by destination.
// void * memcpy(__zp(4) void *destination, __zp(2) void *source, unsigned int num)
memcpy: {
.label src_end = 6
.label dst = 4
.label src = 2
.label source = 2
.label destination = 4
// char* src_end = (char*)source+num
lda.z source
clc
adc #<$19*$28-$28
sta.z src_end
lda.z source+1
adc #>$19*$28-$28
sta.z src_end+1
__b1:
// while(src!=src_end)
lda.z src+1
cmp.z src_end+1
bne __b2
lda.z src
cmp.z src_end
bne __b2
// }
rts
__b2:
// *dst++ = *src++
ldy #0
lda (src),y
sta (dst),y
// *dst++ = *src++;
inc.z dst
bne !+
inc.z dst+1
!:
inc.z src
bne !+
inc.z src+1
!:
jmp __b1
}
// Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str.
// void * memset(__zp(2) void *str, __register(X) char c, unsigned int num)
memset: {
.label end = 4
.label dst = 2
.label str = 2
// char* end = (char*)str + num
lda #$28
clc
adc.z str
sta.z end
lda #0
adc.z str+1
sta.z end+1
__b2:
// for(char* dst = str; dst!=end; dst++)
lda.z dst+1
cmp.z end+1
bne __b3
lda.z dst
cmp.z end
bne __b3
// }
rts
__b3:
// *dst = c
txa
ldy #0
sta (dst),y
// for(char* dst = str; dst!=end; dst++)
inc.z dst
bne !+
inc.z dst+1
!:
jmp __b2
}
// Used to convert a single digit of an unsigned number value to a string representation
// Counts a single digit up from '0' as long as the value is larger than sub.
// Each time the digit is increased sub is subtracted from value.
// - buffer : pointer to the char that receives the digit
// - value : The value where the digit will be derived from
// - sub : the value of a '1' in the digit. Subtracted continually while the digit is increased.
// (For decimal the subs used are 10000, 1000, 100, 10, 1)
// returns : the value reduced by sub * digit so that it is less than sub.
// __register(X) char uctoa_append(__zp($10) char *buffer, __register(X) char value, __mem() char sub)
uctoa_append: {
.label buffer = $10
ldy #0
__b1:
// while (value >= sub)
cpx sub
bcs __b2
// *buffer = DIGITS[digit]
lda DIGITS,y
ldy #0
sta (buffer),y
// }
rts
__b2:
// digit++;
iny
// value -= sub
txa
sec
sbc sub
tax
jmp __b1
.segment Data
.label sub = uctoa.digit_value
}
.segment Code
// Computes the length of the string str up to but not including the terminating null character.
// __mem() unsigned int strlen(__zp($10) char *str)
strlen: {
.label str = $10
lda #<0
sta len
sta len+1
lda #<printf_number_buffer.buffer_digits
sta.z str
lda #>printf_number_buffer.buffer_digits
sta.z str+1
__b1:
// while(*str)
ldy #0
lda (str),y
cmp #0
bne __b2
// }
rts
__b2:
// len++;
inc len
bne !+
inc len+1
!:
// str++;
inc.z str
bne !+
inc.z str+1
!:
jmp __b1
.segment Data
len: .word 0
.label return = len
}
.segment Code
// Print a padding char a number of times
// void printf_padding(void (*putc)(char), char pad, __mem() char length)
printf_padding: {
.const pad = ' '
lda #0
sta i
__b1:
// for(char i=0;i<length; i++)
lda i
cmp length
bcc __b2
// }
rts
__b2:
// putc(pad)
lda #pad
pha
jsr cputc
pla
// for(char i=0;i<length; i++)
inc i
jmp __b1
.segment Data
i: .byte 0
length: .byte 0
}
// The digits used for numbers
DIGITS: .text "0123456789abcdef"
// Values of hexadecimal digits
RADIX_HEXADECIMAL_VALUES_CHAR: .byte $10
// The number of bytes on the screen
// The current cursor x-position
conio_cursor_x: .byte 0
// The current cursor y-position
conio_cursor_y: .byte 0
// The current text color
conio_textcolor: .byte LIGHT_BLUE
// Is scrolling enabled when outputting beyond the end of the screen (1: yes, 0: no).
// If disabled the cursor just moves back to (0,0) instead
conio_scroll_enable: .byte 1
// Buffer used for stringified number being printed
printf_buffer: .fill SIZEOF_STRUCT_PRINTF_BUFFER_NUMBER, 0

View File

@ -0,0 +1,497 @@
void __start()
__start: scope:[__start] from
[0] phi()
to:__start::__init1
__start::__init1: scope:[__start] from __start
[1] conio_line_text = DEFAULT_SCREEN
[2] conio_line_color = COLORRAM
[3] call conio_c64_init
to:__start::@1
__start::@1: scope:[__start] from __start::__init1
[4] phi()
[5] call main
to:__start::@return
__start::@return: scope:[__start] from __start::@1
[6] return
to:@return
void conio_c64_init()
conio_c64_init: scope:[conio_c64_init] from __start::__init1
[7] conio_c64_init::line#0 = *conio_c64_init::BASIC_CURSOR_LINE
[8] if(conio_c64_init::line#0<$19) goto conio_c64_init::@2
to:conio_c64_init::@1
conio_c64_init::@2: scope:[conio_c64_init] from conio_c64_init
[9] phi()
to:conio_c64_init::@1
conio_c64_init::@1: scope:[conio_c64_init] from conio_c64_init conio_c64_init::@2
[10] conio_c64_init::line#2 = phi( conio_c64_init::@2/conio_c64_init::line#0, conio_c64_init/$19-1 )
[11] gotoxy::y#2 = conio_c64_init::line#2
[12] call gotoxy
to:conio_c64_init::@return
conio_c64_init::@return: scope:[conio_c64_init] from conio_c64_init::@1
[13] return
to:@return
__stackcall void cputc(char c)
cputc: scope:[cputc] from printf_number_buffer::@7 printf_padding::@2
[14] cputc::c#0 = stackidx(char,cputc::OFFSET_STACK_C)
[15] if(cputc::c#0=='
') goto cputc::@1
to:cputc::@2
cputc::@2: scope:[cputc] from cputc
[16] conio_line_text[conio_cursor_x] = cputc::c#0
[17] conio_line_color[conio_cursor_x] = conio_textcolor
[18] conio_cursor_x = ++ conio_cursor_x
[19] if(conio_cursor_x!=$28) goto cputc::@return
to:cputc::@3
cputc::@3: scope:[cputc] from cputc::@2
[20] phi()
[21] call cputln
to:cputc::@return
cputc::@return: scope:[cputc] from cputc::@1 cputc::@2 cputc::@3
[22] return
to:@return
cputc::@1: scope:[cputc] from cputc
[23] phi()
[24] call cputln
to:cputc::@return
int main()
main: scope:[main] from __start::@1
[25] phi()
to:main::toD0181
main::toD0181: scope:[main] from main
[26] phi()
to:main::@3
main::@3: scope:[main] from main::toD0181
[27] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = main::toD0181_return#0
[28] call clrscr
to:main::@1
main::@1: scope:[main] from main::@10 main::@3 main::@4 main::@9
[29] main::current#2 = phi( main::@9/main::current#4, main::@3/0, main::@4/main::current#2 )
[30] call GETIN
[31] GETIN::return#0 = GETIN::return#1
to:main::@4
main::@4: scope:[main] from main::@1
[32] main::ch#0 = GETIN::return#0
[33] if(0==main::ch#0) goto main::@1
to:main::@10
main::@10: scope:[main] from main::@4
[34] if(main::ch#0!=main::current#2) goto main::@2
to:main::@1
main::@2: scope:[main] from main::@10
[35] petscii_to_screencode::petscii#0 = main::ch#0
[36] call petscii_to_screencode
[37] petscii_to_screencode::return#0 = petscii_to_screencode::return#10
to:main::@5
main::@5: scope:[main] from main::@2
[38] main::$6 = petscii_to_screencode::return#0
[39] call printf_str
to:main::@6
main::@6: scope:[main] from main::@5
[40] stackpush(char) = main::$6
[41] callexecute cputc
sideeffect stackpullbytes(1)
[43] call printf_str
to:main::@7
main::@7: scope:[main] from main::@6
[44] printf_uchar::uvalue#0 = main::ch#0
[45] call printf_uchar
to:main::@8
main::@8: scope:[main] from main::@7
[46] phi()
[47] call printf_str
to:main::@9
main::@9: scope:[main] from main::@8
[48] main::current#4 = main::ch#0
to:main::@1
void gotoxy(char x , char y)
gotoxy: scope:[gotoxy] from conio_c64_init::@1 cscroll::@2
[49] gotoxy::y#3 = phi( conio_c64_init::@1/gotoxy::y#2, cscroll::@2/0 )
[50] if(gotoxy::y#3<$19+1) goto gotoxy::@3
to:gotoxy::@1
gotoxy::@3: scope:[gotoxy] from gotoxy
[51] phi()
to:gotoxy::@1
gotoxy::@1: scope:[gotoxy] from gotoxy gotoxy::@3
[52] gotoxy::y#4 = phi( gotoxy::@3/gotoxy::y#3, gotoxy/0 )
to:gotoxy::@2
gotoxy::@2: scope:[gotoxy] from gotoxy::@1
[53] conio_cursor_x = 0
[54] conio_cursor_y = gotoxy::y#4
[55] gotoxy::$7 = (unsigned int)gotoxy::y#4
[56] gotoxy::$8 = gotoxy::$7 << 2
[57] gotoxy::$9 = gotoxy::$8 + gotoxy::$7
[58] gotoxy::line_offset#0 = gotoxy::$9 << 3
[59] gotoxy::$5 = DEFAULT_SCREEN + gotoxy::line_offset#0
[60] conio_line_text = gotoxy::$5
[61] gotoxy::$6 = COLORRAM + gotoxy::line_offset#0
[62] conio_line_color = gotoxy::$6
to:gotoxy::@return
gotoxy::@return: scope:[gotoxy] from gotoxy::@2
[63] return
to:@return
void cputln()
cputln: scope:[cputln] from cputc::@1 cputc::@3
[64] conio_line_text = conio_line_text + $28
[65] conio_line_color = conio_line_color + $28
[66] conio_cursor_x = 0
[67] conio_cursor_y = ++ conio_cursor_y
[68] call cscroll
to:cputln::@return
cputln::@return: scope:[cputln] from cputln
[69] return
to:@return
void clrscr()
clrscr: scope:[clrscr] from main::@3
[70] phi()
to:clrscr::@1
clrscr::@1: scope:[clrscr] from clrscr clrscr::@5
[71] clrscr::line_cols#5 = phi( clrscr/COLORRAM, clrscr::@5/clrscr::line_cols#1 )
[71] clrscr::line_text#5 = phi( clrscr/DEFAULT_SCREEN, clrscr::@5/clrscr::line_text#1 )
[71] clrscr::l#2 = phi( clrscr/0, clrscr::@5/clrscr::l#1 )
[72] if(clrscr::l#2<$19) goto clrscr::@3
to:clrscr::@2
clrscr::@2: scope:[clrscr] from clrscr::@1
[73] conio_cursor_x = 0
[74] conio_cursor_y = 0
[75] conio_line_text = DEFAULT_SCREEN
[76] conio_line_color = COLORRAM
to:clrscr::@return
clrscr::@return: scope:[clrscr] from clrscr::@2
[77] return
to:@return
clrscr::@3: scope:[clrscr] from clrscr::@1 clrscr::@4
[78] clrscr::c#2 = phi( clrscr::@1/0, clrscr::@4/clrscr::c#1 )
[79] if(clrscr::c#2<$28) goto clrscr::@4
to:clrscr::@5
clrscr::@5: scope:[clrscr] from clrscr::@3
[80] clrscr::line_text#1 = clrscr::line_text#5 + $28
[81] clrscr::line_cols#1 = clrscr::line_cols#5 + $28
[82] clrscr::l#1 = ++ clrscr::l#2
to:clrscr::@1
clrscr::@4: scope:[clrscr] from clrscr::@3
[83] clrscr::line_text#5[clrscr::c#2] = ' '
[84] clrscr::line_cols#5[clrscr::c#2] = conio_textcolor
[85] clrscr::c#1 = ++ clrscr::c#2
to:clrscr::@3
char GETIN()
GETIN: scope:[GETIN] from main::@1
asm { jsr$ffe4 stach }
[87] GETIN::return#1 = *GETIN::ch
to:GETIN::@return
GETIN::@return: scope:[GETIN] from GETIN
[88] return
to:@return
char petscii_to_screencode(char petscii)
petscii_to_screencode: scope:[petscii_to_screencode] from main::@2
[89] if(petscii_to_screencode::petscii#0<$20) goto petscii_to_screencode::@1
to:petscii_to_screencode::@6
petscii_to_screencode::@6: scope:[petscii_to_screencode] from petscii_to_screencode
[90] if(petscii_to_screencode::petscii#0<$40) goto petscii_to_screencode::@return
to:petscii_to_screencode::@7
petscii_to_screencode::@7: scope:[petscii_to_screencode] from petscii_to_screencode::@6
[91] if(petscii_to_screencode::petscii#0<$60) goto petscii_to_screencode::@2
to:petscii_to_screencode::@8
petscii_to_screencode::@8: scope:[petscii_to_screencode] from petscii_to_screencode::@7
[92] if(petscii_to_screencode::petscii#0<$80) goto petscii_to_screencode::@3
to:petscii_to_screencode::@9
petscii_to_screencode::@9: scope:[petscii_to_screencode] from petscii_to_screencode::@8
[93] if(petscii_to_screencode::petscii#0<$a0) goto petscii_to_screencode::@4
to:petscii_to_screencode::@10
petscii_to_screencode::@10: scope:[petscii_to_screencode] from petscii_to_screencode::@9
[94] if(petscii_to_screencode::petscii#0<$ff) goto petscii_to_screencode::@5
to:petscii_to_screencode::@return
petscii_to_screencode::@5: scope:[petscii_to_screencode] from petscii_to_screencode::@10
[95] petscii_to_screencode::return#6 = petscii_to_screencode::petscii#0 - $80
to:petscii_to_screencode::@return
petscii_to_screencode::@return: scope:[petscii_to_screencode] from petscii_to_screencode::@1 petscii_to_screencode::@10 petscii_to_screencode::@2 petscii_to_screencode::@3 petscii_to_screencode::@4 petscii_to_screencode::@5 petscii_to_screencode::@6
[96] petscii_to_screencode::return#10 = phi( petscii_to_screencode::@1/petscii_to_screencode::return#1, petscii_to_screencode::@10/$5e, petscii_to_screencode::@6/petscii_to_screencode::petscii#0, petscii_to_screencode::@2/petscii_to_screencode::return#3, petscii_to_screencode::@3/petscii_to_screencode::return#4, petscii_to_screencode::@4/petscii_to_screencode::return#5, petscii_to_screencode::@5/petscii_to_screencode::return#6 )
[97] return
to:@return
petscii_to_screencode::@4: scope:[petscii_to_screencode] from petscii_to_screencode::@9
[98] petscii_to_screencode::return#5 = petscii_to_screencode::petscii#0 + $40
to:petscii_to_screencode::@return
petscii_to_screencode::@3: scope:[petscii_to_screencode] from petscii_to_screencode::@8
[99] petscii_to_screencode::return#4 = petscii_to_screencode::petscii#0 - $20
to:petscii_to_screencode::@return
petscii_to_screencode::@2: scope:[petscii_to_screencode] from petscii_to_screencode::@7
[100] petscii_to_screencode::return#3 = petscii_to_screencode::petscii#0 - $40
to:petscii_to_screencode::@return
petscii_to_screencode::@1: scope:[petscii_to_screencode] from petscii_to_screencode
[101] petscii_to_screencode::return#1 = petscii_to_screencode::petscii#0 + $80
to:petscii_to_screencode::@return
void printf_str(void (*putc)(char) , const char *s)
printf_str: scope:[printf_str] from main::@5 main::@6 main::@8 printf_number_buffer::@3
[102] printf_str::putc#6 = phi( main::@5/&cputc, main::@6/&cputc, main::@8/&cputc, printf_number_buffer::@3/printf_uchar::putc#0 )
[102] printf_str::s#6 = phi( main::@5/main::s, main::@6/main::s1, main::@8/main::s2, printf_number_buffer::@3/printf_number_buffer::buffer_digits#0 )
to:printf_str::@1
printf_str::@1: scope:[printf_str] from printf_str printf_str::@2
[103] printf_str::s#5 = phi( printf_str/printf_str::s#6, printf_str::@2/printf_str::s#0 )
[104] printf_str::c#1 = *printf_str::s#5
[105] printf_str::s#0 = ++ printf_str::s#5
[106] if(0!=printf_str::c#1) goto printf_str::@2
to:printf_str::@return
printf_str::@return: scope:[printf_str] from printf_str::@1
[107] return
to:@return
printf_str::@2: scope:[printf_str] from printf_str::@1
[108] stackpush(char) = printf_str::c#1
[109] callexecute *printf_str::putc#6
sideeffect stackpullbytes(1)
to:printf_str::@1
void printf_uchar(void (*putc)(char) , char uvalue , char format_min_length , char format_justify_left , char format_sign_always , char format_zero_padding , char format_upper_case , char format_radix)
printf_uchar: scope:[printf_uchar] from main::@7
[111] phi()
to:printf_uchar::@1
printf_uchar::@1: scope:[printf_uchar] from printf_uchar
[112] *((char *)&printf_buffer) = 0
[113] uctoa::value#1 = printf_uchar::uvalue#0
[114] call uctoa
to:printf_uchar::@2
printf_uchar::@2: scope:[printf_uchar] from printf_uchar::@1
[115] printf_number_buffer::buffer_sign#0 = *((char *)&printf_buffer)
[116] call printf_number_buffer
to:printf_uchar::@return
printf_uchar::@return: scope:[printf_uchar] from printf_uchar::@2
[117] return
to:@return
void cscroll()
cscroll: scope:[cscroll] from cputln
[118] if(conio_cursor_y!=$19) goto cscroll::@return
to:cscroll::@1
cscroll::@1: scope:[cscroll] from cscroll
[119] if(0!=conio_scroll_enable) goto cscroll::@3
to:cscroll::@2
cscroll::@2: scope:[cscroll] from cscroll::@1
[120] phi()
[121] call gotoxy
to:cscroll::@return
cscroll::@return: scope:[cscroll] from cscroll cscroll::@2 cscroll::@7
[122] return
to:@return
cscroll::@3: scope:[cscroll] from cscroll::@1
[123] phi()
[124] call memcpy
to:cscroll::@4
cscroll::@4: scope:[cscroll] from cscroll::@3
[125] phi()
[126] call memcpy
to:cscroll::@5
cscroll::@5: scope:[cscroll] from cscroll::@4
[127] phi()
[128] call memset
to:cscroll::@6
cscroll::@6: scope:[cscroll] from cscroll::@5
[129] memset::c#1 = conio_textcolor
[130] call memset
to:cscroll::@7
cscroll::@7: scope:[cscroll] from cscroll::@6
[131] conio_line_text = conio_line_text - $28
[132] conio_line_color = conio_line_color - $28
[133] conio_cursor_y = -- conio_cursor_y
to:cscroll::@return
void uctoa(char value , char *buffer , char radix)
uctoa: scope:[uctoa] from printf_uchar::@1
[134] phi()
to:uctoa::@1
uctoa::@1: scope:[uctoa] from uctoa uctoa::@4
[135] uctoa::buffer#11 = phi( uctoa::@4/uctoa::buffer#14, uctoa/(char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS )
[135] uctoa::started#2 = phi( uctoa::@4/uctoa::started#4, uctoa/0 )
[135] uctoa::value#2 = phi( uctoa::@4/uctoa::value#6, uctoa/uctoa::value#1 )
[135] uctoa::digit#2 = phi( uctoa::@4/uctoa::digit#1, uctoa/0 )
[136] if(uctoa::digit#2<uctoa::max_digits#2-1) goto uctoa::@2
to:uctoa::@3
uctoa::@3: scope:[uctoa] from uctoa::@1
[137] *uctoa::buffer#11 = DIGITS[uctoa::value#2]
[138] uctoa::buffer#3 = ++ uctoa::buffer#11
[139] *uctoa::buffer#3 = 0
to:uctoa::@return
uctoa::@return: scope:[uctoa] from uctoa::@3
[140] return
to:@return
uctoa::@2: scope:[uctoa] from uctoa::@1
[141] uctoa::digit_value#0 = RADIX_HEXADECIMAL_VALUES_CHAR[uctoa::digit#2]
[142] if(0!=uctoa::started#2) goto uctoa::@5
to:uctoa::@7
uctoa::@7: scope:[uctoa] from uctoa::@2
[143] if(uctoa::value#2>=uctoa::digit_value#0) goto uctoa::@5
to:uctoa::@4
uctoa::@4: scope:[uctoa] from uctoa::@6 uctoa::@7
[144] uctoa::buffer#14 = phi( uctoa::@7/uctoa::buffer#11, uctoa::@6/uctoa::buffer#4 )
[144] uctoa::started#4 = phi( uctoa::@7/uctoa::started#2, uctoa::@6/1 )
[144] uctoa::value#6 = phi( uctoa::@7/uctoa::value#2, uctoa::@6/uctoa::value#0 )
[145] uctoa::digit#1 = ++ uctoa::digit#2
to:uctoa::@1
uctoa::@5: scope:[uctoa] from uctoa::@2 uctoa::@7
[146] uctoa_append::buffer#0 = uctoa::buffer#11
[147] uctoa_append::value#0 = uctoa::value#2
[148] uctoa_append::sub#0 = uctoa::digit_value#0
[149] call uctoa_append
[150] uctoa_append::return#0 = uctoa_append::value#2
to:uctoa::@6
uctoa::@6: scope:[uctoa] from uctoa::@5
[151] uctoa::value#0 = uctoa_append::return#0
[152] uctoa::buffer#4 = ++ uctoa::buffer#11
to:uctoa::@4
void printf_number_buffer(void (*putc)(char) , char buffer_sign , char *buffer_digits , char format_min_length , char format_justify_left , char format_sign_always , char format_zero_padding , char format_upper_case , char format_radix)
printf_number_buffer: scope:[printf_number_buffer] from printf_uchar::@2
[153] phi()
to:printf_number_buffer::@4
printf_number_buffer::@4: scope:[printf_number_buffer] from printf_number_buffer
[154] phi()
[155] call strlen
[156] strlen::return#2 = strlen::len#2
to:printf_number_buffer::@9
printf_number_buffer::@9: scope:[printf_number_buffer] from printf_number_buffer::@4
[157] printf_number_buffer::$19 = strlen::return#2
[158] printf_number_buffer::len#0 = (signed char)printf_number_buffer::$19
[159] if(0==printf_number_buffer::buffer_sign#0) goto printf_number_buffer::@8
to:printf_number_buffer::@5
printf_number_buffer::@5: scope:[printf_number_buffer] from printf_number_buffer::@9
[160] printf_number_buffer::len#1 = ++ printf_number_buffer::len#0
to:printf_number_buffer::@8
printf_number_buffer::@8: scope:[printf_number_buffer] from printf_number_buffer::@5 printf_number_buffer::@9
[161] printf_number_buffer::len#2 = phi( printf_number_buffer::@9/printf_number_buffer::len#0, printf_number_buffer::@5/printf_number_buffer::len#1 )
[162] printf_number_buffer::padding#1 = (signed char)printf_uchar::format_min_length#0 - printf_number_buffer::len#2
[163] if(printf_number_buffer::padding#1>=0) goto printf_number_buffer::@11
to:printf_number_buffer::@1
printf_number_buffer::@11: scope:[printf_number_buffer] from printf_number_buffer::@8
[164] phi()
to:printf_number_buffer::@1
printf_number_buffer::@1: scope:[printf_number_buffer] from printf_number_buffer::@11 printf_number_buffer::@8
[165] printf_number_buffer::padding#10 = phi( printf_number_buffer::@11/printf_number_buffer::padding#1, printf_number_buffer::@8/0 )
to:printf_number_buffer::@10
printf_number_buffer::@10: scope:[printf_number_buffer] from printf_number_buffer::@1
[166] if(0!=printf_number_buffer::padding#10) goto printf_number_buffer::@6
to:printf_number_buffer::@2
printf_number_buffer::@6: scope:[printf_number_buffer] from printf_number_buffer::@10
[167] printf_padding::length#0 = (char)printf_number_buffer::padding#10
[168] call printf_padding
to:printf_number_buffer::@2
printf_number_buffer::@2: scope:[printf_number_buffer] from printf_number_buffer::@10 printf_number_buffer::@6
[169] if(0==printf_number_buffer::buffer_sign#0) goto printf_number_buffer::@3
to:printf_number_buffer::@7
printf_number_buffer::@7: scope:[printf_number_buffer] from printf_number_buffer::@2
[170] stackpush(char) = printf_number_buffer::buffer_sign#0
[171] callexecute cputc
sideeffect stackpullbytes(1)
to:printf_number_buffer::@3
printf_number_buffer::@3: scope:[printf_number_buffer] from printf_number_buffer::@2 printf_number_buffer::@7
[173] phi()
[174] call printf_str
to:printf_number_buffer::@return
printf_number_buffer::@return: scope:[printf_number_buffer] from printf_number_buffer::@3
[175] return
to:@return
void * memcpy(void *destination , void *source , unsigned int num)
memcpy: scope:[memcpy] from cscroll::@3 cscroll::@4
[176] memcpy::destination#2 = phi( cscroll::@3/(void *)DEFAULT_SCREEN, cscroll::@4/(void *)COLORRAM )
[176] memcpy::source#2 = phi( cscroll::@3/(void *)DEFAULT_SCREEN+$28, cscroll::@4/(void *)COLORRAM+$28 )
[177] memcpy::src_end#0 = (char *)memcpy::source#2 + (unsigned int)$19*$28-$28
[178] memcpy::src#4 = (char *)memcpy::source#2
[179] memcpy::dst#4 = (char *)memcpy::destination#2
to:memcpy::@1
memcpy::@1: scope:[memcpy] from memcpy memcpy::@2
[180] memcpy::dst#2 = phi( memcpy/memcpy::dst#4, memcpy::@2/memcpy::dst#1 )
[180] memcpy::src#2 = phi( memcpy/memcpy::src#4, memcpy::@2/memcpy::src#1 )
[181] if(memcpy::src#2!=memcpy::src_end#0) goto memcpy::@2
to:memcpy::@return
memcpy::@return: scope:[memcpy] from memcpy::@1
[182] return
to:@return
memcpy::@2: scope:[memcpy] from memcpy::@1
[183] *memcpy::dst#2 = *memcpy::src#2
[184] memcpy::dst#1 = ++ memcpy::dst#2
[185] memcpy::src#1 = ++ memcpy::src#2
to:memcpy::@1
void * memset(void *str , char c , unsigned int num)
memset: scope:[memset] from cscroll::@5 cscroll::@6
[186] memset::c#4 = phi( cscroll::@5/' ', cscroll::@6/memset::c#1 )
[186] memset::str#3 = phi( cscroll::@5/(void *)DEFAULT_SCREEN+(unsigned int)$19*$28-$28, cscroll::@6/(void *)COLORRAM+(unsigned int)$19*$28-$28 )
to:memset::@1
memset::@1: scope:[memset] from memset
[187] memset::end#0 = (char *)memset::str#3 + $28
[188] memset::dst#4 = (char *)memset::str#3
to:memset::@2
memset::@2: scope:[memset] from memset::@1 memset::@3
[189] memset::dst#2 = phi( memset::@1/memset::dst#4, memset::@3/memset::dst#1 )
[190] if(memset::dst#2!=memset::end#0) goto memset::@3
to:memset::@return
memset::@return: scope:[memset] from memset::@2
[191] return
to:@return
memset::@3: scope:[memset] from memset::@2
[192] *memset::dst#2 = memset::c#4
[193] memset::dst#1 = ++ memset::dst#2
to:memset::@2
char uctoa_append(char *buffer , char value , char sub)
uctoa_append: scope:[uctoa_append] from uctoa::@5
[194] phi()
to:uctoa_append::@1
uctoa_append::@1: scope:[uctoa_append] from uctoa_append uctoa_append::@2
[195] uctoa_append::digit#2 = phi( uctoa_append/0, uctoa_append::@2/uctoa_append::digit#1 )
[195] uctoa_append::value#2 = phi( uctoa_append/uctoa_append::value#0, uctoa_append::@2/uctoa_append::value#1 )
[196] if(uctoa_append::value#2>=uctoa_append::sub#0) goto uctoa_append::@2
to:uctoa_append::@3
uctoa_append::@3: scope:[uctoa_append] from uctoa_append::@1
[197] *uctoa_append::buffer#0 = DIGITS[uctoa_append::digit#2]
to:uctoa_append::@return
uctoa_append::@return: scope:[uctoa_append] from uctoa_append::@3
[198] return
to:@return
uctoa_append::@2: scope:[uctoa_append] from uctoa_append::@1
[199] uctoa_append::digit#1 = ++ uctoa_append::digit#2
[200] uctoa_append::value#1 = uctoa_append::value#2 - uctoa_append::sub#0
to:uctoa_append::@1
unsigned int strlen(char *str)
strlen: scope:[strlen] from printf_number_buffer::@4
[201] phi()
to:strlen::@1
strlen::@1: scope:[strlen] from strlen strlen::@2
[202] strlen::len#2 = phi( strlen/0, strlen::@2/strlen::len#1 )
[202] strlen::str#2 = phi( strlen/printf_number_buffer::buffer_digits#0, strlen::@2/strlen::str#0 )
[203] if(0!=*strlen::str#2) goto strlen::@2
to:strlen::@return
strlen::@return: scope:[strlen] from strlen::@1
[204] return
to:@return
strlen::@2: scope:[strlen] from strlen::@1
[205] strlen::len#1 = ++ strlen::len#2
[206] strlen::str#0 = ++ strlen::str#2
to:strlen::@1
void printf_padding(void (*putc)(char) , char pad , char length)
printf_padding: scope:[printf_padding] from printf_number_buffer::@6
[207] phi()
to:printf_padding::@1
printf_padding::@1: scope:[printf_padding] from printf_padding printf_padding::@3
[208] printf_padding::i#2 = phi( printf_padding/0, printf_padding::@3/printf_padding::i#1 )
[209] if(printf_padding::i#2<printf_padding::length#0) goto printf_padding::@2
to:printf_padding::@return
printf_padding::@return: scope:[printf_padding] from printf_padding::@1
[210] return
to:@return
printf_padding::@2: scope:[printf_padding] from printf_padding::@1
[211] stackpush(char) = printf_padding::pad#0
[212] callexecute cputc
sideeffect stackpullbytes(1)
to:printf_padding::@3
printf_padding::@3: scope:[printf_padding] from printf_padding::@2
[214] printf_padding::i#1 = ++ printf_padding::i#2
to:printf_padding::@1

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,266 @@
__constant char * const COLORRAM = (char *) 55296
__constant char * const DEFAULT_FONT_MIXED = (char *) 6144
__constant char * const DEFAULT_SCREEN = (char *) 1024
__constant char DIGITS[] = "0123456789abcdef"z
char GETIN()
__constant char * const GETIN::ch = (char *) 255
char GETIN::return
char GETIN::return#0 // reg byte a 20002.0
char GETIN::return#1 // reg byte a 36667.33333333333
__constant const char LIGHT_BLUE = $e
__constant char OFFSET_STRUCT_MOS6569_VICII_MEMORY = $18
__constant char OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS = 1
__constant char RADIX::BINARY = 2
__constant char RADIX::DECIMAL = $a
__constant char RADIX::HEXADECIMAL = $10
__constant char RADIX::OCTAL = 8
__constant char RADIX_HEXADECIMAL_VALUES_CHAR[] = { $10 }
__constant char SIZEOF_STRUCT_PRINTF_BUFFER_NUMBER = $c
__constant unsigned int STACK_BASE = $103
__constant struct MOS6569_VICII * const VICII = (struct MOS6569_VICII *) 53248
void __start()
void clrscr()
char clrscr::c
char clrscr::c#1 // reg byte y 20002.0
char clrscr::c#2 // reg byte y 12501.25
char clrscr::l
char clrscr::l#1 // reg byte x 2002.0
char clrscr::l#2 // reg byte x 333.6666666666667
char *clrscr::line_cols
char *clrscr::line_cols#1 // line_cols zp[2]:18 1001.0
char *clrscr::line_cols#5 // line_cols zp[2]:18 1500.375
char *clrscr::line_text
char *clrscr::line_text#1 // line_text zp[2]:16 667.3333333333334
char *clrscr::line_text#5 // line_text zp[2]:16 1714.7142857142858
void conio_c64_init()
__constant char * const conio_c64_init::BASIC_CURSOR_LINE = (char *) 214
char conio_c64_init::line
char conio_c64_init::line#0 // reg byte x 11.0
char conio_c64_init::line#2 // reg byte x 22.0
__loadstore char conio_cursor_x = 0 // mem[1] 9.854368942524271E8
__loadstore char conio_cursor_y = 0 // mem[1] 1.2571428581619048E9
__loadstore char *conio_line_color // zp[2]:12 1.2852631590421052E9
__loadstore char *conio_line_text // zp[2]:14 1.245918368459184E9
__loadstore char conio_scroll_enable = 1 // mem[1] 1.0000000001E8
__loadstore char conio_textcolor = LIGHT_BLUE // mem[1] 8.706905175E7
__stackcall void cputc(char c)
__constant char cputc::OFFSET_STACK_C = 0
char cputc::c
char cputc::c#0 // reg byte a 1.500000015E8
void cputln()
void cscroll()
void gotoxy(char x , char y)
char *gotoxy::$5 // zp[2]:8 2.00000000002E11
char *gotoxy::$6 // zp[2]:10 2.00000000002E11
unsigned int gotoxy::$7 // mem[2] 1.500000000015E11
unsigned int gotoxy::$8 // mem[2] 2.00000000002E11
unsigned int gotoxy::$9 // mem[2] 2.00000000002E11
unsigned int gotoxy::line_offset
unsigned int gotoxy::line_offset#0 // line_offset mem[2] 1.00000000001E11
char gotoxy::x
char gotoxy::y
char gotoxy::y#2 // reg byte x 22.0
char gotoxy::y#3 // reg byte x 6.6666666671E10
char gotoxy::y#4 // reg byte x 6.6666666667333336E10
int main()
char main::$6 // mem[1] 101.0
char main::ch
char main::ch#0 // ch mem[1] 1331.625
char main::current
char main::current#2 // current mem[1] 4220.8
char main::current#4 // current mem[1] 202.0
int main::return
__constant char main::s[2] = "'"
__constant char main::s1[4] = "'($"
__constant char main::s2[3] = ") "
char *main::toD0181_gfx
char main::toD0181_return
__constant char main::toD0181_return#0 = byte1 (unsigned int)DEFAULT_SCREEN&$3fff*4|byte1 (unsigned int)DEFAULT_FONT_MIXED/4&$f // toD0181_return
char *main::toD0181_screen
void * memcpy(void *destination , void *source , unsigned int num)
void *memcpy::destination
void *memcpy::destination#2 // destination zp[2]:4
char *memcpy::dst
char *memcpy::dst#1 // dst zp[2]:4 1.0000000000001E13
char *memcpy::dst#2 // dst zp[2]:4 1.0033333333334666E13
char *memcpy::dst#4 // dst zp[2]:4 2.00000000002E11
unsigned int memcpy::num
void *memcpy::return
void *memcpy::source
void *memcpy::source#2 // source zp[2]:2
char *memcpy::src
char *memcpy::src#1 // src zp[2]:2 2.0000000000002E13
char *memcpy::src#2 // src zp[2]:2 1.002500000000125E13
char *memcpy::src#4 // src zp[2]:2 1.00000000001E11
char *memcpy::src_end
char *memcpy::src_end#0 // src_end zp[2]:6 1.26250000000025E12
void * memset(void *str , char c , unsigned int num)
char memset::c
char memset::c#1 // reg byte x 2.0000000002E10
char memset::c#4 // reg byte x 1.430000000000286E12
char *memset::dst
char *memset::dst#1 // dst zp[2]:2 2.0000000000002E13
char *memset::dst#2 // dst zp[2]:2 1.3366666666668332E13
char *memset::dst#4 // dst zp[2]:2 2.00000000002E11
char *memset::end
char *memset::end#0 // end zp[2]:4 1.6833333333336665E12
unsigned int memset::num
void *memset::return
void *memset::str
void *memset::str#3 // str zp[2]:2
char petscii_to_screencode(char petscii)
char petscii_to_screencode::petscii
char petscii_to_screencode::petscii#0 // reg byte a 1730.4285714285716
char petscii_to_screencode::return
char petscii_to_screencode::return#0 // reg byte a 202.0
char petscii_to_screencode::return#1 // reg byte a 2002.0
char petscii_to_screencode::return#10 // reg byte a 2035.666666666667
char petscii_to_screencode::return#3 // reg byte a 2002.0
char petscii_to_screencode::return#4 // reg byte a 2002.0
char petscii_to_screencode::return#5 // reg byte a 2002.0
char petscii_to_screencode::return#6 // reg byte a 2002.0
__loadstore struct printf_buffer_number printf_buffer = {} // mem[12]
void printf_number_buffer(void (*putc)(char) , char buffer_sign , char *buffer_digits , char format_min_length , char format_justify_left , char format_sign_always , char format_zero_padding , char format_upper_case , char format_radix)
unsigned int printf_number_buffer::$19 // mem[2] 10001.0
struct printf_buffer_number printf_number_buffer::buffer
char *printf_number_buffer::buffer_digits
__constant char *printf_number_buffer::buffer_digits#0 = (char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS // buffer_digits
char printf_number_buffer::buffer_sign
char printf_number_buffer::buffer_sign#0 // buffer_sign mem[1] 1722.4444444444443
struct printf_format_number printf_number_buffer::format
char printf_number_buffer::format_justify_left
char printf_number_buffer::format_min_length
char printf_number_buffer::format_radix
char printf_number_buffer::format_sign_always
char printf_number_buffer::format_upper_case
char printf_number_buffer::format_zero_padding
signed char printf_number_buffer::len
signed char printf_number_buffer::len#0 // reg byte x 15001.5
signed char printf_number_buffer::len#1 // reg byte x 20002.0
signed char printf_number_buffer::len#2 // reg byte x 30003.0
signed char printf_number_buffer::padding
signed char printf_number_buffer::padding#1 // reg byte a 10001.0
signed char printf_number_buffer::padding#10 // reg byte a 10001.0
void (*printf_number_buffer::putc)(char)
void printf_padding(void (*putc)(char) , char pad , char length)
char printf_padding::i
char printf_padding::i#1 // i mem[1] 2.0000002E7
char printf_padding::i#2 // i mem[1] 6000000.6
char printf_padding::length
char printf_padding::length#0 // length mem[1] 1251250.25
char printf_padding::pad
__constant char printf_padding::pad#0 = ' ' // pad
void (*printf_padding::putc)(char)
void printf_str(void (*putc)(char) , const char *s)
char printf_str::c
char printf_str::c#1 // reg byte a 1.0000001E7
void (*printf_str::putc)(char)
void (*printf_str::putc#6)(char) // putc zp[2]:16
const char *printf_str::s
const char *printf_str::s#0 // s zp[2]:18 1.0000001E7
const char *printf_str::s#5 // s zp[2]:18 1.5050002E7
const char *printf_str::s#6 // s zp[2]:18 100001.0
void printf_uchar(void (*putc)(char) , char uvalue , char format_min_length , char format_justify_left , char format_sign_always , char format_zero_padding , char format_upper_case , char format_radix)
struct printf_format_number printf_uchar::format
char printf_uchar::format_justify_left
char printf_uchar::format_min_length
__constant char printf_uchar::format_min_length#0 = 2 // format_min_length
char printf_uchar::format_radix
char printf_uchar::format_sign_always
char printf_uchar::format_upper_case
char printf_uchar::format_zero_padding
void (*printf_uchar::putc)(char)
__constant void (*printf_uchar::putc#0)(char) = &cputc // putc
char printf_uchar::uvalue
char printf_uchar::uvalue#0 // reg byte x 367.33333333333337
unsigned int strlen(char *str)
unsigned int strlen::len
unsigned int strlen::len#1 // len mem[2] 1.0000001E7
unsigned int strlen::len#2 // len mem[2] 5002500.75
unsigned int strlen::return
unsigned int strlen::return#2 // return mem[2] 20002.0
char *strlen::str
char *strlen::str#0 // str zp[2]:16 2.0000002E7
char *strlen::str#2 // str zp[2]:16 1.0000001E7
void uctoa(char value , char *buffer , char radix)
char *uctoa::buffer
char *uctoa::buffer#11 // buffer zp[2]:16 335000.50000000006
char *uctoa::buffer#14 // buffer zp[2]:16 1500001.5
char *uctoa::buffer#3 // buffer zp[2]:16 20002.0
char *uctoa::buffer#4 // buffer zp[2]:16 2000002.0
char uctoa::digit
char uctoa::digit#1 // digit mem[1] 2000002.0
char uctoa::digit#2 // digit mem[1] 307692.6153846154
char uctoa::digit_value
char uctoa::digit_value#0 // digit_value mem[1] 600000.6000000001
char *uctoa::digit_values
char uctoa::max_digits
__constant char uctoa::max_digits#2 = 2 // max_digits
char uctoa::radix
char uctoa::started
char uctoa::started#2 // started mem[1] 600000.6000000001
char uctoa::started#4 // started mem[1] 1000001.0
char uctoa::value
char uctoa::value#0 // reg byte x 1000001.0
char uctoa::value#1 // reg byte x 5501.0
char uctoa::value#2 // reg byte x 670001.0000000001
char uctoa::value#6 // reg byte x 1500001.5
char uctoa_append(char *buffer , char value , char sub)
char *uctoa_append::buffer
char *uctoa_append::buffer#0 // buffer zp[2]:16 1375000.25
char uctoa_append::digit
char uctoa_append::digit#1 // reg byte y 1.0000000001E10
char uctoa_append::digit#2 // reg byte y 1.00050000015E10
char uctoa_append::return
char uctoa_append::return#0 // reg byte x 2000002.0
char uctoa_append::sub
char uctoa_append::sub#0 // sub mem[1] 3.3335000005E9
char uctoa_append::value
char uctoa_append::value#0 // reg byte x 3666667.333333333
char uctoa_append::value#1 // reg byte x 2.0000000002E10
char uctoa_append::value#2 // reg byte x 5.001833334166666E9
reg byte x [ conio_c64_init::line#2 conio_c64_init::line#0 ]
mem[1] [ main::current#2 main::current#4 ]
reg byte x [ gotoxy::y#4 gotoxy::y#3 gotoxy::y#2 ]
reg byte x [ clrscr::l#2 clrscr::l#1 ]
reg byte y [ clrscr::c#2 clrscr::c#1 ]
reg byte a [ petscii_to_screencode::return#10 petscii_to_screencode::return#1 petscii_to_screencode::petscii#0 petscii_to_screencode::return#3 petscii_to_screencode::return#4 petscii_to_screencode::return#5 petscii_to_screencode::return#6 ]
zp[2]:18 [ printf_str::s#5 printf_str::s#6 printf_str::s#0 clrscr::line_cols#5 clrscr::line_cols#1 ]
mem[1] [ uctoa::digit#2 uctoa::digit#1 ]
reg byte x [ uctoa::value#2 uctoa::value#6 uctoa::value#1 uctoa::value#0 ]
mem[1] [ uctoa::started#2 uctoa::started#4 ]
reg byte x [ printf_number_buffer::len#2 printf_number_buffer::len#0 printf_number_buffer::len#1 ]
reg byte a [ printf_number_buffer::padding#10 printf_number_buffer::padding#1 ]
zp[2]:2 [ memset::str#3 memset::dst#2 memset::dst#4 memset::dst#1 memcpy::source#2 memcpy::src#2 memcpy::src#4 memcpy::src#1 ]
reg byte x [ memset::c#4 memset::c#1 ]
reg byte x [ uctoa_append::value#2 uctoa_append::value#0 uctoa_append::value#1 ]
reg byte y [ uctoa_append::digit#2 uctoa_append::digit#1 ]
zp[2]:16 [ strlen::str#2 strlen::str#0 uctoa::buffer#11 uctoa::buffer#14 uctoa::buffer#4 uctoa::buffer#3 uctoa_append::buffer#0 printf_str::putc#6 clrscr::line_text#5 clrscr::line_text#1 ]
mem[2] [ strlen::len#2 strlen::len#1 strlen::return#2 printf_number_buffer::$19 ]
mem[1] [ printf_padding::i#2 printf_padding::i#1 ]
zp[2]:14 [ conio_line_text ]
zp[2]:12 [ conio_line_color ]
reg byte a [ cputc::c#0 ]
mem[1] [ conio_cursor_x ]
reg byte a [ GETIN::return#0 ]
mem[1] [ main::ch#0 ]
reg byte a [ petscii_to_screencode::return#0 ]
mem[1] [ main::$6 ]
reg byte x [ printf_uchar::uvalue#0 ]
mem[1] [ conio_cursor_y ]
mem[2] [ gotoxy::$7 gotoxy::$9 gotoxy::line_offset#0 ]
mem[2] [ gotoxy::$8 ]
zp[2]:8 [ gotoxy::$5 ]
zp[2]:10 [ gotoxy::$6 ]
reg byte a [ GETIN::return#1 ]
reg byte a [ printf_str::c#1 ]
mem[1] [ printf_number_buffer::buffer_sign#0 ]
mem[1] [ uctoa::digit_value#0 uctoa_append::sub#0 ]
reg byte x [ uctoa_append::return#0 ]
mem[1] [ printf_padding::length#0 ]
zp[2]:6 [ memcpy::src_end#0 ]
zp[2]:4 [ memset::end#0 memcpy::destination#2 memcpy::dst#2 memcpy::dst#4 memcpy::dst#1 ]
mem[1] [ conio_textcolor ]
mem[1] [ conio_scroll_enable ]
mem[12] [ printf_buffer ]