Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
172 lines
5.5 KiB
C
172 lines
5.5 KiB
C
// ____________________________
|
|
// ██▀▀█▀▀██▀▀▀▀▀▀▀█▀▀█ │ ▄▄▄ ▄▄
|
|
// ██ ▀ █▄ ▀██▄ ▀ ▄█ ▄▀▀ █ │ ▀█▄ ▄▀██ ▄█▄█ ██▀▄ ██ ▄███
|
|
// █ █ █ ▀▀ ▄█ █ █ ▀▄█ █▄ │ ▄▄█▀ ▀▄██ ██ █ ██▀ ▀█▄ ▀█▄▄
|
|
// ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀────────┘ ▀▀
|
|
// Hello world sample
|
|
//─────────────────────────────────────────────────────────────────────────────
|
|
#include "msxgl.h"
|
|
#include "device/lightgun.h"
|
|
|
|
//=============================================================================
|
|
// DEFINES
|
|
//=============================================================================
|
|
|
|
// Library's logo
|
|
#define MSX_GL "\x02\x03\x04\x05"
|
|
|
|
#define COLUMN_PORT1 15
|
|
#define COLUMN_PORT2 28
|
|
|
|
//=============================================================================
|
|
// READ-ONLY DATA
|
|
//=============================================================================
|
|
|
|
// Font
|
|
#include "font/font_mgl_sample8.h"
|
|
|
|
// Animation characters
|
|
const u8 g_ChrAnim[] = { '|', '\\', '-', '/' };
|
|
|
|
// Sinus table (64 samples)
|
|
const unsigned char g_Sinus64[] = {
|
|
0x00, 0x02, 0x03, 0x05, 0x06, 0x08, 0x09, 0x0A,
|
|
0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x0F, 0x10, 0x10,
|
|
0x10, 0x10, 0x10, 0x0F, 0x0F, 0x0E, 0x0D, 0x0C,
|
|
0x0B, 0x0A, 0x09, 0x08, 0x06, 0x05, 0x03, 0x02,
|
|
0x00, 0xFE, 0xFD, 0xFB, 0xFA, 0xF8, 0xF7, 0xF6,
|
|
0xF5, 0xF4, 0xF3, 0xF2, 0xF1, 0xF1, 0xF0, 0xF0,
|
|
0xF0, 0xF0, 0xF0, 0xF1, 0xF1, 0xF2, 0xF3, 0xF4,
|
|
0xF5, 0xF6, 0xF7, 0xF8, 0xFA, 0xFB, 0xFD, 0xFE,
|
|
};
|
|
|
|
//=============================================================================
|
|
// MEMORY DATA
|
|
//=============================================================================
|
|
|
|
u8 g_SpritData[8 * 4];
|
|
|
|
u8 g_SpritePosX;
|
|
u8 g_SpritePosY;
|
|
u8 g_SpriteColor = COLOR_WHITE;
|
|
|
|
u16 g_FrameCount;
|
|
u16 g_MoveCount;
|
|
bool g_Move = FALSE;
|
|
|
|
//=============================================================================
|
|
// FUNCTIONS
|
|
//=============================================================================
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Update sprite position
|
|
void UpdatePosition()
|
|
{
|
|
g_SpritePosX = g_MoveCount++ / 2;
|
|
g_SpritePosY = 100 + 2 * g_Sinus64[(g_MoveCount / 2) & 0x3F];
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Update sprite attributes
|
|
void UpdateSprite()
|
|
{
|
|
VDP_SetSpriteSM1(0, g_SpritePosX, g_SpritePosY, 0, g_SpriteColor);
|
|
VDP_SetSpriteSM1(2, g_SpritePosX, g_SpritePosY + 16, 0, g_SpriteColor);
|
|
VDP_SetSpriteSM1(1, g_SpritePosX + 16, g_SpritePosY, 0, g_SpriteColor);
|
|
VDP_SetSpriteSM1(3, g_SpritePosX + 16, g_SpritePosY + 16, 0, g_SpriteColor);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Program entry point
|
|
void main()
|
|
{
|
|
// Initialize screen
|
|
VDP_SetMode(VDP_MODE_SCREEN1); // Initialize screen mode 1
|
|
VDP_ClearVRAM();
|
|
VDP_SetColor(COLOR_BLACK);
|
|
|
|
// Initialize font
|
|
Print_SetTextFont(g_Font_MGL_Sample8, 1);
|
|
Print_SetColor(COLOR_WHITE, COLOR_BLACK);
|
|
|
|
// Draw static text
|
|
Print_DrawText(MSX_GL " LIGHT GUN SAMPLE");
|
|
Print_DrawLineH(0, 1, 32);
|
|
|
|
Print_DrawTextAt(COLUMN_PORT1-3, 2, "Port 1");
|
|
Print_DrawTextAt(COLUMN_PORT1-4, 4, "--BA\x8A\x8B\x89\x88");
|
|
Print_DrawTextAt(COLUMN_PORT2-3, 2, "Port 2");
|
|
Print_DrawTextAt(COLUMN_PORT2-4, 4, "--BA\x8A\x8B\x89\x88");
|
|
|
|
Print_DrawTextAt(0, 7, "ASCII Terminator");
|
|
Print_DrawTextAt(1, 9, "Trigger");
|
|
Print_DrawTextAt(1, 10, "Light");
|
|
|
|
Print_DrawTextAt(0, 12, "Gun-Stick");
|
|
Print_DrawTextAt(1, 14, "Trigger");
|
|
Print_DrawTextAt(1, 15, "Light");
|
|
|
|
Print_DrawTextAt(0, 17, "Phenix Light Gun");
|
|
Print_DrawTextAt(1, 19, "Triggers");
|
|
Print_DrawTextAt(1, 20, "Light");
|
|
|
|
Print_DrawLineH(0, 22, 32);
|
|
Print_DrawTextAt(0, 23, "M:Move");
|
|
|
|
g_FrameCount = 0;
|
|
g_MoveCount = 160 * 2;
|
|
|
|
// Initialize sprite
|
|
VDP_SetSpriteFlag(VDP_SPRITE_SIZE_16);
|
|
loop (i, 4 * 8)
|
|
g_SpritData[i] = 0xFF;
|
|
VDP_LoadSpritePattern(g_SpritData, 0, 32);
|
|
UpdatePosition();
|
|
UpdateSprite();
|
|
|
|
u8 keyWait = 0;
|
|
|
|
// Main loop
|
|
while (!Keyboard_IsKeyPressed(KEY_ESC))
|
|
{
|
|
Print_SetPosition(31, 0);
|
|
Print_DrawChar(g_ChrAnim[g_FrameCount++ & 0x03]);
|
|
|
|
if (keyWait == 0 && Keyboard_IsKeyPressed(KEY_M))
|
|
{
|
|
g_Move = !g_Move;
|
|
keyWait = 20;
|
|
}
|
|
else if (keyWait > 0)
|
|
{
|
|
keyWait--;
|
|
}
|
|
|
|
|
|
if (g_Move)
|
|
{
|
|
UpdatePosition();
|
|
UpdateSprite();
|
|
}
|
|
|
|
loop (i, 2)
|
|
{
|
|
u8 x = (i == 0) ? COLUMN_PORT1 : COLUMN_PORT2;
|
|
|
|
u8 joy = LightGun_Read((i == 0) ? JOY_PORT_1 : JOY_PORT_2);
|
|
Print_DrawBin8At(x-4, 5, joy);
|
|
Print_DrawHex8At(x-7, 5, joy);
|
|
|
|
Print_DrawCharAt(x, 9, LightGun_ASCII_GetTrigger(joy) ? 0x0C : 0x0B);
|
|
Print_DrawCharAt(x, 10, LightGun_ASCII_GetLight(joy) ? 0x0C : 0x0B);
|
|
|
|
Print_DrawCharAt(x, 14, LightGun_GunStick_GetTrigger(joy) ? 0x0C : 0x0B);
|
|
Print_DrawCharAt(x, 15, LightGun_GunStick_GetLight(joy) ? 0x0C : 0x0B);
|
|
|
|
Print_DrawCharAt(x + 0, 19, LightGun_Phenix_GetTriggerA(joy) ? 0x0C : 0x0B);
|
|
Print_DrawCharAt(x + 1, 19, LightGun_Phenix_GetTriggerB(joy) ? 0x0C : 0x0B);
|
|
Print_DrawHex8At(x, 20, LightGun_Phenix_GetLight(joy));
|
|
}
|
|
}
|
|
}
|