From 33cb13dee5a527ac445ea1b13d42723e4eb3e3b0 Mon Sep 17 00:00:00 2001 From: Franklin Wei Date: Mon, 13 Oct 2014 21:00:47 -0400 Subject: Xworld - Another World interpreter for Rockbox Co-conspirators: Franklin Wei, Benjamin Brown -------------------------------------------------------------------- This work is based on: - Fabien Sanglard's "Fabother World" based on - Piotr Padkowski's newRaw interpreter which was based on - Gregory Montoir's reverse engineering of - Eric Chahi's assembly code -------------------------------------------------------------------- Progress: * The plugin runs pretty nicely (with sound!) on most color targets * Keymaps for color LCD targets are complete * The manual entry is finished * Grayscale/monochrome support is NOT PLANNED - the game looks horrible in grayscale! :p -------------------------------------------------------------------- Notes: * The original game strings were built-in to the executable, and were copyrighted and could not be used. * This port ships with an alternate set of strings by default, but can load the "official" strings from a file at runtime. -------------------------------------------------------------------- To be done (in descending order of importance): * vertical stride compatibility <30% done> * optimization <10% done> Change-Id: I3155b0d97c2ac470cb8a2040f40d4139ddcebfa5 Reviewed-on: http://gerrit.rockbox.org/1077 Reviewed-by: Michael Giacomelli --- apps/plugins/xworld/vm.h | 184 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 apps/plugins/xworld/vm.h (limited to 'apps/plugins/xworld/vm.h') diff --git a/apps/plugins/xworld/vm.h b/apps/plugins/xworld/vm.h new file mode 100644 index 0000000000..1409dd47e3 --- /dev/null +++ b/apps/plugins/xworld/vm.h @@ -0,0 +1,184 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2014 Franklin Wei, Benjamin Brown + * Copyright (C) 2004 Gregory Montoir + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#ifndef __LOGIC_H__ +#define __LOGIC_H__ + + + +#include "intern.h" + +#define VM_NUM_THREADS 64 +#define VM_NUM_VARIABLES 256 +#define VM_NO_SETVEC_REQUESTED 0xFFFF +#define VM_INACTIVE_THREAD 0xFFFF + + +#define VM_VARIABLE_RANDOM_SEED 0x3C + +#define VM_VARIABLE_LAST_KEYCHAR 0xDA + +#define VM_VARIABLE_HERO_POS_UP_DOWN 0xE5 +#define VM_VARIABLE_MUS_MARK 0xF4 + +#define VM_VARIABLE_SCROLL_Y 0xF9 +#define VM_VARIABLE_HERO_ACTION 0xFA +#define VM_VARIABLE_HERO_POS_JUMP_DOWN 0xFB +#define VM_VARIABLE_HERO_POS_LEFT_RIGHT 0xFC +#define VM_VARIABLE_HERO_POS_MASK 0xFD +#define VM_VARIABLE_HERO_ACTION_POS_MASK 0xFE +#define VM_VARIABLE_PAUSE_SLICES 0xFF + +struct Mixer; +struct Resource; +struct Serializer; +struct SfxPlayer; +struct System; +struct Video; + +//For threadsData navigation +#define PC_OFFSET 0 +#define REQUESTED_PC_OFFSET 1 +#define NUM_DATA_FIELDS 2 + +//For vmIsChannelActive navigation +#define CURR_STATE 0 +#define REQUESTED_STATE 1 +#define NUM_THREAD_FIELDS 2 + +struct VirtualMachine; + +void vm_create(struct VirtualMachine*, struct Mixer *mix, struct Resource *res, struct SfxPlayer *ply, struct Video *vid, struct System *stub); +void vm_init(struct VirtualMachine*); + +void vm_op_movConst(struct VirtualMachine*); +void vm_op_mov(struct VirtualMachine*); +void vm_op_add(struct VirtualMachine*); +void vm_op_addConst(struct VirtualMachine*); +void vm_op_call(struct VirtualMachine*); +void vm_op_ret(struct VirtualMachine*); +void vm_op_pauseThread(struct VirtualMachine*); +void vm_op_jmp(struct VirtualMachine*); +void vm_op_setSetVect(struct VirtualMachine*); +void vm_op_jnz(struct VirtualMachine*); +void vm_op_condJmp(struct VirtualMachine*); +void vm_op_setPalette(struct VirtualMachine*); +void vm_op_resetThread(struct VirtualMachine*); +void vm_op_selectVideoPage(struct VirtualMachine*); +void vm_op_fillVideoPage(struct VirtualMachine*); +void vm_op_copyVideoPage(struct VirtualMachine*); +void vm_op_blitFramebuffer(struct VirtualMachine*); +void vm_op_killThread(struct VirtualMachine*); +void vm_op_drawString(struct VirtualMachine*); +void vm_op_sub(struct VirtualMachine*); +void vm_op_and(struct VirtualMachine*); +void vm_op_or(struct VirtualMachine*); +void vm_op_shl(struct VirtualMachine*); +void vm_op_shr(struct VirtualMachine*); +void vm_op_playSound(struct VirtualMachine*); +void vm_op_updateMemList(struct VirtualMachine*); +void vm_op_playMusic(struct VirtualMachine*); + +void vm_initForPart(struct VirtualMachine*, uint16_t partId); +void vm_setupPart(struct VirtualMachine*, uint16_t partId); +void vm_checkThreadRequests(struct VirtualMachine*); +void vm_hostFrame(struct VirtualMachine*); +void vm_executeThread(struct VirtualMachine*); + +void vm_inp_updatePlayer(struct VirtualMachine*); +void vm_inp_handleSpecialKeys(struct VirtualMachine*); + +void vm_snd_playSound(struct VirtualMachine*, uint16_t resNum, uint8_t freq, uint8_t vol, uint8_t channel); +void vm_snd_playMusic(struct VirtualMachine*, uint16_t resNum, uint16_t delay, uint8_t pos); + +void vm_saveOrLoad(struct VirtualMachine*, struct Serializer *ser); +void vm_bypassProtection(struct VirtualMachine*); + +typedef void (*OpcodeStub)(struct VirtualMachine*); + +// The type of entries in opcodeTable. This allows "fast" branching +static const OpcodeStub vm_opcodeTable[] = { + /* 0x00 */ + &vm_op_movConst, + &vm_op_mov, + &vm_op_add, + &vm_op_addConst, + /* 0x04 */ + &vm_op_call, + &vm_op_ret, + &vm_op_pauseThread, + &vm_op_jmp, + /* 0x08 */ + &vm_op_setSetVect, + &vm_op_jnz, + &vm_op_condJmp, + &vm_op_setPalette, + /* 0x0C */ + &vm_op_resetThread, + &vm_op_selectVideoPage, + &vm_op_fillVideoPage, + &vm_op_copyVideoPage, + /* 0x10 */ + &vm_op_blitFramebuffer, + &vm_op_killThread, + &vm_op_drawString, + &vm_op_sub, + /* 0x14 */ + &vm_op_and, + &vm_op_or, + &vm_op_shl, + &vm_op_shr, + /* 0x18 */ + &vm_op_playSound, + &vm_op_updateMemList, + &vm_op_playMusic +}; + +struct VirtualMachine { + //This table is used to play a sound + //static const uint16_t frequenceTable[]; + /* FW: moved from staticres.c to vm.c */ + + struct Mixer *mixer; + struct Resource *res; + struct SfxPlayer *player; + struct Video *video; + struct System *sys; + + int16_t vmVariables[VM_NUM_VARIABLES]; + uint16_t _scriptStackCalls[VM_NUM_THREADS]; + + uint16_t threadsData[NUM_DATA_FIELDS][VM_NUM_THREADS]; + // This array is used: + // 0 to save the channel's instruction pointer + // when the channel release control (this happens on a break). + + // 1 When a setVec is requested for the next vm frame. + + uint8_t vmIsChannelActive[NUM_THREAD_FIELDS][VM_NUM_THREADS]; + + struct Ptr _scriptPtr; + uint8_t _stackPtr; + bool gotoNextThread; + bool _fastMode; +}; +#endif -- cgit v1.2.3