From 700397f67db3d800b77978344e244a902957b547 Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Tue, 19 Oct 2021 17:43:12 +0200 Subject: [PATCH] Added 1536 dots. --- .../kickc/test/TestProgramsFast.java | 5 + .../kc/examples/mega65/camelot-1536dots.c | 8 +- .../ref/examples/mega65/camelot-1536dots.asm | 1068 +++ .../ref/examples/mega65/camelot-1536dots.cfg | 354 + .../ref/examples/mega65/camelot-1536dots.log | 5925 +++++++++++++++++ .../ref/examples/mega65/camelot-1536dots.sym | 235 + 6 files changed, 7591 insertions(+), 4 deletions(-) create mode 100644 src/test/ref/examples/mega65/camelot-1536dots.asm create mode 100644 src/test/ref/examples/mega65/camelot-1536dots.cfg create mode 100644 src/test/ref/examples/mega65/camelot-1536dots.log create mode 100644 src/test/ref/examples/mega65/camelot-1536dots.sym diff --git a/src/test/java/dk/camelot64/kickc/test/TestProgramsFast.java b/src/test/java/dk/camelot64/kickc/test/TestProgramsFast.java index 8ba0c298d..22c87eec6 100644 --- a/src/test/java/dk/camelot64/kickc/test/TestProgramsFast.java +++ b/src/test/java/dk/camelot64/kickc/test/TestProgramsFast.java @@ -682,6 +682,11 @@ public class TestProgramsFast extends TestPrograms { compileAndCompare("examples/cx16/cx16-rasterbars.c"); } + @Test + public void testMega65Camelot1536Dots() throws IOException { + compileAndCompare("examples/mega65/camelot-1536dots.c"); + } + @Test public void testMega65BankedMusic() throws IOException { compileAndCompare("examples/mega65/banked-music.c"); diff --git a/src/test/kc/examples/mega65/camelot-1536dots.c b/src/test/kc/examples/mega65/camelot-1536dots.c index abf8e8253..14315b639 100644 --- a/src/test/kc/examples/mega65/camelot-1536dots.c +++ b/src/test/kc/examples/mega65/camelot-1536dots.c @@ -28,11 +28,11 @@ void lpoke(__zp unsigned long addr, char val) { } // Address of the screen -char * const SCREEN = 0xc800; +char * const SCREEN = (char*)0xc800; // // Absolute address of graphics buffer 1 -char * const GRAPHICS1 = 0xa000; +char * const GRAPHICS1 = (char*)0xa000; // // Absolute address of graphics buffer 2 -char * const GRAPHICS2 = 0x7000; +char * const GRAPHICS2 = (char*)0x7000; // SID tune at an absolute address __address(0x5000) char MUSIC[] = kickasm(resource "Thaw_5000.sid") {{ @@ -44,7 +44,7 @@ typedef void (*PROC_PTR)(void); // Pointer to the music init routine PROC_PTR const musicInit = (PROC_PTR) MUSIC; // Pointer to the music play routine -PROC_PTR const = (PROC_PTR) MUSIC+3; +PROC_PTR const musicPlay = (PROC_PTR) MUSIC+3; __align(0x40) char SPRITES[0xc0] = kickasm(resource "camelot-sprites.png") {{ diff --git a/src/test/ref/examples/mega65/camelot-1536dots.asm b/src/test/ref/examples/mega65/camelot-1536dots.asm new file mode 100644 index 000000000..7d8f36237 --- /dev/null +++ b/src/test/ref/examples/mega65/camelot-1536dots.asm @@ -0,0 +1,1068 @@ +// A pretty simple double sine plotter +.cpu _45gs02 + // MEGA65 platform PRG executable starting in MEGA65 mode. +.file [name="camelot-1536dots.prg", type="prg", segments="Program"] +.segmentdef Program [segments="Basic, Code, Data"] +.segmentdef Basic [start=$2001] +.segmentdef Code [start=$2017] +.segmentdef Data [startAfter="Code"] +.segment Basic +.byte $0a, $20, $0a, $00, $fe, $02, $20, $30, $00 // 10 BANK 0 +.byte $15, $20, $14, $00, $9e, $20 // 20 SYS +.text toIntString(__start) // NNNN +.byte $00, $00, $00 // + /// $47, $53: MEGA65 personality + .const VICIV_KEY_M65_A = $47 + .const VICIV_KEY_M65_B = $53 + /// 6 FAST Enable C65 FAST mode (3 .5MHz) + .const VICIV_FAST = $40 + /// $D054 VIC-IV Control register C + /// 0 CHR16 enable 16-bit character numbers (two screen bytes per character) + .const VICIV_CHR16 = 1 + /// 6 VIC-IV:VFAST C65GS FAST mode (48MHz) + .const VICIV_VFAST = $40 + /// $D06E.0-6 SPRPTRADR sprite pointer address (bits 22 - 16) + /// 7 SPRPTR16 16-bit sprite pointer mode (allows sprites to be located on any 64 byte boundary in chip RAM) + .const VICIV_SPRPTR16 = $80 + /// DMA command fill + .const DMA_COMMAND_FILL = 3 + /// Mask for PROCESSOR_PORT_DDR which allows only memory configuration to be written + .const PROCPORT_DDR_MEMORY_MASK = 7 + /// RAM in 0xA000, 0xE000 I/O in 0xD000 + .const PROCPORT_RAM_IO = 5 + /// The colors of the C64 + .const BLACK = 0 + .const WHITE = 1 + .const PURPLE = 4 + .const BLUE = 6 + .const DARK_GREY = $b + // Sine table + .const SINY1_SIZE = $2dd + .const SINY2_SIZE = $13d + .const SINX1_SIZE = $64d + .const SINX2_SIZE = $223 + .const SIZEOF_UNSIGNED_INT = 2 + .const OFFSET_STRUCT_F018_DMAGIC_EN018B = 3 + .const OFFSET_STRUCT_DMA_LIST_F018B_COUNT = 1 + .const OFFSET_STRUCT_DMA_LIST_F018B_SRC = 3 + .const OFFSET_STRUCT_DMA_LIST_F018B_DEST = 6 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRMB = 4 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRBANK = 2 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRMSB = 1 + .const OFFSET_STRUCT_MEGA65_VICIV_KEY = $2f + .const OFFSET_STRUCT_MEGA65_VICIV_CONTROLA = $30 + .const OFFSET_STRUCT_MEGA65_VICIV_CONTROLB = $31 + .const OFFSET_STRUCT_MEGA65_VICIV_CONTROLC = $54 + .const OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOLO = $6c + .const OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOHI = $6d + .const OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_HILO = $6e + .const OFFSET_STRUCT_MEGA65_VICIV_SPRITES_ENABLE = $15 + .const OFFSET_STRUCT_MEGA65_VICIV_SPRITES_PRIORITY = $1b + .const OFFSET_STRUCT_MEGA65_VICIV_RASTER = $12 + .const OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO = $68 + .const OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI = $69 + .const OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO = $6a + .const OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR = $20 + .const OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO = $58 + .const OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI = $59 + .const OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT = $5e + .const OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO = $60 + .const OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI = $61 + .const OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO = $62 + .const OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR = $21 + /// Sprite X position register for sprite #0 + .label SPRITES_XPOS = $d000 + /// Sprite Y position register for sprite #0 + .label SPRITES_YPOS = $d001 + /// Sprite X position MSB register + .label SPRITES_XMSB = $d010 + /// Sprite colors register for sprite #0 + .label SPRITES_COLOR = $d027 + /// Processor port data direction register + .label PROCPORT_DDR = 0 + /// Processor Port Register controlling RAM/ROM configuration and the datasette + .label PROCPORT = 1 + /// The VIC IV + .label VICIV = $d000 + /// DMAgic F018 Controller + .label DMA = $d700 + // Address of the screen + .label SCREEN = $c800 + // // Absolute address of graphics buffer 1 + .label GRAPHICS1 = $a000 + // // Absolute address of graphics buffer 2 + .label GRAPHICS2 = $7000 + // Pointer to the music init routine + .label musicInit = MUSIC + // Pointer to the music play routine + .label musicPlay = MUSIC+3 + // 0: show GRAPHICS1, render to GRAPHICS2 + // 1: show GRAPHICS2, render to GRAPHICS1 + .label buffer = $2a + // The graphics being rendered to + .label graphics_render = $16 + // Sine idx for each plot + .label sin_x1_idx = $21 + .label sin_x2_idx = $23 + .label sin_y1_idx = $25 + .label sin_y2_idx = $27 +.segment Code +__start: { + // volatile char buffer = 0 + ldz #0 + stz.z buffer + // char * volatile graphics_render = GRAPHICS1 + lda #GRAPHICS1 + sta.z graphics_render+1 + // volatile unsigned int sin_x1_idx + tza + sta.z sin_x1_idx + sta.z sin_x1_idx+1 + // volatile unsigned int sin_x2_idx + sta.z sin_x2_idx + sta.z sin_x2_idx+1 + // volatile unsigned int sin_y1_idx + sta.z sin_y1_idx + sta.z sin_y1_idx+1 + // volatile unsigned int sin_y2_idx + sta.z sin_y2_idx + sta.z sin_y2_idx+1 + jsr main + rts +} +main: { + .const toSpritePtr1_return = $ff&toSpritePtr1_sprite/$40 + .const toSpritePtr2_return = $ff&toSpritePtr2_sprite/$40 + .const toSpritePtr3_return = $ff&SPRITES/$40 + .label toSpritePtr1_sprite = SPRITES+$40 + .label toSpritePtr2_sprite = SPRITES+$80 + // asm + sei + // memoryRemap(0x00,0,0) + // Map memory to BANK 0 : 0x00XXXX - giving access to I/O + jsr memoryRemap + // *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK + // Disable Kernal & Basic + ldz #PROCPORT_DDR_MEMORY_MASK + stz PROCPORT_DDR + // *PROCPORT = PROCPORT_RAM_IO + ldz #PROCPORT_RAM_IO + stz PROCPORT + // VICIV->KEY = VICIV_KEY_M65_A + // Enable MEGA65 features + ldz #VICIV_KEY_M65_A + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY + // VICIV->KEY = VICIV_KEY_M65_B + ldz #VICIV_KEY_M65_B + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY + // VICIV->CONTROLA = 0 + // No C65 ROMs are mapped + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLA + // VICIV->CONTROLB |= VICIV_FAST + // Enable 48MHz fast mode + lda #VICIV_FAST + ora VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + // VICIV->CONTROLC |= VICIV_VFAST + lda #VICIV_VFAST + ora VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + // graphics_mode() + // Initialize graphics + jsr graphics_mode + // VICIV->SPRPTRADR_LOLO = LOBYTE + // Show sprites + ldz #SPRPTRADR_LOHI = HIBYTE + ldz #>SPRITE_PTRS + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOHI + // VICIV->SPRPTRADR_HILO = VICIV_SPRPTR16 + ldz #VICIV_SPRPTR16 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_HILO + // SPRITE_PTRS[0] = toSpritePtr(SPRITES+0x40) + lda #toSpritePtr1_return + sta SPRITE_PTRS+1 + // SPRITE_PTRS[1] = toSpritePtr(SPRITES+0x80) + lda #toSpritePtr2_return + sta SPRITE_PTRS+1*SIZEOF_UNSIGNED_INT+1 + // SPRITE_PTRS[2] = toSpritePtr(SPRITES+0x00) + lda #toSpritePtr3_return + sta SPRITE_PTRS+2*SIZEOF_UNSIGNED_INT+1 + // VICIV->SPRITES_ENABLE = 7 + ldz #7 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_ENABLE + // VICIV->SPRITES_PRIORITY = 0xff + ldz #$ff + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_PRIORITY + // SPRITES_COLOR[0] = DARK_GREY + ldz #DARK_GREY + stz SPRITES_COLOR + // SPRITES_COLOR[1] = DARK_GREY + stz SPRITES_COLOR+1 + // SPRITES_COLOR[2] = DARK_GREY + stz SPRITES_COLOR+2 + // SPRITES_YPOS[0] = 0xe3 + ldz #$e3 + stz SPRITES_YPOS + // SPRITES_YPOS[2] = 0xe3 + stz SPRITES_YPOS+2 + // SPRITES_YPOS[4] = 0xe3 + stz SPRITES_YPOS+4 + // SPRITES_XPOS[0] = 46 + ldz #$2e + stz SPRITES_XPOS + // SPRITES_XPOS[2] = 46+24 + ldz #$2e+$18 + stz SPRITES_XPOS+2 + // SPRITES_XPOS[4] = 25 + ldz #$19 + stz SPRITES_XPOS+4 + // *SPRITES_XMSB = 3 + ldz #3 + stz SPRITES_XMSB + // init_plot() + // Initialize plotter + jsr init_plot + // asm + // Initialize SID + lda #0 + // (*musicInit)() + jsr musicInit + // Wait for the raster + __b1: + // while(VICIV->RASTER!=0xe3) + ldz #$e3 + cpz VICIV+OFFSET_STRUCT_MEGA65_VICIV_RASTER + bne __b1 + // buffer ^=1 + // Switch buffer + lda #1 + eor.z buffer + sta.z buffer + // if(buffer==0) + // Select charset + beq __b4 + // VICIV->CHARPTR_LOLO = LOBYTE + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO + // VICIV->CHARPTR_LOHI = HIBYTE + ldz #>GRAPHICS2 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI + // VICIV->CHARPTR_HILO = 0 + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO + // graphics_render = GRAPHICS1 + lda #GRAPHICS1 + sta.z graphics_render+1 + __b5: + // VICIV->BORDER_COLOR = BLUE + ldz #BLUE + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR + // memset_dma(graphics_render, 0x00, 40*25*8) + lda.z graphics_render + sta.z memset_dma.dest + lda.z graphics_render+1 + sta.z memset_dma.dest+1 + // Clear the graphics + jsr memset_dma + // VICIV->BORDER_COLOR = PURPLE + ldz #PURPLE + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR + // render_dots() + // Render some dots + jsr render_dots + // VICIV->BORDER_COLOR = BLACK + ldz #BLACK + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR + // (*musicPlay)() + //Play SID + jsr musicPlay + jmp __b1 + __b4: + // VICIV->CHARPTR_LOLO = LOBYTE + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO + // VICIV->CHARPTR_LOHI = HIBYTE + ldz #>GRAPHICS1 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI + // VICIV->CHARPTR_HILO = 0 + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO + // graphics_render = GRAPHICS2 + lda #GRAPHICS2 + sta.z graphics_render+1 + jmp __b5 +} +// Remap some of the eight 8K memory blocks in the 64K address space of the 6502 to point somewhere else in the first 1MB memory space of the MEGA65. +// After the remapping the CPU will access the mapped memory whenever it uses instructions that access a remapped block. +// See section 2.3.4 in http://www.zimmers.net/cbmpics/cbm/c65/c65manual.txt for a description of the CPU memory remapper of the C65. +// remapBlocks: Indicates which 8K blocks of the 6502 address space to remap. Each bit represents one 8K block +// - bit 0 Memory block $0000-$1fff. Use constant MEMORYBLOCK_0000. +// - bit 1 Memory block $2000-$3fff. Use constant MEMORYBLOCK_2000. +// - bit 2 Memory block $4000-$5fff. Use constant MEMORYBLOCK_4000. +// - bit 3 Memory block $6000-$7fff. Use constant MEMORYBLOCK_6000. +// - bit 4 Memory block $8000-$9fff. Use constant MEMORYBLOCK_8000. +// - bit 5 Memory block $a000-$bfff. Use constant MEMORYBLOCK_A000. +// - bit 6 Memory block $c000-$dfff. Use constant MEMORYBLOCK_C000. +// - bit 7 Memory block $e000-$ffff. Use constant MEMORYBLOCK_E000. +// lowerPageOffset: Offset that will be added to any remapped blocks in the lower 32K of memory (block 0-3). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 0 ($0000-$1fff) is remapped it will point to lowerPageOffset*$100. +// - If block 1 ($2000-$3fff) is remapped it will point to lowerPageOffset*$100 + $2000. +// - If block 2 ($4000-$5fff) is remapped it will point to lowerPageOffset*$100 + $4000. +// - If block 3 ($6000-$7fff) is remapped it will point to lowerPageOffset*$100 + $6000. +// upperPageOffset: Offset that will be added to any remapped blocks in the upper 32K of memory (block 4-7). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 4 ($8000-$9fff) is remapped it will point to upperPageOffset*$100 + $8000 +// - If block 5 ($a000-$bfff) is remapped it will point to upperPageOffset*$100 + $a000. +// - If block 6 ($c000-$dfff) is remapped it will point to upperPageOffset*$100 + $c000. +// - If block 7 ($e000-$ffff) is remapped it will point to upperPageOffset*$100 + $e000. +// void memoryRemap(char remapBlocks, unsigned int lowerPageOffset, unsigned int upperPageOffset) +memoryRemap: { + .label aVal = $2d + .label xVal = $2c + .label yVal = $2b + .label zVal = $29 + // char aVal = BYTE0(lowerPageOffset) + // lower blocks offset page low + ldz #0 + stz.z aVal + // char xVal = (remapBlocks << 4) | (BYTE1(lowerPageOffset) & 0xf) + // lower blocks to map + lower blocks offset high nibble + stz.z xVal + // char yVal = BYTE0(upperPageOffset) + // upper blocks offset page + stz.z yVal + // char zVal = (remapBlocks & 0xf0) | (BYTE1(upperPageOffset) & 0xf) + // upper blocks to map + upper blocks offset page high nibble + stz.z zVal + // asm + lda aVal + ldx xVal + ldy yVal + map + eom + // } + rts +} +graphics_mode: { + .label ch_x = $a + // Layout screen so that graphics data comes from $40000 -- $4FFFF + // Each column is consequtive values + .label screen = 6 + .label ch = 4 + // Set color ram to white + .label cols = $18 + .label i = $10 + // VICIV->CONTROLC = VICIV_CHR16|VICIV_VFAST + // 16-bit text mode + ldz #VICIV_CHR16|VICIV_VFAST + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + // VICIV->CONTROLB = VICIV_FAST + // H320, fast CPU + ldz #VICIV_FAST + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + // VICIV->CHARSTEP_LO = 80 + // 320x200 per char, 16 pixels wide per char + // = 320/8 x 16 bits = 80 bytes per row + ldz #$50 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO + // VICIV->CHARSTEP_HI = 0 + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI + // VICIV->CHRCOUNT = 40 + // Draw 40 chars per row + ldz #$28 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT + // VICIV->SCRNPTR_LOLO = LOBYTE + // Select 2KB screen + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO + // VICIV->SCRNPTR_LOHI = HIBYTE + ldz #>SCREEN + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI + // VICIV->SCRNPTR_HILO = 0x00 + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO + // VICIV->CHARPTR_LOLO = LOBYTE + // Select charset + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO + // VICIV->CHARPTR_LOHI = HIBYTE + ldz #>GRAPHICS1 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI + // VICIV->CHARPTR_HILO = 0 + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO + lda #SCREEN + sta.z screen+1 + tza + sta.z ch + sta.z ch+1 + tax + __b1: + // for(char y=0;y<25;y++) + cpx #$19 + bcs !__b2+ + jmp __b2 + !__b2: + lda #<$ff80000 + sta.z cols + lda #>$ff80000 + sta.z cols+1 + lda #<$ff80000>>$10 + sta.z cols+2 + lda #>$ff80000>>$10 + sta.z cols+3 + lda #<0 + sta.z i + sta.z i+1 + __b6: + // for( unsigned int i=0; i<1000;i++) + lda.z i+1 + cmp #>$3e8 + bcc __b7 + bne !+ + lda.z i + cmp #<$3e8 + bcc __b7 + !: + // VICIV->BORDER_COLOR = 0 + // Black border and background + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR + // VICIV->BG_COLOR = 0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR + // memset_dma(GRAPHICS1, 0x00, 40*25*8) + // Clear the graphics + lda #GRAPHICS1 + sta.z memset_dma.dest+1 + jsr memset_dma + // memset_dma(GRAPHICS2, 0x00, 40*25*8) + lda #GRAPHICS2 + sta.z memset_dma.dest+1 + jsr memset_dma + // } + rts + __b7: + // lpoke(cols++, 0) + ldq.z cols + stq.z lpoke.addr + ldz #0 + stz.z lpoke.val + jsr lpoke + // lpoke(cols++, 0); + inc.z cols + bne !+ + inc.z cols+1 + bne !+ + inc.z cols+2 + bne !+ + inc.z cols+3 + !: + // lpoke(cols++, WHITE) + ldq.z cols + stq.z lpoke.addr + ldz #WHITE + stz.z lpoke.val + // No extended attributes + jsr lpoke + // lpoke(cols++, WHITE); + inc.z cols + bne !+ + inc.z cols+1 + bne !+ + inc.z cols+2 + bne !+ + inc.z cols+3 + !: + // for( unsigned int i=0; i<1000;i++) + inw.z i + jmp __b6 + __b2: + lda.z ch + sta.z ch_x + lda.z ch+1 + sta.z ch_x+1 + ldz #0 + __b3: + // for(char x=0;x<40;x++) + cpz #$28 + bcc __b4 + // screen += 40 + lda #$28*SIZEOF_UNSIGNED_INT + clc + adc.z screen + sta.z screen + bcc !+ + inc.z screen+1 + !: + // ch++; + inw.z ch + // for(char y=0;y<25;y++) + inx + jmp __b1 + __b4: + // screen[x] = ch_x + tza + asl + tay + lda.z ch_x + sta (screen),y + iny + lda.z ch_x+1 + sta (screen),y + // ch_x += 25 + lda #$19 + clc + adc.z ch_x + sta.z ch_x + bcc !+ + inc.z ch_x+1 + !: + // for(char x=0;x<40;x++) + inz + jmp __b3 +} +init_plot: { + .label __4 = 8 + .label i = 4 + .label gfx = 6 + .label __5 = 8 + lda #<0 + sta.z gfx + sta.z gfx+1 + sta.z i + sta.z i+1 + __b1: + // for(unsigned int i=0; i<320;i++) + lda.z i+1 + cmp #>$140 + bcc __b2 + bne !+ + lda.z i + cmp #<$140 + bcc __b2 + !: + // } + rts + __b2: + // GFX_OFFSET[i] = gfx + lda.z i + asl + sta.z __4 + lda.z i+1 + rol + sta.z __4+1 + lda.z __5 + clc + adc #GFX_OFFSET + sta.z __5+1 + ldy #0 + lda.z gfx + sta (__5),y + iny + lda.z gfx+1 + sta (__5),y + // i&7 + lda #7 + and.z i + // if((i&7)==7) + cmp #7 + bne __b3 + // gfx +=200 + lda #$c8 + clc + adc.z gfx + sta.z gfx + bcc !+ + inc.z gfx+1 + !: + __b3: + // for(unsigned int i=0; i<320;i++) + inw.z i + jmp __b1 +} +// Fill a memory block within the first 64K memory space using MEGA65 DMagic DMA +// Fills the values of num bytes at the destination with a single byte value. +// - dest The destination address (within the MB and bank) +// - fill The char to fill with +// - num The number of bytes to copy +// void memset_dma(__zp($c) void *dest, char fill, unsigned int num) +memset_dma: { + .label dest = $c + // char dmaMode = DMA->EN018B + // Remember current F018 A/B mode + ldx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // memset_dma_command.count = num + // Set up command + lda #<$28*$19*8 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT + lda #>$28*$19*8 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT+1 + // memset_dma_command.src = (char*)fill + lda #<0 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC+1 + // memset_dma_command.dest = dest + lda.z dest + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST + lda.z dest+1 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST+1 + // DMA->EN018B = 1 + // Set F018B mode + ldz #1 + stz DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // DMA->ADDRMB = 0 + // Set address of DMA list + ldz #0 + stz DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB + // DMA->ADDRBANK = 0 + stz DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK + // DMA-> ADDRMSB = BYTE1(&memset_dma_command) + ldz #>memset_dma_command + stz DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB + // DMA-> ADDRLSBTRIG = BYTE0(&memset_dma_command) + // Trigger the DMA (without option lists) + ldz #EN018B = dmaMode + // Re-enable F018A mode + stx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // } + rts +} +render_dots: { + .label __20 = 6 + .label __21 = $e + .label idx_x1 = $a + .label idx_x2 = $c + .label idx_y1 = 8 + .label idx_y2 = 4 + .label i = $10 + .label __22 = 6 + .label __23 = $e + .label __24 = $14 + .label __25 = $12 + // unsigned int idx_x1 = sin_x1_idx + // Plot some dots + lda.z sin_x1_idx + sta.z idx_x1 + lda.z sin_x1_idx+1 + sta.z idx_x1+1 + // sin_x1_idx += 1 + inw.z sin_x1_idx + // if(sin_x1_idx>SINX1_SIZE) + lda.z sin_x1_idx+1 + cmp #>SINX1_SIZE + bne !+ + lda.z sin_x1_idx + cmp #SINX1_SIZE + sta.z sin_x1_idx+1 + __b1: + // unsigned int idx_x2 = sin_x2_idx + lda.z sin_x2_idx + sta.z idx_x2 + lda.z sin_x2_idx+1 + sta.z idx_x2+1 + // sin_x2_idx -= 1 + lda.z sin_x2_idx + sec + sbc #1 + sta.z sin_x2_idx + lda.z sin_x2_idx+1 + sbc #0 + sta.z sin_x2_idx+1 + // if(sin_x2_idx>SINX2_SIZE) + cmp #>SINX2_SIZE + bne !+ + lda.z sin_x2_idx + cmp #SINX2_SIZE + sta.z sin_x2_idx+1 + __b2: + // unsigned int idx_y1 = sin_y1_idx + lda.z sin_y1_idx + sta.z idx_y1 + lda.z sin_y1_idx+1 + sta.z idx_y1+1 + // sin_y1_idx -= 1 + lda.z sin_y1_idx + sec + sbc #1 + sta.z sin_y1_idx + lda.z sin_y1_idx+1 + sbc #0 + sta.z sin_y1_idx+1 + // if(sin_y1_idx>SINY1_SIZE) + cmp #>SINY1_SIZE + bne !+ + lda.z sin_y1_idx + cmp #SINY1_SIZE + sta.z sin_y1_idx+1 + __b3: + // unsigned int idx_y2 = sin_y2_idx + lda.z sin_y2_idx + sta.z idx_y2 + lda.z sin_y2_idx+1 + sta.z idx_y2+1 + // sin_y2_idx += 1 + inw.z sin_y2_idx + // if(sin_y2_idx>SINY2_SIZE) + lda.z sin_y2_idx+1 + cmp #>SINY2_SIZE + bne !+ + lda.z sin_y2_idx + cmp #SINY2_SIZE + sta.z sin_y2_idx+1 + __b4: + lda #<0 + sta.z i + sta.z i+1 + __b8: + // for(unsigned int i=0;i<1536;i++) + lda.z i+1 + cmp #>$600 + bcc __b9 + bne !+ + lda.z i + cmp #<$600 + bcc __b9 + !: + // } + rts + __b9: + // SINX1[idx_x1]+SINX2[idx_x2] + lda.z idx_x1 + asl + sta.z __20 + lda.z idx_x1+1 + rol + sta.z __20+1 + lda.z idx_x2 + asl + sta.z __21 + lda.z idx_x2+1 + rol + sta.z __21+1 + // plot(SINX1[idx_x1]+SINX2[idx_x2], SINY1[idx_y1]+SINY2[idx_y2]) + lda.z __22 + clc + adc #SINX1 + sta.z __22+1 + lda.z __23 + clc + adc #SINX2 + sta.z __23+1 + ldy #0 + clc + lda (plot.x),y + adc (__23),y + pha + iny + lda (plot.x),y + adc (__23),y + sta.z plot.x+1 + pla + sta.z plot.x + lda.z idx_y1 + clc + adc #SINY1 + sta.z __24+1 + lda.z idx_y2 + clc + adc #SINY2 + sta.z __25+1 + ldy #0 + lda (__24),y + clc + adc (__25),y + taz + jsr plot + // idx_x1 -= 11 + sec + lda.z idx_x1 + sbc #$b + sta.z idx_x1 + lda.z idx_x1+1 + sbc #0 + sta.z idx_x1+1 + // if(idx_x1>SINX1_SIZE) + cmp #>SINX1_SIZE + bne !+ + lda.z idx_x1 + cmp #SINX1_SIZE + sta.z idx_x1+1 + __b10: + // idx_x2 += 3 + lda #3 + clc + adc.z idx_x2 + sta.z idx_x2 + bcc !+ + inc.z idx_x2+1 + !: + // if(idx_x2>SINX2_SIZE) + lda.z idx_x2+1 + cmp #>SINX2_SIZE + bne !+ + lda.z idx_x2 + cmp #SINX2_SIZE + sta.z idx_x2+1 + __b11: + // idx_y1 += 9 + lda #9 + clc + adc.z idx_y1 + sta.z idx_y1 + bcc !+ + inc.z idx_y1+1 + !: + // if(idx_y1>SINY1_SIZE) + lda.z idx_y1+1 + cmp #>SINY1_SIZE + bne !+ + lda.z idx_y1 + cmp #SINY1_SIZE + sta.z idx_y1+1 + __b12: + // idx_y2 -= 5 + sec + lda.z idx_y2 + sbc #5 + sta.z idx_y2 + lda.z idx_y2+1 + sbc #0 + sta.z idx_y2+1 + // if(idx_y2>SINY2_SIZE) + cmp #>SINY2_SIZE + bne !+ + lda.z idx_y2 + cmp #SINY2_SIZE + sta.z idx_y2+1 + __b13: + // for(unsigned int i=0;i<1536;i++) + inw.z i + jmp __b8 +} +// Get the low byte from a word/int +// Get the high byte from a word/int +// Poke a byte value into memory +// Peek a byte value from memory +// Poke a value directly into memory +// - addr: The 32bit address to poke to +// - val: The value to poke +// void lpoke(__zp($1d) volatile unsigned long addr, __zp($1c) volatile char val) +lpoke: { + .label addr = $1d + .label val = $1c + // asm + // Use the 45GS02 32-bit addressing mode + ldz #0 + lda val + sta ((addr)),z + // } + rts +} +// Do a single plot on the canvas +// void plot(__zp(6) unsigned int x, __register(Z) char y) +plot: { + .label __0 = 2 + .label __3 = 2 + .label x = 6 + .label __4 = 2 + // graphics_render + GFX_OFFSET[x] + lda.z x + asl + sta.z __3 + lda.z x+1 + rol + sta.z __3+1 + lda.z __4 + clc + adc #GFX_OFFSET + sta.z __4+1 + ldy #0 + clc + lda (__0),y + adc.z graphics_render + pha + iny + lda (__0),y + adc.z graphics_render+1 + sta.z __0+1 + pla + sta.z __0 + // x&7 + lda #7 + and.z x + // *gfx |= GFX_BIT[x&7] + tax + tza + tay + lda (__0),y + ora GFX_BIT,x + sta (__0),y + // } + rts +} +.segment Data + .align $40 +SPRITES: +.var pic = LoadPicture("camelot-sprites.png", List().add($000000, $ffffff)) + .for (var s=0; s<3; s++) { + .for (var y=0; y<21; y++) { + .for (var x=0;x<3; x++) { + .byte pic.getSinglecolorByte(s*3+x,y) + } + } + .byte 0 + } + + // The sprite pointers + SPRITE_PTRS: .fill 2*8, 0 + // Graphics bit + GFX_BIT: .byte $80, $40, $20, $10, 8, 4, 2, 1 + // Offset to graphics for (x, 0) + GFX_OFFSET: .fill 2*$140, 0 +SINY1: +.fill 733+256, round(66.5+66.5*sin(toRadians(360*i/733))) + +SINY2: +.fill 317+256, round(33+33*sin(toRadians(360*i/317))) + +SINX1: +.fillword 1613+256, round(98+98*sin(toRadians(360*i/1613))) + +SINX2: +.fillword 547+256, round(60+60*sin(toRadians(360*i/547))) + + // DMA list entry for filling data + memset_dma_command: .byte DMA_COMMAND_FILL + .word 0, 0 + .byte 0 + .word 0 + .byte 0, 0 + .word 0 +.pc = $5000 "MUSIC" +// SID tune at an absolute address +MUSIC: +.const music = LoadSid("Thaw_5000.sid") + .fill music.size, music.getData(i) + diff --git a/src/test/ref/examples/mega65/camelot-1536dots.cfg b/src/test/ref/examples/mega65/camelot-1536dots.cfg new file mode 100644 index 000000000..ea6275099 --- /dev/null +++ b/src/test/ref/examples/mega65/camelot-1536dots.cfg @@ -0,0 +1,354 @@ + +void __start() +__start: scope:[__start] from + [0] phi() + to:__start::__init1 +__start::__init1: scope:[__start] from __start + [1] buffer = 0 + [2] graphics_render = GRAPHICS1 + [3] sin_x1_idx = 0 + [4] sin_x2_idx = 0 + [5] sin_y1_idx = 0 + [6] sin_y2_idx = 0 + to:__start::@1 +__start::@1: scope:[__start] from __start::__init1 + [7] phi() + [8] call main + to:__start::@return +__start::@return: scope:[__start] from __start::@1 + [9] return + to:@return + +void main() +main: scope:[main] from __start::@1 + [10] phi() + to:main::SEI1 +main::SEI1: scope:[main] from main + asm { sei } + to:main::@6 +main::@6: scope:[main] from main::SEI1 + [12] phi() + [13] call memoryRemap + to:main::@10 +main::@10: scope:[main] from main::@6 + [14] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK + [15] *PROCPORT = PROCPORT_RAM_IO + [16] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = VICIV_KEY_M65_A + [17] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = VICIV_KEY_M65_B + [18] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLA) = 0 + [19] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) | VICIV_FAST + [20] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) | VICIV_VFAST + [21] call graphics_mode + to:main::@11 +main::@11: scope:[main] from main::@10 + [22] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOLO) = byte0 SPRITE_PTRS + [23] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOHI) = byte1 SPRITE_PTRS + [24] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_HILO) = VICIV_SPRPTR16 + to:main::toSpritePtr1 +main::toSpritePtr1: scope:[main] from main::@11 + [25] phi() + to:main::@7 +main::@7: scope:[main] from main::toSpritePtr1 + [26] *SPRITE_PTRS = main::toSpritePtr1_return#0 + to:main::toSpritePtr2 +main::toSpritePtr2: scope:[main] from main::@7 + [27] phi() + to:main::@8 +main::@8: scope:[main] from main::toSpritePtr2 + [28] *(SPRITE_PTRS+1*SIZEOF_UNSIGNED_INT) = main::toSpritePtr2_return#0 + to:main::toSpritePtr3 +main::toSpritePtr3: scope:[main] from main::@8 + [29] phi() + to:main::@9 +main::@9: scope:[main] from main::toSpritePtr3 + [30] *(SPRITE_PTRS+2*SIZEOF_UNSIGNED_INT) = main::toSpritePtr3_return#0 + [31] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_ENABLE) = 7 + [32] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_PRIORITY) = $ff + [33] *SPRITES_COLOR = DARK_GREY + [34] *(SPRITES_COLOR+1) = DARK_GREY + [35] *(SPRITES_COLOR+2) = DARK_GREY + [36] *SPRITES_YPOS = $e3 + [37] *(SPRITES_YPOS+2) = $e3 + [38] *(SPRITES_YPOS+4) = $e3 + [39] *SPRITES_XPOS = $2e + [40] *(SPRITES_XPOS+2) = $2e+$18 + [41] *(SPRITES_XPOS+4) = $19 + [42] *SPRITES_XMSB = 3 + [43] call init_plot + to:main::@12 +main::@12: scope:[main] from main::@9 + asm { lda#0 } + [45] callexecute *musicInit + to:main::@1 +main::@1: scope:[main] from main::@1 main::@12 main::@14 + [46] if(*((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_RASTER)!=$e3) goto main::@1 + to:main::@2 +main::@2: scope:[main] from main::@1 + [47] buffer = buffer ^ 1 + [48] if(buffer==0) goto main::@4 + to:main::@3 +main::@3: scope:[main] from main::@2 + [49] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 + [50] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS2 + [51] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 + [52] graphics_render = GRAPHICS1 + to:main::@5 +main::@5: scope:[main] from main::@3 main::@4 + [53] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = BLUE + [54] memset_dma::dest#0 = (void *)graphics_render + [55] call memset_dma + to:main::@13 +main::@13: scope:[main] from main::@5 + [56] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = PURPLE + [57] call render_dots + to:main::@14 +main::@14: scope:[main] from main::@13 + [58] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = BLACK + [59] callexecute *musicPlay + to:main::@1 +main::@4: scope:[main] from main::@2 + [60] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 + [61] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS1 + [62] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 + [63] graphics_render = GRAPHICS2 + to:main::@5 + +void memoryRemap(char remapBlocks , unsigned int lowerPageOffset , unsigned int upperPageOffset) +memoryRemap: scope:[memoryRemap] from main::@6 + [64] memoryRemap::aVal = 0 + [65] memoryRemap::xVal = 0 + [66] memoryRemap::yVal = 0 + [67] memoryRemap::zVal = 0 + asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } + to:memoryRemap::@return +memoryRemap::@return: scope:[memoryRemap] from memoryRemap + [69] return + to:@return + +void graphics_mode() +graphics_mode: scope:[graphics_mode] from main::@10 + [70] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = VICIV_CHR16|VICIV_VFAST + [71] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = VICIV_FAST + [72] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO) = $50 + [73] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI) = 0 + [74] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT) = $28 + [75] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO) = 0 + [76] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI) = byte1 SCREEN + [77] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO) = 0 + [78] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 + [79] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS1 + [80] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 + to:graphics_mode::@1 +graphics_mode::@1: scope:[graphics_mode] from graphics_mode graphics_mode::@5 + [81] graphics_mode::screen#5 = phi( graphics_mode/(unsigned int *)SCREEN, graphics_mode::@5/graphics_mode::screen#1 ) + [81] graphics_mode::ch#2 = phi( graphics_mode/0, graphics_mode::@5/graphics_mode::ch#1 ) + [81] graphics_mode::y#2 = phi( graphics_mode/0, graphics_mode::@5/graphics_mode::y#1 ) + [82] if(graphics_mode::y#2<$19) goto graphics_mode::@2 + to:graphics_mode::@6 +graphics_mode::@6: scope:[graphics_mode] from graphics_mode::@1 graphics_mode::@10 + [83] graphics_mode::cols#3 = phi( graphics_mode::@10/graphics_mode::cols#2, graphics_mode::@1/$ff80000 ) + [83] graphics_mode::i#2 = phi( graphics_mode::@10/graphics_mode::i#1, graphics_mode::@1/0 ) + [84] if(graphics_mode::i#2<$3e8) goto graphics_mode::@7 + to:graphics_mode::@8 +graphics_mode::@8: scope:[graphics_mode] from graphics_mode::@6 + [85] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = 0 + [86] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR) = 0 + [87] call memset_dma + to:graphics_mode::@11 +graphics_mode::@11: scope:[graphics_mode] from graphics_mode::@8 + [88] phi() + [89] call memset_dma + to:graphics_mode::@return +graphics_mode::@return: scope:[graphics_mode] from graphics_mode::@11 + [90] return + to:@return +graphics_mode::@7: scope:[graphics_mode] from graphics_mode::@6 + [91] lpoke::addr = graphics_mode::cols#3 + [92] lpoke::val = 0 + [93] call lpoke + to:graphics_mode::@9 +graphics_mode::@9: scope:[graphics_mode] from graphics_mode::@7 + [94] graphics_mode::cols#1 = ++ graphics_mode::cols#3 + [95] lpoke::addr = graphics_mode::cols#1 + [96] lpoke::val = WHITE + [97] call lpoke + to:graphics_mode::@10 +graphics_mode::@10: scope:[graphics_mode] from graphics_mode::@9 + [98] graphics_mode::cols#2 = ++ graphics_mode::cols#1 + [99] graphics_mode::i#1 = ++ graphics_mode::i#2 + to:graphics_mode::@6 +graphics_mode::@2: scope:[graphics_mode] from graphics_mode::@1 + [100] graphics_mode::ch_x#4 = graphics_mode::ch#2 + to:graphics_mode::@3 +graphics_mode::@3: scope:[graphics_mode] from graphics_mode::@2 graphics_mode::@4 + [101] graphics_mode::ch_x#2 = phi( graphics_mode::@2/graphics_mode::ch_x#4, graphics_mode::@4/graphics_mode::ch_x#1 ) + [101] graphics_mode::x#2 = phi( graphics_mode::@2/0, graphics_mode::@4/graphics_mode::x#1 ) + [102] if(graphics_mode::x#2<$28) goto graphics_mode::@4 + to:graphics_mode::@5 +graphics_mode::@5: scope:[graphics_mode] from graphics_mode::@3 + [103] graphics_mode::screen#1 = graphics_mode::screen#5 + $28*SIZEOF_UNSIGNED_INT + [104] graphics_mode::ch#1 = ++ graphics_mode::ch#2 + [105] graphics_mode::y#1 = ++ graphics_mode::y#2 + to:graphics_mode::@1 +graphics_mode::@4: scope:[graphics_mode] from graphics_mode::@3 + [106] graphics_mode::$8 = graphics_mode::x#2 << 1 + [107] graphics_mode::screen#5[graphics_mode::$8] = graphics_mode::ch_x#2 + [108] graphics_mode::ch_x#1 = graphics_mode::ch_x#2 + $19 + [109] graphics_mode::x#1 = ++ graphics_mode::x#2 + to:graphics_mode::@3 + +void init_plot() +init_plot: scope:[init_plot] from main::@9 + [110] phi() + to:init_plot::@1 +init_plot::@1: scope:[init_plot] from init_plot init_plot::@3 + [111] init_plot::gfx#2 = phi( init_plot/0, init_plot::@3/init_plot::gfx#5 ) + [111] init_plot::i#2 = phi( init_plot/0, init_plot::@3/init_plot::i#1 ) + [112] if(init_plot::i#2<$140) goto init_plot::@2 + to:init_plot::@return +init_plot::@return: scope:[init_plot] from init_plot::@1 + [113] return + to:@return +init_plot::@2: scope:[init_plot] from init_plot::@1 + [114] init_plot::$4 = init_plot::i#2 << 1 + [115] init_plot::$5 = GFX_OFFSET + init_plot::$4 + [116] *init_plot::$5 = init_plot::gfx#2 + [117] init_plot::$1 = init_plot::i#2 & 7 + [118] if(init_plot::$1!=7) goto init_plot::@3 + to:init_plot::@4 +init_plot::@4: scope:[init_plot] from init_plot::@2 + [119] init_plot::gfx#1 = init_plot::gfx#2 + $c8 + to:init_plot::@3 +init_plot::@3: scope:[init_plot] from init_plot::@2 init_plot::@4 + [120] init_plot::gfx#5 = phi( init_plot::@2/init_plot::gfx#2, init_plot::@4/init_plot::gfx#1 ) + [121] init_plot::i#1 = ++ init_plot::i#2 + to:init_plot::@1 + +void memset_dma(void *dest , char fill , unsigned int num) +memset_dma: scope:[memset_dma] from graphics_mode::@11 graphics_mode::@8 main::@5 + [122] memset_dma::dest#3 = phi( graphics_mode::@11/(void *)GRAPHICS2, graphics_mode::@8/(void *)GRAPHICS1, main::@5/memset_dma::dest#0 ) + [123] memset_dma::dmaMode#0 = *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) + [124] *((unsigned int *)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = (unsigned int)$28*$19*8 + [125] *((char **)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (char *)0 + [126] *((char **)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (char *)memset_dma::dest#3 + [127] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 + [128] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 + [129] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 + [130] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = byte1 &memset_dma_command + [131] *((char *)DMA) = byte0 &memset_dma_command + [132] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = memset_dma::dmaMode#0 + to:memset_dma::@return +memset_dma::@return: scope:[memset_dma] from memset_dma + [133] return + to:@return + +void render_dots() +render_dots: scope:[render_dots] from main::@13 + [134] render_dots::idx_x1#0 = sin_x1_idx + [135] sin_x1_idx = sin_x1_idx + 1 + [136] if(sin_x1_idx<=SINX1_SIZE) goto render_dots::@1 + to:render_dots::@4 +render_dots::@4: scope:[render_dots] from render_dots + [137] sin_x1_idx = sin_x1_idx - SINX1_SIZE + to:render_dots::@1 +render_dots::@1: scope:[render_dots] from render_dots render_dots::@4 + [138] render_dots::idx_x2#0 = sin_x2_idx + [139] sin_x2_idx = sin_x2_idx - 1 + [140] if(sin_x2_idx<=SINX2_SIZE) goto render_dots::@2 + to:render_dots::@5 +render_dots::@5: scope:[render_dots] from render_dots::@1 + [141] sin_x2_idx = sin_x2_idx + SINX2_SIZE + to:render_dots::@2 +render_dots::@2: scope:[render_dots] from render_dots::@1 render_dots::@5 + [142] render_dots::idx_y1#0 = sin_y1_idx + [143] sin_y1_idx = sin_y1_idx - 1 + [144] if(sin_y1_idx<=SINY1_SIZE) goto render_dots::@3 + to:render_dots::@6 +render_dots::@6: scope:[render_dots] from render_dots::@2 + [145] sin_y1_idx = sin_y1_idx + SINY1_SIZE + to:render_dots::@3 +render_dots::@3: scope:[render_dots] from render_dots::@2 render_dots::@6 + [146] render_dots::idx_y2#0 = sin_y2_idx + [147] sin_y2_idx = sin_y2_idx + 1 + [148] if(sin_y2_idx<=SINY2_SIZE) goto render_dots::@8 + to:render_dots::@7 +render_dots::@7: scope:[render_dots] from render_dots::@3 + [149] sin_y2_idx = sin_y2_idx - SINY2_SIZE + to:render_dots::@8 +render_dots::@8: scope:[render_dots] from render_dots::@13 render_dots::@3 render_dots::@7 + [150] render_dots::idx_y2#11 = phi( render_dots::@13/render_dots::idx_y2#9, render_dots::@3/render_dots::idx_y2#0, render_dots::@7/render_dots::idx_y2#0 ) + [150] render_dots::idx_y1#11 = phi( render_dots::@13/render_dots::idx_y1#15, render_dots::@3/render_dots::idx_y1#0, render_dots::@7/render_dots::idx_y1#0 ) + [150] render_dots::idx_x2#3 = phi( render_dots::@13/render_dots::idx_x2#13, render_dots::@3/render_dots::idx_x2#0, render_dots::@7/render_dots::idx_x2#0 ) + [150] render_dots::idx_x1#3 = phi( render_dots::@13/render_dots::idx_x1#11, render_dots::@3/render_dots::idx_x1#0, render_dots::@7/render_dots::idx_x1#0 ) + [150] render_dots::i#10 = phi( render_dots::@13/render_dots::i#1, render_dots::@3/0, render_dots::@7/0 ) + [151] if(render_dots::i#10<$600) goto render_dots::@9 + to:render_dots::@return +render_dots::@return: scope:[render_dots] from render_dots::@8 + [152] return + to:@return +render_dots::@9: scope:[render_dots] from render_dots::@8 + [153] render_dots::$20 = render_dots::idx_x1#3 << 1 + [154] render_dots::$21 = render_dots::idx_x2#3 << 1 + [155] render_dots::$22 = SINX1 + render_dots::$20 + [156] render_dots::$23 = SINX2 + render_dots::$21 + [157] plot::x#0 = *render_dots::$22 + *render_dots::$23 + [158] render_dots::$24 = SINY1 + render_dots::idx_y1#11 + [159] render_dots::$25 = SINY2 + render_dots::idx_y2#11 + [160] plot::y#0 = *render_dots::$24 + *render_dots::$25 + [161] call plot + to:render_dots::@18 +render_dots::@18: scope:[render_dots] from render_dots::@9 + [162] render_dots::idx_x1#1 = render_dots::idx_x1#3 - $b + [163] if(render_dots::idx_x1#1<=SINX1_SIZE) goto render_dots::@10 + to:render_dots::@14 +render_dots::@14: scope:[render_dots] from render_dots::@18 + [164] render_dots::idx_x1#2 = render_dots::idx_x1#1 + SINX1_SIZE + to:render_dots::@10 +render_dots::@10: scope:[render_dots] from render_dots::@14 render_dots::@18 + [165] render_dots::idx_x1#11 = phi( render_dots::@14/render_dots::idx_x1#2, render_dots::@18/render_dots::idx_x1#1 ) + [166] render_dots::idx_x2#1 = render_dots::idx_x2#3 + 3 + [167] if(render_dots::idx_x2#1<=SINX2_SIZE) goto render_dots::@11 + to:render_dots::@15 +render_dots::@15: scope:[render_dots] from render_dots::@10 + [168] render_dots::idx_x2#2 = render_dots::idx_x2#1 - SINX2_SIZE + to:render_dots::@11 +render_dots::@11: scope:[render_dots] from render_dots::@10 render_dots::@15 + [169] render_dots::idx_x2#13 = phi( render_dots::@10/render_dots::idx_x2#1, render_dots::@15/render_dots::idx_x2#2 ) + [170] render_dots::idx_y1#1 = render_dots::idx_y1#11 + 9 + [171] if(render_dots::idx_y1#1<=SINY1_SIZE) goto render_dots::@12 + to:render_dots::@16 +render_dots::@16: scope:[render_dots] from render_dots::@11 + [172] render_dots::idx_y1#2 = render_dots::idx_y1#1 - SINY1_SIZE + to:render_dots::@12 +render_dots::@12: scope:[render_dots] from render_dots::@11 render_dots::@16 + [173] render_dots::idx_y1#15 = phi( render_dots::@11/render_dots::idx_y1#1, render_dots::@16/render_dots::idx_y1#2 ) + [174] render_dots::idx_y2#1 = render_dots::idx_y2#11 - 5 + [175] if(render_dots::idx_y2#1<=SINY2_SIZE) goto render_dots::@13 + to:render_dots::@17 +render_dots::@17: scope:[render_dots] from render_dots::@12 + [176] render_dots::idx_y2#2 = render_dots::idx_y2#1 + SINY2_SIZE + to:render_dots::@13 +render_dots::@13: scope:[render_dots] from render_dots::@12 render_dots::@17 + [177] render_dots::idx_y2#9 = phi( render_dots::@12/render_dots::idx_y2#1, render_dots::@17/render_dots::idx_y2#2 ) + [178] render_dots::i#1 = ++ render_dots::i#10 + to:render_dots::@8 + +void lpoke(volatile unsigned long addr , volatile char val) +lpoke: scope:[lpoke] from graphics_mode::@7 graphics_mode::@9 + asm { ldz#0 ldaval sta((addr)),z } + to:lpoke::@return +lpoke::@return: scope:[lpoke] from lpoke + [180] return + to:@return + +void plot(unsigned int x , char y) +plot: scope:[plot] from render_dots::@9 + [181] plot::$3 = plot::x#0 << 1 + [182] plot::$4 = GFX_OFFSET + plot::$3 + [183] plot::$0 = graphics_render + *plot::$4 + [184] plot::$2 = plot::x#0 & 7 + [185] plot::$0[plot::y#0] = plot::$0[plot::y#0] | GFX_BIT[plot::$2] + to:plot::@return +plot::@return: scope:[plot] from plot + [186] return + to:@return diff --git a/src/test/ref/examples/mega65/camelot-1536dots.log b/src/test/ref/examples/mega65/camelot-1536dots.log new file mode 100644 index 000000000..6e7e5f857 --- /dev/null +++ b/src/test/ref/examples/mega65/camelot-1536dots.log @@ -0,0 +1,5925 @@ +Resolved forward reference memcpy_dma_command to memcpy_dma_command +Resolved forward reference memcpy_dma_command to memcpy_dma_command +Resolved forward reference memcpy_dma_command to memcpy_dma_command +Resolved forward reference memcpy_dma_command to memcpy_dma_command +Resolved forward reference memcpy_dma_command to memcpy_dma_command +Resolved forward reference memcpy_dma_command4 to memcpy_dma_command4 +Resolved forward reference memcpy_dma_command4 to memcpy_dma_command4 +Resolved forward reference memcpy_dma_command4 to memcpy_dma_command4 +Resolved forward reference memcpy_dma_command4 to memcpy_dma_command4 +Resolved forward reference memcpy_dma_command4 to memcpy_dma_command4 +Resolved forward reference memcpy_dma_command4 to memcpy_dma_command4 +Resolved forward reference memcpy_dma_command4 to memcpy_dma_command4 +Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 +Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 +Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 +Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 +Resolved forward reference memcpy_dma_command256 to memcpy_dma_command256 +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command to memset_dma_command +Resolved forward reference memset_dma_command256 to memset_dma_command256 +Resolved forward reference memset_dma_command256 to memset_dma_command256 +Resolved forward reference memset_dma_command256 to memset_dma_command256 +Resolved forward reference memset_dma_command256 to memset_dma_command256 +Resolved forward reference buffer to buffer +Resolved forward reference buffer to buffer +Resolved forward reference buffer to buffer +Resolved forward reference graphics_render to graphics_render +Resolved forward reference graphics_render to graphics_render +Resolved forward reference graphics_render to graphics_render +Resolved forward reference SINX1_SIZE to SINX1_SIZE +Resolved forward reference SINX2_SIZE to SINX2_SIZE +Resolved forward reference SINX1_SIZE to SINX1_SIZE +Resolved forward reference SINY1_SIZE to SINY1_SIZE +Resolved forward reference SINX2_SIZE to SINX2_SIZE +Resolved forward reference SINY2_SIZE to SINY2_SIZE +Resolved forward reference SINY1_SIZE to SINY1_SIZE +Resolved forward reference SINY2_SIZE to SINY2_SIZE +Resolved forward reference SINX1 to SINX1 +Resolved forward reference SINX2 to SINX2 +Resolved forward reference SINY1 to SINY1 +Resolved forward reference SINY2 to SINY2 +Resolved forward reference SINX1_SIZE to SINX1_SIZE +Resolved forward reference SINX2_SIZE to SINX2_SIZE +Resolved forward reference SINX1_SIZE to SINX1_SIZE +Resolved forward reference SINY1_SIZE to SINY1_SIZE +Resolved forward reference SINX2_SIZE to SINX2_SIZE +Resolved forward reference SINY2_SIZE to SINY2_SIZE +Resolved forward reference SINY1_SIZE to SINY1_SIZE +Resolved forward reference SINY2_SIZE to SINY2_SIZE +Fixing struct type size struct F018_DMAGIC to 17 +Fixing struct type SIZE_OF struct F018_DMAGIC to 17 +Fixing struct type SIZE_OF struct F018_DMAGIC to 17 +Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = byte1 &memcpy_dma_command +Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = byte1 &memcpy_dma_command4 +Setting struct to load/store in variable affected by address-of *DMA.ADDRMSB = byte1 &memset_dma_command +Setting inferred volatile on symbol affected by address-of: memoryRemap::aVal in asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } +Setting inferred volatile on symbol affected by address-of: memoryRemap::xVal in asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } +Setting inferred volatile on symbol affected by address-of: memoryRemap::yVal in asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } +Setting inferred volatile on symbol affected by address-of: memoryRemap::zVal in asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } +Setting inferred volatile on symbol affected by address-of: memoryRemap256M::lMb in asm { ldalMb ldx#$0f ldyuMb ldz#$0f map ldaaVal ldxxVal ldyyVal ldzzVal map eom } +Setting inferred volatile on symbol affected by address-of: memoryRemap256M::uMb in asm { ldalMb ldx#$0f ldyuMb ldz#$0f map ldaaVal ldxxVal ldyyVal ldzzVal map eom } +Setting inferred volatile on symbol affected by address-of: memoryRemap256M::aVal in asm { ldalMb ldx#$0f ldyuMb ldz#$0f map ldaaVal ldxxVal ldyyVal ldzzVal map eom } +Setting inferred volatile on symbol affected by address-of: memoryRemap256M::xVal in asm { ldalMb ldx#$0f ldyuMb ldz#$0f map ldaaVal ldxxVal ldyyVal ldzzVal map eom } +Setting inferred volatile on symbol affected by address-of: memoryRemap256M::yVal in asm { ldalMb ldx#$0f ldyuMb ldz#$0f map ldaaVal ldxxVal ldyyVal ldzzVal map eom } +Setting inferred volatile on symbol affected by address-of: memoryRemap256M::zVal in asm { ldalMb ldx#$0f ldyuMb ldz#$0f map ldaaVal ldxxVal ldyyVal ldzzVal map eom } +Setting inferred volatile on symbol affected by address-of: lpoke::val in asm { ldz#0 ldaval sta((addr)),z } +Setting inferred volatile on symbol affected by address-of: lpoke::addr in asm { ldz#0 ldaval sta((addr)),z } +Inlined call vicSelectGfxBank::$0 = call toDd00(vicSelectGfxBank::gfx) +Inlined call call SEI +Inlined call main::$3 = call toSpritePtr(SPRITES+$40) +Inlined call main::$4 = call toSpritePtr(SPRITES+$80) +Inlined call main::$5 = call toSpritePtr(SPRITES+0) +Inlined call call __init +Eliminating unused variable with no statement memoryRemap::$0 +Eliminating unused variable with no statement memoryRemap::$4 +Eliminating unused variable with no statement memoryRemap::$5 +Eliminating unused variable with no statement memoryRemap::$9 +Eliminating unused variable with no statement memcpy_dma_command +Eliminating unused variable with no statement memcpy_dma_command4 +Eliminating unused variable with no statement plot::$1 +Calling convention STACK_CALL adding prepare/execute/finalize for call *musicInit +Calling convention STACK_CALL adding prepare/execute/finalize for call *musicPlay + +CONTROL FLOW GRAPH SSA + +void memoryRemap(char remapBlocks , unsigned int lowerPageOffset , unsigned int upperPageOffset) +memoryRemap: scope:[memoryRemap] from main::@6 + memoryRemap::upperPageOffset#1 = phi( main::@6/memoryRemap::upperPageOffset#0 ) + memoryRemap::remapBlocks#1 = phi( main::@6/memoryRemap::remapBlocks#0 ) + memoryRemap::lowerPageOffset#1 = phi( main::@6/memoryRemap::lowerPageOffset#0 ) + memoryRemap::aVal = byte0 memoryRemap::lowerPageOffset#1 + memoryRemap::$1 = memoryRemap::remapBlocks#1 << 4 + memoryRemap::$2 = byte1 memoryRemap::lowerPageOffset#1 + memoryRemap::$3 = memoryRemap::$2 & $f + memoryRemap::xVal = memoryRemap::$1 | memoryRemap::$3 + memoryRemap::yVal = byte0 memoryRemap::upperPageOffset#1 + memoryRemap::$6 = memoryRemap::remapBlocks#1 & $f0 + memoryRemap::$7 = byte1 memoryRemap::upperPageOffset#1 + memoryRemap::$8 = memoryRemap::$7 & $f + memoryRemap::zVal = memoryRemap::$6 | memoryRemap::$8 + asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } + to:memoryRemap::@return +memoryRemap::@return: scope:[memoryRemap] from memoryRemap + return + to:@return + +void memset_dma(void *dest , char fill , unsigned int num) +memset_dma: scope:[memset_dma] from graphics_mode::@12 graphics_mode::@9 main::@5 + memset_dma::dest#3 = phi( graphics_mode::@12/memset_dma::dest#2, graphics_mode::@9/memset_dma::dest#1, main::@5/memset_dma::dest#0 ) + memset_dma::fill#3 = phi( graphics_mode::@12/memset_dma::fill#2, graphics_mode::@9/memset_dma::fill#1, main::@5/memset_dma::fill#0 ) + memset_dma::num#3 = phi( graphics_mode::@12/memset_dma::num#2, graphics_mode::@9/memset_dma::num#1, main::@5/memset_dma::num#0 ) + memset_dma::dmaMode#0 = *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) + *((unsigned int *)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = memset_dma::num#3 + *((char **)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (char *)memset_dma::fill#3 + *((char **)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = ((char *)) memset_dma::dest#3 + *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 + *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 + *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 + *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = byte1 &memset_dma_command + *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRLSBTRIG) = byte0 &memset_dma_command + *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = memset_dma::dmaMode#0 + to:memset_dma::@return +memset_dma::@return: scope:[memset_dma] from memset_dma + return + to:@return + +void lpoke(volatile unsigned long addr , volatile char val) +lpoke: scope:[lpoke] from graphics_mode::@10 graphics_mode::@8 + asm { ldz#0 ldaval sta((addr)),z } + to:lpoke::@return +lpoke::@return: scope:[lpoke] from lpoke + return + to:@return + +void main() +main: scope:[main] from __start::@1 + to:main::SEI1 +main::SEI1: scope:[main] from main + asm { sei } + to:main::@6 +main::@6: scope:[main] from main::SEI1 + memoryRemap::remapBlocks#0 = 0 + memoryRemap::lowerPageOffset#0 = 0 + memoryRemap::upperPageOffset#0 = 0 + call memoryRemap + to:main::@10 +main::@10: scope:[main] from main::@6 + *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK + *PROCPORT = PROCPORT_RAM_IO + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = VICIV_KEY_M65_A + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = VICIV_KEY_M65_B + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLA) = 0 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) | VICIV_FAST + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) | VICIV_VFAST + call graphics_mode + to:main::@11 +main::@11: scope:[main] from main::@10 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOLO) = byte0 SPRITE_PTRS + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOHI) = byte1 SPRITE_PTRS + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_HILO) = VICIV_SPRPTR16 + main::toSpritePtr1_sprite#0 = SPRITES+$40 + to:main::toSpritePtr1 +main::toSpritePtr1: scope:[main] from main::@11 + main::toSpritePtr1_sprite#1 = phi( main::@11/main::toSpritePtr1_sprite#0 ) + main::toSpritePtr1_$1 = (unsigned int)main::toSpritePtr1_sprite#1 + main::toSpritePtr1_$0 = main::toSpritePtr1_$1 / $40 + main::toSpritePtr1_return#0 = (char)main::toSpritePtr1_$0 + to:main::toSpritePtr1_@return +main::toSpritePtr1_@return: scope:[main] from main::toSpritePtr1 + main::toSpritePtr1_return#2 = phi( main::toSpritePtr1/main::toSpritePtr1_return#0 ) + main::toSpritePtr1_return#1 = main::toSpritePtr1_return#2 + to:main::@7 +main::@7: scope:[main] from main::toSpritePtr1_@return + main::toSpritePtr1_return#3 = phi( main::toSpritePtr1_@return/main::toSpritePtr1_return#1 ) + main::$3 = main::toSpritePtr1_return#3 + main::$13 = 0 * SIZEOF_UNSIGNED_INT + SPRITE_PTRS[main::$13] = main::$3 + main::toSpritePtr2_sprite#0 = SPRITES+$80 + to:main::toSpritePtr2 +main::toSpritePtr2: scope:[main] from main::@7 + main::toSpritePtr2_sprite#1 = phi( main::@7/main::toSpritePtr2_sprite#0 ) + main::toSpritePtr2_$1 = (unsigned int)main::toSpritePtr2_sprite#1 + main::toSpritePtr2_$0 = main::toSpritePtr2_$1 / $40 + main::toSpritePtr2_return#0 = (char)main::toSpritePtr2_$0 + to:main::toSpritePtr2_@return +main::toSpritePtr2_@return: scope:[main] from main::toSpritePtr2 + main::toSpritePtr2_return#2 = phi( main::toSpritePtr2/main::toSpritePtr2_return#0 ) + main::toSpritePtr2_return#1 = main::toSpritePtr2_return#2 + to:main::@8 +main::@8: scope:[main] from main::toSpritePtr2_@return + main::toSpritePtr2_return#3 = phi( main::toSpritePtr2_@return/main::toSpritePtr2_return#1 ) + main::$4 = main::toSpritePtr2_return#3 + main::$14 = 1 * SIZEOF_UNSIGNED_INT + SPRITE_PTRS[main::$14] = main::$4 + main::toSpritePtr3_sprite#0 = SPRITES+0 + to:main::toSpritePtr3 +main::toSpritePtr3: scope:[main] from main::@8 + main::toSpritePtr3_sprite#1 = phi( main::@8/main::toSpritePtr3_sprite#0 ) + main::toSpritePtr3_$1 = (unsigned int)main::toSpritePtr3_sprite#1 + main::toSpritePtr3_$0 = main::toSpritePtr3_$1 / $40 + main::toSpritePtr3_return#0 = (char)main::toSpritePtr3_$0 + to:main::toSpritePtr3_@return +main::toSpritePtr3_@return: scope:[main] from main::toSpritePtr3 + main::toSpritePtr3_return#2 = phi( main::toSpritePtr3/main::toSpritePtr3_return#0 ) + main::toSpritePtr3_return#1 = main::toSpritePtr3_return#2 + to:main::@9 +main::@9: scope:[main] from main::toSpritePtr3_@return + main::toSpritePtr3_return#3 = phi( main::toSpritePtr3_@return/main::toSpritePtr3_return#1 ) + main::$5 = main::toSpritePtr3_return#3 + main::$15 = 2 * SIZEOF_UNSIGNED_INT + SPRITE_PTRS[main::$15] = main::$5 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_ENABLE) = 7 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_PRIORITY) = $ff + SPRITES_COLOR[0] = DARK_GREY + SPRITES_COLOR[1] = DARK_GREY + SPRITES_COLOR[2] = DARK_GREY + SPRITES_YPOS[0] = $e3 + SPRITES_YPOS[2] = $e3 + SPRITES_YPOS[4] = $e3 + SPRITES_XPOS[0] = $2e + SPRITES_XPOS[2] = $2e+$18 + SPRITES_XPOS[4] = $19 + *SPRITES_XMSB = 3 + call init_plot + to:main::@12 +main::@12: scope:[main] from main::@9 + asm { lda#0 } + callexecute *musicInit + to:main::@1 +main::@1: scope:[main] from main::@1 main::@12 main::@14 + main::$8 = *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_RASTER) != $e3 + if(main::$8) goto main::@1 + to:main::@2 +main::@2: scope:[main] from main::@1 + buffer = buffer ^ 1 + main::$9 = buffer == 0 + if(main::$9) goto main::@4 + to:main::@3 +main::@4: scope:[main] from main::@2 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = byte0 GRAPHICS1 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS1 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 + graphics_render = GRAPHICS2 + to:main::@5 +main::@3: scope:[main] from main::@2 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = byte0 GRAPHICS2 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS2 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 + graphics_render = GRAPHICS1 + to:main::@5 +main::@5: scope:[main] from main::@3 main::@4 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = BLUE + memset_dma::dest#0 = (void *)graphics_render + memset_dma::fill#0 = 0 + memset_dma::num#0 = $28*$19*8 + call memset_dma + to:main::@13 +main::@13: scope:[main] from main::@5 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = PURPLE + call render_dots + to:main::@14 +main::@14: scope:[main] from main::@13 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = BLACK + callexecute *musicPlay + to:main::@1 +main::@return: scope:[main] from + return + to:@return + +void init_plot() +init_plot: scope:[init_plot] from main::@9 + init_plot::gfx#0 = 0 + init_plot::i#0 = 0 + to:init_plot::@1 +init_plot::@1: scope:[init_plot] from init_plot init_plot::@3 + init_plot::gfx#4 = phi( init_plot/init_plot::gfx#0, init_plot::@3/init_plot::gfx#5 ) + init_plot::i#2 = phi( init_plot/init_plot::i#0, init_plot::@3/init_plot::i#1 ) + init_plot::$0 = init_plot::i#2 < $140 + if(init_plot::$0) goto init_plot::@2 + to:init_plot::@return +init_plot::@2: scope:[init_plot] from init_plot::@1 + init_plot::gfx#2 = phi( init_plot::@1/init_plot::gfx#4 ) + init_plot::i#3 = phi( init_plot::@1/init_plot::i#2 ) + init_plot::$4 = init_plot::i#3 * SIZEOF_UNSIGNED_INT + GFX_OFFSET[init_plot::$4] = init_plot::gfx#2 + init_plot::$1 = init_plot::i#3 & 7 + init_plot::$2 = init_plot::$1 == 7 + init_plot::$3 = ! init_plot::$2 + if(init_plot::$3) goto init_plot::@3 + to:init_plot::@4 +init_plot::@3: scope:[init_plot] from init_plot::@2 init_plot::@4 + init_plot::gfx#5 = phi( init_plot::@2/init_plot::gfx#2, init_plot::@4/init_plot::gfx#1 ) + init_plot::i#4 = phi( init_plot::@2/init_plot::i#3, init_plot::@4/init_plot::i#5 ) + init_plot::i#1 = ++ init_plot::i#4 + to:init_plot::@1 +init_plot::@4: scope:[init_plot] from init_plot::@2 + init_plot::i#5 = phi( init_plot::@2/init_plot::i#3 ) + init_plot::gfx#3 = phi( init_plot::@2/init_plot::gfx#2 ) + init_plot::gfx#1 = init_plot::gfx#3 + $c8 + to:init_plot::@3 +init_plot::@return: scope:[init_plot] from init_plot::@1 + return + to:@return + +void plot(unsigned int x , char y) +plot: scope:[plot] from render_dots::@10 + plot::y#1 = phi( render_dots::@10/plot::y#0 ) + plot::x#1 = phi( render_dots::@10/plot::x#0 ) + plot::$3 = plot::x#1 * SIZEOF_UNSIGNED_INT + plot::$0 = graphics_render + GFX_OFFSET[plot::$3] + plot::gfx#0 = plot::$0 + plot::y#1 + plot::$2 = plot::x#1 & 7 + *plot::gfx#0 = *plot::gfx#0 | GFX_BIT[plot::$2] + to:plot::@return +plot::@return: scope:[plot] from plot + return + to:@return + +void render_dots() +render_dots: scope:[render_dots] from main::@13 + render_dots::idx_x1#0 = sin_x1_idx + sin_x1_idx = sin_x1_idx + 1 + render_dots::$0 = sin_x1_idx > SINX1_SIZE + render_dots::$1 = ! render_dots::$0 + if(render_dots::$1) goto render_dots::@1 + to:render_dots::@5 +render_dots::@1: scope:[render_dots] from render_dots render_dots::@5 + render_dots::idx_x1#17 = phi( render_dots/render_dots::idx_x1#0, render_dots::@5/render_dots::idx_x1#21 ) + render_dots::idx_x2#0 = sin_x2_idx + sin_x2_idx = sin_x2_idx - 1 + render_dots::$2 = sin_x2_idx > SINX2_SIZE + render_dots::$3 = ! render_dots::$2 + if(render_dots::$3) goto render_dots::@2 + to:render_dots::@6 +render_dots::@5: scope:[render_dots] from render_dots + render_dots::idx_x1#21 = phi( render_dots/render_dots::idx_x1#0 ) + sin_x1_idx = sin_x1_idx - SINX1_SIZE + to:render_dots::@1 +render_dots::@2: scope:[render_dots] from render_dots::@1 render_dots::@6 + render_dots::idx_x2#15 = phi( render_dots::@1/render_dots::idx_x2#0, render_dots::@6/render_dots::idx_x2#19 ) + render_dots::idx_x1#13 = phi( render_dots::@1/render_dots::idx_x1#17, render_dots::@6/render_dots::idx_x1#18 ) + render_dots::idx_y1#0 = sin_y1_idx + sin_y1_idx = sin_y1_idx - 1 + render_dots::$4 = sin_y1_idx > SINY1_SIZE + render_dots::$5 = ! render_dots::$4 + if(render_dots::$5) goto render_dots::@3 + to:render_dots::@7 +render_dots::@6: scope:[render_dots] from render_dots::@1 + render_dots::idx_x2#19 = phi( render_dots::@1/render_dots::idx_x2#0 ) + render_dots::idx_x1#18 = phi( render_dots::@1/render_dots::idx_x1#17 ) + sin_x2_idx = sin_x2_idx + SINX2_SIZE + to:render_dots::@2 +render_dots::@3: scope:[render_dots] from render_dots::@2 render_dots::@7 + render_dots::idx_y1#13 = phi( render_dots::@2/render_dots::idx_y1#0, render_dots::@7/render_dots::idx_y1#17 ) + render_dots::idx_x2#11 = phi( render_dots::@2/render_dots::idx_x2#15, render_dots::@7/render_dots::idx_x2#16 ) + render_dots::idx_x1#9 = phi( render_dots::@2/render_dots::idx_x1#13, render_dots::@7/render_dots::idx_x1#14 ) + render_dots::idx_y2#0 = sin_y2_idx + sin_y2_idx = sin_y2_idx + 1 + render_dots::$6 = sin_y2_idx > SINY2_SIZE + render_dots::$7 = ! render_dots::$6 + if(render_dots::$7) goto render_dots::@4 + to:render_dots::@8 +render_dots::@7: scope:[render_dots] from render_dots::@2 + render_dots::idx_y1#17 = phi( render_dots::@2/render_dots::idx_y1#0 ) + render_dots::idx_x2#16 = phi( render_dots::@2/render_dots::idx_x2#15 ) + render_dots::idx_x1#14 = phi( render_dots::@2/render_dots::idx_x1#13 ) + sin_y1_idx = sin_y1_idx + SINY1_SIZE + to:render_dots::@3 +render_dots::@4: scope:[render_dots] from render_dots::@3 render_dots::@8 + render_dots::idx_y2#10 = phi( render_dots::@3/render_dots::idx_y2#0, render_dots::@8/render_dots::idx_y2#13 ) + render_dots::idx_y1#10 = phi( render_dots::@3/render_dots::idx_y1#13, render_dots::@8/render_dots::idx_y1#14 ) + render_dots::idx_x2#10 = phi( render_dots::@3/render_dots::idx_x2#11, render_dots::@8/render_dots::idx_x2#12 ) + render_dots::idx_x1#8 = phi( render_dots::@3/render_dots::idx_x1#9, render_dots::@8/render_dots::idx_x1#10 ) + render_dots::i#0 = 0 + to:render_dots::@9 +render_dots::@8: scope:[render_dots] from render_dots::@3 + render_dots::idx_y2#13 = phi( render_dots::@3/render_dots::idx_y2#0 ) + render_dots::idx_y1#14 = phi( render_dots::@3/render_dots::idx_y1#13 ) + render_dots::idx_x2#12 = phi( render_dots::@3/render_dots::idx_x2#11 ) + render_dots::idx_x1#10 = phi( render_dots::@3/render_dots::idx_x1#9 ) + sin_y2_idx = sin_y2_idx - SINY2_SIZE + to:render_dots::@4 +render_dots::@9: scope:[render_dots] from render_dots::@14 render_dots::@4 + render_dots::idx_y2#6 = phi( render_dots::@14/render_dots::idx_y2#9, render_dots::@4/render_dots::idx_y2#10 ) + render_dots::idx_y1#6 = phi( render_dots::@14/render_dots::idx_y1#9, render_dots::@4/render_dots::idx_y1#10 ) + render_dots::idx_x2#6 = phi( render_dots::@14/render_dots::idx_x2#9, render_dots::@4/render_dots::idx_x2#10 ) + render_dots::idx_x1#6 = phi( render_dots::@14/render_dots::idx_x1#7, render_dots::@4/render_dots::idx_x1#8 ) + render_dots::i#2 = phi( render_dots::@14/render_dots::i#1, render_dots::@4/render_dots::i#0 ) + render_dots::$8 = render_dots::i#2 < $600 + if(render_dots::$8) goto render_dots::@10 + to:render_dots::@return +render_dots::@10: scope:[render_dots] from render_dots::@9 + render_dots::i#12 = phi( render_dots::@9/render_dots::i#2 ) + render_dots::idx_y2#3 = phi( render_dots::@9/render_dots::idx_y2#6 ) + render_dots::idx_y1#3 = phi( render_dots::@9/render_dots::idx_y1#6 ) + render_dots::idx_x2#3 = phi( render_dots::@9/render_dots::idx_x2#6 ) + render_dots::idx_x1#3 = phi( render_dots::@9/render_dots::idx_x1#6 ) + render_dots::$20 = render_dots::idx_x1#3 * SIZEOF_UNSIGNED_INT + render_dots::$21 = render_dots::idx_x2#3 * SIZEOF_UNSIGNED_INT + render_dots::$9 = SINX1[render_dots::$20] + SINX2[render_dots::$21] + render_dots::$10 = SINY1[render_dots::idx_y1#3] + SINY2[render_dots::idx_y2#3] + plot::x#0 = render_dots::$9 + plot::y#0 = render_dots::$10 + call plot + to:render_dots::@19 +render_dots::@19: scope:[render_dots] from render_dots::@10 + render_dots::i#11 = phi( render_dots::@10/render_dots::i#12 ) + render_dots::idx_y2#15 = phi( render_dots::@10/render_dots::idx_y2#3 ) + render_dots::idx_y1#12 = phi( render_dots::@10/render_dots::idx_y1#3 ) + render_dots::idx_x2#8 = phi( render_dots::@10/render_dots::idx_x2#3 ) + render_dots::idx_x1#4 = phi( render_dots::@10/render_dots::idx_x1#3 ) + render_dots::idx_x1#1 = render_dots::idx_x1#4 - $b + render_dots::$12 = render_dots::idx_x1#1 > SINX1_SIZE + render_dots::$13 = ! render_dots::$12 + if(render_dots::$13) goto render_dots::@11 + to:render_dots::@15 +render_dots::@11: scope:[render_dots] from render_dots::@15 render_dots::@19 + render_dots::idx_x1#19 = phi( render_dots::@15/render_dots::idx_x1#2, render_dots::@19/render_dots::idx_x1#1 ) + render_dots::i#8 = phi( render_dots::@15/render_dots::i#10, render_dots::@19/render_dots::i#11 ) + render_dots::idx_y2#11 = phi( render_dots::@15/render_dots::idx_y2#14, render_dots::@19/render_dots::idx_y2#15 ) + render_dots::idx_y1#7 = phi( render_dots::@15/render_dots::idx_y1#11, render_dots::@19/render_dots::idx_y1#12 ) + render_dots::idx_x2#4 = phi( render_dots::@15/render_dots::idx_x2#7, render_dots::@19/render_dots::idx_x2#8 ) + render_dots::idx_x2#1 = render_dots::idx_x2#4 + 3 + render_dots::$14 = render_dots::idx_x2#1 > SINX2_SIZE + render_dots::$15 = ! render_dots::$14 + if(render_dots::$15) goto render_dots::@12 + to:render_dots::@16 +render_dots::@15: scope:[render_dots] from render_dots::@19 + render_dots::i#10 = phi( render_dots::@19/render_dots::i#11 ) + render_dots::idx_y2#14 = phi( render_dots::@19/render_dots::idx_y2#15 ) + render_dots::idx_y1#11 = phi( render_dots::@19/render_dots::idx_y1#12 ) + render_dots::idx_x2#7 = phi( render_dots::@19/render_dots::idx_x2#8 ) + render_dots::idx_x1#5 = phi( render_dots::@19/render_dots::idx_x1#1 ) + render_dots::idx_x1#2 = render_dots::idx_x1#5 + SINX1_SIZE + to:render_dots::@11 +render_dots::@12: scope:[render_dots] from render_dots::@11 render_dots::@16 + render_dots::idx_x2#17 = phi( render_dots::@11/render_dots::idx_x2#1, render_dots::@16/render_dots::idx_x2#2 ) + render_dots::idx_x1#15 = phi( render_dots::@11/render_dots::idx_x1#19, render_dots::@16/render_dots::idx_x1#20 ) + render_dots::i#6 = phi( render_dots::@11/render_dots::i#8, render_dots::@16/render_dots::i#9 ) + render_dots::idx_y2#7 = phi( render_dots::@11/render_dots::idx_y2#11, render_dots::@16/render_dots::idx_y2#12 ) + render_dots::idx_y1#4 = phi( render_dots::@11/render_dots::idx_y1#7, render_dots::@16/render_dots::idx_y1#8 ) + render_dots::idx_y1#1 = render_dots::idx_y1#4 + 9 + render_dots::$16 = render_dots::idx_y1#1 > SINY1_SIZE + render_dots::$17 = ! render_dots::$16 + if(render_dots::$17) goto render_dots::@13 + to:render_dots::@17 +render_dots::@16: scope:[render_dots] from render_dots::@11 + render_dots::idx_x1#20 = phi( render_dots::@11/render_dots::idx_x1#19 ) + render_dots::i#9 = phi( render_dots::@11/render_dots::i#8 ) + render_dots::idx_y2#12 = phi( render_dots::@11/render_dots::idx_y2#11 ) + render_dots::idx_y1#8 = phi( render_dots::@11/render_dots::idx_y1#7 ) + render_dots::idx_x2#5 = phi( render_dots::@11/render_dots::idx_x2#1 ) + render_dots::idx_x2#2 = render_dots::idx_x2#5 - SINX2_SIZE + to:render_dots::@12 +render_dots::@13: scope:[render_dots] from render_dots::@12 render_dots::@17 + render_dots::idx_y1#15 = phi( render_dots::@12/render_dots::idx_y1#1, render_dots::@17/render_dots::idx_y1#2 ) + render_dots::idx_x2#13 = phi( render_dots::@12/render_dots::idx_x2#17, render_dots::@17/render_dots::idx_x2#18 ) + render_dots::idx_x1#11 = phi( render_dots::@12/render_dots::idx_x1#15, render_dots::@17/render_dots::idx_x1#16 ) + render_dots::i#4 = phi( render_dots::@12/render_dots::i#6, render_dots::@17/render_dots::i#7 ) + render_dots::idx_y2#4 = phi( render_dots::@12/render_dots::idx_y2#7, render_dots::@17/render_dots::idx_y2#8 ) + render_dots::idx_y2#1 = render_dots::idx_y2#4 - 5 + render_dots::$18 = render_dots::idx_y2#1 > SINY2_SIZE + render_dots::$19 = ! render_dots::$18 + if(render_dots::$19) goto render_dots::@14 + to:render_dots::@18 +render_dots::@17: scope:[render_dots] from render_dots::@12 + render_dots::idx_x2#18 = phi( render_dots::@12/render_dots::idx_x2#17 ) + render_dots::idx_x1#16 = phi( render_dots::@12/render_dots::idx_x1#15 ) + render_dots::i#7 = phi( render_dots::@12/render_dots::i#6 ) + render_dots::idx_y2#8 = phi( render_dots::@12/render_dots::idx_y2#7 ) + render_dots::idx_y1#5 = phi( render_dots::@12/render_dots::idx_y1#1 ) + render_dots::idx_y1#2 = render_dots::idx_y1#5 - SINY1_SIZE + to:render_dots::@13 +render_dots::@14: scope:[render_dots] from render_dots::@13 render_dots::@18 + render_dots::idx_y2#9 = phi( render_dots::@13/render_dots::idx_y2#1, render_dots::@18/render_dots::idx_y2#2 ) + render_dots::idx_y1#9 = phi( render_dots::@13/render_dots::idx_y1#15, render_dots::@18/render_dots::idx_y1#16 ) + render_dots::idx_x2#9 = phi( render_dots::@13/render_dots::idx_x2#13, render_dots::@18/render_dots::idx_x2#14 ) + render_dots::idx_x1#7 = phi( render_dots::@13/render_dots::idx_x1#11, render_dots::@18/render_dots::idx_x1#12 ) + render_dots::i#3 = phi( render_dots::@13/render_dots::i#4, render_dots::@18/render_dots::i#5 ) + render_dots::i#1 = ++ render_dots::i#3 + to:render_dots::@9 +render_dots::@18: scope:[render_dots] from render_dots::@13 + render_dots::idx_y1#16 = phi( render_dots::@13/render_dots::idx_y1#15 ) + render_dots::idx_x2#14 = phi( render_dots::@13/render_dots::idx_x2#13 ) + render_dots::idx_x1#12 = phi( render_dots::@13/render_dots::idx_x1#11 ) + render_dots::i#5 = phi( render_dots::@13/render_dots::i#4 ) + render_dots::idx_y2#5 = phi( render_dots::@13/render_dots::idx_y2#1 ) + render_dots::idx_y2#2 = render_dots::idx_y2#5 + SINY2_SIZE + to:render_dots::@14 +render_dots::@return: scope:[render_dots] from render_dots::@9 + return + to:@return + +void graphics_mode() +graphics_mode: scope:[graphics_mode] from main::@10 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = VICIV_CHR16|VICIV_VFAST + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = VICIV_FAST + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO) = $50 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI) = 0 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT) = $28 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO) = byte0 SCREEN + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI) = byte1 SCREEN + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO) = 0 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = byte0 GRAPHICS1 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS1 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 + graphics_mode::screen#0 = (unsigned int *)SCREEN + graphics_mode::ch#0 = 0 + graphics_mode::y#0 = 0 + to:graphics_mode::@1 +graphics_mode::@1: scope:[graphics_mode] from graphics_mode graphics_mode::@6 + graphics_mode::screen#6 = phi( graphics_mode/graphics_mode::screen#0, graphics_mode::@6/graphics_mode::screen#1 ) + graphics_mode::ch#4 = phi( graphics_mode/graphics_mode::ch#0, graphics_mode::@6/graphics_mode::ch#1 ) + graphics_mode::y#2 = phi( graphics_mode/graphics_mode::y#0, graphics_mode::@6/graphics_mode::y#1 ) + graphics_mode::$2 = graphics_mode::y#2 < $19 + if(graphics_mode::$2) goto graphics_mode::@2 + to:graphics_mode::@3 +graphics_mode::@2: scope:[graphics_mode] from graphics_mode::@1 + graphics_mode::y#5 = phi( graphics_mode::@1/graphics_mode::y#2 ) + graphics_mode::screen#5 = phi( graphics_mode::@1/graphics_mode::screen#6 ) + graphics_mode::ch#2 = phi( graphics_mode::@1/graphics_mode::ch#4 ) + graphics_mode::ch_x#0 = graphics_mode::ch#2 + graphics_mode::x#0 = 0 + to:graphics_mode::@4 +graphics_mode::@3: scope:[graphics_mode] from graphics_mode::@1 + graphics_mode::cols#0 = $ff80000 + graphics_mode::i#0 = 0 + to:graphics_mode::@7 +graphics_mode::@4: scope:[graphics_mode] from graphics_mode::@2 graphics_mode::@5 + graphics_mode::y#4 = phi( graphics_mode::@2/graphics_mode::y#5, graphics_mode::@5/graphics_mode::y#6 ) + graphics_mode::ch#5 = phi( graphics_mode::@2/graphics_mode::ch#2, graphics_mode::@5/graphics_mode::ch#6 ) + graphics_mode::screen#4 = phi( graphics_mode::@2/graphics_mode::screen#5, graphics_mode::@5/graphics_mode::screen#2 ) + graphics_mode::ch_x#3 = phi( graphics_mode::@2/graphics_mode::ch_x#0, graphics_mode::@5/graphics_mode::ch_x#1 ) + graphics_mode::x#2 = phi( graphics_mode::@2/graphics_mode::x#0, graphics_mode::@5/graphics_mode::x#1 ) + graphics_mode::$3 = graphics_mode::x#2 < $28 + if(graphics_mode::$3) goto graphics_mode::@5 + to:graphics_mode::@6 +graphics_mode::@5: scope:[graphics_mode] from graphics_mode::@4 + graphics_mode::y#6 = phi( graphics_mode::@4/graphics_mode::y#4 ) + graphics_mode::ch#6 = phi( graphics_mode::@4/graphics_mode::ch#5 ) + graphics_mode::screen#2 = phi( graphics_mode::@4/graphics_mode::screen#4 ) + graphics_mode::ch_x#2 = phi( graphics_mode::@4/graphics_mode::ch_x#3 ) + graphics_mode::x#3 = phi( graphics_mode::@4/graphics_mode::x#2 ) + graphics_mode::$8 = graphics_mode::x#3 * SIZEOF_UNSIGNED_INT + graphics_mode::screen#2[graphics_mode::$8] = graphics_mode::ch_x#2 + graphics_mode::ch_x#1 = graphics_mode::ch_x#2 + $19 + graphics_mode::x#1 = ++ graphics_mode::x#3 + to:graphics_mode::@4 +graphics_mode::@6: scope:[graphics_mode] from graphics_mode::@4 + graphics_mode::y#3 = phi( graphics_mode::@4/graphics_mode::y#4 ) + graphics_mode::ch#3 = phi( graphics_mode::@4/graphics_mode::ch#5 ) + graphics_mode::screen#3 = phi( graphics_mode::@4/graphics_mode::screen#4 ) + graphics_mode::$7 = $28 * SIZEOF_UNSIGNED_INT + graphics_mode::screen#1 = graphics_mode::screen#3 + graphics_mode::$7 + graphics_mode::ch#1 = ++ graphics_mode::ch#3 + graphics_mode::y#1 = ++ graphics_mode::y#3 + to:graphics_mode::@1 +graphics_mode::@7: scope:[graphics_mode] from graphics_mode::@11 graphics_mode::@3 + graphics_mode::cols#6 = phi( graphics_mode::@11/graphics_mode::cols#2, graphics_mode::@3/graphics_mode::cols#0 ) + graphics_mode::i#2 = phi( graphics_mode::@11/graphics_mode::i#1, graphics_mode::@3/graphics_mode::i#0 ) + graphics_mode::$4 = graphics_mode::i#2 < $3e8 + if(graphics_mode::$4) goto graphics_mode::@8 + to:graphics_mode::@9 +graphics_mode::@8: scope:[graphics_mode] from graphics_mode::@7 + graphics_mode::i#5 = phi( graphics_mode::@7/graphics_mode::i#2 ) + graphics_mode::cols#3 = phi( graphics_mode::@7/graphics_mode::cols#6 ) + lpoke::addr = graphics_mode::cols#3 + lpoke::val = 0 + call lpoke + to:graphics_mode::@10 +graphics_mode::@10: scope:[graphics_mode] from graphics_mode::@8 + graphics_mode::i#4 = phi( graphics_mode::@8/graphics_mode::i#5 ) + graphics_mode::cols#4 = phi( graphics_mode::@8/graphics_mode::cols#3 ) + graphics_mode::cols#1 = ++ graphics_mode::cols#4 + lpoke::addr = graphics_mode::cols#1 + lpoke::val = WHITE + call lpoke + to:graphics_mode::@11 +graphics_mode::@11: scope:[graphics_mode] from graphics_mode::@10 + graphics_mode::i#3 = phi( graphics_mode::@10/graphics_mode::i#4 ) + graphics_mode::cols#5 = phi( graphics_mode::@10/graphics_mode::cols#1 ) + graphics_mode::cols#2 = ++ graphics_mode::cols#5 + graphics_mode::i#1 = ++ graphics_mode::i#3 + to:graphics_mode::@7 +graphics_mode::@9: scope:[graphics_mode] from graphics_mode::@7 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = 0 + *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR) = 0 + memset_dma::dest#1 = (void *)GRAPHICS1 + memset_dma::fill#1 = 0 + memset_dma::num#1 = $28*$19*8 + call memset_dma + to:graphics_mode::@12 +graphics_mode::@12: scope:[graphics_mode] from graphics_mode::@9 + memset_dma::dest#2 = (void *)GRAPHICS2 + memset_dma::fill#2 = 0 + memset_dma::num#2 = $28*$19*8 + call memset_dma + to:graphics_mode::@13 +graphics_mode::@13: scope:[graphics_mode] from graphics_mode::@12 + to:graphics_mode::@return +graphics_mode::@return: scope:[graphics_mode] from graphics_mode::@13 + return + to:@return + +void __start() +__start: scope:[__start] from + to:__start::__init1 +__start::__init1: scope:[__start] from __start + buffer = 0 + graphics_render = GRAPHICS1 + sin_x1_idx = 0 + sin_x2_idx = 0 + sin_y1_idx = 0 + sin_y2_idx = 0 + to:__start::@1 +__start::@1: scope:[__start] from __start::__init1 + call main + to:__start::@2 +__start::@2: scope:[__start] from __start::@1 + to:__start::@return +__start::@return: scope:[__start] from __start::@2 + return + to:@return + +SYMBOL TABLE SSA +__constant const char BLACK = 0 +__constant const char BLUE = 6 +__constant const char DARK_GREY = $b +__constant struct F018_DMAGIC * const DMA = (struct F018_DMAGIC *)$d700 +__constant const char DMA_COMMAND_FILL = 3 +__constant char GFX_BIT[8] = { $80, $40, $20, $10, 8, 4, 2, 1 } +__constant unsigned int GFX_OFFSET[$140] = { fill( $140, 0) } +__constant char * const GRAPHICS1 = (char *)$a000 +__constant char * const GRAPHICS2 = (char *)$7000 +__constant char MUSIC[] = kickasm {{ .const music = LoadSid("Thaw_5000.sid") + .fill music.size, music.getData(i) + }} +__constant char OFFSET_STRUCT_DMA_LIST_F018B_COUNT = 1 +__constant char OFFSET_STRUCT_DMA_LIST_F018B_DEST = 6 +__constant char OFFSET_STRUCT_DMA_LIST_F018B_SRC = 3 +__constant char OFFSET_STRUCT_F018_DMAGIC_ADDRBANK = 2 +__constant char OFFSET_STRUCT_F018_DMAGIC_ADDRLSBTRIG = 0 +__constant char OFFSET_STRUCT_F018_DMAGIC_ADDRMB = 4 +__constant char OFFSET_STRUCT_F018_DMAGIC_ADDRMSB = 1 +__constant char OFFSET_STRUCT_F018_DMAGIC_EN018B = 3 +__constant char OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR = $21 +__constant char OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR = $20 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO = $6a +__constant char OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI = $69 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO = $68 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI = $59 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO = $58 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT = $5e +__constant char OFFSET_STRUCT_MEGA65_VICIV_CONTROLA = $30 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CONTROLB = $31 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CONTROLC = $54 +__constant char OFFSET_STRUCT_MEGA65_VICIV_KEY = $2f +__constant char OFFSET_STRUCT_MEGA65_VICIV_RASTER = $12 +__constant char OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO = $62 +__constant char OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI = $61 +__constant char OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO = $60 +__constant char OFFSET_STRUCT_MEGA65_VICIV_SPRITES_ENABLE = $15 +__constant char OFFSET_STRUCT_MEGA65_VICIV_SPRITES_PRIORITY = $1b +__constant char OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_HILO = $6e +__constant char OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOHI = $6d +__constant char OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOLO = $6c +__constant char * const PROCPORT = (char *)1 +__constant char * const PROCPORT_DDR = (char *)0 +__constant const char PROCPORT_DDR_MEMORY_MASK = 7 +__constant const char PROCPORT_RAM_IO = 5 +__constant const char PURPLE = 4 +__constant char * const SCREEN = (char *)$c800 +__constant unsigned int SINX1[SINX1_SIZE+$100] = kickasm {{ .fillword 1613+256, round(98+98*sin(toRadians(360*i/1613))) + }} +__constant const unsigned int SINX1_SIZE = $64d +__constant unsigned int SINX2[SINX2_SIZE+$100] = kickasm {{ .fillword 547+256, round(60+60*sin(toRadians(360*i/547))) + }} +__constant const unsigned int SINX2_SIZE = $223 +__constant char SINY1[SINY1_SIZE+$100] = kickasm {{ .fill 733+256, round(66.5+66.5*sin(toRadians(360*i/733))) + }} +__constant const unsigned int SINY1_SIZE = $2dd +__constant char SINY2[SINY2_SIZE+$100] = kickasm {{ .fill 317+256, round(33+33*sin(toRadians(360*i/317))) + }} +__constant const unsigned int SINY2_SIZE = $13d +__constant char SIZEOF_UNSIGNED_INT = 2 +__constant char SPRITES[$c0] = kickasm {{ .var pic = LoadPicture("camelot-sprites.png", List().add($000000, $ffffff)) + .for (var s=0; s<3; s++) { + .for (var y=0; y<21; y++) { + .for (var x=0;x<3; x++) { + .byte pic.getSinglecolorByte(s*3+x,y) + } + } + .byte 0 + } + }} +__constant char * const SPRITES_COLOR = (char *)$d027 +__constant char * const SPRITES_XMSB = (char *)$d010 +__constant char * const SPRITES_XPOS = (char *)$d000 +__constant char * const SPRITES_YPOS = (char *)$d001 +__constant unsigned int SPRITE_PTRS[8] = { fill( 8, 0) } +__constant struct MEGA65_VICIV * const VICIV = (struct MEGA65_VICIV *)$d000 +__constant const char VICIV_CHR16 = 1 +__constant const char VICIV_FAST = $40 +__constant const char VICIV_KEY_M65_A = $47 +__constant const char VICIV_KEY_M65_B = $53 +__constant const char VICIV_SPRPTR16 = $80 +__constant const char VICIV_VFAST = $40 +__constant const char WHITE = 1 +void __start() +__loadstore volatile char buffer +void graphics_mode() +bool graphics_mode::$2 +bool graphics_mode::$3 +bool graphics_mode::$4 +number graphics_mode::$7 +char graphics_mode::$8 +unsigned int graphics_mode::ch +unsigned int graphics_mode::ch#0 +unsigned int graphics_mode::ch#1 +unsigned int graphics_mode::ch#2 +unsigned int graphics_mode::ch#3 +unsigned int graphics_mode::ch#4 +unsigned int graphics_mode::ch#5 +unsigned int graphics_mode::ch#6 +unsigned int graphics_mode::ch_x +unsigned int graphics_mode::ch_x#0 +unsigned int graphics_mode::ch_x#1 +unsigned int graphics_mode::ch_x#2 +unsigned int graphics_mode::ch_x#3 +unsigned long graphics_mode::cols +unsigned long graphics_mode::cols#0 +unsigned long graphics_mode::cols#1 +unsigned long graphics_mode::cols#2 +unsigned long graphics_mode::cols#3 +unsigned long graphics_mode::cols#4 +unsigned long graphics_mode::cols#5 +unsigned long graphics_mode::cols#6 +unsigned int graphics_mode::i +unsigned int graphics_mode::i#0 +unsigned int graphics_mode::i#1 +unsigned int graphics_mode::i#2 +unsigned int graphics_mode::i#3 +unsigned int graphics_mode::i#4 +unsigned int graphics_mode::i#5 +unsigned int *graphics_mode::screen +unsigned int *graphics_mode::screen#0 +unsigned int *graphics_mode::screen#1 +unsigned int *graphics_mode::screen#2 +unsigned int *graphics_mode::screen#3 +unsigned int *graphics_mode::screen#4 +unsigned int *graphics_mode::screen#5 +unsigned int *graphics_mode::screen#6 +char graphics_mode::x +char graphics_mode::x#0 +char graphics_mode::x#1 +char graphics_mode::x#2 +char graphics_mode::x#3 +char graphics_mode::y +char graphics_mode::y#0 +char graphics_mode::y#1 +char graphics_mode::y#2 +char graphics_mode::y#3 +char graphics_mode::y#4 +char graphics_mode::y#5 +char graphics_mode::y#6 +__loadstore char * volatile graphics_render +void init_plot() +bool init_plot::$0 +number init_plot::$1 +bool init_plot::$2 +bool init_plot::$3 +unsigned int init_plot::$4 +unsigned int init_plot::gfx +unsigned int init_plot::gfx#0 +unsigned int init_plot::gfx#1 +unsigned int init_plot::gfx#2 +unsigned int init_plot::gfx#3 +unsigned int init_plot::gfx#4 +unsigned int init_plot::gfx#5 +unsigned int init_plot::i +unsigned int init_plot::i#0 +unsigned int init_plot::i#1 +unsigned int init_plot::i#2 +unsigned int init_plot::i#3 +unsigned int init_plot::i#4 +unsigned int init_plot::i#5 +void lpoke(volatile unsigned long addr , volatile char val) +__loadstore volatile unsigned long lpoke::addr +__loadstore volatile char lpoke::val +void main() +number main::$13 +number main::$14 +number main::$15 +char main::$3 +char main::$4 +char main::$5 +bool main::$8 +bool main::$9 +number main::toSpritePtr1_$0 +unsigned int main::toSpritePtr1_$1 +char main::toSpritePtr1_return +char main::toSpritePtr1_return#0 +char main::toSpritePtr1_return#1 +char main::toSpritePtr1_return#2 +char main::toSpritePtr1_return#3 +char *main::toSpritePtr1_sprite +char *main::toSpritePtr1_sprite#0 +char *main::toSpritePtr1_sprite#1 +number main::toSpritePtr2_$0 +unsigned int main::toSpritePtr2_$1 +char main::toSpritePtr2_return +char main::toSpritePtr2_return#0 +char main::toSpritePtr2_return#1 +char main::toSpritePtr2_return#2 +char main::toSpritePtr2_return#3 +char *main::toSpritePtr2_sprite +char *main::toSpritePtr2_sprite#0 +char *main::toSpritePtr2_sprite#1 +number main::toSpritePtr3_$0 +unsigned int main::toSpritePtr3_$1 +char main::toSpritePtr3_return +char main::toSpritePtr3_return#0 +char main::toSpritePtr3_return#1 +char main::toSpritePtr3_return#2 +char main::toSpritePtr3_return#3 +char *main::toSpritePtr3_sprite +char *main::toSpritePtr3_sprite#0 +char *main::toSpritePtr3_sprite#1 +void memoryRemap(char remapBlocks , unsigned int lowerPageOffset , unsigned int upperPageOffset) +char memoryRemap::$1 +char memoryRemap::$2 +number memoryRemap::$3 +number memoryRemap::$6 +char memoryRemap::$7 +number memoryRemap::$8 +__loadstore volatile char memoryRemap::aVal +unsigned int memoryRemap::lowerPageOffset +unsigned int memoryRemap::lowerPageOffset#0 +unsigned int memoryRemap::lowerPageOffset#1 +char memoryRemap::remapBlocks +char memoryRemap::remapBlocks#0 +char memoryRemap::remapBlocks#1 +unsigned int memoryRemap::upperPageOffset +unsigned int memoryRemap::upperPageOffset#0 +unsigned int memoryRemap::upperPageOffset#1 +__loadstore volatile char memoryRemap::xVal +__loadstore volatile char memoryRemap::yVal +__loadstore volatile char memoryRemap::zVal +void memset_dma(void *dest , char fill , unsigned int num) +void *memset_dma::dest +void *memset_dma::dest#0 +void *memset_dma::dest#1 +void *memset_dma::dest#2 +void *memset_dma::dest#3 +char memset_dma::dmaMode +char memset_dma::dmaMode#0 +char memset_dma::fill +char memset_dma::fill#0 +char memset_dma::fill#1 +char memset_dma::fill#2 +char memset_dma::fill#3 +unsigned int memset_dma::num +unsigned int memset_dma::num#0 +unsigned int memset_dma::num#1 +unsigned int memset_dma::num#2 +unsigned int memset_dma::num#3 +__loadstore volatile struct DMA_LIST_F018B memset_dma_command = { command: DMA_COMMAND_FILL, count: 0, src: 0, src_bank: 0, dest: 0, dest_bank: 0, sub_command: 0, modulo: 0 } +__constant void (* const musicInit)() = (void (*)())MUSIC +__constant void (* const musicPlay)() = (void (*)())MUSIC+3 +void plot(unsigned int x , char y) +char *plot::$0 +number plot::$2 +unsigned int plot::$3 +char *plot::gfx +char *plot::gfx#0 +unsigned int plot::x +unsigned int plot::x#0 +unsigned int plot::x#1 +char plot::y +char plot::y#0 +char plot::y#1 +void render_dots() +bool render_dots::$0 +bool render_dots::$1 +char render_dots::$10 +bool render_dots::$12 +bool render_dots::$13 +bool render_dots::$14 +bool render_dots::$15 +bool render_dots::$16 +bool render_dots::$17 +bool render_dots::$18 +bool render_dots::$19 +bool render_dots::$2 +unsigned int render_dots::$20 +unsigned int render_dots::$21 +bool render_dots::$3 +bool render_dots::$4 +bool render_dots::$5 +bool render_dots::$6 +bool render_dots::$7 +bool render_dots::$8 +unsigned int render_dots::$9 +unsigned int render_dots::i +unsigned int render_dots::i#0 +unsigned int render_dots::i#1 +unsigned int render_dots::i#10 +unsigned int render_dots::i#11 +unsigned int render_dots::i#12 +unsigned int render_dots::i#2 +unsigned int render_dots::i#3 +unsigned int render_dots::i#4 +unsigned int render_dots::i#5 +unsigned int render_dots::i#6 +unsigned int render_dots::i#7 +unsigned int render_dots::i#8 +unsigned int render_dots::i#9 +unsigned int render_dots::idx_x1 +unsigned int render_dots::idx_x1#0 +unsigned int render_dots::idx_x1#1 +unsigned int render_dots::idx_x1#10 +unsigned int render_dots::idx_x1#11 +unsigned int render_dots::idx_x1#12 +unsigned int render_dots::idx_x1#13 +unsigned int render_dots::idx_x1#14 +unsigned int render_dots::idx_x1#15 +unsigned int render_dots::idx_x1#16 +unsigned int render_dots::idx_x1#17 +unsigned int render_dots::idx_x1#18 +unsigned int render_dots::idx_x1#19 +unsigned int render_dots::idx_x1#2 +unsigned int render_dots::idx_x1#20 +unsigned int render_dots::idx_x1#21 +unsigned int render_dots::idx_x1#3 +unsigned int render_dots::idx_x1#4 +unsigned int render_dots::idx_x1#5 +unsigned int render_dots::idx_x1#6 +unsigned int render_dots::idx_x1#7 +unsigned int render_dots::idx_x1#8 +unsigned int render_dots::idx_x1#9 +unsigned int render_dots::idx_x2 +unsigned int render_dots::idx_x2#0 +unsigned int render_dots::idx_x2#1 +unsigned int render_dots::idx_x2#10 +unsigned int render_dots::idx_x2#11 +unsigned int render_dots::idx_x2#12 +unsigned int render_dots::idx_x2#13 +unsigned int render_dots::idx_x2#14 +unsigned int render_dots::idx_x2#15 +unsigned int render_dots::idx_x2#16 +unsigned int render_dots::idx_x2#17 +unsigned int render_dots::idx_x2#18 +unsigned int render_dots::idx_x2#19 +unsigned int render_dots::idx_x2#2 +unsigned int render_dots::idx_x2#3 +unsigned int render_dots::idx_x2#4 +unsigned int render_dots::idx_x2#5 +unsigned int render_dots::idx_x2#6 +unsigned int render_dots::idx_x2#7 +unsigned int render_dots::idx_x2#8 +unsigned int render_dots::idx_x2#9 +unsigned int render_dots::idx_y1 +unsigned int render_dots::idx_y1#0 +unsigned int render_dots::idx_y1#1 +unsigned int render_dots::idx_y1#10 +unsigned int render_dots::idx_y1#11 +unsigned int render_dots::idx_y1#12 +unsigned int render_dots::idx_y1#13 +unsigned int render_dots::idx_y1#14 +unsigned int render_dots::idx_y1#15 +unsigned int render_dots::idx_y1#16 +unsigned int render_dots::idx_y1#17 +unsigned int render_dots::idx_y1#2 +unsigned int render_dots::idx_y1#3 +unsigned int render_dots::idx_y1#4 +unsigned int render_dots::idx_y1#5 +unsigned int render_dots::idx_y1#6 +unsigned int render_dots::idx_y1#7 +unsigned int render_dots::idx_y1#8 +unsigned int render_dots::idx_y1#9 +unsigned int render_dots::idx_y2 +unsigned int render_dots::idx_y2#0 +unsigned int render_dots::idx_y2#1 +unsigned int render_dots::idx_y2#10 +unsigned int render_dots::idx_y2#11 +unsigned int render_dots::idx_y2#12 +unsigned int render_dots::idx_y2#13 +unsigned int render_dots::idx_y2#14 +unsigned int render_dots::idx_y2#15 +unsigned int render_dots::idx_y2#2 +unsigned int render_dots::idx_y2#3 +unsigned int render_dots::idx_y2#4 +unsigned int render_dots::idx_y2#5 +unsigned int render_dots::idx_y2#6 +unsigned int render_dots::idx_y2#7 +unsigned int render_dots::idx_y2#8 +unsigned int render_dots::idx_y2#9 +__loadstore volatile unsigned int sin_x1_idx +__loadstore volatile unsigned int sin_x2_idx +__loadstore volatile unsigned int sin_y1_idx +__loadstore volatile unsigned int sin_y2_idx + +Adding number conversion cast (unumber) 3 in +Adding number conversion cast (unumber) $100 in +Adding number conversion cast (unumber) $100 in +Adding number conversion cast (unumber) $100 in +Adding number conversion cast (unumber) $100 in +Adding number conversion cast (unumber) 4 in memoryRemap::$1 = memoryRemap::remapBlocks#1 << 4 +Adding number conversion cast (unumber) $f in memoryRemap::$3 = memoryRemap::$2 & $f +Adding number conversion cast (unumber) memoryRemap::$3 in memoryRemap::$3 = memoryRemap::$2 & (unumber)$f +Adding number conversion cast (unumber) $f0 in memoryRemap::$6 = memoryRemap::remapBlocks#1 & $f0 +Adding number conversion cast (unumber) memoryRemap::$6 in memoryRemap::$6 = memoryRemap::remapBlocks#1 & (unumber)$f0 +Adding number conversion cast (unumber) $f in memoryRemap::$8 = memoryRemap::$7 & $f +Adding number conversion cast (unumber) memoryRemap::$8 in memoryRemap::$8 = memoryRemap::$7 & (unumber)$f +Adding number conversion cast (unumber) 1 in *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 +Adding number conversion cast (unumber) 0 in *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 +Adding number conversion cast (unumber) 0 in *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 +Adding number conversion cast (unumber) 0 in memoryRemap::remapBlocks#0 = 0 +Adding number conversion cast (unumber) 0 in memoryRemap::lowerPageOffset#0 = 0 +Adding number conversion cast (unumber) 0 in memoryRemap::upperPageOffset#0 = 0 +Adding number conversion cast (unumber) 0 in *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLA) = 0 +Adding number conversion cast (unumber) $40 in main::toSpritePtr1_sprite#0 = SPRITES+$40 +Adding number conversion cast (unumber) $40 in main::toSpritePtr1_$0 = main::toSpritePtr1_$1 / $40 +Adding number conversion cast (unumber) main::toSpritePtr1_$0 in main::toSpritePtr1_$0 = main::toSpritePtr1_$1 / (unumber)$40 +Adding number conversion cast (unumber) 0 in main::$13 = 0 * SIZEOF_UNSIGNED_INT +Adding number conversion cast (unumber) main::$13 in main::$13 = (unumber)0 * SIZEOF_UNSIGNED_INT +Adding number conversion cast (unumber) $80 in main::toSpritePtr2_sprite#0 = SPRITES+$80 +Adding number conversion cast (unumber) $40 in main::toSpritePtr2_$0 = main::toSpritePtr2_$1 / $40 +Adding number conversion cast (unumber) main::toSpritePtr2_$0 in main::toSpritePtr2_$0 = main::toSpritePtr2_$1 / (unumber)$40 +Adding number conversion cast (unumber) 1 in main::$14 = 1 * SIZEOF_UNSIGNED_INT +Adding number conversion cast (unumber) main::$14 in main::$14 = (unumber)1 * SIZEOF_UNSIGNED_INT +Adding number conversion cast (unumber) 0 in main::toSpritePtr3_sprite#0 = SPRITES+0 +Adding number conversion cast (unumber) $40 in main::toSpritePtr3_$0 = main::toSpritePtr3_$1 / $40 +Adding number conversion cast (unumber) main::toSpritePtr3_$0 in main::toSpritePtr3_$0 = main::toSpritePtr3_$1 / (unumber)$40 +Adding number conversion cast (unumber) 2 in main::$15 = 2 * SIZEOF_UNSIGNED_INT +Adding number conversion cast (unumber) main::$15 in main::$15 = (unumber)2 * SIZEOF_UNSIGNED_INT +Adding number conversion cast (unumber) 7 in *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_ENABLE) = 7 +Adding number conversion cast (unumber) $ff in *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_PRIORITY) = $ff +Adding number conversion cast (unumber) 0 in SPRITES_COLOR[0] = DARK_GREY +Adding number conversion cast (unumber) 1 in SPRITES_COLOR[1] = DARK_GREY +Adding number conversion cast (unumber) 2 in SPRITES_COLOR[2] = DARK_GREY +Adding number conversion cast (unumber) $e3 in SPRITES_YPOS[0] = $e3 +Adding number conversion cast (unumber) 0 in SPRITES_YPOS[0] = ((unumber)) $e3 +Adding number conversion cast (unumber) $e3 in SPRITES_YPOS[2] = $e3 +Adding number conversion cast (unumber) 2 in SPRITES_YPOS[2] = ((unumber)) $e3 +Adding number conversion cast (unumber) $e3 in SPRITES_YPOS[4] = $e3 +Adding number conversion cast (unumber) 4 in SPRITES_YPOS[4] = ((unumber)) $e3 +Adding number conversion cast (unumber) $2e in SPRITES_XPOS[0] = $2e +Adding number conversion cast (unumber) 0 in SPRITES_XPOS[0] = ((unumber)) $2e +Adding number conversion cast (unumber) $2e+$18 in SPRITES_XPOS[2] = $2e+$18 +Adding number conversion cast (unumber) 2 in SPRITES_XPOS[2] = ((unumber)) $2e+$18 +Adding number conversion cast (unumber) $19 in SPRITES_XPOS[4] = $19 +Adding number conversion cast (unumber) 4 in SPRITES_XPOS[4] = ((unumber)) $19 +Adding number conversion cast (unumber) 3 in *SPRITES_XMSB = 3 +Adding number conversion cast (unumber) $e3 in main::$8 = *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_RASTER) != $e3 +Adding number conversion cast (unumber) 1 in buffer = buffer ^ 1 +Adding number conversion cast (unumber) 0 in main::$9 = buffer == 0 +Adding number conversion cast (unumber) 0 in *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 +Adding number conversion cast (unumber) 0 in *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 +Adding number conversion cast (unumber) 0 in memset_dma::fill#0 = 0 +Adding number conversion cast (unumber) $28*$19*8 in memset_dma::num#0 = $28*$19*8 +Adding number conversion cast (unumber) $140 in init_plot::$0 = init_plot::i#2 < $140 +Adding number conversion cast (unumber) 7 in init_plot::$1 = init_plot::i#3 & 7 +Adding number conversion cast (unumber) init_plot::$1 in init_plot::$1 = init_plot::i#3 & (unumber)7 +Adding number conversion cast (unumber) 7 in init_plot::$2 = init_plot::$1 == 7 +Adding number conversion cast (unumber) $c8 in init_plot::gfx#1 = init_plot::gfx#3 + $c8 +Adding number conversion cast (unumber) 7 in plot::$2 = plot::x#1 & 7 +Adding number conversion cast (unumber) plot::$2 in plot::$2 = plot::x#1 & (unumber)7 +Adding number conversion cast (unumber) 1 in sin_x1_idx = sin_x1_idx + 1 +Adding number conversion cast (unumber) 1 in sin_x2_idx = sin_x2_idx - 1 +Adding number conversion cast (unumber) 1 in sin_y1_idx = sin_y1_idx - 1 +Adding number conversion cast (unumber) 1 in sin_y2_idx = sin_y2_idx + 1 +Adding number conversion cast (unumber) $600 in render_dots::$8 = render_dots::i#2 < $600 +Adding number conversion cast (unumber) $b in render_dots::idx_x1#1 = render_dots::idx_x1#4 - $b +Adding number conversion cast (unumber) 3 in render_dots::idx_x2#1 = render_dots::idx_x2#4 + 3 +Adding number conversion cast (unumber) 9 in render_dots::idx_y1#1 = render_dots::idx_y1#4 + 9 +Adding number conversion cast (unumber) 5 in render_dots::idx_y2#1 = render_dots::idx_y2#4 - 5 +Adding number conversion cast (unumber) $50 in *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO) = $50 +Adding number conversion cast (unumber) 0 in *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI) = 0 +Adding number conversion cast (unumber) $28 in *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT) = $28 +Adding number conversion cast (unumber) 0 in *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO) = 0 +Adding number conversion cast (unumber) 0 in *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 +Adding number conversion cast (unumber) $19 in graphics_mode::$2 = graphics_mode::y#2 < $19 +Adding number conversion cast (unumber) $28 in graphics_mode::$3 = graphics_mode::x#2 < $28 +Adding number conversion cast (unumber) $19 in graphics_mode::ch_x#1 = graphics_mode::ch_x#2 + $19 +Adding number conversion cast (unumber) $28 in graphics_mode::$7 = $28 * SIZEOF_UNSIGNED_INT +Adding number conversion cast (unumber) graphics_mode::$7 in graphics_mode::$7 = (unumber)$28 * SIZEOF_UNSIGNED_INT +Adding number conversion cast (unumber) $3e8 in graphics_mode::$4 = graphics_mode::i#2 < $3e8 +Adding number conversion cast (unumber) 0 in lpoke::val = 0 +Adding number conversion cast (unumber) 0 in *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = 0 +Adding number conversion cast (unumber) 0 in *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR) = 0 +Adding number conversion cast (unumber) 0 in memset_dma::fill#1 = 0 +Adding number conversion cast (unumber) $28*$19*8 in memset_dma::num#1 = $28*$19*8 +Adding number conversion cast (unumber) 0 in memset_dma::fill#2 = 0 +Adding number conversion cast (unumber) $28*$19*8 in memset_dma::num#2 = $28*$19*8 +Successful SSA optimization PassNAddNumberTypeConversions +Inlining cast *((char **)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (char *)memset_dma::dest#3 +Inlining cast *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = (unumber)1 +Inlining cast *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = (unumber)0 +Inlining cast *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = (unumber)0 +Inlining cast memoryRemap::remapBlocks#0 = (unumber)0 +Inlining cast memoryRemap::lowerPageOffset#0 = (unumber)0 +Inlining cast memoryRemap::upperPageOffset#0 = (unumber)0 +Inlining cast *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLA) = (unumber)0 +Inlining cast *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_ENABLE) = (unumber)7 +Inlining cast *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_PRIORITY) = (unumber)$ff +Inlining cast SPRITES_YPOS[(unumber)0] = (unumber)$e3 +Inlining cast SPRITES_YPOS[(unumber)2] = (unumber)$e3 +Inlining cast SPRITES_YPOS[(unumber)4] = (unumber)$e3 +Inlining cast SPRITES_XPOS[(unumber)0] = (unumber)$2e +Inlining cast SPRITES_XPOS[(unumber)2] = (unumber)$2e+$18 +Inlining cast SPRITES_XPOS[(unumber)4] = (unumber)$19 +Inlining cast *SPRITES_XMSB = (unumber)3 +Inlining cast *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = (unumber)0 +Inlining cast *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = (unumber)0 +Inlining cast memset_dma::fill#0 = (unumber)0 +Inlining cast memset_dma::num#0 = (unumber)$28*$19*8 +Inlining cast *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO) = (unumber)$50 +Inlining cast *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI) = (unumber)0 +Inlining cast *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT) = (unumber)$28 +Inlining cast *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO) = (unumber)0 +Inlining cast *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = (unumber)0 +Inlining cast lpoke::val = (unumber)0 +Inlining cast *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = (unumber)0 +Inlining cast *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR) = (unumber)0 +Inlining cast memset_dma::fill#1 = (unumber)0 +Inlining cast memset_dma::num#1 = (unumber)$28*$19*8 +Inlining cast memset_dma::fill#2 = (unumber)0 +Inlining cast memset_dma::num#2 = (unumber)$28*$19*8 +Successful SSA optimization Pass2InlineCast +Simplifying constant pointer cast (char *) 53248 +Simplifying constant pointer cast (char *) 53249 +Simplifying constant pointer cast (char *) 53264 +Simplifying constant pointer cast (char *) 53287 +Simplifying constant pointer cast (char *) 0 +Simplifying constant pointer cast (char *) 1 +Simplifying constant pointer cast (struct MEGA65_VICIV *) 53248 +Simplifying constant pointer cast (struct F018_DMAGIC *) 55040 +Simplifying constant pointer cast (char *) 51200 +Simplifying constant pointer cast (char *) 40960 +Simplifying constant pointer cast (char *) 28672 +Simplifying constant integer cast 3 +Simplifying constant integer cast $100 +Simplifying constant integer cast $100 +Simplifying constant integer cast $100 +Simplifying constant integer cast $100 +Simplifying constant integer cast 4 +Simplifying constant integer cast $f +Simplifying constant integer cast $f0 +Simplifying constant integer cast $f +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 +Simplifying constant integer cast $40 +Simplifying constant integer cast $40 +Simplifying constant integer cast 0 +Simplifying constant integer cast $80 +Simplifying constant integer cast $40 +Simplifying constant integer cast 1 +Simplifying constant integer cast 0 +Simplifying constant integer cast $40 +Simplifying constant integer cast 2 +Simplifying constant integer cast 7 +Simplifying constant integer cast $ff +Simplifying constant integer cast 0 +Simplifying constant integer cast 1 +Simplifying constant integer cast 2 +Simplifying constant integer cast $e3 +Simplifying constant integer cast 0 +Simplifying constant integer cast $e3 +Simplifying constant integer cast 2 +Simplifying constant integer cast $e3 +Simplifying constant integer cast 4 +Simplifying constant integer cast $2e +Simplifying constant integer cast 0 +Simplifying constant integer cast 2 +Simplifying constant integer cast $19 +Simplifying constant integer cast 4 +Simplifying constant integer cast 3 +Simplifying constant integer cast $e3 +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 $140 +Simplifying constant integer cast 7 +Simplifying constant integer cast 7 +Simplifying constant integer cast $c8 +Simplifying constant integer cast 7 +Simplifying constant integer cast 1 +Simplifying constant integer cast 1 +Simplifying constant integer cast 1 +Simplifying constant integer cast 1 +Simplifying constant integer cast $600 +Simplifying constant integer cast $b +Simplifying constant integer cast 3 +Simplifying constant integer cast 9 +Simplifying constant integer cast 5 +Simplifying constant integer cast $50 +Simplifying constant integer cast 0 +Simplifying constant integer cast $28 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast $19 +Simplifying constant integer cast $28 +Simplifying constant integer cast $19 +Simplifying constant integer cast $28 +Simplifying constant integer cast $3e8 +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) 3 +Finalized unsigned number type (unsigned int) $100 +Finalized unsigned number type (unsigned int) $100 +Finalized unsigned number type (unsigned int) $100 +Finalized unsigned number type (unsigned int) $100 +Finalized unsigned number type (char) 4 +Finalized unsigned number type (char) $f +Finalized unsigned number type (char) $f0 +Finalized unsigned number type (char) $f +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 unsigned number type (char) 0 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) $40 +Finalized unsigned number type (char) $40 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) $80 +Finalized unsigned number type (char) $40 +Finalized unsigned number type (char) 1 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) $40 +Finalized unsigned number type (char) 2 +Finalized unsigned number type (char) 7 +Finalized unsigned number type (char) $ff +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 1 +Finalized unsigned number type (char) 2 +Finalized unsigned number type (char) $e3 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) $e3 +Finalized unsigned number type (char) 2 +Finalized unsigned number type (char) $e3 +Finalized unsigned number type (char) 4 +Finalized unsigned number type (char) $2e +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 2 +Finalized unsigned number type (char) $19 +Finalized unsigned number type (char) 4 +Finalized unsigned number type (char) 3 +Finalized unsigned number type (char) $e3 +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 unsigned number type (char) 0 +Finalized unsigned number type (unsigned int) $140 +Finalized unsigned number type (char) 7 +Finalized unsigned number type (char) 7 +Finalized unsigned number type (char) $c8 +Finalized unsigned number type (char) 7 +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 (unsigned int) $600 +Finalized unsigned number type (char) $b +Finalized unsigned number type (char) 3 +Finalized unsigned number type (char) 9 +Finalized unsigned number type (char) 5 +Finalized unsigned number type (char) $50 +Finalized unsigned number type (char) 0 +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) $28 +Finalized unsigned number type (char) $19 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (unsigned int) $3e8 +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 +Successful SSA optimization PassNFinalizeNumberTypeConversions +Inferred type updated to char in memoryRemap::$3 = memoryRemap::$2 & $f +Inferred type updated to char in memoryRemap::$6 = memoryRemap::remapBlocks#1 & $f0 +Inferred type updated to char in memoryRemap::$8 = memoryRemap::$7 & $f +Inferred type updated to unsigned int in main::toSpritePtr1_$0 = main::toSpritePtr1_$1 / $40 +Inferred type updated to char in main::$13 = 0 * SIZEOF_UNSIGNED_INT +Inferred type updated to unsigned int in main::toSpritePtr2_$0 = main::toSpritePtr2_$1 / $40 +Inferred type updated to char in main::$14 = 1 * SIZEOF_UNSIGNED_INT +Inferred type updated to unsigned int in main::toSpritePtr3_$0 = main::toSpritePtr3_$1 / $40 +Inferred type updated to char in main::$15 = 2 * SIZEOF_UNSIGNED_INT +Inferred type updated to char in init_plot::$1 = init_plot::i#3 & 7 +Inferred type updated to char in plot::$2 = plot::x#1 & 7 +Inferred type updated to char in graphics_mode::$7 = $28 * SIZEOF_UNSIGNED_INT +Inversing boolean not [124] init_plot::$3 = init_plot::$1 != 7 from [123] init_plot::$2 = init_plot::$1 == 7 +Inversing boolean not [141] render_dots::$1 = sin_x1_idx <= SINX1_SIZE from [140] render_dots::$0 = sin_x1_idx > SINX1_SIZE +Inversing boolean not [147] render_dots::$3 = sin_x2_idx <= SINX2_SIZE from [146] render_dots::$2 = sin_x2_idx > SINX2_SIZE +Inversing boolean not [155] render_dots::$5 = sin_y1_idx <= SINY1_SIZE from [154] render_dots::$4 = sin_y1_idx > SINY1_SIZE +Inversing boolean not [163] render_dots::$7 = sin_y2_idx <= SINY2_SIZE from [162] render_dots::$6 = sin_y2_idx > SINY2_SIZE +Inversing boolean not [185] render_dots::$13 = render_dots::idx_x1#1 <= SINX1_SIZE from [184] render_dots::$12 = render_dots::idx_x1#1 > SINX1_SIZE +Inversing boolean not [190] render_dots::$15 = render_dots::idx_x2#1 <= SINX2_SIZE from [189] render_dots::$14 = render_dots::idx_x2#1 > SINX2_SIZE +Inversing boolean not [197] render_dots::$17 = render_dots::idx_y1#1 <= SINY1_SIZE from [196] render_dots::$16 = render_dots::idx_y1#1 > SINY1_SIZE +Inversing boolean not [204] render_dots::$19 = render_dots::idx_y2#1 <= SINY2_SIZE from [203] render_dots::$18 = render_dots::idx_y2#1 > SINY2_SIZE +Successful SSA optimization Pass2UnaryNotSimplification +Alias main::toSpritePtr1_sprite#0 = main::toSpritePtr1_sprite#1 +Alias main::toSpritePtr1_return#0 = main::toSpritePtr1_return#2 main::toSpritePtr1_return#1 main::toSpritePtr1_return#3 main::$3 +Alias main::toSpritePtr2_sprite#0 = main::toSpritePtr2_sprite#1 +Alias main::toSpritePtr2_return#0 = main::toSpritePtr2_return#2 main::toSpritePtr2_return#1 main::toSpritePtr2_return#3 main::$4 +Alias main::toSpritePtr3_sprite#0 = main::toSpritePtr3_sprite#1 +Alias main::toSpritePtr3_return#0 = main::toSpritePtr3_return#2 main::toSpritePtr3_return#1 main::toSpritePtr3_return#3 main::$5 +Alias init_plot::i#2 = init_plot::i#3 init_plot::i#5 +Alias init_plot::gfx#2 = init_plot::gfx#4 init_plot::gfx#3 +Alias render_dots::idx_x1#0 = render_dots::idx_x1#21 +Alias render_dots::idx_x1#17 = render_dots::idx_x1#18 +Alias render_dots::idx_x2#0 = render_dots::idx_x2#19 +Alias render_dots::idx_x1#13 = render_dots::idx_x1#14 +Alias render_dots::idx_x2#15 = render_dots::idx_x2#16 +Alias render_dots::idx_y1#0 = render_dots::idx_y1#17 +Alias render_dots::idx_x1#10 = render_dots::idx_x1#9 +Alias render_dots::idx_x2#11 = render_dots::idx_x2#12 +Alias render_dots::idx_y1#13 = render_dots::idx_y1#14 +Alias render_dots::idx_y2#0 = render_dots::idx_y2#13 +Alias render_dots::idx_x1#3 = render_dots::idx_x1#6 render_dots::idx_x1#4 +Alias render_dots::idx_x2#3 = render_dots::idx_x2#6 render_dots::idx_x2#8 render_dots::idx_x2#7 +Alias render_dots::idx_y1#11 = render_dots::idx_y1#3 render_dots::idx_y1#6 render_dots::idx_y1#12 +Alias render_dots::idx_y2#14 = render_dots::idx_y2#3 render_dots::idx_y2#6 render_dots::idx_y2#15 +Alias render_dots::i#10 = render_dots::i#12 render_dots::i#2 render_dots::i#11 +Alias plot::x#0 = render_dots::$9 +Alias plot::y#0 = render_dots::$10 +Alias render_dots::idx_x1#1 = render_dots::idx_x1#5 +Alias render_dots::idx_x2#1 = render_dots::idx_x2#5 +Alias render_dots::idx_y1#7 = render_dots::idx_y1#8 +Alias render_dots::idx_y2#11 = render_dots::idx_y2#12 +Alias render_dots::i#8 = render_dots::i#9 +Alias render_dots::idx_x1#19 = render_dots::idx_x1#20 +Alias render_dots::idx_y1#1 = render_dots::idx_y1#5 +Alias render_dots::idx_y2#7 = render_dots::idx_y2#8 +Alias render_dots::i#6 = render_dots::i#7 +Alias render_dots::idx_x1#15 = render_dots::idx_x1#16 +Alias render_dots::idx_x2#17 = render_dots::idx_x2#18 +Alias render_dots::idx_y2#1 = render_dots::idx_y2#5 +Alias render_dots::i#4 = render_dots::i#5 +Alias render_dots::idx_x1#11 = render_dots::idx_x1#12 +Alias render_dots::idx_x2#13 = render_dots::idx_x2#14 +Alias render_dots::idx_y1#15 = render_dots::idx_y1#16 +Alias graphics_mode::ch#2 = graphics_mode::ch#4 graphics_mode::ch_x#0 +Alias graphics_mode::screen#5 = graphics_mode::screen#6 +Alias graphics_mode::y#2 = graphics_mode::y#5 +Alias graphics_mode::x#2 = graphics_mode::x#3 +Alias graphics_mode::ch_x#2 = graphics_mode::ch_x#3 +Alias graphics_mode::screen#2 = graphics_mode::screen#4 graphics_mode::screen#3 +Alias graphics_mode::ch#3 = graphics_mode::ch#6 graphics_mode::ch#5 +Alias graphics_mode::y#3 = graphics_mode::y#6 graphics_mode::y#4 +Alias graphics_mode::cols#3 = graphics_mode::cols#6 graphics_mode::cols#4 +Alias graphics_mode::i#2 = graphics_mode::i#5 graphics_mode::i#4 graphics_mode::i#3 +Alias graphics_mode::cols#1 = graphics_mode::cols#5 +Successful SSA optimization Pass2AliasElimination +Alias init_plot::i#2 = init_plot::i#4 +Alias render_dots::idx_x1#0 = render_dots::idx_x1#17 render_dots::idx_x1#13 render_dots::idx_x1#10 render_dots::idx_x1#8 +Alias render_dots::idx_x2#0 = render_dots::idx_x2#15 render_dots::idx_x2#11 render_dots::idx_x2#10 +Alias render_dots::idx_y1#0 = render_dots::idx_y1#13 render_dots::idx_y1#10 +Alias render_dots::idx_y2#0 = render_dots::idx_y2#10 +Alias render_dots::idx_x2#3 = render_dots::idx_x2#4 +Alias render_dots::idx_y1#11 = render_dots::idx_y1#7 render_dots::idx_y1#4 +Alias render_dots::idx_y2#11 = render_dots::idx_y2#14 render_dots::idx_y2#7 render_dots::idx_y2#4 +Alias render_dots::i#10 = render_dots::i#8 render_dots::i#6 render_dots::i#4 render_dots::i#3 +Alias render_dots::idx_x1#11 = render_dots::idx_x1#15 render_dots::idx_x1#19 render_dots::idx_x1#7 +Alias render_dots::idx_x2#13 = render_dots::idx_x2#17 render_dots::idx_x2#9 +Alias render_dots::idx_y1#15 = render_dots::idx_y1#9 +Successful SSA optimization Pass2AliasElimination +Identical Phi Values memoryRemap::lowerPageOffset#1 memoryRemap::lowerPageOffset#0 +Identical Phi Values memoryRemap::remapBlocks#1 memoryRemap::remapBlocks#0 +Identical Phi Values memoryRemap::upperPageOffset#1 memoryRemap::upperPageOffset#0 +Identical Phi Values plot::x#1 plot::x#0 +Identical Phi Values plot::y#1 plot::y#0 +Identical Phi Values graphics_mode::screen#2 graphics_mode::screen#5 +Identical Phi Values graphics_mode::ch#3 graphics_mode::ch#2 +Identical Phi Values graphics_mode::y#3 graphics_mode::y#2 +Successful SSA optimization Pass2IdenticalPhiElimination +Simple Condition main::$8 [77] if(*((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_RASTER)!=$e3) goto main::@1 +Simple Condition main::$9 [80] if(buffer==0) goto main::@4 +Simple Condition init_plot::$0 [103] if(init_plot::i#2<$140) goto init_plot::@2 +Simple Condition init_plot::$3 [108] if(init_plot::$1!=7) goto init_plot::@3 +Simple Condition render_dots::$1 [123] if(sin_x1_idx<=SINX1_SIZE) goto render_dots::@1 +Simple Condition render_dots::$3 [127] if(sin_x2_idx<=SINX2_SIZE) goto render_dots::@2 +Simple Condition render_dots::$5 [132] if(sin_y1_idx<=SINY1_SIZE) goto render_dots::@3 +Simple Condition render_dots::$7 [137] if(sin_y2_idx<=SINY2_SIZE) goto render_dots::@4 +Simple Condition render_dots::$8 [143] if(render_dots::i#10<$600) goto render_dots::@10 +Simple Condition render_dots::$13 [151] if(render_dots::idx_x1#1<=SINX1_SIZE) goto render_dots::@11 +Simple Condition render_dots::$15 [155] if(render_dots::idx_x2#1<=SINX2_SIZE) goto render_dots::@12 +Simple Condition render_dots::$17 [160] if(render_dots::idx_y1#1<=SINY1_SIZE) goto render_dots::@13 +Simple Condition render_dots::$19 [165] if(render_dots::idx_y2#1<=SINY2_SIZE) goto render_dots::@14 +Simple Condition graphics_mode::$2 [187] if(graphics_mode::y#2<$19) goto graphics_mode::@2 +Simple Condition graphics_mode::$3 [193] if(graphics_mode::x#2<$28) goto graphics_mode::@5 +Simple Condition graphics_mode::$4 [204] if(graphics_mode::i#2<$3e8) goto graphics_mode::@8 +Successful SSA optimization Pass2ConditionalJumpSimplification +Constant right-side identified [47] main::$13 = 0 * SIZEOF_UNSIGNED_INT +Constant right-side identified [53] main::$14 = 1 * SIZEOF_UNSIGNED_INT +Constant right-side identified [59] main::$15 = 2 * SIZEOF_UNSIGNED_INT +Constant right-side identified [70] SPRITES_XPOS[2] = (unumber)$2e+$18 +Constant right-side identified [92] memset_dma::num#0 = (unumber)$28*$19*8 +Constant right-side identified [198] graphics_mode::$7 = $28 * SIZEOF_UNSIGNED_INT +Constant right-side identified [218] memset_dma::num#1 = (unumber)$28*$19*8 +Constant right-side identified [222] memset_dma::num#2 = (unumber)$28*$19*8 +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant memoryRemap::remapBlocks#0 = 0 +Constant memoryRemap::lowerPageOffset#0 = 0 +Constant memoryRemap::upperPageOffset#0 = 0 +Constant main::toSpritePtr1_sprite#0 = SPRITES+$40 +Constant main::$13 = 0*SIZEOF_UNSIGNED_INT +Constant main::toSpritePtr2_sprite#0 = SPRITES+$80 +Constant main::$14 = 1*SIZEOF_UNSIGNED_INT +Constant main::toSpritePtr3_sprite#0 = SPRITES+0 +Constant main::$15 = 2*SIZEOF_UNSIGNED_INT +Constant memset_dma::fill#0 = 0 +Constant memset_dma::num#0 = (unumber)$28*$19*8 +Constant init_plot::gfx#0 = 0 +Constant init_plot::i#0 = 0 +Constant render_dots::i#0 = 0 +Constant graphics_mode::screen#0 = (unsigned int *)SCREEN +Constant graphics_mode::ch#0 = 0 +Constant graphics_mode::y#0 = 0 +Constant graphics_mode::x#0 = 0 +Constant graphics_mode::cols#0 = $ff80000 +Constant graphics_mode::i#0 = 0 +Constant graphics_mode::$7 = $28*SIZEOF_UNSIGNED_INT +Constant memset_dma::dest#1 = (void *)GRAPHICS1 +Constant memset_dma::fill#1 = 0 +Constant memset_dma::num#1 = (unumber)$28*$19*8 +Constant memset_dma::dest#2 = (void *)GRAPHICS2 +Constant memset_dma::fill#2 = 0 +Constant memset_dma::num#2 = (unumber)$28*$19*8 +Successful SSA optimization Pass2ConstantIdentification +Constant main::toSpritePtr1_$1 = (unsigned int)main::toSpritePtr1_sprite#0 +Constant main::toSpritePtr2_$1 = (unsigned int)main::toSpritePtr2_sprite#0 +Constant main::toSpritePtr3_$1 = (unsigned int)main::toSpritePtr3_sprite#0 +Successful SSA optimization Pass2ConstantIdentification +Converting *(pointer+n) to pointer[n] [118] *plot::gfx#0 = *plot::gfx#0 | GFX_BIT[plot::$2] -- plot::$0[plot::y#0] +Converting *(pointer+n) to pointer[n] [118] *plot::gfx#0 = plot::$0[plot::y#0] | GFX_BIT[plot::$2] -- plot::$0[plot::y#0] +Successful SSA optimization Pass2InlineDerefIdx +De-inlining pointer[w] to *(pointer+w) [105] GFX_OFFSET[init_plot::$4] = init_plot::gfx#2 +De-inlining pointer[w] to *(pointer+w) [115] plot::$0 = graphics_render + GFX_OFFSET[plot::$3] +De-inlining pointer[w] to *(pointer+w) [146] plot::x#0 = SINX1[render_dots::$20] + SINX2[render_dots::$21] +De-inlining pointer[w] to *(pointer+w) [146] plot::x#0 = *render_dots::$22 + SINX2[render_dots::$21] +De-inlining pointer[w] to *(pointer+w) [147] plot::y#0 = SINY1[render_dots::idx_y1#11] + SINY2[render_dots::idx_y2#11] +De-inlining pointer[w] to *(pointer+w) [147] plot::y#0 = *render_dots::$24 + SINY2[render_dots::idx_y2#11] +Successful SSA optimization Pass2DeInlineWordDerefIdx +Simplifying constant evaluating to zero 0*SIZEOF_UNSIGNED_INT in +Simplifying constant evaluating to zero byte0 GRAPHICS1 in [81] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = byte0 GRAPHICS1 +Simplifying constant evaluating to zero byte0 GRAPHICS2 in [85] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = byte0 GRAPHICS2 +Simplifying constant evaluating to zero byte0 SCREEN in [176] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO) = byte0 SCREEN +Simplifying constant evaluating to zero byte0 GRAPHICS1 in [179] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = byte0 GRAPHICS1 +Successful SSA optimization PassNSimplifyConstantZero +Simplifying expression containing zero SPRITES in +Simplifying expression containing zero (char *)DMA in [22] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRLSBTRIG) = byte0 &memset_dma_command +Simplifying expression containing zero SPRITE_PTRS in [48] SPRITE_PTRS[main::$13] = main::toSpritePtr1_return#0 +Simplifying expression containing zero SPRITES_COLOR in [63] SPRITES_COLOR[0] = DARK_GREY +Simplifying expression containing zero SPRITES_YPOS in [66] SPRITES_YPOS[0] = $e3 +Simplifying expression containing zero SPRITES_XPOS in [69] SPRITES_XPOS[0] = $2e +Successful SSA optimization PassNSimplifyExpressionWithZero +Removing unused block main::@return +Successful SSA optimization Pass2EliminateUnusedBlocks +Eliminating unused variable plot::gfx#0 and assignment [95] plot::gfx#0 = plot::$0 + plot::y#0 +Eliminating unused constant main::$13 +Eliminating unused constant OFFSET_STRUCT_F018_DMAGIC_ADDRLSBTRIG +Successful SSA optimization PassNEliminateUnusedVars +Constant right-side identified [0] memoryRemap::aVal = byte0 memoryRemap::lowerPageOffset#0 +Constant right-side identified [1] memoryRemap::$1 = memoryRemap::remapBlocks#0 << 4 +Constant right-side identified [2] memoryRemap::$2 = byte1 memoryRemap::lowerPageOffset#0 +Constant right-side identified [5] memoryRemap::yVal = byte0 memoryRemap::upperPageOffset#0 +Constant right-side identified [6] memoryRemap::$6 = memoryRemap::remapBlocks#0 & $f0 +Constant right-side identified [7] memoryRemap::$7 = byte1 memoryRemap::upperPageOffset#0 +Constant right-side identified [39] main::toSpritePtr1_$0 = main::toSpritePtr1_$1 / $40 +Constant right-side identified [42] main::toSpritePtr2_$0 = main::toSpritePtr2_$1 / $40 +Constant right-side identified [45] main::toSpritePtr3_$0 = main::toSpritePtr3_$1 / $40 +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant memoryRemap::$1 = memoryRemap::remapBlocks#0<<4 +Constant memoryRemap::$2 = byte1 memoryRemap::lowerPageOffset#0 +Constant memoryRemap::$6 = memoryRemap::remapBlocks#0&$f0 +Constant memoryRemap::$7 = byte1 memoryRemap::upperPageOffset#0 +Constant main::toSpritePtr1_$0 = main::toSpritePtr1_$1/$40 +Constant main::toSpritePtr2_$0 = main::toSpritePtr2_$1/$40 +Constant main::toSpritePtr3_$0 = main::toSpritePtr3_$1/$40 +Successful SSA optimization Pass2ConstantIdentification +Constant main::toSpritePtr1_return#0 = (char)main::toSpritePtr1_$0 +Constant main::toSpritePtr2_return#0 = (char)main::toSpritePtr2_$0 +Constant main::toSpritePtr3_return#0 = (char)main::toSpritePtr3_$0 +Successful SSA optimization Pass2ConstantIdentification +Simplifying constant evaluating to zero memoryRemap::remapBlocks#0<<4 in +Simplifying constant evaluating to zero byte1 memoryRemap::lowerPageOffset#0 in +Simplifying constant evaluating to zero memoryRemap::remapBlocks#0&$f0 in +Simplifying constant evaluating to zero byte1 memoryRemap::upperPageOffset#0 in +Simplifying constant evaluating to zero byte0 memoryRemap::lowerPageOffset#0 in [0] memoryRemap::aVal = byte0 memoryRemap::lowerPageOffset#0 +Simplifying constant evaluating to zero byte0 memoryRemap::upperPageOffset#0 in [5] memoryRemap::yVal = byte0 memoryRemap::upperPageOffset#0 +Successful SSA optimization PassNSimplifyConstantZero +Simplifying expression containing zero memoryRemap::$3 in [4] memoryRemap::xVal = memoryRemap::$1 | memoryRemap::$3 +Simplifying expression containing zero memoryRemap::$8 in [9] memoryRemap::zVal = memoryRemap::$6 | memoryRemap::$8 +Successful SSA optimization PassNSimplifyExpressionWithZero +Eliminating unused constant memoryRemap::remapBlocks#0 +Eliminating unused constant memoryRemap::lowerPageOffset#0 +Eliminating unused constant memoryRemap::upperPageOffset#0 +Eliminating unused constant memoryRemap::$1 +Eliminating unused constant memoryRemap::$6 +Successful SSA optimization PassNEliminateUnusedVars +Alias candidate removed (volatile)memoryRemap::xVal = memoryRemap::$3 +Alias candidate removed (volatile)memoryRemap::zVal = memoryRemap::$8 +Constant right-side identified [1] memoryRemap::$3 = memoryRemap::$2 & $f +Constant right-side identified [4] memoryRemap::$8 = memoryRemap::$7 & $f +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant memoryRemap::$3 = memoryRemap::$2&$f +Constant memoryRemap::$8 = memoryRemap::$7&$f +Successful SSA optimization Pass2ConstantIdentification +Simplifying constant evaluating to zero memoryRemap::$2&$f in +Simplifying constant evaluating to zero memoryRemap::$7&$f in +Successful SSA optimization PassNSimplifyConstantZero +Eliminating unused constant memoryRemap::$2 +Eliminating unused constant memoryRemap::$7 +Successful SSA optimization PassNEliminateUnusedVars +Rewriting multiplication to use shift [71] init_plot::$4 = init_plot::i#2 * SIZEOF_UNSIGNED_INT +Rewriting multiplication to use shift [80] plot::$3 = plot::x#0 * SIZEOF_UNSIGNED_INT +Rewriting multiplication to use shift [104] render_dots::$20 = render_dots::idx_x1#3 * SIZEOF_UNSIGNED_INT +Rewriting multiplication to use shift [105] render_dots::$21 = render_dots::idx_x2#3 * SIZEOF_UNSIGNED_INT +Rewriting multiplication to use shift [146] graphics_mode::$8 = graphics_mode::x#2 * SIZEOF_UNSIGNED_INT +Successful SSA optimization Pass2MultiplyToShiftRewriting +Inlining constant with var siblings memset_dma::fill#0 +Inlining constant with var siblings memset_dma::num#0 +Inlining constant with var siblings memset_dma::dest#1 +Inlining constant with var siblings memset_dma::fill#1 +Inlining constant with var siblings memset_dma::num#1 +Inlining constant with var siblings memset_dma::dest#2 +Inlining constant with var siblings memset_dma::fill#2 +Inlining constant with var siblings memset_dma::num#2 +Inlining constant with var siblings init_plot::gfx#0 +Inlining constant with var siblings init_plot::i#0 +Inlining constant with var siblings render_dots::i#0 +Inlining constant with var siblings graphics_mode::screen#0 +Inlining constant with var siblings graphics_mode::ch#0 +Inlining constant with var siblings graphics_mode::y#0 +Inlining constant with var siblings graphics_mode::x#0 +Inlining constant with var siblings graphics_mode::cols#0 +Inlining constant with var siblings graphics_mode::i#0 +Constant inlined memset_dma::fill#2 = 0 +Constant inlined main::toSpritePtr3_$1 = (unsigned int)SPRITES +Constant inlined memset_dma::num#0 = (unsigned int)$28*$19*8 +Constant inlined main::toSpritePtr1_$0 = (unsigned int)main::toSpritePtr1_sprite#0/$40 +Constant inlined memset_dma::num#2 = (unsigned int)$28*$19*8 +Constant inlined main::toSpritePtr3_$0 = (unsigned int)SPRITES/$40 +Constant inlined memset_dma::num#1 = (unsigned int)$28*$19*8 +Constant inlined render_dots::i#0 = 0 +Constant inlined main::$14 = 1*SIZEOF_UNSIGNED_INT +Constant inlined main::$15 = 2*SIZEOF_UNSIGNED_INT +Constant inlined memset_dma::dest#1 = (void *)GRAPHICS1 +Constant inlined graphics_mode::$7 = $28*SIZEOF_UNSIGNED_INT +Constant inlined memset_dma::dest#2 = (void *)GRAPHICS2 +Constant inlined memset_dma::fill#1 = 0 +Constant inlined memset_dma::fill#0 = 0 +Constant inlined graphics_mode::ch#0 = 0 +Constant inlined graphics_mode::y#0 = 0 +Constant inlined graphics_mode::x#0 = 0 +Constant inlined main::toSpritePtr1_$1 = (unsigned int)main::toSpritePtr1_sprite#0 +Constant inlined main::toSpritePtr3_sprite#0 = SPRITES +Constant inlined graphics_mode::screen#0 = (unsigned int *)SCREEN +Constant inlined graphics_mode::i#0 = 0 +Constant inlined init_plot::i#0 = 0 +Constant inlined main::toSpritePtr2_$1 = (unsigned int)main::toSpritePtr2_sprite#0 +Constant inlined main::toSpritePtr2_$0 = (unsigned int)main::toSpritePtr2_sprite#0/$40 +Constant inlined init_plot::gfx#0 = 0 +Constant inlined graphics_mode::cols#0 = $ff80000 +Constant inlined memoryRemap::$3 = 0 +Constant inlined memoryRemap::$8 = 0 +Successful SSA optimization Pass2ConstantInlining +Consolidated array index constant in *(SPRITE_PTRS+1*SIZEOF_UNSIGNED_INT) +Consolidated array index constant in *(SPRITE_PTRS+2*SIZEOF_UNSIGNED_INT) +Consolidated array index constant in *(SPRITES_COLOR+1) +Consolidated array index constant in *(SPRITES_COLOR+2) +Consolidated array index constant in *(SPRITES_YPOS+2) +Consolidated array index constant in *(SPRITES_YPOS+4) +Consolidated array index constant in *(SPRITES_XPOS+2) +Consolidated array index constant in *(SPRITES_XPOS+4) +Successful SSA optimization Pass2ConstantAdditionElimination +Identical Phi Values memset_dma::num#3 (unsigned int)$28*$19*8 +Identical Phi Values memset_dma::fill#3 0 +Successful SSA optimization Pass2IdenticalPhiElimination +Constant right-side identified [9] *((char **)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (char *)0 +Successful SSA optimization Pass2ConstantRValueConsolidation +Finalized unsigned number type (char) 8 +Finalized unsigned number type (char) 8 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (char) 0 +Finalized unsigned number type (unsigned int) $5000 +Finalized unsigned number type (char) $c0 +Finalized unsigned number type (char) 8 +Finalized unsigned number type (char) 8 +Finalized unsigned number type (char) 8 +Finalized unsigned number type (unsigned int) $140 +Finalized unsigned number type (unsigned int) $140 +Finalized unsigned number type (char) $28 +Finalized unsigned number type (char) $19 +Finalized unsigned number type (char) 8 +Finalized unsigned number type (char) $2e +Finalized unsigned number type (char) $18 +Successful SSA optimization PassNFinalizeNumberTypeConversions +Simplifying constant integer cast $2e+$18 +Successful SSA optimization PassNCastSimplification +Added new block during phi lifting init_plot::@5(between init_plot::@2 and init_plot::@3) +Added new block during phi lifting render_dots::@20(between render_dots::@19 and render_dots::@11) +Added new block during phi lifting render_dots::@21(between render_dots::@11 and render_dots::@12) +Added new block during phi lifting render_dots::@22(between render_dots::@12 and render_dots::@13) +Added new block during phi lifting render_dots::@23(between render_dots::@13 and render_dots::@14) +Adding NOP phi() at start of __start +Adding NOP phi() at start of __start::@1 +Adding NOP phi() at start of __start::@2 +Adding NOP phi() at start of main +Adding NOP phi() at start of main::@6 +Adding NOP phi() at start of main::toSpritePtr1 +Adding NOP phi() at start of main::toSpritePtr1_@return +Adding NOP phi() at start of main::toSpritePtr2 +Adding NOP phi() at start of main::toSpritePtr2_@return +Adding NOP phi() at start of main::toSpritePtr3 +Adding NOP phi() at start of main::toSpritePtr3_@return +Adding NOP phi() at start of graphics_mode::@3 +Adding NOP phi() at start of graphics_mode::@12 +Adding NOP phi() at start of graphics_mode::@13 +Adding NOP phi() at start of init_plot +CALL GRAPH +Calls in [__start] to main:8 +Calls in [main] to memoryRemap:14 graphics_mode:22 init_plot:47 null:49 memset_dma:60 render_dots:62 null:64 +Calls in [graphics_mode] to memset_dma:93 memset_dma:95 lpoke:100 lpoke:104 +Calls in [render_dots] to plot:183 + +Created 20 initial phi equivalence classes +Coalesced [59] memset_dma::dest#4 = memset_dma::dest#0 +Coalesced [107] graphics_mode::i#6 = graphics_mode::i#1 +Coalesced [108] graphics_mode::cols#7 = graphics_mode::cols#2 +Not coalescing [109] graphics_mode::ch_x#4 = graphics_mode::ch#2 +Coalesced [115] graphics_mode::y#7 = graphics_mode::y#1 +Coalesced [116] graphics_mode::ch#7 = graphics_mode::ch#1 +Coalesced [117] graphics_mode::screen#7 = graphics_mode::screen#1 +Coalesced [122] graphics_mode::x#4 = graphics_mode::x#1 +Coalesced [123] graphics_mode::ch_x#5 = graphics_mode::ch_x#1 +Coalesced [134] init_plot::gfx#8 = init_plot::gfx#1 +Coalesced [137] init_plot::i#6 = init_plot::i#1 +Coalesced [138] init_plot::gfx#6 = init_plot::gfx#5 +Coalesced (already) [139] init_plot::gfx#7 = init_plot::gfx#2 +Coalesced [168] render_dots::idx_x1#23 = render_dots::idx_x1#0 +Coalesced [169] render_dots::idx_x2#21 = render_dots::idx_x2#0 +Coalesced [170] render_dots::idx_y1#19 = render_dots::idx_y1#0 +Coalesced [171] render_dots::idx_y2#17 = render_dots::idx_y2#0 +Coalesced [187] render_dots::idx_x1#24 = render_dots::idx_x1#2 +Coalesced [192] render_dots::idx_x2#23 = render_dots::idx_x2#2 +Coalesced [197] render_dots::idx_y1#21 = render_dots::idx_y1#2 +Coalesced [202] render_dots::idx_y2#19 = render_dots::idx_y2#2 +Coalesced [205] render_dots::i#13 = render_dots::i#1 +Coalesced [206] render_dots::idx_x1#22 = render_dots::idx_x1#11 +Coalesced [207] render_dots::idx_x2#20 = render_dots::idx_x2#13 +Coalesced [208] render_dots::idx_y1#18 = render_dots::idx_y1#15 +Coalesced [209] render_dots::idx_y2#16 = render_dots::idx_y2#9 +Coalesced [210] render_dots::idx_y2#18 = render_dots::idx_y2#1 +Coalesced [211] render_dots::idx_y1#20 = render_dots::idx_y1#1 +Coalesced [212] render_dots::idx_x2#22 = render_dots::idx_x2#1 +Coalesced [213] render_dots::idx_x1#25 = render_dots::idx_x1#1 +Coalesced down to 15 phi equivalence classes +Culled Empty Block label __start::@2 +Culled Empty Block label main::toSpritePtr1_@return +Culled Empty Block label main::toSpritePtr2_@return +Culled Empty Block label main::toSpritePtr3_@return +Culled Empty Block label graphics_mode::@3 +Culled Empty Block label graphics_mode::@13 +Culled Empty Block label init_plot::@5 +Culled Empty Block label render_dots::@4 +Culled Empty Block label render_dots::@23 +Culled Empty Block label render_dots::@22 +Culled Empty Block label render_dots::@21 +Culled Empty Block label render_dots::@20 +Renumbering block render_dots::@5 to render_dots::@4 +Renumbering block render_dots::@6 to render_dots::@5 +Renumbering block render_dots::@7 to render_dots::@6 +Renumbering block render_dots::@8 to render_dots::@7 +Renumbering block render_dots::@9 to render_dots::@8 +Renumbering block render_dots::@10 to render_dots::@9 +Renumbering block render_dots::@11 to render_dots::@10 +Renumbering block render_dots::@12 to render_dots::@11 +Renumbering block render_dots::@13 to render_dots::@12 +Renumbering block render_dots::@14 to render_dots::@13 +Renumbering block render_dots::@15 to render_dots::@14 +Renumbering block render_dots::@16 to render_dots::@15 +Renumbering block render_dots::@17 to render_dots::@16 +Renumbering block render_dots::@18 to render_dots::@17 +Renumbering block render_dots::@19 to render_dots::@18 +Renumbering block graphics_mode::@4 to graphics_mode::@3 +Renumbering block graphics_mode::@5 to graphics_mode::@4 +Renumbering block graphics_mode::@6 to graphics_mode::@5 +Renumbering block graphics_mode::@7 to graphics_mode::@6 +Renumbering block graphics_mode::@8 to graphics_mode::@7 +Renumbering block graphics_mode::@9 to graphics_mode::@8 +Renumbering block graphics_mode::@10 to graphics_mode::@9 +Renumbering block graphics_mode::@11 to graphics_mode::@10 +Renumbering block graphics_mode::@12 to graphics_mode::@11 +Adding NOP phi() at start of __start +Adding NOP phi() at start of __start::@1 +Adding NOP phi() at start of main +Adding NOP phi() at start of main::@6 +Adding NOP phi() at start of main::toSpritePtr1 +Adding NOP phi() at start of main::toSpritePtr2 +Adding NOP phi() at start of main::toSpritePtr3 +Adding NOP phi() at start of graphics_mode::@11 +Adding NOP phi() at start of init_plot + +FINAL CONTROL FLOW GRAPH + +void __start() +__start: scope:[__start] from + [0] phi() + to:__start::__init1 +__start::__init1: scope:[__start] from __start + [1] buffer = 0 + [2] graphics_render = GRAPHICS1 + [3] sin_x1_idx = 0 + [4] sin_x2_idx = 0 + [5] sin_y1_idx = 0 + [6] sin_y2_idx = 0 + to:__start::@1 +__start::@1: scope:[__start] from __start::__init1 + [7] phi() + [8] call main + to:__start::@return +__start::@return: scope:[__start] from __start::@1 + [9] return + to:@return + +void main() +main: scope:[main] from __start::@1 + [10] phi() + to:main::SEI1 +main::SEI1: scope:[main] from main + asm { sei } + to:main::@6 +main::@6: scope:[main] from main::SEI1 + [12] phi() + [13] call memoryRemap + to:main::@10 +main::@10: scope:[main] from main::@6 + [14] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK + [15] *PROCPORT = PROCPORT_RAM_IO + [16] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = VICIV_KEY_M65_A + [17] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = VICIV_KEY_M65_B + [18] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLA) = 0 + [19] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) | VICIV_FAST + [20] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) | VICIV_VFAST + [21] call graphics_mode + to:main::@11 +main::@11: scope:[main] from main::@10 + [22] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOLO) = byte0 SPRITE_PTRS + [23] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOHI) = byte1 SPRITE_PTRS + [24] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_HILO) = VICIV_SPRPTR16 + to:main::toSpritePtr1 +main::toSpritePtr1: scope:[main] from main::@11 + [25] phi() + to:main::@7 +main::@7: scope:[main] from main::toSpritePtr1 + [26] *SPRITE_PTRS = main::toSpritePtr1_return#0 + to:main::toSpritePtr2 +main::toSpritePtr2: scope:[main] from main::@7 + [27] phi() + to:main::@8 +main::@8: scope:[main] from main::toSpritePtr2 + [28] *(SPRITE_PTRS+1*SIZEOF_UNSIGNED_INT) = main::toSpritePtr2_return#0 + to:main::toSpritePtr3 +main::toSpritePtr3: scope:[main] from main::@8 + [29] phi() + to:main::@9 +main::@9: scope:[main] from main::toSpritePtr3 + [30] *(SPRITE_PTRS+2*SIZEOF_UNSIGNED_INT) = main::toSpritePtr3_return#0 + [31] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_ENABLE) = 7 + [32] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_PRIORITY) = $ff + [33] *SPRITES_COLOR = DARK_GREY + [34] *(SPRITES_COLOR+1) = DARK_GREY + [35] *(SPRITES_COLOR+2) = DARK_GREY + [36] *SPRITES_YPOS = $e3 + [37] *(SPRITES_YPOS+2) = $e3 + [38] *(SPRITES_YPOS+4) = $e3 + [39] *SPRITES_XPOS = $2e + [40] *(SPRITES_XPOS+2) = $2e+$18 + [41] *(SPRITES_XPOS+4) = $19 + [42] *SPRITES_XMSB = 3 + [43] call init_plot + to:main::@12 +main::@12: scope:[main] from main::@9 + asm { lda#0 } + [45] callexecute *musicInit + to:main::@1 +main::@1: scope:[main] from main::@1 main::@12 main::@14 + [46] if(*((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_RASTER)!=$e3) goto main::@1 + to:main::@2 +main::@2: scope:[main] from main::@1 + [47] buffer = buffer ^ 1 + [48] if(buffer==0) goto main::@4 + to:main::@3 +main::@3: scope:[main] from main::@2 + [49] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 + [50] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS2 + [51] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 + [52] graphics_render = GRAPHICS1 + to:main::@5 +main::@5: scope:[main] from main::@3 main::@4 + [53] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = BLUE + [54] memset_dma::dest#0 = (void *)graphics_render + [55] call memset_dma + to:main::@13 +main::@13: scope:[main] from main::@5 + [56] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = PURPLE + [57] call render_dots + to:main::@14 +main::@14: scope:[main] from main::@13 + [58] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = BLACK + [59] callexecute *musicPlay + to:main::@1 +main::@4: scope:[main] from main::@2 + [60] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 + [61] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS1 + [62] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 + [63] graphics_render = GRAPHICS2 + to:main::@5 + +void memoryRemap(char remapBlocks , unsigned int lowerPageOffset , unsigned int upperPageOffset) +memoryRemap: scope:[memoryRemap] from main::@6 + [64] memoryRemap::aVal = 0 + [65] memoryRemap::xVal = 0 + [66] memoryRemap::yVal = 0 + [67] memoryRemap::zVal = 0 + asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } + to:memoryRemap::@return +memoryRemap::@return: scope:[memoryRemap] from memoryRemap + [69] return + to:@return + +void graphics_mode() +graphics_mode: scope:[graphics_mode] from main::@10 + [70] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = VICIV_CHR16|VICIV_VFAST + [71] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = VICIV_FAST + [72] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO) = $50 + [73] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI) = 0 + [74] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT) = $28 + [75] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO) = 0 + [76] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI) = byte1 SCREEN + [77] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO) = 0 + [78] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 + [79] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS1 + [80] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 + to:graphics_mode::@1 +graphics_mode::@1: scope:[graphics_mode] from graphics_mode graphics_mode::@5 + [81] graphics_mode::screen#5 = phi( graphics_mode/(unsigned int *)SCREEN, graphics_mode::@5/graphics_mode::screen#1 ) + [81] graphics_mode::ch#2 = phi( graphics_mode/0, graphics_mode::@5/graphics_mode::ch#1 ) + [81] graphics_mode::y#2 = phi( graphics_mode/0, graphics_mode::@5/graphics_mode::y#1 ) + [82] if(graphics_mode::y#2<$19) goto graphics_mode::@2 + to:graphics_mode::@6 +graphics_mode::@6: scope:[graphics_mode] from graphics_mode::@1 graphics_mode::@10 + [83] graphics_mode::cols#3 = phi( graphics_mode::@10/graphics_mode::cols#2, graphics_mode::@1/$ff80000 ) + [83] graphics_mode::i#2 = phi( graphics_mode::@10/graphics_mode::i#1, graphics_mode::@1/0 ) + [84] if(graphics_mode::i#2<$3e8) goto graphics_mode::@7 + to:graphics_mode::@8 +graphics_mode::@8: scope:[graphics_mode] from graphics_mode::@6 + [85] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = 0 + [86] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR) = 0 + [87] call memset_dma + to:graphics_mode::@11 +graphics_mode::@11: scope:[graphics_mode] from graphics_mode::@8 + [88] phi() + [89] call memset_dma + to:graphics_mode::@return +graphics_mode::@return: scope:[graphics_mode] from graphics_mode::@11 + [90] return + to:@return +graphics_mode::@7: scope:[graphics_mode] from graphics_mode::@6 + [91] lpoke::addr = graphics_mode::cols#3 + [92] lpoke::val = 0 + [93] call lpoke + to:graphics_mode::@9 +graphics_mode::@9: scope:[graphics_mode] from graphics_mode::@7 + [94] graphics_mode::cols#1 = ++ graphics_mode::cols#3 + [95] lpoke::addr = graphics_mode::cols#1 + [96] lpoke::val = WHITE + [97] call lpoke + to:graphics_mode::@10 +graphics_mode::@10: scope:[graphics_mode] from graphics_mode::@9 + [98] graphics_mode::cols#2 = ++ graphics_mode::cols#1 + [99] graphics_mode::i#1 = ++ graphics_mode::i#2 + to:graphics_mode::@6 +graphics_mode::@2: scope:[graphics_mode] from graphics_mode::@1 + [100] graphics_mode::ch_x#4 = graphics_mode::ch#2 + to:graphics_mode::@3 +graphics_mode::@3: scope:[graphics_mode] from graphics_mode::@2 graphics_mode::@4 + [101] graphics_mode::ch_x#2 = phi( graphics_mode::@2/graphics_mode::ch_x#4, graphics_mode::@4/graphics_mode::ch_x#1 ) + [101] graphics_mode::x#2 = phi( graphics_mode::@2/0, graphics_mode::@4/graphics_mode::x#1 ) + [102] if(graphics_mode::x#2<$28) goto graphics_mode::@4 + to:graphics_mode::@5 +graphics_mode::@5: scope:[graphics_mode] from graphics_mode::@3 + [103] graphics_mode::screen#1 = graphics_mode::screen#5 + $28*SIZEOF_UNSIGNED_INT + [104] graphics_mode::ch#1 = ++ graphics_mode::ch#2 + [105] graphics_mode::y#1 = ++ graphics_mode::y#2 + to:graphics_mode::@1 +graphics_mode::@4: scope:[graphics_mode] from graphics_mode::@3 + [106] graphics_mode::$8 = graphics_mode::x#2 << 1 + [107] graphics_mode::screen#5[graphics_mode::$8] = graphics_mode::ch_x#2 + [108] graphics_mode::ch_x#1 = graphics_mode::ch_x#2 + $19 + [109] graphics_mode::x#1 = ++ graphics_mode::x#2 + to:graphics_mode::@3 + +void init_plot() +init_plot: scope:[init_plot] from main::@9 + [110] phi() + to:init_plot::@1 +init_plot::@1: scope:[init_plot] from init_plot init_plot::@3 + [111] init_plot::gfx#2 = phi( init_plot/0, init_plot::@3/init_plot::gfx#5 ) + [111] init_plot::i#2 = phi( init_plot/0, init_plot::@3/init_plot::i#1 ) + [112] if(init_plot::i#2<$140) goto init_plot::@2 + to:init_plot::@return +init_plot::@return: scope:[init_plot] from init_plot::@1 + [113] return + to:@return +init_plot::@2: scope:[init_plot] from init_plot::@1 + [114] init_plot::$4 = init_plot::i#2 << 1 + [115] init_plot::$5 = GFX_OFFSET + init_plot::$4 + [116] *init_plot::$5 = init_plot::gfx#2 + [117] init_plot::$1 = init_plot::i#2 & 7 + [118] if(init_plot::$1!=7) goto init_plot::@3 + to:init_plot::@4 +init_plot::@4: scope:[init_plot] from init_plot::@2 + [119] init_plot::gfx#1 = init_plot::gfx#2 + $c8 + to:init_plot::@3 +init_plot::@3: scope:[init_plot] from init_plot::@2 init_plot::@4 + [120] init_plot::gfx#5 = phi( init_plot::@2/init_plot::gfx#2, init_plot::@4/init_plot::gfx#1 ) + [121] init_plot::i#1 = ++ init_plot::i#2 + to:init_plot::@1 + +void memset_dma(void *dest , char fill , unsigned int num) +memset_dma: scope:[memset_dma] from graphics_mode::@11 graphics_mode::@8 main::@5 + [122] memset_dma::dest#3 = phi( graphics_mode::@11/(void *)GRAPHICS2, graphics_mode::@8/(void *)GRAPHICS1, main::@5/memset_dma::dest#0 ) + [123] memset_dma::dmaMode#0 = *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) + [124] *((unsigned int *)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = (unsigned int)$28*$19*8 + [125] *((char **)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (char *)0 + [126] *((char **)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (char *)memset_dma::dest#3 + [127] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 + [128] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 + [129] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 + [130] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = byte1 &memset_dma_command + [131] *((char *)DMA) = byte0 &memset_dma_command + [132] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = memset_dma::dmaMode#0 + to:memset_dma::@return +memset_dma::@return: scope:[memset_dma] from memset_dma + [133] return + to:@return + +void render_dots() +render_dots: scope:[render_dots] from main::@13 + [134] render_dots::idx_x1#0 = sin_x1_idx + [135] sin_x1_idx = sin_x1_idx + 1 + [136] if(sin_x1_idx<=SINX1_SIZE) goto render_dots::@1 + to:render_dots::@4 +render_dots::@4: scope:[render_dots] from render_dots + [137] sin_x1_idx = sin_x1_idx - SINX1_SIZE + to:render_dots::@1 +render_dots::@1: scope:[render_dots] from render_dots render_dots::@4 + [138] render_dots::idx_x2#0 = sin_x2_idx + [139] sin_x2_idx = sin_x2_idx - 1 + [140] if(sin_x2_idx<=SINX2_SIZE) goto render_dots::@2 + to:render_dots::@5 +render_dots::@5: scope:[render_dots] from render_dots::@1 + [141] sin_x2_idx = sin_x2_idx + SINX2_SIZE + to:render_dots::@2 +render_dots::@2: scope:[render_dots] from render_dots::@1 render_dots::@5 + [142] render_dots::idx_y1#0 = sin_y1_idx + [143] sin_y1_idx = sin_y1_idx - 1 + [144] if(sin_y1_idx<=SINY1_SIZE) goto render_dots::@3 + to:render_dots::@6 +render_dots::@6: scope:[render_dots] from render_dots::@2 + [145] sin_y1_idx = sin_y1_idx + SINY1_SIZE + to:render_dots::@3 +render_dots::@3: scope:[render_dots] from render_dots::@2 render_dots::@6 + [146] render_dots::idx_y2#0 = sin_y2_idx + [147] sin_y2_idx = sin_y2_idx + 1 + [148] if(sin_y2_idx<=SINY2_SIZE) goto render_dots::@8 + to:render_dots::@7 +render_dots::@7: scope:[render_dots] from render_dots::@3 + [149] sin_y2_idx = sin_y2_idx - SINY2_SIZE + to:render_dots::@8 +render_dots::@8: scope:[render_dots] from render_dots::@13 render_dots::@3 render_dots::@7 + [150] render_dots::idx_y2#11 = phi( render_dots::@13/render_dots::idx_y2#9, render_dots::@3/render_dots::idx_y2#0, render_dots::@7/render_dots::idx_y2#0 ) + [150] render_dots::idx_y1#11 = phi( render_dots::@13/render_dots::idx_y1#15, render_dots::@3/render_dots::idx_y1#0, render_dots::@7/render_dots::idx_y1#0 ) + [150] render_dots::idx_x2#3 = phi( render_dots::@13/render_dots::idx_x2#13, render_dots::@3/render_dots::idx_x2#0, render_dots::@7/render_dots::idx_x2#0 ) + [150] render_dots::idx_x1#3 = phi( render_dots::@13/render_dots::idx_x1#11, render_dots::@3/render_dots::idx_x1#0, render_dots::@7/render_dots::idx_x1#0 ) + [150] render_dots::i#10 = phi( render_dots::@13/render_dots::i#1, render_dots::@3/0, render_dots::@7/0 ) + [151] if(render_dots::i#10<$600) goto render_dots::@9 + to:render_dots::@return +render_dots::@return: scope:[render_dots] from render_dots::@8 + [152] return + to:@return +render_dots::@9: scope:[render_dots] from render_dots::@8 + [153] render_dots::$20 = render_dots::idx_x1#3 << 1 + [154] render_dots::$21 = render_dots::idx_x2#3 << 1 + [155] render_dots::$22 = SINX1 + render_dots::$20 + [156] render_dots::$23 = SINX2 + render_dots::$21 + [157] plot::x#0 = *render_dots::$22 + *render_dots::$23 + [158] render_dots::$24 = SINY1 + render_dots::idx_y1#11 + [159] render_dots::$25 = SINY2 + render_dots::idx_y2#11 + [160] plot::y#0 = *render_dots::$24 + *render_dots::$25 + [161] call plot + to:render_dots::@18 +render_dots::@18: scope:[render_dots] from render_dots::@9 + [162] render_dots::idx_x1#1 = render_dots::idx_x1#3 - $b + [163] if(render_dots::idx_x1#1<=SINX1_SIZE) goto render_dots::@10 + to:render_dots::@14 +render_dots::@14: scope:[render_dots] from render_dots::@18 + [164] render_dots::idx_x1#2 = render_dots::idx_x1#1 + SINX1_SIZE + to:render_dots::@10 +render_dots::@10: scope:[render_dots] from render_dots::@14 render_dots::@18 + [165] render_dots::idx_x1#11 = phi( render_dots::@14/render_dots::idx_x1#2, render_dots::@18/render_dots::idx_x1#1 ) + [166] render_dots::idx_x2#1 = render_dots::idx_x2#3 + 3 + [167] if(render_dots::idx_x2#1<=SINX2_SIZE) goto render_dots::@11 + to:render_dots::@15 +render_dots::@15: scope:[render_dots] from render_dots::@10 + [168] render_dots::idx_x2#2 = render_dots::idx_x2#1 - SINX2_SIZE + to:render_dots::@11 +render_dots::@11: scope:[render_dots] from render_dots::@10 render_dots::@15 + [169] render_dots::idx_x2#13 = phi( render_dots::@10/render_dots::idx_x2#1, render_dots::@15/render_dots::idx_x2#2 ) + [170] render_dots::idx_y1#1 = render_dots::idx_y1#11 + 9 + [171] if(render_dots::idx_y1#1<=SINY1_SIZE) goto render_dots::@12 + to:render_dots::@16 +render_dots::@16: scope:[render_dots] from render_dots::@11 + [172] render_dots::idx_y1#2 = render_dots::idx_y1#1 - SINY1_SIZE + to:render_dots::@12 +render_dots::@12: scope:[render_dots] from render_dots::@11 render_dots::@16 + [173] render_dots::idx_y1#15 = phi( render_dots::@11/render_dots::idx_y1#1, render_dots::@16/render_dots::idx_y1#2 ) + [174] render_dots::idx_y2#1 = render_dots::idx_y2#11 - 5 + [175] if(render_dots::idx_y2#1<=SINY2_SIZE) goto render_dots::@13 + to:render_dots::@17 +render_dots::@17: scope:[render_dots] from render_dots::@12 + [176] render_dots::idx_y2#2 = render_dots::idx_y2#1 + SINY2_SIZE + to:render_dots::@13 +render_dots::@13: scope:[render_dots] from render_dots::@12 render_dots::@17 + [177] render_dots::idx_y2#9 = phi( render_dots::@12/render_dots::idx_y2#1, render_dots::@17/render_dots::idx_y2#2 ) + [178] render_dots::i#1 = ++ render_dots::i#10 + to:render_dots::@8 + +void lpoke(volatile unsigned long addr , volatile char val) +lpoke: scope:[lpoke] from graphics_mode::@7 graphics_mode::@9 + asm { ldz#0 ldaval sta((addr)),z } + to:lpoke::@return +lpoke::@return: scope:[lpoke] from lpoke + [180] return + to:@return + +void plot(unsigned int x , char y) +plot: scope:[plot] from render_dots::@9 + [181] plot::$3 = plot::x#0 << 1 + [182] plot::$4 = GFX_OFFSET + plot::$3 + [183] plot::$0 = graphics_render + *plot::$4 + [184] plot::$2 = plot::x#0 & 7 + [185] plot::$0[plot::y#0] = plot::$0[plot::y#0] | GFX_BIT[plot::$2] + to:plot::@return +plot::@return: scope:[plot] from plot + [186] return + to:@return + + +VARIABLE REGISTER WEIGHTS +void __start() +__loadstore volatile char buffer // 76.25 +void graphics_mode() +char graphics_mode::$8 // 20002.0 +unsigned int graphics_mode::ch +unsigned int graphics_mode::ch#1 // 1001.0 +unsigned int graphics_mode::ch#2 // 300.29999999999995 +unsigned int graphics_mode::ch_x +unsigned int graphics_mode::ch_x#1 // 10001.0 +unsigned int graphics_mode::ch_x#2 // 7751.0 +unsigned int graphics_mode::ch_x#4 // 2002.0 +unsigned long graphics_mode::cols +unsigned long graphics_mode::cols#1 // 750.75 +unsigned long graphics_mode::cols#2 // 1001.0 +unsigned long graphics_mode::cols#3 // 600.5999999999999 +unsigned int graphics_mode::i +unsigned int graphics_mode::i#1 // 2002.0 +unsigned int graphics_mode::i#2 // 300.29999999999995 +unsigned int *graphics_mode::screen +unsigned int *graphics_mode::screen#1 // 667.3333333333334 +unsigned int *graphics_mode::screen#5 // 1333.6666666666665 +char graphics_mode::x +char graphics_mode::x#1 // 20002.0 +char graphics_mode::x#2 // 8000.8 +char graphics_mode::y +char graphics_mode::y#1 // 2002.0 +char graphics_mode::y#2 // 273.0 +__loadstore char * volatile graphics_render // 17860.803571428572 +void init_plot() +char init_plot::$1 // 2002.0 +unsigned int init_plot::$4 // 2002.0 +unsigned int *init_plot::$5 // 2002.0 +unsigned int init_plot::gfx +unsigned int init_plot::gfx#1 // 2002.0 +unsigned int init_plot::gfx#2 // 572.0 +unsigned int init_plot::gfx#5 // 1501.5 +unsigned int init_plot::i +unsigned int init_plot::i#1 // 2002.0 +unsigned int init_plot::i#2 // 556.1111111111111 +void lpoke(volatile unsigned long addr , volatile char val) +__loadstore volatile unsigned long lpoke::addr // 500.5 +__loadstore volatile char lpoke::val // 1001.0 +void main() +char main::toSpritePtr1_return +char *main::toSpritePtr1_sprite +char main::toSpritePtr2_return +char *main::toSpritePtr2_sprite +char main::toSpritePtr3_return +char *main::toSpritePtr3_sprite +void memoryRemap(char remapBlocks , unsigned int lowerPageOffset , unsigned int upperPageOffset) +__loadstore volatile char memoryRemap::aVal // 25.25 +unsigned int memoryRemap::lowerPageOffset +char memoryRemap::remapBlocks +unsigned int memoryRemap::upperPageOffset +__loadstore volatile char memoryRemap::xVal // 33.666666666666664 +__loadstore volatile char memoryRemap::yVal // 50.5 +__loadstore volatile char memoryRemap::zVal // 101.0 +void memset_dma(void *dest , char fill , unsigned int num) +void *memset_dma::dest +void *memset_dma::dest#0 // 202.0 +void *memset_dma::dest#3 // 25.25 +char memset_dma::dmaMode +char memset_dma::dmaMode#0 // 222.44444444444446 +char memset_dma::fill +unsigned int memset_dma::num +__loadstore volatile struct DMA_LIST_F018B memset_dma_command = { command: DMA_COMMAND_FILL, count: 0, src: 0, src_bank: 0, dest: 0, dest_bank: 0, sub_command: 0, modulo: 0 } +void plot(unsigned int x , char y) +char *plot::$0 // 1500001.5 +char plot::$2 // 2000002.0 +unsigned int plot::$3 // 2000002.0 +unsigned int *plot::$4 // 2000002.0 +char *plot::gfx +unsigned int plot::x +unsigned int plot::x#0 // 300000.4285714285 +char plot::y +char plot::y#0 // 420000.60000000003 +void render_dots() +unsigned int render_dots::$20 // 100001.0 +unsigned int render_dots::$21 // 100001.0 +unsigned int *render_dots::$22 // 100001.0 +unsigned int *render_dots::$23 // 200002.0 +char *render_dots::$24 // 100001.0 +char *render_dots::$25 // 200002.0 +unsigned int render_dots::i +unsigned int render_dots::i#1 // 200002.0 +unsigned int render_dots::i#10 // 11111.222222222223 +unsigned int render_dots::idx_x1 +unsigned int render_dots::idx_x1#0 // 187.6875 +unsigned int render_dots::idx_x1#1 // 200002.0 +unsigned int render_dots::idx_x1#11 // 21428.785714285714 +unsigned int render_dots::idx_x1#2 // 200002.0 +unsigned int render_dots::idx_x1#3 // 27455.0 +unsigned int render_dots::idx_x2 +unsigned int render_dots::idx_x2#0 // 250.25 +unsigned int render_dots::idx_x2#1 // 200002.0 +unsigned int render_dots::idx_x2#13 // 30000.300000000003 +unsigned int render_dots::idx_x2#2 // 200002.0 +unsigned int render_dots::idx_x2#3 // 20133.666666666668 +unsigned int render_dots::idx_y1 +unsigned int render_dots::idx_y1#0 // 375.375 +unsigned int render_dots::idx_y1#1 // 200002.0 +unsigned int render_dots::idx_y1#11 // 15895.0 +unsigned int render_dots::idx_y1#15 // 50000.5 +unsigned int render_dots::idx_y1#2 // 200002.0 +unsigned int render_dots::idx_y2 +unsigned int render_dots::idx_y2#0 // 750.75 +unsigned int render_dots::idx_y2#1 // 200002.0 +unsigned int render_dots::idx_y2#11 // 13130.652173913044 +unsigned int render_dots::idx_y2#2 // 200002.0 +unsigned int render_dots::idx_y2#9 // 150001.5 +__loadstore volatile unsigned int sin_x1_idx // 300.40000000000003 +__loadstore volatile unsigned int sin_x2_idx // 250.33333333333337 +__loadstore volatile unsigned int sin_y1_idx // 214.57142857142856 +__loadstore volatile unsigned int sin_y2_idx // 187.75 + +Initial phi equivalence classes +[ graphics_mode::y#2 graphics_mode::y#1 ] +[ graphics_mode::ch#2 graphics_mode::ch#1 ] +[ graphics_mode::screen#5 graphics_mode::screen#1 ] +[ graphics_mode::i#2 graphics_mode::i#1 ] +[ graphics_mode::cols#3 graphics_mode::cols#2 ] +[ graphics_mode::x#2 graphics_mode::x#1 ] +[ graphics_mode::ch_x#2 graphics_mode::ch_x#4 graphics_mode::ch_x#1 ] +[ init_plot::i#2 init_plot::i#1 ] +[ init_plot::gfx#2 init_plot::gfx#5 init_plot::gfx#1 ] +[ memset_dma::dest#3 memset_dma::dest#0 ] +[ render_dots::i#10 render_dots::i#1 ] +[ render_dots::idx_x1#3 render_dots::idx_x1#11 render_dots::idx_x1#0 render_dots::idx_x1#2 render_dots::idx_x1#1 ] +[ render_dots::idx_x2#3 render_dots::idx_x2#13 render_dots::idx_x2#0 render_dots::idx_x2#1 render_dots::idx_x2#2 ] +[ render_dots::idx_y1#11 render_dots::idx_y1#15 render_dots::idx_y1#0 render_dots::idx_y1#1 render_dots::idx_y1#2 ] +[ render_dots::idx_y2#11 render_dots::idx_y2#9 render_dots::idx_y2#0 render_dots::idx_y2#1 render_dots::idx_y2#2 ] +Added variable buffer to live range equivalence class [ buffer ] +Added variable graphics_render to live range equivalence class [ graphics_render ] +Added variable sin_x1_idx to live range equivalence class [ sin_x1_idx ] +Added variable sin_x2_idx to live range equivalence class [ sin_x2_idx ] +Added variable sin_y1_idx to live range equivalence class [ sin_y1_idx ] +Added variable sin_y2_idx to live range equivalence class [ sin_y2_idx ] +Added variable memoryRemap::aVal to live range equivalence class [ memoryRemap::aVal ] +Added variable memoryRemap::xVal to live range equivalence class [ memoryRemap::xVal ] +Added variable memoryRemap::yVal to live range equivalence class [ memoryRemap::yVal ] +Added variable memoryRemap::zVal to live range equivalence class [ memoryRemap::zVal ] +Added variable lpoke::addr to live range equivalence class [ lpoke::addr ] +Added variable lpoke::val to live range equivalence class [ lpoke::val ] +Added variable graphics_mode::cols#1 to live range equivalence class [ graphics_mode::cols#1 ] +Added variable graphics_mode::$8 to live range equivalence class [ graphics_mode::$8 ] +Added variable init_plot::$4 to live range equivalence class [ init_plot::$4 ] +Added variable init_plot::$5 to live range equivalence class [ init_plot::$5 ] +Added variable init_plot::$1 to live range equivalence class [ init_plot::$1 ] +Added variable memset_dma::dmaMode#0 to live range equivalence class [ memset_dma::dmaMode#0 ] +Added variable render_dots::$20 to live range equivalence class [ render_dots::$20 ] +Added variable render_dots::$21 to live range equivalence class [ render_dots::$21 ] +Added variable render_dots::$22 to live range equivalence class [ render_dots::$22 ] +Added variable render_dots::$23 to live range equivalence class [ render_dots::$23 ] +Added variable plot::x#0 to live range equivalence class [ plot::x#0 ] +Added variable render_dots::$24 to live range equivalence class [ render_dots::$24 ] +Added variable render_dots::$25 to live range equivalence class [ render_dots::$25 ] +Added variable plot::y#0 to live range equivalence class [ plot::y#0 ] +Added variable plot::$3 to live range equivalence class [ plot::$3 ] +Added variable plot::$4 to live range equivalence class [ plot::$4 ] +Added variable plot::$0 to live range equivalence class [ plot::$0 ] +Added variable plot::$2 to live range equivalence class [ plot::$2 ] +Added variable memset_dma_command to live range equivalence class [ memset_dma_command ] +Complete equivalence classes +[ graphics_mode::y#2 graphics_mode::y#1 ] +[ graphics_mode::ch#2 graphics_mode::ch#1 ] +[ graphics_mode::screen#5 graphics_mode::screen#1 ] +[ graphics_mode::i#2 graphics_mode::i#1 ] +[ graphics_mode::cols#3 graphics_mode::cols#2 ] +[ graphics_mode::x#2 graphics_mode::x#1 ] +[ graphics_mode::ch_x#2 graphics_mode::ch_x#4 graphics_mode::ch_x#1 ] +[ init_plot::i#2 init_plot::i#1 ] +[ init_plot::gfx#2 init_plot::gfx#5 init_plot::gfx#1 ] +[ memset_dma::dest#3 memset_dma::dest#0 ] +[ render_dots::i#10 render_dots::i#1 ] +[ render_dots::idx_x1#3 render_dots::idx_x1#11 render_dots::idx_x1#0 render_dots::idx_x1#2 render_dots::idx_x1#1 ] +[ render_dots::idx_x2#3 render_dots::idx_x2#13 render_dots::idx_x2#0 render_dots::idx_x2#1 render_dots::idx_x2#2 ] +[ render_dots::idx_y1#11 render_dots::idx_y1#15 render_dots::idx_y1#0 render_dots::idx_y1#1 render_dots::idx_y1#2 ] +[ render_dots::idx_y2#11 render_dots::idx_y2#9 render_dots::idx_y2#0 render_dots::idx_y2#1 render_dots::idx_y2#2 ] +[ buffer ] +[ graphics_render ] +[ sin_x1_idx ] +[ sin_x2_idx ] +[ sin_y1_idx ] +[ sin_y2_idx ] +[ memoryRemap::aVal ] +[ memoryRemap::xVal ] +[ memoryRemap::yVal ] +[ memoryRemap::zVal ] +[ lpoke::addr ] +[ lpoke::val ] +[ graphics_mode::cols#1 ] +[ graphics_mode::$8 ] +[ init_plot::$4 ] +[ init_plot::$5 ] +[ init_plot::$1 ] +[ memset_dma::dmaMode#0 ] +[ render_dots::$20 ] +[ render_dots::$21 ] +[ render_dots::$22 ] +[ render_dots::$23 ] +[ plot::x#0 ] +[ render_dots::$24 ] +[ render_dots::$25 ] +[ plot::y#0 ] +[ plot::$3 ] +[ plot::$4 ] +[ plot::$0 ] +[ plot::$2 ] +[ memset_dma_command ] +Allocated zp[2]:2 [ plot::$3 ] +Allocated zp[2]:4 [ plot::$4 ] +Allocated zp[1]:6 [ plot::$2 ] +Allocated zp[2]:7 [ plot::$0 ] +Allocated zp[2]:9 [ render_dots::idx_y2#11 render_dots::idx_y2#9 render_dots::idx_y2#0 render_dots::idx_y2#1 render_dots::idx_y2#2 ] +Allocated zp[2]:11 [ render_dots::idx_y1#11 render_dots::idx_y1#15 render_dots::idx_y1#0 render_dots::idx_y1#1 render_dots::idx_y1#2 ] +Allocated zp[2]:13 [ render_dots::idx_x2#3 render_dots::idx_x2#13 render_dots::idx_x2#0 render_dots::idx_x2#1 render_dots::idx_x2#2 ] +Allocated zp[2]:15 [ render_dots::idx_x1#3 render_dots::idx_x1#11 render_dots::idx_x1#0 render_dots::idx_x1#2 render_dots::idx_x1#1 ] +Allocated zp[1]:17 [ plot::y#0 ] +Allocated zp[2]:18 [ plot::x#0 ] +Allocated zp[2]:20 [ render_dots::i#10 render_dots::i#1 ] +Allocated zp[2]:22 [ render_dots::$23 ] +Allocated zp[2]:24 [ render_dots::$25 ] +Allocated zp[2]:26 [ render_dots::$20 ] +Allocated zp[2]:28 [ render_dots::$21 ] +Allocated zp[2]:30 [ render_dots::$22 ] +Allocated zp[2]:32 [ render_dots::$24 ] +Allocated zp[1]:34 [ graphics_mode::x#2 graphics_mode::x#1 ] +Allocated zp[1]:35 [ graphics_mode::$8 ] +Allocated zp[2]:36 [ graphics_mode::ch_x#2 graphics_mode::ch_x#4 graphics_mode::ch_x#1 ] +Allocated zp[2]:38 [ graphics_render ] +Allocated zp[2]:40 [ init_plot::gfx#2 init_plot::gfx#5 init_plot::gfx#1 ] +Allocated zp[2]:42 [ init_plot::i#2 init_plot::i#1 ] +Allocated zp[2]:44 [ graphics_mode::i#2 graphics_mode::i#1 ] +Allocated zp[1]:46 [ graphics_mode::y#2 graphics_mode::y#1 ] +Allocated zp[2]:47 [ init_plot::$4 ] +Allocated zp[2]:49 [ init_plot::$5 ] +Allocated zp[1]:51 [ init_plot::$1 ] +Allocated zp[2]:52 [ graphics_mode::screen#5 graphics_mode::screen#1 ] +Allocated zp[4]:54 [ graphics_mode::cols#3 graphics_mode::cols#2 ] +Allocated zp[2]:58 [ graphics_mode::ch#2 graphics_mode::ch#1 ] +Allocated zp[1]:60 [ lpoke::val ] +Allocated zp[4]:61 [ graphics_mode::cols#1 ] +Allocated zp[4]:65 [ lpoke::addr ] +Allocated zp[2]:69 [ sin_x1_idx ] +Allocated zp[2]:71 [ sin_x2_idx ] +Allocated zp[2]:73 [ memset_dma::dest#3 memset_dma::dest#0 ] +Allocated zp[1]:75 [ memset_dma::dmaMode#0 ] +Allocated zp[2]:76 [ sin_y1_idx ] +Allocated zp[2]:78 [ sin_y2_idx ] +Allocated zp[1]:80 [ memoryRemap::zVal ] +Allocated zp[1]:81 [ buffer ] +Allocated zp[1]:82 [ memoryRemap::yVal ] +Allocated zp[1]:83 [ memoryRemap::xVal ] +Allocated zp[1]:84 [ memoryRemap::aVal ] +Allocated mem[12] [ memset_dma_command ] +REGISTER UPLIFT POTENTIAL REGISTERS +Statement [1] buffer = 0 [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [2] graphics_render = GRAPHICS1 [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [3] sin_x1_idx = 0 [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [4] sin_x2_idx = 0 [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [5] sin_y1_idx = 0 [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [6] sin_y2_idx = 0 [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [14] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ memset_dma_command ] ( main:8 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [15] *PROCPORT = PROCPORT_RAM_IO [ memset_dma_command ] ( main:8 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [16] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = VICIV_KEY_M65_A [ memset_dma_command ] ( main:8 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [17] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = VICIV_KEY_M65_B [ memset_dma_command ] ( main:8 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [18] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLA) = 0 [ memset_dma_command ] ( main:8 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [19] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) | VICIV_FAST [ memset_dma_command ] ( main:8 [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [20] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) | VICIV_VFAST [ memset_dma_command ] ( main:8 [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [22] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOLO) = byte0 SPRITE_PTRS [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [23] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOHI) = byte1 SPRITE_PTRS [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [24] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_HILO) = VICIV_SPRPTR16 [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [26] *SPRITE_PTRS = main::toSpritePtr1_return#0 [ ] ( main:8 [ ] { } ) always clobbers reg byte a +Statement [28] *(SPRITE_PTRS+1*SIZEOF_UNSIGNED_INT) = main::toSpritePtr2_return#0 [ ] ( main:8 [ ] { } ) always clobbers reg byte a +Statement [30] *(SPRITE_PTRS+2*SIZEOF_UNSIGNED_INT) = main::toSpritePtr3_return#0 [ ] ( main:8 [ ] { } ) always clobbers reg byte a +Statement [31] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_ENABLE) = 7 [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [32] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_PRIORITY) = $ff [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [33] *SPRITES_COLOR = DARK_GREY [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [34] *(SPRITES_COLOR+1) = DARK_GREY [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [35] *(SPRITES_COLOR+2) = DARK_GREY [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [36] *SPRITES_YPOS = $e3 [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [37] *(SPRITES_YPOS+2) = $e3 [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [38] *(SPRITES_YPOS+4) = $e3 [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [39] *SPRITES_XPOS = $2e [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [40] *(SPRITES_XPOS+2) = $2e+$18 [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [41] *(SPRITES_XPOS+4) = $19 [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [42] *SPRITES_XMSB = 3 [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement asm { lda#0 } always clobbers reg byte a +Statement [45] callexecute *musicInit [ buffer sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ buffer sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte a reg byte x reg byte y reg byte z +Statement [46] if(*((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_RASTER)!=$e3) goto main::@1 [ buffer sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ buffer sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte z +Statement [47] buffer = buffer ^ 1 [ buffer sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ buffer sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte a +Statement [48] if(buffer==0) goto main::@4 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte a +Statement [49] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte z +Statement [50] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS2 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte z +Statement [51] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte z +Statement [52] graphics_render = GRAPHICS1 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte a +Statement [53] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = BLUE [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { { memset_dma::dest#0 = memset_dma::dest#3 } } ) always clobbers reg byte z +Statement [54] memset_dma::dest#0 = (void *)graphics_render [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma::dest#0 memset_dma_command ] ( main:8 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma::dest#0 memset_dma_command ] { { memset_dma::dest#0 = memset_dma::dest#3 } } ) always clobbers reg byte a +Statement [56] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = PURPLE [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx ] ( main:8 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx ] { } ) always clobbers reg byte z +Statement [58] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = BLACK [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [59] callexecute *musicPlay [ buffer sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ buffer sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte a reg byte x reg byte y reg byte z +Statement [60] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte z +Statement [61] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS1 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte z +Statement [62] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte z +Statement [63] graphics_render = GRAPHICS2 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte a +Statement [64] memoryRemap::aVal = 0 [ memoryRemap::aVal ] ( main:8::memoryRemap:13 [ memset_dma_command memoryRemap::aVal ] { } ) always clobbers reg byte z +Statement [65] memoryRemap::xVal = 0 [ memoryRemap::aVal memoryRemap::xVal ] ( main:8::memoryRemap:13 [ memset_dma_command memoryRemap::aVal memoryRemap::xVal ] { } ) always clobbers reg byte z +Statement [66] memoryRemap::yVal = 0 [ memoryRemap::aVal memoryRemap::xVal memoryRemap::yVal ] ( main:8::memoryRemap:13 [ memset_dma_command memoryRemap::aVal memoryRemap::xVal memoryRemap::yVal ] { } ) always clobbers reg byte z +Statement [67] memoryRemap::zVal = 0 [ memoryRemap::aVal memoryRemap::xVal memoryRemap::yVal memoryRemap::zVal ] ( main:8::memoryRemap:13 [ memset_dma_command memoryRemap::aVal memoryRemap::xVal memoryRemap::yVal memoryRemap::zVal ] { } ) always clobbers reg byte z +Statement asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } always clobbers reg byte a reg byte x reg byte y reg byte z +Statement [70] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = VICIV_CHR16|VICIV_VFAST [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [71] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = VICIV_FAST [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [72] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO) = $50 [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [73] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI) = 0 [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [74] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT) = $28 [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [75] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO) = 0 [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [76] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI) = byte1 SCREEN [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [77] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO) = 0 [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [78] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [79] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS1 [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [80] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [84] if(graphics_mode::i#2<$3e8) goto graphics_mode::@7 [ graphics_mode::i#2 graphics_mode::cols#3 memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::i#2 graphics_mode::cols#3 memset_dma_command ] { } ) always clobbers reg byte a +Statement [85] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = 0 [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [86] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR) = 0 [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [91] lpoke::addr = graphics_mode::cols#3 [ graphics_mode::i#2 graphics_mode::cols#3 lpoke::addr memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::i#2 graphics_mode::cols#3 lpoke::addr memset_dma_command ] { { graphics_mode::cols#3 = lpoke::addr } } ) always clobbers reg byte a reg byte x reg byte y reg byte z +Statement [92] lpoke::val = 0 [ graphics_mode::i#2 graphics_mode::cols#3 lpoke::addr lpoke::val memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::i#2 graphics_mode::cols#3 lpoke::addr lpoke::val memset_dma_command ] { { graphics_mode::cols#3 = lpoke::addr } } ) always clobbers reg byte z +Statement [94] graphics_mode::cols#1 = ++ graphics_mode::cols#3 [ graphics_mode::i#2 graphics_mode::cols#1 memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::i#2 graphics_mode::cols#1 memset_dma_command ] { { graphics_mode::cols#1 = lpoke::addr } } ) always clobbers reg byte a +Statement [95] lpoke::addr = graphics_mode::cols#1 [ graphics_mode::i#2 lpoke::addr graphics_mode::cols#1 memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::i#2 lpoke::addr graphics_mode::cols#1 memset_dma_command ] { { graphics_mode::cols#1 = lpoke::addr } } ) always clobbers reg byte a reg byte x reg byte y reg byte z +Statement [96] lpoke::val = WHITE [ graphics_mode::i#2 lpoke::addr lpoke::val graphics_mode::cols#1 memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::i#2 lpoke::addr lpoke::val graphics_mode::cols#1 memset_dma_command ] { { graphics_mode::cols#1 = lpoke::addr } } ) always clobbers reg byte z +Statement [98] graphics_mode::cols#2 = ++ graphics_mode::cols#1 [ graphics_mode::i#2 graphics_mode::cols#2 memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::i#2 graphics_mode::cols#2 memset_dma_command ] { } ) always clobbers reg byte a +Statement [100] graphics_mode::ch_x#4 = graphics_mode::ch#2 [ graphics_mode::y#2 graphics_mode::ch#2 graphics_mode::screen#5 graphics_mode::ch_x#4 memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::y#2 graphics_mode::ch#2 graphics_mode::screen#5 graphics_mode::ch_x#4 memset_dma_command ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:46 [ graphics_mode::y#2 graphics_mode::y#1 ] +Statement [103] graphics_mode::screen#1 = graphics_mode::screen#5 + $28*SIZEOF_UNSIGNED_INT [ graphics_mode::y#2 graphics_mode::ch#2 graphics_mode::screen#1 memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::y#2 graphics_mode::ch#2 graphics_mode::screen#1 memset_dma_command ] { } ) always clobbers reg byte a +Statement [106] graphics_mode::$8 = graphics_mode::x#2 << 1 [ graphics_mode::y#2 graphics_mode::ch#2 graphics_mode::screen#5 graphics_mode::x#2 graphics_mode::ch_x#2 graphics_mode::$8 memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::y#2 graphics_mode::ch#2 graphics_mode::screen#5 graphics_mode::x#2 graphics_mode::ch_x#2 graphics_mode::$8 memset_dma_command ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:34 [ graphics_mode::x#2 graphics_mode::x#1 ] +Statement [107] graphics_mode::screen#5[graphics_mode::$8] = graphics_mode::ch_x#2 [ graphics_mode::y#2 graphics_mode::ch#2 graphics_mode::screen#5 graphics_mode::x#2 graphics_mode::ch_x#2 memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::y#2 graphics_mode::ch#2 graphics_mode::screen#5 graphics_mode::x#2 graphics_mode::ch_x#2 memset_dma_command ] { } ) always clobbers reg byte a reg byte y +Removing always clobbered register reg byte y as potential for zp[1]:46 [ graphics_mode::y#2 graphics_mode::y#1 ] +Removing always clobbered register reg byte y as potential for zp[1]:34 [ graphics_mode::x#2 graphics_mode::x#1 ] +Statement [108] graphics_mode::ch_x#1 = graphics_mode::ch_x#2 + $19 [ graphics_mode::y#2 graphics_mode::ch#2 graphics_mode::screen#5 graphics_mode::x#2 graphics_mode::ch_x#1 memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::y#2 graphics_mode::ch#2 graphics_mode::screen#5 graphics_mode::x#2 graphics_mode::ch_x#1 memset_dma_command ] { } ) always clobbers reg byte a +Statement [112] if(init_plot::i#2<$140) goto init_plot::@2 [ init_plot::i#2 init_plot::gfx#2 ] ( main:8::init_plot:43 [ init_plot::i#2 init_plot::gfx#2 ] { } ) always clobbers reg byte a +Statement [114] init_plot::$4 = init_plot::i#2 << 1 [ init_plot::i#2 init_plot::gfx#2 init_plot::$4 ] ( main:8::init_plot:43 [ init_plot::i#2 init_plot::gfx#2 init_plot::$4 ] { } ) always clobbers reg byte a +Statement [115] init_plot::$5 = GFX_OFFSET + init_plot::$4 [ init_plot::i#2 init_plot::gfx#2 init_plot::$5 ] ( main:8::init_plot:43 [ init_plot::i#2 init_plot::gfx#2 init_plot::$5 ] { } ) always clobbers reg byte a +Statement [116] *init_plot::$5 = init_plot::gfx#2 [ init_plot::i#2 init_plot::gfx#2 ] ( main:8::init_plot:43 [ init_plot::i#2 init_plot::gfx#2 ] { } ) always clobbers reg byte a reg byte y +Statement [117] init_plot::$1 = init_plot::i#2 & 7 [ init_plot::i#2 init_plot::gfx#2 init_plot::$1 ] ( main:8::init_plot:43 [ init_plot::i#2 init_plot::gfx#2 init_plot::$1 ] { } ) always clobbers reg byte a +Statement [119] init_plot::gfx#1 = init_plot::gfx#2 + $c8 [ init_plot::i#2 init_plot::gfx#1 ] ( main:8::init_plot:43 [ init_plot::i#2 init_plot::gfx#1 ] { } ) always clobbers reg byte a +Statement [124] *((unsigned int *)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = (unsigned int)$28*$19*8 [ memset_dma::dest#3 memset_dma::dmaMode#0 memset_dma_command ] ( main:8::memset_dma:55 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma::dest#3 memset_dma::dmaMode#0 memset_dma_command ] { { memset_dma::dest#0 = memset_dma::dest#3 } } main:8::graphics_mode:21::memset_dma:87 [ memset_dma::dest#3 memset_dma::dmaMode#0 memset_dma_command ] { } main:8::graphics_mode:21::memset_dma:89 [ memset_dma::dest#3 memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:75 [ memset_dma::dmaMode#0 ] +Statement [125] *((char **)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (char *)0 [ memset_dma::dest#3 memset_dma::dmaMode#0 memset_dma_command ] ( main:8::memset_dma:55 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma::dest#3 memset_dma::dmaMode#0 memset_dma_command ] { { memset_dma::dest#0 = memset_dma::dest#3 } } main:8::graphics_mode:21::memset_dma:87 [ memset_dma::dest#3 memset_dma::dmaMode#0 memset_dma_command ] { } main:8::graphics_mode:21::memset_dma:89 [ memset_dma::dest#3 memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [126] *((char **)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (char *)memset_dma::dest#3 [ memset_dma::dmaMode#0 memset_dma_command ] ( main:8::memset_dma:55 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma::dmaMode#0 memset_dma_command ] { { memset_dma::dest#0 = memset_dma::dest#3 } } main:8::graphics_mode:21::memset_dma:87 [ memset_dma::dmaMode#0 memset_dma_command ] { } main:8::graphics_mode:21::memset_dma:89 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [127] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 [ memset_dma::dmaMode#0 memset_dma_command ] ( main:8::memset_dma:55 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma::dmaMode#0 memset_dma_command ] { { memset_dma::dest#0 = memset_dma::dest#3 } } main:8::graphics_mode:21::memset_dma:87 [ memset_dma::dmaMode#0 memset_dma_command ] { } main:8::graphics_mode:21::memset_dma:89 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte z +Removing always clobbered register reg byte z as potential for zp[1]:75 [ memset_dma::dmaMode#0 ] +Statement [128] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 [ memset_dma::dmaMode#0 memset_dma_command ] ( main:8::memset_dma:55 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma::dmaMode#0 memset_dma_command ] { { memset_dma::dest#0 = memset_dma::dest#3 } } main:8::graphics_mode:21::memset_dma:87 [ memset_dma::dmaMode#0 memset_dma_command ] { } main:8::graphics_mode:21::memset_dma:89 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte z +Statement [129] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 [ memset_dma::dmaMode#0 memset_dma_command ] ( main:8::memset_dma:55 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma::dmaMode#0 memset_dma_command ] { { memset_dma::dest#0 = memset_dma::dest#3 } } main:8::graphics_mode:21::memset_dma:87 [ memset_dma::dmaMode#0 memset_dma_command ] { } main:8::graphics_mode:21::memset_dma:89 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte z +Statement [130] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = byte1 &memset_dma_command [ memset_dma::dmaMode#0 memset_dma_command ] ( main:8::memset_dma:55 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma::dmaMode#0 memset_dma_command ] { { memset_dma::dest#0 = memset_dma::dest#3 } } main:8::graphics_mode:21::memset_dma:87 [ memset_dma::dmaMode#0 memset_dma_command ] { } main:8::graphics_mode:21::memset_dma:89 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte z +Statement [131] *((char *)DMA) = byte0 &memset_dma_command [ memset_dma::dmaMode#0 memset_dma_command ] ( main:8::memset_dma:55 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma::dmaMode#0 memset_dma_command ] { { memset_dma::dest#0 = memset_dma::dest#3 } } main:8::graphics_mode:21::memset_dma:87 [ memset_dma::dmaMode#0 memset_dma_command ] { } main:8::graphics_mode:21::memset_dma:89 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte z +Statement [134] render_dots::idx_x1#0 = sin_x1_idx [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 ] ( main:8::render_dots:57 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 ] { } ) always clobbers reg byte a +Statement [136] if(sin_x1_idx<=SINX1_SIZE) goto render_dots::@1 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 ] ( main:8::render_dots:57 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 ] { } ) always clobbers reg byte a +Statement [137] sin_x1_idx = sin_x1_idx - SINX1_SIZE [ graphics_render sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 ] ( main:8::render_dots:57 [ graphics_render sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 ] { } ) always clobbers reg byte a +Statement [138] render_dots::idx_x2#0 = sin_x2_idx [ graphics_render sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 ] ( main:8::render_dots:57 [ graphics_render sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 ] { } ) always clobbers reg byte a +Statement [139] sin_x2_idx = sin_x2_idx - 1 [ graphics_render sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 ] ( main:8::render_dots:57 [ graphics_render sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 ] { } ) always clobbers reg byte a +Statement [140] if(sin_x2_idx<=SINX2_SIZE) goto render_dots::@2 [ graphics_render sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 ] ( main:8::render_dots:57 [ graphics_render sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 ] { } ) always clobbers reg byte a +Statement [141] sin_x2_idx = sin_x2_idx + SINX2_SIZE [ graphics_render sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 ] ( main:8::render_dots:57 [ graphics_render sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 ] { } ) always clobbers reg byte a +Statement [142] render_dots::idx_y1#0 = sin_y1_idx [ graphics_render sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 ] ( main:8::render_dots:57 [ graphics_render sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 ] { } ) always clobbers reg byte a +Statement [143] sin_y1_idx = sin_y1_idx - 1 [ graphics_render sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 ] ( main:8::render_dots:57 [ graphics_render sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 ] { } ) always clobbers reg byte a +Statement [144] if(sin_y1_idx<=SINY1_SIZE) goto render_dots::@3 [ graphics_render sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 ] ( main:8::render_dots:57 [ graphics_render sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 ] { } ) always clobbers reg byte a +Statement [145] sin_y1_idx = sin_y1_idx + SINY1_SIZE [ graphics_render sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 ] ( main:8::render_dots:57 [ graphics_render sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 ] { } ) always clobbers reg byte a +Statement [146] render_dots::idx_y2#0 = sin_y2_idx [ graphics_render sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 render_dots::idx_y2#0 ] ( main:8::render_dots:57 [ graphics_render sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 render_dots::idx_y2#0 ] { } ) always clobbers reg byte a +Statement [148] if(sin_y2_idx<=SINY2_SIZE) goto render_dots::@8 [ graphics_render sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 render_dots::idx_y2#0 ] ( main:8::render_dots:57 [ graphics_render sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 render_dots::idx_y2#0 ] { } ) always clobbers reg byte a +Statement [149] sin_y2_idx = sin_y2_idx - SINY2_SIZE [ graphics_render render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 render_dots::idx_y2#0 ] ( main:8::render_dots:57 [ graphics_render render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 render_dots::idx_y2#0 ] { } ) always clobbers reg byte a +Statement [151] if(render_dots::i#10<$600) goto render_dots::@9 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 ] { } ) always clobbers reg byte a +Statement [153] render_dots::$20 = render_dots::idx_x1#3 << 1 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::$20 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::$20 ] { } ) always clobbers reg byte a +Statement [154] render_dots::$21 = render_dots::idx_x2#3 << 1 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::$20 render_dots::$21 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::$20 render_dots::$21 ] { } ) always clobbers reg byte a +Statement [155] render_dots::$22 = SINX1 + render_dots::$20 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::$21 render_dots::$22 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::$21 render_dots::$22 ] { } ) always clobbers reg byte a +Statement [156] render_dots::$23 = SINX2 + render_dots::$21 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::$22 render_dots::$23 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::$22 render_dots::$23 ] { } ) always clobbers reg byte a +Statement [157] plot::x#0 = *render_dots::$22 + *render_dots::$23 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 plot::x#0 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 plot::x#0 ] { } ) always clobbers reg byte a reg byte y +Statement [158] render_dots::$24 = SINY1 + render_dots::idx_y1#11 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 plot::x#0 render_dots::$24 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 plot::x#0 render_dots::$24 ] { } ) always clobbers reg byte a +Statement [159] render_dots::$25 = SINY2 + render_dots::idx_y2#11 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 plot::x#0 render_dots::$24 render_dots::$25 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 plot::x#0 render_dots::$24 render_dots::$25 ] { } ) always clobbers reg byte a +Statement [160] plot::y#0 = *render_dots::$24 + *render_dots::$25 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 plot::x#0 plot::y#0 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 plot::x#0 plot::y#0 ] { } ) always clobbers reg byte a reg byte y +Statement [162] render_dots::idx_x1#1 = render_dots::idx_x1#3 - $b [ graphics_render render_dots::i#10 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#1 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#1 ] { } ) always clobbers reg byte a +Statement [163] if(render_dots::idx_x1#1<=SINX1_SIZE) goto render_dots::@10 [ graphics_render render_dots::i#10 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#1 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#1 ] { } ) always clobbers reg byte a +Statement [164] render_dots::idx_x1#2 = render_dots::idx_x1#1 + SINX1_SIZE [ graphics_render render_dots::i#10 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#2 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#2 ] { } ) always clobbers reg byte a +Statement [166] render_dots::idx_x2#1 = render_dots::idx_x2#3 + 3 [ graphics_render render_dots::i#10 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#1 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#1 ] { } ) always clobbers reg byte a +Statement [167] if(render_dots::idx_x2#1<=SINX2_SIZE) goto render_dots::@11 [ graphics_render render_dots::i#10 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#1 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#1 ] { } ) always clobbers reg byte a +Statement [168] render_dots::idx_x2#2 = render_dots::idx_x2#1 - SINX2_SIZE [ graphics_render render_dots::i#10 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#2 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#2 ] { } ) always clobbers reg byte a +Statement [170] render_dots::idx_y1#1 = render_dots::idx_y1#11 + 9 [ graphics_render render_dots::i#10 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#1 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#1 ] { } ) always clobbers reg byte a +Statement [171] if(render_dots::idx_y1#1<=SINY1_SIZE) goto render_dots::@12 [ graphics_render render_dots::i#10 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#1 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#1 ] { } ) always clobbers reg byte a +Statement [172] render_dots::idx_y1#2 = render_dots::idx_y1#1 - SINY1_SIZE [ graphics_render render_dots::i#10 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#2 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#2 ] { } ) always clobbers reg byte a +Statement [174] render_dots::idx_y2#1 = render_dots::idx_y2#11 - 5 [ graphics_render render_dots::i#10 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#15 render_dots::idx_y2#1 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#15 render_dots::idx_y2#1 ] { } ) always clobbers reg byte a +Statement [175] if(render_dots::idx_y2#1<=SINY2_SIZE) goto render_dots::@13 [ graphics_render render_dots::i#10 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#15 render_dots::idx_y2#1 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#15 render_dots::idx_y2#1 ] { } ) always clobbers reg byte a +Statement [176] render_dots::idx_y2#2 = render_dots::idx_y2#1 + SINY2_SIZE [ graphics_render render_dots::i#10 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#15 render_dots::idx_y2#2 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#15 render_dots::idx_y2#2 ] { } ) always clobbers reg byte a +Statement asm { ldz#0 ldaval sta((addr)),z } always clobbers reg byte a reg byte z +Statement [181] plot::$3 = plot::x#0 << 1 [ graphics_render plot::x#0 plot::y#0 plot::$3 ] ( main:8::render_dots:57::plot:161 [ render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 graphics_render plot::x#0 plot::y#0 plot::$3 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:17 [ plot::y#0 ] +Statement [182] plot::$4 = GFX_OFFSET + plot::$3 [ graphics_render plot::x#0 plot::y#0 plot::$4 ] ( main:8::render_dots:57::plot:161 [ render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 graphics_render plot::x#0 plot::y#0 plot::$4 ] { } ) always clobbers reg byte a +Statement [183] plot::$0 = graphics_render + *plot::$4 [ graphics_render plot::x#0 plot::y#0 plot::$0 ] ( main:8::render_dots:57::plot:161 [ render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 graphics_render plot::x#0 plot::y#0 plot::$0 ] { } ) always clobbers reg byte a reg byte y +Removing always clobbered register reg byte y as potential for zp[1]:17 [ plot::y#0 ] +Statement [184] plot::$2 = plot::x#0 & 7 [ graphics_render plot::y#0 plot::$0 plot::$2 ] ( main:8::render_dots:57::plot:161 [ render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 graphics_render plot::y#0 plot::$0 plot::$2 ] { } ) always clobbers reg byte a +Statement [185] plot::$0[plot::y#0] = plot::$0[plot::y#0] | GFX_BIT[plot::$2] [ graphics_render ] ( main:8::render_dots:57::plot:161 [ render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 graphics_render ] { } ) always clobbers reg byte a +Statement [1] buffer = 0 [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [2] graphics_render = GRAPHICS1 [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [3] sin_x1_idx = 0 [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [4] sin_x2_idx = 0 [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [5] sin_y1_idx = 0 [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [6] sin_y2_idx = 0 [ memset_dma_command ] ( [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [14] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ memset_dma_command ] ( main:8 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [15] *PROCPORT = PROCPORT_RAM_IO [ memset_dma_command ] ( main:8 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [16] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = VICIV_KEY_M65_A [ memset_dma_command ] ( main:8 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [17] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = VICIV_KEY_M65_B [ memset_dma_command ] ( main:8 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [18] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLA) = 0 [ memset_dma_command ] ( main:8 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [19] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) | VICIV_FAST [ memset_dma_command ] ( main:8 [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [20] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) | VICIV_VFAST [ memset_dma_command ] ( main:8 [ memset_dma_command ] { } ) always clobbers reg byte a +Statement [22] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOLO) = byte0 SPRITE_PTRS [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [23] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOHI) = byte1 SPRITE_PTRS [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [24] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_HILO) = VICIV_SPRPTR16 [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [26] *SPRITE_PTRS = main::toSpritePtr1_return#0 [ ] ( main:8 [ ] { } ) always clobbers reg byte a +Statement [28] *(SPRITE_PTRS+1*SIZEOF_UNSIGNED_INT) = main::toSpritePtr2_return#0 [ ] ( main:8 [ ] { } ) always clobbers reg byte a +Statement [30] *(SPRITE_PTRS+2*SIZEOF_UNSIGNED_INT) = main::toSpritePtr3_return#0 [ ] ( main:8 [ ] { } ) always clobbers reg byte a +Statement [31] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_ENABLE) = 7 [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [32] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_PRIORITY) = $ff [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [33] *SPRITES_COLOR = DARK_GREY [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [34] *(SPRITES_COLOR+1) = DARK_GREY [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [35] *(SPRITES_COLOR+2) = DARK_GREY [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [36] *SPRITES_YPOS = $e3 [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [37] *(SPRITES_YPOS+2) = $e3 [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [38] *(SPRITES_YPOS+4) = $e3 [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [39] *SPRITES_XPOS = $2e [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [40] *(SPRITES_XPOS+2) = $2e+$18 [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [41] *(SPRITES_XPOS+4) = $19 [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [42] *SPRITES_XMSB = 3 [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement asm { lda#0 } always clobbers reg byte a +Statement [45] callexecute *musicInit [ buffer sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ buffer sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte a reg byte x reg byte y reg byte z +Statement [46] if(*((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_RASTER)!=$e3) goto main::@1 [ buffer sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ buffer sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte z +Statement [47] buffer = buffer ^ 1 [ buffer sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ buffer sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte a +Statement [48] if(buffer==0) goto main::@4 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte a +Statement [49] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte z +Statement [50] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS2 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte z +Statement [51] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte z +Statement [52] graphics_render = GRAPHICS1 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte a +Statement [53] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = BLUE [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { { memset_dma::dest#0 = memset_dma::dest#3 } } ) always clobbers reg byte z +Statement [54] memset_dma::dest#0 = (void *)graphics_render [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma::dest#0 memset_dma_command ] ( main:8 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma::dest#0 memset_dma_command ] { { memset_dma::dest#0 = memset_dma::dest#3 } } ) always clobbers reg byte a +Statement [56] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = PURPLE [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx ] ( main:8 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx ] { } ) always clobbers reg byte z +Statement [58] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = BLACK [ ] ( main:8 [ ] { } ) always clobbers reg byte z +Statement [59] callexecute *musicPlay [ buffer sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ buffer sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte a reg byte x reg byte y reg byte z +Statement [60] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte z +Statement [61] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS1 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte z +Statement [62] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte z +Statement [63] graphics_render = GRAPHICS2 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] ( main:8 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma_command ] { } ) always clobbers reg byte a +Statement [64] memoryRemap::aVal = 0 [ memoryRemap::aVal ] ( main:8::memoryRemap:13 [ memset_dma_command memoryRemap::aVal ] { } ) always clobbers reg byte z +Statement [65] memoryRemap::xVal = 0 [ memoryRemap::aVal memoryRemap::xVal ] ( main:8::memoryRemap:13 [ memset_dma_command memoryRemap::aVal memoryRemap::xVal ] { } ) always clobbers reg byte z +Statement [66] memoryRemap::yVal = 0 [ memoryRemap::aVal memoryRemap::xVal memoryRemap::yVal ] ( main:8::memoryRemap:13 [ memset_dma_command memoryRemap::aVal memoryRemap::xVal memoryRemap::yVal ] { } ) always clobbers reg byte z +Statement [67] memoryRemap::zVal = 0 [ memoryRemap::aVal memoryRemap::xVal memoryRemap::yVal memoryRemap::zVal ] ( main:8::memoryRemap:13 [ memset_dma_command memoryRemap::aVal memoryRemap::xVal memoryRemap::yVal memoryRemap::zVal ] { } ) always clobbers reg byte z +Statement asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } always clobbers reg byte a reg byte x reg byte y reg byte z +Statement [70] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = VICIV_CHR16|VICIV_VFAST [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [71] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = VICIV_FAST [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [72] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO) = $50 [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [73] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI) = 0 [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [74] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT) = $28 [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [75] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO) = 0 [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [76] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI) = byte1 SCREEN [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [77] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO) = 0 [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [78] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [79] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS1 [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [80] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [84] if(graphics_mode::i#2<$3e8) goto graphics_mode::@7 [ graphics_mode::i#2 graphics_mode::cols#3 memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::i#2 graphics_mode::cols#3 memset_dma_command ] { } ) always clobbers reg byte a +Statement [85] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = 0 [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [86] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR) = 0 [ memset_dma_command ] ( main:8::graphics_mode:21 [ memset_dma_command ] { } ) always clobbers reg byte z +Statement [91] lpoke::addr = graphics_mode::cols#3 [ graphics_mode::i#2 graphics_mode::cols#3 lpoke::addr memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::i#2 graphics_mode::cols#3 lpoke::addr memset_dma_command ] { { graphics_mode::cols#3 = lpoke::addr } } ) always clobbers reg byte a reg byte x reg byte y reg byte z +Statement [92] lpoke::val = 0 [ graphics_mode::i#2 graphics_mode::cols#3 lpoke::addr lpoke::val memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::i#2 graphics_mode::cols#3 lpoke::addr lpoke::val memset_dma_command ] { { graphics_mode::cols#3 = lpoke::addr } } ) always clobbers reg byte z +Statement [94] graphics_mode::cols#1 = ++ graphics_mode::cols#3 [ graphics_mode::i#2 graphics_mode::cols#1 memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::i#2 graphics_mode::cols#1 memset_dma_command ] { { graphics_mode::cols#1 = lpoke::addr } } ) always clobbers reg byte a +Statement [95] lpoke::addr = graphics_mode::cols#1 [ graphics_mode::i#2 lpoke::addr graphics_mode::cols#1 memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::i#2 lpoke::addr graphics_mode::cols#1 memset_dma_command ] { { graphics_mode::cols#1 = lpoke::addr } } ) always clobbers reg byte a reg byte x reg byte y reg byte z +Statement [96] lpoke::val = WHITE [ graphics_mode::i#2 lpoke::addr lpoke::val graphics_mode::cols#1 memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::i#2 lpoke::addr lpoke::val graphics_mode::cols#1 memset_dma_command ] { { graphics_mode::cols#1 = lpoke::addr } } ) always clobbers reg byte z +Statement [98] graphics_mode::cols#2 = ++ graphics_mode::cols#1 [ graphics_mode::i#2 graphics_mode::cols#2 memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::i#2 graphics_mode::cols#2 memset_dma_command ] { } ) always clobbers reg byte a +Statement [100] graphics_mode::ch_x#4 = graphics_mode::ch#2 [ graphics_mode::y#2 graphics_mode::ch#2 graphics_mode::screen#5 graphics_mode::ch_x#4 memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::y#2 graphics_mode::ch#2 graphics_mode::screen#5 graphics_mode::ch_x#4 memset_dma_command ] { } ) always clobbers reg byte a +Statement [103] graphics_mode::screen#1 = graphics_mode::screen#5 + $28*SIZEOF_UNSIGNED_INT [ graphics_mode::y#2 graphics_mode::ch#2 graphics_mode::screen#1 memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::y#2 graphics_mode::ch#2 graphics_mode::screen#1 memset_dma_command ] { } ) always clobbers reg byte a +Statement [106] graphics_mode::$8 = graphics_mode::x#2 << 1 [ graphics_mode::y#2 graphics_mode::ch#2 graphics_mode::screen#5 graphics_mode::x#2 graphics_mode::ch_x#2 graphics_mode::$8 memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::y#2 graphics_mode::ch#2 graphics_mode::screen#5 graphics_mode::x#2 graphics_mode::ch_x#2 graphics_mode::$8 memset_dma_command ] { } ) always clobbers reg byte a +Statement [107] graphics_mode::screen#5[graphics_mode::$8] = graphics_mode::ch_x#2 [ graphics_mode::y#2 graphics_mode::ch#2 graphics_mode::screen#5 graphics_mode::x#2 graphics_mode::ch_x#2 memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::y#2 graphics_mode::ch#2 graphics_mode::screen#5 graphics_mode::x#2 graphics_mode::ch_x#2 memset_dma_command ] { } ) always clobbers reg byte a reg byte y +Statement [108] graphics_mode::ch_x#1 = graphics_mode::ch_x#2 + $19 [ graphics_mode::y#2 graphics_mode::ch#2 graphics_mode::screen#5 graphics_mode::x#2 graphics_mode::ch_x#1 memset_dma_command ] ( main:8::graphics_mode:21 [ graphics_mode::y#2 graphics_mode::ch#2 graphics_mode::screen#5 graphics_mode::x#2 graphics_mode::ch_x#1 memset_dma_command ] { } ) always clobbers reg byte a +Statement [112] if(init_plot::i#2<$140) goto init_plot::@2 [ init_plot::i#2 init_plot::gfx#2 ] ( main:8::init_plot:43 [ init_plot::i#2 init_plot::gfx#2 ] { } ) always clobbers reg byte a +Statement [114] init_plot::$4 = init_plot::i#2 << 1 [ init_plot::i#2 init_plot::gfx#2 init_plot::$4 ] ( main:8::init_plot:43 [ init_plot::i#2 init_plot::gfx#2 init_plot::$4 ] { } ) always clobbers reg byte a +Statement [115] init_plot::$5 = GFX_OFFSET + init_plot::$4 [ init_plot::i#2 init_plot::gfx#2 init_plot::$5 ] ( main:8::init_plot:43 [ init_plot::i#2 init_plot::gfx#2 init_plot::$5 ] { } ) always clobbers reg byte a +Statement [116] *init_plot::$5 = init_plot::gfx#2 [ init_plot::i#2 init_plot::gfx#2 ] ( main:8::init_plot:43 [ init_plot::i#2 init_plot::gfx#2 ] { } ) always clobbers reg byte a reg byte y +Statement [117] init_plot::$1 = init_plot::i#2 & 7 [ init_plot::i#2 init_plot::gfx#2 init_plot::$1 ] ( main:8::init_plot:43 [ init_plot::i#2 init_plot::gfx#2 init_plot::$1 ] { } ) always clobbers reg byte a +Statement [119] init_plot::gfx#1 = init_plot::gfx#2 + $c8 [ init_plot::i#2 init_plot::gfx#1 ] ( main:8::init_plot:43 [ init_plot::i#2 init_plot::gfx#1 ] { } ) always clobbers reg byte a +Statement [124] *((unsigned int *)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = (unsigned int)$28*$19*8 [ memset_dma::dest#3 memset_dma::dmaMode#0 memset_dma_command ] ( main:8::memset_dma:55 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma::dest#3 memset_dma::dmaMode#0 memset_dma_command ] { { memset_dma::dest#0 = memset_dma::dest#3 } } main:8::graphics_mode:21::memset_dma:87 [ memset_dma::dest#3 memset_dma::dmaMode#0 memset_dma_command ] { } main:8::graphics_mode:21::memset_dma:89 [ memset_dma::dest#3 memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [125] *((char **)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (char *)0 [ memset_dma::dest#3 memset_dma::dmaMode#0 memset_dma_command ] ( main:8::memset_dma:55 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma::dest#3 memset_dma::dmaMode#0 memset_dma_command ] { { memset_dma::dest#0 = memset_dma::dest#3 } } main:8::graphics_mode:21::memset_dma:87 [ memset_dma::dest#3 memset_dma::dmaMode#0 memset_dma_command ] { } main:8::graphics_mode:21::memset_dma:89 [ memset_dma::dest#3 memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [126] *((char **)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (char *)memset_dma::dest#3 [ memset_dma::dmaMode#0 memset_dma_command ] ( main:8::memset_dma:55 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma::dmaMode#0 memset_dma_command ] { { memset_dma::dest#0 = memset_dma::dest#3 } } main:8::graphics_mode:21::memset_dma:87 [ memset_dma::dmaMode#0 memset_dma_command ] { } main:8::graphics_mode:21::memset_dma:89 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte a +Statement [127] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 [ memset_dma::dmaMode#0 memset_dma_command ] ( main:8::memset_dma:55 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma::dmaMode#0 memset_dma_command ] { { memset_dma::dest#0 = memset_dma::dest#3 } } main:8::graphics_mode:21::memset_dma:87 [ memset_dma::dmaMode#0 memset_dma_command ] { } main:8::graphics_mode:21::memset_dma:89 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte z +Statement [128] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 [ memset_dma::dmaMode#0 memset_dma_command ] ( main:8::memset_dma:55 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma::dmaMode#0 memset_dma_command ] { { memset_dma::dest#0 = memset_dma::dest#3 } } main:8::graphics_mode:21::memset_dma:87 [ memset_dma::dmaMode#0 memset_dma_command ] { } main:8::graphics_mode:21::memset_dma:89 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte z +Statement [129] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 [ memset_dma::dmaMode#0 memset_dma_command ] ( main:8::memset_dma:55 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma::dmaMode#0 memset_dma_command ] { { memset_dma::dest#0 = memset_dma::dest#3 } } main:8::graphics_mode:21::memset_dma:87 [ memset_dma::dmaMode#0 memset_dma_command ] { } main:8::graphics_mode:21::memset_dma:89 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte z +Statement [130] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = byte1 &memset_dma_command [ memset_dma::dmaMode#0 memset_dma_command ] ( main:8::memset_dma:55 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma::dmaMode#0 memset_dma_command ] { { memset_dma::dest#0 = memset_dma::dest#3 } } main:8::graphics_mode:21::memset_dma:87 [ memset_dma::dmaMode#0 memset_dma_command ] { } main:8::graphics_mode:21::memset_dma:89 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte z +Statement [131] *((char *)DMA) = byte0 &memset_dma_command [ memset_dma::dmaMode#0 memset_dma_command ] ( main:8::memset_dma:55 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx memset_dma::dmaMode#0 memset_dma_command ] { { memset_dma::dest#0 = memset_dma::dest#3 } } main:8::graphics_mode:21::memset_dma:87 [ memset_dma::dmaMode#0 memset_dma_command ] { } main:8::graphics_mode:21::memset_dma:89 [ memset_dma::dmaMode#0 memset_dma_command ] { } ) always clobbers reg byte z +Statement [134] render_dots::idx_x1#0 = sin_x1_idx [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 ] ( main:8::render_dots:57 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 ] { } ) always clobbers reg byte a +Statement [136] if(sin_x1_idx<=SINX1_SIZE) goto render_dots::@1 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 ] ( main:8::render_dots:57 [ graphics_render sin_x1_idx sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 ] { } ) always clobbers reg byte a +Statement [137] sin_x1_idx = sin_x1_idx - SINX1_SIZE [ graphics_render sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 ] ( main:8::render_dots:57 [ graphics_render sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 ] { } ) always clobbers reg byte a +Statement [138] render_dots::idx_x2#0 = sin_x2_idx [ graphics_render sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 ] ( main:8::render_dots:57 [ graphics_render sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 ] { } ) always clobbers reg byte a +Statement [139] sin_x2_idx = sin_x2_idx - 1 [ graphics_render sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 ] ( main:8::render_dots:57 [ graphics_render sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 ] { } ) always clobbers reg byte a +Statement [140] if(sin_x2_idx<=SINX2_SIZE) goto render_dots::@2 [ graphics_render sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 ] ( main:8::render_dots:57 [ graphics_render sin_x2_idx sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 ] { } ) always clobbers reg byte a +Statement [141] sin_x2_idx = sin_x2_idx + SINX2_SIZE [ graphics_render sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 ] ( main:8::render_dots:57 [ graphics_render sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 ] { } ) always clobbers reg byte a +Statement [142] render_dots::idx_y1#0 = sin_y1_idx [ graphics_render sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 ] ( main:8::render_dots:57 [ graphics_render sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 ] { } ) always clobbers reg byte a +Statement [143] sin_y1_idx = sin_y1_idx - 1 [ graphics_render sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 ] ( main:8::render_dots:57 [ graphics_render sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 ] { } ) always clobbers reg byte a +Statement [144] if(sin_y1_idx<=SINY1_SIZE) goto render_dots::@3 [ graphics_render sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 ] ( main:8::render_dots:57 [ graphics_render sin_y1_idx sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 ] { } ) always clobbers reg byte a +Statement [145] sin_y1_idx = sin_y1_idx + SINY1_SIZE [ graphics_render sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 ] ( main:8::render_dots:57 [ graphics_render sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 ] { } ) always clobbers reg byte a +Statement [146] render_dots::idx_y2#0 = sin_y2_idx [ graphics_render sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 render_dots::idx_y2#0 ] ( main:8::render_dots:57 [ graphics_render sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 render_dots::idx_y2#0 ] { } ) always clobbers reg byte a +Statement [148] if(sin_y2_idx<=SINY2_SIZE) goto render_dots::@8 [ graphics_render sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 render_dots::idx_y2#0 ] ( main:8::render_dots:57 [ graphics_render sin_y2_idx render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 render_dots::idx_y2#0 ] { } ) always clobbers reg byte a +Statement [149] sin_y2_idx = sin_y2_idx - SINY2_SIZE [ graphics_render render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 render_dots::idx_y2#0 ] ( main:8::render_dots:57 [ graphics_render render_dots::idx_x1#0 render_dots::idx_x2#0 render_dots::idx_y1#0 render_dots::idx_y2#0 ] { } ) always clobbers reg byte a +Statement [151] if(render_dots::i#10<$600) goto render_dots::@9 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 ] { } ) always clobbers reg byte a +Statement [153] render_dots::$20 = render_dots::idx_x1#3 << 1 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::$20 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::$20 ] { } ) always clobbers reg byte a +Statement [154] render_dots::$21 = render_dots::idx_x2#3 << 1 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::$20 render_dots::$21 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::$20 render_dots::$21 ] { } ) always clobbers reg byte a +Statement [155] render_dots::$22 = SINX1 + render_dots::$20 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::$21 render_dots::$22 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::$21 render_dots::$22 ] { } ) always clobbers reg byte a +Statement [156] render_dots::$23 = SINX2 + render_dots::$21 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::$22 render_dots::$23 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::$22 render_dots::$23 ] { } ) always clobbers reg byte a +Statement [157] plot::x#0 = *render_dots::$22 + *render_dots::$23 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 plot::x#0 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 plot::x#0 ] { } ) always clobbers reg byte a reg byte y +Statement [158] render_dots::$24 = SINY1 + render_dots::idx_y1#11 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 plot::x#0 render_dots::$24 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 plot::x#0 render_dots::$24 ] { } ) always clobbers reg byte a +Statement [159] render_dots::$25 = SINY2 + render_dots::idx_y2#11 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 plot::x#0 render_dots::$24 render_dots::$25 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 plot::x#0 render_dots::$24 render_dots::$25 ] { } ) always clobbers reg byte a +Statement [160] plot::y#0 = *render_dots::$24 + *render_dots::$25 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 plot::x#0 plot::y#0 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 plot::x#0 plot::y#0 ] { } ) always clobbers reg byte a reg byte y +Statement [162] render_dots::idx_x1#1 = render_dots::idx_x1#3 - $b [ graphics_render render_dots::i#10 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#1 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#1 ] { } ) always clobbers reg byte a +Statement [163] if(render_dots::idx_x1#1<=SINX1_SIZE) goto render_dots::@10 [ graphics_render render_dots::i#10 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#1 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#1 ] { } ) always clobbers reg byte a +Statement [164] render_dots::idx_x1#2 = render_dots::idx_x1#1 + SINX1_SIZE [ graphics_render render_dots::i#10 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#2 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#2 ] { } ) always clobbers reg byte a +Statement [166] render_dots::idx_x2#1 = render_dots::idx_x2#3 + 3 [ graphics_render render_dots::i#10 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#1 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#1 ] { } ) always clobbers reg byte a +Statement [167] if(render_dots::idx_x2#1<=SINX2_SIZE) goto render_dots::@11 [ graphics_render render_dots::i#10 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#1 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#1 ] { } ) always clobbers reg byte a +Statement [168] render_dots::idx_x2#2 = render_dots::idx_x2#1 - SINX2_SIZE [ graphics_render render_dots::i#10 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#2 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_y1#11 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#2 ] { } ) always clobbers reg byte a +Statement [170] render_dots::idx_y1#1 = render_dots::idx_y1#11 + 9 [ graphics_render render_dots::i#10 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#1 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#1 ] { } ) always clobbers reg byte a +Statement [171] if(render_dots::idx_y1#1<=SINY1_SIZE) goto render_dots::@12 [ graphics_render render_dots::i#10 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#1 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#1 ] { } ) always clobbers reg byte a +Statement [172] render_dots::idx_y1#2 = render_dots::idx_y1#1 - SINY1_SIZE [ graphics_render render_dots::i#10 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#2 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_y2#11 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#2 ] { } ) always clobbers reg byte a +Statement [174] render_dots::idx_y2#1 = render_dots::idx_y2#11 - 5 [ graphics_render render_dots::i#10 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#15 render_dots::idx_y2#1 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#15 render_dots::idx_y2#1 ] { } ) always clobbers reg byte a +Statement [175] if(render_dots::idx_y2#1<=SINY2_SIZE) goto render_dots::@13 [ graphics_render render_dots::i#10 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#15 render_dots::idx_y2#1 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#15 render_dots::idx_y2#1 ] { } ) always clobbers reg byte a +Statement [176] render_dots::idx_y2#2 = render_dots::idx_y2#1 + SINY2_SIZE [ graphics_render render_dots::i#10 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#15 render_dots::idx_y2#2 ] ( main:8::render_dots:57 [ graphics_render render_dots::i#10 render_dots::idx_x1#11 render_dots::idx_x2#13 render_dots::idx_y1#15 render_dots::idx_y2#2 ] { } ) always clobbers reg byte a +Statement asm { ldz#0 ldaval sta((addr)),z } always clobbers reg byte a reg byte z +Statement [181] plot::$3 = plot::x#0 << 1 [ graphics_render plot::x#0 plot::y#0 plot::$3 ] ( main:8::render_dots:57::plot:161 [ render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 graphics_render plot::x#0 plot::y#0 plot::$3 ] { } ) always clobbers reg byte a +Statement [182] plot::$4 = GFX_OFFSET + plot::$3 [ graphics_render plot::x#0 plot::y#0 plot::$4 ] ( main:8::render_dots:57::plot:161 [ render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 graphics_render plot::x#0 plot::y#0 plot::$4 ] { } ) always clobbers reg byte a +Statement [183] plot::$0 = graphics_render + *plot::$4 [ graphics_render plot::x#0 plot::y#0 plot::$0 ] ( main:8::render_dots:57::plot:161 [ render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 graphics_render plot::x#0 plot::y#0 plot::$0 ] { } ) always clobbers reg byte a reg byte y +Statement [184] plot::$2 = plot::x#0 & 7 [ graphics_render plot::y#0 plot::$0 plot::$2 ] ( main:8::render_dots:57::plot:161 [ render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 graphics_render plot::y#0 plot::$0 plot::$2 ] { } ) always clobbers reg byte a +Statement [185] plot::$0[plot::y#0] = plot::$0[plot::y#0] | GFX_BIT[plot::$2] [ graphics_render ] ( main:8::render_dots:57::plot:161 [ render_dots::i#10 render_dots::idx_x1#3 render_dots::idx_x2#3 render_dots::idx_y1#11 render_dots::idx_y2#11 graphics_render ] { } ) always clobbers reg byte a +Potential registers zp[1]:46 [ graphics_mode::y#2 graphics_mode::y#1 ] : zp[1]:46 , reg byte x , reg byte z , +Potential registers zp[2]:58 [ graphics_mode::ch#2 graphics_mode::ch#1 ] : zp[2]:58 , +Potential registers zp[2]:52 [ graphics_mode::screen#5 graphics_mode::screen#1 ] : zp[2]:52 , +Potential registers zp[2]:44 [ graphics_mode::i#2 graphics_mode::i#1 ] : zp[2]:44 , +Potential registers zp[4]:54 [ graphics_mode::cols#3 graphics_mode::cols#2 ] : zp[4]:54 , +Potential registers zp[1]:34 [ graphics_mode::x#2 graphics_mode::x#1 ] : zp[1]:34 , reg byte x , reg byte z , +Potential registers zp[2]:36 [ graphics_mode::ch_x#2 graphics_mode::ch_x#4 graphics_mode::ch_x#1 ] : zp[2]:36 , +Potential registers zp[2]:42 [ init_plot::i#2 init_plot::i#1 ] : zp[2]:42 , +Potential registers zp[2]:40 [ init_plot::gfx#2 init_plot::gfx#5 init_plot::gfx#1 ] : zp[2]:40 , +Potential registers zp[2]:73 [ memset_dma::dest#3 memset_dma::dest#0 ] : zp[2]:73 , +Potential registers zp[2]:20 [ render_dots::i#10 render_dots::i#1 ] : zp[2]:20 , +Potential registers zp[2]:15 [ render_dots::idx_x1#3 render_dots::idx_x1#11 render_dots::idx_x1#0 render_dots::idx_x1#2 render_dots::idx_x1#1 ] : zp[2]:15 , +Potential registers zp[2]:13 [ render_dots::idx_x2#3 render_dots::idx_x2#13 render_dots::idx_x2#0 render_dots::idx_x2#1 render_dots::idx_x2#2 ] : zp[2]:13 , +Potential registers zp[2]:11 [ render_dots::idx_y1#11 render_dots::idx_y1#15 render_dots::idx_y1#0 render_dots::idx_y1#1 render_dots::idx_y1#2 ] : zp[2]:11 , +Potential registers zp[2]:9 [ render_dots::idx_y2#11 render_dots::idx_y2#9 render_dots::idx_y2#0 render_dots::idx_y2#1 render_dots::idx_y2#2 ] : zp[2]:9 , +Potential registers zp[1]:81 [ buffer ] : zp[1]:81 , +Potential registers zp[2]:38 [ graphics_render ] : zp[2]:38 , +Potential registers zp[2]:69 [ sin_x1_idx ] : zp[2]:69 , +Potential registers zp[2]:71 [ sin_x2_idx ] : zp[2]:71 , +Potential registers zp[2]:76 [ sin_y1_idx ] : zp[2]:76 , +Potential registers zp[2]:78 [ sin_y2_idx ] : zp[2]:78 , +Potential registers zp[1]:84 [ memoryRemap::aVal ] : zp[1]:84 , +Potential registers zp[1]:83 [ memoryRemap::xVal ] : zp[1]:83 , +Potential registers zp[1]:82 [ memoryRemap::yVal ] : zp[1]:82 , +Potential registers zp[1]:80 [ memoryRemap::zVal ] : zp[1]:80 , +Potential registers zp[4]:65 [ lpoke::addr ] : zp[4]:65 , +Potential registers zp[1]:60 [ lpoke::val ] : zp[1]:60 , +Potential registers zp[4]:61 [ graphics_mode::cols#1 ] : zp[4]:61 , +Potential registers zp[1]:35 [ graphics_mode::$8 ] : zp[1]:35 , reg byte a , reg byte x , reg byte y , reg byte z , +Potential registers zp[2]:47 [ init_plot::$4 ] : zp[2]:47 , +Potential registers zp[2]:49 [ init_plot::$5 ] : zp[2]:49 , +Potential registers zp[1]:51 [ init_plot::$1 ] : zp[1]:51 , reg byte a , reg byte x , reg byte y , reg byte z , +Potential registers zp[1]:75 [ memset_dma::dmaMode#0 ] : zp[1]:75 , reg byte x , reg byte y , +Potential registers zp[2]:26 [ render_dots::$20 ] : zp[2]:26 , +Potential registers zp[2]:28 [ render_dots::$21 ] : zp[2]:28 , +Potential registers zp[2]:30 [ render_dots::$22 ] : zp[2]:30 , +Potential registers zp[2]:22 [ render_dots::$23 ] : zp[2]:22 , +Potential registers zp[2]:18 [ plot::x#0 ] : zp[2]:18 , +Potential registers zp[2]:32 [ render_dots::$24 ] : zp[2]:32 , +Potential registers zp[2]:24 [ render_dots::$25 ] : zp[2]:24 , +Potential registers zp[1]:17 [ plot::y#0 ] : zp[1]:17 , reg byte x , reg byte z , +Potential registers zp[2]:2 [ plot::$3 ] : zp[2]:2 , +Potential registers zp[2]:4 [ plot::$4 ] : zp[2]:4 , +Potential registers zp[2]:7 [ plot::$0 ] : zp[2]:7 , +Potential registers zp[1]:6 [ plot::$2 ] : zp[1]:6 , reg byte a , reg byte x , reg byte y , reg byte z , +Potential registers mem[12] [ memset_dma_command ] : mem[12] , + +REGISTER UPLIFT SCOPES +Uplift Scope [plot] 2,000,002: zp[2]:2 [ plot::$3 ] 2,000,002: zp[2]:4 [ plot::$4 ] 2,000,002: zp[1]:6 [ plot::$2 ] 1,500,001.5: zp[2]:7 [ plot::$0 ] 420,000.6: zp[1]:17 [ plot::y#0 ] 300,000.43: zp[2]:18 [ plot::x#0 ] +Uplift Scope [render_dots] 563,886.9: zp[2]:9 [ render_dots::idx_y2#11 render_dots::idx_y2#9 render_dots::idx_y2#0 render_dots::idx_y2#1 render_dots::idx_y2#2 ] 466,274.88: zp[2]:11 [ render_dots::idx_y1#11 render_dots::idx_y1#15 render_dots::idx_y1#0 render_dots::idx_y1#1 render_dots::idx_y1#2 ] 450,388.22: zp[2]:13 [ render_dots::idx_x2#3 render_dots::idx_x2#13 render_dots::idx_x2#0 render_dots::idx_x2#1 render_dots::idx_x2#2 ] 449,075.47: zp[2]:15 [ render_dots::idx_x1#3 render_dots::idx_x1#11 render_dots::idx_x1#0 render_dots::idx_x1#2 render_dots::idx_x1#1 ] 211,113.22: zp[2]:20 [ render_dots::i#10 render_dots::i#1 ] 200,002: zp[2]:22 [ render_dots::$23 ] 200,002: zp[2]:24 [ render_dots::$25 ] 100,001: zp[2]:26 [ render_dots::$20 ] 100,001: zp[2]:28 [ render_dots::$21 ] 100,001: zp[2]:30 [ render_dots::$22 ] 100,001: zp[2]:32 [ render_dots::$24 ] +Uplift Scope [graphics_mode] 28,002.8: zp[1]:34 [ graphics_mode::x#2 graphics_mode::x#1 ] 20,002: zp[1]:35 [ graphics_mode::$8 ] 19,754: zp[2]:36 [ graphics_mode::ch_x#2 graphics_mode::ch_x#4 graphics_mode::ch_x#1 ] 2,302.3: zp[2]:44 [ graphics_mode::i#2 graphics_mode::i#1 ] 2,275: zp[1]:46 [ graphics_mode::y#2 graphics_mode::y#1 ] 2,001: zp[2]:52 [ graphics_mode::screen#5 graphics_mode::screen#1 ] 1,601.6: zp[4]:54 [ graphics_mode::cols#3 graphics_mode::cols#2 ] 1,301.3: zp[2]:58 [ graphics_mode::ch#2 graphics_mode::ch#1 ] 750.75: zp[4]:61 [ graphics_mode::cols#1 ] +Uplift Scope [] 17,860.8: zp[2]:38 [ graphics_render ] 300.4: zp[2]:69 [ sin_x1_idx ] 250.33: zp[2]:71 [ sin_x2_idx ] 214.57: zp[2]:76 [ sin_y1_idx ] 187.75: zp[2]:78 [ sin_y2_idx ] 76.25: zp[1]:81 [ buffer ] 0: mem[12] [ memset_dma_command ] +Uplift Scope [init_plot] 4,075.5: zp[2]:40 [ init_plot::gfx#2 init_plot::gfx#5 init_plot::gfx#1 ] 2,558.11: zp[2]:42 [ init_plot::i#2 init_plot::i#1 ] 2,002: zp[2]:47 [ init_plot::$4 ] 2,002: zp[2]:49 [ init_plot::$5 ] 2,002: zp[1]:51 [ init_plot::$1 ] +Uplift Scope [lpoke] 1,001: zp[1]:60 [ lpoke::val ] 500.5: zp[4]:65 [ lpoke::addr ] +Uplift Scope [memset_dma] 227.25: zp[2]:73 [ memset_dma::dest#3 memset_dma::dest#0 ] 222.44: zp[1]:75 [ memset_dma::dmaMode#0 ] +Uplift Scope [memoryRemap] 101: zp[1]:80 [ memoryRemap::zVal ] 50.5: zp[1]:82 [ memoryRemap::yVal ] 33.67: zp[1]:83 [ memoryRemap::xVal ] 25.25: zp[1]:84 [ memoryRemap::aVal ] +Uplift Scope [MOS6526_CIA] +Uplift Scope [MOS6569_VICII] +Uplift Scope [MOS6581_SID] +Uplift Scope [MOS4569_VICIII] +Uplift Scope [MEGA65_VICIV] +Uplift Scope [F018_DMAGIC] +Uplift Scope [DMA_LIST_F018A] +Uplift Scope [DMA_LIST_F018B] +Uplift Scope [main] +Uplift Scope [__start] + +Uplifting [plot] best 59514 combination zp[2]:2 [ plot::$3 ] zp[2]:4 [ plot::$4 ] reg byte a [ plot::$2 ] zp[2]:7 [ plot::$0 ] reg byte z [ plot::y#0 ] zp[2]:18 [ plot::x#0 ] +Uplifting [render_dots] best 59514 combination zp[2]:9 [ render_dots::idx_y2#11 render_dots::idx_y2#9 render_dots::idx_y2#0 render_dots::idx_y2#1 render_dots::idx_y2#2 ] zp[2]:11 [ render_dots::idx_y1#11 render_dots::idx_y1#15 render_dots::idx_y1#0 render_dots::idx_y1#1 render_dots::idx_y1#2 ] zp[2]:13 [ render_dots::idx_x2#3 render_dots::idx_x2#13 render_dots::idx_x2#0 render_dots::idx_x2#1 render_dots::idx_x2#2 ] zp[2]:15 [ render_dots::idx_x1#3 render_dots::idx_x1#11 render_dots::idx_x1#0 render_dots::idx_x1#2 render_dots::idx_x1#1 ] zp[2]:20 [ render_dots::i#10 render_dots::i#1 ] zp[2]:22 [ render_dots::$23 ] zp[2]:24 [ render_dots::$25 ] zp[2]:26 [ render_dots::$20 ] zp[2]:28 [ render_dots::$21 ] zp[2]:30 [ render_dots::$22 ] zp[2]:32 [ render_dots::$24 ] +Uplifting [graphics_mode] best 57824 combination reg byte z [ graphics_mode::x#2 graphics_mode::x#1 ] reg byte a [ graphics_mode::$8 ] zp[2]:36 [ graphics_mode::ch_x#2 graphics_mode::ch_x#4 graphics_mode::ch_x#1 ] zp[2]:44 [ graphics_mode::i#2 graphics_mode::i#1 ] reg byte x [ graphics_mode::y#2 graphics_mode::y#1 ] zp[2]:52 [ graphics_mode::screen#5 graphics_mode::screen#1 ] zp[4]:54 [ graphics_mode::cols#3 graphics_mode::cols#2 ] zp[2]:58 [ graphics_mode::ch#2 graphics_mode::ch#1 ] zp[4]:61 [ graphics_mode::cols#1 ] +Uplifting [] best 57824 combination zp[2]:38 [ graphics_render ] zp[2]:69 [ sin_x1_idx ] zp[2]:71 [ sin_x2_idx ] zp[2]:76 [ sin_y1_idx ] zp[2]:78 [ sin_y2_idx ] zp[1]:81 [ buffer ] mem[12] [ memset_dma_command ] +Uplifting [init_plot] best 57764 combination zp[2]:40 [ init_plot::gfx#2 init_plot::gfx#5 init_plot::gfx#1 ] zp[2]:42 [ init_plot::i#2 init_plot::i#1 ] zp[2]:47 [ init_plot::$4 ] zp[2]:49 [ init_plot::$5 ] reg byte a [ init_plot::$1 ] +Uplifting [lpoke] best 57764 combination zp[1]:60 [ lpoke::val ] zp[4]:65 [ lpoke::addr ] +Uplifting [memset_dma] best 57758 combination zp[2]:73 [ memset_dma::dest#3 memset_dma::dest#0 ] reg byte x [ memset_dma::dmaMode#0 ] +Uplifting [memoryRemap] best 57758 combination zp[1]:80 [ memoryRemap::zVal ] zp[1]:82 [ memoryRemap::yVal ] zp[1]:83 [ memoryRemap::xVal ] zp[1]:84 [ memoryRemap::aVal ] +Uplifting [MOS6526_CIA] best 57758 combination +Uplifting [MOS6569_VICII] best 57758 combination +Uplifting [MOS6581_SID] best 57758 combination +Uplifting [MOS4569_VICIII] best 57758 combination +Uplifting [MEGA65_VICIV] best 57758 combination +Uplifting [F018_DMAGIC] best 57758 combination +Uplifting [DMA_LIST_F018A] best 57758 combination +Uplifting [DMA_LIST_F018B] best 57758 combination +Uplifting [main] best 57758 combination +Uplifting [__start] best 57758 combination +Attempting to uplift remaining variables inzp[1]:60 [ lpoke::val ] +Uplifting [lpoke] best 57758 combination zp[1]:60 [ lpoke::val ] +Attempting to uplift remaining variables inzp[1]:80 [ memoryRemap::zVal ] +Uplifting [memoryRemap] best 57758 combination zp[1]:80 [ memoryRemap::zVal ] +Attempting to uplift remaining variables inzp[1]:81 [ buffer ] +Uplifting [] best 57758 combination zp[1]:81 [ buffer ] +Attempting to uplift remaining variables inzp[1]:82 [ memoryRemap::yVal ] +Uplifting [memoryRemap] best 57758 combination zp[1]:82 [ memoryRemap::yVal ] +Attempting to uplift remaining variables inzp[1]:83 [ memoryRemap::xVal ] +Uplifting [memoryRemap] best 57758 combination zp[1]:83 [ memoryRemap::xVal ] +Attempting to uplift remaining variables inzp[1]:84 [ memoryRemap::aVal ] +Uplifting [memoryRemap] best 57758 combination zp[1]:84 [ memoryRemap::aVal ] +Coalescing zero page register [ zp[4]:54 [ graphics_mode::cols#3 graphics_mode::cols#2 ] ] with [ zp[4]:61 [ graphics_mode::cols#1 ] ] - score: 2 +Coalescing zero page register [ zp[2]:47 [ init_plot::$4 ] ] with [ zp[2]:49 [ init_plot::$5 ] ] - score: 1 +Coalescing zero page register [ zp[2]:26 [ render_dots::$20 ] ] with [ zp[2]:30 [ render_dots::$22 ] ] - score: 1 +Coalescing zero page register [ zp[2]:28 [ render_dots::$21 ] ] with [ zp[2]:22 [ render_dots::$23 ] ] - score: 1 +Coalescing zero page register [ zp[2]:2 [ plot::$3 ] ] with [ zp[2]:4 [ plot::$4 ] ] - score: 1 +Coalescing zero page register [ zp[2]:26 [ render_dots::$20 render_dots::$22 ] ] with [ zp[2]:18 [ plot::x#0 ] ] - score: 1 +Coalescing zero page register [ zp[2]:2 [ plot::$3 plot::$4 ] ] with [ zp[2]:7 [ plot::$0 ] ] - score: 1 +Coalescing zero page register [ zp[2]:42 [ init_plot::i#2 init_plot::i#1 ] ] with [ zp[2]:58 [ graphics_mode::ch#2 graphics_mode::ch#1 ] ] +Coalescing zero page register [ zp[2]:40 [ init_plot::gfx#2 init_plot::gfx#5 init_plot::gfx#1 ] ] with [ zp[2]:52 [ graphics_mode::screen#5 graphics_mode::screen#1 ] ] +Coalescing zero page register [ zp[2]:20 [ render_dots::i#10 render_dots::i#1 ] ] with [ zp[2]:44 [ graphics_mode::i#2 graphics_mode::i#1 ] ] +Coalescing zero page register [ zp[2]:15 [ render_dots::idx_x1#3 render_dots::idx_x1#11 render_dots::idx_x1#0 render_dots::idx_x1#2 render_dots::idx_x1#1 ] ] with [ zp[2]:36 [ graphics_mode::ch_x#2 graphics_mode::ch_x#4 graphics_mode::ch_x#1 ] ] +Coalescing zero page register [ zp[2]:13 [ render_dots::idx_x2#3 render_dots::idx_x2#13 render_dots::idx_x2#0 render_dots::idx_x2#1 render_dots::idx_x2#2 ] ] with [ zp[2]:73 [ memset_dma::dest#3 memset_dma::dest#0 ] ] +Coalescing zero page register [ zp[2]:47 [ init_plot::$4 init_plot::$5 ] ] with [ zp[2]:11 [ render_dots::idx_y1#11 render_dots::idx_y1#15 render_dots::idx_y1#0 render_dots::idx_y1#1 render_dots::idx_y1#2 ] ] +Coalescing zero page register [ zp[2]:9 [ render_dots::idx_y2#11 render_dots::idx_y2#9 render_dots::idx_y2#0 render_dots::idx_y2#1 render_dots::idx_y2#2 ] ] with [ zp[2]:42 [ init_plot::i#2 init_plot::i#1 graphics_mode::ch#2 graphics_mode::ch#1 ] ] +Coalescing zero page register [ zp[2]:26 [ render_dots::$20 render_dots::$22 plot::x#0 ] ] with [ zp[2]:40 [ init_plot::gfx#2 init_plot::gfx#5 init_plot::gfx#1 graphics_mode::screen#5 graphics_mode::screen#1 ] ] +Allocated (was zp[2]:9) zp[2]:4 [ render_dots::idx_y2#11 render_dots::idx_y2#9 render_dots::idx_y2#0 render_dots::idx_y2#1 render_dots::idx_y2#2 init_plot::i#2 init_plot::i#1 graphics_mode::ch#2 graphics_mode::ch#1 ] +Allocated (was zp[2]:26) zp[2]:6 [ render_dots::$20 render_dots::$22 plot::x#0 init_plot::gfx#2 init_plot::gfx#5 init_plot::gfx#1 graphics_mode::screen#5 graphics_mode::screen#1 ] +Allocated (was zp[2]:47) zp[2]:8 [ init_plot::$4 init_plot::$5 render_dots::idx_y1#11 render_dots::idx_y1#15 render_dots::idx_y1#0 render_dots::idx_y1#1 render_dots::idx_y1#2 ] +Allocated (was zp[2]:15) zp[2]:10 [ render_dots::idx_x1#3 render_dots::idx_x1#11 render_dots::idx_x1#0 render_dots::idx_x1#2 render_dots::idx_x1#1 graphics_mode::ch_x#2 graphics_mode::ch_x#4 graphics_mode::ch_x#1 ] +Allocated (was zp[2]:13) zp[2]:12 [ render_dots::idx_x2#3 render_dots::idx_x2#13 render_dots::idx_x2#0 render_dots::idx_x2#1 render_dots::idx_x2#2 memset_dma::dest#3 memset_dma::dest#0 ] +Allocated (was zp[2]:28) zp[2]:14 [ render_dots::$21 render_dots::$23 ] +Allocated (was zp[2]:20) zp[2]:16 [ render_dots::i#10 render_dots::i#1 graphics_mode::i#2 graphics_mode::i#1 ] +Allocated (was zp[2]:24) zp[2]:18 [ render_dots::$25 ] +Allocated (was zp[2]:32) zp[2]:20 [ render_dots::$24 ] +Allocated (was zp[2]:38) zp[2]:22 [ graphics_render ] +Allocated (was zp[4]:54) zp[4]:24 [ graphics_mode::cols#3 graphics_mode::cols#2 graphics_mode::cols#1 ] +Allocated (was zp[1]:60) zp[1]:28 [ lpoke::val ] +Allocated (was zp[4]:65) zp[4]:29 [ lpoke::addr ] +Allocated (was zp[2]:69) zp[2]:33 [ sin_x1_idx ] +Allocated (was zp[2]:71) zp[2]:35 [ sin_x2_idx ] +Allocated (was zp[2]:76) zp[2]:37 [ sin_y1_idx ] +Allocated (was zp[2]:78) zp[2]:39 [ sin_y2_idx ] +Allocated (was zp[1]:80) zp[1]:41 [ memoryRemap::zVal ] +Allocated (was zp[1]:81) zp[1]:42 [ buffer ] +Allocated (was zp[1]:82) zp[1]:43 [ memoryRemap::yVal ] +Allocated (was zp[1]:83) zp[1]:44 [ memoryRemap::xVal ] +Allocated (was zp[1]:84) zp[1]:45 [ memoryRemap::aVal ] + +ASSEMBLER BEFORE OPTIMIZATION + // File Comments +// A pretty simple double sine plotter + // Upstart +.cpu _45gs02 + // MEGA65 platform PRG executable starting in MEGA65 mode. +.file [name="camelot-1536dots.prg", type="prg", segments="Program"] +.segmentdef Program [segments="Basic, Code, Data"] +.segmentdef Basic [start=$2001] +.segmentdef Code [start=$2017] +.segmentdef Data [startAfter="Code"] +.segment Basic +.byte $0a, $20, $0a, $00, $fe, $02, $20, $30, $00 // 10 BANK 0 +.byte $15, $20, $14, $00, $9e, $20 // 20 SYS +.text toIntString(__start) // NNNN +.byte $00, $00, $00 // + // Global Constants & labels + /// $47, $53: MEGA65 personality + .const VICIV_KEY_M65_A = $47 + .const VICIV_KEY_M65_B = $53 + /// 6 FAST Enable C65 FAST mode (3 .5MHz) + .const VICIV_FAST = $40 + /// $D054 VIC-IV Control register C + /// 0 CHR16 enable 16-bit character numbers (two screen bytes per character) + .const VICIV_CHR16 = 1 + /// 6 VIC-IV:VFAST C65GS FAST mode (48MHz) + .const VICIV_VFAST = $40 + /// $D06E.0-6 SPRPTRADR sprite pointer address (bits 22 - 16) + /// 7 SPRPTR16 16-bit sprite pointer mode (allows sprites to be located on any 64 byte boundary in chip RAM) + .const VICIV_SPRPTR16 = $80 + /// DMA command fill + .const DMA_COMMAND_FILL = 3 + /// Mask for PROCESSOR_PORT_DDR which allows only memory configuration to be written + .const PROCPORT_DDR_MEMORY_MASK = 7 + /// RAM in 0xA000, 0xE000 I/O in 0xD000 + .const PROCPORT_RAM_IO = 5 + /// The colors of the C64 + .const BLACK = 0 + .const WHITE = 1 + .const PURPLE = 4 + .const BLUE = 6 + .const DARK_GREY = $b + // Sine table + .const SINY1_SIZE = $2dd + .const SINY2_SIZE = $13d + .const SINX1_SIZE = $64d + .const SINX2_SIZE = $223 + .const SIZEOF_UNSIGNED_INT = 2 + .const OFFSET_STRUCT_F018_DMAGIC_EN018B = 3 + .const OFFSET_STRUCT_DMA_LIST_F018B_COUNT = 1 + .const OFFSET_STRUCT_DMA_LIST_F018B_SRC = 3 + .const OFFSET_STRUCT_DMA_LIST_F018B_DEST = 6 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRMB = 4 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRBANK = 2 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRMSB = 1 + .const OFFSET_STRUCT_MEGA65_VICIV_KEY = $2f + .const OFFSET_STRUCT_MEGA65_VICIV_CONTROLA = $30 + .const OFFSET_STRUCT_MEGA65_VICIV_CONTROLB = $31 + .const OFFSET_STRUCT_MEGA65_VICIV_CONTROLC = $54 + .const OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOLO = $6c + .const OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOHI = $6d + .const OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_HILO = $6e + .const OFFSET_STRUCT_MEGA65_VICIV_SPRITES_ENABLE = $15 + .const OFFSET_STRUCT_MEGA65_VICIV_SPRITES_PRIORITY = $1b + .const OFFSET_STRUCT_MEGA65_VICIV_RASTER = $12 + .const OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO = $68 + .const OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI = $69 + .const OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO = $6a + .const OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR = $20 + .const OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO = $58 + .const OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI = $59 + .const OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT = $5e + .const OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO = $60 + .const OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI = $61 + .const OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO = $62 + .const OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR = $21 + /// Sprite X position register for sprite #0 + .label SPRITES_XPOS = $d000 + /// Sprite Y position register for sprite #0 + .label SPRITES_YPOS = $d001 + /// Sprite X position MSB register + .label SPRITES_XMSB = $d010 + /// Sprite colors register for sprite #0 + .label SPRITES_COLOR = $d027 + /// Processor port data direction register + .label PROCPORT_DDR = 0 + /// Processor Port Register controlling RAM/ROM configuration and the datasette + .label PROCPORT = 1 + /// The VIC IV + .label VICIV = $d000 + /// DMAgic F018 Controller + .label DMA = $d700 + // Address of the screen + .label SCREEN = $c800 + // // Absolute address of graphics buffer 1 + .label GRAPHICS1 = $a000 + // // Absolute address of graphics buffer 2 + .label GRAPHICS2 = $7000 + // Pointer to the music init routine + .label musicInit = MUSIC + // Pointer to the music play routine + .label musicPlay = MUSIC+3 + // 0: show GRAPHICS1, render to GRAPHICS2 + // 1: show GRAPHICS2, render to GRAPHICS1 + .label buffer = $2a + // The graphics being rendered to + .label graphics_render = $16 + // Sine idx for each plot + .label sin_x1_idx = $21 + .label sin_x2_idx = $23 + .label sin_y1_idx = $25 + .label sin_y2_idx = $27 +.segment Code + // __start +__start: { + jmp __init1 + // __start::__init1 + __init1: + // [1] buffer = 0 -- vbuz1=vbuc1 + ldz #0 + stz.z buffer + // [2] graphics_render = GRAPHICS1 -- pbuz1=pbuc1 + lda #GRAPHICS1 + sta.z graphics_render+1 + // [3] sin_x1_idx = 0 -- vwuz1=vwuc1 + lda #<0 + sta.z sin_x1_idx + lda #>0 + sta.z sin_x1_idx+1 + // [4] sin_x2_idx = 0 -- vwuz1=vwuc1 + lda #<0 + sta.z sin_x2_idx + lda #>0 + sta.z sin_x2_idx+1 + // [5] sin_y1_idx = 0 -- vwuz1=vwuc1 + lda #<0 + sta.z sin_y1_idx + lda #>0 + sta.z sin_y1_idx+1 + // [6] sin_y2_idx = 0 -- vwuz1=vwuc1 + lda #<0 + sta.z sin_y2_idx + lda #>0 + sta.z sin_y2_idx+1 + // [7] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1] + __b1_from___init1: + jmp __b1 + // __start::@1 + __b1: + // [8] call main + // [10] phi from __start::@1 to main [phi:__start::@1->main] + main_from___b1: + jsr main + jmp __breturn + // __start::@return + __breturn: + // [9] return + rts +} + // main +main: { + .const toSpritePtr1_return = $ff&toSpritePtr1_sprite/$40 + .const toSpritePtr2_return = $ff&toSpritePtr2_sprite/$40 + .const toSpritePtr3_return = $ff&SPRITES/$40 + .label toSpritePtr1_sprite = SPRITES+$40 + .label toSpritePtr2_sprite = SPRITES+$80 + jmp SEI1 + // main::SEI1 + SEI1: + // asm { sei } + sei + // [12] phi from main::SEI1 to main::@6 [phi:main::SEI1->main::@6] + __b6_from_SEI1: + jmp __b6 + // main::@6 + __b6: + // [13] call memoryRemap + // Map memory to BANK 0 : 0x00XXXX - giving access to I/O + jsr memoryRemap + jmp __b10 + // main::@10 + __b10: + // [14] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 + // Disable Kernal & Basic + ldz #PROCPORT_DDR_MEMORY_MASK + stz PROCPORT_DDR + // [15] *PROCPORT = PROCPORT_RAM_IO -- _deref_pbuc1=vbuc2 + ldz #PROCPORT_RAM_IO + stz PROCPORT + // [16] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = VICIV_KEY_M65_A -- _deref_pbuc1=vbuc2 + // Enable MEGA65 features + ldz #VICIV_KEY_M65_A + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY + // [17] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = VICIV_KEY_M65_B -- _deref_pbuc1=vbuc2 + ldz #VICIV_KEY_M65_B + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY + // [18] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLA) = 0 -- _deref_pbuc1=vbuc2 + // No C65 ROMs are mapped + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLA + // [19] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) | VICIV_FAST -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 + // Enable 48MHz fast mode + lda #VICIV_FAST + ora VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + // [20] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) | VICIV_VFAST -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 + lda #VICIV_VFAST + ora VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + // [21] call graphics_mode + // Initialize graphics + jsr graphics_mode + jmp __b11 + // main::@11 + __b11: + // [22] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOLO) = byte0 SPRITE_PTRS -- _deref_pbuc1=vbuc2 + // Show sprites + ldz #SPRITE_PTRS + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOHI + // [24] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_HILO) = VICIV_SPRPTR16 -- _deref_pbuc1=vbuc2 + ldz #VICIV_SPRPTR16 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_HILO + // [25] phi from main::@11 to main::toSpritePtr1 [phi:main::@11->main::toSpritePtr1] + toSpritePtr1_from___b11: + jmp toSpritePtr1 + // main::toSpritePtr1 + toSpritePtr1: + jmp __b7 + // main::@7 + __b7: + // [26] *SPRITE_PTRS = main::toSpritePtr1_return#0 -- _deref_pwuc1=vbuc2 + lda #toSpritePtr1_return + sta SPRITE_PTRS+1 + // [27] phi from main::@7 to main::toSpritePtr2 [phi:main::@7->main::toSpritePtr2] + toSpritePtr2_from___b7: + jmp toSpritePtr2 + // main::toSpritePtr2 + toSpritePtr2: + jmp __b8 + // main::@8 + __b8: + // [28] *(SPRITE_PTRS+1*SIZEOF_UNSIGNED_INT) = main::toSpritePtr2_return#0 -- _deref_pwuc1=vbuc2 + lda #toSpritePtr2_return + sta SPRITE_PTRS+1*SIZEOF_UNSIGNED_INT+1 + // [29] phi from main::@8 to main::toSpritePtr3 [phi:main::@8->main::toSpritePtr3] + toSpritePtr3_from___b8: + jmp toSpritePtr3 + // main::toSpritePtr3 + toSpritePtr3: + jmp __b9 + // main::@9 + __b9: + // [30] *(SPRITE_PTRS+2*SIZEOF_UNSIGNED_INT) = main::toSpritePtr3_return#0 -- _deref_pwuc1=vbuc2 + lda #toSpritePtr3_return + sta SPRITE_PTRS+2*SIZEOF_UNSIGNED_INT+1 + // [31] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_ENABLE) = 7 -- _deref_pbuc1=vbuc2 + ldz #7 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_ENABLE + // [32] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_PRIORITY) = $ff -- _deref_pbuc1=vbuc2 + ldz #$ff + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_PRIORITY + // [33] *SPRITES_COLOR = DARK_GREY -- _deref_pbuc1=vbuc2 + ldz #DARK_GREY + stz SPRITES_COLOR + // [34] *(SPRITES_COLOR+1) = DARK_GREY -- _deref_pbuc1=vbuc2 + ldz #DARK_GREY + stz SPRITES_COLOR+1 + // [35] *(SPRITES_COLOR+2) = DARK_GREY -- _deref_pbuc1=vbuc2 + ldz #DARK_GREY + stz SPRITES_COLOR+2 + // [36] *SPRITES_YPOS = $e3 -- _deref_pbuc1=vbuc2 + ldz #$e3 + stz SPRITES_YPOS + // [37] *(SPRITES_YPOS+2) = $e3 -- _deref_pbuc1=vbuc2 + ldz #$e3 + stz SPRITES_YPOS+2 + // [38] *(SPRITES_YPOS+4) = $e3 -- _deref_pbuc1=vbuc2 + ldz #$e3 + stz SPRITES_YPOS+4 + // [39] *SPRITES_XPOS = $2e -- _deref_pbuc1=vbuc2 + ldz #$2e + stz SPRITES_XPOS + // [40] *(SPRITES_XPOS+2) = $2e+$18 -- _deref_pbuc1=vbuc2 + ldz #$2e+$18 + stz SPRITES_XPOS+2 + // [41] *(SPRITES_XPOS+4) = $19 -- _deref_pbuc1=vbuc2 + ldz #$19 + stz SPRITES_XPOS+4 + // [42] *SPRITES_XMSB = 3 -- _deref_pbuc1=vbuc2 + ldz #3 + stz SPRITES_XMSB + // [43] call init_plot + // Initialize plotter + // [110] phi from main::@9 to init_plot [phi:main::@9->init_plot] + init_plot_from___b9: + jsr init_plot + jmp __b12 + // main::@12 + __b12: + // asm { lda#0 } + // Initialize SID + lda #0 + // [45] callexecute *musicInit -- call__deref_pprc1 + jsr musicInit + jmp __b1 + // Wait for the raster + // main::@1 + __b1: + // [46] if(*((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_RASTER)!=$e3) goto main::@1 -- _deref_pbuc1_neq_vbuc2_then_la1 + ldz #$e3 + cpz VICIV+OFFSET_STRUCT_MEGA65_VICIV_RASTER + bne __b1 + jmp __b2 + // main::@2 + __b2: + // [47] buffer = buffer ^ 1 -- vbuz1=vbuz1_bxor_vbuc1 + // Switch buffer + lda #1 + eor.z buffer + sta.z buffer + // [48] if(buffer==0) goto main::@4 -- vbuz1_eq_0_then_la1 + // Select charset + lda.z buffer + beq __b4 + jmp __b3 + // main::@3 + __b3: + // [49] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 -- _deref_pbuc1=vbuc2 + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO + // [50] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS2 -- _deref_pbuc1=vbuc2 + ldz #>GRAPHICS2 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI + // [51] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 -- _deref_pbuc1=vbuc2 + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO + // [52] graphics_render = GRAPHICS1 -- pbuz1=pbuc1 + lda #GRAPHICS1 + sta.z graphics_render+1 + jmp __b5 + // main::@5 + __b5: + // [53] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = BLUE -- _deref_pbuc1=vbuc2 + ldz #BLUE + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR + // [54] memset_dma::dest#0 = (void *)graphics_render -- pvoz1=pvoz2 + lda.z graphics_render + sta.z memset_dma.dest + lda.z graphics_render+1 + sta.z memset_dma.dest+1 + // [55] call memset_dma + // Clear the graphics + // [122] phi from main::@5 to memset_dma [phi:main::@5->memset_dma] + memset_dma_from___b5: + // [122] phi memset_dma::dest#3 = memset_dma::dest#0 [phi:main::@5->memset_dma#0] -- register_copy + jsr memset_dma + jmp __b13 + // main::@13 + __b13: + // [56] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = PURPLE -- _deref_pbuc1=vbuc2 + ldz #PURPLE + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR + // [57] call render_dots + // Render some dots + jsr render_dots + jmp __b14 + // main::@14 + __b14: + // [58] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = BLACK -- _deref_pbuc1=vbuc2 + ldz #BLACK + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR + // [59] callexecute *musicPlay -- call__deref_pprc1 + //Play SID + jsr musicPlay + jmp __b1 + // main::@4 + __b4: + // [60] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 -- _deref_pbuc1=vbuc2 + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO + // [61] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS1 -- _deref_pbuc1=vbuc2 + ldz #>GRAPHICS1 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI + // [62] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 -- _deref_pbuc1=vbuc2 + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO + // [63] graphics_render = GRAPHICS2 -- pbuz1=pbuc1 + lda #GRAPHICS2 + sta.z graphics_render+1 + jmp __b5 +} + // memoryRemap +// Remap some of the eight 8K memory blocks in the 64K address space of the 6502 to point somewhere else in the first 1MB memory space of the MEGA65. +// After the remapping the CPU will access the mapped memory whenever it uses instructions that access a remapped block. +// See section 2.3.4 in http://www.zimmers.net/cbmpics/cbm/c65/c65manual.txt for a description of the CPU memory remapper of the C65. +// remapBlocks: Indicates which 8K blocks of the 6502 address space to remap. Each bit represents one 8K block +// - bit 0 Memory block $0000-$1fff. Use constant MEMORYBLOCK_0000. +// - bit 1 Memory block $2000-$3fff. Use constant MEMORYBLOCK_2000. +// - bit 2 Memory block $4000-$5fff. Use constant MEMORYBLOCK_4000. +// - bit 3 Memory block $6000-$7fff. Use constant MEMORYBLOCK_6000. +// - bit 4 Memory block $8000-$9fff. Use constant MEMORYBLOCK_8000. +// - bit 5 Memory block $a000-$bfff. Use constant MEMORYBLOCK_A000. +// - bit 6 Memory block $c000-$dfff. Use constant MEMORYBLOCK_C000. +// - bit 7 Memory block $e000-$ffff. Use constant MEMORYBLOCK_E000. +// lowerPageOffset: Offset that will be added to any remapped blocks in the lower 32K of memory (block 0-3). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 0 ($0000-$1fff) is remapped it will point to lowerPageOffset*$100. +// - If block 1 ($2000-$3fff) is remapped it will point to lowerPageOffset*$100 + $2000. +// - If block 2 ($4000-$5fff) is remapped it will point to lowerPageOffset*$100 + $4000. +// - If block 3 ($6000-$7fff) is remapped it will point to lowerPageOffset*$100 + $6000. +// upperPageOffset: Offset that will be added to any remapped blocks in the upper 32K of memory (block 4-7). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 4 ($8000-$9fff) is remapped it will point to upperPageOffset*$100 + $8000 +// - If block 5 ($a000-$bfff) is remapped it will point to upperPageOffset*$100 + $a000. +// - If block 6 ($c000-$dfff) is remapped it will point to upperPageOffset*$100 + $c000. +// - If block 7 ($e000-$ffff) is remapped it will point to upperPageOffset*$100 + $e000. +// void memoryRemap(char remapBlocks, unsigned int lowerPageOffset, unsigned int upperPageOffset) +memoryRemap: { + .label aVal = $2d + .label xVal = $2c + .label yVal = $2b + .label zVal = $29 + // [64] memoryRemap::aVal = 0 -- vbuz1=vbuc1 + // lower blocks offset page low + ldz #0 + stz.z aVal + // [65] memoryRemap::xVal = 0 -- vbuz1=vbuc1 + // lower blocks to map + lower blocks offset high nibble + ldz #0 + stz.z xVal + // [66] memoryRemap::yVal = 0 -- vbuz1=vbuc1 + // upper blocks offset page + ldz #0 + stz.z yVal + // [67] memoryRemap::zVal = 0 -- vbuz1=vbuc1 + // upper blocks to map + upper blocks offset page high nibble + ldz #0 + stz.z zVal + // asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } + lda aVal + ldx xVal + ldy yVal + ldz zVal + map + eom + jmp __breturn + // memoryRemap::@return + __breturn: + // [69] return + rts +} + // graphics_mode +graphics_mode: { + .label ch_x = $a + // Layout screen so that graphics data comes from $40000 -- $4FFFF + // Each column is consequtive values + .label screen = 6 + .label ch = 4 + // Set color ram to white + .label cols = $18 + .label i = $10 + // [70] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = VICIV_CHR16|VICIV_VFAST -- _deref_pbuc1=vbuc2 + // 16-bit text mode + ldz #VICIV_CHR16|VICIV_VFAST + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + // [71] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = VICIV_FAST -- _deref_pbuc1=vbuc2 + // H320, fast CPU + ldz #VICIV_FAST + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + // [72] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO) = $50 -- _deref_pbuc1=vbuc2 + // 320x200 per char, 16 pixels wide per char + // = 320/8 x 16 bits = 80 bytes per row + ldz #$50 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO + // [73] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI) = 0 -- _deref_pbuc1=vbuc2 + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI + // [74] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT) = $28 -- _deref_pbuc1=vbuc2 + // Draw 40 chars per row + ldz #$28 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT + // [75] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO) = 0 -- _deref_pbuc1=vbuc2 + // Select 2KB screen + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO + // [76] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI) = byte1 SCREEN -- _deref_pbuc1=vbuc2 + ldz #>SCREEN + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI + // [77] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO) = 0 -- _deref_pbuc1=vbuc2 + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO + // [78] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 -- _deref_pbuc1=vbuc2 + // Select charset + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO + // [79] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS1 -- _deref_pbuc1=vbuc2 + ldz #>GRAPHICS1 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI + // [80] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 -- _deref_pbuc1=vbuc2 + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO + // [81] phi from graphics_mode to graphics_mode::@1 [phi:graphics_mode->graphics_mode::@1] + __b1_from_graphics_mode: + // [81] phi graphics_mode::screen#5 = (unsigned int *)SCREEN [phi:graphics_mode->graphics_mode::@1#0] -- pwuz1=pwuc1 + lda #SCREEN + sta.z screen+1 + // [81] phi graphics_mode::ch#2 = 0 [phi:graphics_mode->graphics_mode::@1#1] -- vwuz1=vwuc1 + lda #<0 + sta.z ch + lda #>0 + sta.z ch+1 + // [81] phi graphics_mode::y#2 = 0 [phi:graphics_mode->graphics_mode::@1#2] -- vbuxx=vbuc1 + ldx #0 + jmp __b1 + // graphics_mode::@1 + __b1: + // [82] if(graphics_mode::y#2<$19) goto graphics_mode::@2 -- vbuxx_lt_vbuc1_then_la1 + cpx #$19 + bcc __b2 + // [83] phi from graphics_mode::@1 to graphics_mode::@6 [phi:graphics_mode::@1->graphics_mode::@6] + __b6_from___b1: + // [83] phi graphics_mode::cols#3 = $ff80000 [phi:graphics_mode::@1->graphics_mode::@6#0] -- vduz1=vduc1 + lda #<$ff80000 + sta.z cols + lda #>$ff80000 + sta.z cols+1 + lda #<$ff80000>>$10 + sta.z cols+2 + lda #>$ff80000>>$10 + sta.z cols+3 + // [83] phi graphics_mode::i#2 = 0 [phi:graphics_mode::@1->graphics_mode::@6#1] -- vwuz1=vwuc1 + lda #<0 + sta.z i + lda #>0 + sta.z i+1 + jmp __b6 + // graphics_mode::@6 + __b6: + // [84] if(graphics_mode::i#2<$3e8) goto graphics_mode::@7 -- vwuz1_lt_vwuc1_then_la1 + lda.z i+1 + cmp #>$3e8 + bcc __b7 + bne !+ + lda.z i + cmp #<$3e8 + bcc __b7 + !: + jmp __b8 + // graphics_mode::@8 + __b8: + // [85] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = 0 -- _deref_pbuc1=vbuc2 + // Black border and background + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR + // [86] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR) = 0 -- _deref_pbuc1=vbuc2 + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR + // [87] call memset_dma + // Clear the graphics + // [122] phi from graphics_mode::@8 to memset_dma [phi:graphics_mode::@8->memset_dma] + memset_dma_from___b8: + // [122] phi memset_dma::dest#3 = (void *)GRAPHICS1 [phi:graphics_mode::@8->memset_dma#0] -- pvoz1=pvoc1 + lda #GRAPHICS1 + sta.z memset_dma.dest+1 + jsr memset_dma + // [88] phi from graphics_mode::@8 to graphics_mode::@11 [phi:graphics_mode::@8->graphics_mode::@11] + __b11_from___b8: + jmp __b11 + // graphics_mode::@11 + __b11: + // [89] call memset_dma + // [122] phi from graphics_mode::@11 to memset_dma [phi:graphics_mode::@11->memset_dma] + memset_dma_from___b11: + // [122] phi memset_dma::dest#3 = (void *)GRAPHICS2 [phi:graphics_mode::@11->memset_dma#0] -- pvoz1=pvoc1 + lda #GRAPHICS2 + sta.z memset_dma.dest+1 + jsr memset_dma + jmp __breturn + // graphics_mode::@return + __breturn: + // [90] return + rts + // graphics_mode::@7 + __b7: + // [91] lpoke::addr = graphics_mode::cols#3 -- vduz1=vduz2 + ldq.z cols + stq.z lpoke.addr + // [92] lpoke::val = 0 -- vbuz1=vbuc1 + ldz #0 + stz.z lpoke.val + // [93] call lpoke + jsr lpoke + jmp __b9 + // graphics_mode::@9 + __b9: + // [94] graphics_mode::cols#1 = ++ graphics_mode::cols#3 -- vduz1=_inc_vduz1 + inc.z cols + bne !+ + inc.z cols+1 + bne !+ + inc.z cols+2 + bne !+ + inc.z cols+3 + !: + // [95] lpoke::addr = graphics_mode::cols#1 -- vduz1=vduz2 + ldq.z cols + stq.z lpoke.addr + // [96] lpoke::val = WHITE -- vbuz1=vbuc1 + ldz #WHITE + stz.z lpoke.val + // [97] call lpoke + // No extended attributes + jsr lpoke + jmp __b10 + // graphics_mode::@10 + __b10: + // [98] graphics_mode::cols#2 = ++ graphics_mode::cols#1 -- vduz1=_inc_vduz1 + inc.z cols + bne !+ + inc.z cols+1 + bne !+ + inc.z cols+2 + bne !+ + inc.z cols+3 + !: + // [99] graphics_mode::i#1 = ++ graphics_mode::i#2 -- vwuz1=_inc_vwuz1 + inw.z i + // [83] phi from graphics_mode::@10 to graphics_mode::@6 [phi:graphics_mode::@10->graphics_mode::@6] + __b6_from___b10: + // [83] phi graphics_mode::cols#3 = graphics_mode::cols#2 [phi:graphics_mode::@10->graphics_mode::@6#0] -- register_copy + // [83] phi graphics_mode::i#2 = graphics_mode::i#1 [phi:graphics_mode::@10->graphics_mode::@6#1] -- register_copy + jmp __b6 + // graphics_mode::@2 + __b2: + // [100] graphics_mode::ch_x#4 = graphics_mode::ch#2 -- vwuz1=vwuz2 + lda.z ch + sta.z ch_x + lda.z ch+1 + sta.z ch_x+1 + // [101] phi from graphics_mode::@2 to graphics_mode::@3 [phi:graphics_mode::@2->graphics_mode::@3] + __b3_from___b2: + // [101] phi graphics_mode::ch_x#2 = graphics_mode::ch_x#4 [phi:graphics_mode::@2->graphics_mode::@3#0] -- register_copy + // [101] phi graphics_mode::x#2 = 0 [phi:graphics_mode::@2->graphics_mode::@3#1] -- vbuzz=vbuc1 + ldz #0 + jmp __b3 + // graphics_mode::@3 + __b3: + // [102] if(graphics_mode::x#2<$28) goto graphics_mode::@4 -- vbuzz_lt_vbuc1_then_la1 + cpz #$28 + bcc __b4 + jmp __b5 + // graphics_mode::@5 + __b5: + // [103] graphics_mode::screen#1 = graphics_mode::screen#5 + $28*SIZEOF_UNSIGNED_INT -- pwuz1=pwuz1_plus_vbuc1 + lda #$28*SIZEOF_UNSIGNED_INT + clc + adc.z screen + sta.z screen + bcc !+ + inc.z screen+1 + !: + // [104] graphics_mode::ch#1 = ++ graphics_mode::ch#2 -- vwuz1=_inc_vwuz1 + inw.z ch + // [105] graphics_mode::y#1 = ++ graphics_mode::y#2 -- vbuxx=_inc_vbuxx + inx + // [81] phi from graphics_mode::@5 to graphics_mode::@1 [phi:graphics_mode::@5->graphics_mode::@1] + __b1_from___b5: + // [81] phi graphics_mode::screen#5 = graphics_mode::screen#1 [phi:graphics_mode::@5->graphics_mode::@1#0] -- register_copy + // [81] phi graphics_mode::ch#2 = graphics_mode::ch#1 [phi:graphics_mode::@5->graphics_mode::@1#1] -- register_copy + // [81] phi graphics_mode::y#2 = graphics_mode::y#1 [phi:graphics_mode::@5->graphics_mode::@1#2] -- register_copy + jmp __b1 + // graphics_mode::@4 + __b4: + // [106] graphics_mode::$8 = graphics_mode::x#2 << 1 -- vbuaa=vbuzz_rol_1 + tza + asl + // [107] graphics_mode::screen#5[graphics_mode::$8] = graphics_mode::ch_x#2 -- pwuz1_derefidx_vbuaa=vwuz2 + tay + lda.z ch_x + sta (screen),y + iny + lda.z ch_x+1 + sta (screen),y + // [108] graphics_mode::ch_x#1 = graphics_mode::ch_x#2 + $19 -- vwuz1=vwuz1_plus_vbuc1 + lda #$19 + clc + adc.z ch_x + sta.z ch_x + bcc !+ + inc.z ch_x+1 + !: + // [109] graphics_mode::x#1 = ++ graphics_mode::x#2 -- vbuzz=_inc_vbuzz + inz + // [101] phi from graphics_mode::@4 to graphics_mode::@3 [phi:graphics_mode::@4->graphics_mode::@3] + __b3_from___b4: + // [101] phi graphics_mode::ch_x#2 = graphics_mode::ch_x#1 [phi:graphics_mode::@4->graphics_mode::@3#0] -- register_copy + // [101] phi graphics_mode::x#2 = graphics_mode::x#1 [phi:graphics_mode::@4->graphics_mode::@3#1] -- register_copy + jmp __b3 +} + // init_plot +init_plot: { + .label __4 = 8 + .label i = 4 + .label gfx = 6 + .label __5 = 8 + // [111] phi from init_plot to init_plot::@1 [phi:init_plot->init_plot::@1] + __b1_from_init_plot: + // [111] phi init_plot::gfx#2 = 0 [phi:init_plot->init_plot::@1#0] -- vwuz1=vwuc1 + lda #<0 + sta.z gfx + lda #>0 + sta.z gfx+1 + // [111] phi init_plot::i#2 = 0 [phi:init_plot->init_plot::@1#1] -- vwuz1=vwuc1 + lda #<0 + sta.z i + lda #>0 + sta.z i+1 + jmp __b1 + // init_plot::@1 + __b1: + // [112] if(init_plot::i#2<$140) goto init_plot::@2 -- vwuz1_lt_vwuc1_then_la1 + lda.z i+1 + cmp #>$140 + bcc __b2 + bne !+ + lda.z i + cmp #<$140 + bcc __b2 + !: + jmp __breturn + // init_plot::@return + __breturn: + // [113] return + rts + // init_plot::@2 + __b2: + // [114] init_plot::$4 = init_plot::i#2 << 1 -- vwuz1=vwuz2_rol_1 + lda.z i + asl + sta.z __4 + lda.z i+1 + rol + sta.z __4+1 + // [115] init_plot::$5 = GFX_OFFSET + init_plot::$4 -- pwuz1=pwuc1_plus_vwuz1 + lda.z __5 + clc + adc #GFX_OFFSET + sta.z __5+1 + // [116] *init_plot::$5 = init_plot::gfx#2 -- _deref_pwuz1=vwuz2 + ldy #0 + lda.z gfx + sta (__5),y + iny + lda.z gfx+1 + sta (__5),y + // [117] init_plot::$1 = init_plot::i#2 & 7 -- vbuaa=vwuz1_band_vbuc1 + lda #7 + and.z i + // [118] if(init_plot::$1!=7) goto init_plot::@3 -- vbuaa_neq_vbuc1_then_la1 + cmp #7 + bne __b3_from___b2 + jmp __b4 + // init_plot::@4 + __b4: + // [119] init_plot::gfx#1 = init_plot::gfx#2 + $c8 -- vwuz1=vwuz1_plus_vbuc1 + lda #$c8 + clc + adc.z gfx + sta.z gfx + bcc !+ + inc.z gfx+1 + !: + // [120] phi from init_plot::@2 init_plot::@4 to init_plot::@3 [phi:init_plot::@2/init_plot::@4->init_plot::@3] + __b3_from___b2: + __b3_from___b4: + // [120] phi init_plot::gfx#5 = init_plot::gfx#2 [phi:init_plot::@2/init_plot::@4->init_plot::@3#0] -- register_copy + jmp __b3 + // init_plot::@3 + __b3: + // [121] init_plot::i#1 = ++ init_plot::i#2 -- vwuz1=_inc_vwuz1 + inw.z i + // [111] phi from init_plot::@3 to init_plot::@1 [phi:init_plot::@3->init_plot::@1] + __b1_from___b3: + // [111] phi init_plot::gfx#2 = init_plot::gfx#5 [phi:init_plot::@3->init_plot::@1#0] -- register_copy + // [111] phi init_plot::i#2 = init_plot::i#1 [phi:init_plot::@3->init_plot::@1#1] -- register_copy + jmp __b1 +} + // memset_dma +// Fill a memory block within the first 64K memory space using MEGA65 DMagic DMA +// Fills the values of num bytes at the destination with a single byte value. +// - dest The destination address (within the MB and bank) +// - fill The char to fill with +// - num The number of bytes to copy +// void memset_dma(__zp($c) void *dest, char fill, unsigned int num) +memset_dma: { + .label dest = $c + // [123] memset_dma::dmaMode#0 = *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) -- vbuxx=_deref_pbuc1 + // Remember current F018 A/B mode + ldx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // [124] *((unsigned int *)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = (unsigned int)$28*$19*8 -- _deref_pwuc1=vwuc2 + // Set up command + lda #<$28*$19*8 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT + lda #>$28*$19*8 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT+1 + // [125] *((char **)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (char *)0 -- _deref_qbuc1=pbuc2 + lda #<0 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC + lda #>0 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC+1 + // [126] *((char **)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (char *)memset_dma::dest#3 -- _deref_qbuc1=pbuz1 + lda.z dest + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST + lda.z dest+1 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST+1 + // [127] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 -- _deref_pbuc1=vbuc2 + // Set F018B mode + ldz #1 + stz DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // [128] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 -- _deref_pbuc1=vbuc2 + // Set address of DMA list + ldz #0 + stz DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB + // [129] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 -- _deref_pbuc1=vbuc2 + ldz #0 + stz DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK + // [130] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = byte1 &memset_dma_command -- _deref_pbuc1=vbuc2 + ldz #>memset_dma_command + stz DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB + // [131] *((char *)DMA) = byte0 &memset_dma_command -- _deref_pbuc1=vbuc2 + // Trigger the DMA (without option lists) + ldz #SINX1_SIZE + bne !+ + lda.z sin_x1_idx + cmp #SINX1_SIZE + sta.z sin_x1_idx+1 + jmp __b1 + // render_dots::@1 + __b1: + // [138] render_dots::idx_x2#0 = sin_x2_idx -- vwuz1=vwuz2 + lda.z sin_x2_idx + sta.z idx_x2 + lda.z sin_x2_idx+1 + sta.z idx_x2+1 + // [139] sin_x2_idx = sin_x2_idx - 1 -- vwuz1=vwuz1_minus_1 + lda.z sin_x2_idx + sec + sbc #1 + sta.z sin_x2_idx + lda.z sin_x2_idx+1 + sbc #0 + sta.z sin_x2_idx+1 + // [140] if(sin_x2_idx<=SINX2_SIZE) goto render_dots::@2 -- vwuz1_le_vwuc1_then_la1 + lda.z sin_x2_idx+1 + cmp #>SINX2_SIZE + bne !+ + lda.z sin_x2_idx + cmp #SINX2_SIZE + sta.z sin_x2_idx+1 + jmp __b2 + // render_dots::@2 + __b2: + // [142] render_dots::idx_y1#0 = sin_y1_idx -- vwuz1=vwuz2 + lda.z sin_y1_idx + sta.z idx_y1 + lda.z sin_y1_idx+1 + sta.z idx_y1+1 + // [143] sin_y1_idx = sin_y1_idx - 1 -- vwuz1=vwuz1_minus_1 + lda.z sin_y1_idx + sec + sbc #1 + sta.z sin_y1_idx + lda.z sin_y1_idx+1 + sbc #0 + sta.z sin_y1_idx+1 + // [144] if(sin_y1_idx<=SINY1_SIZE) goto render_dots::@3 -- vwuz1_le_vwuc1_then_la1 + lda.z sin_y1_idx+1 + cmp #>SINY1_SIZE + bne !+ + lda.z sin_y1_idx + cmp #SINY1_SIZE + sta.z sin_y1_idx+1 + jmp __b3 + // render_dots::@3 + __b3: + // [146] render_dots::idx_y2#0 = sin_y2_idx -- vwuz1=vwuz2 + lda.z sin_y2_idx + sta.z idx_y2 + lda.z sin_y2_idx+1 + sta.z idx_y2+1 + // [147] sin_y2_idx = sin_y2_idx + 1 -- vwuz1=vwuz1_plus_1 + inw.z sin_y2_idx + // [148] if(sin_y2_idx<=SINY2_SIZE) goto render_dots::@8 -- vwuz1_le_vwuc1_then_la1 + lda.z sin_y2_idx+1 + cmp #>SINY2_SIZE + bne !+ + lda.z sin_y2_idx + cmp #SINY2_SIZE + sta.z sin_y2_idx+1 + // [150] phi from render_dots::@3 render_dots::@7 to render_dots::@8 [phi:render_dots::@3/render_dots::@7->render_dots::@8] + __b8_from___b3: + __b8_from___b7: + // [150] phi render_dots::idx_y2#11 = render_dots::idx_y2#0 [phi:render_dots::@3/render_dots::@7->render_dots::@8#0] -- register_copy + // [150] phi render_dots::idx_y1#11 = render_dots::idx_y1#0 [phi:render_dots::@3/render_dots::@7->render_dots::@8#1] -- register_copy + // [150] phi render_dots::idx_x2#3 = render_dots::idx_x2#0 [phi:render_dots::@3/render_dots::@7->render_dots::@8#2] -- register_copy + // [150] phi render_dots::idx_x1#3 = render_dots::idx_x1#0 [phi:render_dots::@3/render_dots::@7->render_dots::@8#3] -- register_copy + // [150] phi render_dots::i#10 = 0 [phi:render_dots::@3/render_dots::@7->render_dots::@8#4] -- vwuz1=vwuc1 + lda #<0 + sta.z i + lda #>0 + sta.z i+1 + jmp __b8 + // render_dots::@8 + __b8: + // [151] if(render_dots::i#10<$600) goto render_dots::@9 -- vwuz1_lt_vwuc1_then_la1 + lda.z i+1 + cmp #>$600 + bcc __b9 + bne !+ + lda.z i + cmp #<$600 + bcc __b9 + !: + jmp __breturn + // render_dots::@return + __breturn: + // [152] return + rts + // render_dots::@9 + __b9: + // [153] render_dots::$20 = render_dots::idx_x1#3 << 1 -- vwuz1=vwuz2_rol_1 + lda.z idx_x1 + asl + sta.z __20 + lda.z idx_x1+1 + rol + sta.z __20+1 + // [154] render_dots::$21 = render_dots::idx_x2#3 << 1 -- vwuz1=vwuz2_rol_1 + lda.z idx_x2 + asl + sta.z __21 + lda.z idx_x2+1 + rol + sta.z __21+1 + // [155] render_dots::$22 = SINX1 + render_dots::$20 -- pwuz1=pwuc1_plus_vwuz1 + lda.z __22 + clc + adc #SINX1 + sta.z __22+1 + // [156] render_dots::$23 = SINX2 + render_dots::$21 -- pwuz1=pwuc1_plus_vwuz1 + lda.z __23 + clc + adc #SINX2 + sta.z __23+1 + // [157] plot::x#0 = *render_dots::$22 + *render_dots::$23 -- vwuz1=_deref_pwuz1_plus__deref_pwuz2 + ldy #0 + clc + lda (plot.x),y + adc (__23),y + pha + iny + lda (plot.x),y + adc (__23),y + sta.z plot.x+1 + pla + sta.z plot.x + // [158] render_dots::$24 = SINY1 + render_dots::idx_y1#11 -- pbuz1=pbuc1_plus_vwuz2 + lda.z idx_y1 + clc + adc #SINY1 + sta.z __24+1 + // [159] render_dots::$25 = SINY2 + render_dots::idx_y2#11 -- pbuz1=pbuc1_plus_vwuz2 + lda.z idx_y2 + clc + adc #SINY2 + sta.z __25+1 + // [160] plot::y#0 = *render_dots::$24 + *render_dots::$25 -- vbuzz=_deref_pbuz1_plus__deref_pbuz2 + ldy #0 + lda (__24),y + clc + ldy #0 + adc (__25),y + taz + // [161] call plot + jsr plot + jmp __b18 + // render_dots::@18 + __b18: + // [162] render_dots::idx_x1#1 = render_dots::idx_x1#3 - $b -- vwuz1=vwuz1_minus_vbuc1 + sec + lda.z idx_x1 + sbc #$b + sta.z idx_x1 + lda.z idx_x1+1 + sbc #0 + sta.z idx_x1+1 + // [163] if(render_dots::idx_x1#1<=SINX1_SIZE) goto render_dots::@10 -- vwuz1_le_vwuc1_then_la1 + lda.z idx_x1+1 + cmp #>SINX1_SIZE + bne !+ + lda.z idx_x1 + cmp #SINX1_SIZE + sta.z idx_x1+1 + // [165] phi from render_dots::@14 render_dots::@18 to render_dots::@10 [phi:render_dots::@14/render_dots::@18->render_dots::@10] + __b10_from___b14: + __b10_from___b18: + // [165] phi render_dots::idx_x1#11 = render_dots::idx_x1#2 [phi:render_dots::@14/render_dots::@18->render_dots::@10#0] -- register_copy + jmp __b10 + // render_dots::@10 + __b10: + // [166] render_dots::idx_x2#1 = render_dots::idx_x2#3 + 3 -- vwuz1=vwuz1_plus_vbuc1 + lda #3 + clc + adc.z idx_x2 + sta.z idx_x2 + bcc !+ + inc.z idx_x2+1 + !: + // [167] if(render_dots::idx_x2#1<=SINX2_SIZE) goto render_dots::@11 -- vwuz1_le_vwuc1_then_la1 + lda.z idx_x2+1 + cmp #>SINX2_SIZE + bne !+ + lda.z idx_x2 + cmp #SINX2_SIZE + sta.z idx_x2+1 + // [169] phi from render_dots::@10 render_dots::@15 to render_dots::@11 [phi:render_dots::@10/render_dots::@15->render_dots::@11] + __b11_from___b10: + __b11_from___b15: + // [169] phi render_dots::idx_x2#13 = render_dots::idx_x2#1 [phi:render_dots::@10/render_dots::@15->render_dots::@11#0] -- register_copy + jmp __b11 + // render_dots::@11 + __b11: + // [170] render_dots::idx_y1#1 = render_dots::idx_y1#11 + 9 -- vwuz1=vwuz1_plus_vbuc1 + lda #9 + clc + adc.z idx_y1 + sta.z idx_y1 + bcc !+ + inc.z idx_y1+1 + !: + // [171] if(render_dots::idx_y1#1<=SINY1_SIZE) goto render_dots::@12 -- vwuz1_le_vwuc1_then_la1 + lda.z idx_y1+1 + cmp #>SINY1_SIZE + bne !+ + lda.z idx_y1 + cmp #SINY1_SIZE + sta.z idx_y1+1 + // [173] phi from render_dots::@11 render_dots::@16 to render_dots::@12 [phi:render_dots::@11/render_dots::@16->render_dots::@12] + __b12_from___b11: + __b12_from___b16: + // [173] phi render_dots::idx_y1#15 = render_dots::idx_y1#1 [phi:render_dots::@11/render_dots::@16->render_dots::@12#0] -- register_copy + jmp __b12 + // render_dots::@12 + __b12: + // [174] render_dots::idx_y2#1 = render_dots::idx_y2#11 - 5 -- vwuz1=vwuz1_minus_vbuc1 + sec + lda.z idx_y2 + sbc #5 + sta.z idx_y2 + lda.z idx_y2+1 + sbc #0 + sta.z idx_y2+1 + // [175] if(render_dots::idx_y2#1<=SINY2_SIZE) goto render_dots::@13 -- vwuz1_le_vwuc1_then_la1 + lda.z idx_y2+1 + cmp #>SINY2_SIZE + bne !+ + lda.z idx_y2 + cmp #SINY2_SIZE + sta.z idx_y2+1 + // [177] phi from render_dots::@12 render_dots::@17 to render_dots::@13 [phi:render_dots::@12/render_dots::@17->render_dots::@13] + __b13_from___b12: + __b13_from___b17: + // [177] phi render_dots::idx_y2#9 = render_dots::idx_y2#1 [phi:render_dots::@12/render_dots::@17->render_dots::@13#0] -- register_copy + jmp __b13 + // render_dots::@13 + __b13: + // [178] render_dots::i#1 = ++ render_dots::i#10 -- vwuz1=_inc_vwuz1 + inw.z i + // [150] phi from render_dots::@13 to render_dots::@8 [phi:render_dots::@13->render_dots::@8] + __b8_from___b13: + // [150] phi render_dots::idx_y2#11 = render_dots::idx_y2#9 [phi:render_dots::@13->render_dots::@8#0] -- register_copy + // [150] phi render_dots::idx_y1#11 = render_dots::idx_y1#15 [phi:render_dots::@13->render_dots::@8#1] -- register_copy + // [150] phi render_dots::idx_x2#3 = render_dots::idx_x2#13 [phi:render_dots::@13->render_dots::@8#2] -- register_copy + // [150] phi render_dots::idx_x1#3 = render_dots::idx_x1#11 [phi:render_dots::@13->render_dots::@8#3] -- register_copy + // [150] phi render_dots::i#10 = render_dots::i#1 [phi:render_dots::@13->render_dots::@8#4] -- register_copy + jmp __b8 +} + // lpoke +// Get the low byte from a word/int +// Get the high byte from a word/int +// Poke a byte value into memory +// Peek a byte value from memory +// Poke a value directly into memory +// - addr: The 32bit address to poke to +// - val: The value to poke +// void lpoke(__zp($1d) volatile unsigned long addr, __zp($1c) volatile char val) +lpoke: { + .label addr = $1d + .label val = $1c + // asm { ldz#0 ldaval sta((addr)),z } + // Use the 45GS02 32-bit addressing mode + ldz #0 + lda val + sta ((addr)),z + jmp __breturn + // lpoke::@return + __breturn: + // [180] return + rts +} + // plot +// Do a single plot on the canvas +// void plot(__zp(6) unsigned int x, __register(Z) char y) +plot: { + .label __0 = 2 + .label __3 = 2 + .label x = 6 + .label __4 = 2 + // [181] plot::$3 = plot::x#0 << 1 -- vwuz1=vwuz2_rol_1 + lda.z x + asl + sta.z __3 + lda.z x+1 + rol + sta.z __3+1 + // [182] plot::$4 = GFX_OFFSET + plot::$3 -- pwuz1=pwuc1_plus_vwuz1 + lda.z __4 + clc + adc #GFX_OFFSET + sta.z __4+1 + // [183] plot::$0 = graphics_render + *plot::$4 -- pbuz1=pbuz2_plus__deref_pwuz1 + ldy #0 + clc + lda (__0),y + adc.z graphics_render + pha + iny + lda (__0),y + adc.z graphics_render+1 + sta.z __0+1 + pla + sta.z __0 + // [184] plot::$2 = plot::x#0 & 7 -- vbuaa=vwuz1_band_vbuc1 + lda #7 + and.z x + // [185] plot::$0[plot::y#0] = plot::$0[plot::y#0] | GFX_BIT[plot::$2] -- pbuz1_derefidx_vbuzz=pbuz1_derefidx_vbuzz_bor_pbuc1_derefidx_vbuaa + tax + tza + tay + lda (__0),y + ora GFX_BIT,x + sta (__0),y + jmp __breturn + // plot::@return + __breturn: + // [186] return + rts +} + // File Data +.segment Data + .align $40 +SPRITES: +.var pic = LoadPicture("camelot-sprites.png", List().add($000000, $ffffff)) + .for (var s=0; s<3; s++) { + .for (var y=0; y<21; y++) { + .for (var x=0;x<3; x++) { + .byte pic.getSinglecolorByte(s*3+x,y) + } + } + .byte 0 + } + + // The sprite pointers + SPRITE_PTRS: .fill 2*8, 0 + // Graphics bit + GFX_BIT: .byte $80, $40, $20, $10, 8, 4, 2, 1 + // Offset to graphics for (x, 0) + GFX_OFFSET: .fill 2*$140, 0 +SINY1: +.fill 733+256, round(66.5+66.5*sin(toRadians(360*i/733))) + +SINY2: +.fill 317+256, round(33+33*sin(toRadians(360*i/317))) + +SINX1: +.fillword 1613+256, round(98+98*sin(toRadians(360*i/1613))) + +SINX2: +.fillword 547+256, round(60+60*sin(toRadians(360*i/547))) + + // DMA list entry for filling data + memset_dma_command: .byte DMA_COMMAND_FILL + .word 0, 0 + .byte 0 + .word 0 + .byte 0, 0 + .word 0 +.pc = $5000 "MUSIC" +// SID tune at an absolute address +MUSIC: +.const music = LoadSid("Thaw_5000.sid") + .fill music.size, music.getData(i) + + +ASSEMBLER OPTIMIZATIONS +Removing instruction jmp __init1 +Removing instruction jmp __b1 +Removing instruction jmp __breturn +Removing instruction jmp SEI1 +Removing instruction jmp __b6 +Removing instruction jmp __b10 +Removing instruction jmp __b11 +Removing instruction jmp toSpritePtr1 +Removing instruction jmp __b7 +Removing instruction jmp toSpritePtr2 +Removing instruction jmp __b8 +Removing instruction jmp toSpritePtr3 +Removing instruction jmp __b9 +Removing instruction jmp __b12 +Removing instruction jmp __b1 +Removing instruction jmp __b2 +Removing instruction jmp __b3 +Removing instruction jmp __b5 +Removing instruction jmp __b13 +Removing instruction jmp __b14 +Removing instruction jmp __breturn +Removing instruction jmp __b1 +Removing instruction jmp __b6 +Removing instruction jmp __b8 +Removing instruction jmp __b11 +Removing instruction jmp __breturn +Removing instruction jmp __b9 +Removing instruction jmp __b10 +Removing instruction jmp __b3 +Removing instruction jmp __b5 +Removing instruction jmp __b1 +Removing instruction jmp __breturn +Removing instruction jmp __b4 +Removing instruction jmp __b3 +Removing instruction jmp __breturn +Removing instruction jmp __b4 +Removing instruction jmp __b1 +Removing instruction jmp __b5 +Removing instruction jmp __b2 +Removing instruction jmp __b6 +Removing instruction jmp __b3 +Removing instruction jmp __b7 +Removing instruction jmp __b8 +Removing instruction jmp __breturn +Removing instruction jmp __b18 +Removing instruction jmp __b14 +Removing instruction jmp __b10 +Removing instruction jmp __b15 +Removing instruction jmp __b11 +Removing instruction jmp __b16 +Removing instruction jmp __b12 +Removing instruction jmp __b17 +Removing instruction jmp __b13 +Removing instruction jmp __breturn +Removing instruction jmp __breturn +Succesful ASM optimization Pass5NextJumpElimination +Replacing instruction lda #<0 with TZA +Removing instruction lda #>0 +Removing instruction lda #<0 +Removing instruction lda #>0 +Removing instruction lda #<0 +Removing instruction lda #>0 +Removing instruction lda #<0 +Removing instruction lda #>0 +Removing instruction ldz #DARK_GREY +Removing instruction ldz #DARK_GREY +Removing instruction ldz #$e3 +Removing instruction ldz #$e3 +Removing instruction lda.z buffer +Removing instruction ldz #0 +Removing instruction ldz #0 +Removing instruction ldz #0 +Removing instruction ldz zVal +Removing instruction ldz #0 +Removing instruction lda #>0 +Replacing instruction ldx #0 with TAX +Removing instruction lda #>0 +Removing instruction ldz #0 +Removing instruction lda #>0 +Removing instruction lda #<0 +Removing instruction lda #>0 +Removing instruction lda #>0 +Removing instruction ldz #0 +Removing instruction lda.z sin_x2_idx+1 +Removing instruction lda.z sin_y1_idx+1 +Removing instruction lda #>0 +Removing instruction ldy #0 +Removing instruction lda.z idx_x1+1 +Removing instruction lda.z idx_y2+1 +Succesful ASM optimization Pass5UnnecesaryLoadElimination +Replacing label __b3_from___b2 with __b3 +Replacing label __b8_from___b3 with __b8_from___b7 +Replacing label __b8_from___b3 with __b8_from___b7 +Replacing label __b10_from___b18 with __b10 +Replacing label __b10_from___b18 with __b10 +Replacing label __b11_from___b10 with __b11 +Replacing label __b11_from___b10 with __b11 +Replacing label __b12_from___b11 with __b12 +Replacing label __b12_from___b11 with __b12 +Replacing label __b13_from___b12 with __b13 +Replacing label __b13_from___b12 with __b13 +Removing instruction __b1_from___init1: +Removing instruction main_from___b1: +Removing instruction __b6_from_SEI1: +Removing instruction toSpritePtr1_from___b11: +Removing instruction toSpritePtr1: +Removing instruction toSpritePtr2_from___b7: +Removing instruction toSpritePtr2: +Removing instruction toSpritePtr3_from___b8: +Removing instruction toSpritePtr3: +Removing instruction __b11_from___b8: +Removing instruction memset_dma_from___b11: +Removing instruction __b3_from___b2: +Removing instruction __b3_from___b4: +Removing instruction __b8_from___b3: +Removing instruction __b10_from___b14: +Removing instruction __b10_from___b18: +Removing instruction __b11_from___b10: +Removing instruction __b11_from___b15: +Removing instruction __b12_from___b11: +Removing instruction __b12_from___b16: +Removing instruction __b13_from___b12: +Removing instruction __b13_from___b17: +Succesful ASM optimization Pass5RedundantLabelElimination +Removing instruction __init1: +Removing instruction __b1: +Removing instruction __breturn: +Removing instruction SEI1: +Removing instruction __b6: +Removing instruction __b10: +Removing instruction __b11: +Removing instruction __b7: +Removing instruction __b8: +Removing instruction __b9: +Removing instruction init_plot_from___b9: +Removing instruction __b12: +Removing instruction __b2: +Removing instruction __b3: +Removing instruction memset_dma_from___b5: +Removing instruction __b13: +Removing instruction __b14: +Removing instruction __breturn: +Removing instruction __b1_from_graphics_mode: +Removing instruction __b6_from___b1: +Removing instruction __b8: +Removing instruction memset_dma_from___b8: +Removing instruction __b11: +Removing instruction __breturn: +Removing instruction __b9: +Removing instruction __b10: +Removing instruction __b6_from___b10: +Removing instruction __b3_from___b2: +Removing instruction __b5: +Removing instruction __b1_from___b5: +Removing instruction __b3_from___b4: +Removing instruction __b1_from_init_plot: +Removing instruction __breturn: +Removing instruction __b4: +Removing instruction __b1_from___b3: +Removing instruction __breturn: +Removing instruction __b4: +Removing instruction __b5: +Removing instruction __b6: +Removing instruction __b7: +Removing instruction __breturn: +Removing instruction __b18: +Removing instruction __b14: +Removing instruction __b15: +Removing instruction __b16: +Removing instruction __b17: +Removing instruction __b8_from___b13: +Removing instruction __breturn: +Removing instruction __breturn: +Succesful ASM optimization Pass5UnusedLabelElimination +Relabelling long label __b8_from___b7 to __b4 +Succesful ASM optimization Pass5RelabelLongLabels +Replacing instruction lda #<0 with TZA +Fixing long branch [348] bcc __b2 to bcs + +FINAL SYMBOL TABLE +__constant const char BLACK = 0 +__constant const char BLUE = 6 +__constant const char DARK_GREY = $b +__constant struct F018_DMAGIC * const DMA = (struct F018_DMAGIC *) 55040 +__constant const char DMA_COMMAND_FILL = 3 +__constant char GFX_BIT[8] = { $80, $40, $20, $10, 8, 4, 2, 1 } +__constant unsigned int GFX_OFFSET[$140] = { fill( $140, 0) } +__constant char * const GRAPHICS1 = (char *) 40960 +__constant char * const GRAPHICS2 = (char *) 28672 +__constant char MUSIC[] = kickasm {{ .const music = LoadSid("Thaw_5000.sid") + .fill music.size, music.getData(i) + }} +__constant char OFFSET_STRUCT_DMA_LIST_F018B_COUNT = 1 +__constant char OFFSET_STRUCT_DMA_LIST_F018B_DEST = 6 +__constant char OFFSET_STRUCT_DMA_LIST_F018B_SRC = 3 +__constant char OFFSET_STRUCT_F018_DMAGIC_ADDRBANK = 2 +__constant char OFFSET_STRUCT_F018_DMAGIC_ADDRMB = 4 +__constant char OFFSET_STRUCT_F018_DMAGIC_ADDRMSB = 1 +__constant char OFFSET_STRUCT_F018_DMAGIC_EN018B = 3 +__constant char OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR = $21 +__constant char OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR = $20 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO = $6a +__constant char OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI = $69 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO = $68 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI = $59 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO = $58 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT = $5e +__constant char OFFSET_STRUCT_MEGA65_VICIV_CONTROLA = $30 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CONTROLB = $31 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CONTROLC = $54 +__constant char OFFSET_STRUCT_MEGA65_VICIV_KEY = $2f +__constant char OFFSET_STRUCT_MEGA65_VICIV_RASTER = $12 +__constant char OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO = $62 +__constant char OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI = $61 +__constant char OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO = $60 +__constant char OFFSET_STRUCT_MEGA65_VICIV_SPRITES_ENABLE = $15 +__constant char OFFSET_STRUCT_MEGA65_VICIV_SPRITES_PRIORITY = $1b +__constant char OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_HILO = $6e +__constant char OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOHI = $6d +__constant char OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOLO = $6c +__constant char * const PROCPORT = (char *) 1 +__constant char * const PROCPORT_DDR = (char *) 0 +__constant const char PROCPORT_DDR_MEMORY_MASK = 7 +__constant const char PROCPORT_RAM_IO = 5 +__constant const char PURPLE = 4 +__constant char * const SCREEN = (char *) 51200 +__constant unsigned int SINX1[SINX1_SIZE+$100] = kickasm {{ .fillword 1613+256, round(98+98*sin(toRadians(360*i/1613))) + }} +__constant const unsigned int SINX1_SIZE = $64d +__constant unsigned int SINX2[SINX2_SIZE+$100] = kickasm {{ .fillword 547+256, round(60+60*sin(toRadians(360*i/547))) + }} +__constant const unsigned int SINX2_SIZE = $223 +__constant char SINY1[SINY1_SIZE+$100] = kickasm {{ .fill 733+256, round(66.5+66.5*sin(toRadians(360*i/733))) + }} +__constant const unsigned int SINY1_SIZE = $2dd +__constant char SINY2[SINY2_SIZE+$100] = kickasm {{ .fill 317+256, round(33+33*sin(toRadians(360*i/317))) + }} +__constant const unsigned int SINY2_SIZE = $13d +__constant char SIZEOF_UNSIGNED_INT = 2 +__constant char SPRITES[$c0] = kickasm {{ .var pic = LoadPicture("camelot-sprites.png", List().add($000000, $ffffff)) + .for (var s=0; s<3; s++) { + .for (var y=0; y<21; y++) { + .for (var x=0;x<3; x++) { + .byte pic.getSinglecolorByte(s*3+x,y) + } + } + .byte 0 + } + }} +__constant char * const SPRITES_COLOR = (char *) 53287 +__constant char * const SPRITES_XMSB = (char *) 53264 +__constant char * const SPRITES_XPOS = (char *) 53248 +__constant char * const SPRITES_YPOS = (char *) 53249 +__constant unsigned int SPRITE_PTRS[8] = { fill( 8, 0) } +__constant struct MEGA65_VICIV * const VICIV = (struct MEGA65_VICIV *) 53248 +__constant const char VICIV_CHR16 = 1 +__constant const char VICIV_FAST = $40 +__constant const char VICIV_KEY_M65_A = $47 +__constant const char VICIV_KEY_M65_B = $53 +__constant const char VICIV_SPRPTR16 = $80 +__constant const char VICIV_VFAST = $40 +__constant const char WHITE = 1 +void __start() +__loadstore volatile char buffer // zp[1]:42 76.25 +void graphics_mode() +char graphics_mode::$8 // reg byte a 20002.0 +unsigned int graphics_mode::ch +unsigned int graphics_mode::ch#1 // ch zp[2]:4 1001.0 +unsigned int graphics_mode::ch#2 // ch zp[2]:4 300.29999999999995 +unsigned int graphics_mode::ch_x +unsigned int graphics_mode::ch_x#1 // ch_x zp[2]:10 10001.0 +unsigned int graphics_mode::ch_x#2 // ch_x zp[2]:10 7751.0 +unsigned int graphics_mode::ch_x#4 // ch_x zp[2]:10 2002.0 +unsigned long graphics_mode::cols +unsigned long graphics_mode::cols#1 // cols zp[4]:24 750.75 +unsigned long graphics_mode::cols#2 // cols zp[4]:24 1001.0 +unsigned long graphics_mode::cols#3 // cols zp[4]:24 600.5999999999999 +unsigned int graphics_mode::i +unsigned int graphics_mode::i#1 // i zp[2]:16 2002.0 +unsigned int graphics_mode::i#2 // i zp[2]:16 300.29999999999995 +unsigned int *graphics_mode::screen +unsigned int *graphics_mode::screen#1 // screen zp[2]:6 667.3333333333334 +unsigned int *graphics_mode::screen#5 // screen zp[2]:6 1333.6666666666665 +char graphics_mode::x +char graphics_mode::x#1 // reg byte z 20002.0 +char graphics_mode::x#2 // reg byte z 8000.8 +char graphics_mode::y +char graphics_mode::y#1 // reg byte x 2002.0 +char graphics_mode::y#2 // reg byte x 273.0 +__loadstore char * volatile graphics_render // zp[2]:22 17860.803571428572 +void init_plot() +char init_plot::$1 // reg byte a 2002.0 +unsigned int init_plot::$4 // zp[2]:8 2002.0 +unsigned int *init_plot::$5 // zp[2]:8 2002.0 +unsigned int init_plot::gfx +unsigned int init_plot::gfx#1 // gfx zp[2]:6 2002.0 +unsigned int init_plot::gfx#2 // gfx zp[2]:6 572.0 +unsigned int init_plot::gfx#5 // gfx zp[2]:6 1501.5 +unsigned int init_plot::i +unsigned int init_plot::i#1 // i zp[2]:4 2002.0 +unsigned int init_plot::i#2 // i zp[2]:4 556.1111111111111 +void lpoke(volatile unsigned long addr , volatile char val) +__loadstore volatile unsigned long lpoke::addr // zp[4]:29 500.5 +__loadstore volatile char lpoke::val // zp[1]:28 1001.0 +void main() +char main::toSpritePtr1_return +__constant char main::toSpritePtr1_return#0 = (char)(unsigned int)main::toSpritePtr1_sprite#0/$40 // toSpritePtr1_return +char *main::toSpritePtr1_sprite +__constant char *main::toSpritePtr1_sprite#0 = SPRITES+$40 // toSpritePtr1_sprite +char main::toSpritePtr2_return +__constant char main::toSpritePtr2_return#0 = (char)(unsigned int)main::toSpritePtr2_sprite#0/$40 // toSpritePtr2_return +char *main::toSpritePtr2_sprite +__constant char *main::toSpritePtr2_sprite#0 = SPRITES+$80 // toSpritePtr2_sprite +char main::toSpritePtr3_return +__constant char main::toSpritePtr3_return#0 = (char)(unsigned int)SPRITES/$40 // toSpritePtr3_return +char *main::toSpritePtr3_sprite +void memoryRemap(char remapBlocks , unsigned int lowerPageOffset , unsigned int upperPageOffset) +__loadstore volatile char memoryRemap::aVal // zp[1]:45 25.25 +unsigned int memoryRemap::lowerPageOffset +char memoryRemap::remapBlocks +unsigned int memoryRemap::upperPageOffset +__loadstore volatile char memoryRemap::xVal // zp[1]:44 33.666666666666664 +__loadstore volatile char memoryRemap::yVal // zp[1]:43 50.5 +__loadstore volatile char memoryRemap::zVal // zp[1]:41 101.0 +void memset_dma(void *dest , char fill , unsigned int num) +void *memset_dma::dest +void *memset_dma::dest#0 // dest zp[2]:12 202.0 +void *memset_dma::dest#3 // dest zp[2]:12 25.25 +char memset_dma::dmaMode +char memset_dma::dmaMode#0 // reg byte x 222.44444444444446 +char memset_dma::fill +unsigned int memset_dma::num +__loadstore volatile struct DMA_LIST_F018B memset_dma_command = { command: DMA_COMMAND_FILL, count: 0, src: 0, src_bank: 0, dest: 0, dest_bank: 0, sub_command: 0, modulo: 0 } // mem[12] +__constant void (* const musicInit)() = (void (*)())MUSIC +__constant void (* const musicPlay)() = (void (*)())MUSIC+3 +void plot(unsigned int x , char y) +char *plot::$0 // zp[2]:2 1500001.5 +char plot::$2 // reg byte a 2000002.0 +unsigned int plot::$3 // zp[2]:2 2000002.0 +unsigned int *plot::$4 // zp[2]:2 2000002.0 +char *plot::gfx +unsigned int plot::x +unsigned int plot::x#0 // x zp[2]:6 300000.4285714285 +char plot::y +char plot::y#0 // reg byte z 420000.60000000003 +void render_dots() +unsigned int render_dots::$20 // zp[2]:6 100001.0 +unsigned int render_dots::$21 // zp[2]:14 100001.0 +unsigned int *render_dots::$22 // zp[2]:6 100001.0 +unsigned int *render_dots::$23 // zp[2]:14 200002.0 +char *render_dots::$24 // zp[2]:20 100001.0 +char *render_dots::$25 // zp[2]:18 200002.0 +unsigned int render_dots::i +unsigned int render_dots::i#1 // i zp[2]:16 200002.0 +unsigned int render_dots::i#10 // i zp[2]:16 11111.222222222223 +unsigned int render_dots::idx_x1 +unsigned int render_dots::idx_x1#0 // idx_x1 zp[2]:10 187.6875 +unsigned int render_dots::idx_x1#1 // idx_x1 zp[2]:10 200002.0 +unsigned int render_dots::idx_x1#11 // idx_x1 zp[2]:10 21428.785714285714 +unsigned int render_dots::idx_x1#2 // idx_x1 zp[2]:10 200002.0 +unsigned int render_dots::idx_x1#3 // idx_x1 zp[2]:10 27455.0 +unsigned int render_dots::idx_x2 +unsigned int render_dots::idx_x2#0 // idx_x2 zp[2]:12 250.25 +unsigned int render_dots::idx_x2#1 // idx_x2 zp[2]:12 200002.0 +unsigned int render_dots::idx_x2#13 // idx_x2 zp[2]:12 30000.300000000003 +unsigned int render_dots::idx_x2#2 // idx_x2 zp[2]:12 200002.0 +unsigned int render_dots::idx_x2#3 // idx_x2 zp[2]:12 20133.666666666668 +unsigned int render_dots::idx_y1 +unsigned int render_dots::idx_y1#0 // idx_y1 zp[2]:8 375.375 +unsigned int render_dots::idx_y1#1 // idx_y1 zp[2]:8 200002.0 +unsigned int render_dots::idx_y1#11 // idx_y1 zp[2]:8 15895.0 +unsigned int render_dots::idx_y1#15 // idx_y1 zp[2]:8 50000.5 +unsigned int render_dots::idx_y1#2 // idx_y1 zp[2]:8 200002.0 +unsigned int render_dots::idx_y2 +unsigned int render_dots::idx_y2#0 // idx_y2 zp[2]:4 750.75 +unsigned int render_dots::idx_y2#1 // idx_y2 zp[2]:4 200002.0 +unsigned int render_dots::idx_y2#11 // idx_y2 zp[2]:4 13130.652173913044 +unsigned int render_dots::idx_y2#2 // idx_y2 zp[2]:4 200002.0 +unsigned int render_dots::idx_y2#9 // idx_y2 zp[2]:4 150001.5 +__loadstore volatile unsigned int sin_x1_idx // zp[2]:33 300.40000000000003 +__loadstore volatile unsigned int sin_x2_idx // zp[2]:35 250.33333333333337 +__loadstore volatile unsigned int sin_y1_idx // zp[2]:37 214.57142857142856 +__loadstore volatile unsigned int sin_y2_idx // zp[2]:39 187.75 + +reg byte x [ graphics_mode::y#2 graphics_mode::y#1 ] +zp[4]:24 [ graphics_mode::cols#3 graphics_mode::cols#2 graphics_mode::cols#1 ] +reg byte z [ graphics_mode::x#2 graphics_mode::x#1 ] +zp[2]:16 [ render_dots::i#10 render_dots::i#1 graphics_mode::i#2 graphics_mode::i#1 ] +zp[2]:10 [ render_dots::idx_x1#3 render_dots::idx_x1#11 render_dots::idx_x1#0 render_dots::idx_x1#2 render_dots::idx_x1#1 graphics_mode::ch_x#2 graphics_mode::ch_x#4 graphics_mode::ch_x#1 ] +zp[2]:12 [ render_dots::idx_x2#3 render_dots::idx_x2#13 render_dots::idx_x2#0 render_dots::idx_x2#1 render_dots::idx_x2#2 memset_dma::dest#3 memset_dma::dest#0 ] +zp[2]:4 [ render_dots::idx_y2#11 render_dots::idx_y2#9 render_dots::idx_y2#0 render_dots::idx_y2#1 render_dots::idx_y2#2 init_plot::i#2 init_plot::i#1 graphics_mode::ch#2 graphics_mode::ch#1 ] +zp[1]:42 [ buffer ] +zp[2]:22 [ graphics_render ] +zp[2]:33 [ sin_x1_idx ] +zp[2]:35 [ sin_x2_idx ] +zp[2]:37 [ sin_y1_idx ] +zp[2]:39 [ sin_y2_idx ] +zp[1]:45 [ memoryRemap::aVal ] +zp[1]:44 [ memoryRemap::xVal ] +zp[1]:43 [ memoryRemap::yVal ] +zp[1]:41 [ memoryRemap::zVal ] +zp[4]:29 [ lpoke::addr ] +zp[1]:28 [ lpoke::val ] +reg byte a [ graphics_mode::$8 ] +zp[2]:8 [ init_plot::$4 init_plot::$5 render_dots::idx_y1#11 render_dots::idx_y1#15 render_dots::idx_y1#0 render_dots::idx_y1#1 render_dots::idx_y1#2 ] +reg byte a [ init_plot::$1 ] +reg byte x [ memset_dma::dmaMode#0 ] +zp[2]:6 [ render_dots::$20 render_dots::$22 plot::x#0 init_plot::gfx#2 init_plot::gfx#5 init_plot::gfx#1 graphics_mode::screen#5 graphics_mode::screen#1 ] +zp[2]:14 [ render_dots::$21 render_dots::$23 ] +zp[2]:20 [ render_dots::$24 ] +zp[2]:18 [ render_dots::$25 ] +reg byte z [ plot::y#0 ] +zp[2]:2 [ plot::$3 plot::$4 plot::$0 ] +reg byte a [ plot::$2 ] +mem[12] [ memset_dma_command ] + + +FINAL ASSEMBLER +Score: 52396 + + // File Comments +// A pretty simple double sine plotter + // Upstart +.cpu _45gs02 + // MEGA65 platform PRG executable starting in MEGA65 mode. +.file [name="camelot-1536dots.prg", type="prg", segments="Program"] +.segmentdef Program [segments="Basic, Code, Data"] +.segmentdef Basic [start=$2001] +.segmentdef Code [start=$2017] +.segmentdef Data [startAfter="Code"] +.segment Basic +.byte $0a, $20, $0a, $00, $fe, $02, $20, $30, $00 // 10 BANK 0 +.byte $15, $20, $14, $00, $9e, $20 // 20 SYS +.text toIntString(__start) // NNNN +.byte $00, $00, $00 // + // Global Constants & labels + /// $47, $53: MEGA65 personality + .const VICIV_KEY_M65_A = $47 + .const VICIV_KEY_M65_B = $53 + /// 6 FAST Enable C65 FAST mode (3 .5MHz) + .const VICIV_FAST = $40 + /// $D054 VIC-IV Control register C + /// 0 CHR16 enable 16-bit character numbers (two screen bytes per character) + .const VICIV_CHR16 = 1 + /// 6 VIC-IV:VFAST C65GS FAST mode (48MHz) + .const VICIV_VFAST = $40 + /// $D06E.0-6 SPRPTRADR sprite pointer address (bits 22 - 16) + /// 7 SPRPTR16 16-bit sprite pointer mode (allows sprites to be located on any 64 byte boundary in chip RAM) + .const VICIV_SPRPTR16 = $80 + /// DMA command fill + .const DMA_COMMAND_FILL = 3 + /// Mask for PROCESSOR_PORT_DDR which allows only memory configuration to be written + .const PROCPORT_DDR_MEMORY_MASK = 7 + /// RAM in 0xA000, 0xE000 I/O in 0xD000 + .const PROCPORT_RAM_IO = 5 + /// The colors of the C64 + .const BLACK = 0 + .const WHITE = 1 + .const PURPLE = 4 + .const BLUE = 6 + .const DARK_GREY = $b + // Sine table + .const SINY1_SIZE = $2dd + .const SINY2_SIZE = $13d + .const SINX1_SIZE = $64d + .const SINX2_SIZE = $223 + .const SIZEOF_UNSIGNED_INT = 2 + .const OFFSET_STRUCT_F018_DMAGIC_EN018B = 3 + .const OFFSET_STRUCT_DMA_LIST_F018B_COUNT = 1 + .const OFFSET_STRUCT_DMA_LIST_F018B_SRC = 3 + .const OFFSET_STRUCT_DMA_LIST_F018B_DEST = 6 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRMB = 4 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRBANK = 2 + .const OFFSET_STRUCT_F018_DMAGIC_ADDRMSB = 1 + .const OFFSET_STRUCT_MEGA65_VICIV_KEY = $2f + .const OFFSET_STRUCT_MEGA65_VICIV_CONTROLA = $30 + .const OFFSET_STRUCT_MEGA65_VICIV_CONTROLB = $31 + .const OFFSET_STRUCT_MEGA65_VICIV_CONTROLC = $54 + .const OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOLO = $6c + .const OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOHI = $6d + .const OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_HILO = $6e + .const OFFSET_STRUCT_MEGA65_VICIV_SPRITES_ENABLE = $15 + .const OFFSET_STRUCT_MEGA65_VICIV_SPRITES_PRIORITY = $1b + .const OFFSET_STRUCT_MEGA65_VICIV_RASTER = $12 + .const OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO = $68 + .const OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI = $69 + .const OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO = $6a + .const OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR = $20 + .const OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO = $58 + .const OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI = $59 + .const OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT = $5e + .const OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO = $60 + .const OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI = $61 + .const OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO = $62 + .const OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR = $21 + /// Sprite X position register for sprite #0 + .label SPRITES_XPOS = $d000 + /// Sprite Y position register for sprite #0 + .label SPRITES_YPOS = $d001 + /// Sprite X position MSB register + .label SPRITES_XMSB = $d010 + /// Sprite colors register for sprite #0 + .label SPRITES_COLOR = $d027 + /// Processor port data direction register + .label PROCPORT_DDR = 0 + /// Processor Port Register controlling RAM/ROM configuration and the datasette + .label PROCPORT = 1 + /// The VIC IV + .label VICIV = $d000 + /// DMAgic F018 Controller + .label DMA = $d700 + // Address of the screen + .label SCREEN = $c800 + // // Absolute address of graphics buffer 1 + .label GRAPHICS1 = $a000 + // // Absolute address of graphics buffer 2 + .label GRAPHICS2 = $7000 + // Pointer to the music init routine + .label musicInit = MUSIC + // Pointer to the music play routine + .label musicPlay = MUSIC+3 + // 0: show GRAPHICS1, render to GRAPHICS2 + // 1: show GRAPHICS2, render to GRAPHICS1 + .label buffer = $2a + // The graphics being rendered to + .label graphics_render = $16 + // Sine idx for each plot + .label sin_x1_idx = $21 + .label sin_x2_idx = $23 + .label sin_y1_idx = $25 + .label sin_y2_idx = $27 +.segment Code + // __start +__start: { + // __start::__init1 + // volatile char buffer = 0 + // [1] buffer = 0 -- vbuz1=vbuc1 + ldz #0 + stz.z buffer + // char * volatile graphics_render = GRAPHICS1 + // [2] graphics_render = GRAPHICS1 -- pbuz1=pbuc1 + lda #GRAPHICS1 + sta.z graphics_render+1 + // volatile unsigned int sin_x1_idx + // [3] sin_x1_idx = 0 -- vwuz1=vwuc1 + tza + sta.z sin_x1_idx + sta.z sin_x1_idx+1 + // volatile unsigned int sin_x2_idx + // [4] sin_x2_idx = 0 -- vwuz1=vwuc1 + sta.z sin_x2_idx + sta.z sin_x2_idx+1 + // volatile unsigned int sin_y1_idx + // [5] sin_y1_idx = 0 -- vwuz1=vwuc1 + sta.z sin_y1_idx + sta.z sin_y1_idx+1 + // volatile unsigned int sin_y2_idx + // [6] sin_y2_idx = 0 -- vwuz1=vwuc1 + sta.z sin_y2_idx + sta.z sin_y2_idx+1 + // [7] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1] + // __start::@1 + // [8] call main + // [10] phi from __start::@1 to main [phi:__start::@1->main] + jsr main + // __start::@return + // [9] return + rts +} + // main +main: { + .const toSpritePtr1_return = $ff&toSpritePtr1_sprite/$40 + .const toSpritePtr2_return = $ff&toSpritePtr2_sprite/$40 + .const toSpritePtr3_return = $ff&SPRITES/$40 + .label toSpritePtr1_sprite = SPRITES+$40 + .label toSpritePtr2_sprite = SPRITES+$80 + // main::SEI1 + // asm + // asm { sei } + sei + // [12] phi from main::SEI1 to main::@6 [phi:main::SEI1->main::@6] + // main::@6 + // memoryRemap(0x00,0,0) + // [13] call memoryRemap + // Map memory to BANK 0 : 0x00XXXX - giving access to I/O + jsr memoryRemap + // main::@10 + // *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK + // [14] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 + // Disable Kernal & Basic + ldz #PROCPORT_DDR_MEMORY_MASK + stz PROCPORT_DDR + // *PROCPORT = PROCPORT_RAM_IO + // [15] *PROCPORT = PROCPORT_RAM_IO -- _deref_pbuc1=vbuc2 + ldz #PROCPORT_RAM_IO + stz PROCPORT + // VICIV->KEY = VICIV_KEY_M65_A + // [16] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = VICIV_KEY_M65_A -- _deref_pbuc1=vbuc2 + // Enable MEGA65 features + ldz #VICIV_KEY_M65_A + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY + // VICIV->KEY = VICIV_KEY_M65_B + // [17] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY) = VICIV_KEY_M65_B -- _deref_pbuc1=vbuc2 + ldz #VICIV_KEY_M65_B + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_KEY + // VICIV->CONTROLA = 0 + // [18] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLA) = 0 -- _deref_pbuc1=vbuc2 + // No C65 ROMs are mapped + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLA + // VICIV->CONTROLB |= VICIV_FAST + // [19] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) | VICIV_FAST -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 + // Enable 48MHz fast mode + lda #VICIV_FAST + ora VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + // VICIV->CONTROLC |= VICIV_VFAST + // [20] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) | VICIV_VFAST -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 + lda #VICIV_VFAST + ora VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + // graphics_mode() + // [21] call graphics_mode + // Initialize graphics + jsr graphics_mode + // main::@11 + // VICIV->SPRPTRADR_LOLO = LOBYTE + // [22] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOLO) = byte0 SPRITE_PTRS -- _deref_pbuc1=vbuc2 + // Show sprites + ldz #SPRPTRADR_LOHI = HIBYTE + // [23] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOHI) = byte1 SPRITE_PTRS -- _deref_pbuc1=vbuc2 + ldz #>SPRITE_PTRS + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOHI + // VICIV->SPRPTRADR_HILO = VICIV_SPRPTR16 + // [24] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_HILO) = VICIV_SPRPTR16 -- _deref_pbuc1=vbuc2 + ldz #VICIV_SPRPTR16 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_HILO + // [25] phi from main::@11 to main::toSpritePtr1 [phi:main::@11->main::toSpritePtr1] + // main::toSpritePtr1 + // main::@7 + // SPRITE_PTRS[0] = toSpritePtr(SPRITES+0x40) + // [26] *SPRITE_PTRS = main::toSpritePtr1_return#0 -- _deref_pwuc1=vbuc2 + lda #toSpritePtr1_return + sta SPRITE_PTRS+1 + // [27] phi from main::@7 to main::toSpritePtr2 [phi:main::@7->main::toSpritePtr2] + // main::toSpritePtr2 + // main::@8 + // SPRITE_PTRS[1] = toSpritePtr(SPRITES+0x80) + // [28] *(SPRITE_PTRS+1*SIZEOF_UNSIGNED_INT) = main::toSpritePtr2_return#0 -- _deref_pwuc1=vbuc2 + lda #toSpritePtr2_return + sta SPRITE_PTRS+1*SIZEOF_UNSIGNED_INT+1 + // [29] phi from main::@8 to main::toSpritePtr3 [phi:main::@8->main::toSpritePtr3] + // main::toSpritePtr3 + // main::@9 + // SPRITE_PTRS[2] = toSpritePtr(SPRITES+0x00) + // [30] *(SPRITE_PTRS+2*SIZEOF_UNSIGNED_INT) = main::toSpritePtr3_return#0 -- _deref_pwuc1=vbuc2 + lda #toSpritePtr3_return + sta SPRITE_PTRS+2*SIZEOF_UNSIGNED_INT+1 + // VICIV->SPRITES_ENABLE = 7 + // [31] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_ENABLE) = 7 -- _deref_pbuc1=vbuc2 + ldz #7 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_ENABLE + // VICIV->SPRITES_PRIORITY = 0xff + // [32] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_PRIORITY) = $ff -- _deref_pbuc1=vbuc2 + ldz #$ff + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SPRITES_PRIORITY + // SPRITES_COLOR[0] = DARK_GREY + // [33] *SPRITES_COLOR = DARK_GREY -- _deref_pbuc1=vbuc2 + ldz #DARK_GREY + stz SPRITES_COLOR + // SPRITES_COLOR[1] = DARK_GREY + // [34] *(SPRITES_COLOR+1) = DARK_GREY -- _deref_pbuc1=vbuc2 + stz SPRITES_COLOR+1 + // SPRITES_COLOR[2] = DARK_GREY + // [35] *(SPRITES_COLOR+2) = DARK_GREY -- _deref_pbuc1=vbuc2 + stz SPRITES_COLOR+2 + // SPRITES_YPOS[0] = 0xe3 + // [36] *SPRITES_YPOS = $e3 -- _deref_pbuc1=vbuc2 + ldz #$e3 + stz SPRITES_YPOS + // SPRITES_YPOS[2] = 0xe3 + // [37] *(SPRITES_YPOS+2) = $e3 -- _deref_pbuc1=vbuc2 + stz SPRITES_YPOS+2 + // SPRITES_YPOS[4] = 0xe3 + // [38] *(SPRITES_YPOS+4) = $e3 -- _deref_pbuc1=vbuc2 + stz SPRITES_YPOS+4 + // SPRITES_XPOS[0] = 46 + // [39] *SPRITES_XPOS = $2e -- _deref_pbuc1=vbuc2 + ldz #$2e + stz SPRITES_XPOS + // SPRITES_XPOS[2] = 46+24 + // [40] *(SPRITES_XPOS+2) = $2e+$18 -- _deref_pbuc1=vbuc2 + ldz #$2e+$18 + stz SPRITES_XPOS+2 + // SPRITES_XPOS[4] = 25 + // [41] *(SPRITES_XPOS+4) = $19 -- _deref_pbuc1=vbuc2 + ldz #$19 + stz SPRITES_XPOS+4 + // *SPRITES_XMSB = 3 + // [42] *SPRITES_XMSB = 3 -- _deref_pbuc1=vbuc2 + ldz #3 + stz SPRITES_XMSB + // init_plot() + // [43] call init_plot + // Initialize plotter + // [110] phi from main::@9 to init_plot [phi:main::@9->init_plot] + jsr init_plot + // main::@12 + // asm + // asm { lda#0 } + // Initialize SID + lda #0 + // (*musicInit)() + // [45] callexecute *musicInit -- call__deref_pprc1 + jsr musicInit + // Wait for the raster + // main::@1 + __b1: + // while(VICIV->RASTER!=0xe3) + // [46] if(*((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_RASTER)!=$e3) goto main::@1 -- _deref_pbuc1_neq_vbuc2_then_la1 + ldz #$e3 + cpz VICIV+OFFSET_STRUCT_MEGA65_VICIV_RASTER + bne __b1 + // main::@2 + // buffer ^=1 + // [47] buffer = buffer ^ 1 -- vbuz1=vbuz1_bxor_vbuc1 + // Switch buffer + lda #1 + eor.z buffer + sta.z buffer + // if(buffer==0) + // [48] if(buffer==0) goto main::@4 -- vbuz1_eq_0_then_la1 + // Select charset + beq __b4 + // main::@3 + // VICIV->CHARPTR_LOLO = LOBYTE + // [49] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 -- _deref_pbuc1=vbuc2 + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO + // VICIV->CHARPTR_LOHI = HIBYTE + // [50] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS2 -- _deref_pbuc1=vbuc2 + ldz #>GRAPHICS2 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI + // VICIV->CHARPTR_HILO = 0 + // [51] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 -- _deref_pbuc1=vbuc2 + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO + // graphics_render = GRAPHICS1 + // [52] graphics_render = GRAPHICS1 -- pbuz1=pbuc1 + lda #GRAPHICS1 + sta.z graphics_render+1 + // main::@5 + __b5: + // VICIV->BORDER_COLOR = BLUE + // [53] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = BLUE -- _deref_pbuc1=vbuc2 + ldz #BLUE + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR + // memset_dma(graphics_render, 0x00, 40*25*8) + // [54] memset_dma::dest#0 = (void *)graphics_render -- pvoz1=pvoz2 + lda.z graphics_render + sta.z memset_dma.dest + lda.z graphics_render+1 + sta.z memset_dma.dest+1 + // [55] call memset_dma + // Clear the graphics + // [122] phi from main::@5 to memset_dma [phi:main::@5->memset_dma] + // [122] phi memset_dma::dest#3 = memset_dma::dest#0 [phi:main::@5->memset_dma#0] -- register_copy + jsr memset_dma + // main::@13 + // VICIV->BORDER_COLOR = PURPLE + // [56] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = PURPLE -- _deref_pbuc1=vbuc2 + ldz #PURPLE + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR + // render_dots() + // [57] call render_dots + // Render some dots + jsr render_dots + // main::@14 + // VICIV->BORDER_COLOR = BLACK + // [58] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = BLACK -- _deref_pbuc1=vbuc2 + ldz #BLACK + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR + // (*musicPlay)() + // [59] callexecute *musicPlay -- call__deref_pprc1 + //Play SID + jsr musicPlay + jmp __b1 + // main::@4 + __b4: + // VICIV->CHARPTR_LOLO = LOBYTE + // [60] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 -- _deref_pbuc1=vbuc2 + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO + // VICIV->CHARPTR_LOHI = HIBYTE + // [61] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS1 -- _deref_pbuc1=vbuc2 + ldz #>GRAPHICS1 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI + // VICIV->CHARPTR_HILO = 0 + // [62] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 -- _deref_pbuc1=vbuc2 + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO + // graphics_render = GRAPHICS2 + // [63] graphics_render = GRAPHICS2 -- pbuz1=pbuc1 + lda #GRAPHICS2 + sta.z graphics_render+1 + jmp __b5 +} + // memoryRemap +// Remap some of the eight 8K memory blocks in the 64K address space of the 6502 to point somewhere else in the first 1MB memory space of the MEGA65. +// After the remapping the CPU will access the mapped memory whenever it uses instructions that access a remapped block. +// See section 2.3.4 in http://www.zimmers.net/cbmpics/cbm/c65/c65manual.txt for a description of the CPU memory remapper of the C65. +// remapBlocks: Indicates which 8K blocks of the 6502 address space to remap. Each bit represents one 8K block +// - bit 0 Memory block $0000-$1fff. Use constant MEMORYBLOCK_0000. +// - bit 1 Memory block $2000-$3fff. Use constant MEMORYBLOCK_2000. +// - bit 2 Memory block $4000-$5fff. Use constant MEMORYBLOCK_4000. +// - bit 3 Memory block $6000-$7fff. Use constant MEMORYBLOCK_6000. +// - bit 4 Memory block $8000-$9fff. Use constant MEMORYBLOCK_8000. +// - bit 5 Memory block $a000-$bfff. Use constant MEMORYBLOCK_A000. +// - bit 6 Memory block $c000-$dfff. Use constant MEMORYBLOCK_C000. +// - bit 7 Memory block $e000-$ffff. Use constant MEMORYBLOCK_E000. +// lowerPageOffset: Offset that will be added to any remapped blocks in the lower 32K of memory (block 0-3). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 0 ($0000-$1fff) is remapped it will point to lowerPageOffset*$100. +// - If block 1 ($2000-$3fff) is remapped it will point to lowerPageOffset*$100 + $2000. +// - If block 2 ($4000-$5fff) is remapped it will point to lowerPageOffset*$100 + $4000. +// - If block 3 ($6000-$7fff) is remapped it will point to lowerPageOffset*$100 + $6000. +// upperPageOffset: Offset that will be added to any remapped blocks in the upper 32K of memory (block 4-7). +// The offset is a page offset (meaning it is multiplied by 0x100). Only the lower 12bits of the passed value is used. +// - If block 4 ($8000-$9fff) is remapped it will point to upperPageOffset*$100 + $8000 +// - If block 5 ($a000-$bfff) is remapped it will point to upperPageOffset*$100 + $a000. +// - If block 6 ($c000-$dfff) is remapped it will point to upperPageOffset*$100 + $c000. +// - If block 7 ($e000-$ffff) is remapped it will point to upperPageOffset*$100 + $e000. +// void memoryRemap(char remapBlocks, unsigned int lowerPageOffset, unsigned int upperPageOffset) +memoryRemap: { + .label aVal = $2d + .label xVal = $2c + .label yVal = $2b + .label zVal = $29 + // char aVal = BYTE0(lowerPageOffset) + // [64] memoryRemap::aVal = 0 -- vbuz1=vbuc1 + // lower blocks offset page low + ldz #0 + stz.z aVal + // char xVal = (remapBlocks << 4) | (BYTE1(lowerPageOffset) & 0xf) + // [65] memoryRemap::xVal = 0 -- vbuz1=vbuc1 + // lower blocks to map + lower blocks offset high nibble + stz.z xVal + // char yVal = BYTE0(upperPageOffset) + // [66] memoryRemap::yVal = 0 -- vbuz1=vbuc1 + // upper blocks offset page + stz.z yVal + // char zVal = (remapBlocks & 0xf0) | (BYTE1(upperPageOffset) & 0xf) + // [67] memoryRemap::zVal = 0 -- vbuz1=vbuc1 + // upper blocks to map + upper blocks offset page high nibble + stz.z zVal + // asm + // asm { ldaaVal ldxxVal ldyyVal ldzzVal map eom } + lda aVal + ldx xVal + ldy yVal + map + eom + // memoryRemap::@return + // } + // [69] return + rts +} + // graphics_mode +graphics_mode: { + .label ch_x = $a + // Layout screen so that graphics data comes from $40000 -- $4FFFF + // Each column is consequtive values + .label screen = 6 + .label ch = 4 + // Set color ram to white + .label cols = $18 + .label i = $10 + // VICIV->CONTROLC = VICIV_CHR16|VICIV_VFAST + // [70] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC) = VICIV_CHR16|VICIV_VFAST -- _deref_pbuc1=vbuc2 + // 16-bit text mode + ldz #VICIV_CHR16|VICIV_VFAST + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLC + // VICIV->CONTROLB = VICIV_FAST + // [71] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB) = VICIV_FAST -- _deref_pbuc1=vbuc2 + // H320, fast CPU + ldz #VICIV_FAST + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CONTROLB + // VICIV->CHARSTEP_LO = 80 + // [72] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO) = $50 -- _deref_pbuc1=vbuc2 + // 320x200 per char, 16 pixels wide per char + // = 320/8 x 16 bits = 80 bytes per row + ldz #$50 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO + // VICIV->CHARSTEP_HI = 0 + // [73] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI) = 0 -- _deref_pbuc1=vbuc2 + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI + // VICIV->CHRCOUNT = 40 + // [74] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT) = $28 -- _deref_pbuc1=vbuc2 + // Draw 40 chars per row + ldz #$28 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT + // VICIV->SCRNPTR_LOLO = LOBYTE + // [75] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO) = 0 -- _deref_pbuc1=vbuc2 + // Select 2KB screen + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO + // VICIV->SCRNPTR_LOHI = HIBYTE + // [76] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI) = byte1 SCREEN -- _deref_pbuc1=vbuc2 + ldz #>SCREEN + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI + // VICIV->SCRNPTR_HILO = 0x00 + // [77] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO) = 0 -- _deref_pbuc1=vbuc2 + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO + // VICIV->CHARPTR_LOLO = LOBYTE + // [78] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO) = 0 -- _deref_pbuc1=vbuc2 + // Select charset + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO + // VICIV->CHARPTR_LOHI = HIBYTE + // [79] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI) = byte1 GRAPHICS1 -- _deref_pbuc1=vbuc2 + ldz #>GRAPHICS1 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI + // VICIV->CHARPTR_HILO = 0 + // [80] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO) = 0 -- _deref_pbuc1=vbuc2 + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO + // [81] phi from graphics_mode to graphics_mode::@1 [phi:graphics_mode->graphics_mode::@1] + // [81] phi graphics_mode::screen#5 = (unsigned int *)SCREEN [phi:graphics_mode->graphics_mode::@1#0] -- pwuz1=pwuc1 + lda #SCREEN + sta.z screen+1 + // [81] phi graphics_mode::ch#2 = 0 [phi:graphics_mode->graphics_mode::@1#1] -- vwuz1=vwuc1 + tza + sta.z ch + sta.z ch+1 + // [81] phi graphics_mode::y#2 = 0 [phi:graphics_mode->graphics_mode::@1#2] -- vbuxx=vbuc1 + tax + // graphics_mode::@1 + __b1: + // for(char y=0;y<25;y++) + // [82] if(graphics_mode::y#2<$19) goto graphics_mode::@2 -- vbuxx_lt_vbuc1_then_la1 + cpx #$19 + bcs !__b2+ + jmp __b2 + !__b2: + // [83] phi from graphics_mode::@1 to graphics_mode::@6 [phi:graphics_mode::@1->graphics_mode::@6] + // [83] phi graphics_mode::cols#3 = $ff80000 [phi:graphics_mode::@1->graphics_mode::@6#0] -- vduz1=vduc1 + lda #<$ff80000 + sta.z cols + lda #>$ff80000 + sta.z cols+1 + lda #<$ff80000>>$10 + sta.z cols+2 + lda #>$ff80000>>$10 + sta.z cols+3 + // [83] phi graphics_mode::i#2 = 0 [phi:graphics_mode::@1->graphics_mode::@6#1] -- vwuz1=vwuc1 + lda #<0 + sta.z i + sta.z i+1 + // graphics_mode::@6 + __b6: + // for( unsigned int i=0; i<1000;i++) + // [84] if(graphics_mode::i#2<$3e8) goto graphics_mode::@7 -- vwuz1_lt_vwuc1_then_la1 + lda.z i+1 + cmp #>$3e8 + bcc __b7 + bne !+ + lda.z i + cmp #<$3e8 + bcc __b7 + !: + // graphics_mode::@8 + // VICIV->BORDER_COLOR = 0 + // [85] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR) = 0 -- _deref_pbuc1=vbuc2 + // Black border and background + ldz #0 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR + // VICIV->BG_COLOR = 0 + // [86] *((char *)VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR) = 0 -- _deref_pbuc1=vbuc2 + stz VICIV+OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR + // memset_dma(GRAPHICS1, 0x00, 40*25*8) + // [87] call memset_dma + // Clear the graphics + // [122] phi from graphics_mode::@8 to memset_dma [phi:graphics_mode::@8->memset_dma] + // [122] phi memset_dma::dest#3 = (void *)GRAPHICS1 [phi:graphics_mode::@8->memset_dma#0] -- pvoz1=pvoc1 + lda #GRAPHICS1 + sta.z memset_dma.dest+1 + jsr memset_dma + // [88] phi from graphics_mode::@8 to graphics_mode::@11 [phi:graphics_mode::@8->graphics_mode::@11] + // graphics_mode::@11 + // memset_dma(GRAPHICS2, 0x00, 40*25*8) + // [89] call memset_dma + // [122] phi from graphics_mode::@11 to memset_dma [phi:graphics_mode::@11->memset_dma] + // [122] phi memset_dma::dest#3 = (void *)GRAPHICS2 [phi:graphics_mode::@11->memset_dma#0] -- pvoz1=pvoc1 + lda #GRAPHICS2 + sta.z memset_dma.dest+1 + jsr memset_dma + // graphics_mode::@return + // } + // [90] return + rts + // graphics_mode::@7 + __b7: + // lpoke(cols++, 0) + // [91] lpoke::addr = graphics_mode::cols#3 -- vduz1=vduz2 + ldq.z cols + stq.z lpoke.addr + // [92] lpoke::val = 0 -- vbuz1=vbuc1 + ldz #0 + stz.z lpoke.val + // [93] call lpoke + jsr lpoke + // graphics_mode::@9 + // lpoke(cols++, 0); + // [94] graphics_mode::cols#1 = ++ graphics_mode::cols#3 -- vduz1=_inc_vduz1 + inc.z cols + bne !+ + inc.z cols+1 + bne !+ + inc.z cols+2 + bne !+ + inc.z cols+3 + !: + // lpoke(cols++, WHITE) + // [95] lpoke::addr = graphics_mode::cols#1 -- vduz1=vduz2 + ldq.z cols + stq.z lpoke.addr + // [96] lpoke::val = WHITE -- vbuz1=vbuc1 + ldz #WHITE + stz.z lpoke.val + // [97] call lpoke + // No extended attributes + jsr lpoke + // graphics_mode::@10 + // lpoke(cols++, WHITE); + // [98] graphics_mode::cols#2 = ++ graphics_mode::cols#1 -- vduz1=_inc_vduz1 + inc.z cols + bne !+ + inc.z cols+1 + bne !+ + inc.z cols+2 + bne !+ + inc.z cols+3 + !: + // for( unsigned int i=0; i<1000;i++) + // [99] graphics_mode::i#1 = ++ graphics_mode::i#2 -- vwuz1=_inc_vwuz1 + inw.z i + // [83] phi from graphics_mode::@10 to graphics_mode::@6 [phi:graphics_mode::@10->graphics_mode::@6] + // [83] phi graphics_mode::cols#3 = graphics_mode::cols#2 [phi:graphics_mode::@10->graphics_mode::@6#0] -- register_copy + // [83] phi graphics_mode::i#2 = graphics_mode::i#1 [phi:graphics_mode::@10->graphics_mode::@6#1] -- register_copy + jmp __b6 + // graphics_mode::@2 + __b2: + // [100] graphics_mode::ch_x#4 = graphics_mode::ch#2 -- vwuz1=vwuz2 + lda.z ch + sta.z ch_x + lda.z ch+1 + sta.z ch_x+1 + // [101] phi from graphics_mode::@2 to graphics_mode::@3 [phi:graphics_mode::@2->graphics_mode::@3] + // [101] phi graphics_mode::ch_x#2 = graphics_mode::ch_x#4 [phi:graphics_mode::@2->graphics_mode::@3#0] -- register_copy + // [101] phi graphics_mode::x#2 = 0 [phi:graphics_mode::@2->graphics_mode::@3#1] -- vbuzz=vbuc1 + ldz #0 + // graphics_mode::@3 + __b3: + // for(char x=0;x<40;x++) + // [102] if(graphics_mode::x#2<$28) goto graphics_mode::@4 -- vbuzz_lt_vbuc1_then_la1 + cpz #$28 + bcc __b4 + // graphics_mode::@5 + // screen += 40 + // [103] graphics_mode::screen#1 = graphics_mode::screen#5 + $28*SIZEOF_UNSIGNED_INT -- pwuz1=pwuz1_plus_vbuc1 + lda #$28*SIZEOF_UNSIGNED_INT + clc + adc.z screen + sta.z screen + bcc !+ + inc.z screen+1 + !: + // ch++; + // [104] graphics_mode::ch#1 = ++ graphics_mode::ch#2 -- vwuz1=_inc_vwuz1 + inw.z ch + // for(char y=0;y<25;y++) + // [105] graphics_mode::y#1 = ++ graphics_mode::y#2 -- vbuxx=_inc_vbuxx + inx + // [81] phi from graphics_mode::@5 to graphics_mode::@1 [phi:graphics_mode::@5->graphics_mode::@1] + // [81] phi graphics_mode::screen#5 = graphics_mode::screen#1 [phi:graphics_mode::@5->graphics_mode::@1#0] -- register_copy + // [81] phi graphics_mode::ch#2 = graphics_mode::ch#1 [phi:graphics_mode::@5->graphics_mode::@1#1] -- register_copy + // [81] phi graphics_mode::y#2 = graphics_mode::y#1 [phi:graphics_mode::@5->graphics_mode::@1#2] -- register_copy + jmp __b1 + // graphics_mode::@4 + __b4: + // screen[x] = ch_x + // [106] graphics_mode::$8 = graphics_mode::x#2 << 1 -- vbuaa=vbuzz_rol_1 + tza + asl + // [107] graphics_mode::screen#5[graphics_mode::$8] = graphics_mode::ch_x#2 -- pwuz1_derefidx_vbuaa=vwuz2 + tay + lda.z ch_x + sta (screen),y + iny + lda.z ch_x+1 + sta (screen),y + // ch_x += 25 + // [108] graphics_mode::ch_x#1 = graphics_mode::ch_x#2 + $19 -- vwuz1=vwuz1_plus_vbuc1 + lda #$19 + clc + adc.z ch_x + sta.z ch_x + bcc !+ + inc.z ch_x+1 + !: + // for(char x=0;x<40;x++) + // [109] graphics_mode::x#1 = ++ graphics_mode::x#2 -- vbuzz=_inc_vbuzz + inz + // [101] phi from graphics_mode::@4 to graphics_mode::@3 [phi:graphics_mode::@4->graphics_mode::@3] + // [101] phi graphics_mode::ch_x#2 = graphics_mode::ch_x#1 [phi:graphics_mode::@4->graphics_mode::@3#0] -- register_copy + // [101] phi graphics_mode::x#2 = graphics_mode::x#1 [phi:graphics_mode::@4->graphics_mode::@3#1] -- register_copy + jmp __b3 +} + // init_plot +init_plot: { + .label __4 = 8 + .label i = 4 + .label gfx = 6 + .label __5 = 8 + // [111] phi from init_plot to init_plot::@1 [phi:init_plot->init_plot::@1] + // [111] phi init_plot::gfx#2 = 0 [phi:init_plot->init_plot::@1#0] -- vwuz1=vwuc1 + lda #<0 + sta.z gfx + sta.z gfx+1 + // [111] phi init_plot::i#2 = 0 [phi:init_plot->init_plot::@1#1] -- vwuz1=vwuc1 + sta.z i + sta.z i+1 + // init_plot::@1 + __b1: + // for(unsigned int i=0; i<320;i++) + // [112] if(init_plot::i#2<$140) goto init_plot::@2 -- vwuz1_lt_vwuc1_then_la1 + lda.z i+1 + cmp #>$140 + bcc __b2 + bne !+ + lda.z i + cmp #<$140 + bcc __b2 + !: + // init_plot::@return + // } + // [113] return + rts + // init_plot::@2 + __b2: + // GFX_OFFSET[i] = gfx + // [114] init_plot::$4 = init_plot::i#2 << 1 -- vwuz1=vwuz2_rol_1 + lda.z i + asl + sta.z __4 + lda.z i+1 + rol + sta.z __4+1 + // [115] init_plot::$5 = GFX_OFFSET + init_plot::$4 -- pwuz1=pwuc1_plus_vwuz1 + lda.z __5 + clc + adc #GFX_OFFSET + sta.z __5+1 + // [116] *init_plot::$5 = init_plot::gfx#2 -- _deref_pwuz1=vwuz2 + ldy #0 + lda.z gfx + sta (__5),y + iny + lda.z gfx+1 + sta (__5),y + // i&7 + // [117] init_plot::$1 = init_plot::i#2 & 7 -- vbuaa=vwuz1_band_vbuc1 + lda #7 + and.z i + // if((i&7)==7) + // [118] if(init_plot::$1!=7) goto init_plot::@3 -- vbuaa_neq_vbuc1_then_la1 + cmp #7 + bne __b3 + // init_plot::@4 + // gfx +=200 + // [119] init_plot::gfx#1 = init_plot::gfx#2 + $c8 -- vwuz1=vwuz1_plus_vbuc1 + lda #$c8 + clc + adc.z gfx + sta.z gfx + bcc !+ + inc.z gfx+1 + !: + // [120] phi from init_plot::@2 init_plot::@4 to init_plot::@3 [phi:init_plot::@2/init_plot::@4->init_plot::@3] + // [120] phi init_plot::gfx#5 = init_plot::gfx#2 [phi:init_plot::@2/init_plot::@4->init_plot::@3#0] -- register_copy + // init_plot::@3 + __b3: + // for(unsigned int i=0; i<320;i++) + // [121] init_plot::i#1 = ++ init_plot::i#2 -- vwuz1=_inc_vwuz1 + inw.z i + // [111] phi from init_plot::@3 to init_plot::@1 [phi:init_plot::@3->init_plot::@1] + // [111] phi init_plot::gfx#2 = init_plot::gfx#5 [phi:init_plot::@3->init_plot::@1#0] -- register_copy + // [111] phi init_plot::i#2 = init_plot::i#1 [phi:init_plot::@3->init_plot::@1#1] -- register_copy + jmp __b1 +} + // memset_dma +// Fill a memory block within the first 64K memory space using MEGA65 DMagic DMA +// Fills the values of num bytes at the destination with a single byte value. +// - dest The destination address (within the MB and bank) +// - fill The char to fill with +// - num The number of bytes to copy +// void memset_dma(__zp($c) void *dest, char fill, unsigned int num) +memset_dma: { + .label dest = $c + // char dmaMode = DMA->EN018B + // [123] memset_dma::dmaMode#0 = *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) -- vbuxx=_deref_pbuc1 + // Remember current F018 A/B mode + ldx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // memset_dma_command.count = num + // [124] *((unsigned int *)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT) = (unsigned int)$28*$19*8 -- _deref_pwuc1=vwuc2 + // Set up command + lda #<$28*$19*8 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT + lda #>$28*$19*8 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_COUNT+1 + // memset_dma_command.src = (char*)fill + // [125] *((char **)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC) = (char *)0 -- _deref_qbuc1=pbuc2 + lda #<0 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_SRC+1 + // memset_dma_command.dest = dest + // [126] *((char **)&memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST) = (char *)memset_dma::dest#3 -- _deref_qbuc1=pbuz1 + lda.z dest + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST + lda.z dest+1 + sta memset_dma_command+OFFSET_STRUCT_DMA_LIST_F018B_DEST+1 + // DMA->EN018B = 1 + // [127] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = 1 -- _deref_pbuc1=vbuc2 + // Set F018B mode + ldz #1 + stz DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // DMA->ADDRMB = 0 + // [128] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB) = 0 -- _deref_pbuc1=vbuc2 + // Set address of DMA list + ldz #0 + stz DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMB + // DMA->ADDRBANK = 0 + // [129] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK) = 0 -- _deref_pbuc1=vbuc2 + stz DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRBANK + // DMA-> ADDRMSB = BYTE1(&memset_dma_command) + // [130] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB) = byte1 &memset_dma_command -- _deref_pbuc1=vbuc2 + ldz #>memset_dma_command + stz DMA+OFFSET_STRUCT_F018_DMAGIC_ADDRMSB + // DMA-> ADDRLSBTRIG = BYTE0(&memset_dma_command) + // [131] *((char *)DMA) = byte0 &memset_dma_command -- _deref_pbuc1=vbuc2 + // Trigger the DMA (without option lists) + ldz #EN018B = dmaMode + // [132] *((char *)DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B) = memset_dma::dmaMode#0 -- _deref_pbuc1=vbuxx + // Re-enable F018A mode + stx DMA+OFFSET_STRUCT_F018_DMAGIC_EN018B + // memset_dma::@return + // } + // [133] return + rts +} + // render_dots +render_dots: { + .label __20 = 6 + .label __21 = $e + .label idx_x1 = $a + .label idx_x2 = $c + .label idx_y1 = 8 + .label idx_y2 = 4 + .label i = $10 + .label __22 = 6 + .label __23 = $e + .label __24 = $14 + .label __25 = $12 + // unsigned int idx_x1 = sin_x1_idx + // [134] render_dots::idx_x1#0 = sin_x1_idx -- vwuz1=vwuz2 + // Plot some dots + lda.z sin_x1_idx + sta.z idx_x1 + lda.z sin_x1_idx+1 + sta.z idx_x1+1 + // sin_x1_idx += 1 + // [135] sin_x1_idx = sin_x1_idx + 1 -- vwuz1=vwuz1_plus_1 + inw.z sin_x1_idx + // if(sin_x1_idx>SINX1_SIZE) + // [136] if(sin_x1_idx<=SINX1_SIZE) goto render_dots::@1 -- vwuz1_le_vwuc1_then_la1 + lda.z sin_x1_idx+1 + cmp #>SINX1_SIZE + bne !+ + lda.z sin_x1_idx + cmp #SINX1_SIZE + sta.z sin_x1_idx+1 + // render_dots::@1 + __b1: + // unsigned int idx_x2 = sin_x2_idx + // [138] render_dots::idx_x2#0 = sin_x2_idx -- vwuz1=vwuz2 + lda.z sin_x2_idx + sta.z idx_x2 + lda.z sin_x2_idx+1 + sta.z idx_x2+1 + // sin_x2_idx -= 1 + // [139] sin_x2_idx = sin_x2_idx - 1 -- vwuz1=vwuz1_minus_1 + lda.z sin_x2_idx + sec + sbc #1 + sta.z sin_x2_idx + lda.z sin_x2_idx+1 + sbc #0 + sta.z sin_x2_idx+1 + // if(sin_x2_idx>SINX2_SIZE) + // [140] if(sin_x2_idx<=SINX2_SIZE) goto render_dots::@2 -- vwuz1_le_vwuc1_then_la1 + cmp #>SINX2_SIZE + bne !+ + lda.z sin_x2_idx + cmp #SINX2_SIZE + sta.z sin_x2_idx+1 + // render_dots::@2 + __b2: + // unsigned int idx_y1 = sin_y1_idx + // [142] render_dots::idx_y1#0 = sin_y1_idx -- vwuz1=vwuz2 + lda.z sin_y1_idx + sta.z idx_y1 + lda.z sin_y1_idx+1 + sta.z idx_y1+1 + // sin_y1_idx -= 1 + // [143] sin_y1_idx = sin_y1_idx - 1 -- vwuz1=vwuz1_minus_1 + lda.z sin_y1_idx + sec + sbc #1 + sta.z sin_y1_idx + lda.z sin_y1_idx+1 + sbc #0 + sta.z sin_y1_idx+1 + // if(sin_y1_idx>SINY1_SIZE) + // [144] if(sin_y1_idx<=SINY1_SIZE) goto render_dots::@3 -- vwuz1_le_vwuc1_then_la1 + cmp #>SINY1_SIZE + bne !+ + lda.z sin_y1_idx + cmp #SINY1_SIZE + sta.z sin_y1_idx+1 + // render_dots::@3 + __b3: + // unsigned int idx_y2 = sin_y2_idx + // [146] render_dots::idx_y2#0 = sin_y2_idx -- vwuz1=vwuz2 + lda.z sin_y2_idx + sta.z idx_y2 + lda.z sin_y2_idx+1 + sta.z idx_y2+1 + // sin_y2_idx += 1 + // [147] sin_y2_idx = sin_y2_idx + 1 -- vwuz1=vwuz1_plus_1 + inw.z sin_y2_idx + // if(sin_y2_idx>SINY2_SIZE) + // [148] if(sin_y2_idx<=SINY2_SIZE) goto render_dots::@8 -- vwuz1_le_vwuc1_then_la1 + lda.z sin_y2_idx+1 + cmp #>SINY2_SIZE + bne !+ + lda.z sin_y2_idx + cmp #SINY2_SIZE + sta.z sin_y2_idx+1 + // [150] phi from render_dots::@3 render_dots::@7 to render_dots::@8 [phi:render_dots::@3/render_dots::@7->render_dots::@8] + __b4: + // [150] phi render_dots::idx_y2#11 = render_dots::idx_y2#0 [phi:render_dots::@3/render_dots::@7->render_dots::@8#0] -- register_copy + // [150] phi render_dots::idx_y1#11 = render_dots::idx_y1#0 [phi:render_dots::@3/render_dots::@7->render_dots::@8#1] -- register_copy + // [150] phi render_dots::idx_x2#3 = render_dots::idx_x2#0 [phi:render_dots::@3/render_dots::@7->render_dots::@8#2] -- register_copy + // [150] phi render_dots::idx_x1#3 = render_dots::idx_x1#0 [phi:render_dots::@3/render_dots::@7->render_dots::@8#3] -- register_copy + // [150] phi render_dots::i#10 = 0 [phi:render_dots::@3/render_dots::@7->render_dots::@8#4] -- vwuz1=vwuc1 + lda #<0 + sta.z i + sta.z i+1 + // render_dots::@8 + __b8: + // for(unsigned int i=0;i<1536;i++) + // [151] if(render_dots::i#10<$600) goto render_dots::@9 -- vwuz1_lt_vwuc1_then_la1 + lda.z i+1 + cmp #>$600 + bcc __b9 + bne !+ + lda.z i + cmp #<$600 + bcc __b9 + !: + // render_dots::@return + // } + // [152] return + rts + // render_dots::@9 + __b9: + // SINX1[idx_x1]+SINX2[idx_x2] + // [153] render_dots::$20 = render_dots::idx_x1#3 << 1 -- vwuz1=vwuz2_rol_1 + lda.z idx_x1 + asl + sta.z __20 + lda.z idx_x1+1 + rol + sta.z __20+1 + // [154] render_dots::$21 = render_dots::idx_x2#3 << 1 -- vwuz1=vwuz2_rol_1 + lda.z idx_x2 + asl + sta.z __21 + lda.z idx_x2+1 + rol + sta.z __21+1 + // plot(SINX1[idx_x1]+SINX2[idx_x2], SINY1[idx_y1]+SINY2[idx_y2]) + // [155] render_dots::$22 = SINX1 + render_dots::$20 -- pwuz1=pwuc1_plus_vwuz1 + lda.z __22 + clc + adc #SINX1 + sta.z __22+1 + // [156] render_dots::$23 = SINX2 + render_dots::$21 -- pwuz1=pwuc1_plus_vwuz1 + lda.z __23 + clc + adc #SINX2 + sta.z __23+1 + // [157] plot::x#0 = *render_dots::$22 + *render_dots::$23 -- vwuz1=_deref_pwuz1_plus__deref_pwuz2 + ldy #0 + clc + lda (plot.x),y + adc (__23),y + pha + iny + lda (plot.x),y + adc (__23),y + sta.z plot.x+1 + pla + sta.z plot.x + // [158] render_dots::$24 = SINY1 + render_dots::idx_y1#11 -- pbuz1=pbuc1_plus_vwuz2 + lda.z idx_y1 + clc + adc #SINY1 + sta.z __24+1 + // [159] render_dots::$25 = SINY2 + render_dots::idx_y2#11 -- pbuz1=pbuc1_plus_vwuz2 + lda.z idx_y2 + clc + adc #SINY2 + sta.z __25+1 + // [160] plot::y#0 = *render_dots::$24 + *render_dots::$25 -- vbuzz=_deref_pbuz1_plus__deref_pbuz2 + ldy #0 + lda (__24),y + clc + adc (__25),y + taz + // [161] call plot + jsr plot + // render_dots::@18 + // idx_x1 -= 11 + // [162] render_dots::idx_x1#1 = render_dots::idx_x1#3 - $b -- vwuz1=vwuz1_minus_vbuc1 + sec + lda.z idx_x1 + sbc #$b + sta.z idx_x1 + lda.z idx_x1+1 + sbc #0 + sta.z idx_x1+1 + // if(idx_x1>SINX1_SIZE) + // [163] if(render_dots::idx_x1#1<=SINX1_SIZE) goto render_dots::@10 -- vwuz1_le_vwuc1_then_la1 + cmp #>SINX1_SIZE + bne !+ + lda.z idx_x1 + cmp #SINX1_SIZE + sta.z idx_x1+1 + // [165] phi from render_dots::@14 render_dots::@18 to render_dots::@10 [phi:render_dots::@14/render_dots::@18->render_dots::@10] + // [165] phi render_dots::idx_x1#11 = render_dots::idx_x1#2 [phi:render_dots::@14/render_dots::@18->render_dots::@10#0] -- register_copy + // render_dots::@10 + __b10: + // idx_x2 += 3 + // [166] render_dots::idx_x2#1 = render_dots::idx_x2#3 + 3 -- vwuz1=vwuz1_plus_vbuc1 + lda #3 + clc + adc.z idx_x2 + sta.z idx_x2 + bcc !+ + inc.z idx_x2+1 + !: + // if(idx_x2>SINX2_SIZE) + // [167] if(render_dots::idx_x2#1<=SINX2_SIZE) goto render_dots::@11 -- vwuz1_le_vwuc1_then_la1 + lda.z idx_x2+1 + cmp #>SINX2_SIZE + bne !+ + lda.z idx_x2 + cmp #SINX2_SIZE + sta.z idx_x2+1 + // [169] phi from render_dots::@10 render_dots::@15 to render_dots::@11 [phi:render_dots::@10/render_dots::@15->render_dots::@11] + // [169] phi render_dots::idx_x2#13 = render_dots::idx_x2#1 [phi:render_dots::@10/render_dots::@15->render_dots::@11#0] -- register_copy + // render_dots::@11 + __b11: + // idx_y1 += 9 + // [170] render_dots::idx_y1#1 = render_dots::idx_y1#11 + 9 -- vwuz1=vwuz1_plus_vbuc1 + lda #9 + clc + adc.z idx_y1 + sta.z idx_y1 + bcc !+ + inc.z idx_y1+1 + !: + // if(idx_y1>SINY1_SIZE) + // [171] if(render_dots::idx_y1#1<=SINY1_SIZE) goto render_dots::@12 -- vwuz1_le_vwuc1_then_la1 + lda.z idx_y1+1 + cmp #>SINY1_SIZE + bne !+ + lda.z idx_y1 + cmp #SINY1_SIZE + sta.z idx_y1+1 + // [173] phi from render_dots::@11 render_dots::@16 to render_dots::@12 [phi:render_dots::@11/render_dots::@16->render_dots::@12] + // [173] phi render_dots::idx_y1#15 = render_dots::idx_y1#1 [phi:render_dots::@11/render_dots::@16->render_dots::@12#0] -- register_copy + // render_dots::@12 + __b12: + // idx_y2 -= 5 + // [174] render_dots::idx_y2#1 = render_dots::idx_y2#11 - 5 -- vwuz1=vwuz1_minus_vbuc1 + sec + lda.z idx_y2 + sbc #5 + sta.z idx_y2 + lda.z idx_y2+1 + sbc #0 + sta.z idx_y2+1 + // if(idx_y2>SINY2_SIZE) + // [175] if(render_dots::idx_y2#1<=SINY2_SIZE) goto render_dots::@13 -- vwuz1_le_vwuc1_then_la1 + cmp #>SINY2_SIZE + bne !+ + lda.z idx_y2 + cmp #SINY2_SIZE + sta.z idx_y2+1 + // [177] phi from render_dots::@12 render_dots::@17 to render_dots::@13 [phi:render_dots::@12/render_dots::@17->render_dots::@13] + // [177] phi render_dots::idx_y2#9 = render_dots::idx_y2#1 [phi:render_dots::@12/render_dots::@17->render_dots::@13#0] -- register_copy + // render_dots::@13 + __b13: + // for(unsigned int i=0;i<1536;i++) + // [178] render_dots::i#1 = ++ render_dots::i#10 -- vwuz1=_inc_vwuz1 + inw.z i + // [150] phi from render_dots::@13 to render_dots::@8 [phi:render_dots::@13->render_dots::@8] + // [150] phi render_dots::idx_y2#11 = render_dots::idx_y2#9 [phi:render_dots::@13->render_dots::@8#0] -- register_copy + // [150] phi render_dots::idx_y1#11 = render_dots::idx_y1#15 [phi:render_dots::@13->render_dots::@8#1] -- register_copy + // [150] phi render_dots::idx_x2#3 = render_dots::idx_x2#13 [phi:render_dots::@13->render_dots::@8#2] -- register_copy + // [150] phi render_dots::idx_x1#3 = render_dots::idx_x1#11 [phi:render_dots::@13->render_dots::@8#3] -- register_copy + // [150] phi render_dots::i#10 = render_dots::i#1 [phi:render_dots::@13->render_dots::@8#4] -- register_copy + jmp __b8 +} + // lpoke +// Get the low byte from a word/int +// Get the high byte from a word/int +// Poke a byte value into memory +// Peek a byte value from memory +// Poke a value directly into memory +// - addr: The 32bit address to poke to +// - val: The value to poke +// void lpoke(__zp($1d) volatile unsigned long addr, __zp($1c) volatile char val) +lpoke: { + .label addr = $1d + .label val = $1c + // asm + // asm { ldz#0 ldaval sta((addr)),z } + // Use the 45GS02 32-bit addressing mode + ldz #0 + lda val + sta ((addr)),z + // lpoke::@return + // } + // [180] return + rts +} + // plot +// Do a single plot on the canvas +// void plot(__zp(6) unsigned int x, __register(Z) char y) +plot: { + .label __0 = 2 + .label __3 = 2 + .label x = 6 + .label __4 = 2 + // graphics_render + GFX_OFFSET[x] + // [181] plot::$3 = plot::x#0 << 1 -- vwuz1=vwuz2_rol_1 + lda.z x + asl + sta.z __3 + lda.z x+1 + rol + sta.z __3+1 + // [182] plot::$4 = GFX_OFFSET + plot::$3 -- pwuz1=pwuc1_plus_vwuz1 + lda.z __4 + clc + adc #GFX_OFFSET + sta.z __4+1 + // [183] plot::$0 = graphics_render + *plot::$4 -- pbuz1=pbuz2_plus__deref_pwuz1 + ldy #0 + clc + lda (__0),y + adc.z graphics_render + pha + iny + lda (__0),y + adc.z graphics_render+1 + sta.z __0+1 + pla + sta.z __0 + // x&7 + // [184] plot::$2 = plot::x#0 & 7 -- vbuaa=vwuz1_band_vbuc1 + lda #7 + and.z x + // *gfx |= GFX_BIT[x&7] + // [185] plot::$0[plot::y#0] = plot::$0[plot::y#0] | GFX_BIT[plot::$2] -- pbuz1_derefidx_vbuzz=pbuz1_derefidx_vbuzz_bor_pbuc1_derefidx_vbuaa + tax + tza + tay + lda (__0),y + ora GFX_BIT,x + sta (__0),y + // plot::@return + // } + // [186] return + rts +} + // File Data +.segment Data + .align $40 +SPRITES: +.var pic = LoadPicture("camelot-sprites.png", List().add($000000, $ffffff)) + .for (var s=0; s<3; s++) { + .for (var y=0; y<21; y++) { + .for (var x=0;x<3; x++) { + .byte pic.getSinglecolorByte(s*3+x,y) + } + } + .byte 0 + } + + // The sprite pointers + SPRITE_PTRS: .fill 2*8, 0 + // Graphics bit + GFX_BIT: .byte $80, $40, $20, $10, 8, 4, 2, 1 + // Offset to graphics for (x, 0) + GFX_OFFSET: .fill 2*$140, 0 +SINY1: +.fill 733+256, round(66.5+66.5*sin(toRadians(360*i/733))) + +SINY2: +.fill 317+256, round(33+33*sin(toRadians(360*i/317))) + +SINX1: +.fillword 1613+256, round(98+98*sin(toRadians(360*i/1613))) + +SINX2: +.fillword 547+256, round(60+60*sin(toRadians(360*i/547))) + + // DMA list entry for filling data + memset_dma_command: .byte DMA_COMMAND_FILL + .word 0, 0 + .byte 0 + .word 0 + .byte 0, 0 + .word 0 +.pc = $5000 "MUSIC" +// SID tune at an absolute address +MUSIC: +.const music = LoadSid("Thaw_5000.sid") + .fill music.size, music.getData(i) + + diff --git a/src/test/ref/examples/mega65/camelot-1536dots.sym b/src/test/ref/examples/mega65/camelot-1536dots.sym new file mode 100644 index 000000000..253685fb0 --- /dev/null +++ b/src/test/ref/examples/mega65/camelot-1536dots.sym @@ -0,0 +1,235 @@ +__constant const char BLACK = 0 +__constant const char BLUE = 6 +__constant const char DARK_GREY = $b +__constant struct F018_DMAGIC * const DMA = (struct F018_DMAGIC *) 55040 +__constant const char DMA_COMMAND_FILL = 3 +__constant char GFX_BIT[8] = { $80, $40, $20, $10, 8, 4, 2, 1 } +__constant unsigned int GFX_OFFSET[$140] = { fill( $140, 0) } +__constant char * const GRAPHICS1 = (char *) 40960 +__constant char * const GRAPHICS2 = (char *) 28672 +__constant char MUSIC[] = kickasm {{ .const music = LoadSid("Thaw_5000.sid") + .fill music.size, music.getData(i) + }} +__constant char OFFSET_STRUCT_DMA_LIST_F018B_COUNT = 1 +__constant char OFFSET_STRUCT_DMA_LIST_F018B_DEST = 6 +__constant char OFFSET_STRUCT_DMA_LIST_F018B_SRC = 3 +__constant char OFFSET_STRUCT_F018_DMAGIC_ADDRBANK = 2 +__constant char OFFSET_STRUCT_F018_DMAGIC_ADDRMB = 4 +__constant char OFFSET_STRUCT_F018_DMAGIC_ADDRMSB = 1 +__constant char OFFSET_STRUCT_F018_DMAGIC_EN018B = 3 +__constant char OFFSET_STRUCT_MEGA65_VICIV_BG_COLOR = $21 +__constant char OFFSET_STRUCT_MEGA65_VICIV_BORDER_COLOR = $20 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_HILO = $6a +__constant char OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOHI = $69 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CHARPTR_LOLO = $68 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_HI = $59 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CHARSTEP_LO = $58 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CHRCOUNT = $5e +__constant char OFFSET_STRUCT_MEGA65_VICIV_CONTROLA = $30 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CONTROLB = $31 +__constant char OFFSET_STRUCT_MEGA65_VICIV_CONTROLC = $54 +__constant char OFFSET_STRUCT_MEGA65_VICIV_KEY = $2f +__constant char OFFSET_STRUCT_MEGA65_VICIV_RASTER = $12 +__constant char OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_HILO = $62 +__constant char OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOHI = $61 +__constant char OFFSET_STRUCT_MEGA65_VICIV_SCRNPTR_LOLO = $60 +__constant char OFFSET_STRUCT_MEGA65_VICIV_SPRITES_ENABLE = $15 +__constant char OFFSET_STRUCT_MEGA65_VICIV_SPRITES_PRIORITY = $1b +__constant char OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_HILO = $6e +__constant char OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOHI = $6d +__constant char OFFSET_STRUCT_MEGA65_VICIV_SPRPTRADR_LOLO = $6c +__constant char * const PROCPORT = (char *) 1 +__constant char * const PROCPORT_DDR = (char *) 0 +__constant const char PROCPORT_DDR_MEMORY_MASK = 7 +__constant const char PROCPORT_RAM_IO = 5 +__constant const char PURPLE = 4 +__constant char * const SCREEN = (char *) 51200 +__constant unsigned int SINX1[SINX1_SIZE+$100] = kickasm {{ .fillword 1613+256, round(98+98*sin(toRadians(360*i/1613))) + }} +__constant const unsigned int SINX1_SIZE = $64d +__constant unsigned int SINX2[SINX2_SIZE+$100] = kickasm {{ .fillword 547+256, round(60+60*sin(toRadians(360*i/547))) + }} +__constant const unsigned int SINX2_SIZE = $223 +__constant char SINY1[SINY1_SIZE+$100] = kickasm {{ .fill 733+256, round(66.5+66.5*sin(toRadians(360*i/733))) + }} +__constant const unsigned int SINY1_SIZE = $2dd +__constant char SINY2[SINY2_SIZE+$100] = kickasm {{ .fill 317+256, round(33+33*sin(toRadians(360*i/317))) + }} +__constant const unsigned int SINY2_SIZE = $13d +__constant char SIZEOF_UNSIGNED_INT = 2 +__constant char SPRITES[$c0] = kickasm {{ .var pic = LoadPicture("camelot-sprites.png", List().add($000000, $ffffff)) + .for (var s=0; s<3; s++) { + .for (var y=0; y<21; y++) { + .for (var x=0;x<3; x++) { + .byte pic.getSinglecolorByte(s*3+x,y) + } + } + .byte 0 + } + }} +__constant char * const SPRITES_COLOR = (char *) 53287 +__constant char * const SPRITES_XMSB = (char *) 53264 +__constant char * const SPRITES_XPOS = (char *) 53248 +__constant char * const SPRITES_YPOS = (char *) 53249 +__constant unsigned int SPRITE_PTRS[8] = { fill( 8, 0) } +__constant struct MEGA65_VICIV * const VICIV = (struct MEGA65_VICIV *) 53248 +__constant const char VICIV_CHR16 = 1 +__constant const char VICIV_FAST = $40 +__constant const char VICIV_KEY_M65_A = $47 +__constant const char VICIV_KEY_M65_B = $53 +__constant const char VICIV_SPRPTR16 = $80 +__constant const char VICIV_VFAST = $40 +__constant const char WHITE = 1 +void __start() +__loadstore volatile char buffer // zp[1]:42 76.25 +void graphics_mode() +char graphics_mode::$8 // reg byte a 20002.0 +unsigned int graphics_mode::ch +unsigned int graphics_mode::ch#1 // ch zp[2]:4 1001.0 +unsigned int graphics_mode::ch#2 // ch zp[2]:4 300.29999999999995 +unsigned int graphics_mode::ch_x +unsigned int graphics_mode::ch_x#1 // ch_x zp[2]:10 10001.0 +unsigned int graphics_mode::ch_x#2 // ch_x zp[2]:10 7751.0 +unsigned int graphics_mode::ch_x#4 // ch_x zp[2]:10 2002.0 +unsigned long graphics_mode::cols +unsigned long graphics_mode::cols#1 // cols zp[4]:24 750.75 +unsigned long graphics_mode::cols#2 // cols zp[4]:24 1001.0 +unsigned long graphics_mode::cols#3 // cols zp[4]:24 600.5999999999999 +unsigned int graphics_mode::i +unsigned int graphics_mode::i#1 // i zp[2]:16 2002.0 +unsigned int graphics_mode::i#2 // i zp[2]:16 300.29999999999995 +unsigned int *graphics_mode::screen +unsigned int *graphics_mode::screen#1 // screen zp[2]:6 667.3333333333334 +unsigned int *graphics_mode::screen#5 // screen zp[2]:6 1333.6666666666665 +char graphics_mode::x +char graphics_mode::x#1 // reg byte z 20002.0 +char graphics_mode::x#2 // reg byte z 8000.8 +char graphics_mode::y +char graphics_mode::y#1 // reg byte x 2002.0 +char graphics_mode::y#2 // reg byte x 273.0 +__loadstore char * volatile graphics_render // zp[2]:22 17860.803571428572 +void init_plot() +char init_plot::$1 // reg byte a 2002.0 +unsigned int init_plot::$4 // zp[2]:8 2002.0 +unsigned int *init_plot::$5 // zp[2]:8 2002.0 +unsigned int init_plot::gfx +unsigned int init_plot::gfx#1 // gfx zp[2]:6 2002.0 +unsigned int init_plot::gfx#2 // gfx zp[2]:6 572.0 +unsigned int init_plot::gfx#5 // gfx zp[2]:6 1501.5 +unsigned int init_plot::i +unsigned int init_plot::i#1 // i zp[2]:4 2002.0 +unsigned int init_plot::i#2 // i zp[2]:4 556.1111111111111 +void lpoke(volatile unsigned long addr , volatile char val) +__loadstore volatile unsigned long lpoke::addr // zp[4]:29 500.5 +__loadstore volatile char lpoke::val // zp[1]:28 1001.0 +void main() +char main::toSpritePtr1_return +__constant char main::toSpritePtr1_return#0 = (char)(unsigned int)main::toSpritePtr1_sprite#0/$40 // toSpritePtr1_return +char *main::toSpritePtr1_sprite +__constant char *main::toSpritePtr1_sprite#0 = SPRITES+$40 // toSpritePtr1_sprite +char main::toSpritePtr2_return +__constant char main::toSpritePtr2_return#0 = (char)(unsigned int)main::toSpritePtr2_sprite#0/$40 // toSpritePtr2_return +char *main::toSpritePtr2_sprite +__constant char *main::toSpritePtr2_sprite#0 = SPRITES+$80 // toSpritePtr2_sprite +char main::toSpritePtr3_return +__constant char main::toSpritePtr3_return#0 = (char)(unsigned int)SPRITES/$40 // toSpritePtr3_return +char *main::toSpritePtr3_sprite +void memoryRemap(char remapBlocks , unsigned int lowerPageOffset , unsigned int upperPageOffset) +__loadstore volatile char memoryRemap::aVal // zp[1]:45 25.25 +unsigned int memoryRemap::lowerPageOffset +char memoryRemap::remapBlocks +unsigned int memoryRemap::upperPageOffset +__loadstore volatile char memoryRemap::xVal // zp[1]:44 33.666666666666664 +__loadstore volatile char memoryRemap::yVal // zp[1]:43 50.5 +__loadstore volatile char memoryRemap::zVal // zp[1]:41 101.0 +void memset_dma(void *dest , char fill , unsigned int num) +void *memset_dma::dest +void *memset_dma::dest#0 // dest zp[2]:12 202.0 +void *memset_dma::dest#3 // dest zp[2]:12 25.25 +char memset_dma::dmaMode +char memset_dma::dmaMode#0 // reg byte x 222.44444444444446 +char memset_dma::fill +unsigned int memset_dma::num +__loadstore volatile struct DMA_LIST_F018B memset_dma_command = { command: DMA_COMMAND_FILL, count: 0, src: 0, src_bank: 0, dest: 0, dest_bank: 0, sub_command: 0, modulo: 0 } // mem[12] +__constant void (* const musicInit)() = (void (*)())MUSIC +__constant void (* const musicPlay)() = (void (*)())MUSIC+3 +void plot(unsigned int x , char y) +char *plot::$0 // zp[2]:2 1500001.5 +char plot::$2 // reg byte a 2000002.0 +unsigned int plot::$3 // zp[2]:2 2000002.0 +unsigned int *plot::$4 // zp[2]:2 2000002.0 +char *plot::gfx +unsigned int plot::x +unsigned int plot::x#0 // x zp[2]:6 300000.4285714285 +char plot::y +char plot::y#0 // reg byte z 420000.60000000003 +void render_dots() +unsigned int render_dots::$20 // zp[2]:6 100001.0 +unsigned int render_dots::$21 // zp[2]:14 100001.0 +unsigned int *render_dots::$22 // zp[2]:6 100001.0 +unsigned int *render_dots::$23 // zp[2]:14 200002.0 +char *render_dots::$24 // zp[2]:20 100001.0 +char *render_dots::$25 // zp[2]:18 200002.0 +unsigned int render_dots::i +unsigned int render_dots::i#1 // i zp[2]:16 200002.0 +unsigned int render_dots::i#10 // i zp[2]:16 11111.222222222223 +unsigned int render_dots::idx_x1 +unsigned int render_dots::idx_x1#0 // idx_x1 zp[2]:10 187.6875 +unsigned int render_dots::idx_x1#1 // idx_x1 zp[2]:10 200002.0 +unsigned int render_dots::idx_x1#11 // idx_x1 zp[2]:10 21428.785714285714 +unsigned int render_dots::idx_x1#2 // idx_x1 zp[2]:10 200002.0 +unsigned int render_dots::idx_x1#3 // idx_x1 zp[2]:10 27455.0 +unsigned int render_dots::idx_x2 +unsigned int render_dots::idx_x2#0 // idx_x2 zp[2]:12 250.25 +unsigned int render_dots::idx_x2#1 // idx_x2 zp[2]:12 200002.0 +unsigned int render_dots::idx_x2#13 // idx_x2 zp[2]:12 30000.300000000003 +unsigned int render_dots::idx_x2#2 // idx_x2 zp[2]:12 200002.0 +unsigned int render_dots::idx_x2#3 // idx_x2 zp[2]:12 20133.666666666668 +unsigned int render_dots::idx_y1 +unsigned int render_dots::idx_y1#0 // idx_y1 zp[2]:8 375.375 +unsigned int render_dots::idx_y1#1 // idx_y1 zp[2]:8 200002.0 +unsigned int render_dots::idx_y1#11 // idx_y1 zp[2]:8 15895.0 +unsigned int render_dots::idx_y1#15 // idx_y1 zp[2]:8 50000.5 +unsigned int render_dots::idx_y1#2 // idx_y1 zp[2]:8 200002.0 +unsigned int render_dots::idx_y2 +unsigned int render_dots::idx_y2#0 // idx_y2 zp[2]:4 750.75 +unsigned int render_dots::idx_y2#1 // idx_y2 zp[2]:4 200002.0 +unsigned int render_dots::idx_y2#11 // idx_y2 zp[2]:4 13130.652173913044 +unsigned int render_dots::idx_y2#2 // idx_y2 zp[2]:4 200002.0 +unsigned int render_dots::idx_y2#9 // idx_y2 zp[2]:4 150001.5 +__loadstore volatile unsigned int sin_x1_idx // zp[2]:33 300.40000000000003 +__loadstore volatile unsigned int sin_x2_idx // zp[2]:35 250.33333333333337 +__loadstore volatile unsigned int sin_y1_idx // zp[2]:37 214.57142857142856 +__loadstore volatile unsigned int sin_y2_idx // zp[2]:39 187.75 + +reg byte x [ graphics_mode::y#2 graphics_mode::y#1 ] +zp[4]:24 [ graphics_mode::cols#3 graphics_mode::cols#2 graphics_mode::cols#1 ] +reg byte z [ graphics_mode::x#2 graphics_mode::x#1 ] +zp[2]:16 [ render_dots::i#10 render_dots::i#1 graphics_mode::i#2 graphics_mode::i#1 ] +zp[2]:10 [ render_dots::idx_x1#3 render_dots::idx_x1#11 render_dots::idx_x1#0 render_dots::idx_x1#2 render_dots::idx_x1#1 graphics_mode::ch_x#2 graphics_mode::ch_x#4 graphics_mode::ch_x#1 ] +zp[2]:12 [ render_dots::idx_x2#3 render_dots::idx_x2#13 render_dots::idx_x2#0 render_dots::idx_x2#1 render_dots::idx_x2#2 memset_dma::dest#3 memset_dma::dest#0 ] +zp[2]:4 [ render_dots::idx_y2#11 render_dots::idx_y2#9 render_dots::idx_y2#0 render_dots::idx_y2#1 render_dots::idx_y2#2 init_plot::i#2 init_plot::i#1 graphics_mode::ch#2 graphics_mode::ch#1 ] +zp[1]:42 [ buffer ] +zp[2]:22 [ graphics_render ] +zp[2]:33 [ sin_x1_idx ] +zp[2]:35 [ sin_x2_idx ] +zp[2]:37 [ sin_y1_idx ] +zp[2]:39 [ sin_y2_idx ] +zp[1]:45 [ memoryRemap::aVal ] +zp[1]:44 [ memoryRemap::xVal ] +zp[1]:43 [ memoryRemap::yVal ] +zp[1]:41 [ memoryRemap::zVal ] +zp[4]:29 [ lpoke::addr ] +zp[1]:28 [ lpoke::val ] +reg byte a [ graphics_mode::$8 ] +zp[2]:8 [ init_plot::$4 init_plot::$5 render_dots::idx_y1#11 render_dots::idx_y1#15 render_dots::idx_y1#0 render_dots::idx_y1#1 render_dots::idx_y1#2 ] +reg byte a [ init_plot::$1 ] +reg byte x [ memset_dma::dmaMode#0 ] +zp[2]:6 [ render_dots::$20 render_dots::$22 plot::x#0 init_plot::gfx#2 init_plot::gfx#5 init_plot::gfx#1 graphics_mode::screen#5 graphics_mode::screen#1 ] +zp[2]:14 [ render_dots::$21 render_dots::$23 ] +zp[2]:20 [ render_dots::$24 ] +zp[2]:18 [ render_dots::$25 ] +reg byte z [ plot::y#0 ] +zp[2]:2 [ plot::$3 plot::$4 plot::$0 ] +reg byte a [ plot::$2 ] +mem[12] [ memset_dma_command ]