// // MAIN: Keyboard check example // void main(void) { // 32 bits counter, to let it count passed 65536 (up to 4 Billions) u32 i; // Disable firmware to prevent it from interfering with setVideoMode cpct_disableFirmware(); // Convert palettes from firmware colour values to // hardware colours (which are used by cpct_setPalette) cpct_fw2hw(G_banner_palette, 16); cpct_fw2hw(G_logo_palette, 4); // Set the border white, using colour 0 from G_banner_palette // after converting the colours to hardware values cpct_setBorder(G_banner_palette[0]); // Infinite main loop while (1) { // Draw CPCtelera's Logo and wait for a while drawLogo(); for(i=0; i < WAITLOOPS; ++i); // Draw CPCtelera's Banner and wait for a while drawBanner(); for(i=0; i < WAITLOOPS; ++i); } }
void initCPC() { cpct_disableFirmware(); cpct_fw2hw(g_palette,16); cpct_fw2hw(g_palette2,16); cpct_fw2hw(g_palette3,16); cpct_setPalette(g_palette,16); cpct_setBorder (g_palette[0]); cpct_setVideoMode(0); cpct_akp_musicInit(G_menu); // cpct_akp_SFXInit (G_menu); }
// // EXAMPLE: Measuring free cycles after moving an sprite // void main(void) { u8 i; // Loop index u8 x=0, y=0; // Sprite coordinates (in bytes) u8* pvideomem = (u8*)0xC000; // Sprite initial video memory byte location (where it will be drawn) u16 avc = 0; // Available cycles until next VSYNC, after all main loop calculations // First, disable firmware to prevent it from intercepting our palette and video mode settings (and, // at the same time, winning some speed not having to process firmware code at every interrupt) cpct_disableFirmware(); // Set palette and Screen Border (transform firmware to hardware colours and then set them) cpct_fw2hw (G_palette, 4); cpct_setPalette(G_palette, 4); cpct_setBorder (G_palette[1]); // Ensure MODE 1 is set cpct_setVideoMode(1); // Main Loop while(1) { // First, wait VSYNC monitor signal to synchronize the loop with it. We'll start doing // calculations always at the same time (when VSYNC is first detected) cpct_waitVSYNC(); // Scan Keyboard and change sprite location if cursor keys are pressed cpct_scanKeyboard_f(); if (cpct_isKeyPressed(Key_CursorRight) && x < 80 - SPR_W) { x++; pvideomem++; } else if (cpct_isKeyPressed(Key_CursorLeft) && x > 0 ) { x--; pvideomem--; } if (cpct_isKeyPressed(Key_CursorUp) && y > 0 ) { pvideomem -= (y-- & 7) ? 0x0800 : 0xC850; } else if (cpct_isKeyPressed(Key_CursorDown) && y < 200 - SPR_H) { pvideomem += (++y & 7) ? 0x0800 : 0xC850; } // Draw the sprite at its new location on screen. // Sprite automatically erases previous copy of itself on the screen because it moves // 1 byte at a time and has a 0x00 border that overwrites previous colours on that place cpct_drawSprite(G_death, pvideomem, SPR_W, SPR_H); // Wait to next VSYNC signal, calculating the amount of free cycles (time we wait for VSYNC) // As documented on <cpct_count2VSYNC>, function returns number of loop iterations (L), and // cycles shall be calculated doing 22 + 34*L avc = 22 + 34 * cpct_count2VSYNC(); // Print 5 digits on the upper right corner of the screen, // with the amount of free cycles calculated in previous step. // Digits will be printed at screen locations (0xC046, 0xC048, 0xC04A, 0xC04C, 0xC04E) for(i=0; i<5; i++) { u8 digit = '0' + (avc % 10); cpct_drawCharM1_f((void*)(0xC04E - 2*i), 3, 0, digit); avc /= 10; } } }
// Initialization of the Amstrad CPC at the start of the application void initializeCPC() { // Disable firmware: we dont want it to interfere with our code cpct_disableFirmware(); // Set the function interruptHandler to be called on each interrupt. cpct_setInterruptHandler(interruptHandler); // Set the hardware palette (convert firmware colour values to hardware ones and set the palette) cpct_fw2hw(G_palette, 16); cpct_setPalette(G_palette, 16); // Descomentar estas tres lineas cuando tengamos paleta cpct_setBorder(G_palette[0]); // Change to Mode 0 (160x200, 16 colours) cpct_setVideoMode(0); }
// // MAIN: Using keyboard to move a sprite example // void main(void) { u8 x=10, y=10; // Sprite coordinates u8* pvideomem; // Pointer to video memory // // Set up the screen // // Disable firmware to prevent it from interfering with setPalette and setVideoMode cpct_disableFirmware(); // Set the colour palette cpct_fw2hw (G_palette, 4); // Convert our palette from firmware to hardware colours cpct_setPalette(G_palette, 4); // Set up the hardware palette using hardware colours // Set video mode 1 (320x200, 4 colours) cpct_setVideoMode(1); // // Infinite moving loop // while(1) { // Scan Keyboard (fastest routine) // The Keyboard has to be scanned to obtain pressed / not pressed status of // every key before checking each individual key's status. cpct_scanKeyboard_f(); // Check if user has pressed a Cursor Key and, if so, move the sprite if // it will still be inside screen boundaries if (cpct_isKeyPressed(Key_CursorRight) && x < (SCR_W - SP_W) ) ++x; else if (cpct_isKeyPressed(Key_CursorLeft) && x > 0 ) --x; if (cpct_isKeyPressed(Key_CursorUp) && y > 0 ) --y; else if (cpct_isKeyPressed(Key_CursorDown) && y < (SCR_H - SP_H) ) ++y; // Get video memory byte for coordinates x, y of the sprite (in bytes) pvideomem = cpct_getScreenPtr(CPCT_VMEM_START, x, y); // Draw the sprite in the video memory location got from coordinates x, y cpct_drawSprite(G_spriteLogoCT, pvideomem, SP_W, SP_H); } }