mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-12-25 15:30:03 +00:00
154 lines
5.7 KiB
C
154 lines
5.7 KiB
C
//-----------------------------LICENSE NOTICE------------------------------------
|
|
// This file is part of CPCtelera: An Amstrad CPC Game Engine
|
|
// Copyright (C) 2015 ronaldo / Fremos / Cheesetea / ByteRealms (@FranGallegoBR)
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Lesser General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
//------------------------------------------------------------------------------
|
|
|
|
#include "cpctelera.h"
|
|
|
|
// Constant to set the number of VSYNCs to wait for as a delay between
|
|
// each pair of strings drawn. This will let as see how they are
|
|
// drawn, making it a little bit slower.
|
|
// - WFRAMES = 3 (Work at 12.5 FPS (50/3))
|
|
#define WFRAMES 3
|
|
|
|
//
|
|
// Wait n complete screen frames of (1/50)s
|
|
//
|
|
void wait_frames(u16 nframes) {
|
|
u16 i, j; // frame counter and active wait loop counter
|
|
|
|
// Loop for nframe times, waiting for VSYNC
|
|
for (i=0; i < nframes; i++) {
|
|
cpct_waitVSYNC();
|
|
|
|
// VSYNC is usually active for ~1500 cycles, then we have to do
|
|
// something that takes approximately this amount of time before
|
|
// waiting for the next VSYNC, or we will find the same VSYNC signal
|
|
// This active wait loop will do at least 750 comparisons, what
|
|
// is the same as 750*4 cycles (at least)
|
|
for (j=0; j < 750; j++);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Strings Example: Main program
|
|
//
|
|
void main(void) {
|
|
u8 *pvideomem; // Pointer to the video memory location where strings will be drawn
|
|
u8 times; // Counter of number of times to draw
|
|
u8 colours[5] = {0}; // 5 Colour values, 1 for mode 2, 2 for mode 1 and 2 more for mode 0
|
|
|
|
// First, disable firmware to prevent it from restoring video modes and
|
|
// interfering with drawString functions
|
|
cpct_disableFirmware();
|
|
|
|
// Loop forever showing characters on different modes and colours
|
|
//
|
|
while(1) {
|
|
|
|
//
|
|
// Show some strings in Mode 0, using different colours
|
|
//
|
|
|
|
// Clear Screen filling it up with 0's and set mode 0
|
|
cpct_disableFirmware();
|
|
cpct_disableUpperROM();
|
|
cpct_clearScreen(0);
|
|
cpct_setVideoMode(0);
|
|
|
|
// Let's start drawing strings at the start of video memory (0xC000)
|
|
pvideomem = CPCT_VMEM_START;
|
|
|
|
// Draw 25 strings, 1 for each character line on the screen
|
|
for (times=0; times < 25; times++) {
|
|
// Pick up the next foreground colour available for next string
|
|
// rotating colours when the 16 available have been used
|
|
// We use module 16 (AND 0x0F) for faster calculations
|
|
colours[0] = ++colours[0] & 15;
|
|
|
|
// Draw the string and wait for some VSYNCs
|
|
cpct_drawStringM0("$ Mode 0 string $", pvideomem, colours[0], colours[3]);
|
|
wait_frames(WFRAMES);
|
|
|
|
// Point to the start of the next character line on screen (80 bytes away)
|
|
pvideomem += 0x50;
|
|
}
|
|
// Rotate background colour for next time we draw Mode 0 strings
|
|
colours[3] = ++colours[3] & 15;
|
|
|
|
//
|
|
// Show some strings in Mode 1, using different colours
|
|
//
|
|
|
|
// Clear Screen filling it up with 0's and set mode 1
|
|
cpct_clearScreen(0);
|
|
cpct_setVideoMode(1);
|
|
|
|
// Let's start drawing strings at the start of video memory (0xC000)
|
|
pvideomem = CPCT_VMEM_START;
|
|
|
|
// Draw 25 strings, 1 for each character line on the screen
|
|
for (times=0; times < 25; times++) {
|
|
|
|
// Rotate foreground colour using module 4 (AND 0x03)
|
|
colours[1] = ++colours[1] & 3;
|
|
|
|
// Draw a string using normal drawString function for mode 1
|
|
cpct_drawStringM1("Mode 1 string :D", pvideomem, colours[1], colours[4]);
|
|
|
|
// Rotate foreground colour again
|
|
colours[1] = ++colours[1] & 3;
|
|
|
|
// Draw a string using fast drawString function for mode 1 (in a column 38 bytes to the right)
|
|
cpct_drawStringM1_f("Mode 1 string (Fast)", pvideomem + 38, colours[1], colours[4]);
|
|
|
|
// Rotate foreground colour another time and wait for a few VSYNCs
|
|
colours[1] = ++colours[1] & 3;
|
|
wait_frames(WFRAMES);
|
|
|
|
// Point to the start of the next character line on screen (80 bytes away)
|
|
pvideomem += 0x50;
|
|
}
|
|
colours[4] = ++colours[4] & 3;
|
|
|
|
//
|
|
// Show some strings in Mode 2, using different colours
|
|
//
|
|
|
|
// Clear Screen filling it up with 0's and set mode 2
|
|
cpct_clearScreen(0);
|
|
cpct_setVideoMode(2);
|
|
|
|
// Let's start drawing strings at the start of video memory (0xC000)
|
|
pvideomem = CPCT_VMEM_START;
|
|
|
|
// Draw 25 strings, 1 for each character line on the screen
|
|
for (times=0; times < 25; times++) {
|
|
// Alternate between foreground colour or inverse colour (the only 2
|
|
// available on mode 2) using an XOR 1 operation that alternates the
|
|
// value between 0 and 1
|
|
colours[2] ^= 1;
|
|
|
|
// Draw string on the screen using current colour and wait for a few VSYNCs
|
|
cpct_drawStringM2("And, finally, this is a long mode 2 string!!", pvideomem, colours[2]);
|
|
wait_frames(WFRAMES);
|
|
|
|
// Point to the start of the next character line on screen (80 bytes away)
|
|
pvideomem += 0x50;
|
|
}
|
|
}
|
|
}
|