#include #include #include #include // Set rom region end at 0x9f80 to leave some space for copy code #pragma region(rom, 0x8080, 0x9f80, , 0, { code, data } ) // We do not want to pollute main RAM region with our data #pragma region(main, 0xc000, 0xd000, , , { bss, stack, heap }) #pragma stacksize( 256 ) // Region and code for a cross bank copy routine #pragma section( ccode, 0 ) #pragma region( crom, 0x9f80, 0xa000, , 0, { ccode }, 0x0380 ) CharWin cw; // Copy code from any bank to RAM, returns to bank 0, this code is // copied from bank 0 to RAM at 0x0380 at program start #pragma code ( ccode ) __export void ccopy(char bank, char * dst, const char * src, unsigned n) { *((volatile char *)0xde00) = bank; while (n) { *dst++ = *src++; n--; } *((volatile char *)0xde00) = 0; } // Region of code to be executed from RAM after copied from 2nd ROM // bank #pragma section( bcode1, 0 ) #pragma section( bdata1, 0 ) #pragma region(bank1, 0x8000, 0xa000, , 1, { bcode1, bdata1 }, 0x2000 ) #pragma code ( bcode1 ) #pragma data ( bdata1 ) // Print into shared charwin void print1(void) { cwin_put_string(&cw, p"This is first bank", 1); cwin_cursor_newline(&cw); } // Back to main sections in bank 0 #pragma code ( code ) #pragma data ( data ) int main(void) { // Enable ROM mmap_set(MMAP_ROM); // Init CIAs (no kernal rom was executed so far) cia_init(); // Copy ccopy code to RAM for(char i=0; i<128; i++) ((char *)0x0380)[i] = ((char *)0x9f80)[i]; // Init VIC vic_setmode(VICM_TEXT, (char *)0x0400, (char *)0x1800); // Prepare output window cwin_init(&cw, (char *)0x0400, 0, 0, 40, 25); cwin_clear(&cw); // Write first line cwin_put_string(&cw, p"Hello World", 7); cwin_cursor_newline(&cw); // Copy bank 1 to RAM ccopy(1, (char *)0x2000, (char *)0x8000, 0x2000); // Call function in copy print1(); // Third line cwin_put_string(&cw, p"Final words", 14); cwin_cursor_newline(&cw); while (true) ; return 0; }