// ____________________________ // ██▀▀█▀▀██▀▀▀▀▀▀▀█▀▀█ │ ▄▄▄ ▄▄ // ██ ▀ █▄ ▀██▄ ▀ ▄█ ▄▀▀ █ │ ▀█▄ ▄▀██ ▄█▄█ ██▀▄ ██ ▄███ // █ █ █ ▀▀ ▄█ █ █ ▀▄█ █▄ │ ▄▄█▀ ▀▄██ ██ █ ██▀ ▀█▄ ▀█▄▄ // ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀────────┘ ▀▀ // BIOS sample //───────────────────────────────────────────────────────────────────────────── #include "msxgl.h" //============================================================================= // READ-ONLY DATA //============================================================================= const i8 g_Jump[] = { -4, -3, -2, -1, 0, 1, 2, 3, 4 }; //============================================================================= // FUNCTIONS //============================================================================= //----------------------------------------------------------------------------- // Print a text at the current position void BIOS_PrintText(const c8* str) { while (*str) BIOS_TextPrintChar(*str++); } //----------------------------------------------------------------------------- // Print a text at the specified position void BIOS_PrintTextAt(u8 x, u8 y, const c8* str) { BIOS_TextSetCursor(x + 1, y + 1); while (*str) BIOS_TextPrintChar(*str++); } //----------------------------------------------------------------------------- // Change the screen width void BIOS_ChangeWidth(u8 width) { switch (g_SCRMOD) { case 0: g_LINL40 = width; BIOS_SetScreenMode(g_SCRMOD); break; case 1: g_LINL32 = width; BIOS_SetScreenMode(g_SCRMOD); break; }; } //----------------------------------------------------------------------------- // Clamp a value between a min and a max i8 Clamp(i8 val, i8 min, i8 max) { if (val < min) return min; if (val > max) return max; return val; } //----------------------------------------------------------------------------- // Change the text and background color void BIOS_ChangeColor2(u8 text, u8 back, u8 border, u8 mode) __NAKED // Stack: 4 bytes { text; // A back; // L border; // (SP+4) mode; // (SP+5) __asm ld iy, #4 add iy, sp ld (M_FORCLR), a ld a, l ld (M_BAKCLR), a ld a, 0(iy) ld (M_BDRCLR), a ld a, 1(iy) call R_CHGCLR pop hl pop af jp (hl) __endasm; } //============================================================================= // MAIN LOOP //============================================================================= //----------------------------------------------------------------------------- // Program entry point void main() { // Initialize screen mode 1 (text) BIOS_SetScreenMode(1); BIOS_ChangeWidth(32); BIOS_ChangeColor2(COLOR_LIGHT_GREEN, COLOR_BLACK, COLOR_GRAY, 0); BIOS_SetKeyClick(FALSE); // Display static information on screen BIOS_PrintTextAt(0, 0, "MSXgl - BIOS SAMPLE"); BIOS_PrintTextAt(0, 1, "--------------------------------"); BIOS_PrintTextAt(0, 21, "--------------------------------"); BIOS_PrintTextAt(0, 23, "<||> Move [space] Jump"); bool bContinue = TRUE; bool bJump = FALSE; u8 jumpFrame = 0; u8 line = 0xFF; i8 x = 0, y = 20, prevX, prevY; while (bContinue) { prevX = x; prevY = y; // Read keyboard if (BIOS_IsKeyPressed(KEY_DEL)) bContinue = FALSE; if (BIOS_IsKeyPressed(KEY_RIGHT)) x++; else if (BIOS_IsKeyPressed(KEY_LEFT)) x--; if (bJump) { y += g_Jump[jumpFrame++ / 2]; if (jumpFrame >= numberof(g_Jump) * 2) bJump = FALSE; } else if (BIOS_IsKeyPressed(KEY_SPACE)) { BIOS_Beep(); bJump = TRUE; jumpFrame = 0; } x = Clamp(x, 0, 39); y = Clamp(y, 5, 20); BIOS_PrintTextAt(prevX, prevY, " "); BIOS_PrintTextAt(x, y, "#"); u8 x2 = 1; u8 chr = BIOS_HasCharacter(); while (chr) { BIOS_TextSetCursor(x2++, 3); BIOS_TextPrintChar(chr); chr = BIOS_HasCharacter(); } Halt(); } BIOS_Exit(0); }