diff --git a/src/test/java/dk/camelot64/kickc/test/TestProgramsFast.java b/src/test/java/dk/camelot64/kickc/test/TestProgramsFast.java index ed5d659c2..80a280908 100644 --- a/src/test/java/dk/camelot64/kickc/test/TestProgramsFast.java +++ b/src/test/java/dk/camelot64/kickc/test/TestProgramsFast.java @@ -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"); diff --git a/src/test/kc/cbm-keyboard.c b/src/test/kc/cbm-keyboard.c new file mode 100644 index 000000000..fd720a28c --- /dev/null +++ b/src/test/kc/cbm-keyboard.c @@ -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 +#include +#include + +// 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; +} \ No newline at end of file diff --git a/src/test/ref/cbm-keyboard.asm b/src/test/ref/cbm-keyboard.asm new file mode 100644 index 000000000..40af46b70 --- /dev/null +++ b/src/test/ref/cbm-keyboard.asm @@ -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+1 + // __ma char *conio_line_color = CONIO_SCREEN_COLORS + 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+1 + 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+1 + 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+1 + 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+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+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+1 + lda #DEFAULT_SCREEN + sta.z line_text+1 + ldx #0 + __b1: + // for( char l=0;lDEFAULT_SCREEN + sta.z conio_line_text+1 + // conio_line_color = CONIO_SCREEN_COLORS + lda #COLORRAM + sta.z conio_line_color+1 + // } + rts + __b2: + ldy #0 + __b3: + // for( char c=0;cDEFAULT_SCREEN + sta.z memcpy.destination+1 + 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+1 + 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+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+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+1 + lda #0 + sta started + sta digit + __b1: + // for( char digit=0; digit= digit_value) + lda started + bne __b5 + cpx digit_value + bcs __b5 + __b4: + // for( char digit=0; digitprintf_uchar.putc + sta.z printf_str.putc+1 + 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+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=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 0 + memset::$1 = ! memset::$0 + if(memset::$1) goto memset::@1 + to:memset::@2 +memset::@1: scope:[memset] from memset memset::@3 + memset::str#2 = phi( memset/memset::str#4, memset::@3/memset::str#5 ) + memset::return#0 = memset::str#2 + to:memset::@return +memset::@2: scope:[memset] from memset + memset::c#4 = phi( memset/memset::c#5 ) + memset::num#3 = phi( memset/memset::num#2 ) + memset::str#3 = phi( memset/memset::str#4 ) + memset::$4 = (char *)memset::str#3 + memset::end#0 = memset::$4 + memset::num#3 + memset::dst#0 = ((char *)) memset::str#3 + to:memset::@3 +memset::@3: scope:[memset] from memset::@2 memset::@4 + memset::c#3 = phi( memset::@2/memset::c#4, memset::@4/memset::c#2 ) + memset::str#5 = phi( memset::@2/memset::str#3, memset::@4/memset::str#6 ) + memset::end#1 = phi( memset::@2/memset::end#0, memset::@4/memset::end#2 ) + memset::dst#2 = phi( memset::@2/memset::dst#0, memset::@4/memset::dst#1 ) + memset::$3 = memset::dst#2 != memset::end#1 + if(memset::$3) goto memset::@4 + to:memset::@1 +memset::@4: scope:[memset] from memset::@3 + memset::str#6 = phi( memset::@3/memset::str#5 ) + memset::end#2 = phi( memset::@3/memset::end#1 ) + memset::dst#3 = phi( memset::@3/memset::dst#2 ) + memset::c#2 = phi( memset::@3/memset::c#3 ) + *memset::dst#3 = memset::c#2 + memset::dst#1 = ++ memset::dst#3 + to:memset::@3 +memset::@return: scope:[memset] from memset::@1 + memset::return#4 = phi( memset::@1/memset::return#0 ) + memset::return#1 = memset::return#4 + return + to:@return + +unsigned int strlen(char *str) +strlen: scope:[strlen] from printf_number_buffer::@6 + strlen::str#4 = phi( printf_number_buffer::@6/strlen::str#1 ) + strlen::len#0 = 0 + to:strlen::@1 +strlen::@1: scope:[strlen] from strlen strlen::@2 + strlen::len#4 = phi( strlen/strlen::len#0, strlen::@2/strlen::len#1 ) + strlen::str#2 = phi( strlen/strlen::str#4, strlen::@2/strlen::str#0 ) + strlen::$0 = 0 != *strlen::str#2 + if(strlen::$0) goto strlen::@2 + to:strlen::@3 +strlen::@2: scope:[strlen] from strlen::@1 + strlen::str#3 = phi( strlen::@1/strlen::str#2 ) + strlen::len#2 = phi( strlen::@1/strlen::len#4 ) + strlen::len#1 = ++ strlen::len#2 + strlen::str#0 = ++ strlen::str#3 + to:strlen::@1 +strlen::@3: scope:[strlen] from strlen::@1 + strlen::len#3 = phi( strlen::@1/strlen::len#4 ) + strlen::return#0 = strlen::len#3 + to:strlen::@return +strlen::@return: scope:[strlen] from strlen::@3 + strlen::return#3 = phi( strlen::@3/strlen::return#0 ) + strlen::return#1 = strlen::return#3 + return + to:@return + +char toupper(char ch) +toupper: scope:[toupper] from strupr::@2 + toupper::ch#1 = phi( strupr::@2/toupper::ch#0 ) + toupper::$0 = toupper::ch#1 >= 'a' + toupper::$1 = toupper::ch#1 <= 'z' + toupper::$2 = toupper::$0 && toupper::$1 + if(toupper::$2) goto toupper::@1 + to:toupper::@2 +toupper::@1: scope:[toupper] from toupper + toupper::ch#2 = phi( toupper/toupper::ch#1 ) + toupper::$3 = toupper::ch#2 + 'A'-'a' + toupper::return#0 = toupper::$3 + to:toupper::@return +toupper::@2: scope:[toupper] from toupper + toupper::ch#3 = phi( toupper/toupper::ch#1 ) + toupper::return#1 = toupper::ch#3 + to:toupper::@return +toupper::@return: scope:[toupper] from toupper::@1 toupper::@2 + toupper::return#4 = phi( toupper::@1/toupper::return#0, toupper::@2/toupper::return#1 ) + toupper::return#2 = toupper::return#4 + return + to:@return + +char * strupr(char *str) +strupr: scope:[strupr] from printf_number_buffer::@11 + strupr::str#1 = phi( printf_number_buffer::@11/strupr::str#0 ) + strupr::src#0 = strupr::str#1 + to:strupr::@1 +strupr::@1: scope:[strupr] from strupr strupr::@4 + strupr::str#3 = phi( strupr/strupr::str#1, strupr::@4/strupr::str#4 ) + strupr::src#2 = phi( strupr/strupr::src#0, strupr::@4/strupr::src#1 ) + strupr::$1 = 0 != *strupr::src#2 + if(strupr::$1) goto strupr::@2 + to:strupr::@3 +strupr::@2: scope:[strupr] from strupr::@1 + strupr::str#5 = phi( strupr::@1/strupr::str#3 ) + strupr::src#3 = phi( strupr::@1/strupr::src#2 ) + toupper::ch#0 = *strupr::src#3 + call toupper + toupper::return#3 = toupper::return#2 + to:strupr::@4 +strupr::@4: scope:[strupr] from strupr::@2 + strupr::str#4 = phi( strupr::@2/strupr::str#5 ) + strupr::src#4 = phi( strupr::@2/strupr::src#3 ) + toupper::return#5 = phi( strupr::@2/toupper::return#3 ) + strupr::$0 = toupper::return#5 + *strupr::src#4 = strupr::$0 + strupr::src#1 = ++ strupr::src#4 + to:strupr::@1 +strupr::@3: scope:[strupr] from strupr::@1 + strupr::str#2 = phi( strupr::@1/strupr::str#3 ) + strupr::return#0 = strupr::str#2 + to:strupr::@return +strupr::@return: scope:[strupr] from strupr::@3 + strupr::return#3 = phi( strupr::@3/strupr::return#0 ) + strupr::return#1 = strupr::return#3 + return + to:@return + +void uctoa(char value , char *buffer , char radix) +uctoa: scope:[uctoa] from printf_uchar::@3 + uctoa::buffer#21 = phi( printf_uchar::@3/uctoa::buffer#5 ) + uctoa::value#12 = phi( printf_uchar::@3/uctoa::value#1 ) + uctoa::radix#1 = phi( printf_uchar::@3/uctoa::radix#0 ) + uctoa::max_digits#0 = 0 + uctoa::digit_values#0 = (char *) 0 + uctoa::$0 = uctoa::radix#1 == DECIMAL + if(uctoa::$0) goto uctoa::@1 + to:uctoa::@6 +uctoa::@1: scope:[uctoa] from uctoa + uctoa::buffer#17 = phi( uctoa/uctoa::buffer#21 ) + uctoa::value#8 = phi( uctoa/uctoa::value#12 ) + uctoa::max_digits#1 = 3 + uctoa::digit_values#1 = RADIX_DECIMAL_VALUES_CHAR + to:uctoa::@5 +uctoa::@6: scope:[uctoa] from uctoa + uctoa::value#13 = phi( uctoa/uctoa::value#12 ) + uctoa::buffer#16 = phi( uctoa/uctoa::buffer#21 ) + uctoa::radix#2 = phi( uctoa/uctoa::radix#1 ) + uctoa::$1 = uctoa::radix#2 == HEXADECIMAL + if(uctoa::$1) goto uctoa::@2 + to:uctoa::@7 +uctoa::@2: scope:[uctoa] from uctoa::@6 + uctoa::buffer#18 = phi( uctoa::@6/uctoa::buffer#16 ) + uctoa::value#9 = phi( uctoa::@6/uctoa::value#13 ) + uctoa::max_digits#2 = 2 + uctoa::digit_values#2 = RADIX_HEXADECIMAL_VALUES_CHAR + to:uctoa::@5 +uctoa::@7: scope:[uctoa] from uctoa::@6 + uctoa::value#14 = phi( uctoa::@6/uctoa::value#13 ) + uctoa::buffer#13 = phi( uctoa::@6/uctoa::buffer#16 ) + uctoa::radix#3 = phi( uctoa::@6/uctoa::radix#2 ) + uctoa::$2 = uctoa::radix#3 == OCTAL + if(uctoa::$2) goto uctoa::@3 + to:uctoa::@8 +uctoa::@3: scope:[uctoa] from uctoa::@7 + uctoa::buffer#19 = phi( uctoa::@7/uctoa::buffer#13 ) + uctoa::value#10 = phi( uctoa::@7/uctoa::value#14 ) + uctoa::max_digits#3 = 3 + uctoa::digit_values#3 = RADIX_OCTAL_VALUES_CHAR + to:uctoa::@5 +uctoa::@8: scope:[uctoa] from uctoa::@7 + uctoa::value#15 = phi( uctoa::@7/uctoa::value#14 ) + uctoa::buffer#10 = phi( uctoa::@7/uctoa::buffer#13 ) + uctoa::radix#4 = phi( uctoa::@7/uctoa::radix#3 ) + uctoa::$3 = uctoa::radix#4 == BINARY + if(uctoa::$3) goto uctoa::@4 + to:uctoa::@9 +uctoa::@4: scope:[uctoa] from uctoa::@8 + uctoa::buffer#20 = phi( uctoa::@8/uctoa::buffer#10 ) + uctoa::value#11 = phi( uctoa::@8/uctoa::value#15 ) + uctoa::max_digits#4 = 8 + uctoa::digit_values#4 = RADIX_BINARY_VALUES_CHAR + to:uctoa::@5 +uctoa::@9: scope:[uctoa] from uctoa::@8 + uctoa::buffer#6 = phi( uctoa::@8/uctoa::buffer#10 ) + *uctoa::buffer#6 = 'e' + uctoa::buffer#0 = ++ uctoa::buffer#6 + *uctoa::buffer#0 = 'r' + uctoa::buffer#1 = ++ uctoa::buffer#0 + *uctoa::buffer#1 = 'r' + uctoa::buffer#2 = ++ uctoa::buffer#1 + *uctoa::buffer#2 = 0 + to:uctoa::@return +uctoa::@return: scope:[uctoa] from uctoa::@12 uctoa::@9 + return + to:@return +uctoa::@5: scope:[uctoa] from uctoa::@1 uctoa::@2 uctoa::@3 uctoa::@4 + uctoa::buffer#15 = phi( uctoa::@1/uctoa::buffer#17, uctoa::@2/uctoa::buffer#18, uctoa::@3/uctoa::buffer#19, uctoa::@4/uctoa::buffer#20 ) + uctoa::value#7 = phi( uctoa::@1/uctoa::value#8, uctoa::@2/uctoa::value#9, uctoa::@3/uctoa::value#10, uctoa::@4/uctoa::value#11 ) + uctoa::digit_values#8 = phi( uctoa::@1/uctoa::digit_values#1, uctoa::@2/uctoa::digit_values#2, uctoa::@3/uctoa::digit_values#3, uctoa::@4/uctoa::digit_values#4 ) + uctoa::max_digits#7 = phi( uctoa::@1/uctoa::max_digits#1, uctoa::@2/uctoa::max_digits#2, uctoa::@3/uctoa::max_digits#3, uctoa::@4/uctoa::max_digits#4 ) + uctoa::started#0 = 0 + uctoa::digit#0 = 0 + to:uctoa::@10 +uctoa::@10: scope:[uctoa] from uctoa::@13 uctoa::@5 + uctoa::buffer#11 = phi( uctoa::@13/uctoa::buffer#14, uctoa::@5/uctoa::buffer#15 ) + uctoa::started#3 = phi( uctoa::@13/uctoa::started#4, uctoa::@5/uctoa::started#0 ) + uctoa::value#5 = phi( uctoa::@13/uctoa::value#6, uctoa::@5/uctoa::value#7 ) + uctoa::digit_values#6 = phi( uctoa::@13/uctoa::digit_values#7, uctoa::@5/uctoa::digit_values#8 ) + uctoa::digit#2 = phi( uctoa::@13/uctoa::digit#1, uctoa::@5/uctoa::digit#0 ) + uctoa::max_digits#5 = phi( uctoa::@13/uctoa::max_digits#6, uctoa::@5/uctoa::max_digits#7 ) + uctoa::$4 = uctoa::max_digits#5 - 1 + uctoa::$5 = uctoa::digit#2 < uctoa::$4 + if(uctoa::$5) goto uctoa::@11 + to:uctoa::@12 +uctoa::@11: scope:[uctoa] from uctoa::@10 + uctoa::max_digits#8 = phi( uctoa::@10/uctoa::max_digits#5 ) + uctoa::buffer#12 = phi( uctoa::@10/uctoa::buffer#11 ) + uctoa::started#2 = phi( uctoa::@10/uctoa::started#3 ) + uctoa::value#2 = phi( uctoa::@10/uctoa::value#5 ) + uctoa::digit#3 = phi( uctoa::@10/uctoa::digit#2 ) + uctoa::digit_values#5 = phi( uctoa::@10/uctoa::digit_values#6 ) + uctoa::digit_value#0 = uctoa::digit_values#5[uctoa::digit#3] + uctoa::$6 = uctoa::value#2 >= uctoa::digit_value#0 + uctoa::$7 = uctoa::started#2 || uctoa::$6 + uctoa::$8 = ! uctoa::$7 + if(uctoa::$8) goto uctoa::@13 + to:uctoa::@14 +uctoa::@12: scope:[uctoa] from uctoa::@10 + uctoa::buffer#7 = phi( uctoa::@10/uctoa::buffer#11 ) + uctoa::value#3 = phi( uctoa::@10/uctoa::value#5 ) + uctoa::$10 = (char)uctoa::value#3 + *uctoa::buffer#7 = DIGITS[uctoa::$10] + uctoa::buffer#3 = ++ uctoa::buffer#7 + *uctoa::buffer#3 = 0 + to:uctoa::@return +uctoa::@13: scope:[uctoa] from uctoa::@11 uctoa::@15 + uctoa::buffer#14 = phi( uctoa::@11/uctoa::buffer#12, uctoa::@15/uctoa::buffer#4 ) + uctoa::started#4 = phi( uctoa::@11/uctoa::started#2, uctoa::@15/uctoa::started#1 ) + uctoa::value#6 = phi( uctoa::@11/uctoa::value#2, uctoa::@15/uctoa::value#0 ) + uctoa::digit_values#7 = phi( uctoa::@11/uctoa::digit_values#5, uctoa::@15/uctoa::digit_values#9 ) + uctoa::max_digits#6 = phi( uctoa::@11/uctoa::max_digits#8, uctoa::@15/uctoa::max_digits#9 ) + uctoa::digit#4 = phi( uctoa::@11/uctoa::digit#3, uctoa::@15/uctoa::digit#5 ) + uctoa::digit#1 = ++ uctoa::digit#4 + to:uctoa::@10 +uctoa::@14: scope:[uctoa] from uctoa::@11 + uctoa::digit_values#10 = phi( uctoa::@11/uctoa::digit_values#5 ) + uctoa::max_digits#10 = phi( uctoa::@11/uctoa::max_digits#8 ) + uctoa::digit#6 = phi( uctoa::@11/uctoa::digit#3 ) + uctoa::digit_value#1 = phi( uctoa::@11/uctoa::digit_value#0 ) + uctoa::value#4 = phi( uctoa::@11/uctoa::value#2 ) + uctoa::buffer#8 = phi( uctoa::@11/uctoa::buffer#12 ) + uctoa_append::buffer#0 = uctoa::buffer#8 + uctoa_append::value#0 = uctoa::value#4 + uctoa_append::sub#0 = uctoa::digit_value#1 + call uctoa_append + uctoa_append::return#0 = uctoa_append::return#2 + to:uctoa::@15 +uctoa::@15: scope:[uctoa] from uctoa::@14 + uctoa::digit_values#9 = phi( uctoa::@14/uctoa::digit_values#10 ) + uctoa::max_digits#9 = phi( uctoa::@14/uctoa::max_digits#10 ) + uctoa::digit#5 = phi( uctoa::@14/uctoa::digit#6 ) + uctoa::buffer#9 = phi( uctoa::@14/uctoa::buffer#8 ) + uctoa_append::return#3 = phi( uctoa::@14/uctoa_append::return#0 ) + uctoa::$9 = uctoa_append::return#3 + uctoa::value#0 = uctoa::$9 + uctoa::buffer#4 = ++ uctoa::buffer#9 + uctoa::started#1 = 1 + to:uctoa::@13 + +char uctoa_append(char *buffer , char value , char sub) +uctoa_append: scope:[uctoa_append] from uctoa::@14 + uctoa_append::buffer#3 = phi( uctoa::@14/uctoa_append::buffer#0 ) + uctoa_append::sub#3 = phi( uctoa::@14/uctoa_append::sub#0 ) + uctoa_append::value#5 = phi( uctoa::@14/uctoa_append::value#0 ) + uctoa_append::digit#0 = 0 + to:uctoa_append::@1 +uctoa_append::@1: scope:[uctoa_append] from uctoa_append uctoa_append::@2 + uctoa_append::buffer#2 = phi( uctoa_append/uctoa_append::buffer#3, uctoa_append::@2/uctoa_append::buffer#4 ) + uctoa_append::digit#4 = phi( uctoa_append/uctoa_append::digit#0, uctoa_append::@2/uctoa_append::digit#1 ) + uctoa_append::sub#1 = phi( uctoa_append/uctoa_append::sub#3, uctoa_append::@2/uctoa_append::sub#2 ) + uctoa_append::value#2 = phi( uctoa_append/uctoa_append::value#5, uctoa_append::@2/uctoa_append::value#1 ) + uctoa_append::$0 = uctoa_append::value#2 >= uctoa_append::sub#1 + if(uctoa_append::$0) goto uctoa_append::@2 + to:uctoa_append::@3 +uctoa_append::@2: scope:[uctoa_append] from uctoa_append::@1 + uctoa_append::buffer#4 = phi( uctoa_append::@1/uctoa_append::buffer#2 ) + uctoa_append::sub#2 = phi( uctoa_append::@1/uctoa_append::sub#1 ) + uctoa_append::value#3 = phi( uctoa_append::@1/uctoa_append::value#2 ) + uctoa_append::digit#2 = phi( uctoa_append::@1/uctoa_append::digit#4 ) + uctoa_append::digit#1 = ++ uctoa_append::digit#2 + uctoa_append::value#1 = uctoa_append::value#3 - uctoa_append::sub#2 + to:uctoa_append::@1 +uctoa_append::@3: scope:[uctoa_append] from uctoa_append::@1 + uctoa_append::value#4 = phi( uctoa_append::@1/uctoa_append::value#2 ) + uctoa_append::buffer#1 = phi( uctoa_append::@1/uctoa_append::buffer#2 ) + uctoa_append::digit#3 = phi( uctoa_append::@1/uctoa_append::digit#4 ) + *uctoa_append::buffer#1 = DIGITS[uctoa_append::digit#3] + uctoa_append::return#1 = uctoa_append::value#4 + to:uctoa_append::@return +uctoa_append::@return: scope:[uctoa_append] from uctoa_append::@3 + uctoa_append::return#4 = phi( uctoa_append::@3/uctoa_append::return#1 ) + uctoa_append::return#2 = uctoa_append::return#4 + return + to:@return + +void clrscr() +clrscr: scope:[clrscr] from main::@3 + clrscr::line_text#0 = CONIO_SCREEN_TEXT + clrscr::line_cols#0 = CONIO_SCREEN_COLORS + clrscr::l#0 = 0 + to:clrscr::@1 +clrscr::@1: scope:[clrscr] from clrscr clrscr::@6 + clrscr::line_cols#6 = phi( clrscr/clrscr::line_cols#0, clrscr::@6/clrscr::line_cols#1 ) + clrscr::line_text#6 = phi( clrscr/clrscr::line_text#0, clrscr::@6/clrscr::line_text#1 ) + clrscr::l#2 = phi( clrscr/clrscr::l#0, clrscr::@6/clrscr::l#1 ) + clrscr::$0 = clrscr::l#2 < $19 + if(clrscr::$0) goto clrscr::@2 + to:clrscr::@3 +clrscr::@2: scope:[clrscr] from clrscr::@1 + clrscr::l#5 = phi( clrscr::@1/clrscr::l#2 ) + clrscr::line_cols#5 = phi( clrscr::@1/clrscr::line_cols#6 ) + clrscr::line_text#5 = phi( clrscr::@1/clrscr::line_text#6 ) + clrscr::c#0 = 0 + to:clrscr::@4 +clrscr::@3: scope:[clrscr] from clrscr::@1 + conio_cursor_x = 0 + conio_cursor_y = 0 + conio_line_text = CONIO_SCREEN_TEXT + conio_line_color = CONIO_SCREEN_COLORS + to:clrscr::@return +clrscr::@4: scope:[clrscr] from clrscr::@2 clrscr::@5 + clrscr::l#4 = phi( clrscr::@2/clrscr::l#5, clrscr::@5/clrscr::l#6 ) + clrscr::line_cols#4 = phi( clrscr::@2/clrscr::line_cols#5, clrscr::@5/clrscr::line_cols#2 ) + clrscr::line_text#4 = phi( clrscr::@2/clrscr::line_text#5, clrscr::@5/clrscr::line_text#2 ) + clrscr::c#2 = phi( clrscr::@2/clrscr::c#0, clrscr::@5/clrscr::c#1 ) + clrscr::$1 = clrscr::c#2 < $28 + if(clrscr::$1) goto clrscr::@5 + to:clrscr::@6 +clrscr::@5: scope:[clrscr] from clrscr::@4 + clrscr::l#6 = phi( clrscr::@4/clrscr::l#4 ) + clrscr::line_cols#2 = phi( clrscr::@4/clrscr::line_cols#4 ) + clrscr::c#3 = phi( clrscr::@4/clrscr::c#2 ) + clrscr::line_text#2 = phi( clrscr::@4/clrscr::line_text#4 ) + clrscr::line_text#2[clrscr::c#3] = ' ' + clrscr::line_cols#2[clrscr::c#3] = conio_textcolor + clrscr::c#1 = ++ clrscr::c#3 + to:clrscr::@4 +clrscr::@6: scope:[clrscr] from clrscr::@4 + clrscr::l#3 = phi( clrscr::@4/clrscr::l#4 ) + clrscr::line_cols#3 = phi( clrscr::@4/clrscr::line_cols#4 ) + clrscr::line_text#3 = phi( clrscr::@4/clrscr::line_text#4 ) + clrscr::line_text#1 = clrscr::line_text#3 + $28 + clrscr::line_cols#1 = clrscr::line_cols#3 + $28 + clrscr::l#1 = ++ clrscr::l#3 + to:clrscr::@1 +clrscr::@return: scope:[clrscr] from clrscr::@3 + return + to:@return + +void gotoxy(char x , char y) +gotoxy: scope:[gotoxy] from conio_c64_init::@1 cscroll::@2 + gotoxy::x#5 = phi( conio_c64_init::@1/gotoxy::x#2, cscroll::@2/gotoxy::x#1 ) + gotoxy::y#3 = phi( conio_c64_init::@1/gotoxy::y#2, cscroll::@2/gotoxy::y#1 ) + gotoxy::$0 = gotoxy::y#3 > $19 + gotoxy::$1 = ! gotoxy::$0 + if(gotoxy::$1) goto gotoxy::@1 + to:gotoxy::@3 +gotoxy::@1: scope:[gotoxy] from gotoxy gotoxy::@3 + gotoxy::y#5 = phi( gotoxy/gotoxy::y#3, gotoxy::@3/gotoxy::y#0 ) + gotoxy::x#3 = phi( gotoxy/gotoxy::x#5, gotoxy::@3/gotoxy::x#6 ) + gotoxy::$2 = gotoxy::x#3 >= $28 + gotoxy::$3 = ! gotoxy::$2 + if(gotoxy::$3) goto gotoxy::@2 + to:gotoxy::@4 +gotoxy::@3: scope:[gotoxy] from gotoxy + gotoxy::x#6 = phi( gotoxy/gotoxy::x#5 ) + gotoxy::y#0 = 0 + to:gotoxy::@1 +gotoxy::@2: scope:[gotoxy] from gotoxy::@1 gotoxy::@4 + gotoxy::y#4 = phi( gotoxy::@1/gotoxy::y#5, gotoxy::@4/gotoxy::y#6 ) + gotoxy::x#4 = phi( gotoxy::@1/gotoxy::x#3, gotoxy::@4/gotoxy::x#0 ) + conio_cursor_x = gotoxy::x#4 + conio_cursor_y = gotoxy::y#4 + gotoxy::$7 = (unsigned int)gotoxy::y#4 + gotoxy::line_offset#0 = gotoxy::$7 * $28 + gotoxy::$5 = CONIO_SCREEN_TEXT + gotoxy::line_offset#0 + conio_line_text = gotoxy::$5 + gotoxy::$6 = CONIO_SCREEN_COLORS + gotoxy::line_offset#0 + conio_line_color = gotoxy::$6 + to:gotoxy::@return +gotoxy::@4: scope:[gotoxy] from gotoxy::@1 + gotoxy::y#6 = phi( gotoxy::@1/gotoxy::y#5 ) + gotoxy::x#0 = 0 + to:gotoxy::@2 +gotoxy::@return: scope:[gotoxy] from gotoxy::@2 + return + to:@return + +__stackcall void cputc(char c) +cputc: scope:[cputc] from + cputc::c#0 = stackidx(char,cputc::OFFSET_STACK_C) + cputc::$0 = cputc::c#0 == ' +' + if(cputc::$0) goto cputc::@1 + to:cputc::@2 +cputc::@1: scope:[cputc] from cputc + call cputln + to:cputc::@4 +cputc::@4: scope:[cputc] from cputc::@1 + to:cputc::@return +cputc::@2: scope:[cputc] from cputc + cputc::c#1 = phi( cputc/cputc::c#0 ) + conio_line_text[conio_cursor_x] = cputc::c#1 + conio_line_color[conio_cursor_x] = conio_textcolor + conio_cursor_x = ++ conio_cursor_x + cputc::$1 = conio_cursor_x == $28 + cputc::$2 = ! cputc::$1 + if(cputc::$2) goto cputc::@return + to:cputc::@3 +cputc::@3: scope:[cputc] from cputc::@2 + call cputln + to:cputc::@5 +cputc::@5: scope:[cputc] from cputc::@3 + to:cputc::@return +cputc::@return: scope:[cputc] from cputc::@2 cputc::@4 cputc::@5 + return + to:@return + +void cputln() +cputln: scope:[cputln] from cputc::@1 cputc::@3 + conio_line_text = conio_line_text + $28 + conio_line_color = conio_line_color + $28 + conio_cursor_x = 0 + conio_cursor_y = ++ conio_cursor_y + call cscroll + to:cputln::@1 +cputln::@1: scope:[cputln] from cputln + to:cputln::@return +cputln::@return: scope:[cputln] from cputln::@1 + return + to:@return + +void cscroll() +cscroll: scope:[cscroll] from cputln + cscroll::$0 = conio_cursor_y == $19 + cscroll::$1 = ! cscroll::$0 + if(cscroll::$1) goto cscroll::@return + to:cscroll::@1 +cscroll::@1: scope:[cscroll] from cscroll + cscroll::$7 = 0 != conio_scroll_enable + if(cscroll::$7) goto cscroll::@3 + to:cscroll::@2 +cscroll::@3: scope:[cscroll] from cscroll::@1 + memcpy::destination#0 = (void *)CONIO_SCREEN_TEXT + memcpy::source#0 = (void *)CONIO_SCREEN_TEXT+$28 + memcpy::num#0 = $19*$28-$28 + call memcpy + memcpy::return#2 = memcpy::return#1 + to:cscroll::@4 +cscroll::@4: scope:[cscroll] from cscroll::@3 + memcpy::destination#1 = (void *)CONIO_SCREEN_COLORS + memcpy::source#1 = (void *)CONIO_SCREEN_COLORS+$28 + memcpy::num#1 = $19*$28-$28 + call memcpy + memcpy::return#3 = memcpy::return#1 + to:cscroll::@5 +cscroll::@5: scope:[cscroll] from cscroll::@4 + memset::str#0 = (void *)CONIO_SCREEN_TEXT+$19*$28-$28 + memset::c#0 = ' ' + memset::num#0 = $28 + call memset + memset::return#2 = memset::return#1 + to:cscroll::@6 +cscroll::@6: scope:[cscroll] from cscroll::@5 + memset::str#1 = (void *)CONIO_SCREEN_COLORS+$19*$28-$28 + memset::c#1 = conio_textcolor + memset::num#1 = $28 + call memset + memset::return#3 = memset::return#1 + to:cscroll::@7 +cscroll::@7: scope:[cscroll] from cscroll::@6 + conio_line_text = conio_line_text - $28 + conio_line_color = conio_line_color - $28 + conio_cursor_y = -- conio_cursor_y + to:cscroll::@return +cscroll::@2: scope:[cscroll] from cscroll::@1 + gotoxy::x#1 = 0 + gotoxy::y#1 = 0 + call gotoxy + to:cscroll::@8 +cscroll::@8: scope:[cscroll] from cscroll::@2 + to:cscroll::@return +cscroll::@return: scope:[cscroll] from cscroll cscroll::@7 cscroll::@8 + return + to:@return + +void conio_c64_init() +conio_c64_init: scope:[conio_c64_init] from __start::__init1 + conio_c64_init::line#0 = *conio_c64_init::BASIC_CURSOR_LINE + conio_c64_init::$0 = conio_c64_init::line#0 >= $19 + conio_c64_init::$1 = ! conio_c64_init::$0 + if(conio_c64_init::$1) goto conio_c64_init::@1 + to:conio_c64_init::@2 +conio_c64_init::@1: scope:[conio_c64_init] from conio_c64_init conio_c64_init::@2 + conio_c64_init::line#2 = phi( conio_c64_init/conio_c64_init::line#0, conio_c64_init::@2/conio_c64_init::line#1 ) + gotoxy::x#2 = 0 + gotoxy::y#2 = conio_c64_init::line#2 + call gotoxy + to:conio_c64_init::@3 +conio_c64_init::@3: scope:[conio_c64_init] from conio_c64_init::@1 + to:conio_c64_init::@return +conio_c64_init::@2: scope:[conio_c64_init] from conio_c64_init + conio_c64_init::line#1 = $19-1 + to:conio_c64_init::@1 +conio_c64_init::@return: scope:[conio_c64_init] from conio_c64_init::@3 + return + to:@return + +void printf_str(void (*putc)(char) , const char *s) +printf_str: scope:[printf_str] from main::@6 main::@7 main::@9 printf_number_buffer::@5 + printf_str::putc#6 = phi( main::@6/printf_str::putc#1, main::@7/printf_str::putc#2, main::@9/printf_str::putc#3, printf_number_buffer::@5/printf_str::putc#0 ) + printf_str::s#6 = phi( main::@6/printf_str::s#2, main::@7/printf_str::s#3, main::@9/printf_str::s#4, printf_number_buffer::@5/printf_str::s#1 ) + printf_str::c#0 = 0 + to:printf_str::@1 +printf_str::@1: scope:[printf_str] from printf_str printf_str::@2 + printf_str::putc#5 = phi( printf_str/printf_str::putc#6, printf_str::@2/printf_str::putc#4 ) + printf_str::s#5 = phi( printf_str/printf_str::s#6, printf_str::@2/printf_str::s#7 ) + printf_str::c#1 = *printf_str::s#5 + printf_str::$0 = printf_str::c#1 + printf_str::s#0 = ++ printf_str::s#5 + printf_str::$2 = 0 != printf_str::$0 + if(printf_str::$2) goto printf_str::@2 + to:printf_str::@return +printf_str::@2: scope:[printf_str] from printf_str::@1 + printf_str::s#7 = phi( printf_str::@1/printf_str::s#0 ) + printf_str::putc#4 = phi( printf_str::@1/printf_str::putc#5 ) + printf_str::c#2 = phi( printf_str::@1/printf_str::c#1 ) + stackpush(char) = printf_str::c#2 + callexecute *printf_str::putc#4 + sideeffect stackpullbytes(1) + to:printf_str::@1 +printf_str::@return: scope:[printf_str] from printf_str::@1 + return + to:@return + +void printf_padding(void (*putc)(char) , char pad , char length) +printf_padding: scope:[printf_padding] from printf_number_buffer::@10 printf_number_buffer::@12 printf_number_buffer::@8 + printf_padding::putc#5 = phi( printf_number_buffer::@10/printf_padding::putc#1, printf_number_buffer::@12/printf_padding::putc#2, printf_number_buffer::@8/printf_padding::putc#0 ) + printf_padding::pad#5 = phi( printf_number_buffer::@10/printf_padding::pad#1, printf_number_buffer::@12/printf_padding::pad#2, printf_number_buffer::@8/printf_padding::pad#0 ) + printf_padding::length#4 = phi( printf_number_buffer::@10/printf_padding::length#1, printf_number_buffer::@12/printf_padding::length#2, printf_number_buffer::@8/printf_padding::length#0 ) + printf_padding::i#0 = 0 + to:printf_padding::@1 +printf_padding::@1: scope:[printf_padding] from printf_padding printf_padding::@3 + printf_padding::putc#4 = phi( printf_padding/printf_padding::putc#5, printf_padding::@3/printf_padding::putc#6 ) + printf_padding::pad#4 = phi( printf_padding/printf_padding::pad#5, printf_padding::@3/printf_padding::pad#6 ) + printf_padding::length#3 = phi( printf_padding/printf_padding::length#4, printf_padding::@3/printf_padding::length#5 ) + printf_padding::i#2 = phi( printf_padding/printf_padding::i#0, printf_padding::@3/printf_padding::i#1 ) + printf_padding::$0 = printf_padding::i#2 < printf_padding::length#3 + if(printf_padding::$0) goto printf_padding::@2 + to:printf_padding::@return +printf_padding::@2: scope:[printf_padding] from printf_padding::@1 + printf_padding::length#6 = phi( printf_padding::@1/printf_padding::length#3 ) + printf_padding::i#4 = phi( printf_padding::@1/printf_padding::i#2 ) + printf_padding::putc#3 = phi( printf_padding::@1/printf_padding::putc#4 ) + printf_padding::pad#3 = phi( printf_padding::@1/printf_padding::pad#4 ) + stackpush(char) = printf_padding::pad#3 + callexecute *printf_padding::putc#3 + sideeffect stackpullbytes(1) + to:printf_padding::@3 +printf_padding::@3: scope:[printf_padding] from printf_padding::@2 + printf_padding::putc#6 = phi( printf_padding::@2/printf_padding::putc#3 ) + printf_padding::pad#6 = phi( printf_padding::@2/printf_padding::pad#3 ) + printf_padding::length#5 = phi( printf_padding::@2/printf_padding::length#6 ) + printf_padding::i#3 = phi( printf_padding::@2/printf_padding::i#4 ) + printf_padding::i#1 = ++ printf_padding::i#3 + to:printf_padding::@1 +printf_padding::@return: scope:[printf_padding] from printf_padding::@1 + return + to:@return + +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::@8 + printf_uchar::format_upper_case#5 = phi( main::@8/printf_uchar::format_upper_case#0 ) + printf_uchar::format_zero_padding#5 = phi( main::@8/printf_uchar::format_zero_padding#0 ) + printf_uchar::format_justify_left#5 = phi( main::@8/printf_uchar::format_justify_left#0 ) + printf_uchar::format_min_length#5 = phi( main::@8/printf_uchar::format_min_length#0 ) + printf_uchar::putc#5 = phi( main::@8/printf_uchar::putc#0 ) + printf_uchar::format_radix#5 = phi( main::@8/printf_uchar::format_radix#0 ) + printf_uchar::uvalue#4 = phi( main::@8/printf_uchar::uvalue#0 ) + printf_uchar::format_sign_always#1 = phi( main::@8/printf_uchar::format_sign_always#0 ) + printf_uchar::$5 = 0 != printf_uchar::format_sign_always#1 + if(printf_uchar::$5) goto printf_uchar::@1 + to:printf_uchar::@2 +printf_uchar::@1: scope:[printf_uchar] from printf_uchar + printf_uchar::format_upper_case#3 = phi( printf_uchar/printf_uchar::format_upper_case#5 ) + printf_uchar::format_zero_padding#3 = phi( printf_uchar/printf_uchar::format_zero_padding#5 ) + printf_uchar::format_sign_always#4 = phi( printf_uchar/printf_uchar::format_sign_always#1 ) + printf_uchar::format_justify_left#3 = phi( printf_uchar/printf_uchar::format_justify_left#5 ) + printf_uchar::format_min_length#3 = phi( printf_uchar/printf_uchar::format_min_length#5 ) + printf_uchar::putc#3 = phi( printf_uchar/printf_uchar::putc#5 ) + printf_uchar::format_radix#3 = phi( printf_uchar/printf_uchar::format_radix#5 ) + printf_uchar::uvalue#2 = phi( printf_uchar/printf_uchar::uvalue#4 ) + printf_uchar::$1 = '+' + to:printf_uchar::@3 +printf_uchar::@2: scope:[printf_uchar] from printf_uchar + printf_uchar::format_upper_case#4 = phi( printf_uchar/printf_uchar::format_upper_case#5 ) + printf_uchar::format_zero_padding#4 = phi( printf_uchar/printf_uchar::format_zero_padding#5 ) + printf_uchar::format_sign_always#5 = phi( printf_uchar/printf_uchar::format_sign_always#1 ) + printf_uchar::format_justify_left#4 = phi( printf_uchar/printf_uchar::format_justify_left#5 ) + printf_uchar::format_min_length#4 = phi( printf_uchar/printf_uchar::format_min_length#5 ) + printf_uchar::putc#4 = phi( printf_uchar/printf_uchar::putc#5 ) + printf_uchar::format_radix#4 = phi( printf_uchar/printf_uchar::format_radix#5 ) + printf_uchar::uvalue#3 = phi( printf_uchar/printf_uchar::uvalue#4 ) + printf_uchar::$0 = 0 + to:printf_uchar::@3 +printf_uchar::@3: scope:[printf_uchar] from printf_uchar::@1 printf_uchar::@2 + printf_uchar::format_upper_case#2 = phi( printf_uchar::@1/printf_uchar::format_upper_case#3, printf_uchar::@2/printf_uchar::format_upper_case#4 ) + printf_uchar::format_zero_padding#2 = phi( printf_uchar::@1/printf_uchar::format_zero_padding#3, printf_uchar::@2/printf_uchar::format_zero_padding#4 ) + printf_uchar::format_sign_always#3 = phi( printf_uchar::@1/printf_uchar::format_sign_always#4, printf_uchar::@2/printf_uchar::format_sign_always#5 ) + printf_uchar::format_justify_left#2 = phi( printf_uchar::@1/printf_uchar::format_justify_left#3, printf_uchar::@2/printf_uchar::format_justify_left#4 ) + printf_uchar::format_min_length#2 = phi( printf_uchar::@1/printf_uchar::format_min_length#3, printf_uchar::@2/printf_uchar::format_min_length#4 ) + printf_uchar::putc#2 = phi( printf_uchar::@1/printf_uchar::putc#3, printf_uchar::@2/printf_uchar::putc#4 ) + printf_uchar::format_radix#1 = phi( printf_uchar::@1/printf_uchar::format_radix#3, printf_uchar::@2/printf_uchar::format_radix#4 ) + printf_uchar::uvalue#1 = phi( printf_uchar::@1/printf_uchar::uvalue#2, printf_uchar::@2/printf_uchar::uvalue#3 ) + printf_uchar::$2 = phi( printf_uchar::@1/printf_uchar::$1, printf_uchar::@2/printf_uchar::$0 ) + *((char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_SIGN) = printf_uchar::$2 + uctoa::value#1 = printf_uchar::uvalue#1 + uctoa::buffer#5 = (char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS + uctoa::radix#0 = printf_uchar::format_radix#1 + call uctoa + to:printf_uchar::@4 +printf_uchar::@4: scope:[printf_uchar] from printf_uchar::@3 + printf_uchar::format_radix#2 = phi( printf_uchar::@3/printf_uchar::format_radix#1 ) + printf_uchar::format_upper_case#1 = phi( printf_uchar::@3/printf_uchar::format_upper_case#2 ) + printf_uchar::format_zero_padding#1 = phi( printf_uchar::@3/printf_uchar::format_zero_padding#2 ) + printf_uchar::format_sign_always#2 = phi( printf_uchar::@3/printf_uchar::format_sign_always#3 ) + printf_uchar::format_justify_left#1 = phi( printf_uchar::@3/printf_uchar::format_justify_left#2 ) + printf_uchar::format_min_length#1 = phi( printf_uchar::@3/printf_uchar::format_min_length#2 ) + printf_uchar::putc#1 = phi( printf_uchar::@3/printf_uchar::putc#2 ) + printf_number_buffer::putc#0 = printf_uchar::putc#1 + printf_number_buffer::buffer_sign#0 = *((char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_SIGN) + printf_number_buffer::buffer_digits#0 = (char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS + printf_number_buffer::format_min_length#0 = printf_uchar::format_min_length#1 + printf_number_buffer::format_justify_left#0 = printf_uchar::format_justify_left#1 + printf_number_buffer::format_sign_always#0 = printf_uchar::format_sign_always#2 + printf_number_buffer::format_zero_padding#0 = printf_uchar::format_zero_padding#1 + printf_number_buffer::format_upper_case#0 = printf_uchar::format_upper_case#1 + printf_number_buffer::format_radix#0 = printf_uchar::format_radix#2 + call printf_number_buffer + to:printf_uchar::@5 +printf_uchar::@5: scope:[printf_uchar] from printf_uchar::@4 + to:printf_uchar::@return +printf_uchar::@return: scope:[printf_uchar] from printf_uchar::@5 + return + to:@return + +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::@4 + printf_number_buffer::format_upper_case#9 = phi( printf_uchar::@4/printf_number_buffer::format_upper_case#0 ) + printf_number_buffer::putc#12 = phi( printf_uchar::@4/printf_number_buffer::putc#0 ) + printf_number_buffer::buffer_sign#7 = phi( printf_uchar::@4/printf_number_buffer::buffer_sign#0 ) + printf_number_buffer::buffer_digits#4 = phi( printf_uchar::@4/printf_number_buffer::buffer_digits#0 ) + printf_number_buffer::format_zero_padding#4 = phi( printf_uchar::@4/printf_number_buffer::format_zero_padding#0 ) + printf_number_buffer::format_justify_left#3 = phi( printf_uchar::@4/printf_number_buffer::format_justify_left#0 ) + printf_number_buffer::format_min_length#1 = phi( printf_uchar::@4/printf_number_buffer::format_min_length#0 ) + printf_number_buffer::padding#0 = 0 + printf_number_buffer::$26 = 0 != printf_number_buffer::format_min_length#1 + printf_number_buffer::$0 = ! printf_number_buffer::$26 + if(printf_number_buffer::$0) goto printf_number_buffer::@1 + to:printf_number_buffer::@6 +printf_number_buffer::@1: scope:[printf_number_buffer] from printf_number_buffer printf_number_buffer::@13 printf_number_buffer::@14 + printf_number_buffer::buffer_digits#12 = phi( printf_number_buffer/printf_number_buffer::buffer_digits#4, printf_number_buffer::@13/printf_number_buffer::buffer_digits#14, printf_number_buffer::@14/printf_number_buffer::buffer_digits#15 ) + printf_number_buffer::format_upper_case#7 = phi( printf_number_buffer/printf_number_buffer::format_upper_case#9, printf_number_buffer::@13/printf_number_buffer::format_upper_case#10, printf_number_buffer::@14/printf_number_buffer::format_upper_case#11 ) + printf_number_buffer::putc#6 = phi( printf_number_buffer/printf_number_buffer::putc#12, printf_number_buffer::@13/printf_number_buffer::putc#13, printf_number_buffer::@14/printf_number_buffer::putc#14 ) + printf_number_buffer::buffer_sign#5 = phi( printf_number_buffer/printf_number_buffer::buffer_sign#7, printf_number_buffer::@13/printf_number_buffer::buffer_sign#8, printf_number_buffer::@14/printf_number_buffer::buffer_sign#9 ) + printf_number_buffer::padding#3 = phi( printf_number_buffer/printf_number_buffer::padding#0, printf_number_buffer::@13/printf_number_buffer::padding#1, printf_number_buffer::@14/printf_number_buffer::padding#2 ) + printf_number_buffer::format_zero_padding#1 = phi( printf_number_buffer/printf_number_buffer::format_zero_padding#4, printf_number_buffer::@13/printf_number_buffer::format_zero_padding#5, printf_number_buffer::@14/printf_number_buffer::format_zero_padding#6 ) + printf_number_buffer::format_justify_left#1 = phi( printf_number_buffer/printf_number_buffer::format_justify_left#3, printf_number_buffer::@13/printf_number_buffer::format_justify_left#4, printf_number_buffer::@14/printf_number_buffer::format_justify_left#5 ) + printf_number_buffer::$27 = 0 != printf_number_buffer::format_justify_left#1 + printf_number_buffer::$1 = ! printf_number_buffer::$27 + printf_number_buffer::$28 = 0 != printf_number_buffer::format_zero_padding#1 + printf_number_buffer::$2 = ! printf_number_buffer::$28 + printf_number_buffer::$3 = printf_number_buffer::$1 && printf_number_buffer::$2 + printf_number_buffer::$4 = printf_number_buffer::$3 && printf_number_buffer::padding#3 + printf_number_buffer::$5 = ! printf_number_buffer::$4 + if(printf_number_buffer::$5) goto printf_number_buffer::@2 + to:printf_number_buffer::@8 +printf_number_buffer::@6: scope:[printf_number_buffer] from printf_number_buffer + printf_number_buffer::format_upper_case#15 = phi( printf_number_buffer/printf_number_buffer::format_upper_case#9 ) + printf_number_buffer::putc#20 = phi( printf_number_buffer/printf_number_buffer::putc#12 ) + printf_number_buffer::format_zero_padding#15 = phi( printf_number_buffer/printf_number_buffer::format_zero_padding#4 ) + printf_number_buffer::format_justify_left#11 = phi( printf_number_buffer/printf_number_buffer::format_justify_left#3 ) + printf_number_buffer::format_min_length#5 = phi( printf_number_buffer/printf_number_buffer::format_min_length#1 ) + printf_number_buffer::buffer_sign#4 = phi( printf_number_buffer/printf_number_buffer::buffer_sign#7 ) + printf_number_buffer::buffer_digits#1 = phi( printf_number_buffer/printf_number_buffer::buffer_digits#4 ) + strlen::str#1 = printf_number_buffer::buffer_digits#1 + call strlen + strlen::return#2 = strlen::return#1 + to:printf_number_buffer::@15 +printf_number_buffer::@15: scope:[printf_number_buffer] from printf_number_buffer::@6 + printf_number_buffer::buffer_digits#17 = phi( printf_number_buffer::@6/printf_number_buffer::buffer_digits#1 ) + printf_number_buffer::format_upper_case#13 = phi( printf_number_buffer::@6/printf_number_buffer::format_upper_case#15 ) + printf_number_buffer::putc#18 = phi( printf_number_buffer::@6/printf_number_buffer::putc#20 ) + printf_number_buffer::format_zero_padding#10 = phi( printf_number_buffer::@6/printf_number_buffer::format_zero_padding#15 ) + printf_number_buffer::format_justify_left#7 = phi( printf_number_buffer::@6/printf_number_buffer::format_justify_left#11 ) + printf_number_buffer::format_min_length#3 = phi( printf_number_buffer::@6/printf_number_buffer::format_min_length#5 ) + printf_number_buffer::buffer_sign#1 = phi( printf_number_buffer::@6/printf_number_buffer::buffer_sign#4 ) + strlen::return#4 = phi( printf_number_buffer::@6/strlen::return#2 ) + printf_number_buffer::$19 = strlen::return#4 + printf_number_buffer::len#0 = (signed char)printf_number_buffer::$19 + printf_number_buffer::$29 = 0 != printf_number_buffer::buffer_sign#1 + printf_number_buffer::$20 = ! printf_number_buffer::$29 + if(printf_number_buffer::$20) goto printf_number_buffer::@13 + to:printf_number_buffer::@7 +printf_number_buffer::@13: scope:[printf_number_buffer] from printf_number_buffer::@15 printf_number_buffer::@7 + printf_number_buffer::buffer_digits#14 = phi( printf_number_buffer::@15/printf_number_buffer::buffer_digits#17, printf_number_buffer::@7/printf_number_buffer::buffer_digits#18 ) + printf_number_buffer::format_upper_case#10 = phi( printf_number_buffer::@15/printf_number_buffer::format_upper_case#13, printf_number_buffer::@7/printf_number_buffer::format_upper_case#14 ) + printf_number_buffer::putc#13 = phi( printf_number_buffer::@15/printf_number_buffer::putc#18, printf_number_buffer::@7/printf_number_buffer::putc#19 ) + printf_number_buffer::buffer_sign#8 = phi( printf_number_buffer::@15/printf_number_buffer::buffer_sign#1, printf_number_buffer::@7/printf_number_buffer::buffer_sign#11 ) + printf_number_buffer::format_zero_padding#5 = phi( printf_number_buffer::@15/printf_number_buffer::format_zero_padding#10, printf_number_buffer::@7/printf_number_buffer::format_zero_padding#11 ) + printf_number_buffer::format_justify_left#4 = phi( printf_number_buffer::@15/printf_number_buffer::format_justify_left#7, printf_number_buffer::@7/printf_number_buffer::format_justify_left#8 ) + printf_number_buffer::len#2 = phi( printf_number_buffer::@15/printf_number_buffer::len#0, printf_number_buffer::@7/printf_number_buffer::len#1 ) + printf_number_buffer::format_min_length#2 = phi( printf_number_buffer::@15/printf_number_buffer::format_min_length#3, printf_number_buffer::@7/printf_number_buffer::format_min_length#4 ) + printf_number_buffer::$25 = (signed char)printf_number_buffer::format_min_length#2 + printf_number_buffer::$21 = printf_number_buffer::$25 - printf_number_buffer::len#2 + printf_number_buffer::padding#1 = printf_number_buffer::$21 + printf_number_buffer::$22 = printf_number_buffer::padding#1 < 0 + printf_number_buffer::$23 = ! printf_number_buffer::$22 + if(printf_number_buffer::$23) goto printf_number_buffer::@1 + to:printf_number_buffer::@14 +printf_number_buffer::@7: scope:[printf_number_buffer] from printf_number_buffer::@15 + printf_number_buffer::buffer_digits#18 = phi( printf_number_buffer::@15/printf_number_buffer::buffer_digits#17 ) + printf_number_buffer::format_upper_case#14 = phi( printf_number_buffer::@15/printf_number_buffer::format_upper_case#13 ) + printf_number_buffer::putc#19 = phi( printf_number_buffer::@15/printf_number_buffer::putc#18 ) + printf_number_buffer::buffer_sign#11 = phi( printf_number_buffer::@15/printf_number_buffer::buffer_sign#1 ) + printf_number_buffer::format_zero_padding#11 = phi( printf_number_buffer::@15/printf_number_buffer::format_zero_padding#10 ) + printf_number_buffer::format_justify_left#8 = phi( printf_number_buffer::@15/printf_number_buffer::format_justify_left#7 ) + printf_number_buffer::format_min_length#4 = phi( printf_number_buffer::@15/printf_number_buffer::format_min_length#3 ) + printf_number_buffer::len#3 = phi( printf_number_buffer::@15/printf_number_buffer::len#0 ) + printf_number_buffer::len#1 = ++ printf_number_buffer::len#3 + to:printf_number_buffer::@13 +printf_number_buffer::@14: scope:[printf_number_buffer] from printf_number_buffer::@13 + printf_number_buffer::buffer_digits#15 = phi( printf_number_buffer::@13/printf_number_buffer::buffer_digits#14 ) + printf_number_buffer::format_upper_case#11 = phi( printf_number_buffer::@13/printf_number_buffer::format_upper_case#10 ) + printf_number_buffer::putc#14 = phi( printf_number_buffer::@13/printf_number_buffer::putc#13 ) + printf_number_buffer::buffer_sign#9 = phi( printf_number_buffer::@13/printf_number_buffer::buffer_sign#8 ) + printf_number_buffer::format_zero_padding#6 = phi( printf_number_buffer::@13/printf_number_buffer::format_zero_padding#5 ) + printf_number_buffer::format_justify_left#5 = phi( printf_number_buffer::@13/printf_number_buffer::format_justify_left#4 ) + printf_number_buffer::padding#2 = 0 + to:printf_number_buffer::@1 +printf_number_buffer::@2: scope:[printf_number_buffer] from printf_number_buffer::@1 printf_number_buffer::@16 + printf_number_buffer::format_justify_left#15 = phi( printf_number_buffer::@1/printf_number_buffer::format_justify_left#1, printf_number_buffer::@16/printf_number_buffer::format_justify_left#18 ) + printf_number_buffer::buffer_digits#9 = phi( printf_number_buffer::@1/printf_number_buffer::buffer_digits#12, printf_number_buffer::@16/printf_number_buffer::buffer_digits#13 ) + printf_number_buffer::format_upper_case#4 = phi( printf_number_buffer::@1/printf_number_buffer::format_upper_case#7, printf_number_buffer::@16/printf_number_buffer::format_upper_case#8 ) + printf_number_buffer::putc#7 = phi( printf_number_buffer::@1/printf_number_buffer::putc#6, printf_number_buffer::@16/printf_number_buffer::putc#15 ) + printf_number_buffer::padding#9 = phi( printf_number_buffer::@1/printf_number_buffer::padding#3, printf_number_buffer::@16/printf_number_buffer::padding#12 ) + printf_number_buffer::format_zero_padding#7 = phi( printf_number_buffer::@1/printf_number_buffer::format_zero_padding#1, printf_number_buffer::@16/printf_number_buffer::format_zero_padding#12 ) + printf_number_buffer::buffer_sign#2 = phi( printf_number_buffer::@1/printf_number_buffer::buffer_sign#5, printf_number_buffer::@16/printf_number_buffer::buffer_sign#6 ) + printf_number_buffer::$30 = 0 != printf_number_buffer::buffer_sign#2 + printf_number_buffer::$7 = ! printf_number_buffer::$30 + if(printf_number_buffer::$7) goto printf_number_buffer::@3 + to:printf_number_buffer::@9 +printf_number_buffer::@8: scope:[printf_number_buffer] from printf_number_buffer::@1 + printf_number_buffer::format_justify_left#19 = phi( printf_number_buffer::@1/printf_number_buffer::format_justify_left#1 ) + printf_number_buffer::buffer_digits#16 = phi( printf_number_buffer::@1/printf_number_buffer::buffer_digits#12 ) + printf_number_buffer::format_upper_case#12 = phi( printf_number_buffer::@1/printf_number_buffer::format_upper_case#7 ) + printf_number_buffer::format_zero_padding#16 = phi( printf_number_buffer::@1/printf_number_buffer::format_zero_padding#1 ) + printf_number_buffer::buffer_sign#10 = phi( printf_number_buffer::@1/printf_number_buffer::buffer_sign#5 ) + printf_number_buffer::padding#4 = phi( printf_number_buffer::@1/printf_number_buffer::padding#3 ) + printf_number_buffer::putc#1 = phi( printf_number_buffer::@1/printf_number_buffer::putc#6 ) + printf_padding::putc#0 = printf_number_buffer::putc#1 + printf_padding::pad#0 = ' ' + printf_padding::length#0 = (char)printf_number_buffer::padding#4 + call printf_padding + to:printf_number_buffer::@16 +printf_number_buffer::@16: scope:[printf_number_buffer] from printf_number_buffer::@8 + printf_number_buffer::format_justify_left#18 = phi( printf_number_buffer::@8/printf_number_buffer::format_justify_left#19 ) + printf_number_buffer::buffer_digits#13 = phi( printf_number_buffer::@8/printf_number_buffer::buffer_digits#16 ) + printf_number_buffer::format_upper_case#8 = phi( printf_number_buffer::@8/printf_number_buffer::format_upper_case#12 ) + printf_number_buffer::putc#15 = phi( printf_number_buffer::@8/printf_number_buffer::putc#1 ) + printf_number_buffer::padding#12 = phi( printf_number_buffer::@8/printf_number_buffer::padding#4 ) + printf_number_buffer::format_zero_padding#12 = phi( printf_number_buffer::@8/printf_number_buffer::format_zero_padding#16 ) + printf_number_buffer::buffer_sign#6 = phi( printf_number_buffer::@8/printf_number_buffer::buffer_sign#10 ) + to:printf_number_buffer::@2 +printf_number_buffer::@3: scope:[printf_number_buffer] from printf_number_buffer::@2 printf_number_buffer::@9 + printf_number_buffer::format_justify_left#13 = phi( printf_number_buffer::@2/printf_number_buffer::format_justify_left#15, printf_number_buffer::@9/printf_number_buffer::format_justify_left#16 ) + printf_number_buffer::buffer_digits#8 = phi( printf_number_buffer::@2/printf_number_buffer::buffer_digits#9, printf_number_buffer::@9/printf_number_buffer::buffer_digits#10 ) + printf_number_buffer::putc#8 = phi( printf_number_buffer::@2/printf_number_buffer::putc#7, printf_number_buffer::@9/printf_number_buffer::putc#2 ) + printf_number_buffer::format_upper_case#3 = phi( printf_number_buffer::@2/printf_number_buffer::format_upper_case#4, printf_number_buffer::@9/printf_number_buffer::format_upper_case#5 ) + printf_number_buffer::padding#5 = phi( printf_number_buffer::@2/printf_number_buffer::padding#9, printf_number_buffer::@9/printf_number_buffer::padding#10 ) + printf_number_buffer::format_zero_padding#2 = phi( printf_number_buffer::@2/printf_number_buffer::format_zero_padding#7, printf_number_buffer::@9/printf_number_buffer::format_zero_padding#8 ) + printf_number_buffer::$9 = printf_number_buffer::format_zero_padding#2 && printf_number_buffer::padding#5 + printf_number_buffer::$10 = ! printf_number_buffer::$9 + if(printf_number_buffer::$10) goto printf_number_buffer::@4 + to:printf_number_buffer::@10 +printf_number_buffer::@9: scope:[printf_number_buffer] from printf_number_buffer::@2 + printf_number_buffer::format_justify_left#16 = phi( printf_number_buffer::@2/printf_number_buffer::format_justify_left#15 ) + printf_number_buffer::buffer_digits#10 = phi( printf_number_buffer::@2/printf_number_buffer::buffer_digits#9 ) + printf_number_buffer::format_upper_case#5 = phi( printf_number_buffer::@2/printf_number_buffer::format_upper_case#4 ) + printf_number_buffer::padding#10 = phi( printf_number_buffer::@2/printf_number_buffer::padding#9 ) + printf_number_buffer::format_zero_padding#8 = phi( printf_number_buffer::@2/printf_number_buffer::format_zero_padding#7 ) + printf_number_buffer::putc#2 = phi( printf_number_buffer::@2/printf_number_buffer::putc#7 ) + printf_number_buffer::buffer_sign#3 = phi( printf_number_buffer::@2/printf_number_buffer::buffer_sign#2 ) + stackpush(char) = printf_number_buffer::buffer_sign#3 + callexecute *printf_number_buffer::putc#2 + sideeffect stackpullbytes(1) + to:printf_number_buffer::@3 +printf_number_buffer::@4: scope:[printf_number_buffer] from printf_number_buffer::@17 printf_number_buffer::@3 + printf_number_buffer::padding#14 = phi( printf_number_buffer::@17/printf_number_buffer::padding#15, printf_number_buffer::@3/printf_number_buffer::padding#5 ) + printf_number_buffer::format_justify_left#10 = phi( printf_number_buffer::@17/printf_number_buffer::format_justify_left#12, printf_number_buffer::@3/printf_number_buffer::format_justify_left#13 ) + printf_number_buffer::format_zero_padding#14 = phi( printf_number_buffer::@17/printf_number_buffer::format_zero_padding#17, printf_number_buffer::@3/printf_number_buffer::format_zero_padding#2 ) + printf_number_buffer::buffer_digits#6 = phi( printf_number_buffer::@17/printf_number_buffer::buffer_digits#7, printf_number_buffer::@3/printf_number_buffer::buffer_digits#8 ) + printf_number_buffer::putc#10 = phi( printf_number_buffer::@17/printf_number_buffer::putc#16, printf_number_buffer::@3/printf_number_buffer::putc#8 ) + printf_number_buffer::format_upper_case#1 = phi( printf_number_buffer::@17/printf_number_buffer::format_upper_case#2, printf_number_buffer::@3/printf_number_buffer::format_upper_case#3 ) + printf_number_buffer::$31 = 0 != printf_number_buffer::format_upper_case#1 + printf_number_buffer::$12 = ! printf_number_buffer::$31 + if(printf_number_buffer::$12) goto printf_number_buffer::@5 + to:printf_number_buffer::@11 +printf_number_buffer::@10: scope:[printf_number_buffer] from printf_number_buffer::@3 + printf_number_buffer::format_justify_left#17 = phi( printf_number_buffer::@3/printf_number_buffer::format_justify_left#13 ) + printf_number_buffer::format_zero_padding#19 = phi( printf_number_buffer::@3/printf_number_buffer::format_zero_padding#2 ) + printf_number_buffer::buffer_digits#11 = phi( printf_number_buffer::@3/printf_number_buffer::buffer_digits#8 ) + printf_number_buffer::format_upper_case#6 = phi( printf_number_buffer::@3/printf_number_buffer::format_upper_case#3 ) + printf_number_buffer::padding#6 = phi( printf_number_buffer::@3/printf_number_buffer::padding#5 ) + printf_number_buffer::putc#3 = phi( printf_number_buffer::@3/printf_number_buffer::putc#8 ) + printf_padding::putc#1 = printf_number_buffer::putc#3 + printf_padding::pad#1 = '0' + printf_padding::length#1 = (char)printf_number_buffer::padding#6 + call printf_padding + to:printf_number_buffer::@17 +printf_number_buffer::@17: scope:[printf_number_buffer] from printf_number_buffer::@10 + printf_number_buffer::padding#15 = phi( printf_number_buffer::@10/printf_number_buffer::padding#6 ) + printf_number_buffer::format_justify_left#12 = phi( printf_number_buffer::@10/printf_number_buffer::format_justify_left#17 ) + printf_number_buffer::format_zero_padding#17 = phi( printf_number_buffer::@10/printf_number_buffer::format_zero_padding#19 ) + printf_number_buffer::buffer_digits#7 = phi( printf_number_buffer::@10/printf_number_buffer::buffer_digits#11 ) + printf_number_buffer::putc#16 = phi( printf_number_buffer::@10/printf_number_buffer::putc#3 ) + printf_number_buffer::format_upper_case#2 = phi( printf_number_buffer::@10/printf_number_buffer::format_upper_case#6 ) + to:printf_number_buffer::@4 +printf_number_buffer::@5: scope:[printf_number_buffer] from printf_number_buffer::@19 printf_number_buffer::@4 + printf_number_buffer::padding#11 = phi( printf_number_buffer::@19/printf_number_buffer::padding#13, printf_number_buffer::@4/printf_number_buffer::padding#14 ) + printf_number_buffer::format_justify_left#6 = phi( printf_number_buffer::@19/printf_number_buffer::format_justify_left#9, printf_number_buffer::@4/printf_number_buffer::format_justify_left#10 ) + printf_number_buffer::format_zero_padding#9 = phi( printf_number_buffer::@19/printf_number_buffer::format_zero_padding#13, printf_number_buffer::@4/printf_number_buffer::format_zero_padding#14 ) + printf_number_buffer::buffer_digits#2 = phi( printf_number_buffer::@19/printf_number_buffer::buffer_digits#5, printf_number_buffer::@4/printf_number_buffer::buffer_digits#6 ) + printf_number_buffer::putc#4 = phi( printf_number_buffer::@19/printf_number_buffer::putc#9, printf_number_buffer::@4/printf_number_buffer::putc#10 ) + printf_str::putc#0 = printf_number_buffer::putc#4 + printf_str::s#1 = printf_number_buffer::buffer_digits#2 + call printf_str + to:printf_number_buffer::@18 +printf_number_buffer::@18: scope:[printf_number_buffer] from printf_number_buffer::@5 + printf_number_buffer::putc#11 = phi( printf_number_buffer::@5/printf_number_buffer::putc#4 ) + printf_number_buffer::padding#7 = phi( printf_number_buffer::@5/printf_number_buffer::padding#11 ) + printf_number_buffer::format_justify_left#2 = phi( printf_number_buffer::@5/printf_number_buffer::format_justify_left#6 ) + printf_number_buffer::format_zero_padding#3 = phi( printf_number_buffer::@5/printf_number_buffer::format_zero_padding#9 ) + printf_number_buffer::$32 = 0 != printf_number_buffer::format_zero_padding#3 + printf_number_buffer::$14 = ! printf_number_buffer::$32 + printf_number_buffer::$15 = printf_number_buffer::format_justify_left#2 && printf_number_buffer::$14 + printf_number_buffer::$16 = printf_number_buffer::$15 && printf_number_buffer::padding#7 + printf_number_buffer::$17 = ! printf_number_buffer::$16 + if(printf_number_buffer::$17) goto printf_number_buffer::@return + to:printf_number_buffer::@12 +printf_number_buffer::@11: scope:[printf_number_buffer] from printf_number_buffer::@4 + printf_number_buffer::padding#16 = phi( printf_number_buffer::@4/printf_number_buffer::padding#14 ) + printf_number_buffer::format_justify_left#14 = phi( printf_number_buffer::@4/printf_number_buffer::format_justify_left#10 ) + printf_number_buffer::format_zero_padding#18 = phi( printf_number_buffer::@4/printf_number_buffer::format_zero_padding#14 ) + printf_number_buffer::putc#17 = phi( printf_number_buffer::@4/printf_number_buffer::putc#10 ) + printf_number_buffer::buffer_digits#3 = phi( printf_number_buffer::@4/printf_number_buffer::buffer_digits#6 ) + strupr::str#0 = printf_number_buffer::buffer_digits#3 + call strupr + strupr::return#2 = strupr::return#1 + to:printf_number_buffer::@19 +printf_number_buffer::@19: scope:[printf_number_buffer] from printf_number_buffer::@11 + printf_number_buffer::padding#13 = phi( printf_number_buffer::@11/printf_number_buffer::padding#16 ) + printf_number_buffer::format_justify_left#9 = phi( printf_number_buffer::@11/printf_number_buffer::format_justify_left#14 ) + printf_number_buffer::format_zero_padding#13 = phi( printf_number_buffer::@11/printf_number_buffer::format_zero_padding#18 ) + printf_number_buffer::buffer_digits#5 = phi( printf_number_buffer::@11/printf_number_buffer::buffer_digits#3 ) + printf_number_buffer::putc#9 = phi( printf_number_buffer::@11/printf_number_buffer::putc#17 ) + to:printf_number_buffer::@5 +printf_number_buffer::@12: scope:[printf_number_buffer] from printf_number_buffer::@18 + printf_number_buffer::padding#8 = phi( printf_number_buffer::@18/printf_number_buffer::padding#7 ) + printf_number_buffer::putc#5 = phi( printf_number_buffer::@18/printf_number_buffer::putc#11 ) + printf_padding::putc#2 = printf_number_buffer::putc#5 + printf_padding::pad#2 = ' ' + printf_padding::length#2 = (char)printf_number_buffer::padding#8 + call printf_padding + to:printf_number_buffer::@20 +printf_number_buffer::@20: scope:[printf_number_buffer] from printf_number_buffer::@12 + to:printf_number_buffer::@return +printf_number_buffer::@return: scope:[printf_number_buffer] from printf_number_buffer::@18 printf_number_buffer::@20 + return + to:@return + +int main() +main: scope:[main] from __start::@1 + main::toD0181_screen#0 = DEFAULT_SCREEN + main::toD0181_gfx#0 = DEFAULT_FONT_MIXED + to:main::toD0181 +main::toD0181: scope:[main] from main + main::toD0181_gfx#1 = phi( main/main::toD0181_gfx#0 ) + main::toD0181_screen#1 = phi( main/main::toD0181_screen#0 ) + main::toD0181_$7 = (unsigned int)main::toD0181_screen#1 + main::toD0181_$0 = main::toD0181_$7 & $3fff + main::toD0181_$1 = main::toD0181_$0 * 4 + main::toD0181_$2 = byte1 main::toD0181_$1 + main::toD0181_$3 = byte1 (unsigned int)main::toD0181_gfx#1 + main::toD0181_$4 = main::toD0181_$3 / 4 + main::toD0181_$5 = main::toD0181_$4 & $f + main::toD0181_$6 = main::toD0181_$2 | main::toD0181_$5 + main::toD0181_return#0 = main::toD0181_$6 + to:main::toD0181_@return +main::toD0181_@return: scope:[main] from main::toD0181 + main::toD0181_return#2 = phi( main::toD0181/main::toD0181_return#0 ) + main::toD0181_return#1 = main::toD0181_return#2 + to:main::@3 +main::@3: scope:[main] from main::toD0181_@return + main::toD0181_return#3 = phi( main::toD0181_@return/main::toD0181_return#1 ) + main::$0 = main::toD0181_return#3 + *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = main::$0 + call clrscr + to:main::@4 +main::@4: scope:[main] from main::@3 + main::current#0 = 0 + to:main::@1 +main::@1: scope:[main] from main::@10 main::@4 main::@5 + main::current#3 = phi( main::@10/main::current#1, main::@4/main::current#0, main::@5/main::current#2 ) + call GETIN + GETIN::return#0 = GETIN::return#2 + to:main::@5 +main::@5: scope:[main] from main::@1 + main::current#2 = phi( main::@1/main::current#3 ) + GETIN::return#3 = phi( main::@1/GETIN::return#0 ) + main::ch#0 = GETIN::return#3 + main::$3 = main::ch#0 != main::current#2 + main::$4 = main::ch#0 && main::$3 + main::$5 = ! main::$4 + if(main::$5) goto main::@1 + to:main::@2 +main::@2: scope:[main] from main::@5 + main::ch#1 = phi( main::@5/main::ch#0 ) + petscii_to_screencode::petscii#0 = main::ch#1 + call petscii_to_screencode + petscii_to_screencode::return#0 = petscii_to_screencode::return#8 + to:main::@6 +main::@6: scope:[main] from main::@2 + main::ch#6 = phi( main::@2/main::ch#1 ) + petscii_to_screencode::return#9 = phi( main::@2/petscii_to_screencode::return#0 ) + main::$6 = petscii_to_screencode::return#9 + printf_str::putc#1 = &cputc + printf_str::s#2 = main::s + call printf_str + to:main::@7 +main::@7: scope:[main] from main::@6 + main::ch#4 = phi( main::@6/main::ch#6 ) + stackpush(char) = main::$6 + callexecute cputc + sideeffect stackpullbytes(1) + printf_str::putc#2 = &cputc + printf_str::s#3 = main::s1 + call printf_str + to:main::@8 +main::@8: scope:[main] from main::@7 + main::ch#2 = phi( main::@7/main::ch#4 ) + printf_uchar::putc#0 = &cputc + printf_uchar::uvalue#0 = main::ch#2 + printf_uchar::format_min_length#0 = 2 + printf_uchar::format_justify_left#0 = 0 + printf_uchar::format_sign_always#0 = 0 + printf_uchar::format_zero_padding#0 = 0 + printf_uchar::format_upper_case#0 = 0 + printf_uchar::format_radix#0 = HEXADECIMAL + call printf_uchar + to:main::@9 +main::@9: scope:[main] from main::@8 + main::ch#5 = phi( main::@8/main::ch#2 ) + printf_str::putc#3 = &cputc + printf_str::s#4 = main::s2 + call printf_str + to:main::@10 +main::@10: scope:[main] from main::@9 + main::ch#3 = phi( main::@9/main::ch#5 ) + main::current#1 = main::ch#3 + to:main::@1 +main::@return: scope:[main] from + main::return#2 = phi( ) + main::return#0 = main::return#2 + return + to:@return + +char petscii_to_screencode(char petscii) +petscii_to_screencode: scope:[petscii_to_screencode] from main::@2 + petscii_to_screencode::petscii#1 = phi( main::@2/petscii_to_screencode::petscii#0 ) + petscii_to_screencode::$0 = petscii_to_screencode::petscii#1 < $20 + if(petscii_to_screencode::$0) goto petscii_to_screencode::@1 + to:petscii_to_screencode::@7 +petscii_to_screencode::@1: scope:[petscii_to_screencode] from petscii_to_screencode + petscii_to_screencode::petscii#2 = phi( petscii_to_screencode/petscii_to_screencode::petscii#1 ) + petscii_to_screencode::$10 = petscii_to_screencode::petscii#2 + $80 + petscii_to_screencode::return#1 = petscii_to_screencode::$10 + to:petscii_to_screencode::@return +petscii_to_screencode::@7: scope:[petscii_to_screencode] from petscii_to_screencode + petscii_to_screencode::petscii#3 = phi( petscii_to_screencode/petscii_to_screencode::petscii#1 ) + petscii_to_screencode::$1 = petscii_to_screencode::petscii#3 < $40 + if(petscii_to_screencode::$1) goto petscii_to_screencode::@2 + to:petscii_to_screencode::@8 +petscii_to_screencode::@2: scope:[petscii_to_screencode] from petscii_to_screencode::@7 + petscii_to_screencode::petscii#4 = phi( petscii_to_screencode::@7/petscii_to_screencode::petscii#3 ) + petscii_to_screencode::return#2 = petscii_to_screencode::petscii#4 + to:petscii_to_screencode::@return +petscii_to_screencode::@8: scope:[petscii_to_screencode] from petscii_to_screencode::@7 + petscii_to_screencode::petscii#5 = phi( petscii_to_screencode::@7/petscii_to_screencode::petscii#3 ) + petscii_to_screencode::$2 = petscii_to_screencode::petscii#5 < $60 + if(petscii_to_screencode::$2) goto petscii_to_screencode::@3 + to:petscii_to_screencode::@9 +petscii_to_screencode::@3: scope:[petscii_to_screencode] from petscii_to_screencode::@8 + petscii_to_screencode::petscii#6 = phi( petscii_to_screencode::@8/petscii_to_screencode::petscii#5 ) + petscii_to_screencode::$9 = petscii_to_screencode::petscii#6 - $40 + petscii_to_screencode::return#3 = petscii_to_screencode::$9 + to:petscii_to_screencode::@return +petscii_to_screencode::@9: scope:[petscii_to_screencode] from petscii_to_screencode::@8 + petscii_to_screencode::petscii#7 = phi( petscii_to_screencode::@8/petscii_to_screencode::petscii#5 ) + petscii_to_screencode::$3 = petscii_to_screencode::petscii#7 < $80 + if(petscii_to_screencode::$3) goto petscii_to_screencode::@4 + to:petscii_to_screencode::@10 +petscii_to_screencode::@4: scope:[petscii_to_screencode] from petscii_to_screencode::@9 + petscii_to_screencode::petscii#8 = phi( petscii_to_screencode::@9/petscii_to_screencode::petscii#7 ) + petscii_to_screencode::$8 = petscii_to_screencode::petscii#8 - $20 + petscii_to_screencode::return#4 = petscii_to_screencode::$8 + to:petscii_to_screencode::@return +petscii_to_screencode::@10: scope:[petscii_to_screencode] from petscii_to_screencode::@9 + petscii_to_screencode::petscii#9 = phi( petscii_to_screencode::@9/petscii_to_screencode::petscii#7 ) + petscii_to_screencode::$4 = petscii_to_screencode::petscii#9 < $a0 + if(petscii_to_screencode::$4) goto petscii_to_screencode::@5 + to:petscii_to_screencode::@11 +petscii_to_screencode::@5: scope:[petscii_to_screencode] from petscii_to_screencode::@10 + petscii_to_screencode::petscii#10 = phi( petscii_to_screencode::@10/petscii_to_screencode::petscii#9 ) + petscii_to_screencode::$7 = petscii_to_screencode::petscii#10 + $40 + petscii_to_screencode::return#5 = petscii_to_screencode::$7 + to:petscii_to_screencode::@return +petscii_to_screencode::@11: scope:[petscii_to_screencode] from petscii_to_screencode::@10 + petscii_to_screencode::petscii#11 = phi( petscii_to_screencode::@10/petscii_to_screencode::petscii#9 ) + petscii_to_screencode::$5 = petscii_to_screencode::petscii#11 < $ff + if(petscii_to_screencode::$5) goto petscii_to_screencode::@6 + to:petscii_to_screencode::@12 +petscii_to_screencode::@6: scope:[petscii_to_screencode] from petscii_to_screencode::@11 + petscii_to_screencode::petscii#12 = phi( petscii_to_screencode::@11/petscii_to_screencode::petscii#11 ) + petscii_to_screencode::$6 = petscii_to_screencode::petscii#12 - $80 + petscii_to_screencode::return#6 = petscii_to_screencode::$6 + to:petscii_to_screencode::@return +petscii_to_screencode::@12: scope:[petscii_to_screencode] from petscii_to_screencode::@11 + petscii_to_screencode::return#7 = $5e + to:petscii_to_screencode::@return +petscii_to_screencode::@return: scope:[petscii_to_screencode] from petscii_to_screencode::@1 petscii_to_screencode::@12 petscii_to_screencode::@2 petscii_to_screencode::@3 petscii_to_screencode::@4 petscii_to_screencode::@5 petscii_to_screencode::@6 + petscii_to_screencode::return#10 = phi( petscii_to_screencode::@1/petscii_to_screencode::return#1, petscii_to_screencode::@12/petscii_to_screencode::return#7, petscii_to_screencode::@2/petscii_to_screencode::return#2, petscii_to_screencode::@3/petscii_to_screencode::return#3, petscii_to_screencode::@4/petscii_to_screencode::return#4, petscii_to_screencode::@5/petscii_to_screencode::return#5, petscii_to_screencode::@6/petscii_to_screencode::return#6 ) + petscii_to_screencode::return#8 = petscii_to_screencode::return#10 + return + to:@return + +char GETIN() +GETIN: scope:[GETIN] from main::@1 + asm { jsr$ffe4 stach } + GETIN::return#1 = *GETIN::ch + to:GETIN::@return +GETIN::@return: scope:[GETIN] from GETIN + GETIN::return#4 = phi( GETIN/GETIN::return#1 ) + GETIN::return#2 = GETIN::return#4 + return + to:@return + +void __start() +__start: scope:[__start] from + to:__start::__init1 +__start::__init1: scope:[__start] from __start + conio_line_text = CONIO_SCREEN_TEXT + conio_line_color = CONIO_SCREEN_COLORS + call conio_c64_init + to:__start::@2 +__start::@2: scope:[__start] from __start::__init1 + to:__start::@1 +__start::@1: scope:[__start] from __start::@2 + call main + main::return#1 = main::return#0 + to:__start::@3 +__start::@3: scope:[__start] from __start::@1 + to:__start::@return +__start::@return: scope:[__start] from __start::@3 + return + to:@return + +SYMBOL TABLE SSA +__constant char BINARY = 2 +__constant char * const COLORRAM = (char *)$d800 +__constant char * const CONIO_SCREEN_COLORS = COLORRAM +__constant char * const CONIO_SCREEN_TEXT = DEFAULT_SCREEN +__constant const char CONIO_TEXTCOLOR_DEFAULT = LIGHT_BLUE +__constant char DECIMAL = $a +__constant char * const DEFAULT_FONT_MIXED = (char *)$1800 +__constant char * const DEFAULT_SCREEN = (char *)$400 +__constant char DIGITS[] = "0123456789abcdef"z +char GETIN() +__constant char * const GETIN::ch = (char *)$ff +char GETIN::return +char GETIN::return#0 +char GETIN::return#1 +char GETIN::return#2 +char GETIN::return#3 +char GETIN::return#4 +__constant char HEXADECIMAL = $10 +__constant const char LIGHT_BLUE = $e +__constant char OCTAL = 8 +__constant char OFFSET_STRUCT_MOS6569_VICII_MEMORY = $18 +__constant char OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS = 1 +__constant char OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_SIGN = 0 +__constant char RADIX::BINARY = 2 +__constant char RADIX::DECIMAL = $a +__constant char RADIX::HEXADECIMAL = $10 +__constant char RADIX::OCTAL = 8 +__constant char RADIX_BINARY_VALUES_CHAR[] = { $80, $40, $20, $10, 8, 4, 2 } +__constant char RADIX_DECIMAL_VALUES_CHAR[] = { $64, $a } +__constant char RADIX_HEXADECIMAL_VALUES_CHAR[] = { $10 } +__constant char RADIX_OCTAL_VALUES_CHAR[] = { $40, 8 } +__constant unsigned int STACK_BASE = $103 +__constant struct MOS6569_VICII * const VICII = (struct MOS6569_VICII *)$d000 +void __start() +void clrscr() +bool clrscr::$0 +bool clrscr::$1 +char clrscr::c +char clrscr::c#0 +char clrscr::c#1 +char clrscr::c#2 +char clrscr::c#3 +char clrscr::l +char clrscr::l#0 +char clrscr::l#1 +char clrscr::l#2 +char clrscr::l#3 +char clrscr::l#4 +char clrscr::l#5 +char clrscr::l#6 +char *clrscr::line_cols +char *clrscr::line_cols#0 +char *clrscr::line_cols#1 +char *clrscr::line_cols#2 +char *clrscr::line_cols#3 +char *clrscr::line_cols#4 +char *clrscr::line_cols#5 +char *clrscr::line_cols#6 +char *clrscr::line_text +char *clrscr::line_text#0 +char *clrscr::line_text#1 +char *clrscr::line_text#2 +char *clrscr::line_text#3 +char *clrscr::line_text#4 +char *clrscr::line_text#5 +char *clrscr::line_text#6 +void conio_c64_init() +bool conio_c64_init::$0 +bool conio_c64_init::$1 +__constant char * const conio_c64_init::BASIC_CURSOR_LINE = (char *)$d6 +char conio_c64_init::line +char conio_c64_init::line#0 +char conio_c64_init::line#1 +char conio_c64_init::line#2 +__loadstore char conio_cursor_x = 0 +__loadstore char conio_cursor_y = 0 +__loadstore char *conio_line_color +__loadstore char *conio_line_text +__loadstore char conio_scroll_enable = 1 +__loadstore char conio_textcolor = CONIO_TEXTCOLOR_DEFAULT +__stackcall void cputc(char c) +bool cputc::$0 +bool cputc::$1 +bool cputc::$2 +__constant char cputc::OFFSET_STACK_C = 0 +char cputc::c +char cputc::c#0 +char cputc::c#1 +void cputln() +void cscroll() +bool cscroll::$0 +bool cscroll::$1 +bool cscroll::$7 +void gotoxy(char x , char y) +bool gotoxy::$0 +bool gotoxy::$1 +bool gotoxy::$2 +bool gotoxy::$3 +char *gotoxy::$5 +char *gotoxy::$6 +unsigned int gotoxy::$7 +unsigned int gotoxy::line_offset +unsigned int gotoxy::line_offset#0 +char gotoxy::x +char gotoxy::x#0 +char gotoxy::x#1 +char gotoxy::x#2 +char gotoxy::x#3 +char gotoxy::x#4 +char gotoxy::x#5 +char gotoxy::x#6 +char gotoxy::y +char gotoxy::y#0 +char gotoxy::y#1 +char gotoxy::y#2 +char gotoxy::y#3 +char gotoxy::y#4 +char gotoxy::y#5 +char gotoxy::y#6 +int main() +char main::$0 +bool main::$3 +bool main::$4 +bool main::$5 +char main::$6 +char main::ch +char main::ch#0 +char main::ch#1 +char main::ch#2 +char main::ch#3 +char main::ch#4 +char main::ch#5 +char main::ch#6 +char main::current +char main::current#0 +char main::current#1 +char main::current#2 +char main::current#3 +int main::return +int main::return#0 +int main::return#1 +int main::return#2 +__constant char main::s[2] = "'" +__constant char main::s1[4] = "'($" +__constant char main::s2[3] = ") " +number main::toD0181_$0 +number main::toD0181_$1 +char main::toD0181_$2 +char main::toD0181_$3 +number main::toD0181_$4 +number main::toD0181_$5 +number main::toD0181_$6 +unsigned int main::toD0181_$7 +char *main::toD0181_gfx +char *main::toD0181_gfx#0 +char *main::toD0181_gfx#1 +char main::toD0181_return +char main::toD0181_return#0 +char main::toD0181_return#1 +char main::toD0181_return#2 +char main::toD0181_return#3 +char *main::toD0181_screen +char *main::toD0181_screen#0 +char *main::toD0181_screen#1 +void * memcpy(void *destination , void *source , unsigned int num) +bool memcpy::$1 +char *memcpy::$2 +void *memcpy::destination +void *memcpy::destination#0 +void *memcpy::destination#1 +void *memcpy::destination#2 +void *memcpy::destination#3 +void *memcpy::destination#4 +void *memcpy::destination#5 +char *memcpy::dst +char *memcpy::dst#0 +char *memcpy::dst#1 +char *memcpy::dst#2 +char *memcpy::dst#3 +unsigned int memcpy::num +unsigned int memcpy::num#0 +unsigned int memcpy::num#1 +unsigned int memcpy::num#2 +void *memcpy::return +void *memcpy::return#0 +void *memcpy::return#1 +void *memcpy::return#2 +void *memcpy::return#3 +void *memcpy::return#4 +void *memcpy::source +void *memcpy::source#0 +void *memcpy::source#1 +void *memcpy::source#2 +char *memcpy::src +char *memcpy::src#0 +char *memcpy::src#1 +char *memcpy::src#2 +char *memcpy::src#3 +char *memcpy::src_end +char *memcpy::src_end#0 +char *memcpy::src_end#1 +char *memcpy::src_end#2 +void * memset(void *str , char c , unsigned int num) +bool memset::$0 +bool memset::$1 +bool memset::$3 +char *memset::$4 +char memset::c +char memset::c#0 +char memset::c#1 +char memset::c#2 +char memset::c#3 +char memset::c#4 +char memset::c#5 +char *memset::dst +char *memset::dst#0 +char *memset::dst#1 +char *memset::dst#2 +char *memset::dst#3 +char *memset::end +char *memset::end#0 +char *memset::end#1 +char *memset::end#2 +unsigned int memset::num +unsigned int memset::num#0 +unsigned int memset::num#1 +unsigned int memset::num#2 +unsigned int memset::num#3 +void *memset::return +void *memset::return#0 +void *memset::return#1 +void *memset::return#2 +void *memset::return#3 +void *memset::return#4 +void *memset::str +void *memset::str#0 +void *memset::str#1 +void *memset::str#2 +void *memset::str#3 +void *memset::str#4 +void *memset::str#5 +void *memset::str#6 +char petscii_to_screencode(char petscii) +bool petscii_to_screencode::$0 +bool petscii_to_screencode::$1 +number petscii_to_screencode::$10 +bool petscii_to_screencode::$2 +bool petscii_to_screencode::$3 +bool petscii_to_screencode::$4 +bool petscii_to_screencode::$5 +number petscii_to_screencode::$6 +number petscii_to_screencode::$7 +number petscii_to_screencode::$8 +number petscii_to_screencode::$9 +char petscii_to_screencode::petscii +char petscii_to_screencode::petscii#0 +char petscii_to_screencode::petscii#1 +char petscii_to_screencode::petscii#10 +char petscii_to_screencode::petscii#11 +char petscii_to_screencode::petscii#12 +char petscii_to_screencode::petscii#2 +char petscii_to_screencode::petscii#3 +char petscii_to_screencode::petscii#4 +char petscii_to_screencode::petscii#5 +char petscii_to_screencode::petscii#6 +char petscii_to_screencode::petscii#7 +char petscii_to_screencode::petscii#8 +char petscii_to_screencode::petscii#9 +char petscii_to_screencode::return +char petscii_to_screencode::return#0 +char petscii_to_screencode::return#1 +char petscii_to_screencode::return#10 +char petscii_to_screencode::return#2 +char petscii_to_screencode::return#3 +char petscii_to_screencode::return#4 +char petscii_to_screencode::return#5 +char petscii_to_screencode::return#6 +char petscii_to_screencode::return#7 +char petscii_to_screencode::return#8 +char petscii_to_screencode::return#9 +__loadstore struct printf_buffer_number printf_buffer = {} +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) +bool printf_number_buffer::$0 +bool printf_number_buffer::$1 +bool printf_number_buffer::$10 +bool printf_number_buffer::$12 +bool printf_number_buffer::$14 +bool printf_number_buffer::$15 +bool printf_number_buffer::$16 +bool printf_number_buffer::$17 +unsigned int printf_number_buffer::$19 +bool printf_number_buffer::$2 +bool printf_number_buffer::$20 +signed char printf_number_buffer::$21 +bool printf_number_buffer::$22 +bool printf_number_buffer::$23 +signed char printf_number_buffer::$25 +bool printf_number_buffer::$26 +bool printf_number_buffer::$27 +bool printf_number_buffer::$28 +bool printf_number_buffer::$29 +bool printf_number_buffer::$3 +bool printf_number_buffer::$30 +bool printf_number_buffer::$31 +bool printf_number_buffer::$32 +bool printf_number_buffer::$4 +bool printf_number_buffer::$5 +bool printf_number_buffer::$7 +bool printf_number_buffer::$9 +struct printf_buffer_number printf_number_buffer::buffer +char *printf_number_buffer::buffer_digits +char *printf_number_buffer::buffer_digits#0 +char *printf_number_buffer::buffer_digits#1 +char *printf_number_buffer::buffer_digits#10 +char *printf_number_buffer::buffer_digits#11 +char *printf_number_buffer::buffer_digits#12 +char *printf_number_buffer::buffer_digits#13 +char *printf_number_buffer::buffer_digits#14 +char *printf_number_buffer::buffer_digits#15 +char *printf_number_buffer::buffer_digits#16 +char *printf_number_buffer::buffer_digits#17 +char *printf_number_buffer::buffer_digits#18 +char *printf_number_buffer::buffer_digits#2 +char *printf_number_buffer::buffer_digits#3 +char *printf_number_buffer::buffer_digits#4 +char *printf_number_buffer::buffer_digits#5 +char *printf_number_buffer::buffer_digits#6 +char *printf_number_buffer::buffer_digits#7 +char *printf_number_buffer::buffer_digits#8 +char *printf_number_buffer::buffer_digits#9 +char printf_number_buffer::buffer_sign +char printf_number_buffer::buffer_sign#0 +char printf_number_buffer::buffer_sign#1 +char printf_number_buffer::buffer_sign#10 +char printf_number_buffer::buffer_sign#11 +char printf_number_buffer::buffer_sign#2 +char printf_number_buffer::buffer_sign#3 +char printf_number_buffer::buffer_sign#4 +char printf_number_buffer::buffer_sign#5 +char printf_number_buffer::buffer_sign#6 +char printf_number_buffer::buffer_sign#7 +char printf_number_buffer::buffer_sign#8 +char printf_number_buffer::buffer_sign#9 +struct printf_format_number printf_number_buffer::format +char printf_number_buffer::format_justify_left +char printf_number_buffer::format_justify_left#0 +char printf_number_buffer::format_justify_left#1 +char printf_number_buffer::format_justify_left#10 +char printf_number_buffer::format_justify_left#11 +char printf_number_buffer::format_justify_left#12 +char printf_number_buffer::format_justify_left#13 +char printf_number_buffer::format_justify_left#14 +char printf_number_buffer::format_justify_left#15 +char printf_number_buffer::format_justify_left#16 +char printf_number_buffer::format_justify_left#17 +char printf_number_buffer::format_justify_left#18 +char printf_number_buffer::format_justify_left#19 +char printf_number_buffer::format_justify_left#2 +char printf_number_buffer::format_justify_left#3 +char printf_number_buffer::format_justify_left#4 +char printf_number_buffer::format_justify_left#5 +char printf_number_buffer::format_justify_left#6 +char printf_number_buffer::format_justify_left#7 +char printf_number_buffer::format_justify_left#8 +char printf_number_buffer::format_justify_left#9 +char printf_number_buffer::format_min_length +char printf_number_buffer::format_min_length#0 +char printf_number_buffer::format_min_length#1 +char printf_number_buffer::format_min_length#2 +char printf_number_buffer::format_min_length#3 +char printf_number_buffer::format_min_length#4 +char printf_number_buffer::format_min_length#5 +char printf_number_buffer::format_radix +char printf_number_buffer::format_radix#0 +char printf_number_buffer::format_sign_always +char printf_number_buffer::format_sign_always#0 +char printf_number_buffer::format_upper_case +char printf_number_buffer::format_upper_case#0 +char printf_number_buffer::format_upper_case#1 +char printf_number_buffer::format_upper_case#10 +char printf_number_buffer::format_upper_case#11 +char printf_number_buffer::format_upper_case#12 +char printf_number_buffer::format_upper_case#13 +char printf_number_buffer::format_upper_case#14 +char printf_number_buffer::format_upper_case#15 +char printf_number_buffer::format_upper_case#2 +char printf_number_buffer::format_upper_case#3 +char printf_number_buffer::format_upper_case#4 +char printf_number_buffer::format_upper_case#5 +char printf_number_buffer::format_upper_case#6 +char printf_number_buffer::format_upper_case#7 +char printf_number_buffer::format_upper_case#8 +char printf_number_buffer::format_upper_case#9 +char printf_number_buffer::format_zero_padding +char printf_number_buffer::format_zero_padding#0 +char printf_number_buffer::format_zero_padding#1 +char printf_number_buffer::format_zero_padding#10 +char printf_number_buffer::format_zero_padding#11 +char printf_number_buffer::format_zero_padding#12 +char printf_number_buffer::format_zero_padding#13 +char printf_number_buffer::format_zero_padding#14 +char printf_number_buffer::format_zero_padding#15 +char printf_number_buffer::format_zero_padding#16 +char printf_number_buffer::format_zero_padding#17 +char printf_number_buffer::format_zero_padding#18 +char printf_number_buffer::format_zero_padding#19 +char printf_number_buffer::format_zero_padding#2 +char printf_number_buffer::format_zero_padding#3 +char printf_number_buffer::format_zero_padding#4 +char printf_number_buffer::format_zero_padding#5 +char printf_number_buffer::format_zero_padding#6 +char printf_number_buffer::format_zero_padding#7 +char printf_number_buffer::format_zero_padding#8 +char printf_number_buffer::format_zero_padding#9 +signed char printf_number_buffer::len +signed char printf_number_buffer::len#0 +signed char printf_number_buffer::len#1 +signed char printf_number_buffer::len#2 +signed char printf_number_buffer::len#3 +signed char printf_number_buffer::padding +signed char printf_number_buffer::padding#0 +signed char printf_number_buffer::padding#1 +signed char printf_number_buffer::padding#10 +signed char printf_number_buffer::padding#11 +signed char printf_number_buffer::padding#12 +signed char printf_number_buffer::padding#13 +signed char printf_number_buffer::padding#14 +signed char printf_number_buffer::padding#15 +signed char printf_number_buffer::padding#16 +signed char printf_number_buffer::padding#2 +signed char printf_number_buffer::padding#3 +signed char printf_number_buffer::padding#4 +signed char printf_number_buffer::padding#5 +signed char printf_number_buffer::padding#6 +signed char printf_number_buffer::padding#7 +signed char printf_number_buffer::padding#8 +signed char printf_number_buffer::padding#9 +void (*printf_number_buffer::putc)(char) +void (*printf_number_buffer::putc#0)(char) +void (*printf_number_buffer::putc#1)(char) +void (*printf_number_buffer::putc#10)(char) +void (*printf_number_buffer::putc#11)(char) +void (*printf_number_buffer::putc#12)(char) +void (*printf_number_buffer::putc#13)(char) +void (*printf_number_buffer::putc#14)(char) +void (*printf_number_buffer::putc#15)(char) +void (*printf_number_buffer::putc#16)(char) +void (*printf_number_buffer::putc#17)(char) +void (*printf_number_buffer::putc#18)(char) +void (*printf_number_buffer::putc#19)(char) +void (*printf_number_buffer::putc#2)(char) +void (*printf_number_buffer::putc#20)(char) +void (*printf_number_buffer::putc#3)(char) +void (*printf_number_buffer::putc#4)(char) +void (*printf_number_buffer::putc#5)(char) +void (*printf_number_buffer::putc#6)(char) +void (*printf_number_buffer::putc#7)(char) +void (*printf_number_buffer::putc#8)(char) +void (*printf_number_buffer::putc#9)(char) +void printf_padding(void (*putc)(char) , char pad , char length) +bool printf_padding::$0 +char printf_padding::i +char printf_padding::i#0 +char printf_padding::i#1 +char printf_padding::i#2 +char printf_padding::i#3 +char printf_padding::i#4 +char printf_padding::length +char printf_padding::length#0 +char printf_padding::length#1 +char printf_padding::length#2 +char printf_padding::length#3 +char printf_padding::length#4 +char printf_padding::length#5 +char printf_padding::length#6 +char printf_padding::pad +char printf_padding::pad#0 +char printf_padding::pad#1 +char printf_padding::pad#2 +char printf_padding::pad#3 +char printf_padding::pad#4 +char printf_padding::pad#5 +char printf_padding::pad#6 +void (*printf_padding::putc)(char) +void (*printf_padding::putc#0)(char) +void (*printf_padding::putc#1)(char) +void (*printf_padding::putc#2)(char) +void (*printf_padding::putc#3)(char) +void (*printf_padding::putc#4)(char) +void (*printf_padding::putc#5)(char) +void (*printf_padding::putc#6)(char) +void printf_str(void (*putc)(char) , const char *s) +char printf_str::$0 +bool printf_str::$2 +char printf_str::c +char printf_str::c#0 +char printf_str::c#1 +char printf_str::c#2 +void (*printf_str::putc)(char) +void (*printf_str::putc#0)(char) +void (*printf_str::putc#1)(char) +void (*printf_str::putc#2)(char) +void (*printf_str::putc#3)(char) +void (*printf_str::putc#4)(char) +void (*printf_str::putc#5)(char) +void (*printf_str::putc#6)(char) +const char *printf_str::s +const char *printf_str::s#0 +const char *printf_str::s#1 +const char *printf_str::s#2 +const char *printf_str::s#3 +const char *printf_str::s#4 +const char *printf_str::s#5 +const char *printf_str::s#6 +const char *printf_str::s#7 +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) +number printf_uchar::$0 +char printf_uchar::$1 +number printf_uchar::$2 +bool printf_uchar::$5 +struct printf_format_number printf_uchar::format +char printf_uchar::format_justify_left +char printf_uchar::format_justify_left#0 +char printf_uchar::format_justify_left#1 +char printf_uchar::format_justify_left#2 +char printf_uchar::format_justify_left#3 +char printf_uchar::format_justify_left#4 +char printf_uchar::format_justify_left#5 +char printf_uchar::format_min_length +char printf_uchar::format_min_length#0 +char printf_uchar::format_min_length#1 +char printf_uchar::format_min_length#2 +char printf_uchar::format_min_length#3 +char printf_uchar::format_min_length#4 +char printf_uchar::format_min_length#5 +char printf_uchar::format_radix +char printf_uchar::format_radix#0 +char printf_uchar::format_radix#1 +char printf_uchar::format_radix#2 +char printf_uchar::format_radix#3 +char printf_uchar::format_radix#4 +char printf_uchar::format_radix#5 +char printf_uchar::format_sign_always +char printf_uchar::format_sign_always#0 +char printf_uchar::format_sign_always#1 +char printf_uchar::format_sign_always#2 +char printf_uchar::format_sign_always#3 +char printf_uchar::format_sign_always#4 +char printf_uchar::format_sign_always#5 +char printf_uchar::format_upper_case +char printf_uchar::format_upper_case#0 +char printf_uchar::format_upper_case#1 +char printf_uchar::format_upper_case#2 +char printf_uchar::format_upper_case#3 +char printf_uchar::format_upper_case#4 +char printf_uchar::format_upper_case#5 +char printf_uchar::format_zero_padding +char printf_uchar::format_zero_padding#0 +char printf_uchar::format_zero_padding#1 +char printf_uchar::format_zero_padding#2 +char printf_uchar::format_zero_padding#3 +char printf_uchar::format_zero_padding#4 +char printf_uchar::format_zero_padding#5 +void (*printf_uchar::putc)(char) +void (*printf_uchar::putc#0)(char) +void (*printf_uchar::putc#1)(char) +void (*printf_uchar::putc#2)(char) +void (*printf_uchar::putc#3)(char) +void (*printf_uchar::putc#4)(char) +void (*printf_uchar::putc#5)(char) +char printf_uchar::uvalue +char printf_uchar::uvalue#0 +char printf_uchar::uvalue#1 +char printf_uchar::uvalue#2 +char printf_uchar::uvalue#3 +char printf_uchar::uvalue#4 +unsigned int strlen(char *str) +bool strlen::$0 +unsigned int strlen::len +unsigned int strlen::len#0 +unsigned int strlen::len#1 +unsigned int strlen::len#2 +unsigned int strlen::len#3 +unsigned int strlen::len#4 +unsigned int strlen::return +unsigned int strlen::return#0 +unsigned int strlen::return#1 +unsigned int strlen::return#2 +unsigned int strlen::return#3 +unsigned int strlen::return#4 +char *strlen::str +char *strlen::str#0 +char *strlen::str#1 +char *strlen::str#2 +char *strlen::str#3 +char *strlen::str#4 +char * strupr(char *str) +char strupr::$0 +bool strupr::$1 +char *strupr::return +char *strupr::return#0 +char *strupr::return#1 +char *strupr::return#2 +char *strupr::return#3 +char *strupr::src +char *strupr::src#0 +char *strupr::src#1 +char *strupr::src#2 +char *strupr::src#3 +char *strupr::src#4 +char *strupr::str +char *strupr::str#0 +char *strupr::str#1 +char *strupr::str#2 +char *strupr::str#3 +char *strupr::str#4 +char *strupr::str#5 +char toupper(char ch) +bool toupper::$0 +bool toupper::$1 +bool toupper::$2 +char toupper::$3 +char toupper::ch +char toupper::ch#0 +char toupper::ch#1 +char toupper::ch#2 +char toupper::ch#3 +char toupper::return +char toupper::return#0 +char toupper::return#1 +char toupper::return#2 +char toupper::return#3 +char toupper::return#4 +char toupper::return#5 +void uctoa(char value , char *buffer , char radix) +bool uctoa::$0 +bool uctoa::$1 +char uctoa::$10 +bool uctoa::$2 +bool uctoa::$3 +number uctoa::$4 +bool uctoa::$5 +bool uctoa::$6 +bool uctoa::$7 +bool uctoa::$8 +char uctoa::$9 +char *uctoa::buffer +char *uctoa::buffer#0 +char *uctoa::buffer#1 +char *uctoa::buffer#10 +char *uctoa::buffer#11 +char *uctoa::buffer#12 +char *uctoa::buffer#13 +char *uctoa::buffer#14 +char *uctoa::buffer#15 +char *uctoa::buffer#16 +char *uctoa::buffer#17 +char *uctoa::buffer#18 +char *uctoa::buffer#19 +char *uctoa::buffer#2 +char *uctoa::buffer#20 +char *uctoa::buffer#21 +char *uctoa::buffer#3 +char *uctoa::buffer#4 +char *uctoa::buffer#5 +char *uctoa::buffer#6 +char *uctoa::buffer#7 +char *uctoa::buffer#8 +char *uctoa::buffer#9 +char uctoa::digit +char uctoa::digit#0 +char uctoa::digit#1 +char uctoa::digit#2 +char uctoa::digit#3 +char uctoa::digit#4 +char uctoa::digit#5 +char uctoa::digit#6 +char uctoa::digit_value +char uctoa::digit_value#0 +char uctoa::digit_value#1 +char *uctoa::digit_values +char *uctoa::digit_values#0 +char *uctoa::digit_values#1 +char *uctoa::digit_values#10 +char *uctoa::digit_values#2 +char *uctoa::digit_values#3 +char *uctoa::digit_values#4 +char *uctoa::digit_values#5 +char *uctoa::digit_values#6 +char *uctoa::digit_values#7 +char *uctoa::digit_values#8 +char *uctoa::digit_values#9 +char uctoa::max_digits +char uctoa::max_digits#0 +char uctoa::max_digits#1 +char uctoa::max_digits#10 +char uctoa::max_digits#2 +char uctoa::max_digits#3 +char uctoa::max_digits#4 +char uctoa::max_digits#5 +char uctoa::max_digits#6 +char uctoa::max_digits#7 +char uctoa::max_digits#8 +char uctoa::max_digits#9 +char uctoa::radix +char uctoa::radix#0 +char uctoa::radix#1 +char uctoa::radix#2 +char uctoa::radix#3 +char uctoa::radix#4 +char uctoa::started +char uctoa::started#0 +char uctoa::started#1 +char uctoa::started#2 +char uctoa::started#3 +char uctoa::started#4 +char uctoa::value +char uctoa::value#0 +char uctoa::value#1 +char uctoa::value#10 +char uctoa::value#11 +char uctoa::value#12 +char uctoa::value#13 +char uctoa::value#14 +char uctoa::value#15 +char uctoa::value#2 +char uctoa::value#3 +char uctoa::value#4 +char uctoa::value#5 +char uctoa::value#6 +char uctoa::value#7 +char uctoa::value#8 +char uctoa::value#9 +char uctoa_append(char *buffer , char value , char sub) +bool uctoa_append::$0 +char *uctoa_append::buffer +char *uctoa_append::buffer#0 +char *uctoa_append::buffer#1 +char *uctoa_append::buffer#2 +char *uctoa_append::buffer#3 +char *uctoa_append::buffer#4 +char uctoa_append::digit +char uctoa_append::digit#0 +char uctoa_append::digit#1 +char uctoa_append::digit#2 +char uctoa_append::digit#3 +char uctoa_append::digit#4 +char uctoa_append::return +char uctoa_append::return#0 +char uctoa_append::return#1 +char uctoa_append::return#2 +char uctoa_append::return#3 +char uctoa_append::return#4 +char uctoa_append::sub +char uctoa_append::sub#0 +char uctoa_append::sub#1 +char uctoa_append::sub#2 +char uctoa_append::sub#3 +char uctoa_append::value +char uctoa_append::value#0 +char uctoa_append::value#1 +char uctoa_append::value#2 +char uctoa_append::value#3 +char uctoa_append::value#4 +char uctoa_append::value#5 + +Adding number conversion cast (unumber) 0 in memset::$0 = memset::num#2 > 0 +Adding number conversion cast (unumber) 0 in strlen::$0 = 0 != *strlen::str#2 +Adding number conversion cast (unumber) 0 in strupr::$1 = 0 != *strupr::src#2 +Adding number conversion cast (unumber) 3 in uctoa::max_digits#1 = 3 +Adding number conversion cast (unumber) 2 in uctoa::max_digits#2 = 2 +Adding number conversion cast (unumber) 3 in uctoa::max_digits#3 = 3 +Adding number conversion cast (unumber) 8 in uctoa::max_digits#4 = 8 +Adding number conversion cast (unumber) 0 in *uctoa::buffer#2 = 0 +Adding number conversion cast (unumber) 1 in uctoa::$4 = uctoa::max_digits#5 - 1 +Adding number conversion cast (unumber) uctoa::$4 in uctoa::$4 = uctoa::max_digits#5 - (unumber)1 +Adding number conversion cast (unumber) 0 in *uctoa::buffer#3 = 0 +Adding number conversion cast (unumber) 1 in uctoa::started#1 = 1 +Adding number conversion cast (unumber) $19 in clrscr::$0 = clrscr::l#2 < $19 +Adding number conversion cast (unumber) 0 in conio_cursor_x = 0 +Adding number conversion cast (unumber) 0 in conio_cursor_y = 0 +Adding number conversion cast (unumber) $28 in clrscr::$1 = clrscr::c#2 < $28 +Adding number conversion cast (unumber) $28 in clrscr::line_text#1 = clrscr::line_text#3 + $28 +Adding number conversion cast (unumber) $28 in clrscr::line_cols#1 = clrscr::line_cols#3 + $28 +Adding number conversion cast (unumber) $19 in gotoxy::$0 = gotoxy::y#3 > $19 +Adding number conversion cast (unumber) $28 in gotoxy::$2 = gotoxy::x#3 >= $28 +Adding number conversion cast (unumber) 0 in gotoxy::y#0 = 0 +Adding number conversion cast (unumber) $28 in gotoxy::line_offset#0 = gotoxy::$7 * $28 +Adding number conversion cast (unumber) 0 in gotoxy::x#0 = 0 +Adding number conversion cast (unumber) $28 in cputc::$1 = conio_cursor_x == $28 +Adding number conversion cast (unumber) $28 in conio_line_text = conio_line_text + $28 +Adding number conversion cast (unumber) $28 in conio_line_color = conio_line_color + $28 +Adding number conversion cast (unumber) 0 in conio_cursor_x = 0 +Adding number conversion cast (unumber) $19 in cscroll::$0 = conio_cursor_y == $19 +Adding number conversion cast (unumber) 0 in cscroll::$7 = 0 != conio_scroll_enable +Adding number conversion cast (unumber) $28 in memcpy::source#0 = (void *)CONIO_SCREEN_TEXT+$28 +Adding number conversion cast (unumber) $19*$28-$28 in memcpy::num#0 = $19*$28-$28 +Adding number conversion cast (unumber) $28 in memcpy::source#1 = (void *)CONIO_SCREEN_COLORS+$28 +Adding number conversion cast (unumber) $19*$28-$28 in memcpy::num#1 = $19*$28-$28 +Adding number conversion cast (unumber) $28 in memset::str#0 = (void *)CONIO_SCREEN_TEXT+$19*$28-$28 +Adding number conversion cast (unumber) $19*$28 in memset::str#0 = (void *)CONIO_SCREEN_TEXT+$19*$28-(unumber)$28 +Adding number conversion cast (unumber) $28 in memset::num#0 = $28 +Adding number conversion cast (unumber) $28 in memset::str#1 = (void *)CONIO_SCREEN_COLORS+$19*$28-$28 +Adding number conversion cast (unumber) $19*$28 in memset::str#1 = (void *)CONIO_SCREEN_COLORS+$19*$28-(unumber)$28 +Adding number conversion cast (unumber) $28 in memset::num#1 = $28 +Adding number conversion cast (unumber) $28 in conio_line_text = conio_line_text - $28 +Adding number conversion cast (unumber) $28 in conio_line_color = conio_line_color - $28 +Adding number conversion cast (unumber) 0 in gotoxy::x#1 = 0 +Adding number conversion cast (unumber) 0 in gotoxy::y#1 = 0 +Adding number conversion cast (unumber) $19 in conio_c64_init::$0 = conio_c64_init::line#0 >= $19 +Adding number conversion cast (unumber) 0 in gotoxy::x#2 = 0 +Adding number conversion cast (unumber) $19-1 in conio_c64_init::line#1 = $19-1 +Adding number conversion cast (unumber) 0 in printf_str::$2 = 0 != printf_str::$0 +Adding number conversion cast (unumber) 0 in printf_uchar::$5 = 0 != printf_uchar::format_sign_always#1 +Adding number conversion cast (unumber) printf_uchar::$2 in printf_uchar::format_upper_case#2 = phi( printf_uchar::@1/printf_uchar::format_upper_case#3, printf_uchar::@2/printf_uchar::format_upper_case#4 ) + printf_uchar::format_zero_padding#2 = phi( printf_uchar::@1/printf_uchar::format_zero_padding#3, printf_uchar::@2/printf_uchar::format_zero_padding#4 ) + printf_uchar::format_sign_always#3 = phi( printf_uchar::@1/printf_uchar::format_sign_always#4, printf_uchar::@2/printf_uchar::format_sign_always#5 ) + printf_uchar::format_justify_left#2 = phi( printf_uchar::@1/printf_uchar::format_justify_left#3, printf_uchar::@2/printf_uchar::format_justify_left#4 ) + printf_uchar::format_min_length#2 = phi( printf_uchar::@1/printf_uchar::format_min_length#3, printf_uchar::@2/printf_uchar::format_min_length#4 ) + printf_uchar::putc#2 = phi( printf_uchar::@1/printf_uchar::putc#3, printf_uchar::@2/printf_uchar::putc#4 ) + printf_uchar::format_radix#1 = phi( printf_uchar::@1/printf_uchar::format_radix#3, printf_uchar::@2/printf_uchar::format_radix#4 ) + printf_uchar::uvalue#1 = phi( printf_uchar::@1/printf_uchar::uvalue#2, printf_uchar::@2/printf_uchar::uvalue#3 ) + printf_uchar::$2 = phi( printf_uchar::@1/printf_uchar::$1, printf_uchar::@2/printf_uchar::$0 ) +Adding number conversion cast (unumber) printf_uchar::$0 in printf_uchar::format_upper_case#2 = phi( printf_uchar::@1/printf_uchar::format_upper_case#3, printf_uchar::@2/printf_uchar::format_upper_case#4 ) + printf_uchar::format_zero_padding#2 = phi( printf_uchar::@1/printf_uchar::format_zero_padding#3, printf_uchar::@2/printf_uchar::format_zero_padding#4 ) + printf_uchar::format_sign_always#3 = phi( printf_uchar::@1/printf_uchar::format_sign_always#4, printf_uchar::@2/printf_uchar::format_sign_always#5 ) + printf_uchar::format_justify_left#2 = phi( printf_uchar::@1/printf_uchar::format_justify_left#3, printf_uchar::@2/printf_uchar::format_justify_left#4 ) + printf_uchar::format_min_length#2 = phi( printf_uchar::@1/printf_uchar::format_min_length#3, printf_uchar::@2/printf_uchar::format_min_length#4 ) + printf_uchar::putc#2 = phi( printf_uchar::@1/printf_uchar::putc#3, printf_uchar::@2/printf_uchar::putc#4 ) + printf_uchar::format_radix#1 = phi( printf_uchar::@1/printf_uchar::format_radix#3, printf_uchar::@2/printf_uchar::format_radix#4 ) + printf_uchar::uvalue#1 = phi( printf_uchar::@1/printf_uchar::uvalue#2, printf_uchar::@2/printf_uchar::uvalue#3 ) + printf_uchar::$2 = phi( printf_uchar::@1/printf_uchar::$1, printf_uchar::@2/printf_uchar::$0 ) +Adding number conversion cast (unumber) 0 in printf_number_buffer::$26 = 0 != printf_number_buffer::format_min_length#1 +Adding number conversion cast (unumber) 0 in printf_number_buffer::$27 = 0 != printf_number_buffer::format_justify_left#1 +Adding number conversion cast (unumber) 0 in printf_number_buffer::$28 = 0 != printf_number_buffer::format_zero_padding#1 +Adding number conversion cast (unumber) 0 in printf_number_buffer::$29 = 0 != printf_number_buffer::buffer_sign#1 +Adding number conversion cast (snumber) 0 in printf_number_buffer::$22 = printf_number_buffer::padding#1 < 0 +Adding number conversion cast (snumber) 0 in printf_number_buffer::padding#2 = 0 +Adding number conversion cast (unumber) 0 in printf_number_buffer::$30 = 0 != printf_number_buffer::buffer_sign#2 +Adding number conversion cast (unumber) 0 in printf_number_buffer::$31 = 0 != printf_number_buffer::format_upper_case#1 +Adding number conversion cast (unumber) 0 in printf_number_buffer::$32 = 0 != printf_number_buffer::format_zero_padding#3 +Adding number conversion cast (unumber) $3fff in main::toD0181_$0 = main::toD0181_$7 & $3fff +Adding number conversion cast (unumber) main::toD0181_$0 in main::toD0181_$0 = main::toD0181_$7 & (unumber)$3fff +Adding number conversion cast (unumber) 4 in main::toD0181_$1 = main::toD0181_$0 * 4 +Adding number conversion cast (unumber) main::toD0181_$1 in main::toD0181_$1 = main::toD0181_$0 * (unumber)4 +Adding number conversion cast (unumber) 4 in main::toD0181_$4 = main::toD0181_$3 / 4 +Adding number conversion cast (unumber) main::toD0181_$4 in main::toD0181_$4 = main::toD0181_$3 / (unumber)4 +Adding number conversion cast (unumber) $f in main::toD0181_$5 = main::toD0181_$4 & $f +Adding number conversion cast (unumber) main::toD0181_$5 in main::toD0181_$5 = main::toD0181_$4 & (unumber)$f +Adding number conversion cast (unumber) main::toD0181_$6 in main::toD0181_$6 = main::toD0181_$2 | main::toD0181_$5 +Adding number conversion cast (unumber) $20 in petscii_to_screencode::$0 = petscii_to_screencode::petscii#1 < $20 +Adding number conversion cast (unumber) $80 in petscii_to_screencode::$10 = petscii_to_screencode::petscii#2 + $80 +Adding number conversion cast (unumber) petscii_to_screencode::$10 in petscii_to_screencode::$10 = petscii_to_screencode::petscii#2 + (unumber)$80 +Adding number conversion cast (unumber) $40 in petscii_to_screencode::$1 = petscii_to_screencode::petscii#3 < $40 +Adding number conversion cast (unumber) $60 in petscii_to_screencode::$2 = petscii_to_screencode::petscii#5 < $60 +Adding number conversion cast (unumber) $40 in petscii_to_screencode::$9 = petscii_to_screencode::petscii#6 - $40 +Adding number conversion cast (unumber) petscii_to_screencode::$9 in petscii_to_screencode::$9 = petscii_to_screencode::petscii#6 - (unumber)$40 +Adding number conversion cast (unumber) $80 in petscii_to_screencode::$3 = petscii_to_screencode::petscii#7 < $80 +Adding number conversion cast (unumber) $20 in petscii_to_screencode::$8 = petscii_to_screencode::petscii#8 - $20 +Adding number conversion cast (unumber) petscii_to_screencode::$8 in petscii_to_screencode::$8 = petscii_to_screencode::petscii#8 - (unumber)$20 +Adding number conversion cast (unumber) $a0 in petscii_to_screencode::$4 = petscii_to_screencode::petscii#9 < $a0 +Adding number conversion cast (unumber) $40 in petscii_to_screencode::$7 = petscii_to_screencode::petscii#10 + $40 +Adding number conversion cast (unumber) petscii_to_screencode::$7 in petscii_to_screencode::$7 = petscii_to_screencode::petscii#10 + (unumber)$40 +Adding number conversion cast (unumber) $ff in petscii_to_screencode::$5 = petscii_to_screencode::petscii#11 < $ff +Adding number conversion cast (unumber) $80 in petscii_to_screencode::$6 = petscii_to_screencode::petscii#12 - $80 +Adding number conversion cast (unumber) petscii_to_screencode::$6 in petscii_to_screencode::$6 = petscii_to_screencode::petscii#12 - (unumber)$80 +Adding number conversion cast (unumber) $5e in petscii_to_screencode::return#7 = $5e +Successful SSA optimization PassNAddNumberTypeConversions +Adding number conversion cast (unumber) 0 in printf_uchar::$0 = 0 +Successful SSA optimization PassNAddNumberTypeConversions +Inlining cast memcpy::src#0 = (char *)memcpy::source#2 +Inlining cast memcpy::dst#0 = (char *)memcpy::destination#2 +Inlining cast memset::dst#0 = (char *)memset::str#3 +Inlining cast uctoa::max_digits#1 = (unumber)3 +Inlining cast uctoa::max_digits#2 = (unumber)2 +Inlining cast uctoa::max_digits#3 = (unumber)3 +Inlining cast uctoa::max_digits#4 = (unumber)8 +Inlining cast *uctoa::buffer#2 = (unumber)0 +Inlining cast *uctoa::buffer#3 = (unumber)0 +Inlining cast uctoa::started#1 = (unumber)1 +Inlining cast conio_cursor_x = (unumber)0 +Inlining cast conio_cursor_y = (unumber)0 +Inlining cast gotoxy::y#0 = (unumber)0 +Inlining cast gotoxy::x#0 = (unumber)0 +Inlining cast conio_cursor_x = (unumber)0 +Inlining cast memcpy::num#0 = (unumber)$19*$28-$28 +Inlining cast memcpy::num#1 = (unumber)$19*$28-$28 +Inlining cast memset::num#0 = (unumber)$28 +Inlining cast memset::num#1 = (unumber)$28 +Inlining cast gotoxy::x#1 = (unumber)0 +Inlining cast gotoxy::y#1 = (unumber)0 +Inlining cast gotoxy::x#2 = (unumber)0 +Inlining cast conio_c64_init::line#1 = (unumber)$19-1 +Inlining cast printf_uchar::$0 = (unumber)0 +Inlining cast printf_number_buffer::padding#2 = (snumber)0 +Inlining cast petscii_to_screencode::return#7 = (unumber)$5e +Successful SSA optimization Pass2InlineCast +Simplifying constant pointer cast (struct MOS6569_VICII *) 53248 +Simplifying constant pointer cast (char *) 55296 +Simplifying constant pointer cast (char *) 1024 +Simplifying constant pointer cast (char *) 6144 +Simplifying constant pointer cast (char *) 214 +Simplifying constant pointer cast (char *) 255 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 3 +Simplifying constant integer cast 2 +Simplifying constant integer cast 3 +Simplifying constant integer cast 8 +Simplifying constant integer cast 0 +Simplifying constant integer cast 1 +Simplifying constant integer cast uctoa::value#3 +Simplifying constant integer cast 0 +Simplifying constant integer cast 1 +Simplifying constant integer cast $19 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast $28 +Simplifying constant integer cast $28 +Simplifying constant integer cast $28 +Simplifying constant integer cast $19 +Simplifying constant integer cast $28 +Simplifying constant integer cast 0 +Simplifying constant integer cast $28 +Simplifying constant integer cast 0 +Simplifying constant integer cast $28 +Simplifying constant integer cast $28 +Simplifying constant integer cast $28 +Simplifying constant integer cast 0 +Simplifying constant integer cast $19 +Simplifying constant integer cast 0 +Simplifying constant integer cast $28 +Simplifying constant integer cast $28 +Simplifying constant integer cast $28 +Simplifying constant integer cast $28 +Simplifying constant integer cast $28 +Simplifying constant integer cast $28 +Simplifying constant integer cast $28 +Simplifying constant integer cast $28 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast $19 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast $3fff +Simplifying constant integer cast 4 +Simplifying constant integer cast 4 +Simplifying constant integer cast $f +Simplifying constant integer cast $20 +Simplifying constant integer cast $80 +Simplifying constant integer cast $40 +Simplifying constant integer cast $60 +Simplifying constant integer cast $40 +Simplifying constant integer cast $80 +Simplifying constant integer cast $20 +Simplifying constant integer cast $a0 +Simplifying constant integer cast $40 +Simplifying constant integer cast $ff +Simplifying constant integer cast $80 +Simplifying constant integer cast $5e +Successful SSA optimization PassNCastSimplification +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 3 +Finalized unsigned number type (char) 2 +Finalized unsigned number type (char) 3 +Finalized unsigned number type (char) 8 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 1 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 1 +Finalized unsigned number type (char) $19 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) $19 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) $19 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) $19 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 0 +Finalized signed number type (signed char) 0 +Finalized signed number type (signed char) 0 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (unsigned int) $3fff +Finalized unsigned number type (char) 4 +Finalized unsigned number type (char) 4 +Finalized unsigned number type (char) $f +Finalized unsigned number type (char) $20 +Finalized unsigned number type (char) $80 +Finalized unsigned number type (char) $40 +Finalized unsigned number type (char) $60 +Finalized unsigned number type (char) $40 +Finalized unsigned number type (char) $80 +Finalized unsigned number type (char) $20 +Finalized unsigned number type (char) $a0 +Finalized unsigned number type (char) $40 +Finalized unsigned number type (char) $ff +Finalized unsigned number type (char) $80 +Finalized unsigned number type (char) $5e +Successful SSA optimization PassNFinalizeNumberTypeConversions +Inferred type updated to char in uctoa::$4 = uctoa::max_digits#5 - 1 +Inferred type updated to char in printf_uchar::$0 = 0 +Inferred type updated to char for printf_uchar::$2 +Inferred type updated to unsigned int in main::toD0181_$0 = main::toD0181_$7 & $3fff +Inferred type updated to unsigned int in main::toD0181_$1 = main::toD0181_$0 * 4 +Inferred type updated to char in main::toD0181_$4 = main::toD0181_$3 / 4 +Inferred type updated to char in main::toD0181_$5 = main::toD0181_$4 & $f +Inferred type updated to char in main::toD0181_$6 = main::toD0181_$2 | main::toD0181_$5 +Inferred type updated to char in petscii_to_screencode::$10 = petscii_to_screencode::petscii#2 + $80 +Inferred type updated to char in petscii_to_screencode::$9 = petscii_to_screencode::petscii#6 - $40 +Inferred type updated to char in petscii_to_screencode::$8 = petscii_to_screencode::petscii#8 - $20 +Inferred type updated to char in petscii_to_screencode::$7 = petscii_to_screencode::petscii#10 + $40 +Inferred type updated to char in petscii_to_screencode::$6 = petscii_to_screencode::petscii#12 - $80 +Inversing boolean not [19] memset::$1 = memset::num#2 <= 0 from [18] memset::$0 = memset::num#2 > 0 +Inversing boolean not [186] gotoxy::$1 = gotoxy::y#3 <= $19 from [185] gotoxy::$0 = gotoxy::y#3 > $19 +Inversing boolean not [190] gotoxy::$3 = gotoxy::x#3 < $28 from [189] gotoxy::$2 = gotoxy::x#3 >= $28 +Inversing boolean not [215] cputc::$2 = conio_cursor_x != $28 from [214] cputc::$1 = conio_cursor_x == $28 +Inversing boolean not [226] cscroll::$1 = conio_cursor_y != $19 from [225] cscroll::$0 = conio_cursor_y == $19 +Inversing boolean not [259] conio_c64_init::$1 = conio_c64_init::line#0 < $19 from [258] conio_c64_init::$0 = conio_c64_init::line#0 >= $19 +Inversing boolean not [320] printf_number_buffer::$0 = 0 == printf_number_buffer::format_min_length#1 from [319] printf_number_buffer::$26 = 0 != printf_number_buffer::format_min_length#1 +Inversing boolean not [324] printf_number_buffer::$1 = 0 == printf_number_buffer::format_justify_left#1 from [323] printf_number_buffer::$27 = 0 != printf_number_buffer::format_justify_left#1 +Inversing boolean not [326] printf_number_buffer::$2 = 0 == printf_number_buffer::format_zero_padding#1 from [325] printf_number_buffer::$28 = 0 != printf_number_buffer::format_zero_padding#1 +Inversing boolean not [339] printf_number_buffer::$20 = 0 == printf_number_buffer::buffer_sign#1 from [338] printf_number_buffer::$29 = 0 != printf_number_buffer::buffer_sign#1 +Inversing boolean not [346] printf_number_buffer::$23 = printf_number_buffer::padding#1 >= 0 from [345] printf_number_buffer::$22 = printf_number_buffer::padding#1 < 0 +Inversing boolean not [354] printf_number_buffer::$7 = 0 == printf_number_buffer::buffer_sign#2 from [353] printf_number_buffer::$30 = 0 != printf_number_buffer::buffer_sign#2 +Inversing boolean not [372] printf_number_buffer::$12 = 0 == printf_number_buffer::format_upper_case#1 from [371] printf_number_buffer::$31 = 0 != printf_number_buffer::format_upper_case#1 +Inversing boolean not [386] printf_number_buffer::$14 = 0 == printf_number_buffer::format_zero_padding#3 from [385] printf_number_buffer::$32 = 0 != printf_number_buffer::format_zero_padding#3 +Successful SSA optimization Pass2UnaryNotSimplification +Alias candidate removed (volatile)conio_line_text = gotoxy::$5 +Alias candidate removed (volatile)conio_line_color = gotoxy::$6 +Alias candidate removed (volatile)memset::c#1 = conio_textcolor +Alias memcpy::src#2 = memcpy::src#3 +Alias memcpy::dst#2 = memcpy::dst#3 +Alias memcpy::src_end#1 = memcpy::src_end#2 +Alias memcpy::destination#3 = memcpy::destination#5 memcpy::destination#4 memcpy::return#0 memcpy::return#4 memcpy::return#1 +Alias memset::return#0 = memset::str#2 memset::return#4 memset::return#1 +Alias memset::str#3 = memset::str#4 +Alias memset::num#2 = memset::num#3 +Alias memset::c#4 = memset::c#5 +Alias memset::c#2 = memset::c#3 +Alias memset::dst#2 = memset::dst#3 +Alias memset::end#1 = memset::end#2 +Alias memset::str#5 = memset::str#6 +Alias strlen::len#2 = strlen::len#4 strlen::len#3 strlen::return#0 strlen::return#3 strlen::return#1 +Alias strlen::str#2 = strlen::str#3 +Alias toupper::ch#1 = toupper::ch#2 toupper::ch#3 toupper::return#1 +Alias toupper::return#0 = toupper::$3 +Alias toupper::return#2 = toupper::return#4 +Alias strupr::src#0 = strupr::str#1 +Alias strupr::src#2 = strupr::src#3 strupr::src#4 +Alias strupr::str#2 = strupr::str#5 strupr::str#3 strupr::str#4 strupr::return#0 strupr::return#3 strupr::return#1 +Alias toupper::return#3 = toupper::return#5 +Alias uctoa::value#10 = uctoa::value#8 uctoa::value#12 uctoa::value#13 uctoa::value#9 uctoa::value#14 uctoa::value#15 uctoa::value#11 +Alias uctoa::buffer#10 = uctoa::buffer#17 uctoa::buffer#21 uctoa::buffer#16 uctoa::buffer#18 uctoa::buffer#13 uctoa::buffer#19 uctoa::buffer#20 uctoa::buffer#6 +Alias uctoa::radix#1 = uctoa::radix#2 uctoa::radix#3 uctoa::radix#4 +Alias uctoa::digit_values#10 = uctoa::digit_values#5 uctoa::digit_values#6 uctoa::digit_values#9 +Alias uctoa::digit#2 = uctoa::digit#3 uctoa::digit#6 uctoa::digit#5 +Alias uctoa::value#2 = uctoa::value#5 uctoa::value#3 uctoa::$10 uctoa::value#4 +Alias uctoa::started#2 = uctoa::started#3 +Alias uctoa::buffer#11 = uctoa::buffer#12 uctoa::buffer#7 uctoa::buffer#8 uctoa::buffer#9 +Alias uctoa::max_digits#10 = uctoa::max_digits#8 uctoa::max_digits#5 uctoa::max_digits#9 +Alias uctoa::digit_value#0 = uctoa::digit_value#1 +Alias uctoa_append::return#0 = uctoa_append::return#3 +Alias uctoa::value#0 = uctoa::$9 +Alias uctoa_append::digit#2 = uctoa_append::digit#4 uctoa_append::digit#3 +Alias uctoa_append::value#2 = uctoa_append::value#3 uctoa_append::value#4 uctoa_append::return#1 uctoa_append::return#4 uctoa_append::return#2 +Alias uctoa_append::sub#1 = uctoa_append::sub#2 +Alias uctoa_append::buffer#1 = uctoa_append::buffer#4 uctoa_append::buffer#2 +Alias clrscr::line_text#5 = clrscr::line_text#6 +Alias clrscr::line_cols#5 = clrscr::line_cols#6 +Alias clrscr::l#2 = clrscr::l#5 +Alias clrscr::line_text#2 = clrscr::line_text#4 clrscr::line_text#3 +Alias clrscr::c#2 = clrscr::c#3 +Alias clrscr::line_cols#2 = clrscr::line_cols#4 clrscr::line_cols#3 +Alias clrscr::l#3 = clrscr::l#6 clrscr::l#4 +Alias gotoxy::x#5 = gotoxy::x#6 +Alias gotoxy::y#5 = gotoxy::y#6 +Alias cputc::c#0 = cputc::c#1 +Alias printf_str::c#1 = printf_str::$0 printf_str::c#2 +Alias printf_str::putc#4 = printf_str::putc#5 +Alias printf_str::s#0 = printf_str::s#7 +Alias printf_padding::pad#3 = printf_padding::pad#4 printf_padding::pad#6 +Alias printf_padding::putc#3 = printf_padding::putc#4 printf_padding::putc#6 +Alias printf_padding::i#2 = printf_padding::i#4 printf_padding::i#3 +Alias printf_padding::length#3 = printf_padding::length#6 printf_padding::length#5 +Alias printf_uchar::uvalue#2 = printf_uchar::uvalue#4 printf_uchar::uvalue#3 +Alias printf_uchar::format_radix#3 = printf_uchar::format_radix#5 printf_uchar::format_radix#4 +Alias printf_uchar::putc#3 = printf_uchar::putc#5 printf_uchar::putc#4 +Alias printf_uchar::format_min_length#3 = printf_uchar::format_min_length#5 printf_uchar::format_min_length#4 +Alias printf_uchar::format_justify_left#3 = printf_uchar::format_justify_left#5 printf_uchar::format_justify_left#4 +Alias printf_uchar::format_sign_always#1 = printf_uchar::format_sign_always#4 printf_uchar::format_sign_always#5 +Alias printf_uchar::format_zero_padding#3 = printf_uchar::format_zero_padding#5 printf_uchar::format_zero_padding#4 +Alias printf_uchar::format_upper_case#3 = printf_uchar::format_upper_case#5 printf_uchar::format_upper_case#4 +Alias printf_uchar::putc#1 = printf_uchar::putc#2 +Alias printf_uchar::format_min_length#1 = printf_uchar::format_min_length#2 +Alias printf_uchar::format_justify_left#1 = printf_uchar::format_justify_left#2 +Alias printf_uchar::format_sign_always#2 = printf_uchar::format_sign_always#3 +Alias printf_uchar::format_zero_padding#1 = printf_uchar::format_zero_padding#2 +Alias printf_uchar::format_upper_case#1 = printf_uchar::format_upper_case#2 +Alias printf_uchar::format_radix#1 = printf_uchar::format_radix#2 +Alias printf_number_buffer::buffer_digits#1 = printf_number_buffer::buffer_digits#4 printf_number_buffer::buffer_digits#17 printf_number_buffer::buffer_digits#18 +Alias printf_number_buffer::buffer_sign#1 = printf_number_buffer::buffer_sign#4 printf_number_buffer::buffer_sign#7 printf_number_buffer::buffer_sign#11 +Alias printf_number_buffer::format_min_length#1 = printf_number_buffer::format_min_length#5 printf_number_buffer::format_min_length#3 printf_number_buffer::format_min_length#4 +Alias printf_number_buffer::format_justify_left#11 = printf_number_buffer::format_justify_left#3 printf_number_buffer::format_justify_left#7 printf_number_buffer::format_justify_left#8 +Alias printf_number_buffer::format_zero_padding#10 = printf_number_buffer::format_zero_padding#15 printf_number_buffer::format_zero_padding#4 printf_number_buffer::format_zero_padding#11 +Alias printf_number_buffer::putc#12 = printf_number_buffer::putc#20 printf_number_buffer::putc#18 printf_number_buffer::putc#19 +Alias printf_number_buffer::format_upper_case#13 = printf_number_buffer::format_upper_case#15 printf_number_buffer::format_upper_case#9 printf_number_buffer::format_upper_case#14 +Alias strlen::return#2 = strlen::return#4 +Alias printf_number_buffer::padding#1 = printf_number_buffer::$21 +Alias printf_number_buffer::len#0 = printf_number_buffer::len#3 +Alias printf_number_buffer::format_justify_left#4 = printf_number_buffer::format_justify_left#5 +Alias printf_number_buffer::format_zero_padding#5 = printf_number_buffer::format_zero_padding#6 +Alias printf_number_buffer::buffer_sign#8 = printf_number_buffer::buffer_sign#9 +Alias printf_number_buffer::putc#13 = printf_number_buffer::putc#14 +Alias printf_number_buffer::format_upper_case#10 = printf_number_buffer::format_upper_case#11 +Alias printf_number_buffer::buffer_digits#14 = printf_number_buffer::buffer_digits#15 +Alias printf_number_buffer::putc#1 = printf_number_buffer::putc#6 printf_number_buffer::putc#15 +Alias printf_number_buffer::padding#12 = printf_number_buffer::padding#4 printf_number_buffer::padding#3 +Alias printf_number_buffer::buffer_sign#10 = printf_number_buffer::buffer_sign#5 printf_number_buffer::buffer_sign#6 +Alias printf_number_buffer::format_zero_padding#1 = printf_number_buffer::format_zero_padding#16 printf_number_buffer::format_zero_padding#12 +Alias printf_number_buffer::format_upper_case#12 = printf_number_buffer::format_upper_case#7 printf_number_buffer::format_upper_case#8 +Alias printf_number_buffer::buffer_digits#12 = printf_number_buffer::buffer_digits#16 printf_number_buffer::buffer_digits#13 +Alias printf_number_buffer::format_justify_left#1 = printf_number_buffer::format_justify_left#19 printf_number_buffer::format_justify_left#18 +Alias printf_number_buffer::buffer_sign#2 = printf_number_buffer::buffer_sign#3 +Alias printf_number_buffer::putc#2 = printf_number_buffer::putc#7 +Alias printf_number_buffer::format_zero_padding#7 = printf_number_buffer::format_zero_padding#8 +Alias printf_number_buffer::padding#10 = printf_number_buffer::padding#9 +Alias printf_number_buffer::format_upper_case#4 = printf_number_buffer::format_upper_case#5 +Alias printf_number_buffer::buffer_digits#10 = printf_number_buffer::buffer_digits#9 +Alias printf_number_buffer::format_justify_left#15 = printf_number_buffer::format_justify_left#16 +Alias printf_number_buffer::putc#16 = printf_number_buffer::putc#3 printf_number_buffer::putc#8 +Alias printf_number_buffer::padding#15 = printf_number_buffer::padding#6 printf_number_buffer::padding#5 +Alias printf_number_buffer::format_upper_case#2 = printf_number_buffer::format_upper_case#6 printf_number_buffer::format_upper_case#3 +Alias printf_number_buffer::buffer_digits#11 = printf_number_buffer::buffer_digits#8 printf_number_buffer::buffer_digits#7 +Alias printf_number_buffer::format_zero_padding#17 = printf_number_buffer::format_zero_padding#19 printf_number_buffer::format_zero_padding#2 +Alias printf_number_buffer::format_justify_left#12 = printf_number_buffer::format_justify_left#17 printf_number_buffer::format_justify_left#13 +Alias printf_number_buffer::format_zero_padding#3 = printf_number_buffer::format_zero_padding#9 +Alias printf_number_buffer::format_justify_left#2 = printf_number_buffer::format_justify_left#6 +Alias printf_number_buffer::padding#11 = printf_number_buffer::padding#7 printf_number_buffer::padding#8 +Alias printf_number_buffer::putc#11 = printf_number_buffer::putc#4 printf_number_buffer::putc#5 +Alias printf_number_buffer::buffer_digits#3 = printf_number_buffer::buffer_digits#6 printf_number_buffer::buffer_digits#5 +Alias printf_number_buffer::putc#10 = printf_number_buffer::putc#17 printf_number_buffer::putc#9 +Alias printf_number_buffer::format_zero_padding#13 = printf_number_buffer::format_zero_padding#18 printf_number_buffer::format_zero_padding#14 +Alias printf_number_buffer::format_justify_left#10 = printf_number_buffer::format_justify_left#14 printf_number_buffer::format_justify_left#9 +Alias printf_number_buffer::padding#13 = printf_number_buffer::padding#16 printf_number_buffer::padding#14 +Alias main::toD0181_screen#0 = main::toD0181_screen#1 +Alias main::toD0181_gfx#0 = main::toD0181_gfx#1 +Alias main::toD0181_return#0 = main::toD0181_$6 main::toD0181_return#2 main::toD0181_return#1 main::toD0181_return#3 main::$0 +Alias GETIN::return#0 = GETIN::return#3 +Alias main::current#2 = main::current#3 +Alias main::ch#0 = main::ch#1 main::ch#6 main::ch#4 main::ch#2 main::ch#5 main::ch#3 main::current#1 +Alias petscii_to_screencode::return#0 = petscii_to_screencode::return#9 +Alias main::return#0 = main::return#2 +Alias petscii_to_screencode::petscii#1 = petscii_to_screencode::petscii#2 petscii_to_screencode::petscii#3 petscii_to_screencode::petscii#4 petscii_to_screencode::return#2 petscii_to_screencode::petscii#5 petscii_to_screencode::petscii#6 petscii_to_screencode::petscii#7 petscii_to_screencode::petscii#8 petscii_to_screencode::petscii#9 petscii_to_screencode::petscii#10 petscii_to_screencode::petscii#11 petscii_to_screencode::petscii#12 +Alias petscii_to_screencode::return#1 = petscii_to_screencode::$10 +Alias petscii_to_screencode::return#3 = petscii_to_screencode::$9 +Alias petscii_to_screencode::return#4 = petscii_to_screencode::$8 +Alias petscii_to_screencode::return#5 = petscii_to_screencode::$7 +Alias petscii_to_screencode::return#6 = petscii_to_screencode::$6 +Alias petscii_to_screencode::return#10 = petscii_to_screencode::return#8 +Alias GETIN::return#1 = GETIN::return#4 GETIN::return#2 +Successful SSA optimization Pass2AliasElimination +Alias candidate removed (volatile)conio_line_text = gotoxy::$5 +Alias candidate removed (volatile)conio_line_color = gotoxy::$6 +Alias candidate removed (volatile)memset::c#1 = conio_textcolor +Alias uctoa::value#10 = uctoa::value#7 +Alias uctoa::buffer#10 = uctoa::buffer#15 +Alias uctoa::digit#2 = uctoa::digit#4 +Alias uctoa::max_digits#10 = uctoa::max_digits#6 +Alias uctoa::digit_values#10 = uctoa::digit_values#7 +Alias gotoxy::x#3 = gotoxy::x#5 +Alias gotoxy::y#4 = gotoxy::y#5 +Alias printf_uchar::uvalue#1 = printf_uchar::uvalue#2 +Alias printf_uchar::format_radix#1 = printf_uchar::format_radix#3 +Alias printf_uchar::putc#1 = printf_uchar::putc#3 +Alias printf_uchar::format_min_length#1 = printf_uchar::format_min_length#3 +Alias printf_uchar::format_justify_left#1 = printf_uchar::format_justify_left#3 +Alias printf_uchar::format_sign_always#1 = printf_uchar::format_sign_always#2 +Alias printf_uchar::format_zero_padding#1 = printf_uchar::format_zero_padding#3 +Alias printf_uchar::format_upper_case#1 = printf_uchar::format_upper_case#3 +Alias printf_number_buffer::format_min_length#1 = printf_number_buffer::format_min_length#2 +Alias printf_number_buffer::format_justify_left#11 = printf_number_buffer::format_justify_left#4 +Alias printf_number_buffer::format_zero_padding#10 = printf_number_buffer::format_zero_padding#5 +Alias printf_number_buffer::buffer_sign#1 = printf_number_buffer::buffer_sign#8 +Alias printf_number_buffer::putc#12 = printf_number_buffer::putc#13 +Alias printf_number_buffer::format_upper_case#10 = printf_number_buffer::format_upper_case#13 +Alias printf_number_buffer::buffer_digits#1 = printf_number_buffer::buffer_digits#14 +Alias printf_number_buffer::buffer_sign#10 = printf_number_buffer::buffer_sign#2 +Alias printf_number_buffer::format_zero_padding#1 = printf_number_buffer::format_zero_padding#7 printf_number_buffer::format_zero_padding#17 printf_number_buffer::format_zero_padding#13 printf_number_buffer::format_zero_padding#3 +Alias printf_number_buffer::padding#10 = printf_number_buffer::padding#12 printf_number_buffer::padding#15 printf_number_buffer::padding#13 printf_number_buffer::padding#11 +Alias printf_number_buffer::putc#1 = printf_number_buffer::putc#2 printf_number_buffer::putc#16 printf_number_buffer::putc#10 printf_number_buffer::putc#11 +Alias printf_number_buffer::format_upper_case#1 = printf_number_buffer::format_upper_case#4 printf_number_buffer::format_upper_case#12 printf_number_buffer::format_upper_case#2 +Alias printf_number_buffer::buffer_digits#10 = printf_number_buffer::buffer_digits#12 printf_number_buffer::buffer_digits#11 printf_number_buffer::buffer_digits#3 printf_number_buffer::buffer_digits#2 +Alias printf_number_buffer::format_justify_left#1 = printf_number_buffer::format_justify_left#15 printf_number_buffer::format_justify_left#12 printf_number_buffer::format_justify_left#10 printf_number_buffer::format_justify_left#2 +Successful SSA optimization Pass2AliasElimination +Alias candidate removed (volatile)conio_line_text = gotoxy::$5 +Alias candidate removed (volatile)conio_line_color = gotoxy::$6 +Alias candidate removed (volatile)memset::c#1 = conio_textcolor +Alias printf_number_buffer::format_justify_left#1 = printf_number_buffer::format_justify_left#11 +Alias printf_number_buffer::format_zero_padding#1 = printf_number_buffer::format_zero_padding#10 +Alias printf_number_buffer::buffer_sign#1 = printf_number_buffer::buffer_sign#10 +Alias printf_number_buffer::putc#1 = printf_number_buffer::putc#12 +Alias printf_number_buffer::format_upper_case#1 = printf_number_buffer::format_upper_case#10 +Alias printf_number_buffer::buffer_digits#1 = printf_number_buffer::buffer_digits#10 +Successful SSA optimization Pass2AliasElimination +Alias candidate removed (volatile)conio_line_text = gotoxy::$5 +Alias candidate removed (volatile)conio_line_color = gotoxy::$6 +Alias candidate removed (volatile)memset::c#1 = conio_textcolor +Identical Phi Values memcpy::src_end#1 memcpy::src_end#0 +Identical Phi Values memcpy::destination#3 memcpy::destination#2 +Identical Phi Values memset::end#1 memset::end#0 +Identical Phi Values memset::str#5 memset::str#3 +Identical Phi Values memset::c#2 memset::c#4 +Identical Phi Values strlen::str#4 strlen::str#1 +Identical Phi Values toupper::ch#1 toupper::ch#0 +Identical Phi Values strupr::src#0 strupr::str#0 +Identical Phi Values strupr::str#2 strupr::src#0 +Identical Phi Values uctoa::radix#1 uctoa::radix#0 +Identical Phi Values uctoa::value#10 uctoa::value#1 +Identical Phi Values uctoa::buffer#10 uctoa::buffer#5 +Identical Phi Values uctoa::max_digits#10 uctoa::max_digits#7 +Identical Phi Values uctoa::digit_values#10 uctoa::digit_values#8 +Identical Phi Values uctoa_append::value#5 uctoa_append::value#0 +Identical Phi Values uctoa_append::sub#3 uctoa_append::sub#0 +Identical Phi Values uctoa_append::buffer#3 uctoa_append::buffer#0 +Identical Phi Values uctoa_append::sub#1 uctoa_append::sub#3 +Identical Phi Values uctoa_append::buffer#1 uctoa_append::buffer#3 +Identical Phi Values clrscr::line_text#2 clrscr::line_text#5 +Identical Phi Values clrscr::line_cols#2 clrscr::line_cols#5 +Identical Phi Values clrscr::l#3 clrscr::l#2 +Identical Phi Values printf_str::putc#4 printf_str::putc#6 +Identical Phi Values printf_padding::length#3 printf_padding::length#4 +Identical Phi Values printf_padding::pad#3 printf_padding::pad#5 +Identical Phi Values printf_padding::putc#3 printf_padding::putc#5 +Identical Phi Values printf_uchar::format_sign_always#1 printf_uchar::format_sign_always#0 +Identical Phi Values printf_uchar::uvalue#1 printf_uchar::uvalue#0 +Identical Phi Values printf_uchar::format_radix#1 printf_uchar::format_radix#0 +Identical Phi Values printf_uchar::putc#1 printf_uchar::putc#0 +Identical Phi Values printf_uchar::format_min_length#1 printf_uchar::format_min_length#0 +Identical Phi Values printf_uchar::format_justify_left#1 printf_uchar::format_justify_left#0 +Identical Phi Values printf_uchar::format_zero_padding#1 printf_uchar::format_zero_padding#0 +Identical Phi Values printf_uchar::format_upper_case#1 printf_uchar::format_upper_case#0 +Identical Phi Values printf_number_buffer::format_min_length#1 printf_number_buffer::format_min_length#0 +Identical Phi Values printf_number_buffer::format_justify_left#1 printf_number_buffer::format_justify_left#0 +Identical Phi Values printf_number_buffer::format_zero_padding#1 printf_number_buffer::format_zero_padding#0 +Identical Phi Values printf_number_buffer::buffer_digits#1 printf_number_buffer::buffer_digits#0 +Identical Phi Values printf_number_buffer::buffer_sign#1 printf_number_buffer::buffer_sign#0 +Identical Phi Values printf_number_buffer::putc#1 printf_number_buffer::putc#0 +Identical Phi Values printf_number_buffer::format_upper_case#1 printf_number_buffer::format_upper_case#0 +Identical Phi Values petscii_to_screencode::petscii#1 petscii_to_screencode::petscii#0 +Successful SSA optimization Pass2IdenticalPhiElimination +Identical Phi Values memset::return#0 memset::str#3 +Successful SSA optimization Pass2IdenticalPhiElimination +Simple Condition memcpy::$1 [7] if(memcpy::src#2!=memcpy::src_end#0) goto memcpy::@2 +Simple Condition memset::$1 [14] if(memset::num#2<=0) goto memset::@1 +Simple Condition memset::$3 [21] if(memset::dst#2!=memset::end#0) goto memset::@4 +Simple Condition strlen::$0 [29] if(0!=*strlen::str#2) goto strlen::@2 +Simple Condition strupr::$1 [44] if(0!=*strupr::src#2) goto strupr::@2 +Simple Condition uctoa::$0 [56] if(uctoa::radix#0==DECIMAL) goto uctoa::@1 +Simple Condition uctoa::$1 [60] if(uctoa::radix#0==HEXADECIMAL) goto uctoa::@2 +Simple Condition uctoa::$2 [64] if(uctoa::radix#0==OCTAL) goto uctoa::@3 +Simple Condition uctoa::$3 [68] if(uctoa::radix#0==BINARY) goto uctoa::@4 +Simple Condition uctoa::$5 [85] if(uctoa::digit#2=uctoa_append::sub#0) goto uctoa_append::@2 +Simple Condition clrscr::$0 [118] if(clrscr::l#2<$19) goto clrscr::@2 +Simple Condition clrscr::$1 [126] if(clrscr::c#2<$28) goto clrscr::@5 +Simple Condition gotoxy::$1 [136] if(gotoxy::y#3<=$19) goto gotoxy::@1 +Simple Condition gotoxy::$3 [139] if(gotoxy::x#3<$28) goto gotoxy::@2 +Simple Condition cputc::$0 [154] if(cputc::c#0==' +') goto cputc::@1 +Simple Condition cputc::$2 [160] if(conio_cursor_x!=$28) goto cputc::@return +Simple Condition cscroll::$1 [170] if(conio_cursor_y!=$19) goto cscroll::@return +Simple Condition cscroll::$7 [172] if(0!=conio_scroll_enable) goto cscroll::@3 +Simple Condition conio_c64_init::$1 [202] if(conio_c64_init::line#0<$19) goto conio_c64_init::@1 +Simple Condition printf_str::$2 [215] if(0!=printf_str::c#1) goto printf_str::@2 +Simple Condition printf_padding::$0 [224] if(printf_padding::i#2=0) goto printf_number_buffer::@1 +Simple Condition printf_number_buffer::$7 [278] if(0==printf_number_buffer::buffer_sign#0) goto printf_number_buffer::@3 +Simple Condition printf_number_buffer::$12 [290] if(0==printf_number_buffer::format_upper_case#0) goto printf_number_buffer::@5 +Simple Condition petscii_to_screencode::$0 [361] if(petscii_to_screencode::petscii#0<$20) goto petscii_to_screencode::@1 +Simple Condition petscii_to_screencode::$1 [364] if(petscii_to_screencode::petscii#0<$40) goto petscii_to_screencode::@2 +Simple Condition petscii_to_screencode::$2 [366] if(petscii_to_screencode::petscii#0<$60) goto petscii_to_screencode::@3 +Simple Condition petscii_to_screencode::$3 [369] if(petscii_to_screencode::petscii#0<$80) goto petscii_to_screencode::@4 +Simple Condition petscii_to_screencode::$4 [372] if(petscii_to_screencode::petscii#0<$a0) goto petscii_to_screencode::@5 +Simple Condition petscii_to_screencode::$5 [375] if(petscii_to_screencode::petscii#0<$ff) goto petscii_to_screencode::@6 +Successful SSA optimization Pass2ConditionalJumpSimplification +Rewriting && if()-condition to two if()s [36] toupper::$2 = toupper::$0 && toupper::$1 +Rewriting ! if()-condition to reversed if() [89] uctoa::$8 = ! uctoa::$7 +Rewriting || if()-condition to two if()s [88] uctoa::$7 = uctoa::started#2 || uctoa::$6 +Rewriting ! if()-condition to reversed if() [261] printf_number_buffer::$5 = ! printf_number_buffer::$4 +Rewriting && if()-condition to two if()s [260] printf_number_buffer::$4 = printf_number_buffer::$3 && printf_number_buffer::padding#10 +Rewriting && if()-condition to two if()s [259] printf_number_buffer::$3 = printf_number_buffer::$1 && printf_number_buffer::$2 +Rewriting ! if()-condition to reversed if() [284] printf_number_buffer::$10 = ! printf_number_buffer::$9 +Rewriting && if()-condition to two if()s [283] printf_number_buffer::$9 = printf_number_buffer::format_zero_padding#0 && printf_number_buffer::padding#10 +Rewriting ! if()-condition to reversed if() [301] printf_number_buffer::$17 = ! printf_number_buffer::$16 +Rewriting && if()-condition to two if()s [300] printf_number_buffer::$16 = printf_number_buffer::$15 && printf_number_buffer::padding#10 +Rewriting && if()-condition to two if()s [299] printf_number_buffer::$15 = printf_number_buffer::format_justify_left#0 && printf_number_buffer::$14 +Rewriting ! if()-condition to reversed if() [330] main::$5 = ! main::$4 +Rewriting && if()-condition to two if()s [329] main::$4 = main::ch#0 && main::$3 +Successful SSA optimization Pass2ConditionalAndOrRewriting +Warning! Adding boolean cast to non-boolean condition uctoa::started#2 +Warning! Adding boolean cast to non-boolean condition printf_number_buffer::format_zero_padding#0 +Warning! Adding boolean cast to non-boolean condition printf_number_buffer::format_justify_left#0 +Warning! Adding boolean cast to non-boolean condition main::ch#0 +Warning! Adding boolean cast to non-boolean condition printf_number_buffer::padding#10 +Warning! Adding boolean cast to non-boolean condition printf_number_buffer::padding#10 +Warning! Adding boolean cast to non-boolean condition printf_number_buffer::padding#10 +Constant right-side identified [175] memcpy::num#0 = (unumber)$19*$28-$28 +Constant right-side identified [180] memcpy::num#1 = (unumber)$19*$28-$28 +Constant right-side identified [207] conio_c64_init::line#1 = (unumber)$19-1 +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant strlen::len#0 = 0 +Constant uctoa::max_digits#0 = 0 +Constant uctoa::digit_values#0 = (char *) 0 +Constant uctoa::max_digits#1 = 3 +Constant uctoa::digit_values#1 = RADIX_DECIMAL_VALUES_CHAR +Constant uctoa::max_digits#2 = 2 +Constant uctoa::digit_values#2 = RADIX_HEXADECIMAL_VALUES_CHAR +Constant uctoa::max_digits#3 = 3 +Constant uctoa::digit_values#3 = RADIX_OCTAL_VALUES_CHAR +Constant uctoa::max_digits#4 = 8 +Constant uctoa::digit_values#4 = RADIX_BINARY_VALUES_CHAR +Constant uctoa::started#0 = 0 +Constant uctoa::digit#0 = 0 +Constant uctoa::started#1 = 1 +Constant uctoa_append::digit#0 = 0 +Constant clrscr::line_text#0 = CONIO_SCREEN_TEXT +Constant clrscr::line_cols#0 = CONIO_SCREEN_COLORS +Constant clrscr::l#0 = 0 +Constant clrscr::c#0 = 0 +Constant gotoxy::y#0 = 0 +Constant gotoxy::x#0 = 0 +Constant memcpy::destination#0 = (void *)CONIO_SCREEN_TEXT +Constant memcpy::source#0 = (void *)CONIO_SCREEN_TEXT+$28 +Constant memcpy::num#0 = (unumber)$19*$28-$28 +Constant memcpy::destination#1 = (void *)CONIO_SCREEN_COLORS +Constant memcpy::source#1 = (void *)CONIO_SCREEN_COLORS+$28 +Constant memcpy::num#1 = (unumber)$19*$28-$28 +Constant memset::str#0 = (void *)CONIO_SCREEN_TEXT+(unsigned int)$19*$28-$28 +Constant memset::c#0 = ' ' +Constant memset::num#0 = $28 +Constant memset::str#1 = (void *)CONIO_SCREEN_COLORS+(unsigned int)$19*$28-$28 +Constant memset::num#1 = $28 +Constant gotoxy::x#1 = 0 +Constant gotoxy::y#1 = 0 +Constant gotoxy::x#2 = 0 +Constant conio_c64_init::line#1 = (unumber)$19-1 +Constant printf_str::c#0 = 0 +Constant printf_padding::i#0 = 0 +Constant printf_uchar::$1 = '+' +Constant printf_uchar::$0 = 0 +Constant uctoa::buffer#5 = (char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS +Constant printf_number_buffer::buffer_digits#0 = (char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS +Constant printf_number_buffer::padding#0 = 0 +Constant printf_number_buffer::padding#2 = 0 +Constant printf_padding::pad#0 = ' ' +Constant printf_padding::pad#1 = '0' +Constant printf_padding::pad#2 = ' ' +Constant main::toD0181_screen#0 = DEFAULT_SCREEN +Constant main::toD0181_gfx#0 = DEFAULT_FONT_MIXED +Constant main::current#0 = 0 +Constant printf_str::putc#1 = &cputc +Constant printf_str::s#2 = main::s +Constant printf_str::putc#2 = &cputc +Constant printf_str::s#3 = main::s1 +Constant printf_uchar::putc#0 = &cputc +Constant printf_uchar::format_min_length#0 = 2 +Constant printf_uchar::format_justify_left#0 = 0 +Constant printf_uchar::format_sign_always#0 = 0 +Constant printf_uchar::format_zero_padding#0 = 0 +Constant printf_uchar::format_upper_case#0 = 0 +Constant printf_uchar::format_radix#0 = HEXADECIMAL +Constant printf_str::putc#3 = &cputc +Constant printf_str::s#4 = main::s2 +Constant petscii_to_screencode::return#7 = $5e +Successful SSA optimization Pass2ConstantIdentification +Constant uctoa::radix#0 = printf_uchar::format_radix#0 +Constant printf_number_buffer::putc#0 = printf_uchar::putc#0 +Constant printf_number_buffer::format_min_length#0 = printf_uchar::format_min_length#0 +Constant printf_number_buffer::format_justify_left#0 = printf_uchar::format_justify_left#0 +Constant printf_number_buffer::format_sign_always#0 = printf_uchar::format_sign_always#0 +Constant printf_number_buffer::format_zero_padding#0 = printf_uchar::format_zero_padding#0 +Constant printf_number_buffer::format_upper_case#0 = printf_uchar::format_upper_case#0 +Constant printf_number_buffer::format_radix#0 = printf_uchar::format_radix#0 +Constant strlen::str#1 = printf_number_buffer::buffer_digits#0 +Constant printf_str::s#1 = printf_number_buffer::buffer_digits#0 +Constant strupr::str#0 = printf_number_buffer::buffer_digits#0 +Constant main::toD0181_$7 = (unsigned int)main::toD0181_screen#0 +Successful SSA optimization Pass2ConstantIdentification +Constant printf_number_buffer::$25 = (signed char)printf_number_buffer::format_min_length#0 +Constant printf_padding::putc#0 = printf_number_buffer::putc#0 +Constant printf_padding::putc#1 = printf_number_buffer::putc#0 +Constant printf_str::putc#0 = printf_number_buffer::putc#0 +Constant strupr::return#2 = strupr::str#0 +Constant printf_padding::putc#2 = printf_number_buffer::putc#0 +Successful SSA optimization Pass2ConstantIdentification +Constant value identified (unsigned int)main::toD0181_gfx#0 in [317] main::toD0181_$3 = byte1 (unsigned int)main::toD0181_gfx#0 +Successful SSA optimization Pass2ConstantValues +Replacing constant pointer function [287] callexecute cputc +Successful SSA optimization Pass2ConstantCallPointerIdentification +if() condition always false - eliminating [56] if(uctoa::radix#0==DECIMAL) goto uctoa::@1 +if() condition always true - replacing block destination [60] if(uctoa::radix#0==HEXADECIMAL) goto uctoa::@2 +if() condition always false - eliminating [64] if(uctoa::radix#0==OCTAL) goto uctoa::@3 +if() condition always false - eliminating [68] if(uctoa::radix#0==BINARY) goto uctoa::@4 +if() condition always false - eliminating [232] if(0!=printf_uchar::format_sign_always#0) goto printf_uchar::@1 +Removing PHI-reference to removed block (printf_number_buffer) in block printf_number_buffer::@1 +if() condition always false - eliminating [255] if(0==printf_number_buffer::format_min_length#0) goto printf_number_buffer::@1 +if() condition always true - replacing block destination [290] if(0==printf_number_buffer::format_upper_case#0) goto printf_number_buffer::@5 +Successful SSA optimization Pass2ConstantIfs +Rewriting conditional comparison [136] if(gotoxy::y#3<=$19) goto gotoxy::@1 +Simplifying expression containing zero (char *)&printf_buffer in [236] *((char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_SIGN) = printf_uchar::$2 +Simplifying expression containing zero (char *)&printf_buffer in [242] printf_number_buffer::buffer_sign#0 = *((char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_SIGN) +Successful SSA optimization PassNSimplifyExpressionWithZero +Eliminating variable toupper::$0 from unused block toupper +Eliminating variable toupper::$1 from unused block toupper +Eliminating variable toupper::return#0 from unused block toupper::@1 +Eliminating variable toupper::return#2 from unused block toupper::@return +Eliminating variable strupr::src#2 from unused block strupr::@1 +Eliminating variable toupper::ch#0 from unused block strupr::@2 +Eliminating variable toupper::return#3 from unused block strupr::@2 +Eliminating variable strupr::$0 from unused block strupr::@4 +Eliminating variable strupr::src#1 from unused block strupr::@4 +Eliminating variable uctoa::buffer#0 from unused block uctoa::@9 +Eliminating variable uctoa::buffer#1 from unused block uctoa::@9 +Eliminating variable uctoa::buffer#2 from unused block uctoa::@9 +Eliminating variable main::return#0 from unused block main::@return +Removing unused procedure toupper +Removing unused procedure block toupper +Removing unused procedure block toupper::@1 +Removing PHI-reference to removed block (toupper::@1) in block toupper::@return +Removing unused procedure block toupper::@2 +Removing PHI-reference to removed block (toupper::@2) in block toupper::@return +Removing unused procedure block toupper::@return +Removing unused procedure block toupper::@3 +Removing unused procedure strupr +Removing unused procedure block strupr +Removing PHI-reference to removed block (strupr) in block strupr::@1 +Removing unused procedure block strupr::@1 +Removing unused procedure block strupr::@2 +Removing unused procedure block strupr::@4 +Removing unused procedure block strupr::@3 +Removing unused procedure block strupr::@return +Removing PHI-reference to removed block (uctoa::@1) in block uctoa::@5 +Removing PHI-reference to removed block (uctoa::@1) in block uctoa::@5 +Removing unused block uctoa::@1 +Removing unused block uctoa::@7 +Removing PHI-reference to removed block (uctoa::@3) in block uctoa::@5 +Removing PHI-reference to removed block (uctoa::@3) in block uctoa::@5 +Removing unused block uctoa::@3 +Removing unused block uctoa::@8 +Removing PHI-reference to removed block (uctoa::@4) in block uctoa::@5 +Removing PHI-reference to removed block (uctoa::@4) in block uctoa::@5 +Removing unused block uctoa::@4 +Removing unused block uctoa::@9 +Removing PHI-reference to removed block (printf_uchar::@1) in block printf_uchar::@3 +Removing unused block printf_uchar::@1 +Removing unused block printf_number_buffer::@11 +Removing unused block printf_number_buffer::@19 +Removing unused block main::@return +Successful SSA optimization Pass2EliminateUnusedBlocks +Eliminating unused variable memcpy::return#2 and assignment [100] memcpy::return#2 = memcpy::destination#2 +Eliminating unused variable memcpy::return#3 and assignment [102] memcpy::return#3 = memcpy::destination#2 +Eliminating unused variable memset::return#2 and assignment [104] memset::return#2 = memset::str#3 +Eliminating unused variable memset::return#3 and assignment [107] memset::return#3 = memset::str#3 +Eliminating unused variable main::return#1 and assignment [221] main::return#1 = main::return#0(null) +Eliminating unused constant BINARY +Eliminating unused constant OCTAL +Eliminating unused constant DECIMAL +Eliminating unused constant uctoa::max_digits#0 +Eliminating unused constant uctoa::digit_values#0 +Eliminating unused constant uctoa::max_digits#1 +Eliminating unused constant uctoa::digit_values#1 +Eliminating unused constant uctoa::max_digits#3 +Eliminating unused constant uctoa::digit_values#3 +Eliminating unused constant uctoa::max_digits#4 +Eliminating unused constant uctoa::digit_values#4 +Eliminating unused constant uctoa::radix#0 +Eliminating unused constant printf_str::c#0 +Eliminating unused constant printf_uchar::$1 +Eliminating unused constant printf_number_buffer::padding#0 +Eliminating unused constant printf_number_buffer::format_sign_always#0 +Eliminating unused constant printf_number_buffer::format_upper_case#0 +Eliminating unused constant printf_number_buffer::format_radix#0 +Eliminating unused constant OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_SIGN +Successful SSA optimization PassNEliminateUnusedVars +Eliminating unused constant RADIX_BINARY_VALUES_CHAR +Eliminating unused constant RADIX_OCTAL_VALUES_CHAR +Eliminating unused constant RADIX_DECIMAL_VALUES_CHAR +Eliminating unused constant printf_uchar::format_sign_always#0 +Eliminating unused constant printf_uchar::format_upper_case#0 +Eliminating unused constant printf_uchar::format_radix#0 +Successful SSA optimization PassNEliminateUnusedVars +Eliminating unused constant HEXADECIMAL +Successful SSA optimization PassNEliminateUnusedVars +Adding number conversion cast (unumber) 0 in uctoa::$11 = 0 != uctoa::started#2 +Adding number conversion cast (unumber) $19+1 in if(gotoxy::y#3<$19+1) goto gotoxy::@1 +Adding number conversion cast (unumber) 1 in if(gotoxy::y#3<(unumber)$19+1) goto gotoxy::@1 +Adding number conversion cast (unumber) 0 in printf_number_buffer::$33 = 0 != printf_number_buffer::format_zero_padding#0 +Adding number conversion cast (unumber) 0 in printf_number_buffer::$34 = 0 != printf_number_buffer::format_justify_left#0 +Adding number conversion cast (unumber) 0 in main::$8 = 0 != main::ch#0 +Adding number conversion cast (snumber) 0 in printf_number_buffer::$35 = 0 != printf_number_buffer::padding#10 +Adding number conversion cast (snumber) 0 in printf_number_buffer::$36 = 0 != printf_number_buffer::padding#10 +Adding number conversion cast (snumber) 0 in printf_number_buffer::$37 = 0 != printf_number_buffer::padding#10 +Successful SSA optimization PassNAddNumberTypeConversions +Simplifying constant integer cast 0 +Simplifying constant integer cast $19+(unumber)1 +Simplifying constant integer cast 1 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Successful SSA optimization PassNCastSimplification +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 1 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 0 +Finalized signed number type (signed char) 0 +Finalized signed number type (signed char) 0 +Finalized signed number type (signed char) 0 +Successful SSA optimization PassNFinalizeNumberTypeConversions +Alias candidate removed (volatile)conio_line_text = gotoxy::$5 +Alias candidate removed (volatile)conio_line_color = gotoxy::$6 +Alias candidate removed (volatile)memset::c#1 = conio_textcolor +Identical Phi Values uctoa::max_digits#7 uctoa::max_digits#2 +Identical Phi Values uctoa::digit_values#8 uctoa::digit_values#2 +Identical Phi Values printf_uchar::$2 printf_uchar::$0 +Successful SSA optimization Pass2IdenticalPhiElimination +Simple Condition uctoa::$11 [34] if(0!=uctoa::started#2) goto uctoa::@14 +Simple Condition printf_number_buffer::$1 [142] if(0==printf_number_buffer::format_justify_left#0) goto printf_number_buffer::@22 +Simple Condition printf_number_buffer::$33 [156] if(0!=printf_number_buffer::format_zero_padding#0) goto printf_number_buffer::@23 +Simple Condition printf_number_buffer::$34 [165] if(0!=printf_number_buffer::format_justify_left#0) goto printf_number_buffer::@25 +Simple Condition main::$8 [184] if(0!=main::ch#0) goto main::@11 +Simple Condition uctoa::$6 [218] if(uctoa::value#2>=uctoa::digit_value#0) goto uctoa::@14 +Simple Condition printf_number_buffer::$35 [220] if(0!=printf_number_buffer::padding#10) goto printf_number_buffer::@8 +Simple Condition printf_number_buffer::$2 [221] if(0==printf_number_buffer::format_zero_padding#0) goto printf_number_buffer::@21 +Simple Condition printf_number_buffer::$36 [223] if(0!=printf_number_buffer::padding#10) goto printf_number_buffer::@10 +Simple Condition printf_number_buffer::$37 [225] if(0!=printf_number_buffer::padding#10) goto printf_number_buffer::@12 +Simple Condition printf_number_buffer::$14 [226] if(0==printf_number_buffer::format_zero_padding#0) goto printf_number_buffer::@24 +Simple Condition main::$3 [227] if(main::ch#0!=main::current#2) goto main::@2 +Successful SSA optimization Pass2ConditionalJumpSimplification +Negating conditional jump and destination [142] if(0!=printf_number_buffer::format_justify_left#0) goto printf_number_buffer::@2 +Negating conditional jump and destination [156] if(0==printf_number_buffer::format_zero_padding#0) goto printf_number_buffer::@4 +Negating conditional jump and destination [165] if(0==printf_number_buffer::format_justify_left#0) goto printf_number_buffer::@return +Negating conditional jump and destination [184] if(0==main::ch#0) goto main::@1 +Negating conditional jump and destination [221] if(0!=printf_number_buffer::format_zero_padding#0) goto printf_number_buffer::@2 +Negating conditional jump and destination [226] if(0!=printf_number_buffer::format_zero_padding#0) goto printf_number_buffer::@return +Successful SSA optimization Pass2ConditionalJumpSequenceImprovement +Constant right-side identified [29] uctoa::$4 = uctoa::max_digits#2 - 1 +Constant right-side identified [169] main::toD0181_$0 = main::toD0181_$7 & $3fff +Constant right-side identified [172] main::toD0181_$3 = byte1 (unsigned int)main::toD0181_gfx#0 +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant uctoa::$4 = uctoa::max_digits#2-1 +Constant main::toD0181_$0 = main::toD0181_$7&$3fff +Constant main::toD0181_$3 = byte1 (unsigned int)main::toD0181_gfx#0 +Successful SSA optimization Pass2ConstantIdentification +if() condition always false - eliminating [142] if(0!=printf_number_buffer::format_justify_left#0) goto printf_number_buffer::@2 +if() condition always true - replacing block destination [156] if(0==printf_number_buffer::format_zero_padding#0) goto printf_number_buffer::@4 +if() condition always true - replacing block destination [165] if(0==printf_number_buffer::format_justify_left#0) goto printf_number_buffer::@return +if() condition always false - eliminating [221] if(0!=printf_number_buffer::format_zero_padding#0) goto printf_number_buffer::@2 +if() condition always false - eliminating [226] if(0!=printf_number_buffer::format_zero_padding#0) goto printf_number_buffer::@return +Successful SSA optimization Pass2ConstantIfs +Eliminating variable printf_padding::length#1 from unused block printf_number_buffer::@10 +Eliminating variable printf_padding::length#2 from unused block printf_number_buffer::@12 +Removing PHI-reference to removed block (printf_number_buffer::@10) in block printf_padding +Removing PHI-reference to removed block (printf_number_buffer::@10) in block printf_padding +Removing PHI-reference to removed block (printf_number_buffer::@10) in block printf_padding +Removing unused block printf_number_buffer::@10 +Removing unused block printf_number_buffer::@17 +Removing PHI-reference to removed block (printf_number_buffer::@12) in block printf_padding +Removing PHI-reference to removed block (printf_number_buffer::@12) in block printf_padding +Removing PHI-reference to removed block (printf_number_buffer::@12) in block printf_padding +Removing unused block printf_number_buffer::@12 +Removing unused block printf_number_buffer::@20 +Removing unused block printf_number_buffer::@23 +Removing unused block printf_number_buffer::@24 +Removing unused block printf_number_buffer::@25 +Successful SSA optimization Pass2EliminateUnusedBlocks +Eliminating unused constant printf_padding::pad#1 +Eliminating unused constant printf_padding::pad#2 +Eliminating unused constant printf_padding::putc#1 +Eliminating unused constant printf_padding::putc#2 +Eliminating unused constant printf_number_buffer::format_justify_left#0 +Eliminating unused constant printf_number_buffer::format_zero_padding#0 +Successful SSA optimization PassNEliminateUnusedVars +Eliminating unused constant printf_uchar::format_justify_left#0 +Eliminating unused constant printf_uchar::format_zero_padding#0 +Successful SSA optimization PassNEliminateUnusedVars +Alias candidate removed (volatile)conio_line_text = gotoxy::$5 +Alias candidate removed (volatile)conio_line_color = gotoxy::$6 +Alias candidate removed (volatile)memset::c#1 = conio_textcolor +Identical Phi Values printf_padding::length#4 printf_padding::length#0 +Identical Phi Values printf_padding::pad#5 printf_padding::pad#0 +Identical Phi Values printf_padding::putc#5 printf_padding::putc#0 +Successful SSA optimization Pass2IdenticalPhiElimination +Constant right-side identified [152] main::toD0181_$1 = main::toD0181_$0 * 4 +Constant right-side identified [154] main::toD0181_$4 = main::toD0181_$3 / 4 +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant main::toD0181_$1 = main::toD0181_$0*4 +Constant main::toD0181_$4 = main::toD0181_$3/4 +Successful SSA optimization Pass2ConstantIdentification +Replacing constant pointer function [124] callexecute cputc +Successful SSA optimization Pass2ConstantCallPointerIdentification +Eliminating unused constant printf_padding::putc#0 +Successful SSA optimization PassNEliminateUnusedVars +Alias candidate removed (volatile)conio_line_text = gotoxy::$5 +Alias candidate removed (volatile)conio_line_color = gotoxy::$6 +Alias candidate removed (volatile)memset::c#1 = conio_textcolor +Constant right-side identified [151] main::toD0181_$2 = byte1 main::toD0181_$1 +Constant right-side identified [152] main::toD0181_$5 = main::toD0181_$4 & $f +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant main::toD0181_$2 = byte1 main::toD0181_$1 +Constant main::toD0181_$5 = main::toD0181_$4&$f +Successful SSA optimization Pass2ConstantIdentification +Alias candidate removed (volatile)conio_line_text = gotoxy::$5 +Alias candidate removed (volatile)conio_line_color = gotoxy::$6 +Alias candidate removed (volatile)memset::c#1 = conio_textcolor +Constant right-side identified [151] main::toD0181_return#0 = main::toD0181_$2 | main::toD0181_$5 +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant main::toD0181_return#0 = main::toD0181_$2|main::toD0181_$5 +Successful SSA optimization Pass2ConstantIdentification +Alias candidate removed (volatile)conio_line_text = gotoxy::$5 +Alias candidate removed (volatile)conio_line_color = gotoxy::$6 +Alias candidate removed (volatile)memset::c#1 = conio_textcolor +Inlining Noop Cast [1] memcpy::src#0 = (char *)memcpy::source#2 keeping memcpy::source#2 +Inlining Noop Cast [2] memcpy::dst#0 = (char *)memcpy::destination#2 keeping memcpy::destination#2 +Inlining Noop Cast [3] memcpy::$2 = (char *)memcpy::source#2 keeping memcpy::source#2 +Inlining Noop Cast [13] memset::$4 = (char *)memset::str#3 keeping memset::str#3 +Inlining Noop Cast [15] memset::dst#0 = (char *)memset::str#3 keeping memset::str#3 +Successful SSA optimization Pass2NopCastInlining +Rewriting multiplication to use shift and addition[72] gotoxy::line_offset#0 = gotoxy::$7 * $28 +Inlining constant with var siblings memcpy::destination#0 +Inlining constant with var siblings memcpy::source#0 +Inlining constant with var siblings memcpy::num#0 +Inlining constant with var siblings memcpy::destination#1 +Inlining constant with var siblings memcpy::source#1 +Inlining constant with var siblings memcpy::num#1 +Inlining constant with var siblings memset::str#0 +Inlining constant with var siblings memset::c#0 +Inlining constant with var siblings memset::num#0 +Inlining constant with var siblings memset::str#1 +Inlining constant with var siblings memset::num#1 +Inlining constant with var siblings strlen::len#0 +Inlining constant with var siblings strlen::str#1 +Inlining constant with var siblings uctoa::started#0 +Inlining constant with var siblings uctoa::digit#0 +Inlining constant with var siblings uctoa::started#1 +Inlining constant with var siblings uctoa::buffer#5 +Inlining constant with var siblings uctoa_append::digit#0 +Inlining constant with var siblings clrscr::line_text#0 +Inlining constant with var siblings clrscr::line_cols#0 +Inlining constant with var siblings clrscr::l#0 +Inlining constant with var siblings clrscr::c#0 +Inlining constant with var siblings gotoxy::y#0 +Inlining constant with var siblings gotoxy::x#0 +Inlining constant with var siblings gotoxy::x#1 +Inlining constant with var siblings gotoxy::y#1 +Inlining constant with var siblings gotoxy::x#2 +Inlining constant with var siblings conio_c64_init::line#1 +Inlining constant with var siblings printf_str::putc#1 +Inlining constant with var siblings printf_str::s#2 +Inlining constant with var siblings printf_str::putc#2 +Inlining constant with var siblings printf_str::s#3 +Inlining constant with var siblings printf_str::putc#3 +Inlining constant with var siblings printf_str::s#4 +Inlining constant with var siblings printf_str::s#1 +Inlining constant with var siblings printf_str::putc#0 +Inlining constant with var siblings printf_padding::i#0 +Inlining constant with var siblings printf_number_buffer::padding#2 +Inlining constant with var siblings main::current#0 +Inlining constant with var siblings petscii_to_screencode::return#7 +Constant inlined uctoa_append::digit#0 = 0 +Constant inlined printf_str::putc#0 = printf_uchar::putc#0 +Constant inlined printf_str::putc#1 = &cputc +Constant inlined memset::num#1 = $28 +Constant inlined printf_str::putc#2 = &cputc +Constant inlined memset::num#0 = $28 +Constant inlined printf_str::putc#3 = &cputc +Constant inlined printf_number_buffer::$25 = (signed char)printf_uchar::format_min_length#0 +Constant inlined clrscr::l#0 = 0 +Constant inlined strlen::len#0 = 0 +Constant inlined petscii_to_screencode::return#7 = $5e +Constant inlined printf_str::s#3 = main::s1 +Constant inlined printf_str::s#4 = main::s2 +Constant inlined CONIO_SCREEN_TEXT = DEFAULT_SCREEN +Constant inlined printf_str::s#1 = printf_number_buffer::buffer_digits#0 +Constant inlined printf_str::s#2 = main::s +Constant inlined printf_number_buffer::padding#2 = 0 +Constant inlined uctoa::digit#0 = 0 +Constant inlined main::toD0181_$7 = (unsigned int)DEFAULT_SCREEN +Constant inlined main::current#0 = 0 +Constant inlined clrscr::line_text#0 = DEFAULT_SCREEN +Constant inlined main::toD0181_$2 = byte1 (unsigned int)DEFAULT_SCREEN&$3fff*4 +Constant inlined main::toD0181_$1 = (unsigned int)DEFAULT_SCREEN&$3fff*4 +Constant inlined main::toD0181_$0 = (unsigned int)DEFAULT_SCREEN&$3fff +Constant inlined memcpy::source#0 = (void *)DEFAULT_SCREEN+$28 +Constant inlined main::toD0181_$5 = byte1 (unsigned int)DEFAULT_FONT_MIXED/4&$f +Constant inlined main::toD0181_$4 = byte1 (unsigned int)DEFAULT_FONT_MIXED/4 +Constant inlined main::toD0181_$3 = byte1 (unsigned int)DEFAULT_FONT_MIXED +Constant inlined gotoxy::x#0 = 0 +Constant inlined gotoxy::x#1 = 0 +Constant inlined gotoxy::x#2 = 0 +Constant inlined memset::c#0 = ' ' +Constant inlined main::toD0181_screen#0 = DEFAULT_SCREEN +Constant inlined main::toD0181_gfx#0 = DEFAULT_FONT_MIXED +Constant inlined uctoa::$4 = uctoa::max_digits#2-1 +Constant inlined uctoa::digit_values#2 = RADIX_HEXADECIMAL_VALUES_CHAR +Constant inlined uctoa::started#0 = 0 +Constant inlined uctoa::started#1 = 1 +Constant inlined printf_uchar::$0 = 0 +Constant inlined strlen::str#1 = printf_number_buffer::buffer_digits#0 +Constant inlined memcpy::destination#0 = (void *)DEFAULT_SCREEN +Constant inlined memcpy::destination#1 = (void *)COLORRAM +Constant inlined conio_c64_init::line#1 = (char)$19-1 +Constant inlined memcpy::source#1 = (void *)COLORRAM+$28 +Constant inlined printf_number_buffer::format_min_length#0 = printf_uchar::format_min_length#0 +Constant inlined CONIO_TEXTCOLOR_DEFAULT = LIGHT_BLUE +Constant inlined memset::str#1 = (void *)COLORRAM+(unsigned int)$19*$28-$28 +Constant inlined memset::str#0 = (void *)DEFAULT_SCREEN+(unsigned int)$19*$28-$28 +Constant inlined printf_padding::i#0 = 0 +Constant inlined CONIO_SCREEN_COLORS = COLORRAM +Constant inlined printf_number_buffer::putc#0 = printf_uchar::putc#0 +Constant inlined uctoa::buffer#5 = (char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS +Constant inlined memcpy::num#1 = (unsigned int)$19*$28-$28 +Constant inlined memcpy::num#0 = (unsigned int)$19*$28-$28 +Constant inlined gotoxy::y#0 = 0 +Constant inlined gotoxy::y#1 = 0 +Constant inlined clrscr::c#0 = 0 +Constant inlined clrscr::line_cols#0 = COLORRAM +Successful SSA optimization Pass2ConstantInlining +Alias candidate removed (volatile)conio_line_text = gotoxy::$5 +Alias candidate removed (volatile)conio_line_color = gotoxy::$6 +Alias candidate removed (volatile)memset::c#1 = conio_textcolor +Alias gotoxy::line_offset#0 = gotoxy::$10 +Successful SSA optimization Pass2AliasElimination +Alias candidate removed (volatile)conio_line_text = gotoxy::$5 +Alias candidate removed (volatile)conio_line_color = gotoxy::$6 +Alias candidate removed (volatile)memset::c#1 = conio_textcolor +Identical Phi Values memcpy::num#2 (unsigned int)$19*$28-$28 +Identical Phi Values memset::num#2 $28 +Identical Phi Values gotoxy::x#3 0 +Successful SSA optimization Pass2IdenticalPhiElimination +Identical Phi Values gotoxy::x#4 0 +Successful SSA optimization Pass2IdenticalPhiElimination +if() condition always false - eliminating [9] if($28<=0) goto memset::@1 +if() condition always true - replacing block destination [62] if(0<$28) goto gotoxy::@2 +Successful SSA optimization Pass2ConstantIfs +Removing unused block gotoxy::@4 +Successful SSA optimization Pass2EliminateUnusedBlocks +Alias candidate removed (volatile)conio_line_text = gotoxy::$5 +Alias candidate removed (volatile)conio_line_color = gotoxy::$6 +Alias candidate removed (volatile)memset::c#1 = conio_textcolor +Finalized unsigned number type (char) 2 +Finalized unsigned number type (char) 8 +Finalized unsigned number type (char) $a +Finalized unsigned number type (char) $10 +Finalized unsigned number type (char) $b +Finalized unsigned number type (char) $b +Finalized unsigned number type (char) $19 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) $19 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) $19 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) $19 +Finalized unsigned number type (char) 1 +Finalized unsigned number type (char) 1 +Finalized unsigned number type (char) 1 +Finalized unsigned number type (char) 1 +Finalized unsigned number type (char) 1 +Successful SSA optimization PassNFinalizeNumberTypeConversions +Simplifying constant integer cast $19-1 +Successful SSA optimization PassNCastSimplification +Alias candidate removed (volatile)conio_line_text = gotoxy::$5 +Alias candidate removed (volatile)conio_line_color = gotoxy::$6 +Alias candidate removed (volatile)memset::c#1 = conio_textcolor +Alias candidate removed (volatile)conio_line_text = gotoxy::$5 +Alias candidate removed (volatile)conio_line_color = gotoxy::$6 +Alias candidate removed (volatile)memset::c#1 = conio_textcolor +Added new block during phi lifting uctoa::@17(between uctoa::@16 and uctoa::@13) +Added new block during phi lifting gotoxy::@5(between gotoxy and gotoxy::@1) +Added new block during phi lifting conio_c64_init::@4(between conio_c64_init and conio_c64_init::@1) +Added new block during phi lifting printf_number_buffer::@26(between printf_number_buffer::@13 and printf_number_buffer::@1) +Added new block during phi lifting printf_number_buffer::@27(between printf_number_buffer::@15 and printf_number_buffer::@13) +Added new block during phi lifting main::@12(between main::@5 and main::@1) +Adding NOP phi() at start of __start +Adding NOP phi() at start of __start::@2 +Adding NOP phi() at start of __start::@1 +Adding NOP phi() at start of __start::@3 +Adding NOP phi() at start of conio_c64_init::@2 +Adding NOP phi() at start of conio_c64_init::@3 +Adding NOP phi() at start of cputc::@3 +Adding NOP phi() at start of cputc::@5 +Adding NOP phi() at start of cputc::@1 +Adding NOP phi() at start of cputc::@4 +Adding NOP phi() at start of main +Adding NOP phi() at start of main::toD0181 +Adding NOP phi() at start of main::toD0181_@return +Adding NOP phi() at start of main::@4 +Adding NOP phi() at start of main::@9 +Adding NOP phi() at start of gotoxy::@3 +Adding NOP phi() at start of cputln::@1 +Adding NOP phi() at start of clrscr +Adding NOP phi() at start of clrscr::@2 +Adding NOP phi() at start of petscii_to_screencode::@12 +Adding NOP phi() at start of printf_uchar +Adding NOP phi() at start of printf_uchar::@2 +Adding NOP phi() at start of printf_uchar::@5 +Adding NOP phi() at start of cscroll::@2 +Adding NOP phi() at start of cscroll::@8 +Adding NOP phi() at start of cscroll::@3 +Adding NOP phi() at start of cscroll::@4 +Adding NOP phi() at start of cscroll::@5 +Adding NOP phi() at start of uctoa +Adding NOP phi() at start of uctoa::@6 +Adding NOP phi() at start of uctoa::@2 +Adding NOP phi() at start of printf_number_buffer +Adding NOP phi() at start of printf_number_buffer::@6 +Adding NOP phi() at start of printf_number_buffer::@14 +Adding NOP phi() at start of printf_number_buffer::@22 +Adding NOP phi() at start of printf_number_buffer::@3 +Adding NOP phi() at start of printf_number_buffer::@4 +Adding NOP phi() at start of printf_number_buffer::@5 +Adding NOP phi() at start of printf_number_buffer::@18 +Adding NOP phi() at start of printf_number_buffer::@16 +Adding NOP phi() at start of memcpy::@3 +Adding NOP phi() at start of memset::@1 +Adding NOP phi() at start of strlen +Adding NOP phi() at start of strlen::@3 +Adding NOP phi() at start of printf_padding +CALL GRAPH +Calls in [__start] to conio_c64_init:3 main:6 +Calls in [conio_c64_init] to gotoxy:15 +Calls in [cputc] to cputln:26 cputln:30 +Calls in [main] to clrscr:36 GETIN:39 petscii_to_screencode:45 printf_str:48 cputc:50 printf_str:52 printf_uchar:54 printf_str:56 +Calls in [cputln] to cscroll:79 +Calls in [printf_str] to null:134 +Calls in [printf_uchar] to uctoa:141 printf_number_buffer:143 +Calls in [cscroll] to gotoxy:149 memcpy:153 memcpy:155 memset:157 memset:160 +Calls in [uctoa] to uctoa_append:189 +Calls in [printf_number_buffer] to strlen:197 cputc:213 printf_str:218 printf_padding:222 +Calls in [printf_padding] to cputc:272 + +Created 33 initial phi equivalence classes +Coalesced [14] gotoxy::y#7 = gotoxy::y#2 +Coalesced [18] conio_c64_init::line#3 = conio_c64_init::line#0 +Not coalescing [57] main::current#4 = main::ch#0 +Coalesced (already) [58] main::current#5 = main::current#2 +Coalesced [74] gotoxy::y#8 = gotoxy::y#3 +Coalesced [96] clrscr::l#7 = clrscr::l#1 +Coalesced [97] clrscr::line_text#7 = clrscr::line_text#1 +Coalesced [98] clrscr::line_cols#7 = clrscr::line_cols#1 +Coalesced [102] clrscr::c#4 = clrscr::c#1 +Coalesced [116] petscii_to_screencode::return#16 = petscii_to_screencode::return#6 +Coalesced [118] petscii_to_screencode::return#15 = petscii_to_screencode::return#5 +Coalesced [120] petscii_to_screencode::return#14 = petscii_to_screencode::return#4 +Coalesced [122] petscii_to_screencode::return#13 = petscii_to_screencode::return#3 +Coalesced [123] petscii_to_screencode::return#12 = petscii_to_screencode::petscii#0 +Coalesced [125] petscii_to_screencode::return#11 = petscii_to_screencode::return#1 +Coalesced [127] printf_str::s#8 = printf_str::s#6 +Coalesced [136] printf_str::s#9 = printf_str::s#0 +Coalesced [159] memset::c#6 = memset::c#1 +Coalesced [167] uctoa::value#17 = uctoa::value#1 +Coalesced [177] uctoa::value#18 = uctoa::value#2 +Coalesced [178] uctoa::started#6 = uctoa::started#2 +Coalesced [179] uctoa::buffer#23 = uctoa::buffer#11 +Coalesced [182] uctoa::digit#7 = uctoa::digit#1 +Coalesced (already) [183] uctoa::value#16 = uctoa::value#6 +Coalesced (already) [184] uctoa::started#5 = uctoa::started#4 +Coalesced (already) [185] uctoa::buffer#22 = uctoa::buffer#14 +Coalesced [193] uctoa::value#19 = uctoa::value#0 +Coalesced [194] uctoa::buffer#24 = uctoa::buffer#4 +Coalesced [203] printf_number_buffer::len#5 = printf_number_buffer::len#1 +Coalesced [224] printf_number_buffer::padding#17 = printf_number_buffer::padding#1 +Coalesced [225] printf_number_buffer::len#4 = printf_number_buffer::len#0 +Coalesced [237] memcpy::src#5 = memcpy::src#1 +Coalesced [238] memcpy::dst#5 = memcpy::dst#1 +Coalesced [248] memset::dst#5 = memset::dst#1 +Coalesced [249] uctoa_append::value#6 = uctoa_append::value#0 +Coalesced [256] uctoa_append::value#7 = uctoa_append::value#1 +Coalesced [257] uctoa_append::digit#5 = uctoa_append::digit#1 +Coalesced [265] strlen::str#5 = strlen::str#0 +Coalesced [266] strlen::len#5 = strlen::len#1 +Coalesced [275] printf_padding::i#5 = printf_padding::i#1 +Coalesced down to 29 phi equivalence classes +Culled Empty Block label __start::@2 +Culled Empty Block label __start::@3 +Culled Empty Block label conio_c64_init::@2 +Culled Empty Block label conio_c64_init::@3 +Culled Empty Block label cputc::@5 +Culled Empty Block label cputc::@4 +Culled Empty Block label main::toD0181_@return +Culled Empty Block label main::@4 +Culled Empty Block label main::@12 +Culled Empty Block label gotoxy::@3 +Culled Empty Block label cputln::@1 +Culled Empty Block label clrscr::@2 +Culled Empty Block label petscii_to_screencode::@12 +Culled Empty Block label petscii_to_screencode::@2 +Culled Empty Block label printf_uchar::@2 +Culled Empty Block label printf_uchar::@5 +Culled Empty Block label cscroll::@8 +Culled Empty Block label uctoa::@6 +Culled Empty Block label uctoa::@2 +Culled Empty Block label uctoa::@5 +Culled Empty Block label uctoa::@17 +Culled Empty Block label printf_number_buffer::@14 +Culled Empty Block label printf_number_buffer::@22 +Culled Empty Block label printf_number_buffer::@3 +Culled Empty Block label printf_number_buffer::@4 +Culled Empty Block label printf_number_buffer::@18 +Culled Empty Block label printf_number_buffer::@16 +Culled Empty Block label printf_number_buffer::@27 +Culled Empty Block label memcpy::@3 +Culled Empty Block label memset::@1 +Culled Empty Block label strlen::@3 +Renumbering block memset::@2 to memset::@1 +Renumbering block memset::@3 to memset::@2 +Renumbering block memset::@4 to memset::@3 +Renumbering block uctoa::@10 to uctoa::@1 +Renumbering block uctoa::@11 to uctoa::@2 +Renumbering block uctoa::@12 to uctoa::@3 +Renumbering block uctoa::@13 to uctoa::@4 +Renumbering block uctoa::@14 to uctoa::@5 +Renumbering block uctoa::@15 to uctoa::@6 +Renumbering block uctoa::@16 to uctoa::@7 +Renumbering block clrscr::@3 to clrscr::@2 +Renumbering block clrscr::@4 to clrscr::@3 +Renumbering block clrscr::@5 to clrscr::@4 +Renumbering block clrscr::@6 to clrscr::@5 +Renumbering block gotoxy::@5 to gotoxy::@3 +Renumbering block conio_c64_init::@4 to conio_c64_init::@2 +Renumbering block printf_uchar::@3 to printf_uchar::@1 +Renumbering block printf_uchar::@4 to printf_uchar::@2 +Renumbering block printf_number_buffer::@5 to printf_number_buffer::@3 +Renumbering block printf_number_buffer::@6 to printf_number_buffer::@4 +Renumbering block printf_number_buffer::@7 to printf_number_buffer::@5 +Renumbering block printf_number_buffer::@8 to printf_number_buffer::@6 +Renumbering block printf_number_buffer::@9 to printf_number_buffer::@7 +Renumbering block printf_number_buffer::@13 to printf_number_buffer::@8 +Renumbering block printf_number_buffer::@15 to printf_number_buffer::@9 +Renumbering block printf_number_buffer::@21 to printf_number_buffer::@10 +Renumbering block printf_number_buffer::@26 to printf_number_buffer::@11 +Renumbering block main::@5 to main::@4 +Renumbering block main::@6 to main::@5 +Renumbering block main::@7 to main::@6 +Renumbering block main::@8 to main::@7 +Renumbering block main::@9 to main::@8 +Renumbering block main::@10 to main::@9 +Renumbering block main::@11 to main::@10 +Renumbering block petscii_to_screencode::@3 to petscii_to_screencode::@2 +Renumbering block petscii_to_screencode::@4 to petscii_to_screencode::@3 +Renumbering block petscii_to_screencode::@5 to petscii_to_screencode::@4 +Renumbering block petscii_to_screencode::@6 to petscii_to_screencode::@5 +Renumbering block petscii_to_screencode::@7 to petscii_to_screencode::@6 +Renumbering block petscii_to_screencode::@8 to petscii_to_screencode::@7 +Renumbering block petscii_to_screencode::@9 to petscii_to_screencode::@8 +Renumbering block petscii_to_screencode::@10 to petscii_to_screencode::@9 +Renumbering block petscii_to_screencode::@11 to petscii_to_screencode::@10 +Adding NOP phi() at start of __start +Adding NOP phi() at start of __start::@1 +Adding NOP phi() at start of conio_c64_init::@2 +Adding NOP phi() at start of cputc::@3 +Adding NOP phi() at start of cputc::@1 +Adding NOP phi() at start of main +Adding NOP phi() at start of main::toD0181 +Adding NOP phi() at start of main::@8 +Adding NOP phi() at start of gotoxy::@3 +Adding NOP phi() at start of clrscr +Adding NOP phi() at start of printf_uchar +Adding NOP phi() at start of cscroll::@2 +Adding NOP phi() at start of cscroll::@3 +Adding NOP phi() at start of cscroll::@4 +Adding NOP phi() at start of cscroll::@5 +Adding NOP phi() at start of uctoa +Adding NOP phi() at start of printf_number_buffer +Adding NOP phi() at start of printf_number_buffer::@4 +Adding NOP phi() at start of printf_number_buffer::@11 +Adding NOP phi() at start of printf_number_buffer::@3 +Adding NOP phi() at start of uctoa_append +Adding NOP phi() at start of strlen +Adding NOP phi() at start of printf_padding + +FINAL CONTROL FLOW GRAPH + +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::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#2DEFAULT_SCREEN + sta.z conio_line_text+1 + // [2] conio_line_color = COLORRAM -- pbuz1=pbuc1 + lda #COLORRAM + sta.z conio_line_color+1 + // [3] call conio_c64_init + jsr conio_c64_init + // [4] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1] + __b1_from___init1: + jmp __b1 + // __start::@1 + __b1: + // [5] call main + // [25] phi from __start::@1 to main [phi:__start::@1->main] + main_from___b1: + jsr main + jmp __breturn + // __start::@return + __breturn: + // [6] return + rts +} + // conio_c64_init +// Set initial cursor position +conio_c64_init: { + // Position cursor at current line + .label BASIC_CURSOR_LINE = $d6 + // [7] conio_c64_init::line#0 = *conio_c64_init::BASIC_CURSOR_LINE -- vbuxx=_deref_pbuc1 + ldx BASIC_CURSOR_LINE + // [8] if(conio_c64_init::line#0<$19) goto conio_c64_init::@2 -- vbuxx_lt_vbuc1_then_la1 + cpx #$19 + bcc __b2_from_conio_c64_init + // [10] phi from conio_c64_init to conio_c64_init::@1 [phi:conio_c64_init->conio_c64_init::@1] + __b1_from_conio_c64_init: + // [10] phi conio_c64_init::line#2 = $19-1 [phi:conio_c64_init->conio_c64_init::@1#0] -- vbuxx=vbuc1 + ldx #$19-1 + jmp __b1 + // [9] phi from conio_c64_init to conio_c64_init::@2 [phi:conio_c64_init->conio_c64_init::@2] + __b2_from_conio_c64_init: + jmp __b2 + // conio_c64_init::@2 + __b2: + // [10] phi from conio_c64_init::@2 to conio_c64_init::@1 [phi:conio_c64_init::@2->conio_c64_init::@1] + __b1_from___b2: + // [10] phi conio_c64_init::line#2 = conio_c64_init::line#0 [phi:conio_c64_init::@2->conio_c64_init::@1#0] -- register_copy + jmp __b1 + // conio_c64_init::@1 + __b1: + // [11] gotoxy::y#2 = conio_c64_init::line#2 + // [12] call gotoxy + // [49] phi from conio_c64_init::@1 to gotoxy [phi:conio_c64_init::@1->gotoxy] + gotoxy_from___b1: + // [49] phi gotoxy::y#3 = gotoxy::y#2 [phi:conio_c64_init::@1->gotoxy#0] -- register_copy + jsr gotoxy + jmp __breturn + // conio_c64_init::@return + __breturn: + // [13] return + rts +} + // cputc +// 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 + // [14] cputc::c#0 = stackidx(char,cputc::OFFSET_STACK_C) -- vbuaa=_stackidxbyte_vbuc1 + tsx + lda STACK_BASE+OFFSET_STACK_C,x + // [15] if(cputc::c#0==' ') goto cputc::@1 -- vbuaa_eq_vbuc1_then_la1 + cmp #'\n' + beq __b1_from_cputc + jmp __b2 + // cputc::@2 + __b2: + // [16] conio_line_text[conio_cursor_x] = cputc::c#0 -- pbuz1_derefidx_vbum2=vbuaa + ldy conio_cursor_x + sta (conio_line_text),y + // [17] conio_line_color[conio_cursor_x] = conio_textcolor -- pbuz1_derefidx_vbum2=vbum3 + lda conio_textcolor + ldy conio_cursor_x + sta (conio_line_color),y + // [18] conio_cursor_x = ++ conio_cursor_x -- vbum1=_inc_vbum1 + inc conio_cursor_x + // [19] if(conio_cursor_x!=$28) goto cputc::@return -- vbum1_neq_vbuc1_then_la1 + lda #$28 + cmp conio_cursor_x + bne __breturn + // [20] phi from cputc::@2 to cputc::@3 [phi:cputc::@2->cputc::@3] + __b3_from___b2: + jmp __b3 + // cputc::@3 + __b3: + // [21] call cputln + jsr cputln + jmp __breturn + // cputc::@return + __breturn: + // [22] return + rts + // [23] phi from cputc to cputc::@1 [phi:cputc->cputc::@1] + __b1_from_cputc: + jmp __b1 + // cputc::@1 + __b1: + // [24] call cputln + jsr cputln + jmp __breturn +} + // main +// Show the currently pressed key +main: { + .const toD0181_return = (>(DEFAULT_SCREEN&$3fff)*4)|(>DEFAULT_FONT_MIXED)/4&$f + // [26] phi from main to main::toD0181 [phi:main->main::toD0181] + toD0181_from_main: + jmp toD0181 + // main::toD0181 + toD0181: + jmp __b3 + // main::@3 + __b3: + // [27] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = main::toD0181_return#0 -- _deref_pbuc1=vbuc2 + lda #toD0181_return + sta VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY + // [28] call clrscr + // [70] phi from main::@3 to clrscr [phi:main::@3->clrscr] + clrscr_from___b3: + jsr clrscr + // [29] phi from main::@3 to main::@1 [phi:main::@3->main::@1] + __b1_from___b3: + // [29] phi main::current#2 = 0 [phi:main::@3->main::@1#0] -- vbum1=vbuc1 + lda #0 + sta current + jmp __b1 + // [29] phi from main::@4 main::@9 to main::@1 [phi:main::@4/main::@9->main::@1] + __b1_from___b4: + __b1_from___b9: + // [29] phi main::current#2 = main::current#2 [phi:main::@4/main::@9->main::@1#0] -- register_copy + jmp __b1 + // main::@1 + __b1: + // [30] call GETIN + jsr GETIN + // [31] GETIN::return#0 = GETIN::return#1 + jmp __b4 + // main::@4 + __b4: + // [32] main::ch#0 = GETIN::return#0 -- vbum1=vbuaa + sta ch + // [33] if(0==main::ch#0) goto main::@1 -- 0_eq_vbum1_then_la1 + lda ch + beq __b1_from___b4 + jmp __b10 + // main::@10 + __b10: + // [34] if(main::ch#0!=main::current#2) goto main::@2 -- vbum1_neq_vbum2_then_la1 + lda ch + cmp current + bne __b2 + // [29] phi from main::@10 to main::@1 [phi:main::@10->main::@1] + __b1_from___b10: + jmp __b1 + // main::@2 + __b2: + // [35] petscii_to_screencode::petscii#0 = main::ch#0 -- vbuaa=vbum1 + lda ch + // [36] call petscii_to_screencode + jsr petscii_to_screencode + // [37] petscii_to_screencode::return#0 = petscii_to_screencode::return#10 + jmp __b5 + // main::@5 + __b5: + // [38] main::$6 = petscii_to_screencode::return#0 -- vbum1=vbuaa + sta __6 + // [39] call printf_str + // [102] phi from main::@5 to printf_str [phi:main::@5->printf_str] + printf_str_from___b5: + // [102] phi printf_str::putc#6 = &cputc [phi:main::@5->printf_str#0] -- pprz1=pprc1 + lda #cputc + sta.z printf_str.putc+1 + // [102] phi printf_str::s#6 = main::s [phi:main::@5->printf_str#1] -- pbuz1=pbuc1 + lda #s + sta.z printf_str.s+1 + jsr printf_str + jmp __b6 + // main::@6 + __b6: + // [40] stackpush(char) = main::$6 -- _stackpushbyte_=vbum1 + lda __6 + pha + // [41] callexecute cputc -- call_vprc1 + jsr cputc + // sideeffect stackpullbytes(1) -- _stackpullbyte_1 + pla + // [43] call printf_str + // [102] phi from main::@6 to printf_str [phi:main::@6->printf_str] + printf_str_from___b6: + // [102] phi printf_str::putc#6 = &cputc [phi:main::@6->printf_str#0] -- pprz1=pprc1 + lda #cputc + sta.z printf_str.putc+1 + // [102] phi printf_str::s#6 = main::s1 [phi:main::@6->printf_str#1] -- pbuz1=pbuc1 + lda #s1 + sta.z printf_str.s+1 + jsr printf_str + jmp __b7 + // main::@7 + __b7: + // [44] printf_uchar::uvalue#0 = main::ch#0 -- vbuxx=vbum1 + ldx ch + // [45] call printf_uchar + // [111] phi from main::@7 to printf_uchar [phi:main::@7->printf_uchar] + printf_uchar_from___b7: + jsr printf_uchar + // [46] phi from main::@7 to main::@8 [phi:main::@7->main::@8] + __b8_from___b7: + jmp __b8 + // main::@8 + __b8: + // [47] call printf_str + // [102] phi from main::@8 to printf_str [phi:main::@8->printf_str] + printf_str_from___b8: + // [102] phi printf_str::putc#6 = &cputc [phi:main::@8->printf_str#0] -- pprz1=pprc1 + lda #cputc + sta.z printf_str.putc+1 + // [102] phi printf_str::s#6 = main::s2 [phi:main::@8->printf_str#1] -- pbuz1=pbuc1 + lda #s2 + sta.z printf_str.s+1 + jsr printf_str + jmp __b9 + // main::@9 + __b9: + // [48] main::current#4 = main::ch#0 -- vbum1=vbum2 + lda ch + sta current + jmp __b1_from___b9 + .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 + // gotoxy +// Set the cursor to the specified position +// void gotoxy(char x, __register(X) char y) +gotoxy: { + .label __5 = 8 + .label __6 = $a + // [50] if(gotoxy::y#3<$19+1) goto gotoxy::@3 -- vbuxx_lt_vbuc1_then_la1 + cpx #$19+1 + bcc __b3_from_gotoxy + // [52] phi from gotoxy to gotoxy::@1 [phi:gotoxy->gotoxy::@1] + __b1_from_gotoxy: + // [52] phi gotoxy::y#4 = 0 [phi:gotoxy->gotoxy::@1#0] -- vbuxx=vbuc1 + ldx #0 + jmp __b1 + // [51] phi from gotoxy to gotoxy::@3 [phi:gotoxy->gotoxy::@3] + __b3_from_gotoxy: + jmp __b3 + // gotoxy::@3 + __b3: + // [52] phi from gotoxy::@3 to gotoxy::@1 [phi:gotoxy::@3->gotoxy::@1] + __b1_from___b3: + // [52] phi gotoxy::y#4 = gotoxy::y#3 [phi:gotoxy::@3->gotoxy::@1#0] -- register_copy + jmp __b1 + // gotoxy::@1 + __b1: + jmp __b2 + // gotoxy::@2 + __b2: + // [53] conio_cursor_x = 0 -- vbum1=vbuc1 + lda #0 + sta conio_cursor_x + // [54] conio_cursor_y = gotoxy::y#4 -- vbum1=vbuxx + stx conio_cursor_y + // [55] gotoxy::$7 = (unsigned int)gotoxy::y#4 -- vwum1=_word_vbuxx + txa + sta __7 + lda #0 + sta __7+1 + // [56] gotoxy::$8 = gotoxy::$7 << 2 -- vwum1=vwum2_rol_2 + lda __7 + asl + sta __8 + lda __7+1 + rol + sta __8+1 + asl __8 + rol __8+1 + // [57] gotoxy::$9 = gotoxy::$8 + gotoxy::$7 -- vwum1=vwum2_plus_vwum1 + clc + lda __9 + adc __8 + sta __9 + lda __9+1 + adc __8+1 + sta __9+1 + // [58] gotoxy::line_offset#0 = gotoxy::$9 << 3 -- vwum1=vwum1_rol_3 + asl line_offset + rol line_offset+1 + asl line_offset + rol line_offset+1 + asl line_offset + rol line_offset+1 + // [59] gotoxy::$5 = DEFAULT_SCREEN + gotoxy::line_offset#0 -- pbuz1=pbuc1_plus_vwum2 + lda line_offset + clc + adc #DEFAULT_SCREEN + sta.z __5+1 + // [60] conio_line_text = gotoxy::$5 -- pbuz1=pbuz2 + lda.z __5 + sta.z conio_line_text + lda.z __5+1 + sta.z conio_line_text+1 + // [61] gotoxy::$6 = COLORRAM + gotoxy::line_offset#0 -- pbuz1=pbuc1_plus_vwum2 + lda line_offset + clc + adc #COLORRAM + sta.z __6+1 + // [62] conio_line_color = gotoxy::$6 -- pbuz1=pbuz2 + lda.z __6 + sta.z conio_line_color + lda.z __6+1 + sta.z conio_line_color+1 + jmp __breturn + // gotoxy::@return + __breturn: + // [63] return + rts + .segment Data + __7: .word 0 + .label line_offset = __7 + __8: .word 0 + .label __9 = __7 +} +.segment Code + // cputln +// Print a newline +cputln: { + // [64] conio_line_text = conio_line_text + $28 -- pbuz1=pbuz1_plus_vbuc1 + lda #$28 + clc + adc.z conio_line_text + sta.z conio_line_text + bcc !+ + inc.z conio_line_text+1 + !: + // [65] conio_line_color = conio_line_color + $28 -- pbuz1=pbuz1_plus_vbuc1 + lda #$28 + clc + adc.z conio_line_color + sta.z conio_line_color + bcc !+ + inc.z conio_line_color+1 + !: + // [66] conio_cursor_x = 0 -- vbum1=vbuc1 + lda #0 + sta conio_cursor_x + // [67] conio_cursor_y = ++ conio_cursor_y -- vbum1=_inc_vbum1 + inc conio_cursor_y + // [68] call cscroll + jsr cscroll + jmp __breturn + // cputln::@return + __breturn: + // [69] return + rts +} + // clrscr +// 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 + // [71] phi from clrscr to clrscr::@1 [phi:clrscr->clrscr::@1] + __b1_from_clrscr: + // [71] phi clrscr::line_cols#5 = COLORRAM [phi:clrscr->clrscr::@1#0] -- pbuz1=pbuc1 + lda #COLORRAM + sta.z line_cols+1 + // [71] phi clrscr::line_text#5 = DEFAULT_SCREEN [phi:clrscr->clrscr::@1#1] -- pbuz1=pbuc1 + lda #DEFAULT_SCREEN + sta.z line_text+1 + // [71] phi clrscr::l#2 = 0 [phi:clrscr->clrscr::@1#2] -- vbuxx=vbuc1 + ldx #0 + jmp __b1 + // clrscr::@1 + __b1: + // [72] if(clrscr::l#2<$19) goto clrscr::@3 -- vbuxx_lt_vbuc1_then_la1 + cpx #$19 + bcc __b3_from___b1 + jmp __b2 + // clrscr::@2 + __b2: + // [73] conio_cursor_x = 0 -- vbum1=vbuc1 + lda #0 + sta conio_cursor_x + // [74] conio_cursor_y = 0 -- vbum1=vbuc1 + lda #0 + sta conio_cursor_y + // [75] conio_line_text = DEFAULT_SCREEN -- pbuz1=pbuc1 + lda #DEFAULT_SCREEN + sta.z conio_line_text+1 + // [76] conio_line_color = COLORRAM -- pbuz1=pbuc1 + lda #COLORRAM + sta.z conio_line_color+1 + jmp __breturn + // clrscr::@return + __breturn: + // [77] return + rts + // [78] phi from clrscr::@1 to clrscr::@3 [phi:clrscr::@1->clrscr::@3] + __b3_from___b1: + // [78] phi clrscr::c#2 = 0 [phi:clrscr::@1->clrscr::@3#0] -- vbuyy=vbuc1 + ldy #0 + jmp __b3 + // clrscr::@3 + __b3: + // [79] if(clrscr::c#2<$28) goto clrscr::@4 -- vbuyy_lt_vbuc1_then_la1 + cpy #$28 + bcc __b4 + jmp __b5 + // clrscr::@5 + __b5: + // [80] clrscr::line_text#1 = clrscr::line_text#5 + $28 -- pbuz1=pbuz1_plus_vbuc1 + lda #$28 + clc + adc.z line_text + sta.z line_text + bcc !+ + inc.z line_text+1 + !: + // [81] clrscr::line_cols#1 = clrscr::line_cols#5 + $28 -- pbuz1=pbuz1_plus_vbuc1 + lda #$28 + clc + adc.z line_cols + sta.z line_cols + bcc !+ + inc.z line_cols+1 + !: + // [82] clrscr::l#1 = ++ clrscr::l#2 -- vbuxx=_inc_vbuxx + inx + // [71] phi from clrscr::@5 to clrscr::@1 [phi:clrscr::@5->clrscr::@1] + __b1_from___b5: + // [71] phi clrscr::line_cols#5 = clrscr::line_cols#1 [phi:clrscr::@5->clrscr::@1#0] -- register_copy + // [71] phi clrscr::line_text#5 = clrscr::line_text#1 [phi:clrscr::@5->clrscr::@1#1] -- register_copy + // [71] phi clrscr::l#2 = clrscr::l#1 [phi:clrscr::@5->clrscr::@1#2] -- register_copy + jmp __b1 + // clrscr::@4 + __b4: + // [83] clrscr::line_text#5[clrscr::c#2] = ' ' -- pbuz1_derefidx_vbuyy=vbuc1 + lda #' ' + sta (line_text),y + // [84] clrscr::line_cols#5[clrscr::c#2] = conio_textcolor -- pbuz1_derefidx_vbuyy=vbum2 + lda conio_textcolor + sta (line_cols),y + // [85] clrscr::c#1 = ++ clrscr::c#2 -- vbuyy=_inc_vbuyy + iny + // [78] phi from clrscr::@4 to clrscr::@3 [phi:clrscr::@4->clrscr::@3] + __b3_from___b4: + // [78] phi clrscr::c#2 = clrscr::c#1 [phi:clrscr::@4->clrscr::@3#0] -- register_copy + jmp __b3 +} + // GETIN +// 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 stach } + jsr $ffe4 + sta ch + // [87] GETIN::return#1 = *GETIN::ch -- vbuaa=_deref_pbuc1 + lda ch + jmp __breturn + // GETIN::@return + __breturn: + // [88] return + rts +} + // petscii_to_screencode +// Convert a PETSCII char to screencode +// __register(A) char petscii_to_screencode(__register(A) char petscii) +petscii_to_screencode: { + // [89] if(petscii_to_screencode::petscii#0<$20) goto petscii_to_screencode::@1 -- vbuaa_lt_vbuc1_then_la1 + cmp #$20 + bcc __b1 + jmp __b6 + // petscii_to_screencode::@6 + __b6: + // [90] if(petscii_to_screencode::petscii#0<$40) goto petscii_to_screencode::@return -- vbuaa_lt_vbuc1_then_la1 + cmp #$40 + bcc __breturn_from___b6 + jmp __b7 + // petscii_to_screencode::@7 + __b7: + // [91] if(petscii_to_screencode::petscii#0<$60) goto petscii_to_screencode::@2 -- vbuaa_lt_vbuc1_then_la1 + cmp #$60 + bcc __b2 + jmp __b8 + // petscii_to_screencode::@8 + __b8: + // [92] if(petscii_to_screencode::petscii#0<$80) goto petscii_to_screencode::@3 -- vbuaa_lt_vbuc1_then_la1 + cmp #$80 + bcc __b3 + jmp __b9 + // petscii_to_screencode::@9 + __b9: + // [93] if(petscii_to_screencode::petscii#0<$a0) goto petscii_to_screencode::@4 -- vbuaa_lt_vbuc1_then_la1 + cmp #$a0 + bcc __b4 + jmp __b10 + // petscii_to_screencode::@10 + __b10: + // [94] if(petscii_to_screencode::petscii#0<$ff) goto petscii_to_screencode::@5 -- vbuaa_lt_vbuc1_then_la1 + cmp #$ff + bcc __b5 + // [96] phi from petscii_to_screencode::@10 to petscii_to_screencode::@return [phi:petscii_to_screencode::@10->petscii_to_screencode::@return] + __breturn_from___b10: + // [96] phi petscii_to_screencode::return#10 = $5e [phi:petscii_to_screencode::@10->petscii_to_screencode::@return#0] -- vbuaa=vbuc1 + lda #$5e + jmp __breturn + // petscii_to_screencode::@5 + __b5: + // [95] petscii_to_screencode::return#6 = petscii_to_screencode::petscii#0 - $80 -- vbuaa=vbuaa_minus_vbuc1 + sec + sbc #$80 + // [96] phi from petscii_to_screencode::@1 petscii_to_screencode::@2 petscii_to_screencode::@3 petscii_to_screencode::@4 petscii_to_screencode::@5 petscii_to_screencode::@6 to petscii_to_screencode::@return [phi:petscii_to_screencode::@1/petscii_to_screencode::@2/petscii_to_screencode::@3/petscii_to_screencode::@4/petscii_to_screencode::@5/petscii_to_screencode::@6->petscii_to_screencode::@return] + __breturn_from___b1: + __breturn_from___b2: + __breturn_from___b3: + __breturn_from___b4: + __breturn_from___b5: + __breturn_from___b6: + // [96] phi petscii_to_screencode::return#10 = petscii_to_screencode::return#1 [phi:petscii_to_screencode::@1/petscii_to_screencode::@2/petscii_to_screencode::@3/petscii_to_screencode::@4/petscii_to_screencode::@5/petscii_to_screencode::@6->petscii_to_screencode::@return#0] -- register_copy + jmp __breturn + // petscii_to_screencode::@return + __breturn: + // [97] return + rts + // petscii_to_screencode::@4 + __b4: + // [98] petscii_to_screencode::return#5 = petscii_to_screencode::petscii#0 + $40 -- vbuaa=vbuaa_plus_vbuc1 + clc + adc #$40 + jmp __breturn_from___b4 + // petscii_to_screencode::@3 + __b3: + // [99] petscii_to_screencode::return#4 = petscii_to_screencode::petscii#0 - $20 -- vbuaa=vbuaa_minus_vbuc1 + sec + sbc #$20 + jmp __breturn_from___b3 + // petscii_to_screencode::@2 + __b2: + // [100] petscii_to_screencode::return#3 = petscii_to_screencode::petscii#0 - $40 -- vbuaa=vbuaa_minus_vbuc1 + sec + sbc #$40 + jmp __breturn_from___b2 + // petscii_to_screencode::@1 + __b1: + // [101] petscii_to_screencode::return#1 = petscii_to_screencode::petscii#0 + $80 -- vbuaa=vbuaa_plus_vbuc1 + clc + adc #$80 + jmp __breturn_from___b1 +} + // printf_str +/// 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 + // [103] phi from printf_str printf_str::@2 to printf_str::@1 [phi:printf_str/printf_str::@2->printf_str::@1] + __b1_from_printf_str: + __b1_from___b2: + // [103] phi printf_str::s#5 = printf_str::s#6 [phi:printf_str/printf_str::@2->printf_str::@1#0] -- register_copy + jmp __b1 + // printf_str::@1 + __b1: + // [104] printf_str::c#1 = *printf_str::s#5 -- vbuaa=_deref_pbuz1 + ldy #0 + lda (s),y + // [105] printf_str::s#0 = ++ printf_str::s#5 -- pbuz1=_inc_pbuz1 + inc.z s + bne !+ + inc.z s+1 + !: + // [106] if(0!=printf_str::c#1) goto printf_str::@2 -- 0_neq_vbuaa_then_la1 + cmp #0 + bne __b2 + jmp __breturn + // printf_str::@return + __breturn: + // [107] return + rts + // printf_str::@2 + __b2: + // [108] stackpush(char) = printf_str::c#1 -- _stackpushbyte_=vbuaa + pha + // [109] callexecute *printf_str::putc#6 -- call__deref_pprz1 + jsr icall2 + // sideeffect stackpullbytes(1) -- _stackpullbyte_1 + pla + jmp __b1_from___b2 + // Outside Flow + icall2: + jmp (putc) +} + // printf_uchar +// 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 + jmp __b1 + // printf_uchar::@1 + __b1: + // [112] *((char *)&printf_buffer) = 0 -- _deref_pbuc1=vbuc2 + // Handle any sign + lda #0 + sta printf_buffer + // [113] uctoa::value#1 = printf_uchar::uvalue#0 + // [114] call uctoa + // Format number into buffer + // [134] phi from printf_uchar::@1 to uctoa [phi:printf_uchar::@1->uctoa] + uctoa_from___b1: + jsr uctoa + jmp __b2 + // printf_uchar::@2 + __b2: + // [115] printf_number_buffer::buffer_sign#0 = *((char *)&printf_buffer) -- vbum1=_deref_pbuc1 + lda printf_buffer + sta printf_number_buffer.buffer_sign + // [116] call printf_number_buffer + // Print using format + // [153] phi from printf_uchar::@2 to printf_number_buffer [phi:printf_uchar::@2->printf_number_buffer] + printf_number_buffer_from___b2: + jsr printf_number_buffer + jmp __breturn + // printf_uchar::@return + __breturn: + // [117] return + rts +} + // cscroll +// Scroll the entire screen if the cursor is beyond the last line +cscroll: { + // [118] if(conio_cursor_y!=$19) goto cscroll::@return -- vbum1_neq_vbuc1_then_la1 + lda #$19 + cmp conio_cursor_y + bne __breturn + jmp __b1 + // cscroll::@1 + __b1: + // [119] if(0!=conio_scroll_enable) goto cscroll::@3 -- 0_neq_vbum1_then_la1 + lda conio_scroll_enable + bne __b3_from___b1 + // [120] phi from cscroll::@1 to cscroll::@2 [phi:cscroll::@1->cscroll::@2] + __b2_from___b1: + jmp __b2 + // cscroll::@2 + __b2: + // [121] call gotoxy + // [49] phi from cscroll::@2 to gotoxy [phi:cscroll::@2->gotoxy] + gotoxy_from___b2: + // [49] phi gotoxy::y#3 = 0 [phi:cscroll::@2->gotoxy#0] -- vbuxx=vbuc1 + ldx #0 + jsr gotoxy + jmp __breturn + // cscroll::@return + __breturn: + // [122] return + rts + // [123] phi from cscroll::@1 to cscroll::@3 [phi:cscroll::@1->cscroll::@3] + __b3_from___b1: + jmp __b3 + // cscroll::@3 + __b3: + // [124] call memcpy + // [176] phi from cscroll::@3 to memcpy [phi:cscroll::@3->memcpy] + memcpy_from___b3: + // [176] phi memcpy::destination#2 = (void *)DEFAULT_SCREEN [phi:cscroll::@3->memcpy#0] -- pvoz1=pvoc1 + lda #DEFAULT_SCREEN + sta.z memcpy.destination+1 + // [176] phi memcpy::source#2 = (void *)DEFAULT_SCREEN+$28 [phi:cscroll::@3->memcpy#1] -- pvoz1=pvoc1 + lda #DEFAULT_SCREEN+$28 + sta.z memcpy.source+1 + jsr memcpy + // [125] phi from cscroll::@3 to cscroll::@4 [phi:cscroll::@3->cscroll::@4] + __b4_from___b3: + jmp __b4 + // cscroll::@4 + __b4: + // [126] call memcpy + // [176] phi from cscroll::@4 to memcpy [phi:cscroll::@4->memcpy] + memcpy_from___b4: + // [176] phi memcpy::destination#2 = (void *)COLORRAM [phi:cscroll::@4->memcpy#0] -- pvoz1=pvoc1 + lda #COLORRAM + sta.z memcpy.destination+1 + // [176] phi memcpy::source#2 = (void *)COLORRAM+$28 [phi:cscroll::@4->memcpy#1] -- pvoz1=pvoc1 + lda #COLORRAM+$28 + sta.z memcpy.source+1 + jsr memcpy + // [127] phi from cscroll::@4 to cscroll::@5 [phi:cscroll::@4->cscroll::@5] + __b5_from___b4: + jmp __b5 + // cscroll::@5 + __b5: + // [128] call memset + // [186] phi from cscroll::@5 to memset [phi:cscroll::@5->memset] + memset_from___b5: + // [186] phi memset::c#4 = ' ' [phi:cscroll::@5->memset#0] -- vbuxx=vbuc1 + ldx #' ' + // [186] phi memset::str#3 = (void *)DEFAULT_SCREEN+(unsigned int)$19*$28-$28 [phi:cscroll::@5->memset#1] -- pvoz1=pvoc1 + lda #DEFAULT_SCREEN+$19*$28-$28 + sta.z memset.str+1 + jsr memset + jmp __b6 + // cscroll::@6 + __b6: + // [129] memset::c#1 = conio_textcolor -- vbuxx=vbum1 + ldx conio_textcolor + // [130] call memset + // [186] phi from cscroll::@6 to memset [phi:cscroll::@6->memset] + memset_from___b6: + // [186] phi memset::c#4 = memset::c#1 [phi:cscroll::@6->memset#0] -- register_copy + // [186] phi memset::str#3 = (void *)COLORRAM+(unsigned int)$19*$28-$28 [phi:cscroll::@6->memset#1] -- pvoz1=pvoc1 + lda #COLORRAM+$19*$28-$28 + sta.z memset.str+1 + jsr memset + jmp __b7 + // cscroll::@7 + __b7: + // [131] conio_line_text = conio_line_text - $28 -- pbuz1=pbuz1_minus_vbuc1 + 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 + // [132] conio_line_color = conio_line_color - $28 -- pbuz1=pbuz1_minus_vbuc1 + 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 + // [133] conio_cursor_y = -- conio_cursor_y -- vbum1=_dec_vbum1 + dec conio_cursor_y + jmp __breturn +} + // uctoa +// 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 + // [135] phi from uctoa to uctoa::@1 [phi:uctoa->uctoa::@1] + __b1_from_uctoa: + // [135] phi uctoa::buffer#11 = (char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS [phi:uctoa->uctoa::@1#0] -- pbuz1=pbuc1 + lda #printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS + sta.z buffer+1 + // [135] phi uctoa::started#2 = 0 [phi:uctoa->uctoa::@1#1] -- vbum1=vbuc1 + lda #0 + sta started + // [135] phi uctoa::value#2 = uctoa::value#1 [phi:uctoa->uctoa::@1#2] -- register_copy + // [135] phi uctoa::digit#2 = 0 [phi:uctoa->uctoa::@1#3] -- vbum1=vbuc1 + lda #0 + sta digit + jmp __b1 + // uctoa::@1 + __b1: + // [136] if(uctoa::digit#2=uctoa::digit_value#0) goto uctoa::@5 -- vbuxx_ge_vbum1_then_la1 + cpx digit_value + bcs __b5 + // [144] phi from uctoa::@7 to uctoa::@4 [phi:uctoa::@7->uctoa::@4] + __b4_from___b7: + // [144] phi uctoa::buffer#14 = uctoa::buffer#11 [phi:uctoa::@7->uctoa::@4#0] -- register_copy + // [144] phi uctoa::started#4 = uctoa::started#2 [phi:uctoa::@7->uctoa::@4#1] -- register_copy + // [144] phi uctoa::value#6 = uctoa::value#2 [phi:uctoa::@7->uctoa::@4#2] -- register_copy + jmp __b4 + // uctoa::@4 + __b4: + // [145] uctoa::digit#1 = ++ uctoa::digit#2 -- vbum1=_inc_vbum1 + inc digit + // [135] phi from uctoa::@4 to uctoa::@1 [phi:uctoa::@4->uctoa::@1] + __b1_from___b4: + // [135] phi uctoa::buffer#11 = uctoa::buffer#14 [phi:uctoa::@4->uctoa::@1#0] -- register_copy + // [135] phi uctoa::started#2 = uctoa::started#4 [phi:uctoa::@4->uctoa::@1#1] -- register_copy + // [135] phi uctoa::value#2 = uctoa::value#6 [phi:uctoa::@4->uctoa::@1#2] -- register_copy + // [135] phi uctoa::digit#2 = uctoa::digit#1 [phi:uctoa::@4->uctoa::@1#3] -- register_copy + jmp __b1 + // uctoa::@5 + __b5: + // [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 + // [194] phi from uctoa::@5 to uctoa_append [phi:uctoa::@5->uctoa_append] + uctoa_append_from___b5: + jsr uctoa_append + // [150] uctoa_append::return#0 = uctoa_append::value#2 + jmp __b6 + // uctoa::@6 + __b6: + // [151] uctoa::value#0 = uctoa_append::return#0 + // [152] uctoa::buffer#4 = ++ uctoa::buffer#11 -- pbuz1=_inc_pbuz1 + inc.z buffer + bne !+ + inc.z buffer+1 + !: + // [144] phi from uctoa::@6 to uctoa::@4 [phi:uctoa::@6->uctoa::@4] + __b4_from___b6: + // [144] phi uctoa::buffer#14 = uctoa::buffer#4 [phi:uctoa::@6->uctoa::@4#0] -- register_copy + // [144] phi uctoa::started#4 = 1 [phi:uctoa::@6->uctoa::@4#1] -- vbum1=vbuc1 + lda #1 + sta started + // [144] phi uctoa::value#6 = uctoa::value#0 [phi:uctoa::@6->uctoa::@4#2] -- register_copy + jmp __b4 + .segment Data + digit_value: .byte 0 + digit: .byte 0 + started: .byte 0 +} +.segment Code + // printf_number_buffer +// 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 + // [154] phi from printf_number_buffer to printf_number_buffer::@4 [phi:printf_number_buffer->printf_number_buffer::@4] + __b4_from_printf_number_buffer: + jmp __b4 + // printf_number_buffer::@4 + __b4: + // [155] call strlen + // [201] phi from printf_number_buffer::@4 to strlen [phi:printf_number_buffer::@4->strlen] + strlen_from___b4: + jsr strlen + // [156] strlen::return#2 = strlen::len#2 + jmp __b9 + // printf_number_buffer::@9 + __b9: + // [157] printf_number_buffer::$19 = strlen::return#2 + // [158] printf_number_buffer::len#0 = (signed char)printf_number_buffer::$19 -- vbsxx=_sbyte_vwum1 + // There is a minimum length - work out the padding + ldx __19 + // [159] if(0==printf_number_buffer::buffer_sign#0) goto printf_number_buffer::@8 -- 0_eq_vbum1_then_la1 + lda buffer_sign + beq __b8_from___b9 + jmp __b5 + // printf_number_buffer::@5 + __b5: + // [160] printf_number_buffer::len#1 = ++ printf_number_buffer::len#0 -- vbsxx=_inc_vbsxx + inx + // [161] phi from printf_number_buffer::@5 printf_number_buffer::@9 to printf_number_buffer::@8 [phi:printf_number_buffer::@5/printf_number_buffer::@9->printf_number_buffer::@8] + __b8_from___b5: + __b8_from___b9: + // [161] phi printf_number_buffer::len#2 = printf_number_buffer::len#1 [phi:printf_number_buffer::@5/printf_number_buffer::@9->printf_number_buffer::@8#0] -- register_copy + jmp __b8 + // printf_number_buffer::@8 + __b8: + // [162] printf_number_buffer::padding#1 = (signed char)printf_uchar::format_min_length#0 - printf_number_buffer::len#2 -- vbsaa=vbsc1_minus_vbsxx + txa + eor #$ff + sec + adc #printf_uchar.format_min_length + // [163] if(printf_number_buffer::padding#1>=0) goto printf_number_buffer::@11 -- vbsaa_ge_0_then_la1 + cmp #0 + bpl __b11_from___b8 + // [165] phi from printf_number_buffer::@8 to printf_number_buffer::@1 [phi:printf_number_buffer::@8->printf_number_buffer::@1] + __b1_from___b8: + // [165] phi printf_number_buffer::padding#10 = 0 [phi:printf_number_buffer::@8->printf_number_buffer::@1#0] -- vbsaa=vbsc1 + lda #0 + jmp __b1 + // [164] phi from printf_number_buffer::@8 to printf_number_buffer::@11 [phi:printf_number_buffer::@8->printf_number_buffer::@11] + __b11_from___b8: + jmp __b11 + // printf_number_buffer::@11 + __b11: + // [165] phi from printf_number_buffer::@11 to printf_number_buffer::@1 [phi:printf_number_buffer::@11->printf_number_buffer::@1] + __b1_from___b11: + // [165] phi printf_number_buffer::padding#10 = printf_number_buffer::padding#1 [phi:printf_number_buffer::@11->printf_number_buffer::@1#0] -- register_copy + jmp __b1 + // printf_number_buffer::@1 + __b1: + jmp __b10 + // printf_number_buffer::@10 + __b10: + // [166] if(0!=printf_number_buffer::padding#10) goto printf_number_buffer::@6 -- 0_neq_vbsaa_then_la1 + cmp #0 + bne __b6 + jmp __b2 + // printf_number_buffer::@6 + __b6: + // [167] printf_padding::length#0 = (char)printf_number_buffer::padding#10 -- vbum1=vbuaa + sta printf_padding.length + // [168] call printf_padding + // [207] phi from printf_number_buffer::@6 to printf_padding [phi:printf_number_buffer::@6->printf_padding] + printf_padding_from___b6: + jsr printf_padding + jmp __b2 + // printf_number_buffer::@2 + __b2: + // [169] if(0==printf_number_buffer::buffer_sign#0) goto printf_number_buffer::@3 -- 0_eq_vbum1_then_la1 + lda buffer_sign + beq __b3_from___b2 + jmp __b7 + // printf_number_buffer::@7 + __b7: + // [170] stackpush(char) = printf_number_buffer::buffer_sign#0 -- _stackpushbyte_=vbum1 + lda buffer_sign + pha + // [171] callexecute cputc -- call_vprc1 + jsr cputc + // sideeffect stackpullbytes(1) -- _stackpullbyte_1 + pla + // [173] phi from printf_number_buffer::@2 printf_number_buffer::@7 to printf_number_buffer::@3 [phi:printf_number_buffer::@2/printf_number_buffer::@7->printf_number_buffer::@3] + __b3_from___b2: + __b3_from___b7: + jmp __b3 + // printf_number_buffer::@3 + __b3: + // [174] call printf_str + // [102] phi from printf_number_buffer::@3 to printf_str [phi:printf_number_buffer::@3->printf_str] + printf_str_from___b3: + // [102] phi printf_str::putc#6 = printf_uchar::putc#0 [phi:printf_number_buffer::@3->printf_str#0] -- pprz1=pprc1 + lda #printf_uchar.putc + sta.z printf_str.putc+1 + // [102] phi printf_str::s#6 = printf_number_buffer::buffer_digits#0 [phi:printf_number_buffer::@3->printf_str#1] -- pbuz1=pbuc1 + lda #buffer_digits + sta.z printf_str.s+1 + jsr printf_str + jmp __breturn + // printf_number_buffer::@return + __breturn: + // [175] return + rts + .segment Data + .label __19 = strlen.len + buffer_sign: .byte 0 +} +.segment Code + // memcpy +// 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 + // [177] memcpy::src_end#0 = (char *)memcpy::source#2 + (unsigned int)$19*$28-$28 -- pbuz1=pbuz2_plus_vwuc1 + 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 + // [178] memcpy::src#4 = (char *)memcpy::source#2 + // [179] memcpy::dst#4 = (char *)memcpy::destination#2 + // [180] phi from memcpy memcpy::@2 to memcpy::@1 [phi:memcpy/memcpy::@2->memcpy::@1] + __b1_from_memcpy: + __b1_from___b2: + // [180] phi memcpy::dst#2 = memcpy::dst#4 [phi:memcpy/memcpy::@2->memcpy::@1#0] -- register_copy + // [180] phi memcpy::src#2 = memcpy::src#4 [phi:memcpy/memcpy::@2->memcpy::@1#1] -- register_copy + jmp __b1 + // memcpy::@1 + __b1: + // [181] if(memcpy::src#2!=memcpy::src_end#0) goto memcpy::@2 -- pbuz1_neq_pbuz2_then_la1 + lda.z src+1 + cmp.z src_end+1 + bne __b2 + lda.z src + cmp.z src_end + bne __b2 + jmp __breturn + // memcpy::@return + __breturn: + // [182] return + rts + // memcpy::@2 + __b2: + // [183] *memcpy::dst#2 = *memcpy::src#2 -- _deref_pbuz1=_deref_pbuz2 + ldy #0 + lda (src),y + ldy #0 + sta (dst),y + // [184] memcpy::dst#1 = ++ memcpy::dst#2 -- pbuz1=_inc_pbuz1 + inc.z dst + bne !+ + inc.z dst+1 + !: + // [185] memcpy::src#1 = ++ memcpy::src#2 -- pbuz1=_inc_pbuz1 + inc.z src + bne !+ + inc.z src+1 + !: + jmp __b1_from___b2 +} + // memset +// 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 + jmp __b1 + // memset::@1 + __b1: + // [187] memset::end#0 = (char *)memset::str#3 + $28 -- pbuz1=pbuz2_plus_vbuc1 + lda #$28 + clc + adc.z str + sta.z end + lda #0 + adc.z str+1 + sta.z end+1 + // [188] memset::dst#4 = (char *)memset::str#3 + // [189] phi from memset::@1 memset::@3 to memset::@2 [phi:memset::@1/memset::@3->memset::@2] + __b2_from___b1: + __b2_from___b3: + // [189] phi memset::dst#2 = memset::dst#4 [phi:memset::@1/memset::@3->memset::@2#0] -- register_copy + jmp __b2 + // memset::@2 + __b2: + // [190] if(memset::dst#2!=memset::end#0) goto memset::@3 -- pbuz1_neq_pbuz2_then_la1 + lda.z dst+1 + cmp.z end+1 + bne __b3 + lda.z dst + cmp.z end + bne __b3 + jmp __breturn + // memset::@return + __breturn: + // [191] return + rts + // memset::@3 + __b3: + // [192] *memset::dst#2 = memset::c#4 -- _deref_pbuz1=vbuxx + txa + ldy #0 + sta (dst),y + // [193] memset::dst#1 = ++ memset::dst#2 -- pbuz1=_inc_pbuz1 + inc.z dst + bne !+ + inc.z dst+1 + !: + jmp __b2_from___b3 +} + // uctoa_append +// 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 + // [195] phi from uctoa_append to uctoa_append::@1 [phi:uctoa_append->uctoa_append::@1] + __b1_from_uctoa_append: + // [195] phi uctoa_append::digit#2 = 0 [phi:uctoa_append->uctoa_append::@1#0] -- vbuyy=vbuc1 + ldy #0 + // [195] phi uctoa_append::value#2 = uctoa_append::value#0 [phi:uctoa_append->uctoa_append::@1#1] -- register_copy + jmp __b1 + // uctoa_append::@1 + __b1: + // [196] if(uctoa_append::value#2>=uctoa_append::sub#0) goto uctoa_append::@2 -- vbuxx_ge_vbum1_then_la1 + cpx sub + bcs __b2 + jmp __b3 + // uctoa_append::@3 + __b3: + // [197] *uctoa_append::buffer#0 = DIGITS[uctoa_append::digit#2] -- _deref_pbuz1=pbuc1_derefidx_vbuyy + lda DIGITS,y + ldy #0 + sta (buffer),y + jmp __breturn + // uctoa_append::@return + __breturn: + // [198] return + rts + // uctoa_append::@2 + __b2: + // [199] uctoa_append::digit#1 = ++ uctoa_append::digit#2 -- vbuyy=_inc_vbuyy + iny + // [200] uctoa_append::value#1 = uctoa_append::value#2 - uctoa_append::sub#0 -- vbuxx=vbuxx_minus_vbum1 + txa + sec + sbc sub + tax + // [195] phi from uctoa_append::@2 to uctoa_append::@1 [phi:uctoa_append::@2->uctoa_append::@1] + __b1_from___b2: + // [195] phi uctoa_append::digit#2 = uctoa_append::digit#1 [phi:uctoa_append::@2->uctoa_append::@1#0] -- register_copy + // [195] phi uctoa_append::value#2 = uctoa_append::value#1 [phi:uctoa_append::@2->uctoa_append::@1#1] -- register_copy + jmp __b1 + .segment Data + .label sub = uctoa.digit_value +} +.segment Code + // strlen +// 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 + // [202] phi from strlen to strlen::@1 [phi:strlen->strlen::@1] + __b1_from_strlen: + // [202] phi strlen::len#2 = 0 [phi:strlen->strlen::@1#0] -- vwum1=vwuc1 + lda #<0 + sta len + lda #>0 + sta len+1 + // [202] phi strlen::str#2 = printf_number_buffer::buffer_digits#0 [phi:strlen->strlen::@1#1] -- pbuz1=pbuc1 + lda #printf_number_buffer.buffer_digits + sta.z str+1 + jmp __b1 + // strlen::@1 + __b1: + // [203] if(0!=*strlen::str#2) goto strlen::@2 -- 0_neq__deref_pbuz1_then_la1 + ldy #0 + lda (str),y + cmp #0 + bne __b2 + jmp __breturn + // strlen::@return + __breturn: + // [204] return + rts + // strlen::@2 + __b2: + // [205] strlen::len#1 = ++ strlen::len#2 -- vwum1=_inc_vwum1 + inc len + bne !+ + inc len+1 + !: + // [206] strlen::str#0 = ++ strlen::str#2 -- pbuz1=_inc_pbuz1 + inc.z str + bne !+ + inc.z str+1 + !: + // [202] phi from strlen::@2 to strlen::@1 [phi:strlen::@2->strlen::@1] + __b1_from___b2: + // [202] phi strlen::len#2 = strlen::len#1 [phi:strlen::@2->strlen::@1#0] -- register_copy + // [202] phi strlen::str#2 = strlen::str#0 [phi:strlen::@2->strlen::@1#1] -- register_copy + jmp __b1 + .segment Data + len: .word 0 + .label return = len +} +.segment Code + // printf_padding +// Print a padding char a number of times +// void printf_padding(void (*putc)(char), char pad, __mem() char length) +printf_padding: { + .const pad = ' ' + // [208] phi from printf_padding to printf_padding::@1 [phi:printf_padding->printf_padding::@1] + __b1_from_printf_padding: + // [208] phi printf_padding::i#2 = 0 [phi:printf_padding->printf_padding::@1#0] -- vbum1=vbuc1 + lda #0 + sta i + jmp __b1 + // printf_padding::@1 + __b1: + // [209] if(printf_padding::i#2printf_padding::@1] + __b1_from___b3: + // [208] phi printf_padding::i#2 = printf_padding::i#1 [phi:printf_padding::@3->printf_padding::@1#0] -- register_copy + jmp __b1 + .segment Data + i: .byte 0 + length: .byte 0 +} + // File Data + // 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 + +ASSEMBLER OPTIMIZATIONS +Removing instruction jmp __init1 +Removing instruction jmp __b1 +Removing instruction jmp __breturn +Removing instruction jmp __b2 +Removing instruction jmp __b1 +Removing instruction jmp __breturn +Removing instruction jmp __b2 +Removing instruction jmp __b3 +Removing instruction jmp __breturn +Removing instruction jmp __b1 +Removing instruction jmp toD0181 +Removing instruction jmp __b3 +Removing instruction jmp __b1 +Removing instruction jmp __b4 +Removing instruction jmp __b10 +Removing instruction jmp __b5 +Removing instruction jmp __b6 +Removing instruction jmp __b7 +Removing instruction jmp __b8 +Removing instruction jmp __b9 +Removing instruction jmp __b3 +Removing instruction jmp __b1 +Removing instruction jmp __b2 +Removing instruction jmp __breturn +Removing instruction jmp __breturn +Removing instruction jmp __b1 +Removing instruction jmp __b2 +Removing instruction jmp __breturn +Removing instruction jmp __b3 +Removing instruction jmp __b5 +Removing instruction jmp __breturn +Removing instruction jmp __b6 +Removing instruction jmp __b7 +Removing instruction jmp __b8 +Removing instruction jmp __b9 +Removing instruction jmp __b10 +Removing instruction jmp __breturn +Removing instruction jmp __b1 +Removing instruction jmp __breturn +Removing instruction jmp __b1 +Removing instruction jmp __b2 +Removing instruction jmp __breturn +Removing instruction jmp __b1 +Removing instruction jmp __b2 +Removing instruction jmp __breturn +Removing instruction jmp __b3 +Removing instruction jmp __b4 +Removing instruction jmp __b5 +Removing instruction jmp __b6 +Removing instruction jmp __b7 +Removing instruction jmp __b1 +Removing instruction jmp __b3 +Removing instruction jmp __breturn +Removing instruction jmp __b7 +Removing instruction jmp __b4 +Removing instruction jmp __b6 +Removing instruction jmp __b4 +Removing instruction jmp __b9 +Removing instruction jmp __b5 +Removing instruction jmp __b8 +Removing instruction jmp __b11 +Removing instruction jmp __b1 +Removing instruction jmp __b10 +Removing instruction jmp __b2 +Removing instruction jmp __b7 +Removing instruction jmp __b3 +Removing instruction jmp __breturn +Removing instruction jmp __b1 +Removing instruction jmp __breturn +Removing instruction jmp __b1 +Removing instruction jmp __b2 +Removing instruction jmp __breturn +Removing instruction jmp __b1 +Removing instruction jmp __b3 +Removing instruction jmp __breturn +Removing instruction jmp __b1 +Removing instruction jmp __breturn +Removing instruction jmp __b1 +Removing instruction jmp __breturn +Removing instruction jmp __b3 +Succesful ASM optimization Pass5NextJumpElimination +Removing instruction ldy conio_cursor_x +Removing instruction lda ch +Removing instruction lda #0 +Removing instruction lda ch +Removing instruction lda #0 +Replacing instruction ldy #0 with TAY +Removing instruction ldy #0 +Removing instruction lda #>0 +Succesful ASM optimization Pass5UnnecesaryLoadElimination +Replacing label __b2_from_conio_c64_init with __b1 +Replacing label __b1_from_cputc with __b1 +Replacing label __b1_from___b4 with __b1 +Replacing label __b1_from___b9 with __b1 +Replacing label __b3_from_gotoxy with __b2 +Replacing label __b1 with __b2 +Replacing label __breturn_from___b6 with __breturn +Replacing label __breturn_from___b4 with __breturn +Replacing label __breturn_from___b3 with __breturn +Replacing label __breturn_from___b2 with __breturn +Replacing label __breturn_from___b1 with __breturn +Replacing label __b1_from___b2 with __b1 +Replacing label __b3_from___b1 with __b3 +Replacing label __b8_from___b9 with __b8 +Replacing label __b11_from___b8 with __b1 +Replacing label __b3_from___b2 with __b3 +Replacing label __b1_from___b2 with __b1 +Replacing label __b2_from___b3 with __b2 +Removing instruction __b1_from___init1: +Removing instruction main_from___b1: +Removing instruction __b2_from_conio_c64_init: +Removing instruction __b2: +Removing instruction __b1_from___b2: +Removing instruction gotoxy_from___b1: +Removing instruction __b3_from___b2: +Removing instruction __b1_from_cputc: +Removing instruction toD0181_from_main: +Removing instruction toD0181: +Removing instruction __b1_from___b4: +Removing instruction __b1_from___b9: +Removing instruction __b8_from___b7: +Removing instruction printf_str_from___b8: +Removing instruction __b3_from_gotoxy: +Removing instruction __b3: +Removing instruction __b1_from___b3: +Removing instruction __b1: +Removing instruction __breturn_from___b1: +Removing instruction __breturn_from___b2: +Removing instruction __breturn_from___b3: +Removing instruction __breturn_from___b4: +Removing instruction __breturn_from___b5: +Removing instruction __breturn_from___b6: +Removing instruction __b1_from_printf_str: +Removing instruction __b1_from___b2: +Removing instruction __b2_from___b1: +Removing instruction gotoxy_from___b2: +Removing instruction __b3_from___b1: +Removing instruction memcpy_from___b3: +Removing instruction __b4_from___b3: +Removing instruction memcpy_from___b4: +Removing instruction __b5_from___b4: +Removing instruction memset_from___b5: +Removing instruction __b4_from___b7: +Removing instruction uctoa_append_from___b5: +Removing instruction __b4_from_printf_number_buffer: +Removing instruction strlen_from___b4: +Removing instruction __b8_from___b5: +Removing instruction __b8_from___b9: +Removing instruction __b11_from___b8: +Removing instruction __b11: +Removing instruction __b1_from___b11: +Removing instruction __b10: +Removing instruction __b3_from___b2: +Removing instruction __b3_from___b7: +Removing instruction printf_str_from___b3: +Removing instruction __b1_from_memcpy: +Removing instruction __b1_from___b2: +Removing instruction __b2_from___b1: +Removing instruction __b2_from___b3: +Succesful ASM optimization Pass5RedundantLabelElimination +Removing instruction __init1: +Removing instruction __b1: +Removing instruction __breturn: +Removing instruction __b1_from_conio_c64_init: +Removing instruction __breturn: +Removing instruction __b2: +Removing instruction __b3: +Removing instruction __b3: +Removing instruction clrscr_from___b3: +Removing instruction __b1_from___b3: +Removing instruction __b4: +Removing instruction __b10: +Removing instruction __b1_from___b10: +Removing instruction __b5: +Removing instruction printf_str_from___b5: +Removing instruction __b6: +Removing instruction printf_str_from___b6: +Removing instruction __b7: +Removing instruction printf_uchar_from___b7: +Removing instruction __b8: +Removing instruction __b9: +Removing instruction __b1_from_gotoxy: +Removing instruction __breturn: +Removing instruction __breturn: +Removing instruction __b1_from_clrscr: +Removing instruction __b2: +Removing instruction __breturn: +Removing instruction __b5: +Removing instruction __b1_from___b5: +Removing instruction __b3_from___b4: +Removing instruction __breturn: +Removing instruction __b6: +Removing instruction __b7: +Removing instruction __b8: +Removing instruction __b9: +Removing instruction __b10: +Removing instruction __breturn_from___b10: +Removing instruction __breturn: +Removing instruction __b1: +Removing instruction uctoa_from___b1: +Removing instruction __b2: +Removing instruction printf_number_buffer_from___b2: +Removing instruction __breturn: +Removing instruction __b1: +Removing instruction __b2: +Removing instruction __b4: +Removing instruction __b5: +Removing instruction __b6: +Removing instruction memset_from___b6: +Removing instruction __b7: +Removing instruction __b1_from_uctoa: +Removing instruction __b3: +Removing instruction __breturn: +Removing instruction __b7: +Removing instruction __b1_from___b4: +Removing instruction __b6: +Removing instruction __b4_from___b6: +Removing instruction __b4: +Removing instruction __b9: +Removing instruction __b5: +Removing instruction __b1_from___b8: +Removing instruction printf_padding_from___b6: +Removing instruction __b7: +Removing instruction __breturn: +Removing instruction __breturn: +Removing instruction __b1: +Removing instruction __breturn: +Removing instruction __b1_from_uctoa_append: +Removing instruction __b3: +Removing instruction __breturn: +Removing instruction __b1_from___b2: +Removing instruction __b1_from_strlen: +Removing instruction __breturn: +Removing instruction __b1_from___b2: +Removing instruction __b1_from_printf_padding: +Removing instruction __breturn: +Removing instruction __b3: +Removing instruction __b1_from___b3: +Succesful ASM optimization Pass5UnusedLabelElimination +Replacing jump to rts with rts in jmp __breturn +Replacing jump to rts with rts in jmp __breturn +Replacing jump to rts with rts in jmp __breturn +Replacing jump to rts with rts in jmp __breturn +Replacing jump to rts with rts in jmp __breturn +Replacing jump to rts with rts in jmp __breturn +Replacing jump to rts with rts in jmp __breturn +Succesful ASM optimization Pass5DoubleJumpElimination +Relabelling long label __b3_from___b1 to __b2 +Succesful ASM optimization Pass5RelabelLongLabels +Removing instruction jmp __b1 +Removing instruction jmp __b1 +Removing instruction jmp __b2 +Removing instruction jmp __b1 +Succesful ASM optimization Pass5NextJumpElimination +Removing instruction lda ch +Removing instruction lda buffer_sign +Succesful ASM optimization Pass5UnnecesaryLoadElimination + +FINAL SYMBOL TABLE +__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 ] + + +FINAL ASSEMBLER +Score: 83661 + + // File Comments + // Upstart + // 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) + // Global Constants & labels + .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 +__start: { + // __start::__init1 + // __ma char *conio_line_text = CONIO_SCREEN_TEXT + // [1] conio_line_text = DEFAULT_SCREEN -- pbuz1=pbuc1 + lda #DEFAULT_SCREEN + sta.z conio_line_text+1 + // __ma char *conio_line_color = CONIO_SCREEN_COLORS + // [2] conio_line_color = COLORRAM -- pbuz1=pbuc1 + lda #COLORRAM + sta.z conio_line_color+1 + // #pragma constructor_for(conio_c64_init, cputc, clrscr, cscroll) + // [3] call conio_c64_init + jsr conio_c64_init + // [4] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1] + // __start::@1 + // [5] call main + // [25] phi from __start::@1 to main [phi:__start::@1->main] + jsr main + // __start::@return + // [6] return + rts +} + // conio_c64_init +// Set initial cursor position +conio_c64_init: { + // Position cursor at current line + .label BASIC_CURSOR_LINE = $d6 + // char line = *BASIC_CURSOR_LINE + // [7] conio_c64_init::line#0 = *conio_c64_init::BASIC_CURSOR_LINE -- vbuxx=_deref_pbuc1 + ldx BASIC_CURSOR_LINE + // if(line>=CONIO_HEIGHT) + // [8] if(conio_c64_init::line#0<$19) goto conio_c64_init::@2 -- vbuxx_lt_vbuc1_then_la1 + cpx #$19 + bcc __b1 + // [10] phi from conio_c64_init to conio_c64_init::@1 [phi:conio_c64_init->conio_c64_init::@1] + // [10] phi conio_c64_init::line#2 = $19-1 [phi:conio_c64_init->conio_c64_init::@1#0] -- vbuxx=vbuc1 + ldx #$19-1 + // [9] phi from conio_c64_init to conio_c64_init::@2 [phi:conio_c64_init->conio_c64_init::@2] + // conio_c64_init::@2 + // [10] phi from conio_c64_init::@2 to conio_c64_init::@1 [phi:conio_c64_init::@2->conio_c64_init::@1] + // [10] phi conio_c64_init::line#2 = conio_c64_init::line#0 [phi:conio_c64_init::@2->conio_c64_init::@1#0] -- register_copy + // conio_c64_init::@1 + __b1: + // gotoxy(0, line) + // [11] gotoxy::y#2 = conio_c64_init::line#2 + // [12] call gotoxy + // [49] phi from conio_c64_init::@1 to gotoxy [phi:conio_c64_init::@1->gotoxy] + // [49] phi gotoxy::y#3 = gotoxy::y#2 [phi:conio_c64_init::@1->gotoxy#0] -- register_copy + jsr gotoxy + // conio_c64_init::@return + // } + // [13] return + rts +} + // cputc +// 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 + // [14] cputc::c#0 = stackidx(char,cputc::OFFSET_STACK_C) -- vbuaa=_stackidxbyte_vbuc1 + tsx + lda STACK_BASE+OFFSET_STACK_C,x + // if(c=='\n') + // [15] if(cputc::c#0==' ') goto cputc::@1 -- vbuaa_eq_vbuc1_then_la1 + cmp #'\n' + beq __b1 + // cputc::@2 + // conio_line_text[conio_cursor_x] = c + // [16] conio_line_text[conio_cursor_x] = cputc::c#0 -- pbuz1_derefidx_vbum2=vbuaa + ldy conio_cursor_x + sta (conio_line_text),y + // conio_line_color[conio_cursor_x] = conio_textcolor + // [17] conio_line_color[conio_cursor_x] = conio_textcolor -- pbuz1_derefidx_vbum2=vbum3 + lda conio_textcolor + sta (conio_line_color),y + // if(++conio_cursor_x==CONIO_WIDTH) + // [18] conio_cursor_x = ++ conio_cursor_x -- vbum1=_inc_vbum1 + inc conio_cursor_x + // [19] if(conio_cursor_x!=$28) goto cputc::@return -- vbum1_neq_vbuc1_then_la1 + lda #$28 + cmp conio_cursor_x + bne __breturn + // [20] phi from cputc::@2 to cputc::@3 [phi:cputc::@2->cputc::@3] + // cputc::@3 + // cputln() + // [21] call cputln + jsr cputln + // cputc::@return + __breturn: + // } + // [22] return + rts + // [23] phi from cputc to cputc::@1 [phi:cputc->cputc::@1] + // cputc::@1 + __b1: + // cputln() + // [24] call cputln + jsr cputln + rts +} + // main +// Show the currently pressed key +main: { + .const toD0181_return = (>(DEFAULT_SCREEN&$3fff)*4)|(>DEFAULT_FONT_MIXED)/4&$f + // [26] phi from main to main::toD0181 [phi:main->main::toD0181] + // main::toD0181 + // main::@3 + // VICII->MEMORY = toD018(DEFAULT_SCREEN, DEFAULT_FONT_MIXED) + // [27] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = main::toD0181_return#0 -- _deref_pbuc1=vbuc2 + lda #toD0181_return + sta VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY + // clrscr() + // [28] call clrscr + // [70] phi from main::@3 to clrscr [phi:main::@3->clrscr] + jsr clrscr + // [29] phi from main::@3 to main::@1 [phi:main::@3->main::@1] + // [29] phi main::current#2 = 0 [phi:main::@3->main::@1#0] -- vbum1=vbuc1 + lda #0 + sta current + // [29] phi from main::@4 main::@9 to main::@1 [phi:main::@4/main::@9->main::@1] + // [29] phi main::current#2 = main::current#2 [phi:main::@4/main::@9->main::@1#0] -- register_copy + // main::@1 + __b1: + // char ch = GETIN() + // [30] call GETIN + jsr GETIN + // [31] GETIN::return#0 = GETIN::return#1 + // main::@4 + // [32] main::ch#0 = GETIN::return#0 -- vbum1=vbuaa + sta ch + // if(ch && ch!=current) + // [33] if(0==main::ch#0) goto main::@1 -- 0_eq_vbum1_then_la1 + beq __b1 + // main::@10 + // [34] if(main::ch#0!=main::current#2) goto main::@2 -- vbum1_neq_vbum2_then_la1 + cmp current + bne __b2 + // [29] phi from main::@10 to main::@1 [phi:main::@10->main::@1] + jmp __b1 + // main::@2 + __b2: + // petscii_to_screencode(ch) + // [35] petscii_to_screencode::petscii#0 = main::ch#0 -- vbuaa=vbum1 + lda ch + // [36] call petscii_to_screencode + jsr petscii_to_screencode + // [37] petscii_to_screencode::return#0 = petscii_to_screencode::return#10 + // main::@5 + // [38] main::$6 = petscii_to_screencode::return#0 -- vbum1=vbuaa + sta __6 + // printf("'%c'($%2x) ", petscii_to_screencode(ch), ch) + // [39] call printf_str + // [102] phi from main::@5 to printf_str [phi:main::@5->printf_str] + // [102] phi printf_str::putc#6 = &cputc [phi:main::@5->printf_str#0] -- pprz1=pprc1 + lda #cputc + sta.z printf_str.putc+1 + // [102] phi printf_str::s#6 = main::s [phi:main::@5->printf_str#1] -- pbuz1=pbuc1 + lda #s + sta.z printf_str.s+1 + jsr printf_str + // main::@6 + // printf("'%c'($%2x) ", petscii_to_screencode(ch), ch) + // [40] stackpush(char) = main::$6 -- _stackpushbyte_=vbum1 + lda __6 + pha + // [41] callexecute cputc -- call_vprc1 + jsr cputc + // sideeffect stackpullbytes(1) -- _stackpullbyte_1 + pla + // [43] call printf_str + // [102] phi from main::@6 to printf_str [phi:main::@6->printf_str] + // [102] phi printf_str::putc#6 = &cputc [phi:main::@6->printf_str#0] -- pprz1=pprc1 + lda #cputc + sta.z printf_str.putc+1 + // [102] phi printf_str::s#6 = main::s1 [phi:main::@6->printf_str#1] -- pbuz1=pbuc1 + lda #s1 + sta.z printf_str.s+1 + jsr printf_str + // main::@7 + // printf("'%c'($%2x) ", petscii_to_screencode(ch), ch) + // [44] printf_uchar::uvalue#0 = main::ch#0 -- vbuxx=vbum1 + ldx ch + // [45] call printf_uchar + // [111] phi from main::@7 to printf_uchar [phi:main::@7->printf_uchar] + jsr printf_uchar + // [46] phi from main::@7 to main::@8 [phi:main::@7->main::@8] + // main::@8 + // printf("'%c'($%2x) ", petscii_to_screencode(ch), ch) + // [47] call printf_str + // [102] phi from main::@8 to printf_str [phi:main::@8->printf_str] + // [102] phi printf_str::putc#6 = &cputc [phi:main::@8->printf_str#0] -- pprz1=pprc1 + lda #cputc + sta.z printf_str.putc+1 + // [102] phi printf_str::s#6 = main::s2 [phi:main::@8->printf_str#1] -- pbuz1=pbuc1 + lda #s2 + sta.z printf_str.s+1 + jsr printf_str + // main::@9 + // [48] main::current#4 = main::ch#0 -- vbum1=vbum2 + 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 + // gotoxy +// 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) + // [50] if(gotoxy::y#3<$19+1) goto gotoxy::@3 -- vbuxx_lt_vbuc1_then_la1 + cpx #$19+1 + bcc __b2 + // [52] phi from gotoxy to gotoxy::@1 [phi:gotoxy->gotoxy::@1] + // [52] phi gotoxy::y#4 = 0 [phi:gotoxy->gotoxy::@1#0] -- vbuxx=vbuc1 + ldx #0 + // [51] phi from gotoxy to gotoxy::@3 [phi:gotoxy->gotoxy::@3] + // gotoxy::@3 + // [52] phi from gotoxy::@3 to gotoxy::@1 [phi:gotoxy::@3->gotoxy::@1] + // [52] phi gotoxy::y#4 = gotoxy::y#3 [phi:gotoxy::@3->gotoxy::@1#0] -- register_copy + // gotoxy::@1 + // gotoxy::@2 + __b2: + // conio_cursor_x = x + // [53] conio_cursor_x = 0 -- vbum1=vbuc1 + lda #0 + sta conio_cursor_x + // conio_cursor_y = y + // [54] conio_cursor_y = gotoxy::y#4 -- vbum1=vbuxx + stx conio_cursor_y + // unsigned int line_offset = (unsigned int)y*CONIO_WIDTH + // [55] gotoxy::$7 = (unsigned int)gotoxy::y#4 -- vwum1=_word_vbuxx + txa + sta __7 + lda #0 + sta __7+1 + // [56] gotoxy::$8 = gotoxy::$7 << 2 -- vwum1=vwum2_rol_2 + lda __7 + asl + sta __8 + lda __7+1 + rol + sta __8+1 + asl __8 + rol __8+1 + // [57] gotoxy::$9 = gotoxy::$8 + gotoxy::$7 -- vwum1=vwum2_plus_vwum1 + clc + lda __9 + adc __8 + sta __9 + lda __9+1 + adc __8+1 + sta __9+1 + // [58] gotoxy::line_offset#0 = gotoxy::$9 << 3 -- vwum1=vwum1_rol_3 + 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 + // [59] gotoxy::$5 = DEFAULT_SCREEN + gotoxy::line_offset#0 -- pbuz1=pbuc1_plus_vwum2 + lda line_offset + clc + adc #DEFAULT_SCREEN + sta.z __5+1 + // conio_line_text = CONIO_SCREEN_TEXT + line_offset + // [60] conio_line_text = gotoxy::$5 -- pbuz1=pbuz2 + lda.z __5 + sta.z conio_line_text + lda.z __5+1 + sta.z conio_line_text+1 + // CONIO_SCREEN_COLORS + line_offset + // [61] gotoxy::$6 = COLORRAM + gotoxy::line_offset#0 -- pbuz1=pbuc1_plus_vwum2 + lda line_offset + clc + adc #COLORRAM + sta.z __6+1 + // conio_line_color = CONIO_SCREEN_COLORS + line_offset + // [62] conio_line_color = gotoxy::$6 -- pbuz1=pbuz2 + lda.z __6 + sta.z conio_line_color + lda.z __6+1 + sta.z conio_line_color+1 + // gotoxy::@return + // } + // [63] return + rts + .segment Data + __7: .word 0 + .label line_offset = __7 + __8: .word 0 + .label __9 = __7 +} +.segment Code + // cputln +// Print a newline +cputln: { + // conio_line_text += CONIO_WIDTH + // [64] conio_line_text = conio_line_text + $28 -- pbuz1=pbuz1_plus_vbuc1 + 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 + // [65] conio_line_color = conio_line_color + $28 -- pbuz1=pbuz1_plus_vbuc1 + lda #$28 + clc + adc.z conio_line_color + sta.z conio_line_color + bcc !+ + inc.z conio_line_color+1 + !: + // conio_cursor_x = 0 + // [66] conio_cursor_x = 0 -- vbum1=vbuc1 + lda #0 + sta conio_cursor_x + // conio_cursor_y++; + // [67] conio_cursor_y = ++ conio_cursor_y -- vbum1=_inc_vbum1 + inc conio_cursor_y + // cscroll() + // [68] call cscroll + jsr cscroll + // cputln::@return + // } + // [69] return + rts +} + // clrscr +// 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 + // [71] phi from clrscr to clrscr::@1 [phi:clrscr->clrscr::@1] + // [71] phi clrscr::line_cols#5 = COLORRAM [phi:clrscr->clrscr::@1#0] -- pbuz1=pbuc1 + lda #COLORRAM + sta.z line_cols+1 + // [71] phi clrscr::line_text#5 = DEFAULT_SCREEN [phi:clrscr->clrscr::@1#1] -- pbuz1=pbuc1 + lda #DEFAULT_SCREEN + sta.z line_text+1 + // [71] phi clrscr::l#2 = 0 [phi:clrscr->clrscr::@1#2] -- vbuxx=vbuc1 + ldx #0 + // clrscr::@1 + __b1: + // for( char l=0;lDEFAULT_SCREEN + sta.z conio_line_text+1 + // conio_line_color = CONIO_SCREEN_COLORS + // [76] conio_line_color = COLORRAM -- pbuz1=pbuc1 + lda #COLORRAM + sta.z conio_line_color+1 + // clrscr::@return + // } + // [77] return + rts + // [78] phi from clrscr::@1 to clrscr::@3 [phi:clrscr::@1->clrscr::@3] + __b2: + // [78] phi clrscr::c#2 = 0 [phi:clrscr::@1->clrscr::@3#0] -- vbuyy=vbuc1 + ldy #0 + // clrscr::@3 + __b3: + // for( char c=0;cclrscr::@1] + // [71] phi clrscr::line_cols#5 = clrscr::line_cols#1 [phi:clrscr::@5->clrscr::@1#0] -- register_copy + // [71] phi clrscr::line_text#5 = clrscr::line_text#1 [phi:clrscr::@5->clrscr::@1#1] -- register_copy + // [71] phi clrscr::l#2 = clrscr::l#1 [phi:clrscr::@5->clrscr::@1#2] -- register_copy + jmp __b1 + // clrscr::@4 + __b4: + // line_text[c] = ' ' + // [83] clrscr::line_text#5[clrscr::c#2] = ' ' -- pbuz1_derefidx_vbuyy=vbuc1 + lda #' ' + sta (line_text),y + // line_cols[c] = conio_textcolor + // [84] clrscr::line_cols#5[clrscr::c#2] = conio_textcolor -- pbuz1_derefidx_vbuyy=vbum2 + lda conio_textcolor + sta (line_cols),y + // for( char c=0;cclrscr::@3] + // [78] phi clrscr::c#2 = clrscr::c#1 [phi:clrscr::@4->clrscr::@3#0] -- register_copy + jmp __b3 +} + // GETIN +// 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 + // asm { jsr$ffe4 stach } + jsr $ffe4 + sta ch + // return *ch; + // [87] GETIN::return#1 = *GETIN::ch -- vbuaa=_deref_pbuc1 + // GETIN::@return + // } + // [88] return + rts +} + // petscii_to_screencode +// Convert a PETSCII char to screencode +// __register(A) char petscii_to_screencode(__register(A) char petscii) +petscii_to_screencode: { + // if(petscii<32) + // [89] if(petscii_to_screencode::petscii#0<$20) goto petscii_to_screencode::@1 -- vbuaa_lt_vbuc1_then_la1 + cmp #$20 + bcc __b1 + // petscii_to_screencode::@6 + // if(petscii<64) + // [90] if(petscii_to_screencode::petscii#0<$40) goto petscii_to_screencode::@return -- vbuaa_lt_vbuc1_then_la1 + cmp #$40 + bcc __breturn + // petscii_to_screencode::@7 + // if(petscii<96) + // [91] if(petscii_to_screencode::petscii#0<$60) goto petscii_to_screencode::@2 -- vbuaa_lt_vbuc1_then_la1 + cmp #$60 + bcc __b2 + // petscii_to_screencode::@8 + // if(petscii<128) + // [92] if(petscii_to_screencode::petscii#0<$80) goto petscii_to_screencode::@3 -- vbuaa_lt_vbuc1_then_la1 + cmp #$80 + bcc __b3 + // petscii_to_screencode::@9 + // if(petscii<160) + // [93] if(petscii_to_screencode::petscii#0<$a0) goto petscii_to_screencode::@4 -- vbuaa_lt_vbuc1_then_la1 + cmp #$a0 + bcc __b4 + // petscii_to_screencode::@10 + // if(petscii<255) + // [94] if(petscii_to_screencode::petscii#0<$ff) goto petscii_to_screencode::@5 -- vbuaa_lt_vbuc1_then_la1 + cmp #$ff + bcc __b5 + // [96] phi from petscii_to_screencode::@10 to petscii_to_screencode::@return [phi:petscii_to_screencode::@10->petscii_to_screencode::@return] + // [96] phi petscii_to_screencode::return#10 = $5e [phi:petscii_to_screencode::@10->petscii_to_screencode::@return#0] -- vbuaa=vbuc1 + lda #$5e + rts + // petscii_to_screencode::@5 + __b5: + // return petscii-128; + // [95] petscii_to_screencode::return#6 = petscii_to_screencode::petscii#0 - $80 -- vbuaa=vbuaa_minus_vbuc1 + sec + sbc #$80 + // [96] phi from petscii_to_screencode::@1 petscii_to_screencode::@2 petscii_to_screencode::@3 petscii_to_screencode::@4 petscii_to_screencode::@5 petscii_to_screencode::@6 to petscii_to_screencode::@return [phi:petscii_to_screencode::@1/petscii_to_screencode::@2/petscii_to_screencode::@3/petscii_to_screencode::@4/petscii_to_screencode::@5/petscii_to_screencode::@6->petscii_to_screencode::@return] + // [96] phi petscii_to_screencode::return#10 = petscii_to_screencode::return#1 [phi:petscii_to_screencode::@1/petscii_to_screencode::@2/petscii_to_screencode::@3/petscii_to_screencode::@4/petscii_to_screencode::@5/petscii_to_screencode::@6->petscii_to_screencode::@return#0] -- register_copy + // petscii_to_screencode::@return + __breturn: + // } + // [97] return + rts + // petscii_to_screencode::@4 + __b4: + // return petscii+64; + // [98] petscii_to_screencode::return#5 = petscii_to_screencode::petscii#0 + $40 -- vbuaa=vbuaa_plus_vbuc1 + clc + adc #$40 + rts + // petscii_to_screencode::@3 + __b3: + // return petscii-32; + // [99] petscii_to_screencode::return#4 = petscii_to_screencode::petscii#0 - $20 -- vbuaa=vbuaa_minus_vbuc1 + sec + sbc #$20 + rts + // petscii_to_screencode::@2 + __b2: + // return petscii-64; + // [100] petscii_to_screencode::return#3 = petscii_to_screencode::petscii#0 - $40 -- vbuaa=vbuaa_minus_vbuc1 + sec + sbc #$40 + rts + // petscii_to_screencode::@1 + __b1: + // return petscii+128; + // [101] petscii_to_screencode::return#1 = petscii_to_screencode::petscii#0 + $80 -- vbuaa=vbuaa_plus_vbuc1 + clc + adc #$80 + rts +} + // printf_str +/// 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 + // [103] phi from printf_str printf_str::@2 to printf_str::@1 [phi:printf_str/printf_str::@2->printf_str::@1] + // [103] phi printf_str::s#5 = printf_str::s#6 [phi:printf_str/printf_str::@2->printf_str::@1#0] -- register_copy + // printf_str::@1 + __b1: + // while(c=*s++) + // [104] printf_str::c#1 = *printf_str::s#5 -- vbuaa=_deref_pbuz1 + ldy #0 + lda (s),y + // [105] printf_str::s#0 = ++ printf_str::s#5 -- pbuz1=_inc_pbuz1 + inc.z s + bne !+ + inc.z s+1 + !: + // [106] if(0!=printf_str::c#1) goto printf_str::@2 -- 0_neq_vbuaa_then_la1 + cmp #0 + bne __b2 + // printf_str::@return + // } + // [107] return + rts + // printf_str::@2 + __b2: + // putc(c) + // [108] stackpush(char) = printf_str::c#1 -- _stackpushbyte_=vbuaa + pha + // [109] callexecute *printf_str::putc#6 -- call__deref_pprz1 + jsr icall2 + // sideeffect stackpullbytes(1) -- _stackpullbyte_1 + pla + jmp __b1 + // Outside Flow + icall2: + jmp (putc) +} + // printf_uchar +// 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_uchar::@1 + // printf_buffer.sign = format.sign_always?'+':0 + // [112] *((char *)&printf_buffer) = 0 -- _deref_pbuc1=vbuc2 + // Handle any sign + lda #0 + sta printf_buffer + // uctoa(uvalue, printf_buffer.digits, format.radix) + // [113] uctoa::value#1 = printf_uchar::uvalue#0 + // [114] call uctoa + // Format number into buffer + // [134] phi from printf_uchar::@1 to uctoa [phi:printf_uchar::@1->uctoa] + jsr uctoa + // printf_uchar::@2 + // printf_number_buffer(putc, printf_buffer, format) + // [115] printf_number_buffer::buffer_sign#0 = *((char *)&printf_buffer) -- vbum1=_deref_pbuc1 + lda printf_buffer + sta printf_number_buffer.buffer_sign + // [116] call printf_number_buffer + // Print using format + // [153] phi from printf_uchar::@2 to printf_number_buffer [phi:printf_uchar::@2->printf_number_buffer] + jsr printf_number_buffer + // printf_uchar::@return + // } + // [117] return + rts +} + // cscroll +// Scroll the entire screen if the cursor is beyond the last line +cscroll: { + // if(conio_cursor_y==CONIO_HEIGHT) + // [118] if(conio_cursor_y!=$19) goto cscroll::@return -- vbum1_neq_vbuc1_then_la1 + lda #$19 + cmp conio_cursor_y + bne __breturn + // cscroll::@1 + // if(conio_scroll_enable) + // [119] if(0!=conio_scroll_enable) goto cscroll::@3 -- 0_neq_vbum1_then_la1 + lda conio_scroll_enable + bne __b3 + // [120] phi from cscroll::@1 to cscroll::@2 [phi:cscroll::@1->cscroll::@2] + // cscroll::@2 + // gotoxy(0,0) + // [121] call gotoxy + // [49] phi from cscroll::@2 to gotoxy [phi:cscroll::@2->gotoxy] + // [49] phi gotoxy::y#3 = 0 [phi:cscroll::@2->gotoxy#0] -- vbuxx=vbuc1 + ldx #0 + jsr gotoxy + // cscroll::@return + __breturn: + // } + // [122] return + rts + // [123] phi from cscroll::@1 to cscroll::@3 [phi:cscroll::@1->cscroll::@3] + // cscroll::@3 + __b3: + // memcpy(CONIO_SCREEN_TEXT, CONIO_SCREEN_TEXT+CONIO_WIDTH, CONIO_BYTES-CONIO_WIDTH) + // [124] call memcpy + // [176] phi from cscroll::@3 to memcpy [phi:cscroll::@3->memcpy] + // [176] phi memcpy::destination#2 = (void *)DEFAULT_SCREEN [phi:cscroll::@3->memcpy#0] -- pvoz1=pvoc1 + lda #DEFAULT_SCREEN + sta.z memcpy.destination+1 + // [176] phi memcpy::source#2 = (void *)DEFAULT_SCREEN+$28 [phi:cscroll::@3->memcpy#1] -- pvoz1=pvoc1 + lda #DEFAULT_SCREEN+$28 + sta.z memcpy.source+1 + jsr memcpy + // [125] phi from cscroll::@3 to cscroll::@4 [phi:cscroll::@3->cscroll::@4] + // cscroll::@4 + // memcpy(CONIO_SCREEN_COLORS, CONIO_SCREEN_COLORS+CONIO_WIDTH, CONIO_BYTES-CONIO_WIDTH) + // [126] call memcpy + // [176] phi from cscroll::@4 to memcpy [phi:cscroll::@4->memcpy] + // [176] phi memcpy::destination#2 = (void *)COLORRAM [phi:cscroll::@4->memcpy#0] -- pvoz1=pvoc1 + lda #COLORRAM + sta.z memcpy.destination+1 + // [176] phi memcpy::source#2 = (void *)COLORRAM+$28 [phi:cscroll::@4->memcpy#1] -- pvoz1=pvoc1 + lda #COLORRAM+$28 + sta.z memcpy.source+1 + jsr memcpy + // [127] phi from cscroll::@4 to cscroll::@5 [phi:cscroll::@4->cscroll::@5] + // cscroll::@5 + // memset(CONIO_SCREEN_TEXT+CONIO_BYTES-CONIO_WIDTH, ' ', CONIO_WIDTH) + // [128] call memset + // [186] phi from cscroll::@5 to memset [phi:cscroll::@5->memset] + // [186] phi memset::c#4 = ' ' [phi:cscroll::@5->memset#0] -- vbuxx=vbuc1 + ldx #' ' + // [186] phi memset::str#3 = (void *)DEFAULT_SCREEN+(unsigned int)$19*$28-$28 [phi:cscroll::@5->memset#1] -- pvoz1=pvoc1 + lda #DEFAULT_SCREEN+$19*$28-$28 + sta.z memset.str+1 + jsr memset + // cscroll::@6 + // memset(CONIO_SCREEN_COLORS+CONIO_BYTES-CONIO_WIDTH, conio_textcolor, CONIO_WIDTH) + // [129] memset::c#1 = conio_textcolor -- vbuxx=vbum1 + ldx conio_textcolor + // [130] call memset + // [186] phi from cscroll::@6 to memset [phi:cscroll::@6->memset] + // [186] phi memset::c#4 = memset::c#1 [phi:cscroll::@6->memset#0] -- register_copy + // [186] phi memset::str#3 = (void *)COLORRAM+(unsigned int)$19*$28-$28 [phi:cscroll::@6->memset#1] -- pvoz1=pvoc1 + lda #COLORRAM+$19*$28-$28 + sta.z memset.str+1 + jsr memset + // cscroll::@7 + // conio_line_text -= CONIO_WIDTH + // [131] conio_line_text = conio_line_text - $28 -- pbuz1=pbuz1_minus_vbuc1 + 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 + // [132] conio_line_color = conio_line_color - $28 -- pbuz1=pbuz1_minus_vbuc1 + 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--; + // [133] conio_cursor_y = -- conio_cursor_y -- vbum1=_dec_vbum1 + dec conio_cursor_y + rts +} + // uctoa +// 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 + // [135] phi from uctoa to uctoa::@1 [phi:uctoa->uctoa::@1] + // [135] phi uctoa::buffer#11 = (char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS [phi:uctoa->uctoa::@1#0] -- pbuz1=pbuc1 + lda #printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS + sta.z buffer+1 + // [135] phi uctoa::started#2 = 0 [phi:uctoa->uctoa::@1#1] -- vbum1=vbuc1 + lda #0 + sta started + // [135] phi uctoa::value#2 = uctoa::value#1 [phi:uctoa->uctoa::@1#2] -- register_copy + // [135] phi uctoa::digit#2 = 0 [phi:uctoa->uctoa::@1#3] -- vbum1=vbuc1 + sta digit + // uctoa::@1 + __b1: + // for( char digit=0; digit= digit_value) + // [142] if(0!=uctoa::started#2) goto uctoa::@5 -- 0_neq_vbum1_then_la1 + lda started + bne __b5 + // uctoa::@7 + // [143] if(uctoa::value#2>=uctoa::digit_value#0) goto uctoa::@5 -- vbuxx_ge_vbum1_then_la1 + cpx digit_value + bcs __b5 + // [144] phi from uctoa::@7 to uctoa::@4 [phi:uctoa::@7->uctoa::@4] + // [144] phi uctoa::buffer#14 = uctoa::buffer#11 [phi:uctoa::@7->uctoa::@4#0] -- register_copy + // [144] phi uctoa::started#4 = uctoa::started#2 [phi:uctoa::@7->uctoa::@4#1] -- register_copy + // [144] phi uctoa::value#6 = uctoa::value#2 [phi:uctoa::@7->uctoa::@4#2] -- register_copy + // uctoa::@4 + __b4: + // for( char digit=0; digituctoa::@1] + // [135] phi uctoa::buffer#11 = uctoa::buffer#14 [phi:uctoa::@4->uctoa::@1#0] -- register_copy + // [135] phi uctoa::started#2 = uctoa::started#4 [phi:uctoa::@4->uctoa::@1#1] -- register_copy + // [135] phi uctoa::value#2 = uctoa::value#6 [phi:uctoa::@4->uctoa::@1#2] -- register_copy + // [135] phi uctoa::digit#2 = uctoa::digit#1 [phi:uctoa::@4->uctoa::@1#3] -- register_copy + jmp __b1 + // uctoa::@5 + __b5: + // uctoa_append(buffer++, value, digit_value) + // [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 + // [194] phi from uctoa::@5 to uctoa_append [phi:uctoa::@5->uctoa_append] + jsr uctoa_append + // uctoa_append(buffer++, value, digit_value) + // [150] uctoa_append::return#0 = uctoa_append::value#2 + // uctoa::@6 + // value = uctoa_append(buffer++, value, digit_value) + // [151] uctoa::value#0 = uctoa_append::return#0 + // value = uctoa_append(buffer++, value, digit_value); + // [152] uctoa::buffer#4 = ++ uctoa::buffer#11 -- pbuz1=_inc_pbuz1 + inc.z buffer + bne !+ + inc.z buffer+1 + !: + // [144] phi from uctoa::@6 to uctoa::@4 [phi:uctoa::@6->uctoa::@4] + // [144] phi uctoa::buffer#14 = uctoa::buffer#4 [phi:uctoa::@6->uctoa::@4#0] -- register_copy + // [144] phi uctoa::started#4 = 1 [phi:uctoa::@6->uctoa::@4#1] -- vbum1=vbuc1 + lda #1 + sta started + // [144] phi uctoa::value#6 = uctoa::value#0 [phi:uctoa::@6->uctoa::@4#2] -- register_copy + jmp __b4 + .segment Data + digit_value: .byte 0 + digit: .byte 0 + started: .byte 0 +} +.segment Code + // printf_number_buffer +// 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 + // [154] phi from printf_number_buffer to printf_number_buffer::@4 [phi:printf_number_buffer->printf_number_buffer::@4] + // printf_number_buffer::@4 + // strlen(buffer.digits) + // [155] call strlen + // [201] phi from printf_number_buffer::@4 to strlen [phi:printf_number_buffer::@4->strlen] + jsr strlen + // strlen(buffer.digits) + // [156] strlen::return#2 = strlen::len#2 + // printf_number_buffer::@9 + // [157] printf_number_buffer::$19 = strlen::return#2 + // signed char len = (signed char)strlen(buffer.digits) + // [158] printf_number_buffer::len#0 = (signed char)printf_number_buffer::$19 -- vbsxx=_sbyte_vwum1 + // There is a minimum length - work out the padding + ldx __19 + // if(buffer.sign) + // [159] if(0==printf_number_buffer::buffer_sign#0) goto printf_number_buffer::@8 -- 0_eq_vbum1_then_la1 + lda buffer_sign + beq __b8 + // printf_number_buffer::@5 + // len++; + // [160] printf_number_buffer::len#1 = ++ printf_number_buffer::len#0 -- vbsxx=_inc_vbsxx + inx + // [161] phi from printf_number_buffer::@5 printf_number_buffer::@9 to printf_number_buffer::@8 [phi:printf_number_buffer::@5/printf_number_buffer::@9->printf_number_buffer::@8] + // [161] phi printf_number_buffer::len#2 = printf_number_buffer::len#1 [phi:printf_number_buffer::@5/printf_number_buffer::@9->printf_number_buffer::@8#0] -- register_copy + // printf_number_buffer::@8 + __b8: + // padding = (signed char)format.min_length - len + // [162] printf_number_buffer::padding#1 = (signed char)printf_uchar::format_min_length#0 - printf_number_buffer::len#2 -- vbsaa=vbsc1_minus_vbsxx + txa + eor #$ff + sec + adc #printf_uchar.format_min_length + // if(padding<0) + // [163] if(printf_number_buffer::padding#1>=0) goto printf_number_buffer::@11 -- vbsaa_ge_0_then_la1 + cmp #0 + bpl __b1 + // [165] phi from printf_number_buffer::@8 to printf_number_buffer::@1 [phi:printf_number_buffer::@8->printf_number_buffer::@1] + // [165] phi printf_number_buffer::padding#10 = 0 [phi:printf_number_buffer::@8->printf_number_buffer::@1#0] -- vbsaa=vbsc1 + lda #0 + // [164] phi from printf_number_buffer::@8 to printf_number_buffer::@11 [phi:printf_number_buffer::@8->printf_number_buffer::@11] + // printf_number_buffer::@11 + // [165] phi from printf_number_buffer::@11 to printf_number_buffer::@1 [phi:printf_number_buffer::@11->printf_number_buffer::@1] + // [165] phi printf_number_buffer::padding#10 = printf_number_buffer::padding#1 [phi:printf_number_buffer::@11->printf_number_buffer::@1#0] -- register_copy + // printf_number_buffer::@1 + __b1: + // printf_number_buffer::@10 + // if(!format.justify_left && !format.zero_padding && padding) + // [166] if(0!=printf_number_buffer::padding#10) goto printf_number_buffer::@6 -- 0_neq_vbsaa_then_la1 + cmp #0 + bne __b6 + jmp __b2 + // printf_number_buffer::@6 + __b6: + // printf_padding(putc, ' ',(char)padding) + // [167] printf_padding::length#0 = (char)printf_number_buffer::padding#10 -- vbum1=vbuaa + sta printf_padding.length + // [168] call printf_padding + // [207] phi from printf_number_buffer::@6 to printf_padding [phi:printf_number_buffer::@6->printf_padding] + jsr printf_padding + // printf_number_buffer::@2 + __b2: + // if(buffer.sign) + // [169] if(0==printf_number_buffer::buffer_sign#0) goto printf_number_buffer::@3 -- 0_eq_vbum1_then_la1 + lda buffer_sign + beq __b3 + // printf_number_buffer::@7 + // putc(buffer.sign) + // [170] stackpush(char) = printf_number_buffer::buffer_sign#0 -- _stackpushbyte_=vbum1 + pha + // [171] callexecute cputc -- call_vprc1 + jsr cputc + // sideeffect stackpullbytes(1) -- _stackpullbyte_1 + pla + // [173] phi from printf_number_buffer::@2 printf_number_buffer::@7 to printf_number_buffer::@3 [phi:printf_number_buffer::@2/printf_number_buffer::@7->printf_number_buffer::@3] + // printf_number_buffer::@3 + __b3: + // printf_str(putc, buffer.digits) + // [174] call printf_str + // [102] phi from printf_number_buffer::@3 to printf_str [phi:printf_number_buffer::@3->printf_str] + // [102] phi printf_str::putc#6 = printf_uchar::putc#0 [phi:printf_number_buffer::@3->printf_str#0] -- pprz1=pprc1 + lda #printf_uchar.putc + sta.z printf_str.putc+1 + // [102] phi printf_str::s#6 = printf_number_buffer::buffer_digits#0 [phi:printf_number_buffer::@3->printf_str#1] -- pbuz1=pbuc1 + lda #buffer_digits + sta.z printf_str.s+1 + jsr printf_str + // printf_number_buffer::@return + // } + // [175] return + rts + .segment Data + .label __19 = strlen.len + buffer_sign: .byte 0 +} +.segment Code + // memcpy +// 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 + // [177] memcpy::src_end#0 = (char *)memcpy::source#2 + (unsigned int)$19*$28-$28 -- pbuz1=pbuz2_plus_vwuc1 + 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 + // [178] memcpy::src#4 = (char *)memcpy::source#2 + // [179] memcpy::dst#4 = (char *)memcpy::destination#2 + // [180] phi from memcpy memcpy::@2 to memcpy::@1 [phi:memcpy/memcpy::@2->memcpy::@1] + // [180] phi memcpy::dst#2 = memcpy::dst#4 [phi:memcpy/memcpy::@2->memcpy::@1#0] -- register_copy + // [180] phi memcpy::src#2 = memcpy::src#4 [phi:memcpy/memcpy::@2->memcpy::@1#1] -- register_copy + // memcpy::@1 + __b1: + // while(src!=src_end) + // [181] if(memcpy::src#2!=memcpy::src_end#0) goto memcpy::@2 -- pbuz1_neq_pbuz2_then_la1 + lda.z src+1 + cmp.z src_end+1 + bne __b2 + lda.z src + cmp.z src_end + bne __b2 + // memcpy::@return + // } + // [182] return + rts + // memcpy::@2 + __b2: + // *dst++ = *src++ + // [183] *memcpy::dst#2 = *memcpy::src#2 -- _deref_pbuz1=_deref_pbuz2 + ldy #0 + lda (src),y + sta (dst),y + // *dst++ = *src++; + // [184] memcpy::dst#1 = ++ memcpy::dst#2 -- pbuz1=_inc_pbuz1 + inc.z dst + bne !+ + inc.z dst+1 + !: + // [185] memcpy::src#1 = ++ memcpy::src#2 -- pbuz1=_inc_pbuz1 + inc.z src + bne !+ + inc.z src+1 + !: + jmp __b1 +} + // memset +// 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 + // memset::@1 + // char* end = (char*)str + num + // [187] memset::end#0 = (char *)memset::str#3 + $28 -- pbuz1=pbuz2_plus_vbuc1 + lda #$28 + clc + adc.z str + sta.z end + lda #0 + adc.z str+1 + sta.z end+1 + // [188] memset::dst#4 = (char *)memset::str#3 + // [189] phi from memset::@1 memset::@3 to memset::@2 [phi:memset::@1/memset::@3->memset::@2] + // [189] phi memset::dst#2 = memset::dst#4 [phi:memset::@1/memset::@3->memset::@2#0] -- register_copy + // memset::@2 + __b2: + // for(char* dst = str; dst!=end; dst++) + // [190] if(memset::dst#2!=memset::end#0) goto memset::@3 -- pbuz1_neq_pbuz2_then_la1 + lda.z dst+1 + cmp.z end+1 + bne __b3 + lda.z dst + cmp.z end + bne __b3 + // memset::@return + // } + // [191] return + rts + // memset::@3 + __b3: + // *dst = c + // [192] *memset::dst#2 = memset::c#4 -- _deref_pbuz1=vbuxx + txa + ldy #0 + sta (dst),y + // for(char* dst = str; dst!=end; dst++) + // [193] memset::dst#1 = ++ memset::dst#2 -- pbuz1=_inc_pbuz1 + inc.z dst + bne !+ + inc.z dst+1 + !: + jmp __b2 +} + // uctoa_append +// 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 + // [195] phi from uctoa_append to uctoa_append::@1 [phi:uctoa_append->uctoa_append::@1] + // [195] phi uctoa_append::digit#2 = 0 [phi:uctoa_append->uctoa_append::@1#0] -- vbuyy=vbuc1 + ldy #0 + // [195] phi uctoa_append::value#2 = uctoa_append::value#0 [phi:uctoa_append->uctoa_append::@1#1] -- register_copy + // uctoa_append::@1 + __b1: + // while (value >= sub) + // [196] if(uctoa_append::value#2>=uctoa_append::sub#0) goto uctoa_append::@2 -- vbuxx_ge_vbum1_then_la1 + cpx sub + bcs __b2 + // uctoa_append::@3 + // *buffer = DIGITS[digit] + // [197] *uctoa_append::buffer#0 = DIGITS[uctoa_append::digit#2] -- _deref_pbuz1=pbuc1_derefidx_vbuyy + lda DIGITS,y + ldy #0 + sta (buffer),y + // uctoa_append::@return + // } + // [198] return + rts + // uctoa_append::@2 + __b2: + // digit++; + // [199] uctoa_append::digit#1 = ++ uctoa_append::digit#2 -- vbuyy=_inc_vbuyy + iny + // value -= sub + // [200] uctoa_append::value#1 = uctoa_append::value#2 - uctoa_append::sub#0 -- vbuxx=vbuxx_minus_vbum1 + txa + sec + sbc sub + tax + // [195] phi from uctoa_append::@2 to uctoa_append::@1 [phi:uctoa_append::@2->uctoa_append::@1] + // [195] phi uctoa_append::digit#2 = uctoa_append::digit#1 [phi:uctoa_append::@2->uctoa_append::@1#0] -- register_copy + // [195] phi uctoa_append::value#2 = uctoa_append::value#1 [phi:uctoa_append::@2->uctoa_append::@1#1] -- register_copy + jmp __b1 + .segment Data + .label sub = uctoa.digit_value +} +.segment Code + // strlen +// 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 + // [202] phi from strlen to strlen::@1 [phi:strlen->strlen::@1] + // [202] phi strlen::len#2 = 0 [phi:strlen->strlen::@1#0] -- vwum1=vwuc1 + lda #<0 + sta len + sta len+1 + // [202] phi strlen::str#2 = printf_number_buffer::buffer_digits#0 [phi:strlen->strlen::@1#1] -- pbuz1=pbuc1 + lda #printf_number_buffer.buffer_digits + sta.z str+1 + // strlen::@1 + __b1: + // while(*str) + // [203] if(0!=*strlen::str#2) goto strlen::@2 -- 0_neq__deref_pbuz1_then_la1 + ldy #0 + lda (str),y + cmp #0 + bne __b2 + // strlen::@return + // } + // [204] return + rts + // strlen::@2 + __b2: + // len++; + // [205] strlen::len#1 = ++ strlen::len#2 -- vwum1=_inc_vwum1 + inc len + bne !+ + inc len+1 + !: + // str++; + // [206] strlen::str#0 = ++ strlen::str#2 -- pbuz1=_inc_pbuz1 + inc.z str + bne !+ + inc.z str+1 + !: + // [202] phi from strlen::@2 to strlen::@1 [phi:strlen::@2->strlen::@1] + // [202] phi strlen::len#2 = strlen::len#1 [phi:strlen::@2->strlen::@1#0] -- register_copy + // [202] phi strlen::str#2 = strlen::str#0 [phi:strlen::@2->strlen::@1#1] -- register_copy + jmp __b1 + .segment Data + len: .word 0 + .label return = len +} +.segment Code + // printf_padding +// Print a padding char a number of times +// void printf_padding(void (*putc)(char), char pad, __mem() char length) +printf_padding: { + .const pad = ' ' + // [208] phi from printf_padding to printf_padding::@1 [phi:printf_padding->printf_padding::@1] + // [208] phi printf_padding::i#2 = 0 [phi:printf_padding->printf_padding::@1#0] -- vbum1=vbuc1 + lda #0 + sta i + // printf_padding::@1 + __b1: + // for(char i=0;iprintf_padding::@1] + // [208] phi printf_padding::i#2 = printf_padding::i#1 [phi:printf_padding::@3->printf_padding::@1#0] -- register_copy + jmp __b1 + .segment Data + i: .byte 0 + length: .byte 0 +} + // File Data + // 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 + diff --git a/src/test/ref/cbm-keyboard.sym b/src/test/ref/cbm-keyboard.sym new file mode 100644 index 000000000..90eec2b0d --- /dev/null +++ b/src/test/ref/cbm-keyboard.sym @@ -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 ]