1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2024-06-12 03:29:31 +00:00
8bitworkshop/src/worker/lib/vectrex/bios.h
2020-06-09 13:11:37 -05:00

204 lines
5.4 KiB
C

#ifndef __vectrex_bios_h__
#define __vectrex_bios_h__
#include "vectrex.h"
// Expose Vectrex music addreses
#define vx_music_1 (char*) 0xFD0D
#define vx_music_2 (char*) 0xFD1D
#define vx_music_3 (char*) 0xFD81
#define vx_music_4 (char*) 0xFDD3
#define vx_music_5 (char*) 0xFE38
#define vx_music_6 (char*) 0xFE76
#define vx_music_7 (char*) 0xFEC6
#define vx_music_8 (char*) 0xFEF8
#define vx_music_9 (char*) 0xFF26
#define vx_music_10 (char*) 0xFF44
#define vx_music_11 (char*) 0xFF62
#define vx_music_12 (char*) 0xFF7A
#define vx_music_13 (char*) 0xFF8F
#define JOY1_BTN1 0
#define JOY1_BTN2 1
#define JOY1_BTN3 2
#define JOY1_BTN4 3
#define JOY2_BTN1 4
#define JOY2_BTN2 5
#define JOY2_BTN3 6
#define JOY2_BTN4 7
#define JOY1_BTN1_MASK (1<<JOY1_BTN1)
#define JOY1_BTN2_MASK (1<<JOY1_BTN2)
#define JOY1_BTN3_MASK (1<<JOY1_BTN3)
#define JOY1_BTN4_MASK (1<<JOY1_BTN4)
#define JOY2_BTN1_MASK (1<<JOY2_BTN1)
#define JOY2_BTN2_MASK (1<<JOY2_BTN2)
#define JOY2_BTN3_MASK (1<<JOY2_BTN3)
#define JOY2_BTN4_MASK (1<<JOY2_BTN4)
#define JOY_UP 0
#define JOY_DOWN 1
#define JOY_LEFT 2
#define JOY_RIGHT 3
#define JOY_UP_MASK (1<<JOY_UP)
#define JOY_DOWN_MASK (1<<JOY_DOWN)
#define JOY_LEFT_MASK (1<<JOY_RIGHT)
#define JOY_RIGHT_MASK (1<<JOY_LEFT)
#define JOY_UP_MASK_ASM 1
#define JOY_DOWN_MASK_ASM 2
#define JOY_LEFT_MASK_ASM 4
#define JOY_RIGHT_MASK_ASM 8
// Read the joystick buttons.
// uint8_t buttons = read_buttons();
// if (buttons & JOY1_BTN1_MASK) {
// do stuff when joystick one button one is pressed
// ...
// }
uint8_t read_buttons();
// Read the joystick positions. This is an expensive call, as the Vectrex makes use of measring time over
// an RC network to do AD conversion for the joystick positions. For the moment, only digital positions are
// measured with this routine.
// You can use this routine as follows:
// uint8_t joystick = read_joystick(1);
// if ( joystick & JOY_UP_MASK) {
// do joystick up stuff
// ...
// }
uint8_t read_joystick(uint8_t joystick);
// This call waits for timer two to timeout and restarts it, it then recalibrates the vector generators to
// coordinate (0, 0) it also calls the BIOS routine behind reset_beam in the process.
void wait_retrace();
// Set the beam intensity. The value 0x7f is often used and is rather bright.
void intensity(uint8_t i);
// Reset the beam to the middle of the screen.
// This is necassary from time to time as there is drift on the Vectrex integrators.
// Caling this makes coordinate (0,0) the middle of the screen.
void reset_beam();
// Set the text width and height. Negative values are needed for the y coordinate. Otherwise text will be upside down.
void set_text_size(int8_t height, int8_t width);
// Print a string to the screen. The string must end with 0x80
void print_str(int8_t y, int8_t x, char* string);
// Print a C string (ends with 0).
void print_str_c(int8_t y, int8_t x, char* string);
// Draw one dot at the relative y and x coordinate from the last beam position.
void dot(int8_t y, int8_t x);
// Draw a list of dots to the screen. Each dot is positioned relative to the previous one.
void dots(uint8_t nr_dots, int8_t* list);
// Set the scale. With this you can zoom in and out objects.
void set_scale(int8_t scale);
// Move the dot to a specific position.
void move(uint8_t y, uint8_t x);
// Draw a line.
void line(int8_t y, int8_t x);
// Draw lines.
// The list of lines can live in ROM.
// You provide the list of lines as follows:
// int8_t list[n] = {
// y1, x1,
// y2, x2,
// ...
// xn, yn
// };
// Make note that these are not absolute, but relative coordinates.
void lines(uint8_t nr_lines, int8_t* list);
// Draw patterned lines, where the pattern is provided as the first parameter, for the rest
// this function behaves the same as the lines fucntion.
void pattern_lines(uint8_t pattern, uint8_t nr_lines, int8_t *list);
// Rotate a list of points. The points array can be in ROM, but the out_points need to be in RAM.
// The list of points is given as follows:
// int8_t points[n] = {
// y1, x1,
// y2, x2,
// ...
// yn, xn
// };
void rotate(int8_t angle, uint8_t nr_points, int8_t* points, int8_t* out_points);
// Set the music flag, which should be set to 1 to start playing music using the BIOS routine.
// The music flag has 3 states: 0, 1 and 0x80.
// State 0 means no music is playing. A 1 means we are about to start the music.
// And 0x80 means the music is currently playing.
void music_set_flag(uint8_t flag);
// Get the music flag, which can have the states documented with the get method.
// If you want to repeat the music, you should check this flag and if it is 0 set to 1 again.
uint8_t music_get_flag();
// Point the BIOS play routine to a piece of music.
// Info about the format: http://www.playvectrex.com/designit/chrissalo/soundplaying.htm
void music_check(unsigned char* music);
// Call this in the main loop to play the music.
void music_play();
// The Vectrex uses three bytes for the random seed.
void random_seed(uint8_t seed1, uint8_t seed2, uint8_t seed3);
// Produce a random value using the BIOS Random function.
int8_t random();
// What follows here are some low level BIOS fucntions that are not really necessary to call from your
// C program, but the are here for completeness.
void cold_start();
void warm_start();
void init_via();
void init_os_ram();
void init_os();
void set_refresh(uint16_t value);
#endif // __vectrex_bios_h__