Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
736 lines
28 KiB
C
736 lines
28 KiB
C
// ____________________________
|
|
// ██▀▀█▀▀██▀▀▀▀▀▀▀█▀▀█ │ ▄▄▄ ▄▄▄▄ ▄▄ ▄▄▄
|
|
// ██ ▀ █▄ ▀██▄ ▀ ▄█ ▄▀▀ █ │ ██▄▀ ██ ██ █ ▀█▄
|
|
// █ █ █ ▀▀ ▄█ █ █ ▀▄█ █▄ │ ██▄▀ ▄██▄ ▀█▄▀ ▄▄█▀
|
|
// ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀────────┘
|
|
// by Guillaume 'Aoineko' Blanchard under CC BY-SA license
|
|
//─────────────────────────────────────────────────────────────────────────────
|
|
// BIOS routines handler
|
|
//
|
|
// References:
|
|
// - MSX2 Technical Handbook
|
|
// - http://map.grauw.nl/resources/msxbios.php
|
|
// - https://www.msx.org/wiki/Main-ROM_BIOS
|
|
// - Pratique du MSX2
|
|
//─────────────────────────────────────────────────────────────────────────────
|
|
#pragma once
|
|
|
|
//=============================================================================
|
|
// INCLUDES
|
|
//=============================================================================
|
|
|
|
#include "core.h"
|
|
#include "system.h"
|
|
#include "vdp_reg.h"
|
|
|
|
// R_xxxx Data/routines in Main-ROM
|
|
// S_xxxx Data/routines in Sub-ROM
|
|
// M_xxxx Data/routines in Memory
|
|
// H_xxxx Hooks
|
|
// P_xxxx Ports
|
|
// I_xxxx Interrupts
|
|
#include "bios_var.h"
|
|
#include "bios_hook.h"
|
|
#include "bios_mainrom.h"
|
|
#include "bios_subrom.h"
|
|
#include "bios_diskrom.h"
|
|
|
|
//=============================================================================
|
|
// DEFINES
|
|
//=============================================================================
|
|
|
|
// Input Macros
|
|
#define KEYBOARD_HOLD(key) ((g_NEWKEY[KEY_ROW(key)] & KEY_FLAG(key)) == 0)
|
|
#define KEYBOARD_PRESS(key) (((g_NEWKEY[KEY_ROW(key)] & KEY_FLAG(key)) == 0) && ((g_OLDKEY[KEY_ROW(key)] & KEY_FLAG(key)) != 0))
|
|
#define KEYBOARD_RELEASE(key) (((g_NEWKEY[KEY_ROW(key)] & KEY_FLAG(key)) != 0) && ((g_OLDKEY[KEY_ROW(key)] & KEY_FLAG(key)) == 0))
|
|
|
|
//#############################################################################
|
|
// █ █ █▀▀ █ █▀█ █▀▀ █▀█
|
|
// █▀█ ██▄ █▄▄ █▀▀ ██▄ █▀▄
|
|
//#############################################################################
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Group: Helper
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Function: BIOS_Exit
|
|
// Handle clean exit form Basic or MSX-DOS environment
|
|
//
|
|
// Parameters:
|
|
// ret - Return value (for MSX-DOS environment)
|
|
void BIOS_Exit(u8 ret);
|
|
|
|
// Function: BIOS_SetKeyClick
|
|
// Enable or disable key click
|
|
//
|
|
// Parameters:
|
|
// enable - TRUE to enable and FALSE to disable
|
|
inline void BIOS_SetKeyClick(bool enable) { g_CLIKSW = enable; }
|
|
|
|
// Function: BIOS_GetMSXVersion
|
|
// Get MSX generation version
|
|
//
|
|
// Return:
|
|
// - MSXVER_1 (0) for MSX1.
|
|
// - MSXVER_2 (1) for MSX2.
|
|
// - MSXVER_2P (2) for MSX2+.
|
|
// - MSXVER_TR (3) for MSX turbo R.
|
|
inline u8 BIOS_GetMSXVersion() { return g_MSXVER; }
|
|
|
|
//#############################################################################
|
|
// █▀▄▀█ ▄▀█ █ █▄ █ ▄▄ █▀█ █▀█ █▀▄▀█
|
|
// █ ▀ █ █▀█ █ █ ▀█ █▀▄ █▄█ █ ▀ █
|
|
//#############################################################################
|
|
|
|
//=============================================================================
|
|
// RST-and other routines
|
|
//=============================================================================
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Group: Main-ROM - Core
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Function: BIOS_Reboot
|
|
// Tests RAM and sets RAM slot for the system.
|
|
// Wrapper for CHKRAM routine.
|
|
inline void BIOS_Reboot() { Call(R_CHKRAM); }
|
|
|
|
// Function: BIOS_InterSlotRead
|
|
// Reads the value of an address in another slot.
|
|
// Wrapper for RDSLT routine.
|
|
u8 BIOS_InterSlotRead(u8 slot, u16 addr);
|
|
|
|
// Function: BIOS_InterSlotWrite
|
|
// Writes a value to an address in another slot.
|
|
// Wrapper for WRSLT routine.
|
|
void BIOS_InterSlotWrite(u8 slot, u16 addr, u8 value);
|
|
|
|
// Function: BIOS_InterSlotCall
|
|
// Executes inter-slot call.
|
|
// Wrapper for CALSLT routine.
|
|
void BIOS_InterSlotCall(u8 slot, u16 addr);
|
|
|
|
// Function: BIOS_SwitchSlot
|
|
// Switches to specified slot and page definitively.
|
|
// Wrapper for ENASLT routine.
|
|
void BIOS_SwitchSlot(u8 page, u8 slot);
|
|
|
|
// Macro: BIOS_CALLF
|
|
// Executes an interslot call.
|
|
// Wrapper for CALLF routine.
|
|
#define BIOS_CALLF(slot, addr) \
|
|
__asm \
|
|
rst R_CALLF \
|
|
db slot \
|
|
dw addr \
|
|
__endasm
|
|
|
|
//=============================================================================
|
|
// Initialization-routines
|
|
//=============================================================================
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Group: Main-ROM - Init
|
|
//-----------------------------------------------------------------------------
|
|
|
|
//=============================================================================
|
|
// VDP routines
|
|
//=============================================================================
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Group: Main-ROM - VDP
|
|
//-----------------------------------------------------------------------------
|
|
#if (BIOS_USE_VDP)
|
|
|
|
// Function: BIOS_DisableScreen
|
|
// Inhibits the screen display. Wrapper for DISSCR routine.
|
|
inline void BIOS_DisableScreen() { Call(R_DISSCR); }
|
|
|
|
// Function: BIOS_EnableScreen
|
|
// Displays the screen. Wrapper for ENASCR routine.
|
|
inline void BIOS_EnableScreen() { Call(R_ENASCR); }
|
|
|
|
// Function: BIOS_EnableScreen
|
|
// Display or disable the screen.
|
|
inline void BIOS_DisplayScreen(bool enable) { if (enable) BIOS_EnableScreen(); else BIOS_DisableScreen(); }
|
|
|
|
// Function: BIOS_WriteVDP
|
|
// Writes data in the VDP-register. Wrapper for WRTVDP routine.
|
|
void BIOS_WriteVDP(u8 reg, u8 value);
|
|
|
|
// Function: BIOS_ReadVDP
|
|
// Reads data from the VDP-register.
|
|
inline u8 BIOS_ReadVDP(u8 reg)
|
|
{
|
|
switch (reg)
|
|
{
|
|
case 0: return g_RG0SAV;
|
|
case 1: return g_RG1SAV;
|
|
case 2: return g_RG2SAV;
|
|
case 3: return g_RG3SAV;
|
|
case 4: return g_RG4SAV;
|
|
case 5: return g_RG5SAV;
|
|
case 6: return g_RG6SAV;
|
|
case 7: return g_RG7SAV;
|
|
}
|
|
}
|
|
|
|
// Function: BIOS_ReadVRAM
|
|
// Reads the content of VRAM. Wrapper for RDVRM routine.
|
|
inline u8 BIOS_ReadVRAM(u16 addr) { return CallHL(R_RDVRM, addr); }
|
|
|
|
// Function: BIOS_WriteVRAM
|
|
// Writes data in VRAM. Wrapper for WRTVRM routine.
|
|
void BIOS_WriteVRAM(u8 value, u16 addr);
|
|
|
|
// Function: BIOS_SetAddressForRead
|
|
// Enables VDP to read. Wrapper for SETRD routine.
|
|
inline void BIOS_SetAddressForRead(u16 addr) { CallHL(R_SETRD, addr); }
|
|
|
|
// Function: BIOS_SetAddressForWrite
|
|
// Enables VDP to write. Wrapper for SETWRT routine.
|
|
inline void BIOS_SetAddressForWrite(u16 addr) { CallHL(R_SETWRT, addr); }
|
|
|
|
// Function: BIOS_FillVRAM
|
|
// Fills VRAM with value. Wrapper for FILVRM routine.
|
|
void BIOS_FillVRAM(u16 addr, u16 length, u8 value);
|
|
|
|
// Function: BIOS_CopyVRAMtoRAM
|
|
// Block transfer to memory from VRAM. Wrapper for LDIRMV routine.
|
|
void BIOS_CopyVRAMtoRAM(u16 vram, void* ram, u16 length);
|
|
|
|
// Function: BIOS_CopyRAMtoVRAM
|
|
// Block transfer to VRAM from memory. Wrapper for LDIRVM routine.
|
|
void BIOS_CopyRAMtoVRAM(const void* ram, u16 vram, u16 length);
|
|
|
|
// Function: BIOS_SetScreenMode
|
|
// Switches to given screen mode. Wrapper for CHGMOD routine.
|
|
inline void BIOS_SetScreenMode(u8 screen) { CallA(R_CHGMOD, screen); }
|
|
|
|
// Function: BIOS_SetColor
|
|
// Set screen colors.
|
|
inline void BIOS_SetColor(u8 text, u8 back, u8 border) { g_FORCLR = text; g_BAKCLR = back; g_BDRCLR = border; }
|
|
|
|
// Function: BIOS_ApplyColor
|
|
// Changes the screen colors. Wrapper for CHGCLR routine.
|
|
inline void BIOS_ApplyColor(u8 text, u8 back, u8 border) { BIOS_SetColor(text, back, border); Call(R_CHGCLR); }
|
|
|
|
// Function: BIOS_ApplyBorder
|
|
// Changes the screen colors. Wrapper for CHGCLR routine.
|
|
inline void BIOS_ApplyBorder(u8 border) { g_BDRCLR = border; Call(R_CHGCLR); }
|
|
|
|
//.............................................................................
|
|
// Screen 0
|
|
|
|
// Function: BIOS_SetWidth40
|
|
//
|
|
inline void BIOS_SetWidth40(u8 width) { g_LINL40 = width;}
|
|
|
|
// Function: BIOS_InitScreen0
|
|
// Switches to SCREEN 0 (text screen with 40*24 characters). Wrapper for INITXT routine.
|
|
inline void BIOS_InitScreen0() { Call(R_INITXT); }
|
|
|
|
// Function: BIOS_InitScreen0Color
|
|
// Switches to SCREEN 0 (text screen with 40*24 characters). Wrapper for INITXT routine.
|
|
inline void BIOS_InitScreen0Color(u8 width, u8 text, u8 back, u8 border) { g_LINL40 = width; BIOS_SetColor(text, back, border); BIOS_InitScreen0(); }
|
|
|
|
// Function: BIOS_InitScreen0Ex
|
|
// Switches to SCREEN 0 (text screen with 40*24 characters). Wrapper for INITXT routine.
|
|
inline void BIOS_InitScreen0Ex(u16 pnt, u16 pgt, u8 width, u8 text, u8 back, u8 border) { g_TXTNAM = pnt; g_TXTCGP = pgt; g_LINL40 = width; BIOS_SetColor(text, back, border); BIOS_InitScreen0(); }
|
|
|
|
// Function: BIOS_SetScreen0
|
|
// Switches VDP in SCREEN 0 mode. Wrapper for SETTXT routine.
|
|
inline void BIOS_SetScreen0() { Call(R_SETTXT); }
|
|
|
|
#define BIOS_InitTextMode BIOS_InitScreen0
|
|
#define BIOS_InitTextModeColor BIOS_InitScreen0Color
|
|
#define BIOS_InitTextModeEx BIOS_InitScreen0Ex
|
|
#define BIOS_SetTextMode BIOS_SetScreen0
|
|
|
|
//.............................................................................
|
|
// Screen 1
|
|
|
|
// Function: BIOS_SetWidth32
|
|
//
|
|
inline void BIOS_SetWidth32(u8 width) { g_LINL32 = width;}
|
|
|
|
// Function: BIOS_InitScreen1
|
|
// Switches to SCREEN 1 (text screen with 32*24 characters). Wrapper for INIT32 routine.
|
|
inline void BIOS_InitScreen1() { Call(R_INIT32); }
|
|
|
|
// Function: BIOS_InitScreen1Color
|
|
// Switches to SCREEN 1 (text screen with 32*24 characters). Wrapper for INIT32 routine.
|
|
inline void BIOS_InitScreen1Color(u8 width, u8 text, u8 back, u8 border) { g_LINL32 = width; BIOS_SetColor(text, back, border); BIOS_InitScreen1(); }
|
|
|
|
// Function: BIOS_InitScreen1Ex
|
|
// Switches to SCREEN 1 (text screen with 32*24 characters). Wrapper for INIT32 routine.
|
|
inline void BIOS_InitScreen1Ex(u16 pnt, u16 ct, u16 pgt, u16 sat, u16 sgt, u8 width, u8 text, u8 back, u8 border) { g_T32NAM = pnt; g_T32COL = ct; g_T32CGP = pgt; g_T32ATR = sat; g_T32PAT = sgt; g_LINL32 = width; BIOS_SetColor(text, back, border); BIOS_InitScreen1(); }
|
|
|
|
// Function: BIOS_SetScreen1
|
|
// Switches VDP in SCREEN 1 mode. Wrapper for SETT32 routine.
|
|
inline void BIOS_SetScreen1() { Call(R_SETT32); }
|
|
|
|
#define BIOS_InitText32Mode BIOS_InitScreen1
|
|
#define BIOS_InitText32ModeColor BIOS_InitScreen1Color
|
|
#define BIOS_InitText32ModeEx BIOS_InitScreen1Ex
|
|
#define BIOS_SetText32Mode BIOS_SetScreen1
|
|
|
|
//.............................................................................
|
|
// Screen 2
|
|
|
|
// Function: BIOS_InitScreen2
|
|
// Switches to SCREEN 2 (high resolution screen with 256*192 pixels). Wrapper for INIGRP routine.
|
|
inline void BIOS_InitScreen2() { Call(R_INIGRP); }
|
|
|
|
// Function: BIOS_InitScreen2Color
|
|
// Switches to SCREEN 2 (high resolution screen with 256*192 pixels). Wrapper for INIGRP routine.
|
|
inline void BIOS_InitScreen2Color(u8 width, u8 text, u8 back, u8 border) { g_LINL32 = width; BIOS_SetColor(text, back, border); BIOS_InitScreen2(); }
|
|
|
|
// Function: BIOS_InitScreen2Ex
|
|
// Switches to SCREEN 2 (high resolution screen with 256*192 pixels). Wrapper for INIGRP routine.
|
|
inline void BIOS_InitScreen2Ex(u16 pnt, u16 ct, u16 pgt, u16 sat, u16 sgt, u8 width, u8 text, u8 back, u8 border) { g_GRPNAM = pnt; g_GRPCOL = ct; g_GRPCGP = pgt; g_GRPATR = sat; g_GRPPAT = sgt; g_LINL32 = width; BIOS_SetColor(text, back, border); BIOS_InitScreen2(); }
|
|
|
|
// Function: BIOS_SetScreen2
|
|
// Switches VDP to SCREEN 2 mode. Wrapper for SETGRP routine.
|
|
inline void BIOS_SetScreen2() { Call(R_SETGRP); }
|
|
|
|
#define BIOS_InitGraphicMode BIOS_InitScreen2
|
|
#define BIOS_InitGraphicModeColor BIOS_InitScreen2Color
|
|
#define BIOS_InitGraphicModeEx BIOS_InitScreen2Ex
|
|
#define BIOS_SetGraphicMode BIOS_SetScreen2
|
|
|
|
//.............................................................................
|
|
// Screen 3
|
|
|
|
// Function: BIOS_InitScreen3
|
|
// Switches to SCREEN 3 (multi-color screen 64*48 pixels). Wrapper for INIMLT routine.
|
|
inline void BIOS_InitScreen3() { Call(R_INIMLT); }
|
|
|
|
// Function: BIOS_InitScreen3Ex
|
|
// Switches to SCREEN 3 (multi-color screen 64*48 pixels). Wrapper for INIMLT routine.
|
|
void BIOS_InitScreen3Ex(u16 pnt, u16 ct, u16 pgt, u16 sat, u16 sgt, u8 text, u8 bg, u8 border);
|
|
|
|
// Function: BIOS_SetScreen3
|
|
// Switches VDP to SCREEN 3 mode. Wrapper for SETMLT routine.
|
|
inline void BIOS_SetScreen3() { Call(R_SETMLT); }
|
|
|
|
#define BIOS_InitMulticolorMode BIOS_InitScreen3
|
|
#define BIOS_InitMulticolorModeEx BIOS_InitScreen3Ex
|
|
#define BIOS_SetMulticolorMode BIOS_SetScreen3
|
|
|
|
//.............................................................................
|
|
// Sprites routines
|
|
|
|
// Function: BIOS_ClearSprites
|
|
// Initialises all sprites.
|
|
inline void BIOS_ClearSprites() { Call(R_CLRSPR); }
|
|
|
|
#define BIOS_SPRITE_MAG_1 (0)
|
|
#define BIOS_SPRITE_MAG_2 (0b00000001)
|
|
#define BIOS_SPRITE_SIZE_8 (0)
|
|
#define BIOS_SPRITE_SIZE_16 (0b00000010)
|
|
|
|
// Function: BIOS_SetSpriteMode
|
|
// Set sprite size (8x8 or 16x16) and magnification mode (x1 or x2).
|
|
//
|
|
// Parameters:
|
|
// size - Sprite size (BIOS_SPRITE_SIZE_8 or BIOS_SPRITE_SIZE_16)
|
|
// mag - Sprite magnification (BIOS_SPRITE_MAG_1 or BIOS_SPRITE_MAG_2)
|
|
inline void BIOS_SetSpriteMode(u8 size, u8 mag) { BIOS_WriteVDP(1, (BIOS_ReadVDP(1) & 0xFC) | size | mag); }
|
|
|
|
// Function: BIOS_GetSpritePatternAddress
|
|
// Returns the address of the sprite pattern table. Wrapper for CALPAT routine.
|
|
//
|
|
// Parameters:
|
|
// id - Sprite pattern number [0:255] of 8x8 size and [0:63] of 16x16 size)
|
|
//
|
|
// Return:
|
|
// VRAM address of the sprite pattern table for the given sprite number
|
|
u16 BIOS_GetSpritePatternAddress(u8 id);
|
|
|
|
// Function: BIOS_GetSpriteAttributeAddress
|
|
// Returns the address of the sprite attribute table. Wrapper for CALATR routine.
|
|
//
|
|
// Parameters:
|
|
// id - Sprite attribute number [0:31]
|
|
//
|
|
// Return:
|
|
// VRAM address of the sprite attribute table for the given sprite number
|
|
u16 BIOS_GetSpriteAttributeAddress(u8 id);
|
|
|
|
// Function: BIOS_SetSpritePosition
|
|
// Set the position of a sprite on the screen.
|
|
//
|
|
// Parameters:
|
|
// id - Sprite attribute number [0:31]
|
|
// x - Horizontal position of the sprite [0:255]
|
|
// y - Vertical position of the sprite [0:255]
|
|
inline void BIOS_SetSpritePosition(u8 id, u8 x, u8 y) { u16 vram = BIOS_GetSpriteAttributeAddress(id); BIOS_WriteVRAM(x, vram + 1); BIOS_WriteVRAM(y, vram); }
|
|
|
|
// Function: BIOS_SetSpritePattern
|
|
// Set the pattern of a sprite.
|
|
//
|
|
// Parameters:
|
|
// id - Sprite attribute number [0:31]
|
|
// pat - Sprite pattern number [0:255]
|
|
inline void BIOS_SetSpritePattern(u8 id, u8 pat) { BIOS_WriteVRAM(pat, BIOS_GetSpriteAttributeAddress(id) + 2); }
|
|
|
|
// Function: BIOS_SetSpriteColor
|
|
// Set the color of a sprite.
|
|
//
|
|
// Parameters:
|
|
// id - Sprite attribute number [0:31]
|
|
// color - Sprite color [0:15]
|
|
inline void BIOS_SetSpriteColor(u8 id, u8 color) { BIOS_WriteVRAM(color, BIOS_GetSpriteAttributeAddress(id) + 3); }
|
|
|
|
// Function: BIOS_SetSprite
|
|
// Set sprite attributes.
|
|
//
|
|
// Parameters:
|
|
// id - Sprite attribute number [0:31]
|
|
// x - Horizontal position of the sprite [0:255]
|
|
// y - Vertical position of the sprite [0:255]
|
|
// pat - Sprite pattern number [0:255]
|
|
// color - Sprite color [0:15]
|
|
inline void BIOS_SetSprite(u8 id, u8 x, u8 y, u8 pat, u8 color) { u16 vram = BIOS_GetSpriteAttributeAddress(id); BIOS_WriteVRAM(y, vram); BIOS_WriteVRAM(x, vram + 1); BIOS_WriteVRAM(pat, vram + 2); BIOS_WriteVRAM(color, vram + 3); }
|
|
|
|
typedef struct BIOS_SpriteAttributes
|
|
{
|
|
u8 y;
|
|
u8 x;
|
|
u8 pattern;
|
|
u8 color;
|
|
} BIOS_SpriteAttributes;
|
|
|
|
// Function: BIOS_SetSpriteData
|
|
// Set a sprite attributes.
|
|
//
|
|
// Parameters:
|
|
// id - Sprite attribute number [0:31]
|
|
// attrs - Pointer to a 4-bytes array containing the sprite attributes (y, x, pattern and color)
|
|
inline void BIOS_SetSpriteData(u8 id, const BIOS_SpriteAttributes* attrs) { BIOS_CopyRAMtoVRAM(attrs, BIOS_GetSpriteAttributeAddress(id), 4); }
|
|
|
|
// Function: BIOS_GetSpriteSize
|
|
// Returns current sprite size in bytes (8 or 32). Wrapper for GSPSIZ routine.
|
|
inline u8 BIOS_GetSpriteSize() { return ((u8(*)(void))R_GSPSIZ)(); }
|
|
|
|
// Function: BIOS_IsSpriteCollision
|
|
// Returns FALSE if no collision occured during the previous frame, otherwise returns S00_C.
|
|
// This function use value of VDP status register S#0 that BIOS backup in RAM (STATFL).
|
|
inline bool BIOS_IsSpriteCollision() { return g_STATFL & S00_C; }
|
|
|
|
// Function: BIOS_IsSpriteOverScan
|
|
// Returns FALSE if no over-scan occured during the previous frame (more than 4/8 sprites on the same line), otherwise returns S00_5S.
|
|
// This function use value of VDP status register S#0 that BIOS backup in RAM (STATFL).
|
|
inline bool BIOS_IsSpriteOverScan() { return g_STATFL & S00_5S; }
|
|
|
|
// Function: BIOS_GetSpriteOverScanId
|
|
// Returns index of the over-scaned sprite (5th/8th sprite on line). Value is in 0-31 range.
|
|
// This function use value of VDP status register S#0 that BIOS backup in RAM (STATFL).
|
|
inline u8 BIOS_GetSpriteOverScanId() { return S00_GET_SN(g_STATFL); }
|
|
|
|
//.............................................................................
|
|
// Graph print routines
|
|
|
|
// Function: BIOS_GraphSetCursor
|
|
// Moves graphical cursor to the specified position.
|
|
inline void BIOS_GraphSetCursor(u16 x, u16 y) { g_GRPACX = x; g_GRPACY = y; }
|
|
|
|
// Function: BIOS_GraphPrintChar
|
|
// Displays a character on the graphic screen. Wrapper for GRPPRT routine.
|
|
inline void BIOS_GraphPrintChar(u8 chr) { CallA(R_GRPPRT, chr); }
|
|
|
|
// Function: BIOS_GraphPrint
|
|
// Displays a string on the graphic screen. Wrapper for GRPPRT routine.
|
|
inline void BIOS_GraphPrint(const c8* str) { while (*str) BIOS_GraphPrintChar(*str++); }
|
|
|
|
// Function: BIOS_GraphPrintAt
|
|
// Displays a string on the graphic screen. Wrapper for GRPPRT routine.
|
|
inline void BIOS_GraphPrintAt(u16 x, u16 y, const c8* str) { BIOS_GraphSetCursor(x, y); BIOS_GraphPrint(str); }
|
|
|
|
#if (MSX_VERSION >= MSX_2)
|
|
|
|
// Function: BIOS_GraphSetOperator
|
|
// Changes the operator used for graphical print.
|
|
inline void BIOS_GraphSetOperator(u8 op) { g_LOGOPR = op; }
|
|
|
|
#endif // (MSX_VERSION >= MSX_2)
|
|
|
|
|
|
#endif // BIOS_USE_VDP
|
|
|
|
//=============================================================================
|
|
// PSG routines
|
|
//=============================================================================
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Group: Main-ROM - PSG
|
|
//-----------------------------------------------------------------------------
|
|
#if (BIOS_USE_PSG)
|
|
|
|
// Function: BIOS_InitPSG
|
|
// Initialises PSG and sets initial value for the PLAY statement. Wrapper for GICINI routine.
|
|
//> GICINI
|
|
//> Address : #0090
|
|
//> Function : Initialises PSG and sets initial value for the PLAY statement
|
|
//> Registers: All
|
|
//> Remarks : Interrupts must be disabled to call this routine
|
|
inline void BIOS_InitPSG() { DisableInterrupt(); Call(R_GICINI); EnableInterrupt(); }
|
|
|
|
// Function: BIOS_WritePSG
|
|
// Writes data to PSG-register. Wrapper for WRTPSG routine.
|
|
//> WRTPSG
|
|
//> Address : #0093
|
|
//> Function : Writes data to PSG register
|
|
//> Input : A - PSG register number
|
|
//> E - Data write
|
|
//> Remarks : See https://www.msx.org/wiki/SOUND#Registers_Description
|
|
//
|
|
// Parameters:
|
|
// reg - PSG register number (0-15)
|
|
// value - Value to write in the PSG register
|
|
void BIOS_WritePSG(u8 reg, u8 value);
|
|
|
|
// Function: BIOS_ReadPSG
|
|
// Reads value from PSG-register. Wrapper for RDPSG routine.
|
|
//> RDPSG
|
|
//> Address : #0096
|
|
//> Function : Reads value from PSG register
|
|
//> Input : A - PSG register read
|
|
//> Output : A - Value read
|
|
//
|
|
// Parameters:
|
|
// reg - PSG register number (0-15)
|
|
//
|
|
// Return:
|
|
// Value read from the PSG register
|
|
inline u8 BIOS_ReadPSG(u8 reg) { return ((u8(*)(u8))R_RDPSG)(reg); }
|
|
|
|
// Function: BIOS_PlayPSG
|
|
// Tests whether the PLAY statement is being executed as a background task. Wrapper for STRTMS routine.
|
|
//> STRTMS
|
|
//> Address : #0099
|
|
//> Function : Tests whether the PLAY statement is being executed as a background
|
|
//> task. If not, begins to execute the PLAY statement
|
|
//> Registers: All
|
|
inline void BIOS_PlayPSG() { Call(R_STRTMS); }
|
|
|
|
#endif // BIOS_USE_PSG
|
|
|
|
//=============================================================================
|
|
// Console routines
|
|
//=============================================================================
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Group: Main-ROM - Console
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Function: BIOS_GetCharacter
|
|
// One character input (waiting). Wrapper for CHGET routine.
|
|
inline c8 BIOS_GetCharacter() { return CallToA(R_CHGET); }
|
|
|
|
// Function: BIOS_HasCharacter
|
|
// Get a character input (if any) or return 0.
|
|
u8 BIOS_HasCharacter();
|
|
|
|
// Function: BIOS_TextSetCursor
|
|
// Moves cursor to the specified position. Wrapper for POSIT routine.
|
|
void BIOS_TextSetCursor(u8 x, u8 y);
|
|
|
|
// Function: BIOS_TextPrintChar
|
|
// Displays one character. Wrapper for CHPUT routine.
|
|
inline void BIOS_TextPrintChar(c8 chr) { CallA(R_CHPUT, chr); }
|
|
|
|
// Function: BIOS_TextPrint
|
|
// Displays a null-terminated string.
|
|
inline void BIOS_TextPrint(const c8* str) { while (*str) BIOS_TextPrintChar(*str++); }
|
|
|
|
// Function: BIOS_TextPrintAt
|
|
// Print a text at the specified position
|
|
inline void BIOS_TextPrintAt(u8 x, u8 y, const c8* str) { BIOS_TextSetCursor(x, y); BIOS_TextPrint(str); }
|
|
|
|
// Function: BIOS_Beep
|
|
// Generates beep. Wrapper for BEEP routine.
|
|
inline void BIOS_Beep() { Call(R_BEEP); }
|
|
|
|
// Function: BIOS_ClearScreen
|
|
// Clears the screen. Wrapper for CLS routine.
|
|
void BIOS_ClearScreen();
|
|
|
|
|
|
//=============================================================================
|
|
// Controller routines
|
|
//=============================================================================
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Group: Main-ROM - Controller
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#define BIOS_JOYSTICK_KEYBOARD (0)
|
|
#define BIOS_JOYSTICK_PORT1 (1)
|
|
#define BIOS_JOYSTICK_PORT2 (2)
|
|
|
|
#define BIOS_DIRECTION_NONE (0)
|
|
#define BIOS_DIRECTION_UP (1)
|
|
#define BIOS_DIRECTION_UP_RIGHT (2)
|
|
#define BIOS_DIRECTION_RIGHT (3)
|
|
#define BIOS_DIRECTION_DOWN_RIGHT (4)
|
|
#define BIOS_DIRECTION_DOWN (5)
|
|
#define BIOS_DIRECTION_DOWN_LEFT (6)
|
|
#define BIOS_DIRECTION_LEFT (7)
|
|
#define BIOS_DIRECTION_UP_LEFT (8)
|
|
|
|
// Function: BIOS_GetJoystickDirection
|
|
// Returns the state of the joystick or the cursor keys.
|
|
// Wrapper for GTSTCK routine.
|
|
//
|
|
// Parameters:
|
|
// port - Joystick number to be tested:
|
|
//> 0 = Cursor keys
|
|
//> 1 = Joystick on port 1
|
|
//> 2 = Joystick on port 2
|
|
//
|
|
// Return:
|
|
// Direction of the joystick or function keys (0-8):
|
|
//> 8 1 2
|
|
//> \ | /
|
|
//> 7 - 0 - 3
|
|
//> / |'\'
|
|
//> 6 5 4
|
|
inline u8 BIOS_GetJoystickDirection(u8 port) { return ((u8(*)(u8))R_GTSTCK)(port); }
|
|
|
|
#define BIOS_TRIGGER_SPACEBAR (0)
|
|
#define BIOS_TRIGGER_PORT1_TRIG1 (1)
|
|
#define BIOS_TRIGGER_PORT2_TRIG1 (2)
|
|
#define BIOS_TRIGGER_PORT1_TRIG2 (3)
|
|
#define BIOS_TRIGGER_PORT2_TRIG2 (4)
|
|
|
|
// Function: BIOS_GetJoystickTrigger
|
|
// Returns the state of the mouse, joystick or keyboard space bar buttons.
|
|
// Wrapper for GTTRIG routine.
|
|
//
|
|
// Parameters:
|
|
// trigger - Trigger button to test:
|
|
//> 0 = space bar
|
|
//> 1 = port 1, button A
|
|
//> 2 = port 2, button A
|
|
//> 3 = port 1, button B
|
|
//> 4 = port 2, button B
|
|
//
|
|
// Return:
|
|
// FALSE if trigger button is not pressed
|
|
inline bool BIOS_GetJoystickTrigger(u8 trigger) { return ((u8(*)(u8))R_GTTRIG)(trigger); }
|
|
|
|
// Function: BIOS_GetTouchPad
|
|
// Returns the touch pad status.
|
|
// Wrapper for GTPAD routine.
|
|
//
|
|
// Parameters:
|
|
// entry - Function call number. Fetch device data first, then read:
|
|
//> MSX1:
|
|
//> 0 = Fetch touch pad data from port 1 (#FF if available)
|
|
//> 1 = Read X-position
|
|
//> 2 = Read Y-position
|
|
//> 3 = Read touchpad status from port 1 (#FF if pressed
|
|
//> 4 = Fetch touch pad data from port 2 (#FF if available)
|
|
//> 5 = Read X-position
|
|
//> 6 = Read Y-position
|
|
//> 7 = Read touchpad status from port 2 (#FF if pressed)
|
|
//> MSX2/2+/turbo R:
|
|
//> 8 = Fetch light pen data (#FF if available)
|
|
//> 9 = Read X-position
|
|
//> 10 = Read Y-position
|
|
//> 11 = Read light pen status (#FF if pressed)
|
|
//> 12 = Fetch mouse data from port 1 (#FF if available)
|
|
//> 13 = Read X-position
|
|
//> 14 = Read Y-position
|
|
//> 15 = Read mouse button status from port 1 (#FF if pressed)
|
|
//> 16 = Fetch mouse data from port 2 (#FF if available)
|
|
//> 17 = Read X-position
|
|
//> 18 = Read Y-position
|
|
//> 19 = Read mouse button status from port 2 (#FF if pressed)
|
|
//
|
|
// Return:
|
|
// Value depending on entry parameter
|
|
inline u8 BIOS_GetTouchPad(u8 entry) { return ((u8(*)(u8))R_GTPAD)(entry); }
|
|
|
|
// Function: BIOS_GetPaddle
|
|
// Returns the paddle position.
|
|
// Wrapper for GTPDL routine.
|
|
//
|
|
// Parameters:
|
|
// num - Paddle number (1-12):
|
|
//> Paddle | Port1 | Port2
|
|
//> -------+-------+-------
|
|
//> A | 1 | 2
|
|
//> B | 3 | 4
|
|
//> C | 5 | 6
|
|
//> D | 7 | 8
|
|
//> E | 9 | 10
|
|
//> F | 11 | 12
|
|
//
|
|
// Return:
|
|
// Paddle position [0:255]
|
|
inline u8 BIOS_GetPaddle(u8 num) { return ((u8(*)(u8))R_GTPDL)(num); }
|
|
|
|
|
|
//=============================================================================
|
|
// Misc routines
|
|
//=============================================================================
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Group: Main-ROM - Misc
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Function: BIOS_GetKeyboardMatrix
|
|
// Returns the value of the specified line from the keyboard matrix. Wrapper for SNSMAT routine.
|
|
inline u8 BIOS_GetKeyboardMatrix(u8 line) { return ((u8(*)(u8))R_SNSMAT)(line); }
|
|
|
|
// Function: BIOS_IsKeyPressed
|
|
// Check if the given key is pressed
|
|
inline bool BIOS_IsKeyPressed(u8 key) { return (g_NEWKEY[KEY_ROW(key)] & (1 << KEY_IDX(key))) == 0; }
|
|
|
|
//=============================================================================
|
|
// MSX2
|
|
//=============================================================================
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Group: Main-ROM - MSX2
|
|
//-----------------------------------------------------------------------------
|
|
#if (MSX_VERSION >= MSX_2)
|
|
#endif // (MSX_VERSION >= MSX_2)
|
|
|
|
//=============================================================================
|
|
// MSX2+
|
|
//=============================================================================
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Group: Main-ROM - MSX2+
|
|
//-----------------------------------------------------------------------------
|
|
#if (MSX_VERSION >= MSX_2P)
|
|
#endif // (MSX_VERSION >= MSX_2P)
|
|
|
|
//=============================================================================
|
|
// MSX turbo R
|
|
//=============================================================================
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Group: Main-ROM - MSX turbo R
|
|
//-----------------------------------------------------------------------------
|
|
#if (MSX_VERSION == MSX_TR)
|
|
|
|
#define CPU_MODE_Z80 0x00
|
|
#define CPU_MODE_R800_ROM 0x01
|
|
#define CPU_MODE_R800_DRAM 0x02
|
|
#define CPU_TURBO_LED 0x80
|
|
|
|
// Function: BIOS_SetCPUMode
|
|
// Changes CPU mode. Wrapper for CHGCPU routine.
|
|
inline void BIOS_SetCPUMode(u8 mode) { ((void(*)(u8))R_CHGCPU)(mode); }
|
|
|
|
// Function: BIOS_GetCPUMode
|
|
// Returns current CPU mode. Wrapper for GETCPU routine.
|
|
inline u8 BIOS_GetCPUMode() { return ((u8(*)(void))R_GETCPU)(); }
|
|
|
|
#endif // (MSX_VERSION == MSX_TR)
|