gdos/include/gdos.h

229 lines
7.1 KiB
C

/**
* Library for GameDev on DOS
*
* Alexander Popov <iiiypuk@fastmail.fm>
* Version: 0.0.0
*
* LICENSE:
* This is free and unencumbered software released into the public domain.
* Anyone is free to copy, modify, publish, use, compile, sell, or
* distribute this software, either in source code form or as a compiled
* binary, for any purpose, commercial or non-commercial, and by any
* means.
*
* In jurisdictions that recognize copyright laws, the author or authors
* of this software dedicate any and all copyright interest in the
* software to the public domain. We make this dedication for the benefit
* of the public at large and to the detriment of our heirs and
* successors. We intend this dedication to be an overt act of
* relinquishment in perpetuity of all present and future rights to this
* software under copyright law.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* For more information, please refer to <http://unlicense.org/>
*
* THANKS:
* David Brackeen - http://www.brackeen.com/vga/basics.html
* Stanislav Sokolov - https://stanislavs.org/helppc/int_33-3.html
* Team EQA - https://www.equestionanswers.com/c/c-int33-mouse-service.php
*/
#ifndef GDOS_H_
#define GDOS_H_
#include <dos.h>
#include <conio.h>
/* ... */
#define GD_TRUE 1 /* bool true */
#define GD_FALSE 0 /* bool false */
#define VIDEO_INT 0x10 /* BIOS video interrupt */
#define MOUSE_INTERRUPT 0x33 /* BIOS mouse interrupt */
#define WRITE_DOT 0x0C /* BIOS func to plot a pixel */
#define SET_MODE 0x00 /* BIOS func to set the video mode */
#define TEXT_MODE 0x03 /* 80x25 text mode */
#define VGA_4_COLOR_MODE 0x04 /* 320x200 4-color graphics mode */
#define VGA_MONO_SM_MODE 0x05 /* 320x200 monochrome graphics mode */
#define VGA_MONO_LG_MODE 0x06 /* 640x200 monochrome graphics mode */
#define VGA_256_COLOR_MODE 0x13 /* 320x200 graphics mode */
#define SCREEN_WIDTH 320 /* width in pixels of mode 0x13 */
#define SCREEN_HEIGHT 200 /* height in pixels of mode 0x13 */
#define GD_DRAW_FAST 1
#define GD_DRAW_SLOW 0
typedef unsigned char byte;
byte *VGA=(byte *)0xA0000000L; /* this points to video memory */
/* KEY CODES */
#define key_ESC 27 /* ESCAPE key */
#define key_A 65 /* A key */
#define key_B 66 /* B key */
#define key_C 67 /* C key */
#define key_D 68 /* D key */
#define key_E 69 /* E key */
#define key_F 70 /* F key */
#define key_G 71 /* G key */
#define key_H 72 /* H key */
#define key_I 73 /* I key */
#define key_J 74 /* J key */
#define key_K 75 /* K key */
#define key_L 76 /* L key */
#define key_M 77 /* M key */
#define key_N 78 /* N key */
#define key_O 79 /* O key */
#define key_P 80 /* P key */
#define key_Q 81 /* Q key */
#define key_R 82 /* R key */
#define key_S 83 /* S key */
#define key_T 84 /* T key */
#define key_U 85 /* U key */
#define key_V 86 /* V key */
#define key_W 87 /* W key */
#define key_X 88 /* X key */
#define key_Y 89 /* Y key */
#define key_Z 90 /* Z key */
#define key_a 97 /* a key */
#define key_b 98 /* b key */
#define key_c 99 /* c key */
#define key_d 100 /* d key */
#define key_e 101 /* e key */
#define key_f 102 /* f key */
#define key_g 103 /* g key */
#define key_h 104 /* h key */
#define key_i 105 /* i key */
#define key_j 106 /* j key */
#define key_k 107 /* k key */
#define key_l 108 /* l key */
#define key_m 109 /* m key */
#define key_n 110 /* n key */
#define key_o 111 /* o key */
#define key_p 112 /* p key */
#define key_q 113 /* q key */
#define key_r 114 /* r key */
#define key_s 115 /* s key */
#define key_t 116 /* t key */
#define key_u 117 /* u key */
#define key_v 118 /* v key */
#define key_w 119 /* w key */
#define key_x 120 /* x key */
#define key_y 121 /* y key */
#define key_z 122 /* z key */
/**
* gd_set_mode(byte mode)
* Sets the video mode
*/
void gd_set_mode(byte mode) {
union REGS regs;
regs.h.ah = SET_MODE;
regs.h.al = mode;
int86(VIDEO_INT, &regs, &regs);
}
/**
* gd_draw_pixel(int x, int y, byte color, int draw_mode)
* Draw pixel on VGA
*/
void gd_draw_pixel(int x, int y, byte color, int draw_mode) {
union REGS regs;
/* draw pixel as fast mode */
if (draw_mode == 1) {
VGA[y*SCREEN_WIDTH+x]=color;
}
/* draw pixel as slow mode */
else {
regs.h.ah = WRITE_DOT;
regs.h.al = color;
regs.x.cx = x;
regs.x.dx = y;
int86(VIDEO_INT, &regs, &regs);
}
}
/**
* gd_get_kb(int *key)
* Gets the ASCII code of the pressed key from the keyboard
*/
void gd_get_kb(int *key) {
if (kbhit()) {
*key = getch();
}
}
/**
* gd_detect_mouse(void)
* Return mouse support/available
*/
int gd_detect_mouse(void) {
union REGS in, out;
in.x.ax = 0;
int86(MOUSE_INTERRUPT, &in, &out);
/* Mouse support not available */
if (out.x.ax != 0) { return GD_TRUE; }
else { return GD_FALSE; }
}
/**
* gd_show_mouse(void)
* Show mouse cursor
*/
int gd_show_mouse(void) {
union REGS in, out;
in.x.ax = 1;
int86(MOUSE_INTERRUPT, &in, &out);
return GD_TRUE;
}
/**
* gd_hide_mouse(void)
* Hide mouse cursor
*/
int gd_hide_mouse(void) {
union REGS in, out;
in.x.ax = 2;
int86(MOUSE_INTERRUPT, &in, &out);
return GD_TRUE;
}
/**
* gd_get_mouse_status(int *x, int *y, int *click)
* Gets mouse position by X,Y and mouse button click status
*/
void gd_get_mouse_status(int *x, int *y, int *click) {
union REGS in, out;
in.x.ax = 3;
int86(MOUSE_INTERRUPT, &in, &out);
/**
* Click is the integer variable which returns the values
* 1 - Left mouse button
* 2 - Right mouse button
* 3 - Middle mouse button
* 4 - ...
*/
*click = out.x.bx;
*x = out.x.cx;
*y = out.x.dx;
}
#endif