//============================================================ // // minimain.c - Main function for mini OSD // //============================================================ // // Copyright Aaron Giles // All rights reserved. // // Redistribution and use in source and binary forms, with or // without modification, are permitted provided that the // following conditions are met: // // * Redistributions of source code must retain the above // copyright notice, this list of conditions and the // following disclaimer. // * Redistributions in binary form must reproduce the // above copyright notice, this list of conditions and // the following disclaimer in the documentation and/or // other materials provided with the distribution. // * Neither the name 'MAME' nor the names of its // contributors may be used to endorse or promote // products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGE (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // //============================================================ #include "emu.h" #include "osdepend.h" #include "render.h" #include "clifront.h" #include "osdmini.h" //============================================================ // CONSTANTS //============================================================ // we fake a keyboard with the following keys enum { KEY_ESCAPE, KEY_P1_START, KEY_BUTTON_1, KEY_BUTTON_2, KEY_BUTTON_3, KEY_JOYSTICK_U, KEY_JOYSTICK_D, KEY_JOYSTICK_L, KEY_JOYSTICK_R, KEY_TOTAL }; //============================================================ // GLOBALS //============================================================ // a single rendering target static render_target *our_target; // a single input device static input_device *keyboard_device; // the state of each key static UINT8 keyboard_state[KEY_TOTAL]; //============================================================ // FUNCTION PROTOTYPES //============================================================ static INT32 keyboard_get_state(void *device_internal, void *item_internal); //============================================================ // main //============================================================ int main(int argc, char *argv[]) { // cli_frontend does the heavy lifting; if we have osd-specific options, we // create a derivative of cli_options and add our own cli_options options; mini_osd_interface osd; cli_frontend frontend(options, osd); return frontend.execute(argc, argv); } //============================================================ // constructor //============================================================ mini_osd_interface::mini_osd_interface() { } //============================================================ // destructor //============================================================ mini_osd_interface::~mini_osd_interface() { } //============================================================ // init //============================================================ void mini_osd_interface::init(running_machine &machine) { // call our parent osd_interface::init(machine); // initialize the video system by allocating a rendering target our_target = machine.render().target_alloc(); // nothing yet to do to initialize sound, since we don't have any // sound updates are handled by update_audio_stream() below // initialize the input system by adding devices // let's pretend like we have a keyboard device keyboard_device = machine.input().device_class(DEVICE_CLASS_KEYBOARD).add_device("Keyboard"); if (keyboard_device == NULL) fatalerror("Error creating keyboard device\n"); // our faux keyboard only has a couple of keys (corresponding to the // common defaults) keyboard_device->add_item("Esc", ITEM_ID_ESC, keyboard_get_state, &keyboard_state[KEY_ESCAPE]); keyboard_device->add_item("P1", ITEM_ID_1, keyboard_get_state, &keyboard_state[KEY_P1_START]); keyboard_device->add_item("B1", ITEM_ID_LCONTROL, keyboard_get_state, &keyboard_state[KEY_BUTTON_1]); keyboard_device->add_item("B2", ITEM_ID_LALT, keyboard_get_state, &keyboard_state[KEY_BUTTON_2]); keyboard_device->add_item("B3", ITEM_ID_SPACE, keyboard_get_state, &keyboard_state[KEY_BUTTON_3]); keyboard_device->add_item("JoyU", ITEM_ID_UP, keyboard_get_state, &keyboard_state[KEY_JOYSTICK_U]); keyboard_device->add_item("JoyD", ITEM_ID_DOWN, keyboard_get_state, &keyboard_state[KEY_JOYSTICK_D]); keyboard_device->add_item("JoyL", ITEM_ID_LEFT, keyboard_get_state, &keyboard_state[KEY_JOYSTICK_L]); keyboard_device->add_item("JoyR", ITEM_ID_RIGHT, keyboard_get_state, &keyboard_state[KEY_JOYSTICK_R]); // hook up the debugger log // add_logerror_callback(machine, output_oslog); } //============================================================ // osd_update //============================================================ void mini_osd_interface::update(bool skip_redraw) { // get the minimum width/height for the current layout int minwidth, minheight; our_target->compute_minimum_size(minwidth, minheight); // make that the size of our target our_target->set_bounds(minwidth, minheight); // get the list of primitives for the target at the current size render_primitive_list &primlist = our_target->get_primitives(); // lock them, and then render them primlist.acquire_lock(); // do the drawing here primlist.release_lock(); // after 5 seconds, exit if (machine().time() > attotime::from_seconds(5)) machine().schedule_exit(); } //============================================================ // update_audio_stream //============================================================ void mini_osd_interface::update_audio_stream(const INT16 *buffer, int samples_this_frame) { // if we had actual sound output, we would copy the // interleaved stereo samples to our sound stream } //============================================================ // set_mastervolume //============================================================ void mini_osd_interface::set_mastervolume(int attenuation) { // if we had actual sound output, we would adjust the global // volume in response to this function } //============================================================ // customize_input_type_list //============================================================ void mini_osd_interface::customize_input_type_list(simple_list &typelist) { // This function is called on startup, before reading the // configuration from disk. Scan the list, and change the // default control mappings you want. It is quite possible // you won't need to change a thing. } //============================================================ // keyboard_get_state //============================================================ static INT32 keyboard_get_state(void *device_internal, void *item_internal) { // this function is called by the input system to get the current key // state; it is specified as a callback when adding items to input // devices UINT8 *keystate = (UINT8 *)item_internal; return *keystate; }